[machinst x64]: add iabs implementation
This commit is contained in:
@@ -1697,27 +1697,38 @@ pub(crate) fn emit(
|
||||
} => {
|
||||
let rex = RexFlags::clear_w();
|
||||
|
||||
let (prefix, opcode) = match op {
|
||||
SseOpcode::Cvtss2sd => (LegacyPrefixes::_F3, 0x0F5A),
|
||||
SseOpcode::Cvtsd2ss => (LegacyPrefixes::_F2, 0x0F5A),
|
||||
SseOpcode::Movaps => (LegacyPrefixes::None, 0x0F28),
|
||||
SseOpcode::Movapd => (LegacyPrefixes::_66, 0x0F28),
|
||||
SseOpcode::Movdqa => (LegacyPrefixes::_66, 0x0F6F),
|
||||
SseOpcode::Movdqu => (LegacyPrefixes::_F3, 0x0F6F),
|
||||
SseOpcode::Movsd => (LegacyPrefixes::_F2, 0x0F10),
|
||||
SseOpcode::Movss => (LegacyPrefixes::_F3, 0x0F10),
|
||||
SseOpcode::Movups => (LegacyPrefixes::None, 0x0F10),
|
||||
SseOpcode::Movupd => (LegacyPrefixes::_66, 0x0F10),
|
||||
SseOpcode::Sqrtps => (LegacyPrefixes::None, 0x0F51),
|
||||
SseOpcode::Sqrtpd => (LegacyPrefixes::_66, 0x0F51),
|
||||
SseOpcode::Sqrtss => (LegacyPrefixes::_F3, 0x0F51),
|
||||
SseOpcode::Sqrtsd => (LegacyPrefixes::_F2, 0x0F51),
|
||||
let (prefix, opcode, num_opcodes) = match op {
|
||||
SseOpcode::Cvtss2sd => (LegacyPrefixes::_F3, 0x0F5A, 2),
|
||||
SseOpcode::Cvtsd2ss => (LegacyPrefixes::_F2, 0x0F5A, 2),
|
||||
SseOpcode::Movaps => (LegacyPrefixes::None, 0x0F28, 2),
|
||||
SseOpcode::Movapd => (LegacyPrefixes::_66, 0x0F28, 2),
|
||||
SseOpcode::Movdqa => (LegacyPrefixes::_66, 0x0F6F, 2),
|
||||
SseOpcode::Movdqu => (LegacyPrefixes::_F3, 0x0F6F, 2),
|
||||
SseOpcode::Movsd => (LegacyPrefixes::_F2, 0x0F10, 2),
|
||||
SseOpcode::Movss => (LegacyPrefixes::_F3, 0x0F10, 2),
|
||||
SseOpcode::Movups => (LegacyPrefixes::None, 0x0F10, 2),
|
||||
SseOpcode::Movupd => (LegacyPrefixes::_66, 0x0F10, 2),
|
||||
SseOpcode::Pabsb => (LegacyPrefixes::_66, 0x0F381C, 3),
|
||||
SseOpcode::Pabsw => (LegacyPrefixes::_66, 0x0F381D, 3),
|
||||
SseOpcode::Pabsd => (LegacyPrefixes::_66, 0x0F381E, 3),
|
||||
SseOpcode::Sqrtps => (LegacyPrefixes::None, 0x0F51, 2),
|
||||
SseOpcode::Sqrtpd => (LegacyPrefixes::_66, 0x0F51, 2),
|
||||
SseOpcode::Sqrtss => (LegacyPrefixes::_F3, 0x0F51, 2),
|
||||
SseOpcode::Sqrtsd => (LegacyPrefixes::_F2, 0x0F51, 2),
|
||||
_ => unimplemented!("Opcode {:?} not implemented", op),
|
||||
};
|
||||
|
||||
match src_e {
|
||||
RegMem::Reg { reg: reg_e } => {
|
||||
emit_std_reg_reg(sink, prefix, opcode, 2, reg_g.to_reg(), *reg_e, rex);
|
||||
emit_std_reg_reg(
|
||||
sink,
|
||||
prefix,
|
||||
opcode,
|
||||
num_opcodes,
|
||||
reg_g.to_reg(),
|
||||
*reg_e,
|
||||
rex,
|
||||
);
|
||||
}
|
||||
RegMem::Mem { addr } => {
|
||||
let addr = &addr.finalize(state);
|
||||
@@ -1725,7 +1736,7 @@ pub(crate) fn emit(
|
||||
// Register the offset at which the actual load instruction starts.
|
||||
sink.add_trap(srcloc, TrapCode::HeapOutOfBounds);
|
||||
}
|
||||
emit_std_reg_mem(sink, prefix, opcode, 2, reg_g.to_reg(), addr, rex);
|
||||
emit_std_reg_mem(sink, prefix, opcode, num_opcodes, reg_g.to_reg(), addr, rex);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user