diff options
author | 2020-09-08 14:35:09 +0000 | |
---|---|---|
committer | 2020-09-10 12:48:50 +0000 | |
commit | 5e13d453acc03fda08dae23e085f7161a73f7032 (patch) | |
tree | 713b60fff222f3ed1b4ad518ee7e95c9cba041ce /compiler/utils/x86/assembler_x86.h | |
parent | 8376a6543b8500c5321ddd6f6ead04e1397ceab8 (diff) |
X86: Implement VarHandle.compareAndSet() for fields.
This commit implements VarHandle compareAndExchange access mode for
fields (both static and instance).
Int64 and Float64 are not implemented because ParallelMove might fail
when moving register pairs.
Test: ART_HEAP_POISONING=true art/test.py --host --32 -r -t 712-varhandle-invocations
Test: ART_HEAP_POISONING=false art/test.py --host --32 -r -t 712-varhandle-invocations
Bug: 65872996
Change-Id: I92e51c348f076c23413e419948f03197c286a619
Diffstat (limited to 'compiler/utils/x86/assembler_x86.h')
-rw-r--r-- | compiler/utils/x86/assembler_x86.h | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/compiler/utils/x86/assembler_x86.h b/compiler/utils/x86/assembler_x86.h index 522d57a63d..2fe3b7bec5 100644 --- a/compiler/utils/x86/assembler_x86.h +++ b/compiler/utils/x86/assembler_x86.h @@ -795,6 +795,8 @@ class X86Assembler final : public Assembler { void rep_movsw(); X86Assembler* lock(); + void cmpxchgb(const Address& address, ByteRegister reg); + void cmpxchgw(const Address& address, Register reg); void cmpxchgl(const Address& address, Register reg); void cmpxchg8b(const Address& address); @@ -812,6 +814,14 @@ class X86Assembler final : public Assembler { void LoadLongConstant(XmmRegister dst, int64_t value); void LoadDoubleConstant(XmmRegister dst, double value); + void LockCmpxchgb(const Address& address, ByteRegister reg) { + lock()->cmpxchgb(address, reg); + } + + void LockCmpxchgw(const Address& address, Register reg) { + lock()->cmpxchgw(address, reg); + } + void LockCmpxchgl(const Address& address, Register reg) { lock()->cmpxchgl(address, reg); } |