diff options
Diffstat (limited to 'compiler/utils/x86/assembler_x86.h')
-rw-r--r-- | compiler/utils/x86/assembler_x86.h | 28 |
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 // |