summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--compiler/utils/x86_64/assembler_x86_64.cc2
-rw-r--r--compiler/utils/x86_64/assembler_x86_64_test.cc9
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