OSDN Git Service

Fix SIB for base + index addressing in x86_64 assembler.
authorNicolas Geoffray <ngeoffray@google.com>
Tue, 5 Aug 2014 23:24:09 +0000 (00:24 +0100)
committerNicolas Geoffray <ngeoffray@google.com>
Tue, 5 Aug 2014 23:25:37 +0000 (00:25 +0100)
Change-Id: Ib630bc28e6d694ffbe4a4a71cc988e36d00f6633

compiler/utils/x86_64/assembler_x86_64.h
compiler/utils/x86_64/assembler_x86_64_test.cc

index 1d6655c..2f814df 100644 (file)
@@ -124,8 +124,8 @@ class Operand {
     if (index.NeedsRex()) {
       rex_ |= 0x42;  // REX.00X0
     }
-    encoding_[1] = (scale << 6) | (static_cast<uint8_t>(index.AsRegister()) << 3) |
-        static_cast<uint8_t>(base.AsRegister());
+    encoding_[1] = (scale << 6) | (static_cast<uint8_t>(index.LowBits()) << 3) |
+        static_cast<uint8_t>(base.LowBits());
     length_ = 2;
   }
 
index 1f4d727..4ed7b20 100644 (file)
@@ -128,9 +128,18 @@ TEST_F(AssemblerX86_64Test, XorqImm) {
 TEST_F(AssemblerX86_64Test, Movl) {
   GetAssembler()->movl(x86_64::CpuRegister(x86_64::R8), x86_64::CpuRegister(x86_64::R11));
   GetAssembler()->movl(x86_64::CpuRegister(x86_64::RAX), x86_64::CpuRegister(x86_64::R11));
+  GetAssembler()->movl(x86_64::CpuRegister(x86_64::RAX), x86_64::Address(
+      x86_64::CpuRegister(x86_64::RDI), x86_64::CpuRegister(x86_64::RBX), x86_64::TIMES_4, 12));
+  GetAssembler()->movl(x86_64::CpuRegister(x86_64::RAX), x86_64::Address(
+      x86_64::CpuRegister(x86_64::RDI), x86_64::CpuRegister(x86_64::R9), x86_64::TIMES_4, 12));
+  GetAssembler()->movl(x86_64::CpuRegister(x86_64::R8), x86_64::Address(
+      x86_64::CpuRegister(x86_64::RDI), x86_64::CpuRegister(x86_64::R9), x86_64::TIMES_4, 12));
   const char* expected =
     "movl %R11d, %R8d\n"
-    "movl %R11d, %EAX\n";
+    "movl %R11d, %EAX\n"
+    "movl 0xc(%RDI,%RBX,4), %EAX\n"
+    "movl 0xc(%RDI,%R9,4), %EAX\n"
+    "movl 0xc(%RDI,%R9,4), %R8d\n";
 
   DriverStr(expected, "movl");
 }