diff options
author | 2020-09-22 13:27:18 +0000 | |
---|---|---|
committer | 2020-09-23 08:05:32 +0000 | |
commit | 9dfb1a9d642b9eb627895ef3364736fc839b4fe4 (patch) | |
tree | 776f1e58c13f620829bde196163ebab089506d1b /compiler/utils/x86/assembler_x86.cc | |
parent | c372314fe478afe6aec5573c26bca378d686072d (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.cc | 21 |
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); |