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");