Coverage for /Syzygy/assm/assembler_unittest.cc

CoverageLines executed / instrumented / missingexe / inst / missLanguageGroup
99.8%108110830.C++test

Line-by-line coverage:

   1    :  // Copyright 2012 Google Inc. All Rights Reserved.
   2    :  //
   3    :  // Licensed under the Apache License, Version 2.0 (the "License");
   4    :  // you may not use this file except in compliance with the License.
   5    :  // You may obtain a copy of the License at
   6    :  //
   7    :  //     http://www.apache.org/licenses/LICENSE-2.0
   8    :  //
   9    :  // Unless required by applicable law or agreed to in writing, software
  10    :  // distributed under the License is distributed on an "AS IS" BASIS,
  11    :  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12    :  // See the License for the specific language governing permissions and
  13    :  // limitations under the License.
  14    :  
  15    :  #include "syzygy/assm/assembler.h"
  16    :  
  17    :  #include <vector>
  18    :  #include "gtest/gtest.h"
  19    :  #include "syzygy/core/disassembler_util.h"
  20    :  
  21    :  namespace assm {
  22    :  
  23    :  typedef AssemblerImpl::Immediate Immediate;
  24    :  typedef AssemblerImpl::Operand Operand;
  25    :  typedef AssemblerImpl::Displacement Displacement;
  26    :  typedef AssemblerImpl::Label Label;
  27    :  
  28    :  namespace {
  29    :  
  30    :  class TestSerializer : public AssemblerImpl::InstructionSerializer {
  31    :   public:
  32    :    struct Reference {
  33    :      uint32 location;
  34    :      const void* ref;
  35    :    };
  36    :    struct Instruction {
  37    :      uint32 location;
  38    :      size_t size;
  39    :      // Position in code.
  40    :      size_t position;
  41    :    };
  42    :  
  43  E :    TestSerializer() {
  44  E :    }
  45    :  
  46    :    virtual void AppendInstruction(uint32 location,
  47    :                                   const uint8* bytes,
  48    :                                   size_t num_bytes,
  49    :                                   const AssemblerImpl::ReferenceInfo* refs,
  50  E :                                   size_t num_refs) {
  51    :      // Note the location of this instruction.
  52  E :      Instruction instr = { location, num_bytes, code.size() };
  53  E :      instructions.push_back(instr);
  54    :  
  55  E :      for (size_t i = 0; i < num_refs; ++i) {
  56  E :        Reference ref = { code.size() + refs[i].offset, refs[i].reference };
  57  E :        references.push_back(ref);
  58  E :      }
  59  E :      code.insert(code.end(), bytes, bytes + num_bytes);
  60  E :    }
  61    :  
  62    :    virtual bool FinalizeLabel(uint32 location,
  63    :                               const uint8* bytes,
  64  E :                               size_t num_bytes) {
  65    :      // Find the instruction that's being amended.
  66  E :      for (auto instr: instructions) {
  67    :        if (instr.location <= location &&
  68  E :            instr.location + instr.size > location) {
  69    :          // Make sure the amended bytes are flush against the end of the
  70    :          // instruction.
  71  E :          EXPECT_EQ(instr.location + instr.size, location + num_bytes);
  72    :  
  73  E :          size_t pos = instr.position + location - instr.location;
  74  E :          for (size_t i = 0; i < num_bytes; ++i)
  75  E :            code.at(pos + i) = bytes[i];
  76    :  
  77  E :          return true;
  78    :        }
  79    :      }
  80    :  
  81  i :      ADD_FAILURE() << "FinalizeLabel targeting data outside instructions.";
  82    :  
  83  i :      return false;
  84  E :    }
  85    :  
  86    :    std::vector<uint8> code;
  87    :    std::vector<Instruction> instructions;
  88    :    std::vector<Reference> references;
  89    :  };
  90    :  
  91    :  class AssemblerTest : public testing::Test {
  92    :   public:
  93  E :    AssemblerTest() : asm_(0, &serializer_) {
  94  E :    }
  95    :  
  96    :    TestSerializer serializer_;
  97    :    AssemblerImpl asm_;
  98    :  };
  99    :  
 100    :  #define EXPECT_BYTES(...) \
 101    :  do { \
 102    :    uint8 data[] = { __VA_ARGS__ }; \
 103    :    ASSERT_EQ(arraysize(data), serializer_.code.size()); \
 104    :    EXPECT_EQ(0, memcmp(data, &serializer_.code.at(0), arraysize(data))); \
 105    :    serializer_.code.clear(); \
 106    :  } while (0)
 107    :  
 108    :  template <typename ValueImpl>
 109    :  class ValueTest : public AssemblerTest {
 110    :   public:
 111    :    typedef ValueImpl ValueImpl;
 112    :  };
 113    :  
 114    :  typedef ::testing::Types<Immediate, Displacement> ValueTestTypes;
 115    :  TYPED_TEST_CASE(ValueTest, ValueTestTypes);
 116    :  
 117    :  }  // namespace
 118    :  
 119  E :  TYPED_TEST(ValueTest, ValueImpl) {
 120  E :    ValueImpl imm1;
 121  E :    EXPECT_EQ(0, imm1.value());
 122  E :    EXPECT_EQ(NULL, imm1.reference());
 123  E :    EXPECT_EQ(kSizeNone, imm1.size());
 124  E :    EXPECT_TRUE(imm1 == imm1);
 125    :  
 126  E :    ValueImpl imm2(0xCAFEBABE, kSize32Bit);
 127  E :    EXPECT_EQ(0xCAFEBABE, imm2.value());
 128  E :    EXPECT_EQ(NULL, imm2.reference());
 129  E :    EXPECT_EQ(kSize32Bit, imm2.size());
 130  E :    EXPECT_TRUE(imm2 == imm2);
 131  E :    EXPECT_FALSE(imm2 == imm1);
 132    :  
 133  E :    int ref2 = 0;
 134  E :    ValueImpl imm3(0xCAFEBABE, kSize32Bit, &ref2);
 135  E :    EXPECT_EQ(0xCAFEBABE, imm3.value());
 136  E :    EXPECT_EQ(&ref2, imm3.reference());
 137  E :    EXPECT_EQ(kSize32Bit, imm3.size());
 138  E :    EXPECT_TRUE(imm3 == imm3);
 139  E :    EXPECT_FALSE(imm3 == imm2);
 140  E :    EXPECT_FALSE(imm3 == imm1);
 141    :  
 142  E :    ValueImpl imm4(0xCAFEBABE, kSize32Bit, &ref2);
 143  E :    EXPECT_TRUE(imm4 == imm3);
 144  E :  }
 145    :  
 146  E :  TEST_F(AssemblerTest, OperandImpl) {
 147    :    {
 148  E :      Operand op(edi);
 149  E :      EXPECT_EQ(kRegisterEdi, op.base());
 150  E :      EXPECT_EQ(kRegisterNone, op.index());
 151  E :      EXPECT_EQ(kTimes1, op.scale());
 152  E :      EXPECT_EQ(0, op.displacement().value());
 153  E :      EXPECT_EQ(NULL, op.displacement().reference());
 154  E :      EXPECT_EQ(kSizeNone, op.displacement().size());
 155    :    }
 156    :  
 157    :    {
 158  E :      int ref = 0;
 159  E :      Operand op(ecx, Displacement(0xCAFEBABE, kSize32Bit, &ref));
 160  E :      EXPECT_EQ(kRegisterEcx, op.base());
 161  E :      EXPECT_EQ(kRegisterNone, op.index());
 162  E :      EXPECT_EQ(kTimes1, op.scale());
 163  E :      EXPECT_EQ(0xCAFEBABE, op.displacement().value());
 164  E :      EXPECT_EQ(&ref, op.displacement().reference());
 165  E :      EXPECT_EQ(kSize32Bit, op.displacement().size());
 166    :    }
 167    :  
 168    :    {
 169  E :      int ref = 0;
 170  E :      Operand op(Displacement(0xCAFEBABE, kSize32Bit, &ref));
 171  E :      EXPECT_EQ(kRegisterNone, op.base());
 172  E :      EXPECT_EQ(kRegisterNone, op.index());
 173  E :      EXPECT_EQ(kTimes1, op.scale());
 174  E :      EXPECT_EQ(0xCAFEBABE, op.displacement().value());
 175  E :      EXPECT_EQ(&ref, op.displacement().reference());
 176  E :      EXPECT_EQ(kSize32Bit, op.displacement().size());
 177    :    }
 178    :  
 179    :    {
 180  E :      Operand op(ebp, ecx, kTimes8);
 181  E :      EXPECT_EQ(kRegisterEbp, op.base());
 182  E :      EXPECT_EQ(kRegisterEcx, op.index());
 183  E :      EXPECT_EQ(kTimes8, op.scale());
 184  E :      EXPECT_EQ(0, op.displacement().value());
 185  E :      EXPECT_EQ(NULL, op.displacement().reference());
 186  E :      EXPECT_EQ(kSizeNone, op.displacement().size());
 187    :    }
 188    :  
 189    :    {
 190  E :      int ref = 0;
 191  E :      Operand op(ebp, ecx, kTimes2, Displacement(0xCA, kSize8Bit, &ref));
 192  E :      EXPECT_EQ(kRegisterEbp, op.base());
 193  E :      EXPECT_EQ(kRegisterEcx, op.index());
 194  E :      EXPECT_EQ(kTimes2, op.scale());
 195  E :      EXPECT_EQ(0xCA, op.displacement().value());
 196  E :      EXPECT_EQ(&ref, op.displacement().reference());
 197  E :      EXPECT_EQ(kSize8Bit, op.displacement().size());
 198    :    }
 199  E :  }
 200    :  
 201  E :  TEST_F(AssemblerTest, Nop) {
 202  E :    asm_.nop(0);
 203  E :    EXPECT_TRUE(serializer_.code.empty());
 204    :  
 205    :    // NOPs are generated in bunches of instructions of up to 15 bytes in
 206    :    // length. We validate that each one of them is in fact a sequence of NOPs.
 207  E :    for (size_t i = 1; i <= 15; ++i) {
 208  E :      asm_.nop(i);
 209  E :      EXPECT_EQ(i, serializer_.code.size());
 210    :  
 211    :      // The sequence of bytes should consist of NOP instructions.
 212  E :      size_t j = 0;
 213  E :      size_t instruction_count = 0;
 214  E :      while (j < i) {
 215  E :        _DInst instruction = {};
 216    :        ASSERT_TRUE(core::DecodeOneInstruction(serializer_.code.data() + j,
 217    :                                               i - j,
 218  E :                                               &instruction));
 219  E :        ASSERT_TRUE(core::IsNop(instruction));
 220  E :        j += instruction.size;
 221  E :        ++instruction_count;
 222  E :      }
 223    :      // 1 or 2 instructions should be generated.
 224  E :      ASSERT_LT(0u, instruction_count);
 225  E :      ASSERT_GE(2u, instruction_count);
 226  E :      serializer_.code.clear();
 227  E :    }
 228  E :  }
 229    :  
 230  E :  TEST_F(AssemblerTest, Call) {
 231  E :    asm_.set_location(0xCAFEBABE);
 232    :  
 233    :    // Immediate call.
 234  E :    asm_.call(Immediate(0xCAFEBABE, kSize32Bit, NULL));
 235  E :    EXPECT_BYTES(0xE8, 0xFB, 0xFF, 0xFF, 0xFF);
 236    :  
 237    :    // Indirect call - we test only one operand encoding, as the others
 238    :    // are well covered in the mov instruction.
 239  E :    asm_.call(Operand(Displacement(0xCAFEBABE, kSize32Bit, NULL)));
 240  E :    EXPECT_BYTES(0xFF, 0x15, 0xBE, 0xBA, 0xFE, 0xCA);
 241  E :  }
 242    :  
 243  E :  TEST_F(AssemblerTest, Jmp) {
 244  E :    asm_.set_location(0xCAFEBABE);
 245    :  
 246    :    // Immediate 8-bit reach jmp.
 247  E :    asm_.jmp(Immediate(0xCAFEBABE, kSize8Bit, NULL));
 248  E :    EXPECT_BYTES(0xEB, 0xFE);
 249    :  
 250  E :    ASSERT_EQ(1, kShortJumpOpcodeSize);
 251  E :    ASSERT_EQ(2, kShortJumpSize);
 252    :  
 253    :    // Immediate 32-bit reach jmp.
 254  E :    asm_.jmp(Immediate(0xCAFEBABE, kSize32Bit, NULL));
 255  E :    EXPECT_BYTES(0xE9, 0xF9, 0xFF, 0xFF, 0xFF);
 256    :  
 257  E :    ASSERT_EQ(1, kLongJumpOpcodeSize);
 258  E :    ASSERT_EQ(5, kLongJumpSize);
 259    :  
 260    :    // Indirect jmp - we test only one operand encoding, as the others
 261    :    // are well covered in the mov instruction.
 262  E :    asm_.jmp(Operand(Displacement(0xCAFEBABE, kSize32Bit, NULL)));
 263  E :    EXPECT_BYTES(0xFF, 0x25, 0xBE, 0xBA, 0xFE, 0xCA);
 264  E :  }
 265    :  
 266  E :  TEST_F(AssemblerTest, Ret) {
 267  E :    asm_.ret();
 268  E :    EXPECT_BYTES(0xC3);
 269    :  
 270  E :    asm_.ret(0x4);
 271  E :    EXPECT_BYTES(0xC2, 0x04, 0x00);
 272  E :  }
 273    :  
 274  E :  TEST_F(AssemblerTest, MovByte) {
 275    :    asm_.mov_b(Operand(eax, ebx, kTimes4,
 276    :                       Displacement(0xCAFEBABE, kSize32Bit)),
 277  E :               Immediate(0xCB, kSize8Bit));
 278  E :    EXPECT_BYTES(0xC6, 0x84, 0x98, 0xBE, 0xBA, 0xFE, 0xCA, 0xCB);
 279  E :  }
 280    :  
 281  E :  TEST_F(AssemblerTest, MovzxByte) {
 282  E :    asm_.movzx_b(eax, Operand(ebx));
 283  E :    EXPECT_BYTES(0x0F, 0xB6, 0x03);
 284    :  
 285  E :    asm_.movzx_b(ecx, Operand(ecx, edx, kTimes2));
 286  E :    EXPECT_BYTES(0x0F, 0xB6, 0x0C, 0x51);
 287  E :  }
 288    :  
 289  E :  TEST_F(AssemblerTest, MovImmediate) {
 290    :    // Immediate moves.
 291  E :    asm_.mov(eax, Immediate(0xCAFEBABE, kSize32Bit));
 292  E :    EXPECT_BYTES(0xB8, 0xBE, 0xBA, 0xFE, 0xCA);
 293  E :    asm_.mov(ebx, Immediate(0xCAFEBABE, kSize32Bit));
 294  E :    EXPECT_BYTES(0xBB, 0xBE, 0xBA, 0xFE, 0xCA);
 295  E :  }
 296    :  
 297  E :  TEST_F(AssemblerTest, MovRegisterToRegister) {
 298    :    // Register to register, one case each for source and dst.
 299  E :    asm_.mov(eax, ebx);
 300  E :    EXPECT_BYTES(0x8B, 0xC3);
 301  E :    asm_.mov(ecx, eax);
 302  E :    EXPECT_BYTES(0x8B, 0xC8);
 303  E :    asm_.mov(ebx, eax);
 304  E :    EXPECT_BYTES(0x8B, 0xD8);
 305  E :    asm_.mov(edx, eax);
 306  E :    EXPECT_BYTES(0x8B, 0xD0);
 307  E :    asm_.mov(esp, eax);
 308  E :    EXPECT_BYTES(0x8B, 0xE0);
 309  E :    asm_.mov(ebp, eax);
 310  E :    EXPECT_BYTES(0x8B, 0xE8);
 311  E :    asm_.mov(esi, eax);
 312  E :    EXPECT_BYTES(0x8B, 0xF0);
 313  E :    asm_.mov(edi, eax);
 314  E :    EXPECT_BYTES(0x8B, 0xF8);
 315    :  
 316  E :    asm_.mov(ebx, eax);
 317  E :    EXPECT_BYTES(0x8B, 0xD8);
 318  E :    asm_.mov(eax, ecx);
 319  E :    EXPECT_BYTES(0x8B, 0xC1);
 320  E :    asm_.mov(eax, ebx);
 321  E :    EXPECT_BYTES(0x8B, 0xC3);
 322  E :    asm_.mov(eax, edx);
 323  E :    EXPECT_BYTES(0x8B, 0xC2);
 324  E :    asm_.mov(eax, esp);
 325  E :    EXPECT_BYTES(0x8B, 0xC4);
 326  E :    asm_.mov(eax, ebp);
 327  E :    EXPECT_BYTES(0x8B, 0xC5);
 328  E :    asm_.mov(eax, esi);
 329  E :    EXPECT_BYTES(0x8B, 0xC6);
 330  E :    asm_.mov(eax, edi);
 331  E :    EXPECT_BYTES(0x8B, 0xC7);
 332  E :  }
 333    :  
 334  E :  TEST_F(AssemblerTest, MovRegisterIndirect) {
 335    :    // Indirect register only source modes.
 336  E :    asm_.mov(ebx, Operand(eax));
 337  E :    EXPECT_BYTES(0x8B, 0x18);
 338  E :    asm_.mov(eax, Operand(ecx));
 339  E :    EXPECT_BYTES(0x8B, 0x01);
 340  E :    asm_.mov(edx, Operand(ebx));
 341  E :    EXPECT_BYTES(0x8B, 0x13);
 342  E :    asm_.mov(ecx, Operand(edx));
 343  E :    EXPECT_BYTES(0x8B, 0x0A);
 344    :  
 345    :    // Note that EBP is a special case that always requires a displacement.
 346  E :    asm_.mov(ebx, Operand(ebp));
 347  E :    EXPECT_BYTES(0x8B, 0x5D, 0x00);
 348    :  
 349    :    // Note that ESP is a special case that always requires a SIB byte.
 350  E :    asm_.mov(ecx, Operand(esp));
 351  E :    EXPECT_BYTES(0x8B, 0x0C, 0x24);
 352    :  
 353  E :    asm_.mov(ebx, Operand(esi));
 354  E :    EXPECT_BYTES(0x8B, 0x1E);
 355  E :    asm_.mov(eax, Operand(edi));
 356  E :    EXPECT_BYTES(0x8B, 0x07);
 357    :  
 358    :    // Indirect register destination modes.
 359  E :    asm_.mov(Operand(eax), ebx);
 360  E :    EXPECT_BYTES(0x89, 0x18);
 361  E :    asm_.mov(Operand(ecx), eax);
 362  E :    EXPECT_BYTES(0x89, 0x01);
 363  E :    asm_.mov(Operand(ebx), edx);
 364  E :    EXPECT_BYTES(0x89, 0x13);
 365  E :    asm_.mov(Operand(edx), ecx);
 366  E :    EXPECT_BYTES(0x89, 0x0A);
 367    :  
 368    :    // Note that EBP is a special case that always requires a displacement.
 369  E :    asm_.mov(Operand(ebp), ebx);
 370  E :    EXPECT_BYTES(0x89, 0x5D, 0x00);
 371    :  
 372    :    // Note that ESP is a special case that always requires a SIB byte.
 373  E :    asm_.mov(Operand(esp), ecx);
 374  E :    EXPECT_BYTES(0x89, 0x0C, 0x24);
 375    :  
 376  E :    asm_.mov(Operand(esi), ebx);
 377  E :    EXPECT_BYTES(0x89, 0x1E);
 378  E :    asm_.mov(Operand(edi), eax);
 379  E :    EXPECT_BYTES(0x89, 0x07);
 380  E :  }
 381    :  
 382  E :  TEST_F(AssemblerTest, MovRegisterDisplacementIndirect) {
 383    :    // Register & displacement source modes.
 384  E :    Displacement cafebabe(0xCAFEBABE, kSize32Bit, NULL);
 385    :  
 386  E :    asm_.mov(ebx, Operand(eax, cafebabe));
 387  E :    EXPECT_BYTES(0x8B, 0x98, 0xBE, 0xBA, 0xFE, 0xCA);
 388  E :    asm_.mov(eax, Operand(ecx, cafebabe));
 389  E :    EXPECT_BYTES(0x8B, 0x81, 0xBE, 0xBA, 0xFE, 0xCA);
 390  E :    asm_.mov(eax, Operand(ebx, cafebabe));
 391  E :    EXPECT_BYTES(0x8B, 0x83, 0xBE, 0xBA, 0xFE, 0xCA);
 392  E :    asm_.mov(eax, Operand(edx, cafebabe));
 393  E :    EXPECT_BYTES(0x8B, 0x82, 0xBE, 0xBA, 0xFE, 0xCA);
 394  E :    asm_.mov(eax, Operand(ebp, cafebabe));
 395  E :    EXPECT_BYTES(0x8B, 0x85, 0xBE, 0xBA, 0xFE, 0xCA);
 396    :  
 397    :    // ESP requires a SIB byte and has a longer encoding.
 398  E :    asm_.mov(eax, Operand(esp, cafebabe));
 399  E :    EXPECT_BYTES(0x8B, 0x84, 0x24, 0xBE, 0xBA, 0xFE, 0xCA);
 400    :  
 401  E :    asm_.mov(eax, Operand(esi, cafebabe));
 402  E :    EXPECT_BYTES(0x8B, 0x86, 0xBE, 0xBA, 0xFE, 0xCA);
 403  E :    asm_.mov(eax, Operand(edi, cafebabe));
 404  E :    EXPECT_BYTES(0x8B, 0x87, 0xBE, 0xBA, 0xFE, 0xCA);
 405    :  
 406    :    // And destination modes.
 407  E :    asm_.mov(Operand(eax, cafebabe), ebx);
 408  E :    EXPECT_BYTES(0x89, 0x98, 0xBE, 0xBA, 0xFE, 0xCA);
 409  E :    asm_.mov(Operand(ecx, cafebabe), eax);
 410  E :    EXPECT_BYTES(0x89, 0x81, 0xBE, 0xBA, 0xFE, 0xCA);
 411  E :    asm_.mov(Operand(ebx, cafebabe), eax);
 412  E :    EXPECT_BYTES(0x89, 0x83, 0xBE, 0xBA, 0xFE, 0xCA);
 413  E :    asm_.mov(Operand(edx, cafebabe), eax);
 414  E :    EXPECT_BYTES(0x89, 0x82, 0xBE, 0xBA, 0xFE, 0xCA);
 415  E :    asm_.mov(Operand(ebp, cafebabe), eax);
 416  E :    EXPECT_BYTES(0x89, 0x85, 0xBE, 0xBA, 0xFE, 0xCA);
 417    :  
 418    :    // ESP requires a SIB byte and has a longer encoding.
 419  E :    asm_.mov(Operand(esp, cafebabe), eax);
 420  E :    EXPECT_BYTES(0x89, 0x84, 0x24, 0xBE, 0xBA, 0xFE, 0xCA);
 421    :  
 422  E :    asm_.mov(Operand(esi, cafebabe), eax);
 423  E :    EXPECT_BYTES(0x89, 0x86, 0xBE, 0xBA, 0xFE, 0xCA);
 424  E :    asm_.mov(Operand(edi, cafebabe), eax);
 425  E :    EXPECT_BYTES(0x89, 0x87, 0xBE, 0xBA, 0xFE, 0xCA);
 426    :  
 427    :    // Test a sampling of 8-bit displacements.
 428  E :    Displacement ca(0xCA, kSize8Bit, NULL);
 429    :  
 430    :    // Source.
 431  E :    asm_.mov(ebx, Operand(eax, ca));
 432  E :    EXPECT_BYTES(0x8B, 0x58, 0xCA);
 433    :  
 434    :    // ESP requires a SIB byte and has a longer encoding.
 435  E :    asm_.mov(eax, Operand(esp, ca));
 436  E :    EXPECT_BYTES(0x8B, 0x44, 0x24, 0xCA);
 437    :  
 438    :    // And destination modes.
 439  E :    asm_.mov(Operand(eax, ca), ebx);
 440  E :    EXPECT_BYTES(0x89, 0x58, 0xCA);
 441    :  
 442    :    // ESP requires a SIB byte and has a longer encoding.
 443  E :    asm_.mov(Operand(esp, ca), eax);
 444  E :    EXPECT_BYTES(0x89, 0x44, 0x24, 0xCA);
 445  E :  }
 446    :  
 447  E :  TEST_F(AssemblerTest, MovDisplacementIndirect) {
 448    :    // Displacement-only mode.
 449  E :    Displacement cafebabe(0xCAFEBABE, kSize32Bit, NULL);
 450    :  
 451    :    // Source, note EAX has a shortcut encoding.
 452  E :    asm_.mov(eax, Operand(cafebabe));
 453  E :    EXPECT_BYTES(0xA1, 0xBE, 0xBA, 0xFE, 0xCA);
 454  E :    asm_.mov(ecx, Operand(cafebabe));
 455  E :    EXPECT_BYTES(0x8B, 0x0D, 0xBE, 0xBA, 0xFE, 0xCA);
 456    :  
 457    :    // Destination, again EAX is special.
 458  E :    asm_.mov(Operand(cafebabe), eax);
 459  E :    EXPECT_BYTES(0xA3, 0xBE, 0xBA, 0xFE, 0xCA);
 460    :  
 461  E :    asm_.mov(Operand(cafebabe), ecx);
 462  E :    EXPECT_BYTES(0x89, 0x0D, 0xBE, 0xBA, 0xFE, 0xCA);
 463  E :  }
 464    :  
 465  E :  TEST_F(AssemblerTest, MovRegisterBaseDisplacementScaleIndirect) {
 466    :    // There are 8 base * 7 index * 4 scales = 224 combinations.
 467    :    // We don't test all of them, but rather cycle through each of base,
 468    :    // index and scale individually.
 469  E :    Displacement cafebabe(0xCAFEBABE, kSize32Bit, NULL);
 470    :  
 471    :    // Source mode, base register.
 472  E :    asm_.mov(edx, Operand(ecx, eax, kTimes4, cafebabe));
 473  E :    EXPECT_BYTES(0x8B, 0x94, 0x81, 0xBE, 0xBA, 0xFE, 0xCA);
 474  E :    asm_.mov(eax, Operand(ecx, eax, kTimes4, cafebabe));
 475  E :    EXPECT_BYTES(0x8B, 0x84, 0x81, 0xBE, 0xBA, 0xFE, 0xCA);
 476  E :    asm_.mov(eax, Operand(edx, eax, kTimes4, cafebabe));
 477  E :    EXPECT_BYTES(0x8B, 0x84, 0x82, 0xBE, 0xBA, 0xFE, 0xCA);
 478  E :    asm_.mov(eax, Operand(ebx, eax, kTimes4, cafebabe));
 479  E :    EXPECT_BYTES(0x8B, 0x84, 0x83, 0xBE, 0xBA, 0xFE, 0xCA);
 480  E :    asm_.mov(eax, Operand(esp, eax, kTimes4, cafebabe));
 481  E :    EXPECT_BYTES(0x8B, 0x84, 0x84, 0xBE, 0xBA, 0xFE, 0xCA);
 482  E :    asm_.mov(eax, Operand(ebp, eax, kTimes4, cafebabe));
 483  E :    EXPECT_BYTES(0x8B, 0x84, 0x85, 0xBE, 0xBA, 0xFE, 0xCA);
 484  E :    asm_.mov(eax, Operand(esi, eax, kTimes4, cafebabe));
 485  E :    EXPECT_BYTES(0x8B, 0x84, 0x86, 0xBE, 0xBA, 0xFE, 0xCA);
 486  E :    asm_.mov(eax, Operand(edi, eax, kTimes4, cafebabe));
 487  E :    EXPECT_BYTES(0x8B, 0x84, 0x87, 0xBE, 0xBA, 0xFE, 0xCA);
 488    :  
 489    :    // Source mode, index register.
 490  E :    asm_.mov(ebx, Operand(ecx, eax, kTimes4, cafebabe));
 491  E :    EXPECT_BYTES(0x8B, 0x9C, 0x81, 0xBE, 0xBA, 0xFE, 0xCA);
 492  E :    asm_.mov(eax, Operand(eax, ecx, kTimes4, cafebabe));
 493  E :    EXPECT_BYTES(0x8B, 0x84, 0x88, 0xBE, 0xBA, 0xFE, 0xCA);
 494  E :    asm_.mov(eax, Operand(eax, edx, kTimes4, cafebabe));
 495  E :    EXPECT_BYTES(0x8B, 0x84, 0x90, 0xBE, 0xBA, 0xFE, 0xCA);
 496  E :    asm_.mov(eax, Operand(eax, ebx, kTimes4, cafebabe));
 497  E :    EXPECT_BYTES(0x8B, 0x84, 0x98, 0xBE, 0xBA, 0xFE, 0xCA);
 498  E :    asm_.mov(eax, Operand(eax, ebp, kTimes4, cafebabe));
 499  E :    EXPECT_BYTES(0x8B, 0x84, 0xA8, 0xBE, 0xBA, 0xFE, 0xCA);
 500  E :    asm_.mov(eax, Operand(eax, esi, kTimes4, cafebabe));
 501  E :    EXPECT_BYTES(0x8B, 0x84, 0xB0, 0xBE, 0xBA, 0xFE, 0xCA);
 502  E :    asm_.mov(eax, Operand(eax, edi, kTimes4, cafebabe));
 503  E :    EXPECT_BYTES(0x8B, 0x84, 0xB8, 0xBE, 0xBA, 0xFE, 0xCA);
 504    :  
 505    :    // Source mode, Scale.
 506  E :    asm_.mov(ebx, Operand(ecx, eax, kTimes1, cafebabe));
 507  E :    EXPECT_BYTES(0x8B, 0x9C, 0x01, 0xBE, 0xBA, 0xFE, 0xCA);
 508  E :    asm_.mov(ebx, Operand(ecx, eax, kTimes2, cafebabe));
 509  E :    EXPECT_BYTES(0x8B, 0x9C, 0x41, 0xBE, 0xBA, 0xFE, 0xCA);
 510  E :    asm_.mov(ebx, Operand(ecx, eax, kTimes4, cafebabe));
 511  E :    EXPECT_BYTES(0x8B, 0x9C, 0x81, 0xBE, 0xBA, 0xFE, 0xCA);
 512  E :    asm_.mov(ebx, Operand(ecx, eax, kTimes8, cafebabe));
 513  E :    EXPECT_BYTES(0x8B, 0x9C, 0xC1, 0xBE, 0xBA, 0xFE, 0xCA);
 514    :  
 515    :    // Destination mode, base register.
 516  E :    asm_.mov(Operand(eax, eax, kTimes4, cafebabe), ecx);
 517  E :    EXPECT_BYTES(0x89, 0x8C, 0x80, 0xBE, 0xBA, 0xFE, 0xCA);
 518  E :    asm_.mov(Operand(ecx, eax, kTimes4, cafebabe), eax);
 519  E :    EXPECT_BYTES(0x89, 0x84, 0x81, 0xBE, 0xBA, 0xFE, 0xCA);
 520  E :    asm_.mov(Operand(edx, eax, kTimes4, cafebabe), eax);
 521  E :    EXPECT_BYTES(0x89, 0x84, 0x82, 0xBE, 0xBA, 0xFE, 0xCA);
 522  E :    asm_.mov(Operand(ebx, eax, kTimes4, cafebabe), eax);
 523  E :    EXPECT_BYTES(0x89, 0x84, 0x83, 0xBE, 0xBA, 0xFE, 0xCA);
 524  E :    asm_.mov(Operand(esp, eax, kTimes4, cafebabe), eax);
 525  E :    EXPECT_BYTES(0x89, 0x84, 0x84, 0xBE, 0xBA, 0xFE, 0xCA);
 526  E :    asm_.mov(Operand(ebp, eax, kTimes4, cafebabe), eax);
 527  E :    EXPECT_BYTES(0x89, 0x84, 0x85, 0xBE, 0xBA, 0xFE, 0xCA);
 528  E :    asm_.mov(Operand(esi, eax, kTimes4, cafebabe), eax);
 529  E :    EXPECT_BYTES(0x89, 0x84, 0x86, 0xBE, 0xBA, 0xFE, 0xCA);
 530  E :    asm_.mov(Operand(edi, eax, kTimes4, cafebabe), eax);
 531  E :    EXPECT_BYTES(0x89, 0x84, 0x87, 0xBE, 0xBA, 0xFE, 0xCA);
 532    :  
 533    :    // Destination mode, index register.
 534  E :    asm_.mov(Operand(ecx, eax, kTimes4, cafebabe), ebx);
 535  E :    EXPECT_BYTES(0x89, 0x9C, 0x81, 0xBE, 0xBA, 0xFE, 0xCA);
 536  E :    asm_.mov(Operand(eax, ecx, kTimes4, cafebabe), eax);
 537  E :    EXPECT_BYTES(0x89, 0x84, 0x88, 0xBE, 0xBA, 0xFE, 0xCA);
 538  E :    asm_.mov(Operand(eax, edx, kTimes4, cafebabe), eax);
 539  E :    EXPECT_BYTES(0x89, 0x84, 0x90, 0xBE, 0xBA, 0xFE, 0xCA);
 540  E :    asm_.mov(Operand(eax, ebx, kTimes4, cafebabe), eax);
 541  E :    EXPECT_BYTES(0x89, 0x84, 0x98, 0xBE, 0xBA, 0xFE, 0xCA);
 542  E :    asm_.mov(Operand(eax, ebp, kTimes4, cafebabe), eax);
 543  E :    EXPECT_BYTES(0x89, 0x84, 0xA8, 0xBE, 0xBA, 0xFE, 0xCA);
 544  E :    asm_.mov(Operand(eax, esi, kTimes4, cafebabe), eax);
 545  E :    EXPECT_BYTES(0x89, 0x84, 0xB0, 0xBE, 0xBA, 0xFE, 0xCA);
 546  E :    asm_.mov(Operand(eax, edi, kTimes4, cafebabe), eax);
 547  E :    EXPECT_BYTES(0x89, 0x84, 0xB8, 0xBE, 0xBA, 0xFE, 0xCA);
 548    :  
 549    :    // Destination mode, Scale.
 550  E :    asm_.mov(Operand(ecx, eax, kTimes1, cafebabe), ebx);
 551  E :    EXPECT_BYTES(0x89, 0x9C, 0x01, 0xBE, 0xBA, 0xFE, 0xCA);
 552  E :    asm_.mov(Operand(ecx, eax, kTimes2, cafebabe), ebx);
 553  E :    EXPECT_BYTES(0x89, 0x9C, 0x41, 0xBE, 0xBA, 0xFE, 0xCA);
 554  E :    asm_.mov(Operand(ecx, eax, kTimes4, cafebabe), ebx);
 555  E :    EXPECT_BYTES(0x89, 0x9C, 0x81, 0xBE, 0xBA, 0xFE, 0xCA);
 556  E :    asm_.mov(Operand(ecx, eax, kTimes8, cafebabe), ebx);
 557  E :    EXPECT_BYTES(0x89, 0x9C, 0xC1, 0xBE, 0xBA, 0xFE, 0xCA);
 558  E :  }
 559    :  
 560  E :  TEST_F(AssemblerTest, MovRegisterBaseIndexScaleIndirect) {
 561    :    // Tests the displacement-less [base + index * scale].
 562  E :    asm_.mov(edx, Operand(esi, eax, kTimes8));
 563  E :    EXPECT_BYTES(0x8B, 0x14, 0xC6);
 564  E :  }
 565    :  
 566  E :  TEST_F(AssemblerTest, MovRegisterDisplacementScaleIndirect) {
 567    :    // Tests [index * scale + displ] modes, which are always encoded with a
 568    :    // 32-bit displacement, including [index * scale], which has a zero 32-bit
 569    :    // displacement that will be omitted from disassembly.
 570    :  
 571  E :    Displacement one(1, kSize8Bit, NULL);
 572    :  
 573    :    // Source mode.
 574  E :    asm_.mov(edx, Operand(eax, kTimes4, one));
 575  E :    EXPECT_BYTES(0x8B, 0x14, 0x85, 0x01, 0x00, 0x00, 0x00);
 576  E :    asm_.mov(edx, Operand(ecx, kTimes4, one));
 577  E :    EXPECT_BYTES(0x8B, 0x14, 0x8D, 0x01, 0x00, 0x00, 0x00);
 578  E :    asm_.mov(edx, Operand(edx, kTimes4, one));
 579  E :    EXPECT_BYTES(0x8B, 0x14, 0x95, 0x01, 0x00, 0x00, 0x00);
 580  E :    asm_.mov(edx, Operand(ebx, kTimes4, one));
 581  E :    EXPECT_BYTES(0x8B, 0x14, 0x9D, 0x01, 0x00, 0x00, 0x00);
 582  E :    asm_.mov(edx, Operand(ebp, kTimes4, one));
 583  E :    EXPECT_BYTES(0x8B, 0x14, 0xAD, 0x01, 0x00, 0x00, 0x00);
 584  E :    asm_.mov(edx, Operand(esi, kTimes4, one));
 585  E :    EXPECT_BYTES(0x8B, 0x14, 0xB5, 0x01, 0x00, 0x00, 0x00);
 586  E :    asm_.mov(edx, Operand(edi, kTimes4, one));
 587  E :    EXPECT_BYTES(0x8B, 0x14, 0xBD, 0x01, 0x00, 0x00, 0x00);
 588    :  
 589    :    // Destination mode.
 590  E :    asm_.mov(Operand(eax, kTimes4, one), edx);
 591  E :    EXPECT_BYTES(0x89, 0x14, 0x85, 0x01, 0x00, 0x00, 0x00);
 592  E :    asm_.mov(Operand(ecx, kTimes4, one), edx);
 593  E :    EXPECT_BYTES(0x89, 0x14, 0x8D, 0x01, 0x00, 0x00, 0x00);
 594  E :    asm_.mov(Operand(edx, kTimes4, one), edx);
 595  E :    EXPECT_BYTES(0x89, 0x14, 0x95, 0x01, 0x00, 0x00, 0x00);
 596  E :    asm_.mov(Operand(ebx, kTimes4, one), edx);
 597  E :    EXPECT_BYTES(0x89, 0x14, 0x9D, 0x01, 0x00, 0x00, 0x00);
 598  E :    asm_.mov(Operand(ebp, kTimes4, one), edx);
 599  E :    EXPECT_BYTES(0x89, 0x14, 0xAD, 0x01, 0x00, 0x00, 0x00);
 600  E :    asm_.mov(Operand(esi, kTimes4, one), edx);
 601  E :    EXPECT_BYTES(0x89, 0x14, 0xB5, 0x01, 0x00, 0x00, 0x00);
 602  E :    asm_.mov(Operand(edi, kTimes4, one), edx);
 603  E :    EXPECT_BYTES(0x89, 0x14, 0xBD, 0x01, 0x00, 0x00, 0x00);
 604  E :  }
 605    :  
 606  E :  TEST_F(AssemblerTest, MovImmToRegisterDisplacementScaleIndirect) {
 607  E :    Displacement cafebabe(0xCAFEBABE, kSize32Bit, NULL);
 608  E :    Immediate deadbeef(0xDEADBEEF, kSize32Bit, NULL);
 609    :  
 610    :    // We expect the operand encoding has been adequately tested elsewhere,
 611    :    // so we only test one variant here.
 612  E :    asm_.mov(Operand(ecx, eax, kTimes4, cafebabe), deadbeef);
 613    :    EXPECT_BYTES(0xC7, 0x84, 0x81,
 614    :                 0xBE, 0xBA, 0xFE, 0xCA,
 615  E :                 0xEF, 0xBE, 0xAD, 0xDE);
 616  E :  }
 617    :  
 618  E :  TEST_F(AssemblerTest, MovWithSegmentPrefix) {
 619    :    // Indirect register destination modes.
 620  E :    asm_.mov_fs(Operand(eax), ebx);
 621  E :    EXPECT_BYTES(0x64, 0x89, 0x18);
 622  E :    asm_.mov_fs(Operand(ecx), eax);
 623  E :    EXPECT_BYTES(0x64, 0x89, 0x01);
 624  E :    asm_.mov_fs(Operand(ebx), edx);
 625  E :    EXPECT_BYTES(0x64, 0x89, 0x13);
 626  E :    asm_.mov_fs(Operand(edx), ecx);
 627  E :    EXPECT_BYTES(0x64, 0x89, 0x0A);
 628    :  
 629    :    // Indirect register only source modes.
 630  E :    asm_.mov_fs(ebx, Operand(eax));
 631  E :    EXPECT_BYTES(0x64, 0x8B, 0x18);
 632  E :    asm_.mov_fs(eax, Operand(ecx));
 633  E :    EXPECT_BYTES(0x64, 0x8B, 0x01);
 634  E :    asm_.mov_fs(edx, Operand(ebx));
 635  E :    EXPECT_BYTES(0x64, 0x8B, 0x13);
 636  E :    asm_.mov_fs(ecx, Operand(edx));
 637  E :    EXPECT_BYTES(0x64, 0x8B, 0x0A);
 638  E :  }
 639    :  
 640  E :  TEST_F(AssemblerTest, LeaRegisterIndirect) {
 641    :    // Indirect register only source modes.
 642  E :    asm_.lea(ebx, Operand(eax));
 643  E :    EXPECT_BYTES(0x8D, 0x18);
 644  E :    asm_.lea(eax, Operand(ecx));
 645  E :    EXPECT_BYTES(0x8D, 0x01);
 646  E :    asm_.lea(edx, Operand(ebx));
 647  E :    EXPECT_BYTES(0x8D, 0x13);
 648  E :    asm_.lea(ecx, Operand(edx));
 649  E :    EXPECT_BYTES(0x8D, 0x0A);
 650    :  
 651    :    // Note that EBP is a special case that always requires a displacement.
 652  E :    asm_.lea(ebx, Operand(ebp));
 653  E :    EXPECT_BYTES(0x8D, 0x5D, 0x00);
 654    :  
 655    :    // Note that ESP is a special case that always requires a SIB byte.
 656  E :    asm_.lea(ecx, Operand(esp));
 657  E :    EXPECT_BYTES(0x8D, 0x0C, 0x24);
 658    :  
 659  E :    asm_.lea(ebx, Operand(esi));
 660  E :    EXPECT_BYTES(0x8D, 0x1E);
 661  E :    asm_.lea(eax, Operand(edi));
 662  E :    EXPECT_BYTES(0x8D, 0x07);
 663  E :  }
 664    :  
 665  E :  TEST_F(AssemblerTest, LeaRegisterDisplacementIndirect) {
 666    :    // Register & displacement source modes.
 667  E :    Displacement cafebabe(0xCAFEBABE, kSize32Bit, NULL);
 668    :  
 669  E :    asm_.lea(ebx, Operand(eax, cafebabe));
 670  E :    EXPECT_BYTES(0x8D, 0x98, 0xBE, 0xBA, 0xFE, 0xCA);
 671  E :    asm_.lea(eax, Operand(ecx, cafebabe));
 672  E :    EXPECT_BYTES(0x8D, 0x81, 0xBE, 0xBA, 0xFE, 0xCA);
 673  E :    asm_.lea(eax, Operand(ebx, cafebabe));
 674  E :    EXPECT_BYTES(0x8D, 0x83, 0xBE, 0xBA, 0xFE, 0xCA);
 675  E :    asm_.lea(eax, Operand(edx, cafebabe));
 676  E :    EXPECT_BYTES(0x8D, 0x82, 0xBE, 0xBA, 0xFE, 0xCA);
 677  E :    asm_.lea(eax, Operand(ebp, cafebabe));
 678  E :    EXPECT_BYTES(0x8D, 0x85, 0xBE, 0xBA, 0xFE, 0xCA);
 679    :  
 680    :    // ESP requires a SIB byte and has a longer encoding.
 681  E :    asm_.lea(eax, Operand(esp, cafebabe));
 682  E :    EXPECT_BYTES(0x8D, 0x84, 0x24, 0xBE, 0xBA, 0xFE, 0xCA);
 683    :  
 684  E :    asm_.lea(eax, Operand(esi, cafebabe));
 685  E :    EXPECT_BYTES(0x8D, 0x86, 0xBE, 0xBA, 0xFE, 0xCA);
 686  E :    asm_.lea(eax, Operand(edi, cafebabe));
 687  E :    EXPECT_BYTES(0x8D, 0x87, 0xBE, 0xBA, 0xFE, 0xCA);
 688    :  
 689    :    // Test a sampling of 8-bit displacements.
 690  E :    Displacement ca(0xCA, kSize8Bit, NULL);
 691    :  
 692    :    // Source.
 693  E :    asm_.lea(ebx, Operand(eax, ca));
 694  E :    EXPECT_BYTES(0x8D, 0x58, 0xCA);
 695    :  
 696    :    // ESP requires a SIB byte and has a longer encoding.
 697  E :    asm_.lea(eax, Operand(esp, ca));
 698  E :    EXPECT_BYTES(0x8D, 0x44, 0x24, 0xCA);
 699  E :  }
 700    :  
 701  E :  TEST_F(AssemblerTest, LeaDisplacementIndirect) {
 702    :    // Displacement-only mode.
 703  E :    Displacement cafebabe(0xCAFEBABE, kSize32Bit, NULL);
 704    :  
 705  E :    asm_.lea(eax, Operand(cafebabe));
 706  E :    EXPECT_BYTES(0x8D, 0x05, 0xBE, 0xBA, 0xFE, 0xCA);
 707  E :    asm_.lea(ecx, Operand(cafebabe));
 708  E :    EXPECT_BYTES(0x8D, 0x0D, 0xBE, 0xBA, 0xFE, 0xCA);
 709  E :  }
 710    :  
 711  E :  TEST_F(AssemblerTest, LeaRegisterDisplacementScaleIndirect) {
 712    :    // There are 8 base * 7 index * 4 scales = 224 combinations.
 713    :    // We don't test all of them, but rather cycle through each of base,
 714    :    // index and scale individually.
 715  E :    Displacement cafebabe(0xCAFEBABE, kSize32Bit, NULL);
 716    :  
 717    :    // Source mode, base register.
 718  E :    asm_.lea(edx, Operand(ecx, eax, kTimes4, cafebabe));
 719  E :    EXPECT_BYTES(0x8D, 0x94, 0x81, 0xBE, 0xBA, 0xFE, 0xCA);
 720  E :    asm_.lea(eax, Operand(ecx, eax, kTimes4, cafebabe));
 721  E :    EXPECT_BYTES(0x8D, 0x84, 0x81, 0xBE, 0xBA, 0xFE, 0xCA);
 722  E :    asm_.lea(eax, Operand(edx, eax, kTimes4, cafebabe));
 723  E :    EXPECT_BYTES(0x8D, 0x84, 0x82, 0xBE, 0xBA, 0xFE, 0xCA);
 724  E :    asm_.lea(eax, Operand(ebx, eax, kTimes4, cafebabe));
 725  E :    EXPECT_BYTES(0x8D, 0x84, 0x83, 0xBE, 0xBA, 0xFE, 0xCA);
 726  E :    asm_.lea(eax, Operand(esp, eax, kTimes4, cafebabe));
 727  E :    EXPECT_BYTES(0x8D, 0x84, 0x84, 0xBE, 0xBA, 0xFE, 0xCA);
 728  E :    asm_.lea(eax, Operand(ebp, eax, kTimes4, cafebabe));
 729  E :    EXPECT_BYTES(0x8D, 0x84, 0x85, 0xBE, 0xBA, 0xFE, 0xCA);
 730  E :    asm_.lea(eax, Operand(esi, eax, kTimes4, cafebabe));
 731  E :    EXPECT_BYTES(0x8D, 0x84, 0x86, 0xBE, 0xBA, 0xFE, 0xCA);
 732  E :    asm_.lea(eax, Operand(edi, eax, kTimes4, cafebabe));
 733  E :    EXPECT_BYTES(0x8D, 0x84, 0x87, 0xBE, 0xBA, 0xFE, 0xCA);
 734    :  
 735    :    // Source mode, index register.
 736  E :    asm_.lea(ebx, Operand(ecx, eax, kTimes4, cafebabe));
 737  E :    EXPECT_BYTES(0x8D, 0x9C, 0x81, 0xBE, 0xBA, 0xFE, 0xCA);
 738  E :    asm_.lea(eax, Operand(eax, ecx, kTimes4, cafebabe));
 739  E :    EXPECT_BYTES(0x8D, 0x84, 0x88, 0xBE, 0xBA, 0xFE, 0xCA);
 740  E :    asm_.lea(eax, Operand(eax, edx, kTimes4, cafebabe));
 741  E :    EXPECT_BYTES(0x8D, 0x84, 0x90, 0xBE, 0xBA, 0xFE, 0xCA);
 742  E :    asm_.lea(eax, Operand(eax, ebx, kTimes4, cafebabe));
 743  E :    EXPECT_BYTES(0x8D, 0x84, 0x98, 0xBE, 0xBA, 0xFE, 0xCA);
 744  E :    asm_.lea(eax, Operand(eax, ebp, kTimes4, cafebabe));
 745  E :    EXPECT_BYTES(0x8D, 0x84, 0xA8, 0xBE, 0xBA, 0xFE, 0xCA);
 746  E :    asm_.lea(eax, Operand(eax, esi, kTimes4, cafebabe));
 747  E :    EXPECT_BYTES(0x8D, 0x84, 0xB0, 0xBE, 0xBA, 0xFE, 0xCA);
 748  E :    asm_.lea(eax, Operand(eax, edi, kTimes4, cafebabe));
 749  E :    EXPECT_BYTES(0x8D, 0x84, 0xB8, 0xBE, 0xBA, 0xFE, 0xCA);
 750    :  
 751    :    // Source mode, Scale.
 752  E :    asm_.lea(ebx, Operand(ecx, eax, kTimes1, cafebabe));
 753  E :    EXPECT_BYTES(0x8D, 0x9C, 0x01, 0xBE, 0xBA, 0xFE, 0xCA);
 754  E :    asm_.lea(ebx, Operand(ecx, eax, kTimes2, cafebabe));
 755  E :    EXPECT_BYTES(0x8D, 0x9C, 0x41, 0xBE, 0xBA, 0xFE, 0xCA);
 756  E :    asm_.lea(ebx, Operand(ecx, eax, kTimes4, cafebabe));
 757  E :    EXPECT_BYTES(0x8D, 0x9C, 0x81, 0xBE, 0xBA, 0xFE, 0xCA);
 758  E :    asm_.lea(ebx, Operand(ecx, eax, kTimes8, cafebabe));
 759  E :    EXPECT_BYTES(0x8D, 0x9C, 0xC1, 0xBE, 0xBA, 0xFE, 0xCA);
 760  E :  }
 761    :  
 762  E :  TEST_F(AssemblerTest, Push) {
 763    :    // Register push.
 764  E :    asm_.push(eax);
 765  E :    asm_.push(ecx);
 766  E :    asm_.push(edx);
 767  E :    asm_.push(ebx);
 768  E :    asm_.push(esp);
 769  E :    asm_.push(ebp);
 770  E :    asm_.push(esi);
 771  E :    asm_.push(edi);
 772  E :    EXPECT_BYTES(0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57);
 773    :  
 774    :    // Immediate push.
 775  E :    asm_.push(Immediate(0xCAFEBABE, kSize32Bit, NULL));
 776  E :    EXPECT_BYTES(0x68, 0xBE, 0xBA, 0xFE, 0xCA);
 777    :  
 778    :    // General push, try one variant as the rest are OperandImpl encodings.
 779  E :    asm_.push(Operand(Displacement(0xCAFEBABE, kSize32Bit, NULL)));
 780  E :    EXPECT_BYTES(0xFF, 0x35, 0xBE, 0xBA, 0xFE, 0xCA);
 781    :  
 782  E :    asm_.pushad();
 783  E :    EXPECT_BYTES(0x60);
 784  E :  }
 785    :  
 786  E :  TEST_F(AssemblerTest, Pop) {
 787    :    // Register pop.
 788  E :    asm_.pop(eax);
 789  E :    asm_.pop(ecx);
 790  E :    asm_.pop(edx);
 791  E :    asm_.pop(ebx);
 792  E :    asm_.pop(esp);
 793  E :    asm_.pop(ebp);
 794  E :    asm_.pop(esi);
 795  E :    asm_.pop(edi);
 796  E :    EXPECT_BYTES(0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F);
 797    :  
 798    :    // General pop, try one variant as the rest are OperandImpl encodings.
 799  E :    asm_.pop(Operand(Displacement(0xCAFEBABE, kSize32Bit, NULL)));
 800  E :    EXPECT_BYTES(0x8F, 0x05, 0xBE, 0xBA, 0xFE, 0xCA);
 801    :  
 802  E :    asm_.popad();
 803  E :    EXPECT_BYTES(0x61);
 804  E :  }
 805    :  
 806  E :  TEST_F(AssemblerTest, Flags) {
 807  E :    asm_.pushfd();
 808  E :    asm_.popfd();
 809  E :    asm_.lahf();
 810  E :    asm_.sahf();
 811  E :    EXPECT_BYTES(0x9C, 0x9D, 0x9F, 0x9E);
 812  E :  }
 813    :  
 814  E :  TEST_F(AssemblerTest, TestByte) {
 815  E :    asm_.test(al, bl);
 816  E :    EXPECT_BYTES(0x84, 0xC3);
 817  E :    asm_.test(bh, al);
 818  E :    EXPECT_BYTES(0x84, 0xF8);
 819    :  
 820  E :    asm_.test(al, Immediate(0x0A, kSize8Bit));
 821  E :    EXPECT_BYTES(0xA8, 0x0A);
 822  E :    asm_.test(bh, Immediate(0x0A, kSize8Bit));
 823  E :    EXPECT_BYTES(0xF6, 0xC7, 0x0A);
 824  E :  }
 825    :  
 826  E :  TEST_F(AssemblerTest, Test) {
 827  E :    asm_.test(eax, ecx);
 828  E :    EXPECT_BYTES(0x85, 0xC1);
 829  E :    asm_.test(ecx, Operand(eax));
 830  E :    EXPECT_BYTES(0x85, 0x08);
 831  E :    asm_.test(ecx, Operand(eax, Displacement(10, kSize8Bit)));
 832  E :    EXPECT_BYTES(0x85, 0x48, 0x0A);
 833  E :    asm_.test(ecx, Operand(eax, Displacement(10, kSize32Bit)));
 834  E :    EXPECT_BYTES(0x85, 0x88, 0x0A, 0x00, 0x00, 0x00);
 835    :  
 836  E :    asm_.test(ecx, eax);
 837  E :    EXPECT_BYTES(0x85, 0xC8);
 838  E :    asm_.test(ecx, Operand(eax));
 839  E :    EXPECT_BYTES(0x85, 0x08);
 840  E :    asm_.test(ecx, Operand(eax, Displacement(10, kSize8Bit)));
 841  E :    EXPECT_BYTES(0x85, 0x48, 0x0A);
 842  E :    asm_.test(ecx, Operand(eax, Displacement(10, kSize32Bit)));
 843  E :    EXPECT_BYTES(0x85, 0x88, 0x0A, 0x00, 0x00, 0x00);
 844    :  
 845  E :    asm_.test(Operand(eax), ecx);
 846  E :    EXPECT_BYTES(0x85, 0x08);
 847  E :    asm_.test(Operand(eax, Displacement(10, kSize8Bit)), ecx);
 848  E :    EXPECT_BYTES(0x85, 0x48, 0x0A);
 849  E :    asm_.test(Operand(eax, Displacement(10, kSize32Bit)), ecx);
 850  E :    EXPECT_BYTES(0x85, 0x88, 0x0A, 0x00, 0x00, 0x00);
 851    :  
 852  E :    asm_.test(eax, Immediate(0x0A, kSize8Bit));
 853  E :    EXPECT_BYTES(0xA9, 0x0A, 0x00, 0x00, 0x00);
 854  E :    asm_.test(ecx, Immediate(0x0A, kSize8Bit));
 855  E :    EXPECT_BYTES(0xF7, 0xC1, 0x0A, 0x00, 0x00, 0x00);
 856  E :    asm_.test(ecx, Immediate(0xDEADBEEF, kSize32Bit));
 857  E :    EXPECT_BYTES(0xF7, 0xC1, 0xEF, 0xBE, 0xAD, 0xDE);
 858    :  
 859  E :    asm_.test(Operand(eax), Immediate(1, kSize8Bit));
 860  E :    EXPECT_BYTES(0xF7, 0x00, 0x01, 0x00, 0x00, 0x00);
 861  E :    asm_.test(Operand(eax), Immediate(0xDEADBEEF, kSize32Bit));
 862  E :    EXPECT_BYTES(0xF7, 0x00, 0xEF, 0xBE, 0xAD, 0xDE);
 863    :    asm_.test(Operand(eax, Displacement(10, kSize8Bit)),
 864  E :              Immediate(0x1, kSize8Bit));
 865  E :    EXPECT_BYTES(0xF7, 0x40, 0x0A, 0x01, 0x00, 0x00, 0x00);
 866    :    asm_.test(Operand(eax, Displacement(10, kSize8Bit)),
 867  E :              Immediate(0xDEADBEEF, kSize32Bit));
 868  E :    EXPECT_BYTES(0xF7, 0x40, 0x0A, 0xEF, 0xBE, 0xAD, 0xDE);
 869    :    asm_.test(Operand(eax, Displacement(10, kSize32Bit)),
 870  E :              Immediate(0xDEADBEEF, kSize32Bit));
 871  E :    EXPECT_BYTES(0xF7, 0x80, 0x0A, 0x00, 0x00, 0x00, 0xEF, 0xBE, 0xAD, 0xDE);
 872    :  
 873    :    // Special EAX mode + immediate.
 874  E :    asm_.test(eax, Immediate(0xDEADBEEF, kSize32Bit));
 875  E :    EXPECT_BYTES(0xA9, 0xEF, 0xBE, 0xAD, 0xDE);
 876  E :  }
 877    :  
 878  E :  TEST_F(AssemblerTest, CmpByte) {
 879  E :    asm_.cmp(al, bl);
 880  E :    EXPECT_BYTES(0x3A, 0xC3);
 881  E :    asm_.cmp(bh, al);
 882  E :    EXPECT_BYTES(0x3A, 0xF8);
 883    :  
 884  E :    asm_.cmp(al, Immediate(0x0A, kSize8Bit));
 885  E :    EXPECT_BYTES(0x3C, 0x0A);
 886  E :    asm_.cmp(bh, Immediate(0x0A, kSize8Bit));
 887  E :    EXPECT_BYTES(0x80, 0xFF, 0x0A);
 888  E :  }
 889    :  
 890  E :  TEST_F(AssemblerTest, Cmp) {
 891  E :    asm_.cmp(eax, ecx);
 892  E :    EXPECT_BYTES(0x3B, 0xC1);
 893  E :    asm_.cmp(ecx, Operand(eax));
 894  E :    EXPECT_BYTES(0x3B, 0x08);
 895  E :    asm_.cmp(ecx, Operand(eax, Displacement(10, kSize8Bit)));
 896  E :    EXPECT_BYTES(0x3B, 0x48, 0x0A);
 897  E :    asm_.cmp(ecx, Operand(eax, Displacement(10, kSize32Bit)));
 898  E :    EXPECT_BYTES(0x3B, 0x88, 0x0A, 0x00, 0x00, 0x00);
 899    :  
 900  E :    asm_.cmp(ecx, eax);
 901  E :    EXPECT_BYTES(0x3B, 0xC8);
 902  E :    asm_.cmp(ecx, Operand(eax));
 903  E :    EXPECT_BYTES(0x3B, 0x08);
 904  E :    asm_.cmp(ecx, Operand(eax, Displacement(10, kSize8Bit)));
 905  E :    EXPECT_BYTES(0x3B, 0x48, 0x0A);
 906  E :    asm_.cmp(ecx, Operand(eax, Displacement(10, kSize32Bit)));
 907  E :    EXPECT_BYTES(0x3B, 0x88, 0x0A, 0x00, 0x00, 0x00);
 908    :  
 909  E :    asm_.cmp(Operand(eax), ecx);
 910  E :    EXPECT_BYTES(0x39, 0x08);
 911  E :    asm_.cmp(Operand(eax, Displacement(10, kSize8Bit)), ecx);
 912  E :    EXPECT_BYTES(0x39, 0x48, 0x0A);
 913  E :    asm_.cmp(Operand(eax, Displacement(10, kSize32Bit)), ecx);
 914  E :    EXPECT_BYTES(0x39, 0x88, 0x0A, 0x00, 0x00, 0x00);
 915    :  
 916  E :    asm_.cmp(eax, Immediate(0x0A, kSize8Bit));
 917  E :    EXPECT_BYTES(0x83, 0xF8, 0x0A);
 918  E :    asm_.cmp(ecx, Immediate(0x0A, kSize8Bit));
 919  E :    EXPECT_BYTES(0x83, 0xF9, 0x0A);
 920  E :    asm_.cmp(ecx, Immediate(0xDEADBEEF, kSize32Bit));
 921  E :    EXPECT_BYTES(0x81, 0xF9, 0xEF, 0xBE, 0xAD, 0xDE);
 922    :  
 923  E :    asm_.cmp(Operand(eax), Immediate(1, kSize8Bit));
 924  E :    EXPECT_BYTES(0x83, 0x38, 0x01);
 925  E :    asm_.cmp(Operand(eax), Immediate(0xDEADBEEF, kSize32Bit));
 926  E :    EXPECT_BYTES(0x81, 0x38, 0xEF, 0xBE, 0xAD, 0xDE);
 927    :    asm_.cmp(Operand(eax, Displacement(10, kSize8Bit)),
 928  E :             Immediate(0x1, kSize8Bit));
 929  E :    EXPECT_BYTES(0x83, 0x78, 0x0A, 0x1);
 930    :    asm_.cmp(Operand(eax, Displacement(10, kSize8Bit)),
 931  E :             Immediate(0xDEADBEEF, kSize32Bit));
 932  E :    EXPECT_BYTES(0x81, 0x78, 0x0A, 0xEF, 0xBE, 0xAD, 0xDE);
 933    :    asm_.cmp(Operand(eax, Displacement(10, kSize32Bit)),
 934  E :             Immediate(0xDEADBEEF, kSize32Bit));
 935  E :    EXPECT_BYTES(0x81, 0xB8, 0x0A, 0x00, 0x00, 0x00, 0xEF, 0xBE, 0xAD, 0xDE);
 936    :  
 937    :    // Special EAX mode + immediate.
 938  E :    asm_.cmp(eax, Immediate(0xDEADBEEF, kSize32Bit));
 939  E :    EXPECT_BYTES(0x3D, 0xEF, 0xBE, 0xAD, 0xDE);
 940  E :  }
 941    :  
 942  E :  TEST_F(AssemblerTest, AddByte) {
 943  E :    asm_.add(al, bl);
 944  E :    EXPECT_BYTES(0x02, 0xC3);
 945  E :    asm_.add(bh, al);
 946  E :    EXPECT_BYTES(0x02, 0xF8);
 947    :  
 948  E :    asm_.add(al, Immediate(0x0A, kSize8Bit));
 949  E :    EXPECT_BYTES(0x04, 0x0A);
 950  E :    asm_.add(bh, Immediate(0x0A, kSize8Bit));
 951  E :    EXPECT_BYTES(0x80, 0xC7, 0x0A);
 952  E :  }
 953    :  
 954  E :  TEST_F(AssemblerTest, Add) {
 955  E :    asm_.add(eax, eax);
 956  E :    EXPECT_BYTES(0x03, 0xC0);
 957  E :    asm_.add(eax, Operand(eax));
 958  E :    EXPECT_BYTES(0x03, 0x00);
 959  E :    asm_.add(eax, Operand(eax, Displacement(10, kSize8Bit)));
 960  E :    EXPECT_BYTES(0x03, 0x40, 0x0A);
 961  E :    asm_.add(eax, Operand(eax, Displacement(10, kSize32Bit)));
 962  E :    EXPECT_BYTES(0x03, 0x80, 0x0A, 0x00, 0x00, 0x00);
 963    :  
 964  E :    asm_.add(ecx, eax);
 965  E :    EXPECT_BYTES(0x03, 0xC8);
 966  E :    asm_.add(ecx, Operand(eax));
 967  E :    EXPECT_BYTES(0x03, 0x08);
 968  E :    asm_.add(ecx, Operand(eax, Displacement(10, kSize8Bit)));
 969  E :    EXPECT_BYTES(0x03, 0x48, 0x0A);
 970  E :    asm_.add(ecx, Operand(eax, Displacement(10, kSize32Bit)));
 971  E :    EXPECT_BYTES(0x03, 0x88, 0x0A, 0x00, 0x00, 0x00);
 972    :  
 973  E :    asm_.add(eax, ecx);
 974  E :    EXPECT_BYTES(0x03, 0xC1);
 975  E :    asm_.add(Operand(eax), ecx);
 976  E :    EXPECT_BYTES(0x01, 0x08);
 977  E :    asm_.add(Operand(eax, Displacement(10, kSize8Bit)), ecx);
 978  E :    EXPECT_BYTES(0x01, 0x48, 0x0A);
 979  E :    asm_.add(Operand(eax, Displacement(10, kSize32Bit)), ecx);
 980  E :    EXPECT_BYTES(0x01, 0x88, 0x0A, 0x00, 0x00, 0x00);
 981    :  
 982  E :    asm_.add(eax, Immediate(0x0A, kSize8Bit));
 983  E :    EXPECT_BYTES(0x83, 0xC0, 0x0A);
 984  E :    asm_.add(ecx, Immediate(0x0A, kSize8Bit));
 985  E :    EXPECT_BYTES(0x83, 0xC1, 0x0A);
 986  E :    asm_.add(ecx, Immediate(0xDEADBEEF, kSize32Bit));
 987  E :    EXPECT_BYTES(0x81, 0xC1, 0xEF, 0xBE, 0xAD, 0xDE);
 988    :  
 989  E :    asm_.add(Operand(eax), Immediate(1, kSize8Bit));
 990  E :    EXPECT_BYTES(0x83, 0x00, 0x01);
 991  E :    asm_.add(Operand(eax), Immediate(0xDEADBEEF, kSize32Bit));
 992  E :    EXPECT_BYTES(0x81, 0x00, 0xEF, 0xBE, 0xAD, 0xDE);
 993    :    asm_.add(Operand(eax, Displacement(10, kSize8Bit)),
 994  E :             Immediate(0xDEADBEEF, kSize32Bit));
 995  E :    EXPECT_BYTES(0x81, 0x40, 0x0A, 0xEF, 0xBE, 0xAD, 0xDE);
 996    :    asm_.add(Operand(eax, Displacement(10, kSize32Bit)),
 997  E :             Immediate(0xDEADBEEF, kSize32Bit));
 998  E :    EXPECT_BYTES(0x81, 0x80, 0x0A, 0x00, 0x00, 0x00, 0xEF, 0xBE, 0xAD, 0xDE);
 999    :  
1000    :    // Special EAX mode + immediate.
1001  E :    asm_.add(eax, Immediate(0xDEADBEEF, kSize32Bit));
1002  E :    EXPECT_BYTES(0x05, 0xEF, 0xBE, 0xAD, 0xDE);
1003  E :  }
1004    :  
1005  E :  TEST_F(AssemblerTest, SubByte) {
1006  E :    asm_.sub(al, bl);
1007  E :    EXPECT_BYTES(0x2A, 0xC3);
1008  E :    asm_.sub(bh, al);
1009  E :    EXPECT_BYTES(0x2A, 0xF8);
1010    :  
1011  E :    asm_.sub(al, Immediate(0x0A, kSize8Bit));
1012  E :    EXPECT_BYTES(0x2C, 0x0A);
1013  E :    asm_.sub(bh, Immediate(0x0A, kSize8Bit));
1014  E :    EXPECT_BYTES(0x80, 0xEF, 0x0A);
1015  E :  }
1016    :  
1017  E :  TEST_F(AssemblerTest, Sub) {
1018  E :    asm_.sub(eax, eax);
1019  E :    EXPECT_BYTES(0x2B, 0xC0);
1020  E :    asm_.sub(eax, Operand(eax));
1021  E :    EXPECT_BYTES(0x2B, 0x00);
1022  E :    asm_.sub(eax, Operand(eax, Displacement(10, kSize8Bit)));
1023  E :    EXPECT_BYTES(0x2B, 0x40, 0x0A);
1024  E :    asm_.sub(eax, Operand(eax, Displacement(10, kSize32Bit)));
1025  E :    EXPECT_BYTES(0x2B, 0x80, 0x0A, 0x00, 0x00, 0x00);
1026    :  
1027  E :    asm_.sub(ecx, eax);
1028  E :    EXPECT_BYTES(0x2B, 0xC8);
1029  E :    asm_.sub(ecx, Operand(eax));
1030  E :    EXPECT_BYTES(0x2B, 0x08);
1031  E :    asm_.sub(ecx, Operand(eax, Displacement(10, kSize8Bit)));
1032  E :    EXPECT_BYTES(0x2B, 0x48, 0x0A);
1033  E :    asm_.sub(ecx, Operand(eax, Displacement(10, kSize32Bit)));
1034  E :    EXPECT_BYTES(0x2B, 0x88, 0x0A, 0x00, 0x00, 0x00);
1035    :  
1036  E :    asm_.sub(eax, ecx);
1037  E :    EXPECT_BYTES(0x2B, 0xC1);
1038  E :    asm_.sub(Operand(eax), ecx);
1039  E :    EXPECT_BYTES(0x29, 0x08);
1040  E :    asm_.sub(Operand(eax, Displacement(10, kSize8Bit)), ecx);
1041  E :    EXPECT_BYTES(0x29, 0x48, 0x0A);
1042  E :    asm_.sub(Operand(eax, Displacement(10, kSize32Bit)), ecx);
1043  E :    EXPECT_BYTES(0x29, 0x88, 0x0A, 0x00, 0x00, 0x00);
1044    :  
1045  E :    asm_.sub(eax, Immediate(0x0A, kSize8Bit));
1046  E :    EXPECT_BYTES(0x83, 0xE8, 0x0A);
1047  E :    asm_.sub(ecx, Immediate(0x0A, kSize8Bit));
1048  E :    EXPECT_BYTES(0x83, 0xE9, 0x0A);
1049  E :    asm_.sub(ecx, Immediate(0xDEADBEEF, kSize32Bit));
1050  E :    EXPECT_BYTES(0x81, 0xE9, 0xEF, 0xBE, 0xAD, 0xDE);
1051    :  
1052  E :    asm_.sub(Operand(eax), Immediate(0x1, kSize8Bit));
1053  E :    EXPECT_BYTES(0x83, 0x28, 0x01);
1054  E :    asm_.sub(Operand(eax), Immediate(0xDEADBEEF, kSize32Bit));
1055  E :    EXPECT_BYTES(0x81, 0x28, 0xEF, 0xBE, 0xAD, 0xDE);
1056    :    asm_.sub(Operand(eax, Displacement(10, kSize8Bit)),
1057  E :             Immediate(0xDEADBEEF, kSize32Bit));
1058  E :    EXPECT_BYTES(0x81, 0x68, 0x0A, 0xEF, 0xBE, 0xAD, 0xDE);
1059    :    asm_.sub(Operand(eax, Displacement(10, kSize32Bit)),
1060  E :             Immediate(0xDEADBEEF, kSize32Bit));
1061  E :    EXPECT_BYTES(0x81, 0xA8, 0x0A, 0x00, 0x00, 0x00, 0xEF, 0xBE, 0xAD, 0xDE);
1062    :  
1063    :    // Special EAX mode + immediate.
1064  E :    asm_.sub(eax, Immediate(0xDEADBEEF, kSize32Bit));
1065  E :    EXPECT_BYTES(0x2D, 0xEF, 0xBE, 0xAD, 0xDE);
1066  E :  }
1067    :  
1068  E :  TEST_F(AssemblerTest, Shl) {
1069  E :    asm_.shl(eax, Immediate(0x1, kSize8Bit));
1070  E :    EXPECT_BYTES(0xD1, 0xE0);
1071  E :    asm_.shl(eax, Immediate(0x3, kSize8Bit));
1072  E :    EXPECT_BYTES(0xC1, 0xE0, 0x03);
1073  E :    asm_.shl(ecx, Immediate(0x1, kSize8Bit));
1074  E :    EXPECT_BYTES(0xD1, 0xE1);
1075  E :    asm_.shl(ecx, Immediate(0x3, kSize8Bit));
1076  E :    EXPECT_BYTES(0xC1, 0xE1, 0x03);
1077  E :  }
1078    :  
1079  E :  TEST_F(AssemblerTest, Shr) {
1080  E :    asm_.shr(eax, Immediate(0x1, kSize8Bit));
1081  E :    EXPECT_BYTES(0xD1, 0xE8);
1082  E :    asm_.shr(eax, Immediate(0x3, kSize8Bit));
1083  E :    EXPECT_BYTES(0xC1, 0xE8, 0x03);
1084  E :    asm_.shr(ecx, Immediate(0x1, kSize8Bit));
1085  E :    EXPECT_BYTES(0xD1, 0xE9);
1086  E :    asm_.shr(ecx, Immediate(0x3, kSize8Bit));
1087  E :    EXPECT_BYTES(0xC1, 0xE9, 0x03);
1088  E :  }
1089    :  
1090  E :  TEST_F(AssemblerTest, Xchg32) {
1091    :    // Any exchange with the eax register should generate a single byte
1092    :    // instruction.
1093  E :    asm_.xchg(eax, eax);
1094  E :    EXPECT_BYTES(0x90);
1095  E :    asm_.xchg(eax, ecx);
1096  E :    EXPECT_BYTES(0x91);
1097  E :    asm_.xchg(esp, eax);
1098  E :    EXPECT_BYTES(0x94);
1099    :  
1100    :    // Any exchanges not involving the eax register should generate 2-byte
1101    :    // instructions.
1102  E :    asm_.xchg(ebx, ecx);
1103  E :    EXPECT_BYTES(0x87, 0xCB);
1104  E :    asm_.xchg(edx, esp);
1105  E :    EXPECT_BYTES(0x87, 0xE2);
1106  E :    asm_.xchg(esp, edx);
1107  E :    EXPECT_BYTES(0x87, 0xD4);
1108    :  
1109  E :    int ref = 0;
1110    :    asm_.xchg(eax,
1111  E :              Operand(ecx, Displacement(0xCAFEBABE, kSize32Bit, &ref)));
1112  E :    EXPECT_BYTES(0x87, 0x81, 0xBE, 0xBA, 0xFE, 0xCA);
1113  E :  }
1114    :  
1115  E :  TEST_F(AssemblerTest, Xchg16) {
1116    :    // Any exchange with the ax register should generate 2-byte instructions.
1117  E :    asm_.xchg(ax, ax);
1118  E :    EXPECT_BYTES(0x66, 0x90);
1119  E :    asm_.xchg(ax, cx);
1120  E :    EXPECT_BYTES(0x66, 0x91);
1121  E :    asm_.xchg(sp, ax);
1122  E :    EXPECT_BYTES(0x66, 0x94);
1123    :  
1124    :    // Any exchanges not involving the ax register should generate 3-byte
1125    :    // instructions.
1126  E :    asm_.xchg(cx, dx);
1127  E :    EXPECT_BYTES(0x66, 0x87, 0xD1);
1128  E :    asm_.xchg(bx, cx);
1129  E :    EXPECT_BYTES(0x66, 0x87, 0xCB);
1130  E :    asm_.xchg(dx, sp);
1131  E :    EXPECT_BYTES(0x66, 0x87, 0xE2);
1132  E :    asm_.xchg(sp, dx);
1133  E :    EXPECT_BYTES(0x66, 0x87, 0xD4);
1134  E :    asm_.xchg(bp, dx);
1135  E :    EXPECT_BYTES(0x66, 0x87, 0xD5);
1136  E :    asm_.xchg(si, sp);
1137  E :    EXPECT_BYTES(0x66, 0x87, 0xE6);
1138  E :    asm_.xchg(di, cx);
1139  E :    EXPECT_BYTES(0x66, 0x87, 0xCF);
1140  E :  }
1141    :  
1142  E :  TEST_F(AssemblerTest, Xchg8) {
1143  E :    asm_.xchg(al, ah);
1144  E :    EXPECT_BYTES(0x86, 0xE0);
1145  E :    asm_.xchg(cl, bl);
1146  E :    EXPECT_BYTES(0x86, 0xD9);
1147  E :    asm_.xchg(dl, bh);
1148  E :    EXPECT_BYTES(0x86, 0xFA);
1149  E :    asm_.xchg(bl, dh);
1150  E :    EXPECT_BYTES(0x86, 0xF3);
1151  E :    asm_.xchg(ah, cl);
1152  E :    EXPECT_BYTES(0x86, 0xCC);
1153  E :    asm_.xchg(ch, dl);
1154  E :    EXPECT_BYTES(0x86, 0xD5);
1155  E :    asm_.xchg(dh, ch);
1156  E :    EXPECT_BYTES(0x86, 0xEE);
1157  E :    asm_.xchg(bh, al);
1158  E :    EXPECT_BYTES(0x86, 0xC7);
1159  E :  }
1160    :  
1161  E :  TEST_F(AssemblerTest, Ja) {
1162  E :    ConditionCode cc = kAbove;
1163  E :    asm_.set_location(0xCAFEBABE);
1164    :  
1165  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1166  E :    EXPECT_BYTES(0x77, 0xFE);
1167    :  
1168  E :    ASSERT_EQ(1, kShortBranchOpcodeSize);
1169  E :    ASSERT_EQ(2, kShortBranchSize);
1170    :  
1171  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1172  E :    EXPECT_BYTES(0x0F, 0x87, 0xF8, 0xFF, 0xFF, 0xFF);
1173    :  
1174  E :    ASSERT_EQ(2, kLongBranchOpcodeSize);
1175  E :    ASSERT_EQ(6, kLongBranchSize);
1176  E :  }
1177    :  
1178  E :  TEST_F(AssemblerTest, Jae) {
1179  E :    ConditionCode cc = kAboveEqual;
1180  E :    asm_.set_location(0xCAFEBABE);
1181    :  
1182  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1183  E :    EXPECT_BYTES(0x73, 0xFE);
1184  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1185  E :    EXPECT_BYTES(0x0F, 0x83, 0xF8, 0xFF, 0xFF, 0xFF);
1186  E :  }
1187    :  
1188  E :  TEST_F(AssemblerTest, Jb) {
1189  E :    ConditionCode cc = kBelow;
1190  E :    asm_.set_location(0xCAFEBABE);
1191    :  
1192  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1193  E :    EXPECT_BYTES(0x72, 0xFE);
1194  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1195  E :    EXPECT_BYTES(0x0F, 0x82, 0xF8, 0xFF, 0xFF, 0xFF);
1196  E :  }
1197    :  
1198  E :  TEST_F(AssemblerTest, Jbe) {
1199  E :    ConditionCode cc = kBelowEqual;
1200  E :    asm_.set_location(0xCAFEBABE);
1201    :  
1202  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1203  E :    EXPECT_BYTES(0x76, 0xFE);
1204  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1205  E :    EXPECT_BYTES(0x0F, 0x86, 0xF8, 0xFF, 0xFF, 0xFF);
1206  E :  }
1207    :  
1208  E :  TEST_F(AssemblerTest, Jc) {
1209  E :    ConditionCode cc = kCarry;
1210  E :    asm_.set_location(0xCAFEBABE);
1211    :  
1212  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1213  E :    EXPECT_BYTES(0x72, 0xFE);
1214  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1215  E :    EXPECT_BYTES(0x0F, 0x82, 0xF8, 0xFF, 0xFF, 0xFF);
1216  E :  }
1217    :  
1218  E :  TEST_F(AssemblerTest, Je) {
1219  E :    ConditionCode cc = kEqual;
1220  E :    asm_.set_location(0xCAFEBABE);
1221    :  
1222  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1223  E :    EXPECT_BYTES(0x74, 0xFE);
1224  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1225  E :    EXPECT_BYTES(0x0F, 0x84, 0xF8, 0xFF, 0xFF, 0xFF);
1226  E :  }
1227    :  
1228  E :  TEST_F(AssemblerTest, Jecxz) {
1229  E :    asm_.set_location(0xCAFEBABE);
1230    :  
1231  E :    asm_.jecxz(Immediate(0xCAFEBABE, kSize8Bit, NULL));
1232  E :    EXPECT_BYTES(0xE3, 0xFE);
1233  E :  }
1234    :  
1235  E :  TEST_F(AssemblerTest, Jg) {
1236  E :    ConditionCode cc = kGreater;
1237  E :    asm_.set_location(0xCAFEBABE);
1238    :  
1239  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1240  E :    EXPECT_BYTES(0x7F, 0xFE);
1241  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1242  E :    EXPECT_BYTES(0x0F, 0x8F, 0xF8, 0xFF, 0xFF, 0xFF);
1243  E :  }
1244    :  
1245  E :  TEST_F(AssemblerTest, Jge) {
1246  E :    ConditionCode cc = kGreaterEqual;
1247  E :    asm_.set_location(0xCAFEBABE);
1248    :  
1249  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1250  E :    EXPECT_BYTES(0x7D, 0xFE);
1251  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1252  E :    EXPECT_BYTES(0x0F, 0x8D, 0xF8, 0xFF, 0xFF, 0xFF);
1253  E :  }
1254    :  
1255  E :  TEST_F(AssemblerTest, Jl) {
1256  E :    ConditionCode cc = kLess;
1257  E :    asm_.set_location(0xCAFEBABE);
1258    :  
1259  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1260  E :    EXPECT_BYTES(0x7C, 0xFE);
1261  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1262  E :    EXPECT_BYTES(0x0F, 0x8C, 0xF8, 0xFF, 0xFF, 0xFF);
1263  E :  }
1264    :  
1265  E :  TEST_F(AssemblerTest, Jle) {
1266  E :    ConditionCode cc = kLessEqual;
1267  E :    asm_.set_location(0xCAFEBABE);
1268    :  
1269  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1270  E :    EXPECT_BYTES(0x7E, 0xFE);
1271  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1272  E :    EXPECT_BYTES(0x0F, 0x8E, 0xF8, 0xFF, 0xFF, 0xFF);
1273  E :  }
1274    :  
1275  E :  TEST_F(AssemblerTest, Jo) {
1276  E :    ConditionCode cc = kOverflow;
1277  E :    asm_.set_location(0xCAFEBABE);
1278    :  
1279  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1280  E :    EXPECT_BYTES(0x70, 0xFE);
1281  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1282  E :    EXPECT_BYTES(0x0F, 0x80, 0xF8, 0xFF, 0xFF, 0xFF);
1283  E :  }
1284    :  
1285  E :  TEST_F(AssemblerTest, Jpe) {
1286  E :    ConditionCode cc = kParityEven;
1287  E :    asm_.set_location(0xCAFEBABE);
1288    :  
1289  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1290  E :    EXPECT_BYTES(0x7A, 0xFE);
1291  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1292  E :    EXPECT_BYTES(0x0F, 0x8A, 0xF8, 0xFF, 0xFF, 0xFF);
1293  E :  }
1294    :  
1295  E :  TEST_F(AssemblerTest, Jpo) {
1296  E :    ConditionCode cc = kParityOdd;
1297  E :    asm_.set_location(0xCAFEBABE);
1298    :  
1299  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1300  E :    EXPECT_BYTES(0x7B, 0xFE);
1301  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1302  E :    EXPECT_BYTES(0x0F, 0x8B, 0xF8, 0xFF, 0xFF, 0xFF);
1303  E :  }
1304    :  
1305  E :  TEST_F(AssemblerTest, Js) {
1306  E :    ConditionCode cc = kSign;
1307  E :    asm_.set_location(0xCAFEBABE);
1308    :    COMPILE_ASSERT(kSign == kNegative, kSignAndPositiveAreAliases);
1309    :  
1310  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1311  E :    EXPECT_BYTES(0x78, 0xFE);
1312  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1313  E :    EXPECT_BYTES(0x0F, 0x88, 0xF8, 0xFF, 0xFF, 0xFF);
1314  E :  }
1315    :  
1316  E :  TEST_F(AssemblerTest, Jz) {
1317  E :    ConditionCode cc = kZero;
1318  E :    asm_.set_location(0xCAFEBABE);
1319    :  
1320  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1321  E :    EXPECT_BYTES(0x74, 0xFE);
1322  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1323  E :    EXPECT_BYTES(0x0F, 0x84, 0xF8, 0xFF, 0xFF, 0xFF);
1324  E :  }
1325    :  
1326  E :  TEST_F(AssemblerTest, Jnc) {
1327  E :    ConditionCode cc = kNotCarry;
1328  E :    asm_.set_location(0xCAFEBABE);
1329    :  
1330  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1331  E :    EXPECT_BYTES(0x73, 0xFE);
1332  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1333  E :    EXPECT_BYTES(0x0F, 0x83, 0xF8, 0xFF, 0xFF, 0xFF);
1334  E :  }
1335    :  
1336  E :  TEST_F(AssemblerTest, Jne) {
1337  E :    ConditionCode cc = kNotEqual;
1338  E :    asm_.set_location(0xCAFEBABE);
1339    :  
1340  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1341  E :    EXPECT_BYTES(0x75, 0xFE);
1342  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1343  E :    EXPECT_BYTES(0x0F, 0x85, 0xF8, 0xFF, 0xFF, 0xFF);
1344  E :  }
1345    :  
1346  E :  TEST_F(AssemblerTest, Jno) {
1347  E :    ConditionCode cc = kNoOverflow;
1348  E :    asm_.set_location(0xCAFEBABE);
1349    :  
1350  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1351  E :    EXPECT_BYTES(0x71, 0xFE);
1352  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1353  E :    EXPECT_BYTES(0x0F, 0x81, 0xF8, 0xFF, 0xFF, 0xFF);
1354  E :  }
1355    :  
1356  E :  TEST_F(AssemblerTest, Jns) {
1357    :    COMPILE_ASSERT(kNotSign == kPositive, kSignAndPositiveAreAliases);
1358  E :    ConditionCode cc = kNotSign;
1359  E :    asm_.set_location(0xCAFEBABE);
1360    :  
1361  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1362  E :    EXPECT_BYTES(0x79, 0xFE);
1363  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1364  E :    EXPECT_BYTES(0x0F, 0x89, 0xF8, 0xFF, 0xFF, 0xFF);
1365  E :  }
1366    :  
1367  E :  TEST_F(AssemblerTest, Jnz) {
1368  E :    ConditionCode cc = kNotZero;
1369  E :    asm_.set_location(0xCAFEBABE);
1370    :  
1371  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize8Bit, NULL));
1372  E :    EXPECT_BYTES(0x75, 0xFE);
1373  E :    asm_.j(cc, Immediate(0xCAFEBABE, kSize32Bit, NULL));
1374  E :    EXPECT_BYTES(0x0F, 0x85, 0xF8, 0xFF, 0xFF, 0xFF);
1375  E :  }
1376    :  
1377  E :  TEST_F(AssemblerTest, JnzToBoundLabel) {
1378  E :    ConditionCode cc = kNotZero;
1379  E :    asm_.set_location(0xCAFEBABE);
1380    :  
1381    :    // Bind the label.
1382  E :    Label label(&asm_);
1383  E :    label.Bind();
1384    :  
1385    :    // Test default to short.
1386  E :    EXPECT_TRUE(asm_.j(cc, &label));
1387    :    // Test explicit long.
1388  E :    EXPECT_TRUE(asm_.j(cc, &label, kSize32Bit));
1389    :  
1390    :    EXPECT_BYTES(0x75, 0xFE,
1391  E :                 0x0F, 0x85, 0xF8, 0xFF, 0xFF, 0xFF);
1392    :  
1393    :    // Jump the location to the limit of the negative 8 bit range of -128 bytes
1394    :    // from the start of the succeeding instruction.
1395  E :    asm_.set_location(0xCAFEBABE + 128 - kShortBranchSize);
1396  E :    EXPECT_TRUE(asm_.j(cc, &label));
1397  E :    EXPECT_BYTES(0x75, 0x80);
1398    :  
1399    :    // Jump the location just beyond the negative 8 bit range of -128 bytes
1400    :    // from the start of the succeeding instruction.
1401  E :    asm_.set_location(0xCAFEBABE + 128 - kShortBranchSize + 1);
1402  E :    EXPECT_TRUE(asm_.j(cc, &label));
1403  E :    EXPECT_BYTES(0x0F, 0x85, 0x7B, 0xFF, 0xFF, 0xFF);
1404    :  
1405    :    // Jump the location to the limit of the positive 8 bit range of +127 bytes
1406    :    // from the start of the succeeding instruction.
1407  E :    asm_.set_location(0xCAFEBABE - (127 + kShortBranchSize));
1408  E :    EXPECT_TRUE(asm_.j(cc, &label));
1409  E :    EXPECT_BYTES(0x75, 0x7F);
1410    :  
1411    :    // Jump the location just beyond the positive 8 bit range of +127 bytes
1412    :    // from the start of the succeeding instruction.
1413  E :    asm_.set_location(0xCAFEBABE - (127 + kShortBranchSize + 1));
1414    :  
1415    :    // Test that requesting a short reach fails.
1416  E :    EXPECT_FALSE(asm_.j(cc, &label, kSize8Bit));
1417    :  
1418    :    // Test default generation of long reach.
1419  E :    EXPECT_TRUE(asm_.j(cc, &label));
1420  E :    EXPECT_BYTES(0x0F, 0x85, 0x7C, 0x00, 0x00, 0x00);
1421  E :  }
1422    :  
1423  E :  TEST_F(AssemblerTest, JnzToUnBoundLabel) {
1424  E :    ConditionCode cc = kNotZero;
1425  E :    asm_.set_location(0xCAFEBABE);
1426    :  
1427    :    // Create a label.
1428  E :    Label label(&asm_);
1429    :  
1430    :    // The default is a long jump.
1431  E :    EXPECT_TRUE(asm_.j(cc, &label));
1432    :  
1433    :    // Generate an explicit long jump.
1434  E :    EXPECT_TRUE(asm_.j(cc, &label, kSize32Bit));
1435    :  
1436    :    // Generate a short jump also.
1437  E :    EXPECT_TRUE(asm_.j(cc, &label, kSize8Bit));
1438    :  
1439  E :    EXPECT_TRUE(label.Bind());
1440    :  
1441    :    EXPECT_BYTES(0x0F, 0x85, 0x08, 0x00, 0x00, 0x00,
1442    :                 0x0F, 0x85, 0x02, 0x00, 0x00, 0x00,
1443  E :                 0x75, 0x00);
1444  E :  }
1445    :  
1446  E :  TEST_F(AssemblerTest, JnzToOutOfBoundsLabel) {
1447  E :    ConditionCode cc = kNotZero;
1448  E :    asm_.set_location(0xCAFEBABE);
1449    :  
1450    :    // Create a label.
1451  E :    Label label(&asm_);
1452    :  
1453    :    // Generate a short jump.
1454  E :    asm_.j(cc, &label, kSize8Bit);
1455    :  
1456    :    // Move the location forward past the range of an 8 bit PC-relative ref.
1457  E :    asm_.set_location(asm_.location() + 128);
1458    :  
1459  E :    EXPECT_FALSE(label.Bind());
1460  E :  }
1461    :  
1462  E :  TEST_F(AssemblerTest, Seto) {
1463  E :    asm_.set_location(0xCAFEBABE);
1464  E :    asm_.set(kOverflow, eax);
1465  E :    EXPECT_BYTES(0x0F, 0x90, 0xC0);
1466  E :  }
1467    :  
1468  E :  TEST_F(AssemblerTest, Setno) {
1469  E :    asm_.set(kNoOverflow, ebx);
1470  E :    EXPECT_BYTES(0x0F, 0x91, 0xC3);
1471  E :  }
1472    :  
1473  E :  TEST_F(AssemblerTest, Sete) {
1474  E :    asm_.set(kEqual, eax);
1475  E :    EXPECT_BYTES(0x0F, 0x94, 0xC0);
1476  E :  }
1477    :  
1478  E :  TEST_F(AssemblerTest, Setne) {
1479  E :    asm_.set(kNotEqual, eax);
1480  E :    EXPECT_BYTES(0x0F, 0x95, 0xC0);
1481  E :  }
1482    :  
1483  E :  TEST_F(AssemblerTest, Setb) {
1484  E :    asm_.set(kBelow, eax);
1485  E :    EXPECT_BYTES(0x0F, 0x92, 0xC0);
1486  E :  }
1487    :  
1488  E :  TEST_F(AssemblerTest, Loop) {
1489  E :    asm_.set_location(0xCAFEBABE);
1490    :  
1491  E :    asm_.loop(Immediate(0xCAFEBABE, kSize8Bit, NULL));
1492  E :    EXPECT_BYTES(0xE2, 0xFE);
1493  E :  }
1494    :  
1495  E :  TEST_F(AssemblerTest, Loope) {
1496  E :    asm_.set_location(0xCAFEBABE);
1497    :  
1498  E :    asm_.loope(Immediate(0xCAFEBABE, kSize8Bit, NULL));
1499  E :    EXPECT_BYTES(0xE1, 0xFE);
1500  E :  }
1501    :  
1502  E :  TEST_F(AssemblerTest, Loopne) {
1503  E :    asm_.set_location(0xCAFEBABE);
1504    :  
1505  E :    asm_.loopne(Immediate(0xCAFEBABE, kSize8Bit, NULL));
1506  E :    EXPECT_BYTES(0xE0, 0xFE);
1507  E :  }
1508    :  
1509  E :  TEST_F(AssemblerTest, References) {
1510    :    // We arbitrarily use the MOV instruction to test reference propagation.
1511    :    static const int ref1 = 1;
1512  E :    asm_.mov(eax, Immediate(0, kSize8Bit, &ref1));
1513    :  
1514    :    static const int ref2 = 2;
1515    :    asm_.mov(eax, Operand(eax, ebx, kTimes4,
1516  E :                          Displacement(0, kSize32Bit, &ref2)));
1517    :  
1518    :    static const int ref3 = 3;
1519    :    static const int ref4 = 4;
1520    :    asm_.mov(Operand(eax, ebx, kTimes4, Displacement(0, kSize32Bit, &ref3)),
1521  E :             Immediate(0, kSize32Bit, &ref4));
1522    :  
1523  E :    EXPECT_EQ(4, serializer_.references.size());
1524    :  
1525  E :    EXPECT_EQ(1, serializer_.references[0].location);
1526  E :    EXPECT_EQ(&ref1, serializer_.references[0].ref);
1527    :  
1528  E :    EXPECT_EQ(8, serializer_.references[1].location);
1529  E :    EXPECT_EQ(&ref2, serializer_.references[1].ref);
1530    :  
1531  E :    EXPECT_EQ(15, serializer_.references[2].location);
1532  E :    EXPECT_EQ(&ref3, serializer_.references[2].ref);
1533    :  
1534  E :    EXPECT_EQ(19, serializer_.references[3].location);
1535  E :    EXPECT_EQ(&ref4, serializer_.references[3].ref);
1536  E :  }
1537    :  
1538    :  }  // namespace assm

Coverage information generated Thu Mar 26 16:15:41 2015.