diff options
-rw-r--r-- | compiler/utils/x86_64/assembler_x86_64.cc | 2 | ||||
-rw-r--r-- | compiler/utils/x86_64/assembler_x86_64_test.cc | 9 |
2 files changed, 10 insertions, 1 deletions
diff --git a/compiler/utils/x86_64/assembler_x86_64.cc b/compiler/utils/x86_64/assembler_x86_64.cc index f164138168..bf58b16ce7 100644 --- a/compiler/utils/x86_64/assembler_x86_64.cc +++ b/compiler/utils/x86_64/assembler_x86_64.cc @@ -1222,7 +1222,7 @@ void X86_64Assembler::imull(CpuRegister dst, CpuRegister src) { void X86_64Assembler::imull(CpuRegister reg, const Immediate& imm) { AssemblerBuffer::EnsureCapacity ensured(&buffer_); - EmitOptionalRex32(reg); + EmitOptionalRex32(reg, reg); EmitUint8(0x69); EmitOperand(reg.LowBits(), Operand(reg)); EmitImmediate(imm); diff --git a/compiler/utils/x86_64/assembler_x86_64_test.cc b/compiler/utils/x86_64/assembler_x86_64_test.cc index 18c5cbcbc6..0e8ea5b3ee 100644 --- a/compiler/utils/x86_64/assembler_x86_64_test.cc +++ b/compiler/utils/x86_64/assembler_x86_64_test.cc @@ -186,6 +186,15 @@ TEST_F(AssemblerX86_64Test, Movw) { DriverStr(expected, "movw"); } +TEST_F(AssemblerX86_64Test, IMulImmediate) { + GetAssembler()->imull(x86_64::CpuRegister(x86_64::RAX), x86_64::Immediate(0x40000)); + GetAssembler()->imull(x86_64::CpuRegister(x86_64::R8), x86_64::Immediate(0x40000)); + const char* expected = + "imull $0x40000,%eax,%eax\n" + "imull $0x40000,%r8d,%r8d\n"; + DriverStr(expected, "imul"); +} + std::string setcc_test_fn(x86_64::X86_64Assembler* assembler) { // From Condition |