714 lines
37 KiB
C++
714 lines
37 KiB
C++
//===- subzero/unittest/AssemblerX8632/LowLevel.cpp -----------------------===//
|
|
//
|
|
// The Subzero Code Generator
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#include "AssemblerX8632/TestUtil.h"
|
|
|
|
namespace Ice {
|
|
namespace X8632 {
|
|
namespace Test {
|
|
namespace {
|
|
|
|
TEST_F(AssemblerX8632LowLevelTest, Ret) {
|
|
__ ret();
|
|
|
|
constexpr size_t ByteCount = 1;
|
|
ASSERT_EQ(ByteCount, codeBytesSize());
|
|
|
|
verifyBytes<ByteCount>(codeBytes(), 0xc3);
|
|
}
|
|
|
|
TEST_F(AssemblerX8632LowLevelTest, RetImm) {
|
|
__ ret(Immediate(0x20));
|
|
|
|
constexpr size_t ByteCount = 3;
|
|
ASSERT_EQ(ByteCount, codeBytesSize());
|
|
|
|
verifyBytes<ByteCount>(codeBytes(), 0xC2, 0x20, 0x00);
|
|
}
|
|
|
|
TEST_F(AssemblerX8632LowLevelTest, CallImm4) {
|
|
__ call(Immediate(4));
|
|
|
|
constexpr size_t ByteCount = 5;
|
|
ASSERT_EQ(ByteCount, codeBytesSize());
|
|
|
|
verifyBytes<ByteCount>(codeBytes(), 0xe8, 0x00, 0x00, 0x00, 0x00);
|
|
}
|
|
|
|
TEST_F(AssemblerX8632LowLevelTest, PopRegs) {
|
|
__ popl(GPRRegister::Encoded_Reg_eax);
|
|
__ popl(GPRRegister::Encoded_Reg_ebx);
|
|
__ popl(GPRRegister::Encoded_Reg_ecx);
|
|
__ popl(GPRRegister::Encoded_Reg_edx);
|
|
__ popl(GPRRegister::Encoded_Reg_edi);
|
|
__ popl(GPRRegister::Encoded_Reg_esi);
|
|
__ popl(GPRRegister::Encoded_Reg_ebp);
|
|
|
|
constexpr size_t ByteCount = 7;
|
|
ASSERT_EQ(ByteCount, codeBytesSize());
|
|
|
|
constexpr uint8_t PopOpcode = 0x58;
|
|
verifyBytes<ByteCount>(codeBytes(), PopOpcode | GPRRegister::Encoded_Reg_eax,
|
|
PopOpcode | GPRRegister::Encoded_Reg_ebx,
|
|
PopOpcode | GPRRegister::Encoded_Reg_ecx,
|
|
PopOpcode | GPRRegister::Encoded_Reg_edx,
|
|
PopOpcode | GPRRegister::Encoded_Reg_edi,
|
|
PopOpcode | GPRRegister::Encoded_Reg_esi,
|
|
PopOpcode | GPRRegister::Encoded_Reg_ebp);
|
|
}
|
|
|
|
TEST_F(AssemblerX8632LowLevelTest, PushRegs) {
|
|
__ pushl(GPRRegister::Encoded_Reg_eax);
|
|
__ pushl(GPRRegister::Encoded_Reg_ebx);
|
|
__ pushl(GPRRegister::Encoded_Reg_ecx);
|
|
__ pushl(GPRRegister::Encoded_Reg_edx);
|
|
__ pushl(GPRRegister::Encoded_Reg_edi);
|
|
__ pushl(GPRRegister::Encoded_Reg_esi);
|
|
__ pushl(GPRRegister::Encoded_Reg_ebp);
|
|
|
|
constexpr size_t ByteCount = 7;
|
|
ASSERT_EQ(ByteCount, codeBytesSize());
|
|
|
|
constexpr uint8_t PushOpcode = 0x50;
|
|
verifyBytes<ByteCount>(codeBytes(), PushOpcode | GPRRegister::Encoded_Reg_eax,
|
|
PushOpcode | GPRRegister::Encoded_Reg_ebx,
|
|
PushOpcode | GPRRegister::Encoded_Reg_ecx,
|
|
PushOpcode | GPRRegister::Encoded_Reg_edx,
|
|
PushOpcode | GPRRegister::Encoded_Reg_edi,
|
|
PushOpcode | GPRRegister::Encoded_Reg_esi,
|
|
PushOpcode | GPRRegister::Encoded_Reg_ebp);
|
|
}
|
|
|
|
TEST_F(AssemblerX8632LowLevelTest, MovRegisterZero) {
|
|
__ mov(IceType_i32, GPRRegister::Encoded_Reg_eax, Immediate(0x00));
|
|
__ mov(IceType_i32, GPRRegister::Encoded_Reg_ebx, Immediate(0x00));
|
|
__ mov(IceType_i32, GPRRegister::Encoded_Reg_ecx, Immediate(0x00));
|
|
__ mov(IceType_i32, GPRRegister::Encoded_Reg_edx, Immediate(0x00));
|
|
__ mov(IceType_i32, GPRRegister::Encoded_Reg_edi, Immediate(0x00));
|
|
__ mov(IceType_i32, GPRRegister::Encoded_Reg_esi, Immediate(0x00));
|
|
|
|
constexpr size_t MovReg32BitImmBytes = 5;
|
|
constexpr size_t ByteCount = 6 * MovReg32BitImmBytes;
|
|
ASSERT_EQ(ByteCount, codeBytesSize());
|
|
|
|
constexpr uint8_t MovOpcode = 0xb8;
|
|
verifyBytes<ByteCount>(
|
|
codeBytes(), MovOpcode | GPRRegister::Encoded_Reg_eax, 0x00, 0x00, 0x00,
|
|
0x00, MovOpcode | GPRRegister::Encoded_Reg_ebx, 0x00, 0x00, 0x00, 0x00,
|
|
MovOpcode | GPRRegister::Encoded_Reg_ecx, 0x00, 0x00, 0x00, 0x00,
|
|
MovOpcode | GPRRegister::Encoded_Reg_edx, 0x00, 0x00, 0x00, 0x00,
|
|
MovOpcode | GPRRegister::Encoded_Reg_edi, 0x00, 0x00, 0x00, 0x00,
|
|
MovOpcode | GPRRegister::Encoded_Reg_esi, 0x00, 0x00, 0x00, 0x00);
|
|
}
|
|
|
|
TEST_F(AssemblerX8632LowLevelTest, Cmp) {
|
|
#define TestRegReg(Inst, Dst, Src, OpType, ByteCountUntyped, ...) \
|
|
do { \
|
|
static constexpr char TestString[] = \
|
|
"(" #Inst ", " #Dst ", " #Src ", " #OpType ", " #ByteCountUntyped \
|
|
", " #__VA_ARGS__ ")"; \
|
|
static constexpr uint8_t ByteCount = ByteCountUntyped; \
|
|
__ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst, \
|
|
GPRRegister::Encoded_Reg_##Src); \
|
|
ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \
|
|
ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \
|
|
<< TestString; \
|
|
reset(); \
|
|
} while (0)
|
|
|
|
#define TestRegImm(Inst, Dst, Imm, OpType, ByteCountUntyped, ...) \
|
|
do { \
|
|
static constexpr char TestString[] = \
|
|
"(" #Inst ", " #Dst ", " #Imm ", " #OpType ", " #ByteCountUntyped \
|
|
", " #__VA_ARGS__ ")"; \
|
|
static constexpr uint8_t ByteCount = ByteCountUntyped; \
|
|
__ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst, Immediate(Imm)); \
|
|
ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \
|
|
ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \
|
|
<< TestString; \
|
|
reset(); \
|
|
} while (0)
|
|
|
|
#define TestRegAbsoluteAddr(Inst, Dst, Disp, OpType, ByteCountUntyped, ...) \
|
|
do { \
|
|
static constexpr char TestString[] = \
|
|
"(" #Inst ", " #Dst ", " #Disp ", " #OpType ", " #ByteCountUntyped \
|
|
", " #__VA_ARGS__ ")"; \
|
|
static constexpr uint8_t ByteCount = ByteCountUntyped; \
|
|
__ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst, \
|
|
Address(Disp, AssemblerFixup::NoFixup)); \
|
|
ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \
|
|
ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \
|
|
<< TestString; \
|
|
reset(); \
|
|
} while (0)
|
|
|
|
#define TestRegAddrBase(Inst, Dst, Base, Disp, OpType, ByteCountUntyped, ...) \
|
|
do { \
|
|
static constexpr char TestString[] = \
|
|
"(" #Inst ", " #Dst ", " #Base ", " #Disp ", " #OpType \
|
|
", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \
|
|
static constexpr uint8_t ByteCount = ByteCountUntyped; \
|
|
__ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst, \
|
|
Address(GPRRegister::Encoded_Reg_##Base, Disp, \
|
|
AssemblerFixup::NoFixup)); \
|
|
ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \
|
|
ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \
|
|
<< TestString; \
|
|
reset(); \
|
|
} while (0)
|
|
|
|
#define TestRegAddrScaledIndex(Inst, Dst, Index, Scale, Disp, OpType, \
|
|
ByteCountUntyped, ...) \
|
|
do { \
|
|
static constexpr char TestString[] = \
|
|
"(" #Inst ", " #Dst ", " #Index ", " #Scale ", " #Disp ", " #OpType \
|
|
", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \
|
|
static constexpr uint8_t ByteCount = ByteCountUntyped; \
|
|
__ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst, \
|
|
Address(GPRRegister::Encoded_Reg_##Index, Traits::TIMES_##Scale, \
|
|
Disp, AssemblerFixup::NoFixup)); \
|
|
ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \
|
|
ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \
|
|
<< TestString; \
|
|
reset(); \
|
|
} while (0)
|
|
|
|
#define TestRegAddrBaseScaledIndex(Inst, Dst, Base, Index, Scale, Disp, \
|
|
OpType, ByteCountUntyped, ...) \
|
|
do { \
|
|
static constexpr char TestString[] = \
|
|
"(" #Inst ", " #Dst ", " #Base ", " #Index ", " #Scale ", " #Disp \
|
|
", " #OpType ", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \
|
|
static constexpr uint8_t ByteCount = ByteCountUntyped; \
|
|
__ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst, \
|
|
Address(GPRRegister::Encoded_Reg_##Base, \
|
|
GPRRegister::Encoded_Reg_##Index, Traits::TIMES_##Scale, \
|
|
Disp, AssemblerFixup::NoFixup)); \
|
|
ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \
|
|
ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \
|
|
<< TestString; \
|
|
reset(); \
|
|
} while (0)
|
|
|
|
#define TestAddrBaseScaledIndexImm(Inst, Base, Index, Scale, Disp, Imm, \
|
|
OpType, ByteCountUntyped, ...) \
|
|
do { \
|
|
static constexpr char TestString[] = \
|
|
"(" #Inst ", " #Base ", " #Index ", " #Scale ", " #Disp ", " #Imm \
|
|
", " #OpType ", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \
|
|
static constexpr uint8_t ByteCount = ByteCountUntyped; \
|
|
__ Inst(IceType_##OpType, \
|
|
Address(GPRRegister::Encoded_Reg_##Base, \
|
|
GPRRegister::Encoded_Reg_##Index, Traits::TIMES_##Scale, \
|
|
Disp, AssemblerFixup::NoFixup), \
|
|
Immediate(Imm)); \
|
|
ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \
|
|
ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \
|
|
<< TestString; \
|
|
reset(); \
|
|
} while (0)
|
|
|
|
#define TestAddrBaseScaledIndexReg(Inst, Base, Index, Scale, Disp, Src, \
|
|
OpType, ByteCountUntyped, ...) \
|
|
do { \
|
|
static constexpr char TestString[] = \
|
|
"(" #Inst ", " #Base ", " #Index ", " #Scale ", " #Disp ", " #Src \
|
|
", " #OpType ", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \
|
|
static constexpr uint8_t ByteCount = ByteCountUntyped; \
|
|
__ Inst(IceType_##OpType, \
|
|
Address(GPRRegister::Encoded_Reg_##Base, \
|
|
GPRRegister::Encoded_Reg_##Index, Traits::TIMES_##Scale, \
|
|
Disp, AssemblerFixup::NoFixup), \
|
|
GPRRegister::Encoded_Reg_##Src); \
|
|
ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \
|
|
ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \
|
|
<< TestString; \
|
|
reset(); \
|
|
} while (0)
|
|
|
|
/* cmp GPR, GPR */
|
|
TestRegReg(cmp, eax, ecx, i32, 2, 0x3B, 0xC1);
|
|
TestRegReg(cmp, ecx, edx, i32, 2, 0x3B, 0xCA);
|
|
TestRegReg(cmp, edx, ebx, i32, 2, 0x3B, 0xD3);
|
|
TestRegReg(cmp, ebx, esp, i32, 2, 0x3B, 0xDC);
|
|
TestRegReg(cmp, esp, ebp, i32, 2, 0x3B, 0xE5);
|
|
TestRegReg(cmp, ebp, esi, i32, 2, 0x3B, 0xEE);
|
|
TestRegReg(cmp, esi, edi, i32, 2, 0x3B, 0xF7);
|
|
TestRegReg(cmp, edi, eax, i32, 2, 0x3B, 0xF8);
|
|
|
|
TestRegReg(cmp, eax, ecx, i16, 3, 0x66, 0x3B, 0xC1);
|
|
TestRegReg(cmp, ecx, edx, i16, 3, 0x66, 0x3B, 0xCA);
|
|
TestRegReg(cmp, edx, ebx, i16, 3, 0x66, 0x3B, 0xD3);
|
|
TestRegReg(cmp, ebx, esp, i16, 3, 0x66, 0x3B, 0xDC);
|
|
TestRegReg(cmp, esp, ebp, i16, 3, 0x66, 0x3B, 0xE5);
|
|
TestRegReg(cmp, ebp, esi, i16, 3, 0x66, 0x3B, 0xEE);
|
|
TestRegReg(cmp, esi, edi, i16, 3, 0x66, 0x3B, 0xF7);
|
|
TestRegReg(cmp, edi, eax, i16, 3, 0x66, 0x3B, 0xF8);
|
|
|
|
TestRegReg(cmp, eax, ecx, i8, 2, 0x3A, 0xC1);
|
|
TestRegReg(cmp, ecx, edx, i8, 2, 0x3A, 0xCA);
|
|
TestRegReg(cmp, edx, ebx, i8, 2, 0x3A, 0xD3);
|
|
TestRegReg(cmp, ebx, esp, i8, 2, 0x3A, 0xDC);
|
|
TestRegReg(cmp, esp, ebp, i8, 2, 0x3A, 0xE5);
|
|
TestRegReg(cmp, ebp, esi, i8, 2, 0x3A, 0xEE);
|
|
TestRegReg(cmp, esi, edi, i8, 2, 0x3A, 0xF7);
|
|
TestRegReg(cmp, edi, eax, i8, 2, 0x3A, 0xF8);
|
|
|
|
/* cmp GPR, Imm8 */
|
|
TestRegImm(cmp, eax, 5, i32, 3, 0x83, 0xF8, 0x05);
|
|
TestRegImm(cmp, ecx, 5, i32, 3, 0x83, 0xF9, 0x05);
|
|
TestRegImm(cmp, edx, 5, i32, 3, 0x83, 0xFA, 0x05);
|
|
TestRegImm(cmp, ebx, 5, i32, 3, 0x83, 0xFB, 0x05);
|
|
TestRegImm(cmp, esp, 5, i32, 3, 0x83, 0xFC, 0x05);
|
|
TestRegImm(cmp, ebp, 5, i32, 3, 0x83, 0xFD, 0x05);
|
|
TestRegImm(cmp, esi, 5, i32, 3, 0x83, 0xFE, 0x05);
|
|
TestRegImm(cmp, edi, 5, i32, 3, 0x83, 0xFF, 0x05);
|
|
|
|
TestRegImm(cmp, eax, 5, i16, 4, 0x66, 0x83, 0xF8, 0x05);
|
|
TestRegImm(cmp, ecx, 5, i16, 4, 0x66, 0x83, 0xF9, 0x05);
|
|
TestRegImm(cmp, edx, 5, i16, 4, 0x66, 0x83, 0xFA, 0x05);
|
|
TestRegImm(cmp, ebx, 5, i16, 4, 0x66, 0x83, 0xFB, 0x05);
|
|
TestRegImm(cmp, esp, 5, i16, 4, 0x66, 0x83, 0xFC, 0x05);
|
|
TestRegImm(cmp, ebp, 5, i16, 4, 0x66, 0x83, 0xFD, 0x05);
|
|
TestRegImm(cmp, esi, 5, i16, 4, 0x66, 0x83, 0xFE, 0x05);
|
|
TestRegImm(cmp, edi, 5, i16, 4, 0x66, 0x83, 0xFF, 0x05);
|
|
|
|
TestRegImm(cmp, eax, 5, i8, 2, 0x3C, 0x05);
|
|
TestRegImm(cmp, ecx, 5, i8, 3, 0x80, 0xF9, 0x05);
|
|
TestRegImm(cmp, edx, 5, i8, 3, 0x80, 0xFA, 0x05);
|
|
TestRegImm(cmp, ebx, 5, i8, 3, 0x80, 0xFB, 0x05);
|
|
TestRegImm(cmp, esp, 5, i8, 3, 0x80, 0xFC, 0x05);
|
|
TestRegImm(cmp, ebp, 5, i8, 3, 0x80, 0xFD, 0x05);
|
|
TestRegImm(cmp, esi, 5, i8, 3, 0x80, 0xFE, 0x05);
|
|
TestRegImm(cmp, edi, 5, i8, 3, 0x80, 0xFF, 0x05);
|
|
|
|
/* cmp GPR, Imm16 */
|
|
TestRegImm(cmp, eax, 0x100, i32, 5, 0x3D, 0x00, 0x01, 0x00, 0x00);
|
|
TestRegImm(cmp, ecx, 0x100, i32, 6, 0x81, 0xF9, 0x00, 0x01, 0x00, 0x00);
|
|
TestRegImm(cmp, edx, 0x100, i32, 6, 0x81, 0xFA, 0x00, 0x01, 0x00, 0x00);
|
|
TestRegImm(cmp, ebx, 0x100, i32, 6, 0x81, 0xFB, 0x00, 0x01, 0x00, 0x00);
|
|
TestRegImm(cmp, esp, 0x100, i32, 6, 0x81, 0xFC, 0x00, 0x01, 0x00, 0x00);
|
|
TestRegImm(cmp, ebp, 0x100, i32, 6, 0x81, 0xFD, 0x00, 0x01, 0x00, 0x00);
|
|
TestRegImm(cmp, esi, 0x100, i32, 6, 0x81, 0xFE, 0x00, 0x01, 0x00, 0x00);
|
|
TestRegImm(cmp, edi, 0x100, i32, 6, 0x81, 0xFF, 0x00, 0x01, 0x00, 0x00);
|
|
|
|
TestRegImm(cmp, eax, 0x100, i16, 4, 0x66, 0x3D, 0x00, 0x01);
|
|
TestRegImm(cmp, ecx, 0x100, i16, 5, 0x66, 0x81, 0xF9, 0x00, 0x01);
|
|
TestRegImm(cmp, edx, 0x100, i16, 5, 0x66, 0x81, 0xFA, 0x00, 0x01);
|
|
TestRegImm(cmp, ebx, 0x100, i16, 5, 0x66, 0x81, 0xFB, 0x00, 0x01);
|
|
TestRegImm(cmp, esp, 0x100, i16, 5, 0x66, 0x81, 0xFC, 0x00, 0x01);
|
|
TestRegImm(cmp, ebp, 0x100, i16, 5, 0x66, 0x81, 0xFD, 0x00, 0x01);
|
|
TestRegImm(cmp, esi, 0x100, i16, 5, 0x66, 0x81, 0xFE, 0x00, 0x01);
|
|
TestRegImm(cmp, edi, 0x100, i16, 5, 0x66, 0x81, 0xFF, 0x00, 0x01);
|
|
|
|
/* cmp GPR, Absolute */
|
|
TestRegAbsoluteAddr(cmp, eax, 0xF00FBEEF, i32, 6, 0x3B, 0x05, 0xEF, 0xBE,
|
|
0x0F, 0xF0);
|
|
TestRegAbsoluteAddr(cmp, eax, 0xF00FBEEF, i16, 7, 0x66, 0x3B, 0x05, 0xEF,
|
|
0xBE, 0x0F, 0xF0);
|
|
TestRegAbsoluteAddr(cmp, eax, 0xF00FBEEF, i8, 6, 0x3A, 0x05, 0xEF, 0xBE, 0x0F,
|
|
0xF0);
|
|
|
|
/* cmp GPR, 0(Base) */
|
|
TestRegAddrBase(cmp, eax, ecx, 0, i32, 2, 0x3B, 0x01);
|
|
TestRegAddrBase(cmp, ecx, edx, 0, i32, 2, 0x3B, 0x0A);
|
|
TestRegAddrBase(cmp, edx, ebx, 0, i32, 2, 0x3B, 0x13);
|
|
TestRegAddrBase(cmp, ebx, esp, 0, i32, 3, 0x3B, 0x1C, 0x24);
|
|
TestRegAddrBase(cmp, esp, ebp, 0, i32, 3, 0x3B, 0x65, 0x00);
|
|
TestRegAddrBase(cmp, ebp, esi, 0, i32, 2, 0x3B, 0x2E);
|
|
TestRegAddrBase(cmp, esi, edi, 0, i32, 2, 0x3B, 0x37);
|
|
TestRegAddrBase(cmp, edi, eax, 0, i32, 2, 0x3B, 0x38);
|
|
|
|
TestRegAddrBase(cmp, eax, ecx, 0, i16, 3, 0x66, 0x3B, 0x01);
|
|
TestRegAddrBase(cmp, ecx, edx, 0, i16, 3, 0x66, 0x3B, 0x0A);
|
|
TestRegAddrBase(cmp, edx, ebx, 0, i16, 3, 0x66, 0x3B, 0x13);
|
|
TestRegAddrBase(cmp, ebx, esp, 0, i16, 4, 0x66, 0x3B, 0x1C, 0x24);
|
|
TestRegAddrBase(cmp, esp, ebp, 0, i16, 4, 0x66, 0x3B, 0x65, 0x00);
|
|
TestRegAddrBase(cmp, ebp, esi, 0, i16, 3, 0x66, 0x3B, 0x2E);
|
|
TestRegAddrBase(cmp, esi, edi, 0, i16, 3, 0x66, 0x3B, 0x37);
|
|
TestRegAddrBase(cmp, edi, eax, 0, i16, 3, 0x66, 0x3B, 0x38);
|
|
|
|
TestRegAddrBase(cmp, eax, ecx, 0, i8, 2, 0x3A, 0x01);
|
|
TestRegAddrBase(cmp, ecx, edx, 0, i8, 2, 0x3A, 0x0A);
|
|
TestRegAddrBase(cmp, edx, ebx, 0, i8, 2, 0x3A, 0x13);
|
|
TestRegAddrBase(cmp, ebx, esp, 0, i8, 3, 0x3A, 0x1C, 0x24);
|
|
TestRegAddrBase(cmp, esp, ebp, 0, i8, 3, 0x3A, 0x65, 0x00);
|
|
TestRegAddrBase(cmp, ebp, esi, 0, i8, 2, 0x3A, 0x2E);
|
|
TestRegAddrBase(cmp, esi, edi, 0, i8, 2, 0x3A, 0x37);
|
|
TestRegAddrBase(cmp, edi, eax, 0, i8, 2, 0x3A, 0x38);
|
|
|
|
/* cmp GPR, Imm8(Base) */
|
|
TestRegAddrBase(cmp, eax, ecx, 0x40, i32, 3, 0x3B, 0x41, 0x40);
|
|
TestRegAddrBase(cmp, ecx, edx, 0x40, i32, 3, 0x3B, 0x4A, 0x40);
|
|
TestRegAddrBase(cmp, edx, ebx, 0x40, i32, 3, 0x3B, 0x53, 0x40);
|
|
TestRegAddrBase(cmp, ebx, esp, 0x40, i32, 4, 0x3B, 0x5C, 0x24, 0x40);
|
|
TestRegAddrBase(cmp, esp, ebp, 0x40, i32, 3, 0x3B, 0x65, 0x40);
|
|
TestRegAddrBase(cmp, ebp, esi, 0x40, i32, 3, 0x3B, 0x6E, 0x40);
|
|
TestRegAddrBase(cmp, esi, edi, 0x40, i32, 3, 0x3B, 0x77, 0x40);
|
|
TestRegAddrBase(cmp, edi, eax, 0x40, i32, 3, 0x3B, 0x78, 0x40);
|
|
|
|
TestRegAddrBase(cmp, eax, ecx, 0x40, i16, 4, 0x66, 0x3B, 0x41, 0x40);
|
|
TestRegAddrBase(cmp, ecx, edx, 0x40, i16, 4, 0x66, 0x3B, 0x4A, 0x40);
|
|
TestRegAddrBase(cmp, edx, ebx, 0x40, i16, 4, 0x66, 0x3B, 0x53, 0x40);
|
|
TestRegAddrBase(cmp, ebx, esp, 0x40, i16, 5, 0x66, 0x3B, 0x5C, 0x24, 0x40);
|
|
TestRegAddrBase(cmp, esp, ebp, 0x40, i16, 4, 0x66, 0x3B, 0x65, 0x40);
|
|
TestRegAddrBase(cmp, ebp, esi, 0x40, i16, 4, 0x66, 0x3B, 0x6E, 0x40);
|
|
TestRegAddrBase(cmp, esi, edi, 0x40, i16, 4, 0x66, 0x3B, 0x77, 0x40);
|
|
TestRegAddrBase(cmp, edi, eax, 0x40, i16, 4, 0x66, 0x3B, 0x78, 0x40);
|
|
|
|
TestRegAddrBase(cmp, eax, ecx, 0x40, i8, 3, 0x3A, 0x41, 0x40);
|
|
TestRegAddrBase(cmp, ecx, edx, 0x40, i8, 3, 0x3A, 0x4A, 0x40);
|
|
TestRegAddrBase(cmp, edx, ebx, 0x40, i8, 3, 0x3A, 0x53, 0x40);
|
|
TestRegAddrBase(cmp, ebx, esp, 0x40, i8, 4, 0x3A, 0x5C, 0x24, 0x40);
|
|
TestRegAddrBase(cmp, esp, ebp, 0x40, i8, 3, 0x3A, 0x65, 0x40);
|
|
TestRegAddrBase(cmp, ebp, esi, 0x40, i8, 3, 0x3A, 0x6E, 0x40);
|
|
TestRegAddrBase(cmp, esi, edi, 0x40, i8, 3, 0x3A, 0x77, 0x40);
|
|
TestRegAddrBase(cmp, edi, eax, 0x40, i8, 3, 0x3A, 0x78, 0x40);
|
|
|
|
/* cmp GPR, Imm32(Base) */
|
|
TestRegAddrBase(cmp, eax, ecx, 0xF0, i32, 6, 0x3B, 0x81, 0xF0, 0x00, 0x00,
|
|
0x00);
|
|
TestRegAddrBase(cmp, ecx, edx, 0xF0, i32, 6, 0x3B, 0x8A, 0xF0, 0x00, 0x00,
|
|
0x00);
|
|
TestRegAddrBase(cmp, edx, ebx, 0xF0, i32, 6, 0x3B, 0x93, 0xF0, 0x00, 0x00,
|
|
0x00);
|
|
TestRegAddrBase(cmp, ebx, esp, 0xF0, i32, 7, 0x3B, 0x9C, 0x24, 0xF0, 0x00,
|
|
0x00, 0x00);
|
|
TestRegAddrBase(cmp, esp, ebp, 0xF0, i32, 6, 0x3B, 0xA5, 0xF0, 0x00, 0x00,
|
|
0x00);
|
|
TestRegAddrBase(cmp, ebp, esi, 0xF0, i32, 6, 0x3B, 0xAE, 0xF0, 0x00, 0x00,
|
|
0x00);
|
|
TestRegAddrBase(cmp, esi, edi, 0xF0, i32, 6, 0x3B, 0xB7, 0xF0, 0x00, 0x00,
|
|
0x00);
|
|
TestRegAddrBase(cmp, edi, eax, 0xF0, i32, 6, 0x3B, 0xB8, 0xF0, 0x00, 0x00,
|
|
0x00);
|
|
|
|
TestRegAddrBase(cmp, eax, ecx, 0xF0, i16, 7, 0x66, 0x3B, 0x81, 0xF0, 0x00,
|
|
0x00, 0x00);
|
|
TestRegAddrBase(cmp, ecx, edx, 0xF0, i16, 7, 0x66, 0x3B, 0x8A, 0xF0, 0x00,
|
|
0x00, 0x00);
|
|
TestRegAddrBase(cmp, edx, ebx, 0xF0, i16, 7, 0x66, 0x3B, 0x93, 0xF0, 0x00,
|
|
0x00, 0x00);
|
|
TestRegAddrBase(cmp, ebx, esp, 0xF0, i16, 8, 0x66, 0x3B, 0x9C, 0x24, 0xF0,
|
|
0x00, 0x00, 0x00);
|
|
TestRegAddrBase(cmp, esp, ebp, 0xF0, i16, 7, 0x66, 0x3B, 0xa5, 0xF0, 0x00,
|
|
0x00, 0x00);
|
|
TestRegAddrBase(cmp, ebp, esi, 0xF0, i16, 7, 0x66, 0x3B, 0xaE, 0xF0, 0x00,
|
|
0x00, 0x00);
|
|
TestRegAddrBase(cmp, esi, edi, 0xF0, i16, 7, 0x66, 0x3B, 0xb7, 0xF0, 0x00,
|
|
0x00, 0x00);
|
|
TestRegAddrBase(cmp, edi, eax, 0xF0, i16, 7, 0x66, 0x3B, 0xb8, 0xF0, 0x00,
|
|
0x00, 0x00);
|
|
|
|
TestRegAddrBase(cmp, eax, ecx, 0xF0, i8, 6, 0x3A, 0x81, 0xF0, 0x00, 0x00,
|
|
0x00);
|
|
TestRegAddrBase(cmp, ecx, edx, 0xF0, i8, 6, 0x3A, 0x8A, 0xF0, 0x00, 0x00,
|
|
0x00);
|
|
TestRegAddrBase(cmp, edx, ebx, 0xF0, i8, 6, 0x3A, 0x93, 0xF0, 0x00, 0x00,
|
|
0x00);
|
|
TestRegAddrBase(cmp, ebx, esp, 0xF0, i8, 7, 0x3A, 0x9C, 0x24, 0xF0, 0x00,
|
|
0x00, 0x00);
|
|
TestRegAddrBase(cmp, esp, ebp, 0xF0, i8, 6, 0x3A, 0xA5, 0xF0, 0x00, 0x00,
|
|
0x00);
|
|
TestRegAddrBase(cmp, ebp, esi, 0xF0, i8, 6, 0x3A, 0xAE, 0xF0, 0x00, 0x00,
|
|
0x00);
|
|
TestRegAddrBase(cmp, esi, edi, 0xF0, i8, 6, 0x3A, 0xB7, 0xF0, 0x00, 0x00,
|
|
0x00);
|
|
TestRegAddrBase(cmp, edi, eax, 0xF0, i8, 6, 0x3A, 0xB8, 0xF0, 0x00, 0x00,
|
|
0x00);
|
|
|
|
/* cmp GPR, Imm(,Index,Scale) */
|
|
TestRegAddrScaledIndex(cmp, eax, ecx, 1, 0, i32, 7, 0x3B, 0x04, 0x0D, 0x00,
|
|
0x00, 0x00, 0x00);
|
|
TestRegAddrScaledIndex(cmp, ecx, edx, 2, 0, i32, 7, 0x3B, 0x0C, 0x55, 0x00,
|
|
0x00, 0x00, 0x00);
|
|
TestRegAddrScaledIndex(cmp, edx, ebx, 4, 0, i32, 7, 0x3B, 0x14, 0x9D, 0x00,
|
|
0x00, 0x00, 0x00);
|
|
// esp cannot be an scaled index.
|
|
TestRegAddrScaledIndex(cmp, esp, ebp, 8, 0, i32, 7, 0x3B, 0x24, 0xED, 0x00,
|
|
0x00, 0x00, 0x00);
|
|
TestRegAddrScaledIndex(cmp, ebp, esi, 1, 0, i32, 7, 0x3B, 0x2C, 0x35, 0x00,
|
|
0x00, 0x00, 0x00);
|
|
TestRegAddrScaledIndex(cmp, esi, edi, 2, 0, i32, 7, 0x3B, 0x34, 0x7D, 0x00,
|
|
0x00, 0x00, 0x00);
|
|
TestRegAddrScaledIndex(cmp, edi, eax, 4, 0, i32, 7, 0x3B, 0x3C, 0x85, 0x00,
|
|
0x00, 0x00, 0x00);
|
|
TestRegAddrScaledIndex(cmp, ebx, ecx, 8, 0, i32, 7, 0x3B, 0x1C, 0xCD, 0x00,
|
|
0x00, 0x00, 0x00);
|
|
|
|
TestRegAddrScaledIndex(cmp, eax, ecx, 8, 0, i16, 8, 0x66, 0x3B, 0x04, 0xCD,
|
|
0x00, 0x00, 0x00, 0x00);
|
|
TestRegAddrScaledIndex(cmp, ecx, edx, 1, 0, i16, 8, 0x66, 0x3B, 0x0C, 0x15,
|
|
0x00, 0x00, 0x00, 0x00);
|
|
TestRegAddrScaledIndex(cmp, edx, ebx, 2, 0, i16, 8, 0x66, 0x3B, 0x14, 0x5D,
|
|
0x00, 0x00, 0x00, 0x00);
|
|
// esp cannot be an scaled index.
|
|
TestRegAddrScaledIndex(cmp, esp, ebp, 4, 0, i16, 8, 0x66, 0x3B, 0x24, 0xAD,
|
|
0x00, 0x00, 0x00, 0x00);
|
|
TestRegAddrScaledIndex(cmp, ebp, esi, 8, 0, i16, 8, 0x66, 0x3B, 0x2C, 0xF5,
|
|
0x00, 0x00, 0x00, 0x00);
|
|
TestRegAddrScaledIndex(cmp, esi, edi, 1, 0, i16, 8, 0x66, 0x3B, 0x34, 0x3D,
|
|
0x00, 0x00, 0x00, 0x00);
|
|
TestRegAddrScaledIndex(cmp, edi, eax, 2, 0, i16, 8, 0x66, 0x3B, 0x3C, 0x45,
|
|
0x00, 0x00, 0x00, 0x00);
|
|
TestRegAddrScaledIndex(cmp, ebx, ecx, 8, 0, i16, 8, 0x66, 0x3B, 0x1C, 0xCD,
|
|
0x00, 0x00, 0x00, 0x00);
|
|
|
|
TestRegAddrScaledIndex(cmp, eax, ecx, 4, 0, i8, 7, 0x3A, 0x04, 0x8D, 0x00,
|
|
0x00, 0x00, 0x00);
|
|
TestRegAddrScaledIndex(cmp, ecx, edx, 8, 0, i8, 7, 0x3A, 0x0C, 0xD5, 0x00,
|
|
0x00, 0x00, 0x00);
|
|
TestRegAddrScaledIndex(cmp, edx, ebx, 1, 0, i8, 7, 0x3A, 0x14, 0x1D, 0x00,
|
|
0x00, 0x00, 0x00);
|
|
// esp cannot be an scaled index.
|
|
TestRegAddrScaledIndex(cmp, esp, ebp, 2, 0, i8, 7, 0x3A, 0x24, 0x6D, 0x00,
|
|
0x00, 0x00, 0x00);
|
|
TestRegAddrScaledIndex(cmp, ebp, esi, 4, 0, i8, 7, 0x3A, 0x2C, 0xB5, 0x00,
|
|
0x00, 0x00, 0x00);
|
|
TestRegAddrScaledIndex(cmp, esi, edi, 8, 0, i8, 7, 0x3A, 0x34, 0xFD, 0x00,
|
|
0x00, 0x00, 0x00);
|
|
TestRegAddrScaledIndex(cmp, edi, eax, 1, 0, i8, 7, 0x3A, 0x3C, 0x05, 0x00,
|
|
0x00, 0x00, 0x00);
|
|
TestRegAddrScaledIndex(cmp, ebx, ecx, 8, 0, i8, 7, 0x3a, 0x1C, 0xCD, 0x00,
|
|
0x00, 0x00, 0x00);
|
|
|
|
/* cmp GPR, 0(Base,Index,Scale) */
|
|
TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0, i32, 3, 0x3B, 0x04,
|
|
0x11);
|
|
TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0, i32, 3, 0x3B, 0x0C,
|
|
0x5A);
|
|
// esp cannot be an scaled index.
|
|
TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0, i32, 3, 0x3B, 0x1C,
|
|
0xAC);
|
|
TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0, i32, 4, 0x3B, 0x64, 0xF5,
|
|
0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0, i32, 3, 0x3B, 0x2C,
|
|
0x3E);
|
|
TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0, i32, 3, 0x3B, 0x34,
|
|
0x47);
|
|
TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0, i32, 3, 0x3B, 0x3C,
|
|
0x98);
|
|
TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0, i32, 3, 0x3B, 0x1C,
|
|
0xD1);
|
|
|
|
TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0, i16, 4, 0x66, 0x3B, 0x04,
|
|
0x11);
|
|
TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0, i16, 4, 0x66, 0x3B, 0x0C,
|
|
0x5A);
|
|
// esp cannot be an scaled index.
|
|
TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0, i16, 4, 0x66, 0x3B, 0x1C,
|
|
0xAC);
|
|
TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0, i16, 5, 0x66, 0x3B, 0x64,
|
|
0xF5, 0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0, i16, 4, 0x66, 0x3B, 0x2C,
|
|
0x3E);
|
|
TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0, i16, 4, 0x66, 0x3B, 0x34,
|
|
0x47);
|
|
TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0, i16, 4, 0x66, 0x3B, 0x3C,
|
|
0x98);
|
|
TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0, i16, 4, 0x66, 0x3B, 0x1C,
|
|
0xD1);
|
|
|
|
TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0, i8, 3, 0x3A, 0x04, 0x11);
|
|
TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0, i8, 3, 0x3A, 0x0C, 0x5A);
|
|
// esp cannot be an scaled index.
|
|
TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0, i8, 3, 0x3A, 0x1C, 0xAC);
|
|
TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0, i8, 4, 0x3A, 0x64, 0xF5,
|
|
0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0, i8, 3, 0x3A, 0x2C, 0x3E);
|
|
TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0, i8, 3, 0x3A, 0x34, 0x47);
|
|
TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0, i8, 3, 0x3A, 0x3C, 0x98);
|
|
TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0, i8, 3, 0x3A, 0x1C, 0xD1);
|
|
|
|
/* cmp GPR, Imm8(Base,Index,Scale) */
|
|
TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0x40, i32, 4, 0x3B, 0x44,
|
|
0x11, 0x40);
|
|
TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0x40, i32, 4, 0x3B, 0x4C,
|
|
0x5A, 0x40);
|
|
// esp cannot be an scaled index.
|
|
TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0x40, i32, 4, 0x3B, 0x5C,
|
|
0xAC, 0x40);
|
|
TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0x40, i32, 4, 0x3B, 0x64,
|
|
0xF5, 0x40);
|
|
TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0x40, i32, 4, 0x3B, 0x6C,
|
|
0x3E, 0x40);
|
|
TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0x40, i32, 4, 0x3B, 0x74,
|
|
0x47, 0x40);
|
|
TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0x40, i32, 4, 0x3B, 0x7C,
|
|
0x98, 0x40);
|
|
TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0x40, i32, 4, 0x3B, 0x5C,
|
|
0xD1, 0x40);
|
|
|
|
TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0x40, i16, 5, 0x66, 0x3B,
|
|
0x44, 0x11, 0x40);
|
|
TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0x40, i16, 5, 0x66, 0x3B,
|
|
0x4C, 0x5A, 0x40);
|
|
// esp cannot be an scaled index.
|
|
TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0x40, i16, 5, 0x66, 0x3B,
|
|
0x5C, 0xAC, 0x40);
|
|
TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0x40, i16, 5, 0x66, 0x3B,
|
|
0x64, 0xF5, 0x40);
|
|
TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0x40, i16, 5, 0x66, 0x3B,
|
|
0x6C, 0x3E, 0x40);
|
|
TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0x40, i16, 5, 0x66, 0x3B,
|
|
0x74, 0x47, 0x40);
|
|
TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0x40, i16, 5, 0x66, 0x3B,
|
|
0x7C, 0x98, 0x40);
|
|
TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0x40, i16, 5, 0x66, 0x3B,
|
|
0x5C, 0xD1, 0x40);
|
|
|
|
TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0x40, i8, 4, 0x3A, 0x44,
|
|
0x11, 0x40);
|
|
TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0x40, i8, 4, 0x3A, 0x4C,
|
|
0x5A, 0x40);
|
|
// esp cannot be an scaled index.
|
|
TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0x40, i8, 4, 0x3A, 0x5C,
|
|
0xAC, 0x40);
|
|
TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0x40, i8, 4, 0x3A, 0x64,
|
|
0xF5, 0x40);
|
|
TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0x40, i8, 4, 0x3A, 0x6C,
|
|
0x3E, 0x40);
|
|
TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0x40, i8, 4, 0x3A, 0x74,
|
|
0x47, 0x40);
|
|
TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0x40, i8, 4, 0x3A, 0x7C,
|
|
0x98, 0x40);
|
|
TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0x40, i8, 4, 0x3A, 0x5C,
|
|
0xD1, 0x40);
|
|
|
|
/* cmp GPR, Imm32(Base,Index,Scale) */
|
|
TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0xF0, i32, 7, 0x3B, 0x84,
|
|
0x11, 0xF0, 0x00, 0x00, 0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0xF0, i32, 7, 0x3B, 0x8C,
|
|
0x5A, 0xF0, 0x00, 0x00, 0x00);
|
|
// esp cannot be an scaled index.
|
|
TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0xF0, i32, 7, 0x3B, 0x9C,
|
|
0xAC, 0xF0, 0x00, 0x00, 0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0xF0, i32, 7, 0x3B, 0xA4,
|
|
0xF5, 0xF0, 0x00, 0x00, 0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0xF0, i32, 7, 0x3B, 0xAC,
|
|
0x3E, 0xF0, 0x00, 0x00, 0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0xF0, i32, 7, 0x3B, 0xB4,
|
|
0x47, 0xF0, 0x00, 0x00, 0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0xF0, i32, 7, 0x3B, 0xBC,
|
|
0x98, 0xF0, 0x00, 0x00, 0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0xF0, i32, 7, 0x3B, 0x9C,
|
|
0xD1, 0xF0, 0x00, 0x00, 0x00);
|
|
|
|
TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0xF0, i16, 8, 0x66, 0x3B,
|
|
0x84, 0x11, 0xF0, 0x00, 0x00, 0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0xF0, i16, 8, 0x66, 0x3B,
|
|
0x8C, 0x5A, 0xF0, 0x00, 0x00, 0x00);
|
|
// esp cannot be an scaled index.
|
|
TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0xF0, i16, 8, 0x66, 0x3B,
|
|
0x9C, 0xAC, 0xF0, 0x00, 0x00, 0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0xF0, i16, 8, 0x66, 0x3B,
|
|
0xA4, 0xF5, 0xF0, 0x00, 0x00, 0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0xF0, i16, 8, 0x66, 0x3B,
|
|
0xAC, 0x3E, 0xF0, 0x00, 0x00, 0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0xF0, i16, 8, 0x66, 0x3B,
|
|
0xB4, 0x47, 0xF0, 0x00, 0x00, 0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0xF0, i16, 8, 0x66, 0x3B,
|
|
0xBC, 0x98, 0xF0, 0x00, 0x00, 0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0xF0, i16, 8, 0x66, 0x3B,
|
|
0x9C, 0xD1, 0xF0, 0x00, 0x00, 0x00);
|
|
|
|
TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0xF0, i8, 7, 0x3A, 0x84,
|
|
0x11, 0xF0, 0x00, 0x00, 0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0xF0, i8, 7, 0x3A, 0x8C,
|
|
0x5A, 0xF0, 0x00, 0x00, 0x00);
|
|
// esp cannot be an scaled index.
|
|
TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0xF0, i8, 7, 0x3A, 0x9C,
|
|
0xAC, 0xF0, 0x00, 0x00, 0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0xF0, i8, 7, 0x3A, 0xA4,
|
|
0xF5, 0xF0, 0x00, 0x00, 0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0xF0, i8, 7, 0x3A, 0xAC,
|
|
0x3E, 0xF0, 0x00, 0x00, 0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0xF0, i8, 7, 0x3A, 0xB4,
|
|
0x47, 0xF0, 0x00, 0x00, 0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0xF0, i8, 7, 0x3A, 0xBC,
|
|
0x98, 0xF0, 0x00, 0x00, 0x00);
|
|
TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0xF0, i8, 7, 0x3A, 0x9C,
|
|
0xD1, 0xF0, 0x00, 0x00, 0x00);
|
|
|
|
/* cmp Addr, Imm */
|
|
// Note: at this point we trust the assembler knows how to encode addresses,
|
|
// so no more exhaustive addressing mode testing.
|
|
TestAddrBaseScaledIndexImm(cmp, eax, ecx, 1, 0xF0, 0x12, i32, 8, 0x83, 0xBC,
|
|
0x08, 0xF0, 0x00, 0x00, 0x00, 0x12);
|
|
TestAddrBaseScaledIndexImm(cmp, ecx, edx, 1, 0xF0, 0xF0, i32, 11, 0x81, 0xBC,
|
|
0x11, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00,
|
|
0x00);
|
|
|
|
TestAddrBaseScaledIndexImm(cmp, eax, ecx, 1, 0xF0, 0x12, i16, 9, 0x66, 0x83,
|
|
0xBC, 0x08, 0xF0, 0x00, 0x00, 0x00, 0x12);
|
|
TestAddrBaseScaledIndexImm(cmp, ecx, edx, 1, 0xF0, 0xF0, i16, 10, 0x66, 0x81,
|
|
0xBC, 0x11, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00);
|
|
|
|
TestAddrBaseScaledIndexImm(cmp, eax, ecx, 1, 0xF0, 0x12, i8, 8, 0x80, 0xBC,
|
|
0x08, 0xF0, 0x00, 0x00, 0x00, 0x12);
|
|
|
|
/* cmp Addr, GPR */
|
|
TestAddrBaseScaledIndexReg(cmp, eax, ecx, 1, 0xF0, edx, i32, 7, 0x39, 0x94,
|
|
0x08, 0xF0, 0x00, 0x00, 0x00);
|
|
|
|
TestAddrBaseScaledIndexReg(cmp, eax, ecx, 1, 0xF0, edx, i16, 8, 0x66, 0x39,
|
|
0x94, 0x08, 0xF0, 0x00, 0x00, 0x00);
|
|
|
|
TestAddrBaseScaledIndexReg(cmp, eax, ecx, 1, 0xF0, edx, i8, 7, 0x38, 0x94,
|
|
0x08, 0xF0, 0x00, 0x00, 0x00);
|
|
|
|
#undef TestAddrBaseScaledIndexReg
|
|
#undef TestAddrBaseScaledIndexImm
|
|
#undef TestRegAddrBaseScaledIndex
|
|
#undef TestRegAddrScaledIndex
|
|
#undef TestRegAddrBase
|
|
#undef TestRegAbsoluteAddr
|
|
#undef TestRegImm
|
|
#undef TestRegReg
|
|
}
|
|
|
|
TEST_F(AssemblerX8632Test, ScratchpadGettersAndSetters) {
|
|
const uint32_t S0 = allocateDword();
|
|
const uint32_t S1 = allocateDword();
|
|
const uint32_t S2 = allocateDword();
|
|
const uint32_t S3 = allocateDword();
|
|
AssembledTest test = assemble();
|
|
test.setDwordTo(S0, 0xBEEF0000u);
|
|
test.setDwordTo(S1, 0xDEADu);
|
|
test.setDwordTo(S2, 0x20406080u);
|
|
ASSERT_EQ(0xBEEF0000u, test.contentsOfDword(S0));
|
|
ASSERT_EQ(0xDEADu, test.contentsOfDword(S1));
|
|
ASSERT_EQ(0x20406080u, test.contentsOfDword(S2));
|
|
ASSERT_EQ(0xDEADBEEF0000ull, test.contentsOfQword(S0));
|
|
ASSERT_EQ(0x204060800000DEADull, test.contentsOfQword(S1));
|
|
|
|
test.setQwordTo(S1, 0x1234567890ABCDEFull);
|
|
ASSERT_EQ(0x1234567890ABCDEFull, test.contentsOfQword(S1));
|
|
test.setDwordTo(S0, 0xBEEF0000u);
|
|
ASSERT_EQ(0x90ABCDEFull, test.contentsOfDword(S1));
|
|
ASSERT_EQ(0x12345678ull, test.contentsOfDword(S2));
|
|
|
|
test.setDwordTo(S0, 1.0f);
|
|
ASSERT_FLOAT_EQ(1.0f, test.contentsOfDword<float>(S0));
|
|
test.setQwordTo(S0, 3.14);
|
|
ASSERT_DOUBLE_EQ(3.14, test.contentsOfQword<double>(S0));
|
|
|
|
test.setDqwordTo(S0, Dqword(1.0f, 2.0f, 3.0f, 4.0f));
|
|
ASSERT_EQ(Dqword(1.0f, 2.0f, 3.0f, 4.0f), test.contentsOfDqword(S0));
|
|
EXPECT_FLOAT_EQ(1.0f, test.contentsOfDword<float>(S0));
|
|
EXPECT_FLOAT_EQ(2.0f, test.contentsOfDword<float>(S1));
|
|
EXPECT_FLOAT_EQ(3.0f, test.contentsOfDword<float>(S2));
|
|
EXPECT_FLOAT_EQ(4.0f, test.contentsOfDword<float>(S3));
|
|
}
|
|
|
|
} // end of anonymous namespace
|
|
} // end of namespace Test
|
|
} // end of namespace X8632
|
|
} // end of namespace Ice
|