From d1fefd84020ec1b2b051a2a4c09b5a67bfcc4a55 Mon Sep 17 00:00:00 2001 From: rexim Date: Mon, 1 Apr 2024 19:25:41 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BA=D0=BE=D0=B4=D0=BE=D0=B3=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D1=8E=20=D0=B1=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D1=88=D0=B5=D0=B9=20=D1=87=D0=B0=D1=81=D1=82=D0=B8=20?= =?UTF-8?q?=D1=80=D0=B5=D0=BB=D0=B5=D0=B2=D0=B0=D0=BD=D1=82=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ПЛАН.txt | 2 +- исходники/фазм.rs | 46 ++++++++++++++++++++++++++++++++++------------ 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/ПЛАН.txt b/ПЛАН.txt index 62b9225..9105f52 100644 --- a/ПЛАН.txt +++ b/ПЛАН.txt @@ -56,7 +56,7 @@ - [x] знаковые битовые смещения - [x] унарный минус - [x] Все бинопы для всех релевантных типов в левой части -- [ ] Интерпретация всех недостающих инструкций +- [x] Интерпретация всех недостающих инструкций - [ ] Кодогенерация всех недостающих инструкций - [ ] Доработать интринсики - [ ] «ввод» diff --git a/исходники/фазм.rs b/исходники/фазм.rs index 4b62b1d..28810b0 100644 --- a/исходники/фазм.rs +++ b/исходники/фазм.rs @@ -198,8 +198,12 @@ fn сгенерировать_инструкции(файл: &mut impl Write, п // перемещение для реализации инструкций сравнения? } ВидИнструкции::НатМеньшеРавно => { - сделать!(&инструкция.лок, "Кодогенерация инструкции «{вид:?}»", вид = инструкция.вид); - return Err(()) + let _ = writeln!(файл, " pop rbx"); + let _ = writeln!(файл, " pop rax"); + let _ = writeln!(файл, " xor rcx, rcx"); + let _ = writeln!(файл, " cmp rax, rbx"); + let _ = writeln!(файл, " setbe cl"); + let _ = writeln!(файл, " push rcx"); } ВидИнструкции::НатБольше => { let _ = writeln!(файл, " pop rbx"); @@ -210,8 +214,12 @@ fn сгенерировать_инструкции(файл: &mut impl Write, п let _ = writeln!(файл, " push rcx"); } ВидИнструкции::НатБольшеРавно => { - сделать!(&инструкция.лок, "Кодогенерация инструкции «{вид:?}»", вид = инструкция.вид); - return Err(()) + let _ = writeln!(файл, " pop rbx"); + let _ = writeln!(файл, " pop rax"); + let _ = writeln!(файл, " xor rcx, rcx"); + let _ = writeln!(файл, " cmp rax, rbx"); + let _ = writeln!(файл, " setae cl"); + let _ = writeln!(файл, " push rcx"); } ВидИнструкции::НатРавно => { let _ = writeln!(файл, " pop rbx"); @@ -246,8 +254,12 @@ fn сгенерировать_инструкции(файл: &mut impl Write, п let _ = writeln!(файл, " push rcx"); } ВидИнструкции::ЦелБольшеРавно => { - сделать!(&инструкция.лок, "Кодогенерация инструкции «{вид:?}»", вид = инструкция.вид); - return Err(()) + let _ = writeln!(файл, " pop rbx"); + let _ = writeln!(файл, " pop rax"); + let _ = writeln!(файл, " xor rcx, rcx"); + let _ = writeln!(файл, " cmp rax, rbx"); + let _ = writeln!(файл, " setge cl"); + let _ = writeln!(файл, " push rcx"); } ВидИнструкции::ЦелУмножение => { let _ = writeln!(файл, " pop rbx"); @@ -356,10 +368,24 @@ fn сгенерировать_инструкции(файл: &mut impl Write, п let _ = writeln!(файл, " push rax"); } ВидИнструкции::Вещ32МеньшеРавно => { - сделать!(&инструкция.лок, "Кодогенерация инструкции «{вид:?}»", вид = инструкция.вид); - return Err(()) + let _ = writeln!(файл, " pop rbx"); + let _ = writeln!(файл, " pop rax"); + let _ = writeln!(файл, " movd xmm0, eax"); + let _ = writeln!(файл, " movd xmm1, ebx"); + let _ = writeln!(файл, " cmpless xmm0, xmm1"); + let _ = writeln!(файл, " movd eax, xmm0"); + let _ = writeln!(файл, " push rax"); } ВидИнструкции::Вещ32Больше => { + let _ = writeln!(файл, " pop rbx"); + let _ = writeln!(файл, " pop rax"); + let _ = writeln!(файл, " movd xmm0, eax"); + let _ = writeln!(файл, " movd xmm1, ebx"); + let _ = writeln!(файл, " cmpnless xmm0, xmm1"); + let _ = writeln!(файл, " movd eax, xmm0"); + let _ = writeln!(файл, " push rax"); + } + ВидИнструкции::Вещ32БольшеРавно => { let _ = writeln!(файл, " pop rbx"); let _ = writeln!(файл, " pop rax"); let _ = writeln!(файл, " movd xmm0, eax"); @@ -368,10 +394,6 @@ fn сгенерировать_инструкции(файл: &mut impl Write, п let _ = writeln!(файл, " movd eax, xmm0"); let _ = writeln!(файл, " push rax"); } - ВидИнструкции::Вещ32БольшеРавно => { - сделать!(&инструкция.лок, "Кодогенерация инструкции «{вид:?}»", вид = инструкция.вид); - return Err(()) - } ВидИнструкции::Вещ32Отриц => { let _ = writeln!(файл, " mov eax, 0x80000000"); let _ = writeln!(файл, " pop rbx");