improved implementation of checked arithmetic

This commit is contained in:
Folkert 2023-09-17 15:43:11 +02:00
parent 54732b5750
commit c6593725df
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C
3 changed files with 272 additions and 16 deletions

View file

@ -717,6 +717,33 @@ pub trait Assembler<GeneralReg: RegTrait, FloatReg: RegTrait>: Sized + Copy {
fn set_if_overflow(buf: &mut Vec<'_, u8>, dst: GeneralReg);
fn add_with_overflow(
buf: &mut Vec<'_, u8>,
register_width: RegisterWidth,
dst: GeneralReg,
src1: GeneralReg,
src2: GeneralReg,
overflow: GeneralReg,
);
fn sub_with_overflow(
buf: &mut Vec<'_, u8>,
register_width: RegisterWidth,
dst: GeneralReg,
src1: GeneralReg,
src2: GeneralReg,
overflow: GeneralReg,
);
fn imul_with_overflow(
buf: &mut Vec<'_, u8>,
register_width: RegisterWidth,
dst: GeneralReg,
src1: GeneralReg,
src2: GeneralReg,
overflow: GeneralReg,
);
fn ret(buf: &mut Vec<'_, u8>);
}
@ -1402,8 +1429,14 @@ impl<
let src1_reg = self.storage_manager.load_to_general_reg(buf, src1);
let src2_reg = self.storage_manager.load_to_general_reg(buf, src2);
ASM::add_reg64_reg64_reg64(buf, dst_reg, src1_reg, src2_reg);
ASM::set_if_overflow(buf, overflow_reg);
ASM::add_with_overflow(
buf,
RegisterWidth::W64, // TODO
dst_reg,
src1_reg,
src2_reg,
overflow_reg,
);
ASM::mov_base32_reg64(buf, base_offset, dst_reg);
ASM::mov_base32_reg64(buf, base_offset + 8, overflow_reg);
@ -1614,8 +1647,14 @@ impl<
let src1_reg = self.storage_manager.load_to_general_reg(buf, src1);
let src2_reg = self.storage_manager.load_to_general_reg(buf, src2);
ASM::imul_reg64_reg64_reg64(buf, dst_reg, src1_reg, src2_reg);
ASM::set_if_overflow(buf, overflow_reg);
ASM::imul_with_overflow(
buf,
RegisterWidth::W64, // TODO
dst_reg,
src1_reg,
src2_reg,
overflow_reg,
);
ASM::mov_base32_reg64(buf, base_offset, dst_reg);
ASM::mov_base32_reg64(buf, base_offset + 8, overflow_reg);