Реализовать кодогенерацию большей части релевантных инструкций

This commit is contained in:
rexim 2024-04-01 19:25:41 +07:00
parent 606a65bb7a
commit d1fefd8402
2 changed files with 35 additions and 13 deletions

View File

@ -56,7 +56,7 @@
- [x] знаковые битовые смещения
- [x] унарный минус
- [x] Все бинопы для всех релевантных типов в левой части
- [ ] Интерпретация всех недостающих инструкций
- [x] Интерпретация всех недостающих инструкций
- [ ] Кодогенерация всех недостающих инструкций
- [ ] Доработать интринсики
- [ ] «ввод»

View File

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