1 //===- subzero/unittest/AssemblerX8664/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 "AssemblerX8664/TestUtil.h" 10 11 namespace Ice { 12 namespace X8664 { 13 namespace Test { 14 namespace { 15 16 TEST_F(AssemblerX8664LowLevelTest, 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(AssemblerX8664LowLevelTest, 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(AssemblerX8664LowLevelTest, 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(AssemblerX8664LowLevelTest, PopRegs) { 44 __ popl(Encoded_GPR_eax()); 45 __ popl(Encoded_GPR_ebx()); 46 __ popl(Encoded_GPR_ecx()); 47 __ popl(Encoded_GPR_edx()); 48 __ popl(Encoded_GPR_edi()); 49 __ popl(Encoded_GPR_esi()); 50 __ popl(Encoded_GPR_ebp()); 51 __ popl(Encoded_GPR_r8()); 52 __ popl(Encoded_GPR_r9()); 53 __ popl(Encoded_GPR_r10()); 54 __ popl(Encoded_GPR_r11()); 55 __ popl(Encoded_GPR_r12()); 56 __ popl(Encoded_GPR_r13()); 57 __ popl(Encoded_GPR_r14()); 58 __ popl(Encoded_GPR_r15()); 59 60 constexpr size_t ByteCount = 23; 61 ASSERT_EQ(ByteCount, codeBytesSize()); 62 63 constexpr uint8_t Rex_B = 0x41; 64 constexpr uint8_t PopOpcode = 0x58; 65 verifyBytes<ByteCount>( 66 codeBytes(), PopOpcode | Encoded_GPR_eax(), PopOpcode | Encoded_GPR_ebx(), 67 PopOpcode | Encoded_GPR_ecx(), PopOpcode | Encoded_GPR_edx(), 68 PopOpcode | Encoded_GPR_edi(), PopOpcode | Encoded_GPR_esi(), 69 PopOpcode | Encoded_GPR_ebp(), Rex_B, PopOpcode | (Encoded_GPR_r8() & 7), 70 Rex_B, PopOpcode | (Encoded_GPR_r9() & 7), Rex_B, 71 PopOpcode | (Encoded_GPR_r10() & 7), Rex_B, 72 PopOpcode | (Encoded_GPR_r11() & 7), Rex_B, 73 PopOpcode | (Encoded_GPR_r12() & 7), Rex_B, 74 PopOpcode | (Encoded_GPR_r13() & 7), Rex_B, 75 PopOpcode | (Encoded_GPR_r14() & 7), Rex_B, 76 PopOpcode | (Encoded_GPR_r15() & 7)); 77 } 78 79 TEST_F(AssemblerX8664LowLevelTest, PushRegs) { 80 __ pushl(Encoded_GPR_eax()); 81 __ pushl(Encoded_GPR_ebx()); 82 __ pushl(Encoded_GPR_ecx()); 83 __ pushl(Encoded_GPR_edx()); 84 __ pushl(Encoded_GPR_edi()); 85 __ pushl(Encoded_GPR_esi()); 86 __ pushl(Encoded_GPR_ebp()); 87 __ pushl(Encoded_GPR_r8()); 88 __ pushl(Encoded_GPR_r9()); 89 __ pushl(Encoded_GPR_r10()); 90 __ pushl(Encoded_GPR_r11()); 91 __ pushl(Encoded_GPR_r12()); 92 __ pushl(Encoded_GPR_r13()); 93 __ pushl(Encoded_GPR_r14()); 94 __ pushl(Encoded_GPR_r15()); 95 96 constexpr size_t ByteCount = 23; 97 ASSERT_EQ(ByteCount, codeBytesSize()); 98 99 constexpr uint8_t Rex_B = 0x41; 100 constexpr uint8_t PushOpcode = 0x50; 101 verifyBytes<ByteCount>( 102 codeBytes(), PushOpcode | Encoded_GPR_eax(), 103 PushOpcode | Encoded_GPR_ebx(), PushOpcode | Encoded_GPR_ecx(), 104 PushOpcode | Encoded_GPR_edx(), PushOpcode | Encoded_GPR_edi(), 105 PushOpcode | Encoded_GPR_esi(), PushOpcode | Encoded_GPR_ebp(), Rex_B, 106 PushOpcode | (Encoded_GPR_r8() & 7), Rex_B, 107 PushOpcode | (Encoded_GPR_r9() & 7), Rex_B, 108 PushOpcode | (Encoded_GPR_r10() & 7), Rex_B, 109 PushOpcode | (Encoded_GPR_r11() & 7), Rex_B, 110 PushOpcode | (Encoded_GPR_r12() & 7), Rex_B, 111 PushOpcode | (Encoded_GPR_r13() & 7), Rex_B, 112 PushOpcode | (Encoded_GPR_r14() & 7), Rex_B, 113 PushOpcode | (Encoded_GPR_r15() & 7)); 114 } 115 116 TEST_F(AssemblerX8664LowLevelTest, MovRegisterZero) { 117 __ mov(IceType_i32, Encoded_GPR_eax(), Immediate(0x00)); 118 __ mov(IceType_i32, Encoded_GPR_ebx(), Immediate(0x00)); 119 __ mov(IceType_i32, Encoded_GPR_ecx(), Immediate(0x00)); 120 __ mov(IceType_i32, Encoded_GPR_edx(), Immediate(0x00)); 121 __ mov(IceType_i32, Encoded_GPR_edi(), Immediate(0x00)); 122 __ mov(IceType_i32, Encoded_GPR_esi(), Immediate(0x00)); 123 __ mov(IceType_i32, Encoded_GPR_ebp(), Immediate(0x00)); 124 __ mov(IceType_i32, Encoded_GPR_r8(), Immediate(0x00)); 125 __ mov(IceType_i32, Encoded_GPR_r10(), Immediate(0x00)); 126 __ mov(IceType_i32, Encoded_GPR_r11(), Immediate(0x00)); 127 __ mov(IceType_i32, Encoded_GPR_r12(), Immediate(0x00)); 128 __ mov(IceType_i32, Encoded_GPR_r13(), Immediate(0x00)); 129 __ mov(IceType_i32, Encoded_GPR_r14(), Immediate(0x00)); 130 __ mov(IceType_i32, Encoded_GPR_r15(), Immediate(0x00)); 131 132 constexpr uint8_t Rex_B = 0x41; 133 constexpr size_t MovReg32BitImmBytes = 5; 134 constexpr size_t ByteCount = 14 * MovReg32BitImmBytes + 7 /*Rex_B*/; 135 136 ASSERT_EQ(ByteCount, codeBytesSize()); 137 138 constexpr uint8_t MovOpcode = 0xb8; 139 verifyBytes<ByteCount>( 140 codeBytes(), MovOpcode | Encoded_GPR_eax(), 0x00, 0x00, 0x00, 0x00, 141 MovOpcode | Encoded_GPR_ebx(), 0x00, 0x00, 0x00, 0x00, 142 MovOpcode | Encoded_GPR_ecx(), 0x00, 0x00, 0x00, 0x00, 143 MovOpcode | Encoded_GPR_edx(), 0x00, 0x00, 0x00, 0x00, 144 MovOpcode | Encoded_GPR_edi(), 0x00, 0x00, 0x00, 0x00, 145 MovOpcode | Encoded_GPR_esi(), 0x00, 0x00, 0x00, 0x00, 146 MovOpcode | Encoded_GPR_ebp(), 0x00, 0x00, 0x00, 0x00, Rex_B, 147 MovOpcode | (Encoded_GPR_r8() & 7), 0x00, 0x00, 0x00, 0x00, Rex_B, 148 MovOpcode | (Encoded_GPR_r10() & 7), 0x00, 0x00, 0x00, 0x00, Rex_B, 149 MovOpcode | (Encoded_GPR_r11() & 7), 0x00, 0x00, 0x00, 0x00, Rex_B, 150 MovOpcode | (Encoded_GPR_r12() & 7), 0x00, 0x00, 0x00, 0x00, Rex_B, 151 MovOpcode | (Encoded_GPR_r13() & 7), 0x00, 0x00, 0x00, 0x00, Rex_B, 152 MovOpcode | (Encoded_GPR_r14() & 7), 0x00, 0x00, 0x00, 0x00, Rex_B, 153 MovOpcode | (Encoded_GPR_r15() & 7), 0x00, 0x00, 0x00, 0x00); 154 } 155 156 TEST_F(AssemblerX8664LowLevelTest, Cmp) { 157 #define TestRegReg(Inst, Dst, Src, OpType, ByteCountUntyped, ...) \ 158 do { \ 159 static constexpr char TestString[] = \ 160 "(" #Inst ", " #Dst ", " #Src ", " #OpType ", " #ByteCountUntyped \ 161 ", " #__VA_ARGS__ ")"; \ 162 static constexpr uint8_t ByteCount = ByteCountUntyped; \ 163 __ Inst(IceType_##OpType, Encoded_GPR_##Dst(), Encoded_GPR_##Src()); \ 164 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ 165 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ 166 << TestString; \ 167 reset(); \ 168 } while (0) 169 170 #define TestRegImm(Inst, Dst, Imm, OpType, ByteCountUntyped, ...) \ 171 do { \ 172 static constexpr char TestString[] = \ 173 "(" #Inst ", " #Dst ", " #Imm ", " #OpType ", " #ByteCountUntyped \ 174 ", " #__VA_ARGS__ ")"; \ 175 static constexpr uint8_t ByteCount = ByteCountUntyped; \ 176 __ Inst(IceType_##OpType, Encoded_GPR_##Dst(), Immediate(Imm)); \ 177 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ 178 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ 179 << TestString; \ 180 reset(); \ 181 } while (0) 182 183 #define TestRegAbsoluteAddr(Inst, Dst, Disp, OpType, ByteCountUntyped, ...) \ 184 do { \ 185 static constexpr char TestString[] = \ 186 "(" #Inst ", " #Dst ", " #Disp ", " #OpType ", " #ByteCountUntyped \ 187 ", " #__VA_ARGS__ ")"; \ 188 static constexpr uint8_t ByteCount = ByteCountUntyped; \ 189 __ Inst(IceType_##OpType, Encoded_GPR_##Dst(), Address::Absolute(Disp)); \ 190 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ 191 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ 192 << TestString; \ 193 reset(); \ 194 } while (0) 195 196 #define TestRegAddrBase(Inst, Dst, Base, Disp, OpType, ByteCountUntyped, ...) \ 197 do { \ 198 static constexpr char TestString[] = \ 199 "(" #Inst ", " #Dst ", " #Base ", " #Disp ", " #OpType \ 200 ", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \ 201 static constexpr uint8_t ByteCount = ByteCountUntyped; \ 202 __ Inst(IceType_##OpType, Encoded_GPR_##Dst(), \ 203 Address(Encoded_GPR_##Base(), Disp, AssemblerFixup::NoFixup)); \ 204 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ 205 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ 206 << TestString; \ 207 reset(); \ 208 } while (0) 209 210 #define TestRegAddrScaledIndex(Inst, Dst, Index, Scale, Disp, OpType, \ 211 ByteCountUntyped, ...) \ 212 do { \ 213 static constexpr char TestString[] = \ 214 "(" #Inst ", " #Dst ", " #Index ", " #Scale ", " #Disp ", " #OpType \ 215 ", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \ 216 static constexpr uint8_t ByteCount = ByteCountUntyped; \ 217 __ Inst(IceType_##OpType, Encoded_GPR_##Dst(), \ 218 Address(Encoded_GPR_##Index(), Traits::TIMES_##Scale, Disp, \ 219 AssemblerFixup::NoFixup)); \ 220 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ 221 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ 222 << TestString; \ 223 reset(); \ 224 } while (0) 225 226 #define TestRegAddrBaseScaledIndex(Inst, Dst, Base, Index, Scale, Disp, \ 227 OpType, ByteCountUntyped, ...) \ 228 do { \ 229 static constexpr char TestString[] = \ 230 "(" #Inst ", " #Dst ", " #Base ", " #Index ", " #Scale ", " #Disp \ 231 ", " #OpType ", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \ 232 static constexpr uint8_t ByteCount = ByteCountUntyped; \ 233 __ Inst(IceType_##OpType, Encoded_GPR_##Dst(), \ 234 Address(Encoded_GPR_##Base(), Encoded_GPR_##Index(), \ 235 Traits::TIMES_##Scale, Disp, AssemblerFixup::NoFixup)); \ 236 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ 237 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ 238 << TestString; \ 239 reset(); \ 240 } while (0) 241 242 #define TestAddrBaseScaledIndexImm(Inst, Base, Index, Scale, Disp, Imm, \ 243 OpType, ByteCountUntyped, ...) \ 244 do { \ 245 static constexpr char TestString[] = \ 246 "(" #Inst ", " #Base ", " #Index ", " #Scale ", " #Disp ", " #Imm \ 247 ", " #OpType ", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \ 248 static constexpr uint8_t ByteCount = ByteCountUntyped; \ 249 __ Inst(IceType_##OpType, \ 250 Address(Encoded_GPR_##Base(), Encoded_GPR_##Index(), \ 251 Traits::TIMES_##Scale, Disp, AssemblerFixup::NoFixup), \ 252 Immediate(Imm)); \ 253 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ 254 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ 255 << TestString; \ 256 reset(); \ 257 } while (0) 258 259 #define TestAddrBaseScaledIndexReg(Inst, Base, Index, Scale, Disp, Src, \ 260 OpType, ByteCountUntyped, ...) \ 261 do { \ 262 static constexpr char TestString[] = \ 263 "(" #Inst ", " #Base ", " #Index ", " #Scale ", " #Disp ", " #Src \ 264 ", " #OpType ", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \ 265 static constexpr uint8_t ByteCount = ByteCountUntyped; \ 266 __ Inst(IceType_##OpType, \ 267 Address(Encoded_GPR_##Base(), Encoded_GPR_##Index(), \ 268 Traits::TIMES_##Scale, Disp, AssemblerFixup::NoFixup), \ 269 Encoded_GPR_##Src()); \ 270 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ 271 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ 272 << TestString; \ 273 reset(); \ 274 } while (0) 275 276 /* cmp GPR, GPR */ 277 TestRegReg(cmp, eax, ecx, i32, 2, 0x3B, 0xC1); 278 TestRegReg(cmp, ecx, edx, i32, 2, 0x3B, 0xCA); 279 TestRegReg(cmp, edx, ebx, i32, 2, 0x3B, 0xD3); 280 TestRegReg(cmp, ebx, esp, i32, 2, 0x3B, 0xDC); 281 TestRegReg(cmp, esp, ebp, i32, 2, 0x3B, 0xE5); 282 TestRegReg(cmp, ebp, esi, i32, 2, 0x3B, 0xEE); 283 TestRegReg(cmp, esi, edi, i32, 2, 0x3B, 0xF7); 284 TestRegReg(cmp, edi, r8, i32, 3, 0x41, 0x3B, 0xF8); 285 TestRegReg(cmp, r8, r9, i32, 3, 0x45, 0x3B, 0xC1); 286 TestRegReg(cmp, r9, r10, i32, 3, 0x45, 0x3B, 0xCA); 287 TestRegReg(cmp, r10, r11, i32, 3, 0x45, 0x3B, 0xD3); 288 TestRegReg(cmp, r11, r12, i32, 3, 0x45, 0x3B, 0xDC); 289 TestRegReg(cmp, r12, r13, i32, 3, 0x45, 0x3B, 0xE5); 290 TestRegReg(cmp, r13, r14, i32, 3, 0x45, 0x3B, 0xEE); 291 TestRegReg(cmp, r14, r15, i32, 3, 0x45, 0x3B, 0xF7); 292 TestRegReg(cmp, r15, eax, i32, 3, 0x44, 0x3B, 0xF8); 293 294 TestRegReg(cmp, eax, ecx, i16, 3, 0x66, 0x3B, 0xC1); 295 TestRegReg(cmp, ecx, edx, i16, 3, 0x66, 0x3B, 0xCA); 296 TestRegReg(cmp, edx, ebx, i16, 3, 0x66, 0x3B, 0xD3); 297 TestRegReg(cmp, ebx, esp, i16, 3, 0x66, 0x3B, 0xDC); 298 TestRegReg(cmp, esp, ebp, i16, 3, 0x66, 0x3B, 0xE5); 299 TestRegReg(cmp, ebp, esi, i16, 3, 0x66, 0x3B, 0xEE); 300 TestRegReg(cmp, esi, edi, i16, 3, 0x66, 0x3B, 0xF7); 301 TestRegReg(cmp, edi, r8, i16, 4, 0x66, 0x41, 0x3B, 0xF8); 302 TestRegReg(cmp, r8, r9, i16, 4, 0x66, 0x45, 0x3B, 0xC1); 303 TestRegReg(cmp, r9, r10, i16, 4, 0x66, 0x45, 0x3B, 0xCA); 304 TestRegReg(cmp, r10, r11, i16, 4, 0x66, 0x45, 0x3B, 0xD3); 305 TestRegReg(cmp, r11, r12, i16, 4, 0x66, 0x45, 0x3B, 0xDC); 306 TestRegReg(cmp, r12, r13, i16, 4, 0x66, 0x45, 0x3B, 0xE5); 307 TestRegReg(cmp, r13, r14, i16, 4, 0x66, 0x45, 0x3B, 0xEE); 308 TestRegReg(cmp, r14, r15, i16, 4, 0x66, 0x45, 0x3B, 0xF7); 309 TestRegReg(cmp, r15, eax, i16, 4, 0x66, 0x44, 0x3B, 0xF8); 310 311 TestRegReg(cmp, eax, ecx, i8, 2, 0x3A, 0xC1); 312 TestRegReg(cmp, ecx, edx, i8, 2, 0x3A, 0xCA); 313 TestRegReg(cmp, edx, ebx, i8, 2, 0x3A, 0xD3); 314 TestRegReg(cmp, ebx, esp, i8, 2, 0x3A, 0xDC); // emit: cmp bl, ah 315 TestRegReg(cmp, esp, ebp, i8, 3, 0x40, 0x3A, 0xE5); 316 TestRegReg(cmp, ebp, esi, i8, 3, 0x40, 0x3A, 0xEE); 317 TestRegReg(cmp, esi, edi, i8, 3, 0x40, 0x3A, 0xF7); 318 TestRegReg(cmp, edi, r8, i8, 3, 0x41, 0x3A, 0xF8); 319 TestRegReg(cmp, r8, r9, i8, 3, 0x45, 0x3A, 0xC1); 320 TestRegReg(cmp, r9, r10, i8, 3, 0x45, 0x3A, 0xCA); 321 TestRegReg(cmp, r10, r11, i8, 3, 0x45, 0x3A, 0xD3); 322 TestRegReg(cmp, r11, r12, i8, 3, 0x45, 0x3A, 0xDC); 323 TestRegReg(cmp, r12, r13, i8, 3, 0x45, 0x3A, 0xE5); 324 TestRegReg(cmp, r13, r14, i8, 3, 0x45, 0x3A, 0xEE); 325 TestRegReg(cmp, r14, r15, i8, 3, 0x45, 0x3A, 0xF7); 326 TestRegReg(cmp, r15, eax, i8, 3, 0x44, 0x3A, 0xF8); 327 328 /* cmp GPR, Imm8 */ 329 TestRegImm(cmp, eax, 5, i32, 3, 0x83, 0xF8, 0x05); 330 TestRegImm(cmp, ecx, 5, i32, 3, 0x83, 0xF9, 0x05); 331 TestRegImm(cmp, edx, 5, i32, 3, 0x83, 0xFA, 0x05); 332 TestRegImm(cmp, ebx, 5, i32, 3, 0x83, 0xFB, 0x05); 333 TestRegImm(cmp, esp, 5, i32, 3, 0x83, 0xFC, 0x05); 334 TestRegImm(cmp, ebp, 5, i32, 3, 0x83, 0xFD, 0x05); 335 TestRegImm(cmp, esi, 5, i32, 3, 0x83, 0xFE, 0x05); 336 TestRegImm(cmp, edi, 5, i32, 3, 0x83, 0xFF, 0x05); 337 TestRegImm(cmp, r8, 5, i32, 4, 0x41, 0x83, 0xF8, 0x05); 338 TestRegImm(cmp, r9, 5, i32, 4, 0x41, 0x83, 0xF9, 0x05); 339 TestRegImm(cmp, r10, 5, i32, 4, 0x41, 0x83, 0xFA, 0x05); 340 TestRegImm(cmp, r11, 5, i32, 4, 0x41, 0x83, 0xFB, 0x05); 341 TestRegImm(cmp, r12, 5, i32, 4, 0x41, 0x83, 0xFC, 0x05); 342 TestRegImm(cmp, r13, 5, i32, 4, 0x41, 0x83, 0xFD, 0x05); 343 TestRegImm(cmp, r14, 5, i32, 4, 0x41, 0x83, 0xFE, 0x05); 344 TestRegImm(cmp, r15, 5, i32, 4, 0x41, 0x83, 0xFF, 0x05); 345 346 TestRegImm(cmp, eax, 5, i16, 4, 0x66, 0x83, 0xF8, 0x05); 347 TestRegImm(cmp, ecx, 5, i16, 4, 0x66, 0x83, 0xF9, 0x05); 348 TestRegImm(cmp, edx, 5, i16, 4, 0x66, 0x83, 0xFA, 0x05); 349 TestRegImm(cmp, ebx, 5, i16, 4, 0x66, 0x83, 0xFB, 0x05); 350 TestRegImm(cmp, esp, 5, i16, 4, 0x66, 0x83, 0xFC, 0x05); 351 TestRegImm(cmp, ebp, 5, i16, 4, 0x66, 0x83, 0xFD, 0x05); 352 TestRegImm(cmp, esi, 5, i16, 4, 0x66, 0x83, 0xFE, 0x05); 353 TestRegImm(cmp, edi, 5, i16, 4, 0x66, 0x83, 0xFF, 0x05); 354 TestRegImm(cmp, r8, 5, i16, 5, 0x66, 0x41, 0x83, 0xF8, 0x05); 355 TestRegImm(cmp, r9, 5, i16, 5, 0x66, 0x41, 0x83, 0xF9, 0x05); 356 TestRegImm(cmp, r10, 5, i16, 5, 0x66, 0x41, 0x83, 0xFA, 0x05); 357 TestRegImm(cmp, r11, 5, i16, 5, 0x66, 0x41, 0x83, 0xFB, 0x05); 358 TestRegImm(cmp, r12, 5, i16, 5, 0x66, 0x41, 0x83, 0xFC, 0x05); 359 TestRegImm(cmp, r13, 5, i16, 5, 0x66, 0x41, 0x83, 0xFD, 0x05); 360 TestRegImm(cmp, r14, 5, i16, 5, 0x66, 0x41, 0x83, 0xFE, 0x05); 361 TestRegImm(cmp, r15, 5, i16, 5, 0x66, 0x41, 0x83, 0xFF, 0x05); 362 363 TestRegImm(cmp, eax, 5, i8, 2, 0x3C, 0x05); 364 TestRegImm(cmp, ecx, 5, i8, 3, 0x80, 0xF9, 0x05); 365 TestRegImm(cmp, edx, 5, i8, 3, 0x80, 0xFA, 0x05); 366 TestRegImm(cmp, ebx, 5, i8, 3, 0x80, 0xFB, 0x05); 367 TestRegImm(cmp, esp, 5, i8, 3, 0x80, 0xFC, 0x05); // emit: cmp ah, 5 368 TestRegImm(cmp, ebp, 5, i8, 4, 0x40, 0x80, 0xFD, 0x05); 369 TestRegImm(cmp, esi, 5, i8, 4, 0x40, 0x80, 0xFE, 0x05); 370 TestRegImm(cmp, edi, 5, i8, 4, 0x40, 0x80, 0xFF, 0x05); 371 TestRegImm(cmp, r8, 5, i8, 4, 0x41, 0x80, 0xF8, 0x05); 372 TestRegImm(cmp, r9, 5, i8, 4, 0x41, 0x80, 0xF9, 0x05); 373 TestRegImm(cmp, r10, 5, i8, 4, 0x41, 0x80, 0xFA, 0x05); 374 TestRegImm(cmp, r11, 5, i8, 4, 0x41, 0x80, 0xFB, 0x05); 375 TestRegImm(cmp, r12, 5, i8, 4, 0x41, 0x80, 0xFC, 0x05); 376 TestRegImm(cmp, r13, 5, i8, 4, 0x41, 0x80, 0xFD, 0x05); 377 TestRegImm(cmp, r14, 5, i8, 4, 0x41, 0x80, 0xFE, 0x05); 378 TestRegImm(cmp, r15, 5, i8, 4, 0x41, 0x80, 0xFF, 0x05); 379 380 /* cmp GPR, Imm16 */ 381 TestRegImm(cmp, eax, 0x100, i32, 5, 0x3D, 0x00, 0x01, 0x00, 0x00); 382 TestRegImm(cmp, ecx, 0x100, i32, 6, 0x81, 0xF9, 0x00, 0x01, 0x00, 0x00); 383 TestRegImm(cmp, edx, 0x100, i32, 6, 0x81, 0xFA, 0x00, 0x01, 0x00, 0x00); 384 TestRegImm(cmp, ebx, 0x100, i32, 6, 0x81, 0xFB, 0x00, 0x01, 0x00, 0x00); 385 TestRegImm(cmp, esp, 0x100, i32, 6, 0x81, 0xFC, 0x00, 0x01, 0x00, 0x00); 386 TestRegImm(cmp, ebp, 0x100, i32, 6, 0x81, 0xFD, 0x00, 0x01, 0x00, 0x00); 387 TestRegImm(cmp, esi, 0x100, i32, 6, 0x81, 0xFE, 0x00, 0x01, 0x00, 0x00); 388 TestRegImm(cmp, edi, 0x100, i32, 6, 0x81, 0xFF, 0x00, 0x01, 0x00, 0x00); 389 TestRegImm(cmp, r8, 0x100, i32, 7, 0x41, 0x81, 0xF8, 0x00, 0x01, 0x00, 0x00); 390 TestRegImm(cmp, r9, 0x100, i32, 7, 0x41, 0x81, 0xF9, 0x00, 0x01, 0x00, 0x00); 391 TestRegImm(cmp, r10, 0x100, i32, 7, 0x41, 0x81, 0xFA, 0x00, 0x01, 0x00, 0x00); 392 TestRegImm(cmp, r11, 0x100, i32, 7, 0x41, 0x81, 0xFB, 0x00, 0x01, 0x00, 0x00); 393 TestRegImm(cmp, r12, 0x100, i32, 7, 0x41, 0x81, 0xFC, 0x00, 0x01, 0x00, 0x00); 394 TestRegImm(cmp, r13, 0x100, i32, 7, 0x41, 0x81, 0xFD, 0x00, 0x01, 0x00, 0x00); 395 TestRegImm(cmp, r14, 0x100, i32, 7, 0x41, 0x81, 0xFE, 0x00, 0x01, 0x00, 0x00); 396 TestRegImm(cmp, r15, 0x100, i32, 7, 0x41, 0x81, 0xFF, 0x00, 0x01, 0x00, 0x00); 397 398 TestRegImm(cmp, eax, 0x100, i16, 4, 0x66, 0x3D, 0x00, 0x01); 399 TestRegImm(cmp, ecx, 0x100, i16, 5, 0x66, 0x81, 0xF9, 0x00, 0x01); 400 TestRegImm(cmp, edx, 0x100, i16, 5, 0x66, 0x81, 0xFA, 0x00, 0x01); 401 TestRegImm(cmp, ebx, 0x100, i16, 5, 0x66, 0x81, 0xFB, 0x00, 0x01); 402 TestRegImm(cmp, esp, 0x100, i16, 5, 0x66, 0x81, 0xFC, 0x00, 0x01); 403 TestRegImm(cmp, ebp, 0x100, i16, 5, 0x66, 0x81, 0xFD, 0x00, 0x01); 404 TestRegImm(cmp, esi, 0x100, i16, 5, 0x66, 0x81, 0xFE, 0x00, 0x01); 405 TestRegImm(cmp, edi, 0x100, i16, 5, 0x66, 0x81, 0xFF, 0x00, 0x01); 406 TestRegImm(cmp, r8, 0x100, i16, 6, 0x66, 0x41, 0x81, 0xF8, 0x00, 0x01); 407 TestRegImm(cmp, r9, 0x100, i16, 6, 0x66, 0x41, 0x81, 0xF9, 0x00, 0x01); 408 TestRegImm(cmp, r10, 0x100, i16, 6, 0x66, 0x41, 0x81, 0xFA, 0x00, 0x01); 409 TestRegImm(cmp, r11, 0x100, i16, 6, 0x66, 0x41, 0x81, 0xFB, 0x00, 0x01); 410 TestRegImm(cmp, r12, 0x100, i16, 6, 0x66, 0x41, 0x81, 0xFC, 0x00, 0x01); 411 TestRegImm(cmp, r13, 0x100, i16, 6, 0x66, 0x41, 0x81, 0xFD, 0x00, 0x01); 412 TestRegImm(cmp, r14, 0x100, i16, 6, 0x66, 0x41, 0x81, 0xFE, 0x00, 0x01); 413 TestRegImm(cmp, r15, 0x100, i16, 6, 0x66, 0x41, 0x81, 0xFF, 0x00, 0x01); 414 415 /* cmp GPR, Absolute */ 416 TestRegAbsoluteAddr(cmp, eax, 0xF00FBEEF, i32, 8, 0x67, 0x3B, 0x04, 0x25, 417 0xEF, 0xBE, 0x0F, 0xF0); 418 TestRegAbsoluteAddr(cmp, eax, 0xF00FBEEF, i16, 9, 0x66, 0x67, 0x3B, 0x04, 419 0x25, 0xEF, 0xBE, 0x0F, 0xF0); 420 TestRegAbsoluteAddr(cmp, eax, 0xF00FBEEF, i8, 8, 0x67, 0x3A, 0x04, 0x25, 0xEF, 421 0xBE, 0x0F, 0xF0); 422 TestRegAbsoluteAddr(cmp, r8, 0xF00FBEEF, i32, 9, 0x67, 0x44, 0x3B, 0x04, 0x25, 423 0xEF, 0xBE, 0x0F, 0xF0); 424 TestRegAbsoluteAddr(cmp, r8, 0xF00FBEEF, i16, 10, 0x66, 0x67, 0x44, 0x3B, 425 0x04, 0x25, 0xEF, 0xBE, 0x0F, 0xF0); 426 TestRegAbsoluteAddr(cmp, r8, 0xF00FBEEF, i8, 9, 0x67, 0x44, 0x3A, 0x04, 0x25, 427 0xEF, 0xBE, 0x0F, 0xF0); 428 429 /* cmp GPR, 0(Base) */ 430 TestRegAddrBase(cmp, eax, ecx, 0, i32, 3, 0x67, 0x3B, 0x01); 431 TestRegAddrBase(cmp, ecx, edx, 0, i32, 3, 0x67, 0x3B, 0x0A); 432 TestRegAddrBase(cmp, edx, ebx, 0, i32, 3, 0x67, 0x3B, 0x13); 433 TestRegAddrBase(cmp, ebx, esp, 0, i32, 4, 0x67, 0x3B, 0x1C, 0x24); 434 TestRegAddrBase(cmp, esp, ebp, 0, i32, 4, 0x67, 0x3B, 0x65, 0x00); 435 TestRegAddrBase(cmp, ebp, esi, 0, i32, 3, 0x67, 0x3B, 0x2E); 436 TestRegAddrBase(cmp, esi, edi, 0, i32, 3, 0x67, 0x3B, 0x37); 437 TestRegAddrBase(cmp, edi, r8, 0, i32, 4, 0x67, 0x41, 0x3B, 0x38); 438 TestRegAddrBase(cmp, r8, r9, 0, i32, 4, 0x67, 0x45, 0x3B, 0x01); 439 TestRegAddrBase(cmp, r9, r10, 0, i32, 4, 0x67, 0x45, 0x3B, 0x0A); 440 TestRegAddrBase(cmp, r10, r11, 0, i32, 4, 0x67, 0x45, 0x3B, 0x13); 441 TestRegAddrBase(cmp, r11, r12, 0, i32, 5, 0x67, 0x45, 0x3B, 0x1C, 0x24); 442 TestRegAddrBase(cmp, r12, r13, 0, i32, 5, 0x67, 0x45, 0x3B, 0x65, 0x00); 443 TestRegAddrBase(cmp, r13, r14, 0, i32, 4, 0x67, 0x45, 0x3B, 0x2E); 444 TestRegAddrBase(cmp, r14, r15, 0, i32, 4, 0x67, 0x45, 0x3B, 0x37); 445 TestRegAddrBase(cmp, r15, eax, 0, i32, 4, 0x67, 0x44, 0x3B, 0x38); 446 447 TestRegAddrBase(cmp, eax, ecx, 0, i16, 4, 0x66, 0x67, 0x3B, 0x01); 448 TestRegAddrBase(cmp, ecx, edx, 0, i16, 4, 0x66, 0x67, 0x3B, 0x0A); 449 TestRegAddrBase(cmp, edx, ebx, 0, i16, 4, 0x66, 0x67, 0x3B, 0x13); 450 TestRegAddrBase(cmp, ebx, esp, 0, i16, 5, 0x66, 0x67, 0x3B, 0x1C, 0x24); 451 TestRegAddrBase(cmp, esp, ebp, 0, i16, 5, 0x66, 0x67, 0x3B, 0x65, 0x00); 452 TestRegAddrBase(cmp, ebp, esi, 0, i16, 4, 0x66, 0x67, 0x3B, 0x2E); 453 TestRegAddrBase(cmp, esi, edi, 0, i16, 4, 0x66, 0x67, 0x3B, 0x37); 454 TestRegAddrBase(cmp, edi, r8, 0, i16, 5, 0x66, 0x67, 0x41, 0x3B, 0x38); 455 TestRegAddrBase(cmp, r8, r9, 0, i16, 5, 0x66, 0x67, 0x45, 0x3B, 0x01); 456 TestRegAddrBase(cmp, r9, r10, 0, i16, 5, 0x66, 0x67, 0x45, 0x3B, 0x0A); 457 TestRegAddrBase(cmp, r10, r11, 0, i16, 5, 0x66, 0x67, 0x45, 0x3B, 0x13); 458 TestRegAddrBase(cmp, r11, r12, 0, i16, 6, 0x66, 0x67, 0x45, 0x3B, 0x1C, 0x24); 459 TestRegAddrBase(cmp, r12, r13, 0, i16, 6, 0x66, 0x67, 0x45, 0x3B, 0x65, 0x00); 460 TestRegAddrBase(cmp, r13, r14, 0, i16, 5, 0x66, 0x67, 0x45, 0x3B, 0x2E); 461 TestRegAddrBase(cmp, r14, r15, 0, i16, 5, 0x66, 0x67, 0x45, 0x3B, 0x37); 462 TestRegAddrBase(cmp, r15, eax, 0, i16, 5, 0x66, 0x67, 0x44, 0x3B, 0x38); 463 464 TestRegAddrBase(cmp, eax, ecx, 0, i8, 3, 0x67, 0x3A, 0x01); 465 TestRegAddrBase(cmp, ecx, edx, 0, i8, 3, 0x67, 0x3A, 0x0A); 466 TestRegAddrBase(cmp, edx, ebx, 0, i8, 3, 0x67, 0x3A, 0x13); 467 TestRegAddrBase(cmp, ebx, esp, 0, i8, 4, 0x67, 0x3A, 0x1C, 0x24); 468 TestRegAddrBase(cmp, esp, ebp, 0, i8, 4, 0x67, 0x3A, 0x65, 0x00); 469 TestRegAddrBase(cmp, ebp, esi, 0, i8, 4, 0x67, 0x40, 0x3A, 0x2E); 470 TestRegAddrBase(cmp, esi, edi, 0, i8, 4, 0x67, 0x40, 0x3A, 0x37); 471 TestRegAddrBase(cmp, edi, r8, 0, i8, 4, 0x67, 0x41, 0x3A, 0x38); 472 TestRegAddrBase(cmp, r8, r9, 0, i8, 4, 0x67, 0x45, 0x3A, 0x01); 473 TestRegAddrBase(cmp, r9, r10, 0, i8, 4, 0x67, 0x45, 0x3A, 0x0A); 474 TestRegAddrBase(cmp, r10, r11, 0, i8, 4, 0x67, 0x45, 0x3A, 0x13); 475 TestRegAddrBase(cmp, r11, r12, 0, i8, 5, 0x67, 0x45, 0x3A, 0x1C, 0x24); 476 TestRegAddrBase(cmp, r12, r13, 0, i8, 5, 0x67, 0x45, 0x3A, 0x65, 0x00); 477 TestRegAddrBase(cmp, r13, r14, 0, i8, 4, 0x67, 0x45, 0x3A, 0x2E); 478 TestRegAddrBase(cmp, r14, r15, 0, i8, 4, 0x67, 0x45, 0x3A, 0x37); 479 TestRegAddrBase(cmp, r15, eax, 0, i8, 4, 0x67, 0x44, 0x3A, 0x38); 480 481 /* cmp GPR, Imm8(Base) */ 482 TestRegAddrBase(cmp, eax, ecx, 0x40, i32, 4, 0x67, 0x3B, 0x41, 0x40); 483 TestRegAddrBase(cmp, ecx, edx, 0x40, i32, 4, 0x67, 0x3B, 0x4A, 0x40); 484 TestRegAddrBase(cmp, edx, ebx, 0x40, i32, 4, 0x67, 0x3B, 0x53, 0x40); 485 TestRegAddrBase(cmp, ebx, esp, 0x40, i32, 5, 0x67, 0x3B, 0x5C, 0x24, 0x40); 486 TestRegAddrBase(cmp, esp, ebp, 0x40, i32, 4, 0x67, 0x3B, 0x65, 0x40); 487 TestRegAddrBase(cmp, ebp, esi, 0x40, i32, 4, 0x67, 0x3B, 0x6E, 0x40); 488 TestRegAddrBase(cmp, esi, edi, 0x40, i32, 4, 0x67, 0x3B, 0x77, 0x40); 489 TestRegAddrBase(cmp, edi, r8, 0x40, i32, 5, 0x67, 0x41, 0x3B, 0x78, 0x40); 490 TestRegAddrBase(cmp, r8, r9, 0x40, i32, 5, 0x67, 0x45, 0x3B, 0x41, 0x40); 491 TestRegAddrBase(cmp, r9, r10, 0x40, i32, 5, 0x67, 0x45, 0x3B, 0x4A, 0x40); 492 TestRegAddrBase(cmp, r10, r11, 0x40, i32, 5, 0x67, 0x45, 0x3B, 0x53, 0x40); 493 TestRegAddrBase(cmp, r11, r12, 0x40, i32, 6, 0x67, 0x45, 0x3B, 0x5C, 0x24, 494 0x40); 495 TestRegAddrBase(cmp, r12, r13, 0x40, i32, 5, 0x67, 0x45, 0x3B, 0x65, 0x40); 496 TestRegAddrBase(cmp, r13, r14, 0x40, i32, 5, 0x67, 0x45, 0x3B, 0x6E, 0x40); 497 TestRegAddrBase(cmp, r14, r15, 0x40, i32, 5, 0x67, 0x45, 0x3B, 0x77, 0x40); 498 TestRegAddrBase(cmp, r15, eax, 0x40, i32, 5, 0x67, 0x44, 0x3B, 0x78, 0x40); 499 500 TestRegAddrBase(cmp, eax, ecx, 0x40, i16, 5, 0x66, 0x67, 0x3B, 0x41, 0x40); 501 TestRegAddrBase(cmp, ecx, edx, 0x40, i16, 5, 0x66, 0x67, 0x3B, 0x4A, 0x40); 502 TestRegAddrBase(cmp, edx, ebx, 0x40, i16, 5, 0x66, 0x67, 0x3B, 0x53, 0x40); 503 TestRegAddrBase(cmp, ebx, esp, 0x40, i16, 6, 0x66, 0x67, 0x3B, 0x5C, 0x24, 504 0x40); 505 TestRegAddrBase(cmp, esp, ebp, 0x40, i16, 5, 0x66, 0x67, 0x3B, 0x65, 0x40); 506 TestRegAddrBase(cmp, ebp, esi, 0x40, i16, 5, 0x66, 0x67, 0x3B, 0x6E, 0x40); 507 TestRegAddrBase(cmp, esi, edi, 0x40, i16, 5, 0x66, 0x67, 0x3B, 0x77, 0x40); 508 TestRegAddrBase(cmp, edi, r8, 0x40, i16, 6, 0x66, 0x67, 0x41, 0x3B, 0x78, 509 0x40); 510 TestRegAddrBase(cmp, r8, r9, 0x40, i16, 6, 0x66, 0x67, 0x45, 0x3B, 0x41, 511 0x40); 512 TestRegAddrBase(cmp, r9, r10, 0x40, i16, 6, 0x66, 0x67, 0x45, 0x3B, 0x4A, 513 0x40); 514 TestRegAddrBase(cmp, r10, r11, 0x40, i16, 6, 0x66, 0x67, 0x45, 0x3B, 0x53, 515 0x40); 516 TestRegAddrBase(cmp, r11, r12, 0x40, i16, 7, 0x66, 0x67, 0x45, 0x3B, 0x5C, 517 0x24, 0x40); 518 TestRegAddrBase(cmp, r12, r13, 0x40, i16, 6, 0x66, 0x67, 0x45, 0x3B, 0x65, 519 0x40); 520 TestRegAddrBase(cmp, r13, r14, 0x40, i16, 6, 0x66, 0x67, 0x45, 0x3B, 0x6E, 521 0x40); 522 TestRegAddrBase(cmp, r14, r15, 0x40, i16, 6, 0x66, 0x67, 0x45, 0x3B, 0x77, 523 0x40); 524 TestRegAddrBase(cmp, r15, eax, 0x40, i16, 6, 0x66, 0x67, 0x44, 0x3B, 0x78, 525 0x40); 526 527 TestRegAddrBase(cmp, eax, ecx, 0x40, i8, 4, 0x67, 0x3A, 0x41, 0x40); 528 TestRegAddrBase(cmp, ecx, edx, 0x40, i8, 4, 0x67, 0x3A, 0x4A, 0x40); 529 TestRegAddrBase(cmp, edx, ebx, 0x40, i8, 4, 0x67, 0x3A, 0x53, 0x40); 530 TestRegAddrBase(cmp, ebx, esp, 0x40, i8, 5, 0x67, 0x3A, 0x5C, 0x24, 0x40); 531 TestRegAddrBase(cmp, esp, ebp, 0x40, i8, 4, 0x67, 0x3A, 0x65, 0x40); 532 TestRegAddrBase(cmp, ebp, esi, 0x40, i8, 5, 0x67, 0x40, 0x3A, 0x6E, 0x40); 533 TestRegAddrBase(cmp, esi, edi, 0x40, i8, 5, 0x67, 0x40, 0x3A, 0x77, 0x40); 534 TestRegAddrBase(cmp, edi, r8, 0x40, i8, 5, 0x67, 0x41, 0x3A, 0x78, 0x40); 535 TestRegAddrBase(cmp, r8, r9, 0x40, i8, 5, 0x67, 0x45, 0x3A, 0x41, 0x40); 536 TestRegAddrBase(cmp, r9, r10, 0x40, i8, 5, 0x67, 0x45, 0x3A, 0x4A, 0x40); 537 TestRegAddrBase(cmp, r10, r11, 0x40, i8, 5, 0x67, 0x45, 0x3A, 0x53, 0x40); 538 TestRegAddrBase(cmp, r11, r12, 0x40, i8, 6, 0x67, 0x45, 0x3A, 0x5C, 0x24, 539 0x40); 540 TestRegAddrBase(cmp, r12, r13, 0x40, i8, 5, 0x67, 0x45, 0x3A, 0x65, 0x40); 541 TestRegAddrBase(cmp, r13, r14, 0x40, i8, 5, 0x67, 0x45, 0x3A, 0x6E, 0x40); 542 TestRegAddrBase(cmp, r14, r15, 0x40, i8, 5, 0x67, 0x45, 0x3A, 0x77, 0x40); 543 TestRegAddrBase(cmp, r15, eax, 0x40, i8, 5, 0x67, 0x44, 0x3A, 0x78, 0x40); 544 545 /* cmp GPR, Imm32(Base) */ 546 TestRegAddrBase(cmp, eax, ecx, 0xF0, i32, 7, 0x67, 0x3B, 0x81, 0xF0, 0x00, 547 0x00, 0x00); 548 TestRegAddrBase(cmp, ecx, edx, 0xF0, i32, 7, 0x67, 0x3B, 0x8A, 0xF0, 0x00, 549 0x00, 0x00); 550 TestRegAddrBase(cmp, edx, ebx, 0xF0, i32, 7, 0x67, 0x3B, 0x93, 0xF0, 0x00, 551 0x00, 0x00); 552 TestRegAddrBase(cmp, ebx, esp, 0xF0, i32, 8, 0x67, 0x3B, 0x9C, 0x24, 0xF0, 553 0x00, 0x00, 0x00); 554 TestRegAddrBase(cmp, esp, ebp, 0xF0, i32, 7, 0x67, 0x3B, 0xA5, 0xF0, 0x00, 555 0x00, 0x00); 556 TestRegAddrBase(cmp, ebp, esi, 0xF0, i32, 7, 0x67, 0x3B, 0xAE, 0xF0, 0x00, 557 0x00, 0x00); 558 TestRegAddrBase(cmp, esi, edi, 0xF0, i32, 7, 0x67, 0x3B, 0xB7, 0xF0, 0x00, 559 0x00, 0x00); 560 TestRegAddrBase(cmp, edi, r8, 0xF0, i32, 8, 0x67, 0x41, 0x3B, 0xB8, 0xF0, 561 0x00, 0x00, 0x00); 562 TestRegAddrBase(cmp, r8, r9, 0xF0, i32, 8, 0x67, 0x45, 0x3B, 0x81, 0xF0, 0x00, 563 0x00, 0x00); 564 TestRegAddrBase(cmp, r9, r10, 0xF0, i32, 8, 0x67, 0x45, 0x3B, 0x8A, 0xF0, 565 0x00, 0x00, 0x00); 566 TestRegAddrBase(cmp, r10, r11, 0xF0, i32, 8, 0x67, 0x45, 0x3B, 0x93, 0xF0, 567 0x00, 0x00, 0x00); 568 TestRegAddrBase(cmp, r11, r12, 0xF0, i32, 9, 0x67, 0x45, 0x3B, 0x9C, 0x24, 569 0xF0, 0x00, 0x00, 0x00); 570 TestRegAddrBase(cmp, r12, r13, 0xF0, i32, 8, 0x67, 0x45, 0x3B, 0xA5, 0xF0, 571 0x00, 0x00, 0x00); 572 TestRegAddrBase(cmp, r13, r14, 0xF0, i32, 8, 0x67, 0x45, 0x3B, 0xAE, 0xF0, 573 0x00, 0x00, 0x00); 574 TestRegAddrBase(cmp, r14, r15, 0xF0, i32, 8, 0x67, 0x45, 0x3B, 0xB7, 0xF0, 575 0x00, 0x00, 0x00); 576 TestRegAddrBase(cmp, r15, eax, 0xF0, i32, 8, 0x67, 0x44, 0x3B, 0xB8, 0xF0, 577 0x00, 0x00, 0x00); 578 579 TestRegAddrBase(cmp, eax, ecx, 0xF0, i16, 8, 0x66, 0x67, 0x3B, 0x81, 0xF0, 580 0x00, 0x00, 0x00); 581 TestRegAddrBase(cmp, ecx, edx, 0xF0, i16, 8, 0x66, 0x67, 0x3B, 0x8A, 0xF0, 582 0x00, 0x00, 0x00); 583 TestRegAddrBase(cmp, edx, ebx, 0xF0, i16, 8, 0x66, 0x67, 0x3B, 0x93, 0xF0, 584 0x00, 0x00, 0x00); 585 TestRegAddrBase(cmp, ebx, esp, 0xF0, i16, 9, 0x66, 0x67, 0x3B, 0x9C, 0x24, 586 0xF0, 0x00, 0x00, 0x00); 587 TestRegAddrBase(cmp, esp, ebp, 0xF0, i16, 8, 0x66, 0x67, 0x3B, 0xa5, 0xF0, 588 0x00, 0x00, 0x00); 589 TestRegAddrBase(cmp, ebp, esi, 0xF0, i16, 8, 0x66, 0x67, 0x3B, 0xaE, 0xF0, 590 0x00, 0x00, 0x00); 591 TestRegAddrBase(cmp, esi, edi, 0xF0, i16, 8, 0x66, 0x67, 0x3B, 0xb7, 0xF0, 592 0x00, 0x00, 0x00); 593 TestRegAddrBase(cmp, edi, r8, 0xF0, i16, 9, 0x66, 0x67, 0x41, 0x3B, 0xb8, 594 0xF0, 0x00, 0x00, 0x00); 595 TestRegAddrBase(cmp, r8, r9, 0xF0, i16, 9, 0x66, 0x67, 0x45, 0x3B, 0x81, 0xF0, 596 0x00, 0x00, 0x00); 597 TestRegAddrBase(cmp, r9, r10, 0xF0, i16, 9, 0x66, 0x67, 0x45, 0x3B, 0x8A, 598 0xF0, 0x00, 0x00, 0x00); 599 TestRegAddrBase(cmp, r10, r11, 0xF0, i16, 9, 0x66, 0x67, 0x45, 0x3B, 0x93, 600 0xF0, 0x00, 0x00, 0x00); 601 TestRegAddrBase(cmp, r11, r12, 0xF0, i16, 10, 0x66, 0x67, 0x45, 0x3B, 0x9C, 602 0x24, 0xF0, 0x00, 0x00, 0x00); 603 TestRegAddrBase(cmp, r12, r13, 0xF0, i16, 9, 0x66, 0x67, 0x45, 0x3B, 0xa5, 604 0xF0, 0x00, 0x00, 0x00); 605 TestRegAddrBase(cmp, r13, r14, 0xF0, i16, 9, 0x66, 0x67, 0x45, 0x3B, 0xaE, 606 0xF0, 0x00, 0x00, 0x00); 607 TestRegAddrBase(cmp, r14, r15, 0xF0, i16, 9, 0x66, 0x67, 0x45, 0x3B, 0xb7, 608 0xF0, 0x00, 0x00, 0x00); 609 TestRegAddrBase(cmp, r15, eax, 0xF0, i16, 9, 0x66, 0x67, 0x44, 0x3B, 0xb8, 610 0xF0, 0x00, 0x00, 0x00); 611 612 TestRegAddrBase(cmp, eax, ecx, 0xF0, i8, 7, 0x67, 0x3A, 0x81, 0xF0, 0x00, 613 0x00, 0x00); 614 TestRegAddrBase(cmp, ecx, edx, 0xF0, i8, 7, 0x67, 0x3A, 0x8A, 0xF0, 0x00, 615 0x00, 0x00); 616 TestRegAddrBase(cmp, edx, ebx, 0xF0, i8, 7, 0x67, 0x3A, 0x93, 0xF0, 0x00, 617 0x00, 0x00); 618 TestRegAddrBase(cmp, ebx, esp, 0xF0, i8, 8, 0x67, 0x3A, 0x9C, 0x24, 0xF0, 619 0x00, 0x00, 0x00); 620 TestRegAddrBase(cmp, esp, ebp, 0xF0, i8, 7, 0x67, 0x3A, 0xA5, 0xF0, 0x00, 621 0x00, 0x00); 622 TestRegAddrBase(cmp, ebp, esi, 0xF0, i8, 8, 0x67, 0x40, 0x3A, 0xAE, 0xF0, 623 0x00, 0x00, 0x00); 624 TestRegAddrBase(cmp, esi, edi, 0xF0, i8, 8, 0x67, 0x40, 0x3A, 0xB7, 0xF0, 625 0x00, 0x00, 0x00); 626 TestRegAddrBase(cmp, edi, r8, 0xF0, i8, 8, 0x67, 0x41, 0x3A, 0xB8, 0xF0, 0x00, 627 0x00, 0x00); 628 TestRegAddrBase(cmp, r8, r9, 0xF0, i8, 8, 0x67, 0x45, 0x3A, 0x81, 0xF0, 0x00, 629 0x00, 0x00); 630 TestRegAddrBase(cmp, r9, r10, 0xF0, i8, 8, 0x67, 0x45, 0x3A, 0x8A, 0xF0, 0x00, 631 0x00, 0x00); 632 TestRegAddrBase(cmp, r10, r11, 0xF0, i8, 8, 0x67, 0x45, 0x3A, 0x93, 0xF0, 633 0x00, 0x00, 0x00); 634 TestRegAddrBase(cmp, r11, r12, 0xF0, i8, 9, 0x67, 0x45, 0x3A, 0x9C, 0x24, 635 0xF0, 0x00, 0x00, 0x00); 636 TestRegAddrBase(cmp, r12, r13, 0xF0, i8, 8, 0x67, 0x45, 0x3A, 0xA5, 0xF0, 637 0x00, 0x00, 0x00); 638 TestRegAddrBase(cmp, r13, r14, 0xF0, i8, 8, 0x67, 0x45, 0x3A, 0xAE, 0xF0, 639 0x00, 0x00, 0x00); 640 TestRegAddrBase(cmp, r14, r15, 0xF0, i8, 8, 0x67, 0x45, 0x3A, 0xB7, 0xF0, 641 0x00, 0x00, 0x00); 642 TestRegAddrBase(cmp, r15, eax, 0xF0, i8, 8, 0x67, 0x44, 0x3A, 0xB8, 0xF0, 643 0x00, 0x00, 0x00); 644 645 /* cmp GPR, Imm(,Index,Scale) */ 646 TestRegAddrScaledIndex(cmp, eax, ecx, 1, 0, i32, 8, 0x67, 0x3B, 0x04, 0x0D, 647 0x00, 0x00, 0x00, 0x00); 648 TestRegAddrScaledIndex(cmp, ecx, edx, 2, 0, i32, 8, 0x67, 0x3B, 0x0C, 0x55, 649 0x00, 0x00, 0x00, 0x00); 650 TestRegAddrScaledIndex(cmp, edx, ebx, 4, 0, i32, 8, 0x67, 0x3B, 0x14, 0x9D, 651 0x00, 0x00, 0x00, 0x00); 652 TestRegAddrScaledIndex(cmp, r8, r9, 1, 0, i32, 9, 0x67, 0x46, 0x3B, 0x04, 653 0x0D, 0x00, 0x00, 0x00, 0x00); 654 TestRegAddrScaledIndex(cmp, r9, r10, 2, 0, i32, 9, 0x67, 0x46, 0x3B, 0x0C, 655 0x55, 0x00, 0x00, 0x00, 0x00); 656 TestRegAddrScaledIndex(cmp, r10, r11, 4, 0, i32, 9, 0x67, 0x46, 0x3B, 0x14, 657 0x9D, 0x00, 0x00, 0x00, 0x00); 658 // esp cannot be an scaled index. 659 TestRegAddrScaledIndex(cmp, esp, ebp, 8, 0, i32, 8, 0x67, 0x3B, 0x24, 0xED, 660 0x00, 0x00, 0x00, 0x00); 661 TestRegAddrScaledIndex(cmp, ebp, esi, 1, 0, i32, 8, 0x67, 0x3B, 0x2C, 0x35, 662 0x00, 0x00, 0x00, 0x00); 663 TestRegAddrScaledIndex(cmp, esi, edi, 2, 0, i32, 8, 0x67, 0x3B, 0x34, 0x7D, 664 0x00, 0x00, 0x00, 0x00); 665 TestRegAddrScaledIndex(cmp, edi, eax, 4, 0, i32, 8, 0x67, 0x3B, 0x3C, 0x85, 666 0x00, 0x00, 0x00, 0x00); 667 TestRegAddrScaledIndex(cmp, ebx, ecx, 8, 0, i32, 8, 0x67, 0x3B, 0x1C, 0xCD, 668 0x00, 0x00, 0x00, 0x00); 669 TestRegAddrScaledIndex(cmp, r12, r13, 8, 0, i32, 9, 0x67, 0x46, 0x3B, 0x24, 670 0xED, 0x00, 0x00, 0x00, 0x00); 671 TestRegAddrScaledIndex(cmp, r13, r14, 1, 0, i32, 9, 0x67, 0x46, 0x3B, 0x2C, 672 0x35, 0x00, 0x00, 0x00, 0x00); 673 TestRegAddrScaledIndex(cmp, r14, r15, 2, 0, i32, 9, 0x67, 0x46, 0x3B, 0x34, 674 0x7D, 0x00, 0x00, 0x00, 0x00); 675 TestRegAddrScaledIndex(cmp, r15, r8, 4, 0, i32, 9, 0x67, 0x46, 0x3B, 0x3C, 676 0x85, 0x00, 0x00, 0x00, 0x00); 677 TestRegAddrScaledIndex(cmp, r11, r9, 8, 0, i32, 9, 0x67, 0x46, 0x3B, 0x1C, 678 0xCD, 0x00, 0x00, 0x00, 0x00); 679 680 TestRegAddrScaledIndex(cmp, eax, ecx, 8, 0, i16, 9, 0x66, 0x67, 0x3B, 0x04, 681 0xCD, 0x00, 0x00, 0x00, 0x00); 682 TestRegAddrScaledIndex(cmp, ecx, edx, 1, 0, i16, 9, 0x66, 0x67, 0x3B, 0x0C, 683 0x15, 0x00, 0x00, 0x00, 0x00); 684 TestRegAddrScaledIndex(cmp, edx, ebx, 2, 0, i16, 9, 0x66, 0x67, 0x3B, 0x14, 685 0x5D, 0x00, 0x00, 0x00, 0x00); 686 TestRegAddrScaledIndex(cmp, r8, r9, 8, 0, i16, 10, 0x66, 0x67, 0x46, 0x3B, 687 0x04, 0xCD, 0x00, 0x00, 0x00, 0x00); 688 TestRegAddrScaledIndex(cmp, r9, r10, 1, 0, i16, 10, 0x66, 0x67, 0x46, 0x3B, 689 0x0C, 0x15, 0x00, 0x00, 0x00, 0x00); 690 TestRegAddrScaledIndex(cmp, r10, r11, 2, 0, i16, 10, 0x66, 0x67, 0x46, 0x3B, 691 0x14, 0x5D, 0x00, 0x00, 0x00, 0x00); 692 // esp cannot be an scaled index. 693 TestRegAddrScaledIndex(cmp, esp, ebp, 4, 0, i16, 9, 0x66, 0x67, 0x3B, 0x24, 694 0xAD, 0x00, 0x00, 0x00, 0x00); 695 TestRegAddrScaledIndex(cmp, ebp, esi, 8, 0, i16, 9, 0x66, 0x67, 0x3B, 0x2C, 696 0xF5, 0x00, 0x00, 0x00, 0x00); 697 TestRegAddrScaledIndex(cmp, esi, edi, 1, 0, i16, 9, 0x66, 0x67, 0x3B, 0x34, 698 0x3D, 0x00, 0x00, 0x00, 0x00); 699 TestRegAddrScaledIndex(cmp, edi, eax, 2, 0, i16, 9, 0x66, 0x67, 0x3B, 0x3C, 700 0x45, 0x00, 0x00, 0x00, 0x00); 701 TestRegAddrScaledIndex(cmp, ebx, ecx, 8, 0, i16, 9, 0x66, 0x67, 0x3B, 0x1C, 702 0xCD, 0x00, 0x00, 0x00, 0x00); 703 704 TestRegAddrScaledIndex(cmp, eax, ecx, 4, 0, i8, 8, 0x67, 0x3A, 0x04, 0x8D, 705 0x00, 0x00, 0x00, 0x00); 706 TestRegAddrScaledIndex(cmp, ecx, edx, 8, 0, i8, 8, 0x67, 0x3A, 0x0C, 0xD5, 707 0x00, 0x00, 0x00, 0x00); 708 TestRegAddrScaledIndex(cmp, edx, ebx, 1, 0, i8, 8, 0x67, 0x3A, 0x14, 0x1D, 709 0x00, 0x00, 0x00, 0x00); 710 TestRegAddrScaledIndex(cmp, r8, r9, 4, 0, i8, 9, 0x67, 0x46, 0x3A, 0x04, 0x8D, 711 0x00, 0x00, 0x00, 0x00); 712 TestRegAddrScaledIndex(cmp, r9, r10, 8, 0, i8, 9, 0x67, 0x46, 0x3A, 0x0C, 713 0xD5, 0x00, 0x00, 0x00, 0x00); 714 TestRegAddrScaledIndex(cmp, r10, r11, 1, 0, i8, 9, 0x67, 0x46, 0x3A, 0x14, 715 0x1D, 0x00, 0x00, 0x00, 0x00); 716 // esp cannot be an scaled index. 717 TestRegAddrScaledIndex(cmp, esp, ebp, 2, 0, i8, 8, 0x67, 0x3A, 0x24, 0x6D, 718 0x00, 0x00, 0x00, 0x00); 719 TestRegAddrScaledIndex(cmp, ebp, esi, 4, 0, i8, 9, 0x67, 0x40, 0x3A, 0x2C, 720 0xB5, 0x00, 0x00, 0x00, 0x00); 721 TestRegAddrScaledIndex(cmp, esi, edi, 8, 0, i8, 9, 0x67, 0x40, 0x3A, 0x34, 722 0xFD, 0x00, 0x00, 0x00, 0x00); 723 TestRegAddrScaledIndex(cmp, edi, eax, 1, 0, i8, 9, 0x67, 0x40, 0x3A, 0x3C, 724 0x05, 0x00, 0x00, 0x00, 0x00); 725 TestRegAddrScaledIndex(cmp, ebx, ecx, 8, 0, i8, 8, 0x67, 0x3a, 0x1C, 0xCD, 726 0x00, 0x00, 0x00, 0x00); 727 TestRegAddrScaledIndex(cmp, r12, r13, 2, 0, i8, 9, 0x67, 0x46, 0x3A, 0x24, 728 0x6D, 0x00, 0x00, 0x00, 0x00); 729 TestRegAddrScaledIndex(cmp, r13, r14, 4, 0, i8, 9, 0x67, 0x46, 0x3A, 0x2C, 730 0xB5, 0x00, 0x00, 0x00, 0x00); 731 TestRegAddrScaledIndex(cmp, r14, r15, 8, 0, i8, 9, 0x67, 0x46, 0x3A, 0x34, 732 0xFD, 0x00, 0x00, 0x00, 0x00); 733 TestRegAddrScaledIndex(cmp, r15, r8, 1, 0, i8, 9, 0x67, 0x46, 0x3A, 0x3C, 734 0x05, 0x00, 0x00, 0x00, 0x00); 735 TestRegAddrScaledIndex(cmp, r11, r9, 8, 0, i8, 9, 0x67, 0x46, 0x3a, 0x1C, 736 0xCD, 0x00, 0x00, 0x00, 0x00); 737 738 /* cmp GPR, 0(Base,Index,Scale) */ 739 TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0, i32, 4, 0x67, 0x3B, 0x04, 740 0x11); 741 TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0, i32, 4, 0x67, 0x3B, 0x0C, 742 0x5A); 743 TestRegAddrBaseScaledIndex(cmp, r8, r9, r10, 1, 0, i32, 5, 0x67, 0x47, 0x3B, 744 0x04, 0x11); 745 TestRegAddrBaseScaledIndex(cmp, r9, r10, r11, 2, 0, i32, 5, 0x67, 0x47, 0x3B, 746 0x0C, 0x5A); 747 // esp cannot be an scaled index. 748 TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0, i32, 4, 0x67, 0x3B, 0x1C, 749 0xAC); 750 TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0, i32, 5, 0x67, 0x3B, 0x64, 751 0xF5, 0x00); 752 TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0, i32, 4, 0x67, 0x3B, 0x2C, 753 0x3E); 754 TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0, i32, 4, 0x67, 0x3B, 0x34, 755 0x47); 756 TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0, i32, 4, 0x67, 0x3B, 0x3C, 757 0x98); 758 TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0, i32, 4, 0x67, 0x3B, 0x1C, 759 0xD1); 760 TestRegAddrBaseScaledIndex(cmp, r11, r12, r13, 4, 0, i32, 5, 0x67, 0x47, 0x3B, 761 0x1C, 0xAC); 762 TestRegAddrBaseScaledIndex(cmp, r12, r13, r14, 8, 0, i32, 6, 0x67, 0x47, 0x3B, 763 0x64, 0xF5, 0x00); 764 TestRegAddrBaseScaledIndex(cmp, r13, r14, r15, 1, 0, i32, 5, 0x67, 0x47, 0x3B, 765 0x2C, 0x3E); 766 TestRegAddrBaseScaledIndex(cmp, r14, r15, r8, 2, 0, i32, 5, 0x67, 0x47, 0x3B, 767 0x34, 0x47); 768 TestRegAddrBaseScaledIndex(cmp, r15, r8, r11, 4, 0, i32, 5, 0x67, 0x47, 0x3B, 769 0x3C, 0x98); 770 TestRegAddrBaseScaledIndex(cmp, r11, r9, r10, 8, 0, i32, 5, 0x67, 0x47, 0x3B, 771 0x1C, 0xD1); 772 773 TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0, i16, 5, 0x66, 0x67, 0x3B, 774 0x04, 0x11); 775 TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0, i16, 5, 0x66, 0x67, 0x3B, 776 0x0C, 0x5A); 777 TestRegAddrBaseScaledIndex(cmp, r8, r9, r10, 1, 0, i16, 6, 0x66, 0x67, 0x47, 778 0x3B, 0x04, 0x11); 779 TestRegAddrBaseScaledIndex(cmp, r9, r10, r11, 2, 0, i16, 6, 0x66, 0x67, 0x47, 780 0x3B, 0x0C, 0x5A); 781 // esp cannot be an scaled index. 782 TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0, i16, 5, 0x66, 0x67, 0x3B, 783 0x1C, 0xAC); 784 TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0, i16, 6, 0x66, 0x67, 0x3B, 785 0x64, 0xF5, 0x00); 786 TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0, i16, 5, 0x66, 0x67, 0x3B, 787 0x2C, 0x3E); 788 TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0, i16, 5, 0x66, 0x67, 0x3B, 789 0x34, 0x47); 790 TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0, i16, 5, 0x66, 0x67, 0x3B, 791 0x3C, 0x98); 792 TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0, i16, 5, 0x66, 0x67, 0x3B, 793 0x1C, 0xD1); 794 TestRegAddrBaseScaledIndex(cmp, r11, r12, r13, 4, 0, i16, 6, 0x66, 0x67, 0x47, 795 0x3B, 0x1C, 0xAC); 796 TestRegAddrBaseScaledIndex(cmp, r12, r13, r14, 8, 0, i16, 7, 0x66, 0x67, 0x47, 797 0x3B, 0x64, 0xF5, 0x00); 798 TestRegAddrBaseScaledIndex(cmp, r13, r14, r15, 1, 0, i16, 6, 0x66, 0x67, 0x47, 799 0x3B, 0x2C, 0x3E); 800 TestRegAddrBaseScaledIndex(cmp, r14, r15, r8, 2, 0, i16, 6, 0x66, 0x67, 0x47, 801 0x3B, 0x34, 0x47); 802 TestRegAddrBaseScaledIndex(cmp, r15, r8, r11, 4, 0, i16, 6, 0x66, 0x67, 0x47, 803 0x3B, 0x3C, 0x98); 804 TestRegAddrBaseScaledIndex(cmp, r11, r9, r10, 8, 0, i16, 6, 0x66, 0x67, 0x47, 805 0x3B, 0x1C, 0xD1); 806 807 TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0, i8, 4, 0x67, 0x3A, 0x04, 808 0x11); 809 TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0, i8, 4, 0x67, 0x3A, 0x0C, 810 0x5A); 811 TestRegAddrBaseScaledIndex(cmp, r8, r9, r10, 1, 0, i8, 5, 0x67, 0x47, 0x3A, 812 0x04, 0x11); 813 TestRegAddrBaseScaledIndex(cmp, r9, r10, r11, 2, 0, i8, 5, 0x67, 0x47, 0x3A, 814 0x0C, 0x5A); 815 // esp cannot be an scaled index. 816 TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0, i8, 4, 0x67, 0x3A, 0x1C, 817 0xAC); 818 TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0, i8, 5, 0x67, 0x3A, 0x64, 819 0xF5, 0x00); 820 TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0, i8, 5, 0x67, 0x40, 0x3A, 821 0x2C, 0x3E); 822 TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0, i8, 5, 0x67, 0x40, 0x3A, 823 0x34, 0x47); 824 TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0, i8, 5, 0x67, 0x40, 0x3A, 825 0x3C, 0x98); 826 TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0, i8, 4, 0x67, 0x3A, 0x1C, 827 0xD1); 828 TestRegAddrBaseScaledIndex(cmp, r11, r12, r13, 4, 0, i8, 5, 0x67, 0x47, 0x3A, 829 0x1C, 0xAC); 830 TestRegAddrBaseScaledIndex(cmp, r12, r13, r14, 8, 0, i8, 6, 0x67, 0x47, 0x3A, 831 0x64, 0xF5, 0x00); 832 TestRegAddrBaseScaledIndex(cmp, r13, r14, r15, 1, 0, i8, 5, 0x67, 0x47, 0x3A, 833 0x2C, 0x3E); 834 TestRegAddrBaseScaledIndex(cmp, r14, r15, r8, 2, 0, i8, 5, 0x67, 0x47, 0x3A, 835 0x34, 0x47); 836 TestRegAddrBaseScaledIndex(cmp, r15, r8, r11, 4, 0, i8, 5, 0x67, 0x47, 0x3A, 837 0x3C, 0x98); 838 TestRegAddrBaseScaledIndex(cmp, r11, r9, r10, 8, 0, i8, 5, 0x67, 0x47, 0x3A, 839 0x1C, 0xD1); 840 841 /* cmp GPR, Imm8(Base,Index,Scale) */ 842 TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0x40, i32, 5, 0x67, 0x3B, 843 0x44, 0x11, 0x40); 844 TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0x40, i32, 5, 0x67, 0x3B, 845 0x4C, 0x5A, 0x40); 846 TestRegAddrBaseScaledIndex(cmp, r8, r9, r10, 1, 0x40, i32, 6, 0x67, 0x47, 847 0x3B, 0x44, 0x11, 0x40); 848 TestRegAddrBaseScaledIndex(cmp, r9, r10, r11, 2, 0x40, i32, 6, 0x67, 0x47, 849 0x3B, 0x4C, 0x5A, 0x40); 850 // esp cannot be an scaled index. 851 TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0x40, i32, 5, 0x67, 0x3B, 852 0x5C, 0xAC, 0x40); 853 TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0x40, i32, 5, 0x67, 0x3B, 854 0x64, 0xF5, 0x40); 855 TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0x40, i32, 5, 0x67, 0x3B, 856 0x6C, 0x3E, 0x40); 857 TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0x40, i32, 5, 0x67, 0x3B, 858 0x74, 0x47, 0x40); 859 TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0x40, i32, 5, 0x67, 0x3B, 860 0x7C, 0x98, 0x40); 861 TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0x40, i32, 5, 0x67, 0x3B, 862 0x5C, 0xD1, 0x40); 863 TestRegAddrBaseScaledIndex(cmp, r11, r12, r13, 4, 0x40, i32, 6, 0x67, 0x47, 864 0x3B, 0x5C, 0xAC, 0x40); 865 TestRegAddrBaseScaledIndex(cmp, r12, r13, r14, 8, 0x40, i32, 6, 0x67, 0x47, 866 0x3B, 0x64, 0xF5, 0x40); 867 TestRegAddrBaseScaledIndex(cmp, r13, r14, r15, 1, 0x40, i32, 6, 0x67, 0x47, 868 0x3B, 0x6C, 0x3E, 0x40); 869 TestRegAddrBaseScaledIndex(cmp, r14, r15, r8, 2, 0x40, i32, 6, 0x67, 0x47, 870 0x3B, 0x74, 0x47, 0x40); 871 TestRegAddrBaseScaledIndex(cmp, r15, r8, r11, 4, 0x40, i32, 6, 0x67, 0x47, 872 0x3B, 0x7C, 0x98, 0x40); 873 TestRegAddrBaseScaledIndex(cmp, r11, r9, r10, 8, 0x40, i32, 6, 0x67, 0x47, 874 0x3B, 0x5C, 0xD1, 0x40); 875 876 TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0x40, i16, 6, 0x66, 0x67, 877 0x3B, 0x44, 0x11, 0x40); 878 TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0x40, i16, 6, 0x66, 0x67, 879 0x3B, 0x4C, 0x5A, 0x40); 880 TestRegAddrBaseScaledIndex(cmp, r8, r9, r10, 1, 0x40, i16, 7, 0x66, 0x67, 881 0x47, 0x3B, 0x44, 0x11, 0x40); 882 TestRegAddrBaseScaledIndex(cmp, r9, r10, r11, 2, 0x40, i16, 7, 0x66, 0x67, 883 0x47, 0x3B, 0x4C, 0x5A, 0x40); 884 // esp cannot be an scaled index. 885 TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0x40, i16, 6, 0x66, 0x67, 886 0x3B, 0x5C, 0xAC, 0x40); 887 TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0x40, i16, 6, 0x66, 0x67, 888 0x3B, 0x64, 0xF5, 0x40); 889 TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0x40, i16, 6, 0x66, 0x67, 890 0x3B, 0x6C, 0x3E, 0x40); 891 TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0x40, i16, 6, 0x66, 0x67, 892 0x3B, 0x74, 0x47, 0x40); 893 TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0x40, i16, 6, 0x66, 0x67, 894 0x3B, 0x7C, 0x98, 0x40); 895 TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0x40, i16, 6, 0x66, 0x67, 896 0x3B, 0x5C, 0xD1, 0x40); 897 TestRegAddrBaseScaledIndex(cmp, r11, r12, r13, 4, 0x40, i16, 7, 0x66, 0x67, 898 0x47, 0x3B, 0x5C, 0xAC, 0x40); 899 TestRegAddrBaseScaledIndex(cmp, r12, r13, r14, 8, 0x40, i16, 7, 0x66, 0x67, 900 0x47, 0x3B, 0x64, 0xF5, 0x40); 901 TestRegAddrBaseScaledIndex(cmp, r13, r14, r15, 1, 0x40, i16, 7, 0x66, 0x67, 902 0x47, 0x3B, 0x6C, 0x3E, 0x40); 903 TestRegAddrBaseScaledIndex(cmp, r14, r15, r8, 2, 0x40, i16, 7, 0x66, 0x67, 904 0x47, 0x3B, 0x74, 0x47, 0x40); 905 TestRegAddrBaseScaledIndex(cmp, r15, r8, r11, 4, 0x40, i16, 7, 0x66, 0x67, 906 0x47, 0x3B, 0x7C, 0x98, 0x40); 907 TestRegAddrBaseScaledIndex(cmp, r11, r9, r10, 8, 0x40, i16, 7, 0x66, 0x67, 908 0x47, 0x3B, 0x5C, 0xD1, 0x40); 909 910 TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0x40, i8, 5, 0x67, 0x3A, 911 0x44, 0x11, 0x40); 912 TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0x40, i8, 5, 0x67, 0x3A, 913 0x4C, 0x5A, 0x40); 914 TestRegAddrBaseScaledIndex(cmp, r8, r9, r10, 1, 0x40, i8, 6, 0x67, 0x47, 0x3A, 915 0x44, 0x11, 0x40); 916 TestRegAddrBaseScaledIndex(cmp, r9, r10, r11, 2, 0x40, i8, 6, 0x67, 0x47, 917 0x3A, 0x4C, 0x5A, 0x40); 918 // esp cannot be an scaled index. 919 TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0x40, i8, 5, 0x67, 0x3A, 920 0x5C, 0xAC, 0x40); 921 TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0x40, i8, 5, 0x67, 0x3A, 922 0x64, 0xF5, 0x40); 923 TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0x40, i8, 6, 0x67, 0x40, 924 0x3A, 0x6C, 0x3E, 0x40); 925 TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0x40, i8, 6, 0x67, 0x40, 926 0x3A, 0x74, 0x47, 0x40); 927 TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0x40, i8, 6, 0x67, 0x40, 928 0x3A, 0x7C, 0x98, 0x40); 929 TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0x40, i8, 5, 0x67, 0x3A, 930 0x5C, 0xD1, 0x40); 931 TestRegAddrBaseScaledIndex(cmp, r11, r12, r13, 4, 0x40, i8, 6, 0x67, 0x47, 932 0x3A, 0x5C, 0xAC, 0x40); 933 TestRegAddrBaseScaledIndex(cmp, r12, r13, r14, 8, 0x40, i8, 6, 0x67, 0x47, 934 0x3A, 0x64, 0xF5, 0x40); 935 TestRegAddrBaseScaledIndex(cmp, r13, r14, r15, 1, 0x40, i8, 6, 0x67, 0x47, 936 0x3A, 0x6C, 0x3E, 0x40); 937 TestRegAddrBaseScaledIndex(cmp, r14, r15, r8, 2, 0x40, i8, 6, 0x67, 0x47, 938 0x3A, 0x74, 0x47, 0x40); 939 TestRegAddrBaseScaledIndex(cmp, r15, r8, r11, 4, 0x40, i8, 6, 0x67, 0x47, 940 0x3A, 0x7C, 0x98, 0x40); 941 TestRegAddrBaseScaledIndex(cmp, r11, r9, r10, 8, 0x40, i8, 6, 0x67, 0x47, 942 0x3A, 0x5C, 0xD1, 0x40); 943 944 /* cmp GPR, Imm32(Base,Index,Scale) */ 945 TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0xF0, i32, 8, 0x67, 0x3B, 946 0x84, 0x11, 0xF0, 0x00, 0x00, 0x00); 947 TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0xF0, i32, 8, 0x67, 0x3B, 948 0x8C, 0x5A, 0xF0, 0x00, 0x00, 0x00); 949 TestRegAddrBaseScaledIndex(cmp, r8, r9, r10, 1, 0xF0, i32, 9, 0x67, 0x47, 950 0x3B, 0x84, 0x11, 0xF0, 0x00, 0x00, 0x00); 951 TestRegAddrBaseScaledIndex(cmp, r9, r10, r11, 2, 0xF0, i32, 9, 0x67, 0x47, 952 0x3B, 0x8C, 0x5A, 0xF0, 0x00, 0x00, 0x00); 953 // esp cannot be an scaled index. 954 TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0xF0, i32, 8, 0x67, 0x3B, 955 0x9C, 0xAC, 0xF0, 0x00, 0x00, 0x00); 956 TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0xF0, i32, 8, 0x67, 0x3B, 957 0xA4, 0xF5, 0xF0, 0x00, 0x00, 0x00); 958 TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0xF0, i32, 8, 0x67, 0x3B, 959 0xAC, 0x3E, 0xF0, 0x00, 0x00, 0x00); 960 TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0xF0, i32, 8, 0x67, 0x3B, 961 0xB4, 0x47, 0xF0, 0x00, 0x00, 0x00); 962 TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0xF0, i32, 8, 0x67, 0x3B, 963 0xBC, 0x98, 0xF0, 0x00, 0x00, 0x00); 964 TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0xF0, i32, 8, 0x67, 0x3B, 965 0x9C, 0xD1, 0xF0, 0x00, 0x00, 0x00); 966 TestRegAddrBaseScaledIndex(cmp, r11, r12, r13, 4, 0xF0, i32, 9, 0x67, 0x47, 967 0x3B, 0x9C, 0xAC, 0xF0, 0x00, 0x00, 0x00); 968 TestRegAddrBaseScaledIndex(cmp, r12, r13, r14, 8, 0xF0, i32, 9, 0x67, 0x47, 969 0x3B, 0xA4, 0xF5, 0xF0, 0x00, 0x00, 0x00); 970 TestRegAddrBaseScaledIndex(cmp, r13, r14, r15, 1, 0xF0, i32, 9, 0x67, 0x47, 971 0x3B, 0xAC, 0x3E, 0xF0, 0x00, 0x00, 0x00); 972 TestRegAddrBaseScaledIndex(cmp, r14, r15, r8, 2, 0xF0, i32, 9, 0x67, 0x47, 973 0x3B, 0xB4, 0x47, 0xF0, 0x00, 0x00, 0x00); 974 TestRegAddrBaseScaledIndex(cmp, r15, r8, r11, 4, 0xF0, i32, 9, 0x67, 0x47, 975 0x3B, 0xBC, 0x98, 0xF0, 0x00, 0x00, 0x00); 976 TestRegAddrBaseScaledIndex(cmp, r11, r9, r10, 8, 0xF0, i32, 9, 0x67, 0x47, 977 0x3B, 0x9C, 0xD1, 0xF0, 0x00, 0x00, 0x00); 978 979 TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0xF0, i16, 9, 0x66, 0x67, 980 0x3B, 0x84, 0x11, 0xF0, 0x00, 0x00, 0x00); 981 TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0xF0, i16, 9, 0x66, 0x67, 982 0x3B, 0x8C, 0x5A, 0xF0, 0x00, 0x00, 0x00); 983 TestRegAddrBaseScaledIndex(cmp, r8, r9, r10, 1, 0xF0, i16, 10, 0x66, 0x67, 984 0x47, 0x3B, 0x84, 0x11, 0xF0, 0x00, 0x00, 0x00); 985 TestRegAddrBaseScaledIndex(cmp, r9, r10, r11, 2, 0xF0, i16, 10, 0x66, 0x67, 986 0x47, 0x3B, 0x8C, 0x5A, 0xF0, 0x00, 0x00, 0x00); 987 // esp cannot be an scaled index. 988 TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0xF0, i16, 9, 0x66, 0x67, 989 0x3B, 0x9C, 0xAC, 0xF0, 0x00, 0x00, 0x00); 990 TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0xF0, i16, 9, 0x66, 0x67, 991 0x3B, 0xA4, 0xF5, 0xF0, 0x00, 0x00, 0x00); 992 TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0xF0, i16, 9, 0x66, 0x67, 993 0x3B, 0xAC, 0x3E, 0xF0, 0x00, 0x00, 0x00); 994 TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0xF0, i16, 9, 0x66, 0x67, 995 0x3B, 0xB4, 0x47, 0xF0, 0x00, 0x00, 0x00); 996 TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0xF0, i16, 9, 0x66, 0x67, 997 0x3B, 0xBC, 0x98, 0xF0, 0x00, 0x00, 0x00); 998 TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0xF0, i16, 9, 0x66, 0x67, 999 0x3B, 0x9C, 0xD1, 0xF0, 0x00, 0x00, 0x00); 1000 TestRegAddrBaseScaledIndex(cmp, r11, r12, r13, 4, 0xF0, i16, 10, 0x66, 0x67, 1001 0x47, 0x3B, 0x9C, 0xAC, 0xF0, 0x00, 0x00, 0x00); 1002 TestRegAddrBaseScaledIndex(cmp, r12, r13, r14, 8, 0xF0, i16, 10, 0x66, 0x67, 1003 0x47, 0x3B, 0xA4, 0xF5, 0xF0, 0x00, 0x00, 0x00); 1004 TestRegAddrBaseScaledIndex(cmp, r13, r14, r15, 1, 0xF0, i16, 10, 0x66, 0x67, 1005 0x47, 0x3B, 0xAC, 0x3E, 0xF0, 0x00, 0x00, 0x00); 1006 TestRegAddrBaseScaledIndex(cmp, r14, r15, r8, 2, 0xF0, i16, 10, 0x66, 0x67, 1007 0x47, 0x3B, 0xB4, 0x47, 0xF0, 0x00, 0x00, 0x00); 1008 TestRegAddrBaseScaledIndex(cmp, r15, r8, r11, 4, 0xF0, i16, 10, 0x66, 0x67, 1009 0x47, 0x3B, 0xBC, 0x98, 0xF0, 0x00, 0x00, 0x00); 1010 TestRegAddrBaseScaledIndex(cmp, r11, r9, r10, 8, 0xF0, i16, 10, 0x66, 0x67, 1011 0x47, 0x3B, 0x9C, 0xD1, 0xF0, 0x00, 0x00, 0x00); 1012 1013 TestRegAddrBaseScaledIndex(cmp, eax, ecx, edx, 1, 0xF0, i8, 8, 0x67, 0x3A, 1014 0x84, 0x11, 0xF0, 0x00, 0x00, 0x00); 1015 TestRegAddrBaseScaledIndex(cmp, ecx, edx, ebx, 2, 0xF0, i8, 8, 0x67, 0x3A, 1016 0x8C, 0x5A, 0xF0, 0x00, 0x00, 0x00); 1017 TestRegAddrBaseScaledIndex(cmp, r8, r9, r10, 1, 0xF0, i8, 9, 0x67, 0x47, 0x3A, 1018 0x84, 0x11, 0xF0, 0x00, 0x00, 0x00); 1019 TestRegAddrBaseScaledIndex(cmp, r9, r10, r11, 2, 0xF0, i8, 9, 0x67, 0x47, 1020 0x3A, 0x8C, 0x5A, 0xF0, 0x00, 0x00, 0x00); 1021 // esp cannot be an scaled index. 1022 TestRegAddrBaseScaledIndex(cmp, ebx, esp, ebp, 4, 0xF0, i8, 8, 0x67, 0x3A, 1023 0x9C, 0xAC, 0xF0, 0x00, 0x00, 0x00); 1024 TestRegAddrBaseScaledIndex(cmp, esp, ebp, esi, 8, 0xF0, i8, 8, 0x67, 0x3A, 1025 0xA4, 0xF5, 0xF0, 0x00, 0x00, 0x00); 1026 TestRegAddrBaseScaledIndex(cmp, ebp, esi, edi, 1, 0xF0, i8, 9, 0x67, 0x40, 1027 0x3A, 0xAC, 0x3E, 0xF0, 0x00, 0x00, 0x00); 1028 TestRegAddrBaseScaledIndex(cmp, esi, edi, eax, 2, 0xF0, i8, 9, 0x67, 0x40, 1029 0x3A, 0xB4, 0x47, 0xF0, 0x00, 0x00, 0x00); 1030 TestRegAddrBaseScaledIndex(cmp, edi, eax, ebx, 4, 0xF0, i8, 9, 0x67, 0x40, 1031 0x3A, 0xBC, 0x98, 0xF0, 0x00, 0x00, 0x00); 1032 TestRegAddrBaseScaledIndex(cmp, ebx, ecx, edx, 8, 0xF0, i8, 8, 0x67, 0x3A, 1033 0x9C, 0xD1, 0xF0, 0x00, 0x00, 0x00); 1034 TestRegAddrBaseScaledIndex(cmp, r11, r12, r13, 4, 0xF0, i8, 9, 0x67, 0x47, 1035 0x3A, 0x9C, 0xAC, 0xF0, 0x00, 0x00, 0x00); 1036 TestRegAddrBaseScaledIndex(cmp, r12, r13, r14, 8, 0xF0, i8, 9, 0x67, 0x47, 1037 0x3A, 0xA4, 0xF5, 0xF0, 0x00, 0x00, 0x00); 1038 TestRegAddrBaseScaledIndex(cmp, r13, r14, r15, 1, 0xF0, i8, 9, 0x67, 0x47, 1039 0x3A, 0xAC, 0x3E, 0xF0, 0x00, 0x00, 0x00); 1040 TestRegAddrBaseScaledIndex(cmp, r14, r15, r8, 2, 0xF0, i8, 9, 0x67, 0x47, 1041 0x3A, 0xB4, 0x47, 0xF0, 0x00, 0x00, 0x00); 1042 TestRegAddrBaseScaledIndex(cmp, r15, r8, r11, 4, 0xF0, i8, 9, 0x67, 0x47, 1043 0x3A, 0xBC, 0x98, 0xF0, 0x00, 0x00, 0x00); 1044 TestRegAddrBaseScaledIndex(cmp, r11, r9, r10, 8, 0xF0, i8, 9, 0x67, 0x47, 1045 0x3A, 0x9C, 0xD1, 0xF0, 0x00, 0x00, 0x00); 1046 1047 /* cmp Addr, Imm */ 1048 // Note: at this point we trust the assembler knows how to encode addresses, 1049 // so no more exhaustive addressing mode testing. 1050 TestAddrBaseScaledIndexImm(cmp, eax, ecx, 1, 0xF0, 0x12, i32, 9, 0x67, 0x83, 1051 0xBC, 0x08, 0xF0, 0x00, 0x00, 0x00, 0x12); 1052 TestAddrBaseScaledIndexImm(cmp, ecx, edx, 1, 0xF0, 0xF0, i32, 12, 0x67, 0x81, 1053 0xBC, 0x11, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 1054 0x00, 0x00); 1055 TestAddrBaseScaledIndexImm(cmp, r8, r9, 1, 0xF0, 0x12, i32, 10, 0x67, 0x43, 1056 0x83, 0xBC, 0x08, 0xF0, 0x00, 0x00, 0x00, 0x12); 1057 TestAddrBaseScaledIndexImm(cmp, r9, r10, 1, 0xF0, 0xF0, i32, 13, 0x67, 0x43, 1058 0x81, 0xBC, 0x11, 0xF0, 0x00, 0x00, 0x00, 0xF0, 1059 0x00, 0x00, 0x00); 1060 1061 TestAddrBaseScaledIndexImm(cmp, eax, ecx, 1, 0xF0, 0x12, i16, 10, 0x66, 0x67, 1062 0x83, 0xBC, 0x08, 0xF0, 0x00, 0x00, 0x00, 0x12); 1063 TestAddrBaseScaledIndexImm(cmp, ecx, edx, 1, 0xF0, 0xF0, i16, 11, 0x66, 0x67, 1064 0x81, 0xBC, 0x11, 0xF0, 0x00, 0x00, 0x00, 0xF0, 1065 0x00); 1066 TestAddrBaseScaledIndexImm(cmp, r8, r9, 1, 0xF0, 0x12, i16, 11, 0x66, 0x67, 1067 0x43, 0x83, 0xBC, 0x08, 0xF0, 0x00, 0x00, 0x00, 1068 0x12); 1069 TestAddrBaseScaledIndexImm(cmp, r9, r10, 1, 0xF0, 0xF0, i16, 12, 0x66, 0x67, 1070 0x43, 0x81, 0xBC, 0x11, 0xF0, 0x00, 0x00, 0x00, 1071 0xF0, 0x00); 1072 1073 TestAddrBaseScaledIndexImm(cmp, eax, ecx, 1, 0xF0, 0x12, i8, 9, 0x67, 0x80, 1074 0xBC, 0x08, 0xF0, 0x00, 0x00, 0x00, 0x12); 1075 TestAddrBaseScaledIndexImm(cmp, r8, r9, 1, 0xF0, 0x12, i8, 10, 0x67, 0x43, 1076 0x80, 0xBC, 0x08, 0xF0, 0x00, 0x00, 0x00, 0x12); 1077 1078 /* cmp Addr, GPR */ 1079 TestAddrBaseScaledIndexReg(cmp, eax, ecx, 1, 0xF0, edx, i32, 8, 0x67, 0x39, 1080 0x94, 0x08, 0xF0, 0x00, 0x00, 0x00); 1081 TestAddrBaseScaledIndexReg(cmp, r8, r9, 1, 0xF0, r10, i32, 9, 0x67, 0x47, 1082 0x39, 0x94, 0x08, 0xF0, 0x00, 0x00, 0x00); 1083 1084 TestAddrBaseScaledIndexReg(cmp, eax, ecx, 1, 0xF0, edx, i16, 9, 0x66, 0x67, 1085 0x39, 0x94, 0x08, 0xF0, 0x00, 0x00, 0x00); 1086 TestAddrBaseScaledIndexReg(cmp, r8, r9, 1, 0xF0, r10, i16, 10, 0x66, 0x67, 1087 0x47, 0x39, 0x94, 0x08, 0xF0, 0x00, 0x00, 0x00); 1088 1089 TestAddrBaseScaledIndexReg(cmp, eax, ecx, 1, 0xF0, edx, i8, 8, 0x67, 0x38, 1090 0x94, 0x08, 0xF0, 0x00, 0x00, 0x00); 1091 TestAddrBaseScaledIndexReg(cmp, r8, r9, 1, 0xF0, r10, i8, 9, 0x67, 0x47, 0x38, 1092 0x94, 0x08, 0xF0, 0x00, 0x00, 0x00); 1093 1094 #undef TestAddrBaseScaledIndexReg 1095 #undef TestAddrBaseScaledIndexImm 1096 #undef TestRegAddrBaseScaledIndex 1097 #undef TestRegAddrScaledIndex 1098 #undef TestRegAddrBase 1099 #undef TestRegAbsoluteAddr 1100 #undef TestRegImm 1101 #undef TestRegReg 1102 } 1103 1104 TEST_F(AssemblerX8664Test, ScratchpadGettersAndSetters) { 1105 const uint32_t S0 = allocateDword(); 1106 const uint32_t S1 = allocateDword(); 1107 const uint32_t S2 = allocateDword(); 1108 const uint32_t S3 = allocateDword(); 1109 AssembledTest test = assemble(); 1110 test.setDwordTo(S0, 0xBEEF0000u); 1111 test.setDwordTo(S1, 0xDEADu); 1112 test.setDwordTo(S2, 0x20406080u); 1113 ASSERT_EQ(0xBEEF0000u, test.contentsOfDword(S0)); 1114 ASSERT_EQ(0xDEADu, test.contentsOfDword(S1)); 1115 ASSERT_EQ(0x20406080u, test.contentsOfDword(S2)); 1116 ASSERT_EQ(0xDEADBEEF0000ull, test.contentsOfQword(S0)); 1117 ASSERT_EQ(0x204060800000DEADull, test.contentsOfQword(S1)); 1118 1119 test.setQwordTo(S1, 0x1234567890ABCDEFull); 1120 ASSERT_EQ(0x1234567890ABCDEFull, test.contentsOfQword(S1)); 1121 test.setDwordTo(S0, 0xBEEF0000u); 1122 ASSERT_EQ(0x90ABCDEFull, test.contentsOfDword(S1)); 1123 ASSERT_EQ(0x12345678ull, test.contentsOfDword(S2)); 1124 1125 test.setDwordTo(S0, 1.0f); 1126 ASSERT_FLOAT_EQ(1.0f, test.contentsOfDword<float>(S0)); 1127 test.setQwordTo(S0, 3.14); 1128 ASSERT_DOUBLE_EQ(3.14, test.contentsOfQword<double>(S0)); 1129 1130 test.setDqwordTo(S0, Dqword(1.0f, 2.0f, 3.0f, 4.0f)); 1131 ASSERT_EQ(Dqword(1.0f, 2.0f, 3.0f, 4.0f), test.contentsOfDqword(S0)); 1132 EXPECT_FLOAT_EQ(1.0f, test.contentsOfDword<float>(S0)); 1133 EXPECT_FLOAT_EQ(2.0f, test.contentsOfDword<float>(S1)); 1134 EXPECT_FLOAT_EQ(3.0f, test.contentsOfDword<float>(S2)); 1135 EXPECT_FLOAT_EQ(4.0f, test.contentsOfDword<float>(S3)); 1136 } 1137 1138 } // end of anonymous namespace 1139 } // end of namespace Test 1140 } // end of namespace X8664 1141 } // end of namespace Ice 1142