Fix encoding of imul in x86_64 assembler.
Change-Id: I5b97f5698ed8ec9d0759d0e1eba8be29119c16c5
diff --git a/compiler/utils/x86_64/assembler_x86_64.cc b/compiler/utils/x86_64/assembler_x86_64.cc
index f164138..bf58b16 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 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 18c5cbc..0e8ea5b 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 @@
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