Index: src/IceAssemblerX8632.cpp |
diff --git a/src/IceAssemblerX8632.cpp b/src/IceAssemblerX8632.cpp |
index 48f023c16fe93ad867b84eb23d49b8483a1d9c92..ecb6c5b794093de758509d0dcd329717ae59473b 100644 |
--- a/src/IceAssemblerX8632.cpp |
+++ b/src/IceAssemblerX8632.cpp |
@@ -1498,60 +1498,93 @@ void AssemblerX8632::fincstp() { |
emitUint8(0xF7); |
} |
-void AssemblerX8632::cmp(Type Ty, GPRRegister reg, const Immediate &imm) { |
+template <uint32_t Tag> |
+void AssemblerX8632::arith_int(Type Ty, GPRRegister reg, const Immediate &imm) { |
+ static_assert(Tag < 8, "Tag must be between 0..7"); |
AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
if (isByteSizedType(Ty)) { |
- emitComplexI8(7, Operand(reg), imm); |
+ emitComplexI8(Tag, Operand(reg), imm); |
return; |
} |
if (Ty == IceType_i16) |
emitOperandSizeOverride(); |
- emitComplex(Ty, 7, Operand(reg), imm); |
+ emitComplex(Ty, Tag, Operand(reg), imm); |
} |
-void AssemblerX8632::cmp(Type Ty, GPRRegister reg0, GPRRegister reg1) { |
+template <uint32_t Tag> |
+void AssemblerX8632::arith_int(Type Ty, GPRRegister reg0, GPRRegister reg1) { |
+ static_assert(Tag < 8, "Tag must be between 0..7"); |
AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
if (Ty == IceType_i16) |
emitOperandSizeOverride(); |
if (isByteSizedType(Ty)) |
- emitUint8(0x3A); |
+ emitUint8(Tag * 8 + 2); |
else |
- emitUint8(0x3B); |
+ emitUint8(Tag * 8 + 3); |
emitRegisterOperand(reg0, reg1); |
} |
-void AssemblerX8632::cmp(Type Ty, GPRRegister reg, const Address &address) { |
+template <uint32_t Tag> |
+void AssemblerX8632::arith_int(Type Ty, GPRRegister reg, |
+ const Address &address) { |
+ static_assert(Tag < 8, "Tag must be between 0..7"); |
AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
if (Ty == IceType_i16) |
emitOperandSizeOverride(); |
if (isByteSizedType(Ty)) |
- emitUint8(0x3A); |
+ emitUint8(Tag * 8 + 2); |
else |
- emitUint8(0x3B); |
+ emitUint8(Tag * 8 + 3); |
emitOperand(reg, address); |
} |
-void AssemblerX8632::cmp(Type Ty, const Address &address, GPRRegister reg) { |
+template <uint32_t Tag> |
+void AssemblerX8632::arith_int(Type Ty, const Address &address, |
+ GPRRegister reg) { |
+ static_assert(Tag < 8, "Tag must be between 0..7"); |
AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
if (Ty == IceType_i16) |
emitOperandSizeOverride(); |
if (isByteSizedType(Ty)) |
- emitUint8(0x38); |
+ emitUint8(Tag * 8 + 0); |
else |
- emitUint8(0x39); |
+ emitUint8(Tag * 8 + 1); |
emitOperand(reg, address); |
} |
-void AssemblerX8632::cmp(Type Ty, const Address &address, |
- const Immediate &imm) { |
+template <uint32_t Tag> |
+void AssemblerX8632::arith_int(Type Ty, const Address &address, |
+ const Immediate &imm) { |
+ static_assert(Tag < 8, "Tag must be between 0..7"); |
AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
if (isByteSizedType(Ty)) { |
- emitComplexI8(7, address, imm); |
+ emitComplexI8(Tag, address, imm); |
return; |
} |
if (Ty == IceType_i16) |
emitOperandSizeOverride(); |
- emitComplex(Ty, 7, address, imm); |
+ emitComplex(Ty, Tag, address, imm); |
+} |
+ |
+void AssemblerX8632::cmp(Type Ty, GPRRegister reg, const Immediate &imm) { |
+ arith_int<7>(Ty, reg, imm); |
+} |
+ |
+void AssemblerX8632::cmp(Type Ty, GPRRegister reg0, GPRRegister reg1) { |
+ arith_int<7>(Ty, reg0, reg1); |
+} |
+ |
+void AssemblerX8632::cmp(Type Ty, GPRRegister reg, const Address &address) { |
+ arith_int<7>(Ty, reg, address); |
+} |
+ |
+void AssemblerX8632::cmp(Type Ty, const Address &address, GPRRegister reg) { |
+ arith_int<7>(Ty, address, reg); |
+} |
+ |
+void AssemblerX8632::cmp(Type Ty, const Address &address, |
+ const Immediate &imm) { |
+ arith_int<7>(Ty, address, imm); |
} |
void AssemblerX8632::test(Type Ty, GPRRegister reg1, GPRRegister reg2) { |
@@ -1628,257 +1661,149 @@ void AssemblerX8632::test(Type Ty, const Address &addr, |
} |
void AssemblerX8632::And(Type Ty, GPRRegister dst, GPRRegister src) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- if (isByteSizedType(Ty)) |
- emitUint8(0x22); |
- else |
- emitUint8(0x23); |
- emitRegisterOperand(dst, src); |
+ arith_int<4>(Ty, dst, src); |
} |
void AssemblerX8632::And(Type Ty, GPRRegister dst, const Address &address) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- if (isByteSizedType(Ty)) |
- emitUint8(0x22); |
- else |
- emitUint8(0x23); |
- emitOperand(dst, address); |
+ arith_int<4>(Ty, dst, address); |
} |
void AssemblerX8632::And(Type Ty, GPRRegister dst, const Immediate &imm) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (isByteSizedType(Ty)) { |
- emitComplexI8(4, Operand(dst), imm); |
- return; |
- } |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- emitComplex(Ty, 4, Operand(dst), imm); |
+ arith_int<4>(Ty, dst, imm); |
+} |
+ |
+void AssemblerX8632::And(Type Ty, const Address &address, GPRRegister reg) { |
+ arith_int<4>(Ty, address, reg); |
+} |
+ |
+void AssemblerX8632::And(Type Ty, const Address &address, |
+ const Immediate &imm) { |
+ arith_int<4>(Ty, address, imm); |
} |
void AssemblerX8632::Or(Type Ty, GPRRegister dst, GPRRegister src) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- if (isByteSizedType(Ty)) |
- emitUint8(0x0A); |
- else |
- emitUint8(0x0B); |
- emitRegisterOperand(dst, src); |
+ arith_int<1>(Ty, dst, src); |
} |
void AssemblerX8632::Or(Type Ty, GPRRegister dst, const Address &address) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- if (isByteSizedType(Ty)) |
- emitUint8(0x0A); |
- else |
- emitUint8(0x0B); |
- emitOperand(dst, address); |
+ arith_int<1>(Ty, dst, address); |
} |
void AssemblerX8632::Or(Type Ty, GPRRegister dst, const Immediate &imm) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (isByteSizedType(Ty)) { |
- emitComplexI8(1, Operand(dst), imm); |
- return; |
- } |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- emitComplex(Ty, 1, Operand(dst), imm); |
+ arith_int<1>(Ty, dst, imm); |
+} |
+ |
+void AssemblerX8632::Or(Type Ty, const Address &address, GPRRegister reg) { |
+ arith_int<1>(Ty, address, reg); |
+} |
+ |
+void AssemblerX8632::Or(Type Ty, const Address &address, const Immediate &imm) { |
+ arith_int<1>(Ty, address, imm); |
} |
void AssemblerX8632::Xor(Type Ty, GPRRegister dst, GPRRegister src) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- if (isByteSizedType(Ty)) |
- emitUint8(0x32); |
- else |
- emitUint8(0x33); |
- emitRegisterOperand(dst, src); |
+ arith_int<6>(Ty, dst, src); |
} |
void AssemblerX8632::Xor(Type Ty, GPRRegister dst, const Address &address) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- if (isByteSizedType(Ty)) |
- emitUint8(0x32); |
- else |
- emitUint8(0x33); |
- emitOperand(dst, address); |
+ arith_int<6>(Ty, dst, address); |
} |
void AssemblerX8632::Xor(Type Ty, GPRRegister dst, const Immediate &imm) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (isByteSizedType(Ty)) { |
- emitComplexI8(6, Operand(dst), imm); |
- return; |
- } |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- emitComplex(Ty, 6, Operand(dst), imm); |
+ arith_int<6>(Ty, dst, imm); |
+} |
+ |
+void AssemblerX8632::Xor(Type Ty, const Address &address, GPRRegister reg) { |
+ arith_int<6>(Ty, address, reg); |
+} |
+ |
+void AssemblerX8632::Xor(Type Ty, const Address &address, |
+ const Immediate &imm) { |
+ arith_int<6>(Ty, address, imm); |
} |
void AssemblerX8632::add(Type Ty, GPRRegister dst, GPRRegister src) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- if (isByteSizedArithType(Ty)) |
- emitUint8(0x02); |
- else |
- emitUint8(0x03); |
- emitRegisterOperand(dst, src); |
+ arith_int<0>(Ty, dst, src); |
} |
void AssemblerX8632::add(Type Ty, GPRRegister reg, const Address &address) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- if (isByteSizedArithType(Ty)) |
- emitUint8(0x02); |
- else |
- emitUint8(0x03); |
- emitOperand(reg, address); |
+ arith_int<0>(Ty, reg, address); |
} |
void AssemblerX8632::add(Type Ty, GPRRegister reg, const Immediate &imm) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (isByteSizedArithType(Ty)) { |
- emitComplexI8(0, Operand(reg), imm); |
- return; |
- } |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- emitComplex(Ty, 0, Operand(reg), imm); |
+ arith_int<0>(Ty, reg, imm); |
} |
void AssemblerX8632::add(Type Ty, const Address &address, GPRRegister reg) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- if (isByteSizedArithType(Ty)) |
- emitUint8(0x00); |
- else |
- emitUint8(0x01); |
- emitOperand(reg, address); |
+ arith_int<0>(Ty, address, reg); |
} |
void AssemblerX8632::add(Type Ty, const Address &address, |
const Immediate &imm) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (isByteSizedArithType(Ty)) { |
- emitComplexI8(0, address, imm); |
- return; |
- } |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- emitComplex(Ty, 0, address, imm); |
+ arith_int<0>(Ty, address, imm); |
} |
void AssemblerX8632::adc(Type Ty, GPRRegister dst, GPRRegister src) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- if (isByteSizedArithType(Ty)) |
- emitUint8(0x12); |
- else |
- emitUint8(0x13); |
- emitRegisterOperand(dst, src); |
+ arith_int<2>(Ty, dst, src); |
} |
void AssemblerX8632::adc(Type Ty, GPRRegister dst, const Address &address) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- if (isByteSizedArithType(Ty)) |
- emitUint8(0x12); |
- else |
- emitUint8(0x13); |
- emitOperand(dst, address); |
+ arith_int<2>(Ty, dst, address); |
} |
void AssemblerX8632::adc(Type Ty, GPRRegister reg, const Immediate &imm) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (isByteSizedArithType(Ty)) { |
- emitComplexI8(2, Operand(reg), imm); |
- return; |
- } |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- emitComplex(Ty, 2, Operand(reg), imm); |
+ arith_int<2>(Ty, reg, imm); |
+} |
+ |
+void AssemblerX8632::adc(Type Ty, const Address &address, GPRRegister reg) { |
+ arith_int<2>(Ty, address, reg); |
+} |
+ |
+void AssemblerX8632::adc(Type Ty, const Address &address, |
+ const Immediate &imm) { |
+ arith_int<2>(Ty, address, imm); |
} |
void AssemblerX8632::sub(Type Ty, GPRRegister dst, GPRRegister src) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- if (isByteSizedArithType(Ty)) |
- emitUint8(0x2A); |
- else |
- emitUint8(0x2B); |
- emitRegisterOperand(dst, src); |
+ arith_int<5>(Ty, dst, src); |
} |
void AssemblerX8632::sub(Type Ty, GPRRegister reg, const Address &address) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- if (isByteSizedArithType(Ty)) |
- emitUint8(0x2A); |
- else |
- emitUint8(0x2B); |
- emitOperand(reg, address); |
+ arith_int<5>(Ty, reg, address); |
} |
void AssemblerX8632::sub(Type Ty, GPRRegister reg, const Immediate &imm) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (isByteSizedArithType(Ty)) { |
- emitComplexI8(5, Operand(reg), imm); |
- return; |
- } |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- emitComplex(Ty, 5, Operand(reg), imm); |
+ arith_int<5>(Ty, reg, imm); |
+} |
+ |
+void AssemblerX8632::sub(Type Ty, const Address &address, GPRRegister reg) { |
+ arith_int<5>(Ty, address, reg); |
+} |
+ |
+void AssemblerX8632::sub(Type Ty, const Address &address, |
+ const Immediate &imm) { |
+ arith_int<5>(Ty, address, imm); |
} |
void AssemblerX8632::sbb(Type Ty, GPRRegister dst, GPRRegister src) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- if (isByteSizedArithType(Ty)) |
- emitUint8(0x1A); |
- else |
- emitUint8(0x1B); |
- emitRegisterOperand(dst, src); |
+ arith_int<3>(Ty, dst, src); |
} |
void AssemblerX8632::sbb(Type Ty, GPRRegister dst, const Address &address) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- if (isByteSizedArithType(Ty)) |
- emitUint8(0x1A); |
- else |
- emitUint8(0x1B); |
- emitOperand(dst, address); |
+ arith_int<3>(Ty, dst, address); |
} |
void AssemblerX8632::sbb(Type Ty, GPRRegister reg, const Immediate &imm) { |
- AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
- if (isByteSizedArithType(Ty)) { |
- emitComplexI8(3, Operand(reg), imm); |
- return; |
- } |
- if (Ty == IceType_i16) |
- emitOperandSizeOverride(); |
- emitComplex(Ty, 3, Operand(reg), imm); |
+ arith_int<3>(Ty, reg, imm); |
+} |
+ |
+void AssemblerX8632::sbb(Type Ty, const Address &address, GPRRegister reg) { |
+ arith_int<3>(Ty, address, reg); |
+} |
+ |
+void AssemblerX8632::sbb(Type Ty, const Address &address, |
+ const Immediate &imm) { |
+ arith_int<3>(Ty, address, imm); |
} |
void AssemblerX8632::cbw() { |