summaryrefslogtreecommitdiff
path: root/compiler/utils
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/utils')
-rw-r--r--compiler/utils/x86/assembler_x86.cc4
-rw-r--r--compiler/utils/x86/assembler_x86.h2
-rw-r--r--compiler/utils/x86_64/assembler_x86_64.h6
-rw-r--r--compiler/utils/x86_64/assembler_x86_64_test.cc23
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));