Index: src/assembler_ia32.cpp |
diff --git a/src/assembler_ia32.cpp b/src/assembler_ia32.cpp |
index ceed1d109c8920031905a7101ba1f120468598c5..5d1c8a71280afcbf1ce2c02fde22ddcfad1959d3 100644 |
--- a/src/assembler_ia32.cpp |
+++ b/src/assembler_ia32.cpp |
@@ -1110,12 +1110,6 @@ void AssemblerX86::fincstp() { |
EmitUint8(0xF7); |
} |
-void AssemblerX86::xchgl(GPRRegister dst, GPRRegister src) { |
- AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
- EmitUint8(0x87); |
- EmitRegisterOperand(dst, src); |
-} |
- |
void AssemblerX86::cmpl(GPRRegister reg, const Immediate &imm) { |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitComplex(7, Operand(reg), imm); |
@@ -1307,6 +1301,18 @@ void AssemblerX86::subl(const Address &address, GPRRegister reg) { |
EmitOperand(reg, address); |
} |
+void AssemblerX86::cbw() { |
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
+ EmitOperandSizeOverride(); |
+ EmitUint8(0x98); |
+} |
+ |
+void AssemblerX86::cwd() { |
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
+ EmitOperandSizeOverride(); |
+ EmitUint8(0x99); |
+} |
+ |
void AssemblerX86::cdq() { |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0x99); |
@@ -1674,13 +1680,48 @@ void AssemblerX86::lock() { |
EmitUint8(0xF0); |
} |
-void AssemblerX86::cmpxchgl(const Address &address, GPRRegister reg) { |
+void AssemblerX86::cmpxchg(Type Ty, const Address &address, GPRRegister reg) { |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
+ if (Ty == IceType_i16) |
+ EmitOperandSizeOverride(); |
EmitUint8(0x0F); |
- EmitUint8(0xB1); |
+ if (Ty == IceType_i1 || Ty == IceType_i8) |
Jim Stichnoth
2014/09/23 17:21:20
After the dust settles, I think there are a lot of
jvoung (off chromium)
2014/09/23 20:20:56
Acknowledged.
Yep -- Agreed. Technically there s
|
+ EmitUint8(0xB0); |
+ else |
+ EmitUint8(0xB1); |
EmitOperand(reg, address); |
} |
+void AssemblerX86::cmpxchg8b(const Address &address) { |
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
+ EmitUint8(0x0F); |
+ EmitUint8(0xC7); |
+ EmitOperand(1, address); |
+} |
+ |
+void AssemblerX86::xadd(Type Ty, const Address &addr, GPRRegister reg) { |
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
+ if (Ty == IceType_i16) |
+ EmitOperandSizeOverride(); |
+ EmitUint8(0x0F); |
+ if (Ty == IceType_i1 || Ty == IceType_i8) |
+ EmitUint8(0xC0); |
+ else |
+ EmitUint8(0xC1); |
+ EmitOperand(reg, addr); |
+} |
+ |
+void AssemblerX86::xchg(Type Ty, const Address &addr, GPRRegister reg) { |
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
+ if (Ty == IceType_i16) |
+ EmitOperandSizeOverride(); |
+ if (Ty == IceType_i1 || Ty == IceType_i8) |
+ EmitUint8(0x86); |
+ else |
+ EmitUint8(0x87); |
+ EmitOperand(reg, addr); |
+} |
+ |
void AssemblerX86::Align(intptr_t alignment, intptr_t offset) { |
assert(llvm::isPowerOf2_32(alignment)); |
intptr_t pos = offset + buffer_.GetPosition(); |