summaryrefslogtreecommitdiff
path: root/compiler/utils/x86/assembler_x86.cc
diff options
context:
space:
mode:
author Andra Danciu <andradanciu@google.com> 2020-09-22 13:27:18 +0000
committer Vladimir Marko <vmarko@google.com> 2020-09-23 08:05:32 +0000
commit9dfb1a9d642b9eb627895ef3364736fc839b4fe4 (patch)
tree776f1e58c13f620829bde196163ebab089506d1b /compiler/utils/x86/assembler_x86.cc
parentc372314fe478afe6aec5573c26bca378d686072d (diff)
X86: Implement VarHandle.getAndSet, getAndSetAcquire, getAndSetRelease
This commit implements VarHandle getAndSet variants. This implied adding xchgb and xchgw instructions and tests for them. Also, all the varType checks were moved to GenerateVarHandleCommonChecks. Test: ART_HEAP_POISONING=true art/test.py --host -r -t 712-varhandle-invocation --32 Test: ART_HEAP_POISONING=false art/test.py --host -r -t 712-varhandle-invocation --32 Test: ART_USE_READ_BARRIER=true art/test.py --host -r -t 712-varhandle-invocation --32 Test: ART_USE_READ_BARRIER=false art/test.py --host -r -t 712-varhandle-invocation --32 Test: m test-art-host-gtest Bug: 65872996 Change-Id: I675f47e1dbb51a5ece42f20ad8ce552cfef63ffe
Diffstat (limited to 'compiler/utils/x86/assembler_x86.cc')
-rw-r--r--compiler/utils/x86/assembler_x86.cc21
1 files changed, 21 insertions, 0 deletions
diff --git a/compiler/utils/x86/assembler_x86.cc b/compiler/utils/x86/assembler_x86.cc
index da53138239..adc7bcc0f4 100644
--- a/compiler/utils/x86/assembler_x86.cc
+++ b/compiler/utils/x86/assembler_x86.cc
@@ -2887,6 +2887,27 @@ void X86Assembler::fprem() {
}
+void X86Assembler::xchgb(Register reg, const Address& address) {
+ // For testing purpose
+ xchgb(static_cast<ByteRegister>(reg), address);
+}
+
+
+void X86Assembler::xchgb(ByteRegister reg, const Address& address) {
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+ EmitUint8(0x86);
+ EmitOperand(reg, address);
+}
+
+
+void X86Assembler::xchgw(Register reg, const Address& address) {
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+ EmitOperandSizeOverride();
+ EmitUint8(0x87);
+ EmitOperand(reg, address);
+}
+
+
void X86Assembler::xchgl(Register dst, Register src) {
AssemblerBuffer::EnsureCapacity ensured(&buffer_);
EmitUint8(0x87);