Home | History | Annotate | Download | only in AssemblerX8632
      1 //===- subzero/unittest/AssemblerX8632/LowLevel.cpp -----------------------===//
      2 //
      3 //                        The Subzero Code Generator
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 #include "AssemblerX8632/TestUtil.h"
     10 
     11 namespace Ice {
     12 namespace X8632 {
     13 namespace Test {
     14 namespace {
     15 
     16 TEST_F(AssemblerX8632LowLevelTest, Ret) {
     17   __ ret();
     18 
     19   constexpr size_t ByteCount = 1;
     20   ASSERT_EQ(ByteCount, codeBytesSize());
     21 
     22   verifyBytes<ByteCount>(codeBytes(), 0xc3);
     23 }
     24 
     25 TEST_F(AssemblerX8632LowLevelTest, RetImm) {
     26   __ ret(Immediate(0x20));
     27 
     28   constexpr size_t ByteCount = 3;
     29   ASSERT_EQ(ByteCount, codeBytesSize());
     30 
     31   verifyBytes<ByteCount>(codeBytes(), 0xC2, 0x20, 0x00);
     32 }
     33 
     34 TEST_F(AssemblerX8632LowLevelTest, CallImm4) {
     35   __ call(Immediate(4));
     36 
     37   constexpr size_t ByteCount = 5;
     38   ASSERT_EQ(ByteCount, codeBytesSize());
     39 
     40   verifyBytes<ByteCount>(codeBytes(), 0xe8, 0x00, 0x00, 0x00, 0x00);
     41 }
     42 
     43 TEST_F(AssemblerX8632LowLevelTest, PopRegs) {
     44   __ popl(GPRRegister::Encoded_Reg_eax);
     45   __ popl(GPRRegister::Encoded_Reg_ebx);
     46   __ popl(GPRRegister::Encoded_Reg_ecx);
     47   __ popl(GPRRegister::Encoded_Reg_edx);
     48   __ popl(GPRRegister::Encoded_Reg_edi);
     49   __ popl(GPRRegister::Encoded_Reg_esi);
     50   __ popl(GPRRegister::Encoded_Reg_ebp);
     51 
     52   constexpr size_t ByteCount = 7;
     53   ASSERT_EQ(ByteCount, codeBytesSize());
     54 
     55   constexpr uint8_t PopOpcode = 0x58;
     56   verifyBytes<ByteCount>(codeBytes(), PopOpcode | GPRRegister::Encoded_Reg_eax,
     57                          PopOpcode | GPRRegister::Encoded_Reg_ebx,
     58                          PopOpcode | GPRRegister::Encoded_Reg_ecx,
     59                          PopOpcode | GPRRegister::Encoded_Reg_edx,
     60                          PopOpcode | GPRRegister::Encoded_Reg_edi,
     61                          PopOpcode | GPRRegister::Encoded_Reg_esi,
     62                          PopOpcode | GPRRegister::Encoded_Reg_ebp);
     63 }
     64 
     65 TEST_F(AssemblerX8632LowLevelTest, PushRegs) {
     66   __ pushl(GPRRegister::Encoded_Reg_eax);
     67   __ pushl(GPRRegister::Encoded_Reg_ebx);
     68   __ pushl(GPRRegister::Encoded_Reg_ecx);
     69   __ pushl(GPRRegister::Encoded_Reg_edx);
     70   __ pushl(GPRRegister::Encoded_Reg_edi);
     71   __ pushl(GPRRegister::Encoded_Reg_esi);
     72   __ pushl(GPRRegister::Encoded_Reg_ebp);
     73 
     74   constexpr size_t ByteCount = 7;
     75   ASSERT_EQ(ByteCount, codeBytesSize());
     76 
     77   constexpr uint8_t PushOpcode = 0x50;
     78   verifyBytes<ByteCount>(codeBytes(), PushOpcode | GPRRegister::Encoded_Reg_eax,
     79                          PushOpcode | GPRRegister::Encoded_Reg_ebx,
     80                          PushOpcode | GPRRegister::Encoded_Reg_ecx,
     81                          PushOpcode | GPRRegister::Encoded_Reg_edx,
     82                          PushOpcode | GPRRegister::Encoded_Reg_edi,
     83                          PushOpcode | GPRRegister::Encoded_Reg_esi,
     84                          PushOpcode | GPRRegister::Encoded_Reg_ebp);
     85 }
     86 
     87 TEST_F(AssemblerX8632LowLevelTest, MovRegisterZero) {
     88   __ mov(IceType_i32, GPRRegister::Encoded_Reg_eax, Immediate(0x00));
     89   __ mov(IceType_i32, GPRRegister::Encoded_Reg_ebx, Immediate(0x00));
     90   __ mov(IceType_i32, GPRRegister::Encoded_Reg_ecx, Immediate(0x00));
     91   __ mov(IceType_i32, GPRRegister::Encoded_Reg_edx, Immediate(0x00));
     92   __ mov(IceType_i32, GPRRegister::Encoded_Reg_edi, Immediate(0x00));
     93   __ mov(IceType_i32, GPRRegister::Encoded_Reg_esi, Immediate(0x00));
     94 
     95   constexpr size_t MovReg32BitImmBytes = 5;
     96   constexpr size_t ByteCount = 6 * MovReg32BitImmBytes;
     97   ASSERT_EQ(ByteCount, codeBytesSize());
     98 
     99   constexpr uint8_t MovOpcode = 0xb8;
    100   verifyBytes<ByteCount>(
    101       codeBytes(), MovOpcode | GPRRegister::Encoded_Reg_eax, 0x00, 0x00, 0x00,
    102       0x00, MovOpcode | GPRRegister::Encoded_Reg_ebx, 0x00, 0x00, 0x00, 0x00,
    103       MovOpcode | GPRRegister::Encoded_Reg_ecx, 0x00, 0x00, 0x00, 0x00,
    104       MovOpcode | GPRRegister::Encoded_Reg_edx, 0x00, 0x00, 0x00, 0x00,
    105       MovOpcode | GPRRegister::Encoded_Reg_edi, 0x00, 0x00, 0x00, 0x00,
    106       MovOpcode | GPRRegister::Encoded_Reg_esi, 0x00, 0x00, 0x00, 0x00);
    107 }
    108 
    109 TEST_F(AssemblerX8632LowLevelTest, Cmp) {
    110 #define TestRegReg(Inst, Dst, Src, OpType, ByteCountUntyped, ...)              \
    111   do {                                                                         \
    112     static constexpr char TestString[] =                                       \
    113         "(" #Inst ", " #Dst ", " #Src ", " #OpType ", " #ByteCountUntyped      \
    114         ",  " #__VA_ARGS__ ")";                                                \
    115     static constexpr uint8_t ByteCount = ByteCountUntyped;                     \
    116     __ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst,                  \
    117             GPRRegister::Encoded_Reg_##Src);                                   \
    118     ASSERT_EQ(ByteCount, codeBytesSize()) << TestString;                       \
    119     ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__))              \
    120         << TestString;                                                         \
    121     reset();                                                                   \
    122   } while (0)
    123 
    124 #define TestRegImm(Inst, Dst, Imm, OpType, ByteCountUntyped, ...)              \
    125   do {                                                                         \
    126     static constexpr char TestString[] =                                       \
    127         "(" #Inst ", " #Dst ", " #Imm ", " #OpType ", " #ByteCountUntyped      \
    128         ",  " #__VA_ARGS__ ")";                                                \
    129     static constexpr uint8_t ByteCount = ByteCountUntyped;                     \
    130     __ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst, Immediate(Imm)); \
    131     ASSERT_EQ(ByteCount, codeBytesSize()) << TestString;                       \
    132     ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__))              \
    133         << TestString;                                                         \
    134     reset();                                                                   \
    135   } while (0)
    136 
    137 #define TestRegAbsoluteAddr(Inst, Dst, Disp, OpType, ByteCountUntyped, ...)    \
    138   do {                                                                         \
    139     static constexpr char TestString[] =                                       \
    140         "(" #Inst ", " #Dst ", " #Disp ", " #OpType ", " #ByteCountUntyped     \
    141         ",  " #__VA_ARGS__ ")";                                                \
    142     static constexpr uint8_t ByteCount = ByteCountUntyped;                     \
    143     __ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst,                  \
    144             Address(Disp, AssemblerFixup::NoFixup));                           \
    145     ASSERT_EQ(ByteCount, codeBytesSize()) << TestString;                       \
    146     ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__))              \
    147         << TestString;                                                         \
    148     reset();                                                                   \
    149   } while (0)
    150 
    151 #define TestRegAddrBase(Inst, Dst, Base, Disp, OpType, ByteCountUntyped, ...)  \
    152   do {                                                                         \
    153     static constexpr char TestString[] =                                       \
    154         "(" #Inst ", " #Dst ", " #Base ", " #Disp ", " #OpType                 \
    155         ", " #ByteCountUntyped ",  " #__VA_ARGS__ ")";                         \
    156     static constexpr uint8_t ByteCount = ByteCountUntyped;                     \
    157     __ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst,                  \
    158             Address(GPRRegister::Encoded_Reg_##Base, Disp,                     \
    159                     AssemblerFixup::NoFixup));                                 \
    160     ASSERT_EQ(ByteCount, codeBytesSize()) << TestString;                       \
    161     ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__))              \
    162         << TestString;                                                         \
    163     reset();                                                                   \
    164   } while (0)
    165 
    166 #define TestRegAddrScaledIndex(Inst, Dst, Index, Scale, Disp, OpType,          \
    167                                ByteCountUntyped, ...)                          \
    168   do {                                                                         \
    169     static constexpr char TestString[] =                                       \
    170         "(" #Inst ", " #Dst ", " #Index ", " #Scale ", " #Disp ", " #OpType    \
    171         ", " #ByteCountUntyped ",  " #__VA_ARGS__ ")";                         \
    172     static constexpr uint8_t ByteCount = ByteCountUntyped;                     \
    173     __ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst,                  \
    174             Address(GPRRegister::Encoded_Reg_##Index, Traits::TIMES_##Scale,   \
    175                     Disp, AssemblerFixup::NoFixup));                           \
    176     ASSERT_EQ(ByteCount, codeBytesSize()) << TestString;                       \
    177     ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__))              \
    178         << TestString;                                                         \
    179     reset();                                                                   \
    180   } while (0)
    181 
    182 #define TestRegAddrBaseScaledIndex(Inst, Dst, Base, Index, Scale, Disp,        \
    183                                    OpType, ByteCountUntyped, ...)              \
    184   do {                                                                         \
    185     static constexpr char TestString[] =                                       \
    186         "(" #Inst ", " #Dst ", " #Base ", " #Index ", " #Scale ", " #Disp      \
    187         ", " #OpType ", " #ByteCountUntyped ",  " #__VA_ARGS__ ")";            \
    188     static constexpr uint8_t ByteCount = ByteCountUntyped;                     \
    189     __ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst,                  \
    190             Address(GPRRegister::Encoded_Reg_##Base,                           \
    191                     GPRRegister::Encoded_Reg_##Index, Traits::TIMES_##Scale,   \
    192                     Disp, AssemblerFixup::NoFixup));                           \
    193     ASSERT_EQ(ByteCount, codeBytesSize()) << TestString;                       \
    194     ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__))              \
    195         << TestString;                                                         \
    196     reset();                                                                   \
    197   } while (0)
    198 
    199 #define TestAddrBaseScaledIndexImm(Inst, Base, Index, Scale, Disp, Imm,        \
    200                                    OpType, ByteCountUntyped, ...)              \
    201   do {                                                                         \
    202     static constexpr char TestString[] =                                       \
    203         "(" #Inst ", " #Base ", " #Index ", " #Scale ", " #Disp ", " #Imm      \
    204         ", " #OpType ", " #ByteCountUntyped ",  " #__VA_ARGS__ ")";            \
    205     static constexpr uint8_t ByteCount = ByteCountUntyped;                     \
    206     __ Inst(IceType_##OpType,                                                  \
    207             Address(GPRRegister::Encoded_Reg_##Base,                           \
    208                     GPRRegister::Encoded_Reg_##Index, Traits::TIMES_##Scale,   \
    209                     Disp, AssemblerFixup::NoFixup),                            \
    210             Immediate(Imm));                                                   \
    211     ASSERT_EQ(ByteCount, codeBytesSize()) << TestString;                       \
    212     ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__))              \
    213         << TestString;                                                         \
    214     reset();                                                                   \
    215   } while (0)
    216 
    217 #define TestAddrBaseScaledIndexReg(Inst, Base, Index, Scale, Disp, Src,        \
    218                                    OpType, ByteCountUntyped, ...)              \
    219   do {                                                                         \
    220     static constexpr char TestString[] =                                       \
    221         "(" #Inst ", " #Base ", " #Index ", " #Scale ", " #Disp ", " #Src      \
    222         ", " #OpType ", " #ByteCountUntyped ",  " #__VA_ARGS__ ")";            \
    223     static constexpr uint8_t ByteCount = ByteCountUntyped;                     \
    224     __ Inst(IceType_##OpType,                                                  \
    225             Address(GPRRegister::Encoded_Reg_##Base,                           \
    226                     GPRRegister::Encoded_Reg_##Index, Traits::TIMES_##Scale,   \
    227                     Disp, AssemblerFixup::NoFixup),                            \
    228             GPRRegister::Encoded_Reg_##Src);                                   \
    229     ASSERT_EQ(ByteCount, codeBytesSize()) << TestString;                       \
    230     ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__))              \
    231         << TestString;                                                         \
    232     reset();                                                                   \
    233   } while (0)
    234 
    235   /* cmp GPR, GPR */
    236   TestRegReg(cmp, eax, ecx, i32, 2, 0x3B, 0xC1);
    237   TestRegReg(cmp, ecx, edx, i32, 2, 0x3B, 0xCA);
    238   TestRegReg(cmp, edx, ebx, i32, 2, 0x3B, 0xD3);
    239   TestRegReg(cmp, ebx, esp, i32, 2, 0x3B, 0xDC);
    240   TestRegReg(cmp, esp, ebp, i32, 2, 0x3B, 0xE5);
    241   TestRegReg(cmp, ebp, esi, i32, 2, 0x3B, 0xEE);
    242   TestRegReg(cmp, esi, edi, i32, 2, 0x3B, 0xF7);
    243   TestRegReg(cmp, edi, eax, i32, 2, 0x3B, 0xF8);
    244 
    245   TestRegReg(cmp, eax, ecx, i16, 3, 0x66, 0x3B, 0xC1);
    246   TestRegReg(cmp, ecx, edx, i16, 3, 0x66, 0x3B, 0xCA);
    247   TestRegReg(cmp, edx, ebx, i16, 3, 0x66, 0x3B, 0xD3);
    248   TestRegReg(cmp, ebx, esp, i16, 3, 0x66, 0x3B, 0xDC);
    249   TestRegReg(cmp, esp, ebp, i16, 3, 0x66, 0x3B, 0xE5);
    250   TestRegReg(cmp, ebp, esi, i16, 3, 0x66, 0x3B, 0xEE);
    251   TestRegReg(cmp, esi, edi, i16, 3, 0x66, 0x3B, 0xF7);
    252   TestRegReg(cmp, edi, eax, i16, 3, 0x66, 0x3B, 0xF8);
    253 
    254   TestRegReg(cmp, eax, ecx, i8, 2, 0x3A, 0xC1);
    255   TestRegReg(cmp, ecx, edx, i8, 2, 0x3A, 0xCA);
    256   TestRegReg(cmp, edx, ebx, i8, 2, 0x3A, 0xD3);
    257   TestRegReg(cmp, ebx, esp, i8, 2, 0x3A, 0xDC);
    258   TestRegReg(cmp, esp, ebp, i8, 2, 0x3A, 0xE5);
    259   TestRegReg(cmp, ebp, esi, i8, 2, 0x3A, 0xEE);
    260   TestRegReg(cmp, esi, edi, i8, 2, 0x3A, 0xF7);
    261   TestRegReg(cmp, edi, eax, i8, 2, 0x3A, 0xF8);
    262 
    263   /* cmp GPR, Imm8 */
    264   TestRegImm(cmp, eax, 5, i32, 3, 0x83, 0xF8, 0x05);
    265   TestRegImm(cmp, ecx, 5, i32, 3, 0x83, 0xF9, 0x05);
    266   TestRegImm(cmp, edx, 5, i32, 3, 0x83, 0xFA, 0x05);
    267   TestRegImm(cmp, ebx, 5, i32, 3, 0x83, 0xFB, 0x05);
    268   TestRegImm(cmp, esp, 5, i32, 3, 0x83, 0xFC, 0x05);
    269   TestRegImm(cmp, ebp, 5, i32, 3, 0x83, 0xFD, 0x05);
    270   TestRegImm(cmp, esi, 5, i32, 3, 0x83, 0xFE, 0x05);
    271   TestRegImm(cmp, edi, 5, i32, 3, 0x83, 0xFF, 0x05);
    272 
    273   TestRegImm(cmp, eax, 5, i16, 4, 0x66, 0x83, 0xF8, 0x05);
    274   TestRegImm(cmp, ecx, 5, i16, 4, 0x66, 0x83, 0xF9, 0x05);
    275   TestRegImm(cmp, edx, 5, i16, 4, 0x66, 0x83, 0xFA, 0x05);
    276   TestRegImm(cmp, ebx, 5, i16, 4, 0x66, 0x83, 0xFB, 0x05);
    277   TestRegImm(cmp, esp, 5, i16, 4, 0x66, 0x83, 0xFC, 0x05);
    278   TestRegImm(cmp, ebp, 5, i16, 4, 0x66, 0x83, 0xFD, 0x05);
    279   TestRegImm(cmp, esi, 5, i16, 4, 0x66, 0x83, 0xFE, 0x05);
    280   TestRegImm(cmp, edi, 5, i16, 4, 0x66, 0x83, 0xFF, 0x05);
    281 
    282   TestRegImm(cmp, eax, 5, i8, 2, 0x3C, 0x05);
    283   TestRegImm(cmp, ecx, 5, i8, 3, 0x80, 0xF9, 0x05);
    284   TestRegImm(cmp, edx, 5, i8, 3, 0x80, 0xFA, 0x05);
    285   TestRegImm(cmp, ebx, 5, i8, 3, 0x80, 0xFB, 0x05);
    286   TestRegImm(cmp, esp, 5, i8, 3, 0x80, 0xFC, 0x05);
    287   TestRegImm(cmp, ebp, 5, i8, 3, 0x80, 0xFD, 0x05);
    288   TestRegImm(cmp, esi, 5, i8, 3, 0x80, 0xFE, 0x05);
    289   TestRegImm(cmp, edi, 5, i8, 3, 0x80, 0xFF, 0x05);
    290 
    291   /* cmp GPR, Imm16 */
    292   TestRegImm(cmp, eax, 0x100, i32, 5, 0x3D, 0x00, 0x01, 0x00, 0x00);
    293   TestRegImm(cmp, ecx, 0x100, i32, 6, 0x81, 0xF9, 0x00, 0x01, 0x00, 0x00);
    294   TestRegImm(cmp, edx, 0x100, i32, 6, 0x81, 0xFA, 0x00, 0x01, 0x00, 0x00);
    295   TestRegImm(cmp, ebx, 0x100, i32, 6, 0x81, 0xFB, 0x00, 0x01, 0x00, 0x00);
    296   TestRegImm(cmp, esp, 0x100, i32, 6, 0x81, 0xFC, 0x00, 0x01, 0x00, 0x00);
    297   TestRegImm(cmp, ebp, 0x100, i32, 6, 0x81, 0xFD, 0x00, 0x01, 0x00, 0x00);
    298   TestRegImm(cmp, esi, 0x100, i32, 6, 0x81, 0xFE, 0x00, 0x01, 0x00, 0x00);
    299   TestRegImm(cmp, edi, 0x100, i32, 6, 0x81, 0xFF, 0x00, 0x01, 0x00, 0x00);
    300 
    301   TestRegImm(cmp, eax, 0x100, i16, 4, 0x66, 0x3D, 0x00, 0x01);
    302   TestRegImm(cmp, ecx, 0x100, i16, 5, 0x66, 0x81, 0xF9, 0x00, 0x01);
    303   TestRegImm(cmp, edx, 0x100, i16, 5, 0x66, 0x81, 0xFA, 0x00, 0x01);
    304   TestRegImm(cmp, ebx, 0x100, i16, 5, 0x66, 0x81, 0xFB, 0x00, 0x01);
    305   TestRegImm(cmp, esp, 0x100, i16, 5, 0x66, 0x81, 0xFC, 0x00, 0x01);
    306   TestRegImm(cmp, ebp, 0x100, i16, 5, 0x66, 0x81, 0xFD, 0x00, 0x01);
    307   TestRegImm(cmp, esi, 0x100, i16, 5, 0x66, 0x81, 0xFE, 0x00, 0x01);
    308   TestRegImm(cmp, edi, 0x100, i16, 5, 0x66, 0x81, 0xFF, 0x00, 0x01);
    309 
    310   /* cmp GPR, Absolute */
    311   TestRegAbsoluteAddr(cmp, eax, 0xF00FBEEF, i32, 6, 0x3B, 0x05, 0xEF, 0xBE,
    312                       0x0F, 0xF0);
    313   TestRegAbsoluteAddr(cmp, eax, 0xF00FBEEF, i16, 7, 0x66, 0x3B, 0x05, 0xEF,
    314                       0xBE, 0x0F, 0xF0);
    315   TestRegAbsoluteAddr(cmp, eax, 0xF00FBEEF, i8, 6, 0x3A, 0x05, 0xEF, 0xBE, 0x0F,
    316                       0xF0);
    317 
    318   /* cmp GPR, 0(Base) */
    319   TestRegAddrBase(cmp, eax, ecx, 0, i32, 2, 0x3B, 0x01);
    320   TestRegAddrBase(cmp, ecx, edx, 0, i32, 2, 0x3B, 0x0A);
    321   TestRegAddrBase(cmp, edx, ebx, 0, i32, 2, 0x3B, 0x13);
    322   TestRegAddrBase(cmp, ebx, esp, 0, i32, 3, 0x3B, 0x1C, 0x24);
    323   TestRegAddrBase(cmp, esp, ebp, 0, i32, 3, 0x3B, 0x65, 0x00);
    324   TestRegAddrBase(cmp, ebp, esi, 0, i32, 2, 0x3B, 0x2E);
    325   TestRegAddrBase(cmp, esi, edi, 0, i32, 2, 0x3B, 0x37);
    326   TestRegAddrBase(cmp, edi, eax, 0, i32, 2, 0x3B, 0x38);
    327 
    328   TestRegAddrBase(cmp, eax, ecx, 0, i16, 3, 0x66, 0x3B, 0x01);
    329   TestRegAddrBase(cmp, ecx, edx, 0, i16, 3, 0x66, 0x3B, 0x0A);
    330   TestRegAddrBase(cmp, edx, ebx, 0, i16, 3, 0x66, 0x3B, 0x13);
    331   TestRegAddrBase(cmp, ebx, esp, 0, i16, 4, 0x66, 0x3B, 0x1C, 0x24);
    332   TestRegAddrBase(cmp, esp, ebp, 0, i16, 4, 0x66, 0x3B, 0x65, 0x00);
    333   TestRegAddrBase(cmp, ebp, esi, 0, i16, 3, 0x66, 0x3B, 0x2E);
    334   TestRegAddrBase(cmp, esi, edi, 0, i16, 3, 0x66, 0x3B, 0x37);
    335   TestRegAddrBase(cmp, edi, eax, 0, i16, 3, 0x66, 0x3B, 0x38);
    336 
    337   TestRegAddrBase(cmp, eax, ecx, 0, i8, 2, 0x3A, 0x01);
    338   TestRegAddrBase(cmp, ecx, edx, 0, i8, 2, 0x3A, 0x0A);
    339   TestRegAddrBase(cmp, edx, ebx, 0, i8, 2, 0x3A, 0x13);
    340   TestRegAddrBase(cmp, ebx, esp, 0, i8, 3, 0x3A, 0x1C, 0x24);
    341   TestRegAddrBase(cmp, esp, ebp, 0, i8, 3, 0x3A, 0x65, 0x00);
    342   TestRegAddrBase(cmp, ebp, esi, 0, i8, 2, 0x3A, 0x2E);
    343   TestRegAddrBase(cmp, esi, edi, 0, i8, 2, 0x3A, 0x37);
    344   TestRegAddrBase(cmp, edi, eax, 0, i8, 2, 0x3A, 0x38);
    345 
    346   /* cmp GPR, Imm8(Base) */
    347   TestRegAddrBase(cmp, eax, ecx, 0x40, i32, 3, 0x3B, 0x41, 0x40);
    348   TestRegAddrBase(cmp, ecx, edx, 0x40, i32, 3, 0x3B, 0x4A, 0x40);
    349   TestRegAddrBase(cmp, edx, ebx, 0x40, i32, 3, 0x3B, 0x53, 0x40);
    350   TestRegAddrBase(cmp, ebx, esp, 0x40, i32, 4, 0x3B, 0x5C, 0x24, 0x40);
    351   TestRegAddrBase(cmp, esp, ebp, 0x40, i32, 3, 0x3B, 0x65, 0x40);
    352   TestRegAddrBase(cmp, ebp, esi, 0x40, i32, 3, 0x3B, 0x6E, 0x40);
    353   TestRegAddrBase(cmp, esi, edi, 0x40, i32, 3, 0x3B, 0x77, 0x40);
    354   TestRegAddrBase(cmp, edi, eax, 0x40, i32, 3, 0x3B, 0x78, 0x40);
    355 
    356   TestRegAddrBase(cmp, eax, ecx, 0x40, i16, 4, 0x66, 0x3B, 0x41, 0x40);
    357   TestRegAddrBase(cmp, ecx, edx, 0x40, i16, 4, 0x66, 0x3B, 0x4A, 0x40);
    358   TestRegAddrBase(cmp, edx, ebx, 0x40, i16, 4, 0x66, 0x3B, 0x53, 0x40);
    359   TestRegAddrBase(cmp, ebx, esp, 0x40, i16, 5, 0x66, 0x3B, 0x5C, 0x24, 0x40);
    360   TestRegAddrBase(cmp, esp, ebp, 0x40, i16, 4, 0x66, 0x3B, 0x65, 0x40);
    361   TestRegAddrBase(cmp, ebp, esi, 0x40, i16, 4, 0x66, 0x3B, 0x6E, 0x40);
    362   TestRegAddrBase(cmp, esi, edi, 0x40, i16, 4, 0x66, 0x3B, 0x77, 0x40);
    363   TestRegAddrBase(cmp, edi, eax, 0x40, i16, 4, 0x66, 0x3B, 0x78, 0x40);
    364 
    365   TestRegAddrBase(cmp, eax, ecx, 0x40, i8, 3, 0x3A, 0x41, 0x40);
    366   TestRegAddrBase(cmp, ecx, edx, 0x40, i8, 3, 0x3A, 0x4A, 0x40);
    367   TestRegAddrBase(cmp, edx, ebx, 0x40, i8, 3, 0x3A, 0x53, 0x40);
    368   TestRegAddrBase(cmp, ebx, esp, 0x40, i8, 4, 0x3A, 0x5C, 0x24, 0x40);
    369   TestRegAddrBase(cmp, esp, ebp, 0x40, i8, 3, 0x3A, 0x65, 0x40);
    370   TestRegAddrBase(cmp, ebp, esi, 0x40, i8, 3, 0x3A, 0x6E, 0x40);
    371   TestRegAddrBase(cmp, esi, edi, 0x40, i8, 3, 0x3A, 0x77, 0x40);
    372   TestRegAddrBase(cmp, edi, eax, 0x40, i8, 3, 0x3A, 0x78, 0x40);
    373 
    374   /* cmp GPR, Imm32(Base) */
    375   TestRegAddrBase(cmp, eax, ecx, 0xF0, i32, 6, 0x3B, 0x81, 0xF0, 0x00, 0x00,
    376                   0x00);
    377   TestRegAddrBase(cmp, ecx, edx, 0xF0, i32, 6, 0x3B, 0x8A, 0xF0, 0x00, 0x00,
    378                   0x00);
    379   TestRegAddrBase(cmp, edx, ebx, 0xF0, i32, 6, 0x3B, 0x93, 0xF0, 0x00, 0x00,
    380                   0x00);
    381   TestRegAddrBase(cmp, ebx, esp, 0xF0, i32, 7, 0x3B, 0x9C, 0x24, 0xF0, 0x00,
    382                   0x00, 0x00);
    383   TestRegAddrBase(cmp, esp, ebp, 0xF0, i32, 6, 0x3B, 0xA5, 0xF0, 0x00, 0x00,
    384                   0x00);
    385   TestRegAddrBase(cmp, ebp, esi, 0xF0, i32, 6, 0x3B, 0xAE, 0xF0, 0x00, 0x00,
    386                   0x00);
    387   TestRegAddrBase(cmp, esi, edi, 0xF0, i32, 6, 0x3B, 0xB7, 0xF0, 0x00, 0x00,
    388                   0x00);
    389   TestRegAddrBase(cmp, edi, eax, 0xF0, i32, 6, 0x3B, 0xB8, 0xF0, 0x00, 0x00,
    390                   0x00);
    391 
    392   TestRegAddrBase(cmp, eax, ecx, 0xF0, i16, 7, 0x66, 0x3B, 0x81, 0xF0, 0x00,
    393                   0x00, 0x00);
    394   TestRegAddrBase(cmp, ecx, edx, 0xF0, i16, 7, 0x66, 0x3B, 0x8A, 0xF0, 0x00,
    395                   0x00, 0x00);
    396   TestRegAddrBase(cmp, edx, ebx, 0xF0, i16, 7, 0x66, 0x3B, 0x93, 0xF0, 0x00,
    397                   0x00, 0x00);
    398   TestRegAddrBase(cmp, ebx, esp, 0xF0, i16, 8, 0x66, 0x3B, 0x9C, 0x24, 0xF0,
    399                   0x00, 0x00, 0x00);
    400   TestRegAddrBase(cmp, esp, ebp, 0xF0, i16, 7, 0x66, 0x3B, 0xa5, 0xF0, 0x00,
    401                   0x00, 0x00);
    402   TestRegAddrBase(cmp, ebp, esi, 0xF0, i16, 7, 0x66, 0x3B, 0xaE, 0xF0, 0x00,
    403                   0x00, 0x00);
    404   TestRegAddrBase(cmp, esi, edi, 0xF0, i16, 7, 0x66, 0x3B, 0xb7, 0xF0, 0x00,
    405                   0x00, 0x00);
    406   TestRegAddrBase(cmp, edi, eax, 0xF0, i16, 7, 0x66, 0x3B, 0xb8, 0xF0, 0x00,
    407                   0x00, 0x00);
    408 
    409   TestRegAddrBase(cmp, eax, ecx, 0xF0, i8, 6, 0x3A, 0x81, 0xF0, 0x00, 0x00,
    410                   0x00);
    411   TestRegAddrBase(cmp, ecx, edx, 0xF0, i8, 6, 0x3A, 0x8A, 0xF0, 0x00, 0x00,
    412                   0x00);
    413   TestRegAddrBase(cmp, edx, ebx, 0xF0, i8, 6, 0x3A, 0x93, 0xF0, 0x00, 0x00,
    414                   0x00);
    415   TestRegAddrBase(cmp, ebx, esp, 0xF0, i8, 7, 0x3A, 0x9C, 0x24, 0xF0, 0x00,
    416                   0x00, 0x00);
    417   TestRegAddrBase(cmp, esp, ebp, 0xF0, i8, 6, 0x3A, 0xA5, 0xF0, 0x00, 0x00,
    418                   0x00);
    419   TestRegAddrBase(cmp, ebp, esi, 0xF0, i8, 6, 0x3A, 0xAE, 0xF0, 0x00, 0x00,
    420                   0x00);
    421   TestRegAddrBase(cmp, esi, edi, 0xF0, i8, 6, 0x3A, 0xB7, 0xF0, 0x00, 0x00,
    422                   0x00);
    423   TestRegAddrBase(cmp, edi, eax, 0xF0, i8, 6, 0x3A, 0xB8, 0xF0, 0x00, 0x00,
    424                   0x00);
    425 
    426   /* cmp GPR, Imm(,Index,Scale) */
    427   TestRegAddrScaledIndex(cmp, eax, ecx, 1, 0, i32, 7, 0x3B, 0x04, 0x0D, 0x00,
    428                          0x00, 0x00, 0x00);
    429   TestRegAddrScaledIndex(cmp, ecx, edx, 2, 0, i32, 7, 0x3B, 0x0C, 0x55, 0x00,
    430                          0x00, 0x00, 0x00);
    431   TestRegAddrScaledIndex(cmp, edx, ebx, 4, 0, i32, 7, 0x3B, 0x14, 0x9D, 0x00,
    432                          0x00, 0x00, 0x00);
    433   // esp cannot be an scaled index.
    434   TestRegAddrScaledIndex(cmp, esp, ebp, 8, 0, i32, 7, 0x3B, 0x24, 0xED, 0x00,
    435                          0x00, 0x00, 0x00);
    436   TestRegAddrScaledIndex(cmp, ebp, esi, 1, 0, i32, 7, 0x3B, 0x2C, 0x35, 0x00,
    437                          0x00, 0x00, 0x00);
    438   TestRegAddrScaledIndex(cmp, esi, edi, 2, 0, i32, 7, 0x3B, 0x34, 0x7D, 0x00,
    439                          0x00, 0x00, 0x00);
    440   TestRegAddrScaledIndex(cmp, edi, eax, 4, 0, i32, 7, 0x3B, 0x3C, 0x85, 0x00,
    441                          0x00, 0x00, 0x00);
    442   TestRegAddrScaledIndex(cmp, ebx, ecx, 8, 0, i32, 7, 0x3B, 0x1C, 0xCD, 0x00,
    443                          0x00, 0x00, 0x00);
    444 
    445   TestRegAddrScaledIndex(cmp, eax, ecx, 8, 0, i16, 8, 0x66, 0x3B, 0x04, 0xCD,
    446                          0x00, 0x00, 0x00, 0x00);
    447   TestRegAddrScaledIndex(cmp, ecx, edx, 1, 0, i16, 8, 0x66, 0x3B, 0x0C, 0x15,
    448                          0x00, 0x00, 0x00, 0x00);
    449   TestRegAddrScaledIndex(cmp, edx, ebx, 2, 0, i16, 8, 0x66, 0x3B, 0x14, 0x5D,
    450                          0x00, 0x00, 0x00, 0x00);
    451   // esp cannot be an scaled index.
    452   TestRegAddrScaledIndex(cmp, esp, ebp, 4, 0, i16, 8, 0x66, 0x3B, 0x24, 0xAD,
    453                          0x00, 0x00, 0x00, 0x00);
    454   TestRegAddrScaledIndex(cmp, ebp, esi, 8, 0, i16, 8, 0x66, 0x3B, 0x2C, 0xF5,
    455                          0x00, 0x00, 0x00, 0x00);
    456   TestRegAddrScaledIndex(cmp, esi, edi, 1, 0, i16, 8, 0x66, 0x3B, 0x34, 0x3D,
    457                          0x00, 0x00, 0x00, 0x00);
    458   TestRegAddrScaledIndex(cmp, edi, eax, 2, 0, i16, 8, 0x66, 0x3B, 0x3C, 0x45,
    459                          0x00, 0x00, 0x00, 0x00);
    460   TestRegAddrScaledIndex(cmp, ebx, ecx, 8, 0, i16, 8, 0x66, 0x3B, 0x1C, 0xCD,
    461                          0x00, 0x00, 0x00, 0x00);
    462 
    463   TestRegAddrScaledIndex(cmp, eax, ecx, 4, 0, i8, 7, 0x3A, 0x04, 0x8D, 0x00,
    464                          0x00, 0x00, 0x00);
    465   TestRegAddrScaledIndex(cmp, ecx, edx, 8, 0, i8, 7, 0x3A, 0x0C, 0xD5, 0x00,
    466                          0x00, 0x00, 0x00);
    467   TestRegAddrScaledIndex(cmp, edx, ebx, 1, 0, i8, 7, 0x3A, 0x14, 0x1D, 0x00,
    468                          0x00, 0x00, 0x00);
    469   // esp cannot be an scaled index.
    470   TestRegAddrScaledIndex(cmp, esp, ebp, 2, 0, i8, 7, 0x3A, 0x24, 0x6D, 0x00,
    471                          0x00, 0x00, 0x00);
    472   TestRegAddrScaledIndex(cmp, ebp, esi, 4, 0, i8, 7, 0x3A, 0x2C, 0xB5, 0x00,
    473                          0x00, 0x00, 0x00);
    474   TestRegAddrScaledIndex(cmp, esi, edi, 8, 0, i8, 7, 0x3A, 0x34, 0xFD, 0x00,
    475                          0x00, 0x00, 0x00);
    476   TestRegAddrScaledIndex(cmp, edi, eax, 1, 0, i8, 7, 0x3A, 0x3C, 0x05, 0x00,
    477                          0x00, 0x00, 0x00);
    478   TestRegAddrScaledIndex(cmp, ebx, ecx, 8, 0, i8, 7, 0x3a, 0x1C, 0xCD, 0x00,
    479                          0x00, 0x00, 0x00);
    480 
    481   /* cmp GPR, 0(Base,Index,Scale) */
    482   TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0, i32, 3, 0x3B, 0x04,
    483                              0x11);
    484   TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0, i32, 3, 0x3B, 0x0C,
    485                              0x5A);
    486   // esp cannot be an scaled index.
    487   TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0, i32, 3, 0x3B, 0x1C,
    488                              0xAC);
    489   TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0, i32, 4, 0x3B, 0x64, 0xF5,
    490                              0x00);
    491   TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0, i32, 3, 0x3B, 0x2C,
    492                              0x3E);
    493   TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0, i32, 3, 0x3B, 0x34,
    494                              0x47);
    495   TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0, i32, 3, 0x3B, 0x3C,
    496                              0x98);
    497   TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0, i32, 3, 0x3B, 0x1C,
    498                              0xD1);
    499 
    500   TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0, i16, 4, 0x66, 0x3B, 0x04,
    501                              0x11);
    502   TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0, i16, 4, 0x66, 0x3B, 0x0C,
    503                              0x5A);
    504   // esp cannot be an scaled index.
    505   TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0, i16, 4, 0x66, 0x3B, 0x1C,
    506                              0xAC);
    507   TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0, i16, 5, 0x66, 0x3B, 0x64,
    508                              0xF5, 0x00);
    509   TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0, i16, 4, 0x66, 0x3B, 0x2C,
    510                              0x3E);
    511   TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0, i16, 4, 0x66, 0x3B, 0x34,
    512                              0x47);
    513   TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0, i16, 4, 0x66, 0x3B, 0x3C,
    514                              0x98);
    515   TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0, i16, 4, 0x66, 0x3B, 0x1C,
    516                              0xD1);
    517 
    518   TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0, i8, 3, 0x3A, 0x04, 0x11);
    519   TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0, i8, 3, 0x3A, 0x0C, 0x5A);
    520   // esp cannot be an scaled index.
    521   TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0, i8, 3, 0x3A, 0x1C, 0xAC);
    522   TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0, i8, 4, 0x3A, 0x64, 0xF5,
    523                              0x00);
    524   TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0, i8, 3, 0x3A, 0x2C, 0x3E);
    525   TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0, i8, 3, 0x3A, 0x34, 0x47);
    526   TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0, i8, 3, 0x3A, 0x3C, 0x98);
    527   TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0, i8, 3, 0x3A, 0x1C, 0xD1);
    528 
    529   /* cmp GPR, Imm8(Base,Index,Scale) */
    530   TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0x40, i32, 4, 0x3B, 0x44,
    531                              0x11, 0x40);
    532   TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0x40, i32, 4, 0x3B, 0x4C,
    533                              0x5A, 0x40);
    534   // esp cannot be an scaled index.
    535   TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0x40, i32, 4, 0x3B, 0x5C,
    536                              0xAC, 0x40);
    537   TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0x40, i32, 4, 0x3B, 0x64,
    538                              0xF5, 0x40);
    539   TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0x40, i32, 4, 0x3B, 0x6C,
    540                              0x3E, 0x40);
    541   TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0x40, i32, 4, 0x3B, 0x74,
    542                              0x47, 0x40);
    543   TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0x40, i32, 4, 0x3B, 0x7C,
    544                              0x98, 0x40);
    545   TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0x40, i32, 4, 0x3B, 0x5C,
    546                              0xD1, 0x40);
    547 
    548   TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0x40, i16, 5, 0x66, 0x3B,
    549                              0x44, 0x11, 0x40);
    550   TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0x40, i16, 5, 0x66, 0x3B,
    551                              0x4C, 0x5A, 0x40);
    552   // esp cannot be an scaled index.
    553   TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0x40, i16, 5, 0x66, 0x3B,
    554                              0x5C, 0xAC, 0x40);
    555   TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0x40, i16, 5, 0x66, 0x3B,
    556                              0x64, 0xF5, 0x40);
    557   TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0x40, i16, 5, 0x66, 0x3B,
    558                              0x6C, 0x3E, 0x40);
    559   TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0x40, i16, 5, 0x66, 0x3B,
    560                              0x74, 0x47, 0x40);
    561   TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0x40, i16, 5, 0x66, 0x3B,
    562                              0x7C, 0x98, 0x40);
    563   TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0x40, i16, 5, 0x66, 0x3B,
    564                              0x5C, 0xD1, 0x40);
    565 
    566   TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0x40, i8, 4, 0x3A, 0x44,
    567                              0x11, 0x40);
    568   TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0x40, i8, 4, 0x3A, 0x4C,
    569                              0x5A, 0x40);
    570   // esp cannot be an scaled index.
    571   TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0x40, i8, 4, 0x3A, 0x5C,
    572                              0xAC, 0x40);
    573   TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0x40, i8, 4, 0x3A, 0x64,
    574                              0xF5, 0x40);
    575   TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0x40, i8, 4, 0x3A, 0x6C,
    576                              0x3E, 0x40);
    577   TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0x40, i8, 4, 0x3A, 0x74,
    578                              0x47, 0x40);
    579   TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0x40, i8, 4, 0x3A, 0x7C,
    580                              0x98, 0x40);
    581   TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0x40, i8, 4, 0x3A, 0x5C,
    582                              0xD1, 0x40);
    583 
    584   /* cmp GPR, Imm32(Base,Index,Scale) */
    585   TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0xF0, i32, 7, 0x3B, 0x84,
    586                              0x11, 0xF0, 0x00, 0x00, 0x00);
    587   TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0xF0, i32, 7, 0x3B, 0x8C,
    588                              0x5A, 0xF0, 0x00, 0x00, 0x00);
    589   // esp cannot be an scaled index.
    590   TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0xF0, i32, 7, 0x3B, 0x9C,
    591                              0xAC, 0xF0, 0x00, 0x00, 0x00);
    592   TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0xF0, i32, 7, 0x3B, 0xA4,
    593                              0xF5, 0xF0, 0x00, 0x00, 0x00);
    594   TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0xF0, i32, 7, 0x3B, 0xAC,
    595                              0x3E, 0xF0, 0x00, 0x00, 0x00);
    596   TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0xF0, i32, 7, 0x3B, 0xB4,
    597                              0x47, 0xF0, 0x00, 0x00, 0x00);
    598   TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0xF0, i32, 7, 0x3B, 0xBC,
    599                              0x98, 0xF0, 0x00, 0x00, 0x00);
    600   TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0xF0, i32, 7, 0x3B, 0x9C,
    601                              0xD1, 0xF0, 0x00, 0x00, 0x00);
    602 
    603   TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0xF0, i16, 8, 0x66, 0x3B,
    604                              0x84, 0x11, 0xF0, 0x00, 0x00, 0x00);
    605   TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0xF0, i16, 8, 0x66, 0x3B,
    606                              0x8C, 0x5A, 0xF0, 0x00, 0x00, 0x00);
    607   // esp cannot be an scaled index.
    608   TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0xF0, i16, 8, 0x66, 0x3B,
    609                              0x9C, 0xAC, 0xF0, 0x00, 0x00, 0x00);
    610   TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0xF0, i16, 8, 0x66, 0x3B,
    611                              0xA4, 0xF5, 0xF0, 0x00, 0x00, 0x00);
    612   TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0xF0, i16, 8, 0x66, 0x3B,
    613                              0xAC, 0x3E, 0xF0, 0x00, 0x00, 0x00);
    614   TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0xF0, i16, 8, 0x66, 0x3B,
    615                              0xB4, 0x47, 0xF0, 0x00, 0x00, 0x00);
    616   TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0xF0, i16, 8, 0x66, 0x3B,
    617                              0xBC, 0x98, 0xF0, 0x00, 0x00, 0x00);
    618   TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0xF0, i16, 8, 0x66, 0x3B,
    619                              0x9C, 0xD1, 0xF0, 0x00, 0x00, 0x00);
    620 
    621   TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0xF0, i8, 7, 0x3A, 0x84,
    622                              0x11, 0xF0, 0x00, 0x00, 0x00);
    623   TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0xF0, i8, 7, 0x3A, 0x8C,
    624                              0x5A, 0xF0, 0x00, 0x00, 0x00);
    625   // esp cannot be an scaled index.
    626   TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0xF0, i8, 7, 0x3A, 0x9C,
    627                              0xAC, 0xF0, 0x00, 0x00, 0x00);
    628   TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0xF0, i8, 7, 0x3A, 0xA4,
    629                              0xF5, 0xF0, 0x00, 0x00, 0x00);
    630   TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0xF0, i8, 7, 0x3A, 0xAC,
    631                              0x3E, 0xF0, 0x00, 0x00, 0x00);
    632   TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0xF0, i8, 7, 0x3A, 0xB4,
    633                              0x47, 0xF0, 0x00, 0x00, 0x00);
    634   TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0xF0, i8, 7, 0x3A, 0xBC,
    635                              0x98, 0xF0, 0x00, 0x00, 0x00);
    636   TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0xF0, i8, 7, 0x3A, 0x9C,
    637                              0xD1, 0xF0, 0x00, 0x00, 0x00);
    638 
    639   /* cmp Addr, Imm */
    640   // Note: at this point we trust the assembler knows how to encode addresses,
    641   // so no more exhaustive addressing mode testing.
    642   TestAddrBaseScaledIndexImm(cmp, eax, ecx, 1, 0xF0, 0x12, i32, 8, 0x83, 0xBC,
    643                              0x08, 0xF0, 0x00, 0x00, 0x00, 0x12);
    644   TestAddrBaseScaledIndexImm(cmp, ecx, edx, 1, 0xF0, 0xF0, i32, 11, 0x81, 0xBC,
    645                              0x11, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00,
    646                              0x00);
    647 
    648   TestAddrBaseScaledIndexImm(cmp, eax, ecx, 1, 0xF0, 0x12, i16, 9, 0x66, 0x83,
    649                              0xBC, 0x08, 0xF0, 0x00, 0x00, 0x00, 0x12);
    650   TestAddrBaseScaledIndexImm(cmp, ecx, edx, 1, 0xF0, 0xF0, i16, 10, 0x66, 0x81,
    651                              0xBC, 0x11, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00);
    652 
    653   TestAddrBaseScaledIndexImm(cmp, eax, ecx, 1, 0xF0, 0x12, i8, 8, 0x80, 0xBC,
    654                              0x08, 0xF0, 0x00, 0x00, 0x00, 0x12);
    655 
    656   /* cmp Addr, GPR */
    657   TestAddrBaseScaledIndexReg(cmp, eax, ecx, 1, 0xF0, edx, i32, 7, 0x39, 0x94,
    658                              0x08, 0xF0, 0x00, 0x00, 0x00);
    659 
    660   TestAddrBaseScaledIndexReg(cmp, eax, ecx, 1, 0xF0, edx, i16, 8, 0x66, 0x39,
    661                              0x94, 0x08, 0xF0, 0x00, 0x00, 0x00);
    662 
    663   TestAddrBaseScaledIndexReg(cmp, eax, ecx, 1, 0xF0, edx, i8, 7, 0x38, 0x94,
    664                              0x08, 0xF0, 0x00, 0x00, 0x00);
    665 
    666 #undef TestAddrBaseScaledIndexReg
    667 #undef TestAddrBaseScaledIndexImm
    668 #undef TestRegAddrBaseScaledIndex
    669 #undef TestRegAddrScaledIndex
    670 #undef TestRegAddrBase
    671 #undef TestRegAbsoluteAddr
    672 #undef TestRegImm
    673 #undef TestRegReg
    674 }
    675 
    676 TEST_F(AssemblerX8632Test, ScratchpadGettersAndSetters) {
    677   const uint32_t S0 = allocateDword();
    678   const uint32_t S1 = allocateDword();
    679   const uint32_t S2 = allocateDword();
    680   const uint32_t S3 = allocateDword();
    681   AssembledTest test = assemble();
    682   test.setDwordTo(S0, 0xBEEF0000u);
    683   test.setDwordTo(S1, 0xDEADu);
    684   test.setDwordTo(S2, 0x20406080u);
    685   ASSERT_EQ(0xBEEF0000u, test.contentsOfDword(S0));
    686   ASSERT_EQ(0xDEADu, test.contentsOfDword(S1));
    687   ASSERT_EQ(0x20406080u, test.contentsOfDword(S2));
    688   ASSERT_EQ(0xDEADBEEF0000ull, test.contentsOfQword(S0));
    689   ASSERT_EQ(0x204060800000DEADull, test.contentsOfQword(S1));
    690 
    691   test.setQwordTo(S1, 0x1234567890ABCDEFull);
    692   ASSERT_EQ(0x1234567890ABCDEFull, test.contentsOfQword(S1));
    693   test.setDwordTo(S0, 0xBEEF0000u);
    694   ASSERT_EQ(0x90ABCDEFull, test.contentsOfDword(S1));
    695   ASSERT_EQ(0x12345678ull, test.contentsOfDword(S2));
    696 
    697   test.setDwordTo(S0, 1.0f);
    698   ASSERT_FLOAT_EQ(1.0f, test.contentsOfDword<float>(S0));
    699   test.setQwordTo(S0, 3.14);
    700   ASSERT_DOUBLE_EQ(3.14, test.contentsOfQword<double>(S0));
    701 
    702   test.setDqwordTo(S0, Dqword(1.0f, 2.0f, 3.0f, 4.0f));
    703   ASSERT_EQ(Dqword(1.0f, 2.0f, 3.0f, 4.0f), test.contentsOfDqword(S0));
    704   EXPECT_FLOAT_EQ(1.0f, test.contentsOfDword<float>(S0));
    705   EXPECT_FLOAT_EQ(2.0f, test.contentsOfDword<float>(S1));
    706   EXPECT_FLOAT_EQ(3.0f, test.contentsOfDword<float>(S2));
    707   EXPECT_FLOAT_EQ(4.0f, test.contentsOfDword<float>(S3));
    708 }
    709 
    710 } // end of anonymous namespace
    711 } // end of namespace Test
    712 } // end of namespace X8632
    713 } // end of namespace Ice
    714