x64: Fix udiv and sdiv for 8bit integers

This commit is contained in:
bjorn3
2020-08-22 10:44:12 +02:00
committed by Benjamin Bouvier
parent 74642b166f
commit ce033f2a0c
4 changed files with 59 additions and 19 deletions

View File

@@ -662,11 +662,12 @@ pub(crate) fn emit(
divisor,
loc,
} => {
let (prefix, rex_flags) = match size {
2 => (LegacyPrefixes::_66, RexFlags::clear_w()),
4 => (LegacyPrefixes::None, RexFlags::clear_w()),
8 => (LegacyPrefixes::None, RexFlags::set_w()),
_ => unreachable!(),
let (opcode, prefix, rex_flags) = match size {
1 => (0xF6, LegacyPrefixes::None, RexFlags::clear_w()),
2 => (0xF7, LegacyPrefixes::_66, RexFlags::clear_w()),
4 => (0xF7, LegacyPrefixes::None, RexFlags::clear_w()),
8 => (0xF7, LegacyPrefixes::None, RexFlags::set_w()),
_ => unreachable!("{}", size),
};
sink.add_trap(*loc, TrapCode::IntegerDivisionByZero);
@@ -675,12 +676,12 @@ pub(crate) fn emit(
match divisor {
RegMem::Reg { reg } => {
let src = int_reg_enc(*reg);
emit_std_enc_enc(sink, prefix, 0xF7, 1, subopcode, src, rex_flags)
emit_std_enc_enc(sink, prefix, opcode, 1, subopcode, src, rex_flags)
}
RegMem::Mem { addr: src } => emit_std_enc_mem(
sink,
prefix,
0xF7,
opcode,
1,
subopcode,
&src.finalize(state),
@@ -715,6 +716,11 @@ pub(crate) fn emit(
}
}
Inst::SignExtendAlAh => {
sink.put1(0x66);
sink.put1(0x98);
}
Inst::SignExtendRaxRdx { size } => {
match size {
2 => sink.put1(0x66),