diff options
author | Calin Juravle <calin@google.com> | 2014-12-16 17:02:57 +0000 |
---|---|---|
committer | Calin Juravle <calin@google.com> | 2014-12-19 09:58:27 +0000 |
commit | 52c489645b6e9ae33623f1ec24143cde5444906e (patch) | |
tree | a39667aa354645bd42a7a061d08ca82df3004143 /compiler/utils/x86 | |
parent | 193c7a94822f765b0b6b0cecd54c9f08dfd26425 (diff) | |
download | android_art-52c489645b6e9ae33623f1ec24143cde5444906e.tar.gz android_art-52c489645b6e9ae33623f1ec24143cde5444906e.tar.bz2 android_art-52c489645b6e9ae33623f1ec24143cde5444906e.zip |
[optimizing compiler] Add support for volatile
- for backends: arm, x86, x86_64
- added necessary instructions to assemblies
- clean up code gen for field set/get
- fixed InstructionDataEquals for some instructions
- fixed comments in compiler_enums
* 003-opcode test verifies basic volatile functionality
Change-Id: I144393efa312dfb2c332cb84056b00edffee338a
Diffstat (limited to 'compiler/utils/x86')
-rw-r--r-- | compiler/utils/x86/assembler_x86.cc | 21 | ||||
-rw-r--r-- | compiler/utils/x86/assembler_x86.h | 3 | ||||
-rw-r--r-- | compiler/utils/x86/assembler_x86_test.cc | 12 |
3 files changed, 36 insertions, 0 deletions
diff --git a/compiler/utils/x86/assembler_x86.cc b/compiler/utils/x86/assembler_x86.cc index f0353f6cd2..f8c0043242 100644 --- a/compiler/utils/x86/assembler_x86.cc +++ b/compiler/utils/x86/assembler_x86.cc @@ -443,6 +443,27 @@ void X86Assembler::movsd(XmmRegister dst, XmmRegister src) { } +void X86Assembler::psrlq(XmmRegister reg, const Immediate& shift_count) { + DCHECK(shift_count.is_uint8()); + + AssemblerBuffer::EnsureCapacity ensured(&buffer_); + EmitUint8(0x66); + EmitUint8(0x0F); + EmitUint8(0x73); + EmitXmmRegisterOperand(2, reg); + EmitUint8(shift_count.value()); +} + + +void X86Assembler::punpckldq(XmmRegister dst, XmmRegister src) { + AssemblerBuffer::EnsureCapacity ensured(&buffer_); + EmitUint8(0x66); + EmitUint8(0x0F); + EmitUint8(0x62); + EmitXmmRegisterOperand(dst, src); +} + + void X86Assembler::addsd(XmmRegister dst, XmmRegister src) { AssemblerBuffer::EnsureCapacity ensured(&buffer_); EmitUint8(0xF2); diff --git a/compiler/utils/x86/assembler_x86.h b/compiler/utils/x86/assembler_x86.h index 9fecf1edf0..6c3d13122c 100644 --- a/compiler/utils/x86/assembler_x86.h +++ b/compiler/utils/x86/assembler_x86.h @@ -274,6 +274,9 @@ class X86Assembler FINAL : public Assembler { void movsd(const Address& dst, XmmRegister src); void movsd(XmmRegister dst, XmmRegister src); + void psrlq(XmmRegister reg, const Immediate& shift_count); + void punpckldq(XmmRegister dst, XmmRegister src); + void addsd(XmmRegister dst, XmmRegister src); void addsd(XmmRegister dst, const Address& src); void subsd(XmmRegister dst, XmmRegister src); diff --git a/compiler/utils/x86/assembler_x86_test.cc b/compiler/utils/x86/assembler_x86_test.cc index d901673691..fccb510afb 100644 --- a/compiler/utils/x86/assembler_x86_test.cc +++ b/compiler/utils/x86/assembler_x86_test.cc @@ -105,6 +105,18 @@ TEST_F(AssemblerX86Test, Movl) { DriverStr(expected, "movl"); } +TEST_F(AssemblerX86Test, psrlq) { + GetAssembler()->psrlq(x86::XMM0, CreateImmediate(32)); + const char* expected = "psrlq $0x20, %xmm0\n"; + DriverStr(expected, "psrlq"); +} + +TEST_F(AssemblerX86Test, punpckldq) { + GetAssembler()->punpckldq(x86::XMM0, x86::XMM1); + const char* expected = "punpckldq %xmm1, %xmm0\n"; + DriverStr(expected, "punpckldq"); +} + TEST_F(AssemblerX86Test, LoadLongConstant) { GetAssembler()->LoadLongConstant(x86::XMM0, 51); const char* expected = |