diff options
| author | 2015-10-30 09:21:37 -0400 | |
|---|---|---|
| committer | 2015-10-30 09:21:37 -0400 | |
| commit | 9f51f26b815fb955a3b91df86d54acd3f41480e4 (patch) | |
| tree | a22b5526f9c7f077c042b10416d1155df08fe748 | |
| parent | 13f6af0f9c8af1fce34e9610ad9d30d4d0434478 (diff) | |
X86: Add support for ucomis[sd] reg/memory form
Allow an Address as the second operand.
Change-Id: I4940829e2e4bfe0cddef3808265fdb638ac07b7e
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
| -rw-r--r-- | compiler/utils/x86/assembler_x86.cc | 17 | ||||
| -rw-r--r-- | compiler/utils/x86/assembler_x86.h | 2 | ||||
| -rw-r--r-- | compiler/utils/x86/assembler_x86_test.cc | 13 |
3 files changed, 32 insertions, 0 deletions
diff --git a/compiler/utils/x86/assembler_x86.cc b/compiler/utils/x86/assembler_x86.cc index 5347bf0302..d6caa3c338 100644 --- a/compiler/utils/x86/assembler_x86.cc +++ b/compiler/utils/x86/assembler_x86.cc @@ -720,6 +720,14 @@ void X86Assembler::ucomiss(XmmRegister a, XmmRegister b) { } +void X86Assembler::ucomiss(XmmRegister a, const Address& b) { + AssemblerBuffer::EnsureCapacity ensured(&buffer_); + EmitUint8(0x0F); + EmitUint8(0x2E); + EmitOperand(a, b); +} + + void X86Assembler::ucomisd(XmmRegister a, XmmRegister b) { AssemblerBuffer::EnsureCapacity ensured(&buffer_); EmitUint8(0x66); @@ -729,6 +737,15 @@ void X86Assembler::ucomisd(XmmRegister a, XmmRegister b) { } +void X86Assembler::ucomisd(XmmRegister a, const Address& b) { + AssemblerBuffer::EnsureCapacity ensured(&buffer_); + EmitUint8(0x66); + EmitUint8(0x0F); + EmitUint8(0x2E); + EmitOperand(a, b); +} + + void X86Assembler::roundsd(XmmRegister dst, XmmRegister src, const Immediate& imm) { AssemblerBuffer::EnsureCapacity ensured(&buffer_); EmitUint8(0x66); diff --git a/compiler/utils/x86/assembler_x86.h b/compiler/utils/x86/assembler_x86.h index b50fda907a..655af9c184 100644 --- a/compiler/utils/x86/assembler_x86.h +++ b/compiler/utils/x86/assembler_x86.h @@ -417,7 +417,9 @@ class X86Assembler FINAL : public Assembler { void comiss(XmmRegister a, XmmRegister b); void comisd(XmmRegister a, XmmRegister b); void ucomiss(XmmRegister a, XmmRegister b); + void ucomiss(XmmRegister a, const Address& b); void ucomisd(XmmRegister a, XmmRegister b); + void ucomisd(XmmRegister a, const Address& b); void roundsd(XmmRegister dst, XmmRegister src, const Immediate& imm); void roundss(XmmRegister dst, XmmRegister src, const Immediate& imm); diff --git a/compiler/utils/x86/assembler_x86_test.cc b/compiler/utils/x86/assembler_x86_test.cc index 16f9db43fb..a9b991c7a0 100644 --- a/compiler/utils/x86/assembler_x86_test.cc +++ b/compiler/utils/x86/assembler_x86_test.cc @@ -306,6 +306,19 @@ TEST_F(AssemblerX86Test, RollImm) { DriverStr(RepeatRI(&x86::X86Assembler::roll, 1U, "roll ${imm}, %{reg}"), "rolli"); } +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, UComisdAddr) { + GetAssembler()->ucomisd(x86::XmmRegister(x86::XMM0), x86::Address(x86::EAX, 0)); + const char* expected = "ucomisd 0(%EAX), %xmm0\n"; + DriverStr(expected, "ucomisd"); +} + + ///////////////// // Near labels // ///////////////// |