diff options
Diffstat (limited to 'compiler/utils')
| -rw-r--r-- | compiler/utils/x86/assembler_x86.cc | 4 | ||||
| -rw-r--r-- | compiler/utils/x86/assembler_x86.h | 2 | ||||
| -rw-r--r-- | compiler/utils/x86_64/assembler_x86_64.h | 6 | ||||
| -rw-r--r-- | compiler/utils/x86_64/assembler_x86_64_test.cc | 23 |
4 files changed, 29 insertions, 6 deletions
diff --git a/compiler/utils/x86/assembler_x86.cc b/compiler/utils/x86/assembler_x86.cc index f0353f6cd2..6aec45edaf 100644 --- a/compiler/utils/x86/assembler_x86.cc +++ b/compiler/utils/x86/assembler_x86.cc @@ -269,11 +269,11 @@ void X86Assembler::cmovl(Condition condition, Register dst, Register src) { } -void X86Assembler::setb(Condition condition, Register dst) { +void X86Assembler::setb(Condition condition, ByteRegister dst) { AssemblerBuffer::EnsureCapacity ensured(&buffer_); EmitUint8(0x0F); EmitUint8(0x90 + condition); - EmitOperand(0, Operand(dst)); + EmitRegisterOperand(0, dst); } diff --git a/compiler/utils/x86/assembler_x86.h b/compiler/utils/x86/assembler_x86.h index 9fecf1edf0..fe07e8f213 100644 --- a/compiler/utils/x86/assembler_x86.h +++ b/compiler/utils/x86/assembler_x86.h @@ -251,7 +251,7 @@ class X86Assembler FINAL : public Assembler { void cmovl(Condition condition, Register dst, Register src); - void setb(Condition condition, Register dst); + void setb(Condition condition, ByteRegister dst); void movaps(XmmRegister dst, XmmRegister src); void movss(XmmRegister dst, const Address& src); diff --git a/compiler/utils/x86_64/assembler_x86_64.h b/compiler/utils/x86_64/assembler_x86_64.h index 51d1de2c0f..60ab475e31 100644 --- a/compiler/utils/x86_64/assembler_x86_64.h +++ b/compiler/utils/x86_64/assembler_x86_64.h @@ -180,18 +180,18 @@ class Address : public Operand { void Init(CpuRegister base_in, int32_t disp) { if (disp == 0 && base_in.AsRegister() != RBP) { SetModRM(0, base_in); - if (base_in.AsRegister() == RSP) { + if (base_in.LowBits() == RSP) { SetSIB(TIMES_1, CpuRegister(RSP), base_in); } } else if (disp >= -128 && disp <= 127) { SetModRM(1, base_in); - if (base_in.AsRegister() == RSP) { + if (base_in.LowBits() == RSP) { SetSIB(TIMES_1, CpuRegister(RSP), base_in); } SetDisp8(disp); } else { SetModRM(2, base_in); - if (base_in.AsRegister() == RSP) { + if (base_in.LowBits() == RSP) { SetSIB(TIMES_1, CpuRegister(RSP), base_in); } SetDisp32(disp); diff --git a/compiler/utils/x86_64/assembler_x86_64_test.cc b/compiler/utils/x86_64/assembler_x86_64_test.cc index c8e923c9d6..0ce809c423 100644 --- a/compiler/utils/x86_64/assembler_x86_64_test.cc +++ b/compiler/utils/x86_64/assembler_x86_64_test.cc @@ -544,6 +544,29 @@ TEST_F(AssemblerX86_64Test, Movl) { DriverStr(expected, "movl"); } +TEST_F(AssemblerX86_64Test, Movq) { + GetAssembler()->movq(x86_64::CpuRegister(x86_64::RAX), x86_64::Address( + x86_64::CpuRegister(x86_64::R12), 12)); + GetAssembler()->movq(x86_64::CpuRegister(x86_64::RAX), x86_64::Address( + x86_64::CpuRegister(x86_64::R12), 0)); + GetAssembler()->movq(x86_64::CpuRegister(x86_64::RAX), x86_64::Address( + x86_64::CpuRegister(x86_64::R12), 256)); + GetAssembler()->movq(x86_64::CpuRegister(x86_64::RAX), x86_64::Address( + x86_64::CpuRegister(x86_64::RBP), 12)); + GetAssembler()->movq(x86_64::CpuRegister(x86_64::RAX), x86_64::Address( + x86_64::CpuRegister(x86_64::RBP), 0)); + GetAssembler()->movq(x86_64::CpuRegister(x86_64::RAX), x86_64::Address( + x86_64::CpuRegister(x86_64::RBP), 256)); + const char* expected = + "movq 0xc(%R12), %RAX\n" + "movq (%R12), %RAX\n" + "movq 0x100(%R12), %RAX\n" + "movq 0xc(%RBP), %RAX\n" + "movq (%RBP), %RAX\n" + "movq 0x100(%RBP), %RAX\n"; + DriverStr(expected, "movq"); +} + TEST_F(AssemblerX86_64Test, Movw) { GetAssembler()->movw(x86_64::Address(x86_64::CpuRegister(x86_64::RAX), 0), x86_64::CpuRegister(x86_64::R9)); |