summaryrefslogtreecommitdiff
path: root/compiler/utils/x86/assembler_x86.h
diff options
context:
space:
mode:
author Andra Danciu <andradanciu@google.com> 2020-09-14 13:22:40 +0000
committer Treehugger Robot <treehugger-gerrit@google.com> 2020-09-18 08:21:00 +0000
commiteb2c9dd52679d590428a33556f45fb49eaef5e0e (patch)
tree9bb849944b66c9b3ec20536e7c5a37af41a54195 /compiler/utils/x86/assembler_x86.h
parentf61e0617b89e4ad60373f36da56812c20a3e0b20 (diff)
X86: Implement VarHandle.getAndAdd intrinsic
This commit implements VarHandle getAndAdd intrinsic. This also implied adding xadd instruction and tests for it. Test: art/test.py --host -r -t 712-varhandle-invocation --32 Test: m test-art-host-gtest Bug: 65872996 Change-Id: I84dd95ba6464c8a73ace03a13817147c7099677a
Diffstat (limited to 'compiler/utils/x86/assembler_x86.h')
-rw-r--r--compiler/utils/x86/assembler_x86.h28
1 files changed, 28 insertions, 0 deletions
diff --git a/compiler/utils/x86/assembler_x86.h b/compiler/utils/x86/assembler_x86.h
index c5469270e4..1c4f82663e 100644
--- a/compiler/utils/x86/assembler_x86.h
+++ b/compiler/utils/x86/assembler_x86.h
@@ -817,6 +817,10 @@ class X86Assembler final : public Assembler {
void cmpxchgl(const Address& address, Register reg);
void cmpxchg8b(const Address& address);
+ void xaddb(const Address& address, ByteRegister reg);
+ void xaddw(const Address& address, Register reg);
+ void xaddl(const Address& address, Register reg);
+
void mfence();
X86Assembler* fs();
@@ -859,6 +863,30 @@ class X86Assembler final : public Assembler {
lock()->cmpxchg8b(address);
}
+ void LockXaddb(const Address& address, Register reg) {
+ // For testing purpose
+ lock()->xaddb(address, static_cast<ByteRegister>(reg));
+ }
+
+ void LockXaddb(const Address& address, ByteRegister reg) {
+ lock()->xaddb(address, reg);
+ }
+
+ void LockXaddw(const Address& address, Register reg) {
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+ // We make sure that the operand size override bytecode is emited before the lock bytecode.
+ // We test against clang which enforces this bytecode order.
+ EmitOperandSizeOverride();
+ EmitUint8(0xF0);
+ EmitUint8(0x0F);
+ EmitUint8(0xC1);
+ EmitOperand(reg, address);
+ }
+
+ void LockXaddl(const Address& address, Register reg) {
+ lock()->xaddl(address, reg);
+ }
+
//
// Misc. functionality
//