From 18ba121e7d706ce03b5b52f632b7c14cff685eab Mon Sep 17 00:00:00 2001 From: Aart Bik Date: Mon, 1 Aug 2016 14:11:20 -0700 Subject: [PATCH] Added direct memory operand support for comiss/sd on x86. Rationale: Memory operands allows for shorter instruction sequences. Something that may be used e.g. the upcoming implementation of the round intrinsic. Bug=26327751 Change-Id: Ifd976ed86917de1879fa036cbbbff5edf4fb741d Test: assembler_x86_test --- compiler/utils/x86/assembler_x86.cc | 17 +++++++++++++++++ compiler/utils/x86/assembler_x86.h | 2 ++ compiler/utils/x86/assembler_x86_test.cc | 12 ++++++++++++ 3 files changed, 31 insertions(+) diff --git a/compiler/utils/x86/assembler_x86.cc b/compiler/utils/x86/assembler_x86.cc index f931d75e7..b8657900e 100644 --- a/compiler/utils/x86/assembler_x86.cc +++ b/compiler/utils/x86/assembler_x86.cc @@ -727,6 +727,14 @@ void X86Assembler::comiss(XmmRegister a, XmmRegister b) { } +void X86Assembler::comiss(XmmRegister a, const Address& b) { + AssemblerBuffer::EnsureCapacity ensured(&buffer_); + EmitUint8(0x0F); + EmitUint8(0x2F); + EmitOperand(a, b); +} + + void X86Assembler::comisd(XmmRegister a, XmmRegister b) { AssemblerBuffer::EnsureCapacity ensured(&buffer_); EmitUint8(0x66); @@ -736,6 +744,15 @@ void X86Assembler::comisd(XmmRegister a, XmmRegister b) { } +void X86Assembler::comisd(XmmRegister a, const Address& b) { + AssemblerBuffer::EnsureCapacity ensured(&buffer_); + EmitUint8(0x66); + EmitUint8(0x0F); + EmitUint8(0x2F); + EmitOperand(a, b); +} + + void X86Assembler::ucomiss(XmmRegister a, XmmRegister b) { AssemblerBuffer::EnsureCapacity ensured(&buffer_); EmitUint8(0x0F); diff --git a/compiler/utils/x86/assembler_x86.h b/compiler/utils/x86/assembler_x86.h index fa616620b..fba6c1c53 100644 --- a/compiler/utils/x86/assembler_x86.h +++ b/compiler/utils/x86/assembler_x86.h @@ -423,7 +423,9 @@ class X86Assembler FINAL : public Assembler { void cvtdq2pd(XmmRegister dst, XmmRegister src); void comiss(XmmRegister a, XmmRegister b); + void comiss(XmmRegister a, const Address& b); void comisd(XmmRegister a, XmmRegister b); + void comisd(XmmRegister a, const Address& b); void ucomiss(XmmRegister a, XmmRegister b); void ucomiss(XmmRegister a, const Address& b); void ucomisd(XmmRegister a, XmmRegister b); diff --git a/compiler/utils/x86/assembler_x86_test.cc b/compiler/utils/x86/assembler_x86_test.cc index 28043c938..67db51a89 100644 --- a/compiler/utils/x86/assembler_x86_test.cc +++ b/compiler/utils/x86/assembler_x86_test.cc @@ -322,12 +322,24 @@ TEST_F(AssemblerX86Test, RollImm) { DriverStr(RepeatRI(&x86::X86Assembler::roll, 1U, "roll ${imm}, %{reg}"), "rolli"); } +TEST_F(AssemblerX86Test, ComissAddr) { + GetAssembler()->comiss(x86::XmmRegister(x86::XMM0), x86::Address(x86::EAX, 0)); + const char* expected = "comiss 0(%EAX), %xmm0\n"; + DriverStr(expected, "comiss"); +} + TEST_F(AssemblerX86Test, UComissAddr) { GetAssembler()->ucomiss(x86::XmmRegister(x86::XMM0), x86::Address(x86::EAX, 0)); const char* expected = "ucomiss 0(%EAX), %xmm0\n"; DriverStr(expected, "ucomiss"); } +TEST_F(AssemblerX86Test, ComisdAddr) { + GetAssembler()->comisd(x86::XmmRegister(x86::XMM0), x86::Address(x86::EAX, 0)); + const char* expected = "comisd 0(%EAX), %xmm0\n"; + DriverStr(expected, "comisd"); +} + TEST_F(AssemblerX86Test, UComisdAddr) { GetAssembler()->ucomisd(x86::XmmRegister(x86::XMM0), x86::Address(x86::EAX, 0)); const char* expected = "ucomisd 0(%EAX), %xmm0\n"; -- 2.11.0