summaryrefslogtreecommitdiff
path: root/compiler/utils/x86/assembler_x86.h
diff options
context:
space:
mode:
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
//