Home | History | Annotate | Download | only in x86_64
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "assembler_x86_64.h"
     18 
     19 #include <inttypes.h>
     20 #include <map>
     21 #include <random>
     22 
     23 #include "base/bit_utils.h"
     24 #include "base/stl_util.h"
     25 #include "jni_macro_assembler_x86_64.h"
     26 #include "utils/assembler_test.h"
     27 #include "utils/jni_macro_assembler_test.h"
     28 
     29 namespace art {
     30 
     31 TEST(AssemblerX86_64, CreateBuffer) {
     32   ArenaPool pool;
     33   ArenaAllocator allocator(&pool);
     34   AssemblerBuffer buffer(&allocator);
     35   AssemblerBuffer::EnsureCapacity ensured(&buffer);
     36   buffer.Emit<uint8_t>(0x42);
     37   ASSERT_EQ(static_cast<size_t>(1), buffer.Size());
     38   buffer.Emit<int32_t>(42);
     39   ASSERT_EQ(static_cast<size_t>(5), buffer.Size());
     40 }
     41 
     42 #ifdef ART_TARGET_ANDROID
     43 static constexpr size_t kRandomIterations = 1000;  // Devices might be puny, don't stress them...
     44 #else
     45 static constexpr size_t kRandomIterations = 100000;  // Hosts are pretty powerful.
     46 #endif
     47 
     48 TEST(AssemblerX86_64, SignExtension) {
     49   // 32bit.
     50   for (int32_t i = 0; i < 128; i++) {
     51     EXPECT_TRUE(IsInt<8>(i)) << i;
     52   }
     53   for (int32_t i = 128; i < 255; i++) {
     54     EXPECT_FALSE(IsInt<8>(i)) << i;
     55   }
     56   // Do some higher ones randomly.
     57   std::random_device rd;
     58   std::default_random_engine e1(rd());
     59   std::uniform_int_distribution<int32_t> uniform_dist(256, INT32_MAX);
     60   for (size_t i = 0; i < kRandomIterations; i++) {
     61     int32_t value = uniform_dist(e1);
     62     EXPECT_FALSE(IsInt<8>(value)) << value;
     63   }
     64 
     65   // Negative ones.
     66   for (int32_t i = -1; i >= -128; i--) {
     67     EXPECT_TRUE(IsInt<8>(i)) << i;
     68   }
     69 
     70   for (int32_t i = -129; i > -256; i--) {
     71     EXPECT_FALSE(IsInt<8>(i)) << i;
     72   }
     73 
     74   // Do some lower ones randomly.
     75   std::uniform_int_distribution<int32_t> uniform_dist2(INT32_MIN, -256);
     76   for (size_t i = 0; i < 100; i++) {
     77     int32_t value = uniform_dist2(e1);
     78     EXPECT_FALSE(IsInt<8>(value)) << value;
     79   }
     80 
     81   // 64bit.
     82   for (int64_t i = 0; i < 128; i++) {
     83     EXPECT_TRUE(IsInt<8>(i)) << i;
     84   }
     85   for (int32_t i = 128; i < 255; i++) {
     86     EXPECT_FALSE(IsInt<8>(i)) << i;
     87   }
     88   // Do some higher ones randomly.
     89   std::uniform_int_distribution<int64_t> uniform_dist3(256, INT64_MAX);
     90   for (size_t i = 0; i < 100; i++) {
     91     int64_t value = uniform_dist3(e1);
     92     EXPECT_FALSE(IsInt<8>(value)) << value;
     93   }
     94 
     95   // Negative ones.
     96   for (int64_t i = -1; i >= -128; i--) {
     97     EXPECT_TRUE(IsInt<8>(i)) << i;
     98   }
     99 
    100   for (int64_t i = -129; i > -256; i--) {
    101     EXPECT_FALSE(IsInt<8>(i)) << i;
    102   }
    103 
    104   // Do some lower ones randomly.
    105   std::uniform_int_distribution<int64_t> uniform_dist4(INT64_MIN, -256);
    106   for (size_t i = 0; i < kRandomIterations; i++) {
    107     int64_t value = uniform_dist4(e1);
    108     EXPECT_FALSE(IsInt<8>(value)) << value;
    109   }
    110 
    111   int64_t value = INT64_C(0x1200000010);
    112   x86_64::Immediate imm(value);
    113   EXPECT_FALSE(imm.is_int8());
    114   EXPECT_FALSE(imm.is_int16());
    115   EXPECT_FALSE(imm.is_int32());
    116   value = INT64_C(0x8000000000000001);
    117   x86_64::Immediate imm2(value);
    118   EXPECT_FALSE(imm2.is_int8());
    119   EXPECT_FALSE(imm2.is_int16());
    120   EXPECT_FALSE(imm2.is_int32());
    121 }
    122 
    123 struct X86_64CpuRegisterCompare {
    124     bool operator()(const x86_64::CpuRegister& a, const x86_64::CpuRegister& b) const {
    125         return a.AsRegister() < b.AsRegister();
    126     }
    127 };
    128 
    129 //
    130 // Test fixture.
    131 //
    132 
    133 class AssemblerX86_64Test : public AssemblerTest<x86_64::X86_64Assembler,
    134                                                  x86_64::Address,
    135                                                  x86_64::CpuRegister,
    136                                                  x86_64::XmmRegister,
    137                                                  x86_64::Immediate> {
    138  public:
    139   typedef AssemblerTest<x86_64::X86_64Assembler,
    140                         x86_64::Address,
    141                         x86_64::CpuRegister,
    142                         x86_64::XmmRegister,
    143                         x86_64::Immediate> Base;
    144 
    145  protected:
    146   // Get the typically used name for this architecture, e.g., aarch64, x86-64, ...
    147   std::string GetArchitectureString() OVERRIDE {
    148     return "x86_64";
    149   }
    150 
    151   std::string GetDisassembleParameters() OVERRIDE {
    152     return " -D -bbinary -mi386:x86-64 -Mx86-64,addr64,data32 --no-show-raw-insn";
    153   }
    154 
    155   void SetUpHelpers() OVERRIDE {
    156     if (addresses_singleton_.size() == 0) {
    157       // One addressing mode to test the repeat drivers.
    158       addresses_singleton_.push_back(
    159           x86_64::Address(x86_64::CpuRegister(x86_64::RAX),
    160                           x86_64::CpuRegister(x86_64::RBX), x86_64::TIMES_1, -1));
    161     }
    162 
    163     if (addresses_.size() == 0) {
    164       // Several addressing modes.
    165       addresses_.push_back(
    166           x86_64::Address(x86_64::CpuRegister(x86_64::RDI),
    167                           x86_64::CpuRegister(x86_64::RAX), x86_64::TIMES_1, 15));
    168       addresses_.push_back(
    169           x86_64::Address(x86_64::CpuRegister(x86_64::RDI),
    170                           x86_64::CpuRegister(x86_64::RBX), x86_64::TIMES_2, 16));
    171       addresses_.push_back(
    172           x86_64::Address(x86_64::CpuRegister(x86_64::RDI),
    173                           x86_64::CpuRegister(x86_64::RCX), x86_64::TIMES_4, 17));
    174       addresses_.push_back(
    175           x86_64::Address(x86_64::CpuRegister(x86_64::RDI),
    176                           x86_64::CpuRegister(x86_64::RDX), x86_64::TIMES_8, 18));
    177       addresses_.push_back(x86_64::Address(x86_64::CpuRegister(x86_64::RAX), -1));
    178       addresses_.push_back(x86_64::Address(x86_64::CpuRegister(x86_64::RBX), 0));
    179       addresses_.push_back(x86_64::Address(x86_64::CpuRegister(x86_64::RSI), 1));
    180       addresses_.push_back(x86_64::Address(x86_64::CpuRegister(x86_64::RDI), 987654321));
    181       // Several addressing modes with the special ESP.
    182       addresses_.push_back(
    183           x86_64::Address(x86_64::CpuRegister(x86_64::RSP),
    184                           x86_64::CpuRegister(x86_64::RAX), x86_64::TIMES_1, 15));
    185       addresses_.push_back(
    186           x86_64::Address(x86_64::CpuRegister(x86_64::RSP),
    187                           x86_64::CpuRegister(x86_64::RBX), x86_64::TIMES_2, 16));
    188       addresses_.push_back(
    189           x86_64::Address(x86_64::CpuRegister(x86_64::RSP),
    190                           x86_64::CpuRegister(x86_64::RCX), x86_64::TIMES_4, 17));
    191       addresses_.push_back(
    192           x86_64::Address(x86_64::CpuRegister(x86_64::RSP),
    193                           x86_64::CpuRegister(x86_64::RDX), x86_64::TIMES_8, 18));
    194       addresses_.push_back(x86_64::Address(x86_64::CpuRegister(x86_64::RSP), -1));
    195       addresses_.push_back(x86_64::Address(x86_64::CpuRegister(x86_64::RSP), 0));
    196       addresses_.push_back(x86_64::Address(x86_64::CpuRegister(x86_64::RSP), 1));
    197       addresses_.push_back(x86_64::Address(x86_64::CpuRegister(x86_64::RSP), 987654321));
    198       // Several addressing modes with the higher registers.
    199       addresses_.push_back(
    200           x86_64::Address(x86_64::CpuRegister(x86_64::R8),
    201                           x86_64::CpuRegister(x86_64::R15), x86_64::TIMES_2, -1));
    202       addresses_.push_back(x86_64::Address(x86_64::CpuRegister(x86_64::R15), 123456789));
    203     }
    204 
    205     if (registers_.size() == 0) {
    206       registers_.push_back(new x86_64::CpuRegister(x86_64::RAX));
    207       registers_.push_back(new x86_64::CpuRegister(x86_64::RBX));
    208       registers_.push_back(new x86_64::CpuRegister(x86_64::RCX));
    209       registers_.push_back(new x86_64::CpuRegister(x86_64::RDX));
    210       registers_.push_back(new x86_64::CpuRegister(x86_64::RBP));
    211       registers_.push_back(new x86_64::CpuRegister(x86_64::RSP));
    212       registers_.push_back(new x86_64::CpuRegister(x86_64::RSI));
    213       registers_.push_back(new x86_64::CpuRegister(x86_64::RDI));
    214       registers_.push_back(new x86_64::CpuRegister(x86_64::R8));
    215       registers_.push_back(new x86_64::CpuRegister(x86_64::R9));
    216       registers_.push_back(new x86_64::CpuRegister(x86_64::R10));
    217       registers_.push_back(new x86_64::CpuRegister(x86_64::R11));
    218       registers_.push_back(new x86_64::CpuRegister(x86_64::R12));
    219       registers_.push_back(new x86_64::CpuRegister(x86_64::R13));
    220       registers_.push_back(new x86_64::CpuRegister(x86_64::R14));
    221       registers_.push_back(new x86_64::CpuRegister(x86_64::R15));
    222 
    223       secondary_register_names_.emplace(x86_64::CpuRegister(x86_64::RAX), "eax");
    224       secondary_register_names_.emplace(x86_64::CpuRegister(x86_64::RBX), "ebx");
    225       secondary_register_names_.emplace(x86_64::CpuRegister(x86_64::RCX), "ecx");
    226       secondary_register_names_.emplace(x86_64::CpuRegister(x86_64::RDX), "edx");
    227       secondary_register_names_.emplace(x86_64::CpuRegister(x86_64::RBP), "ebp");
    228       secondary_register_names_.emplace(x86_64::CpuRegister(x86_64::RSP), "esp");
    229       secondary_register_names_.emplace(x86_64::CpuRegister(x86_64::RSI), "esi");
    230       secondary_register_names_.emplace(x86_64::CpuRegister(x86_64::RDI), "edi");
    231       secondary_register_names_.emplace(x86_64::CpuRegister(x86_64::R8), "r8d");
    232       secondary_register_names_.emplace(x86_64::CpuRegister(x86_64::R9), "r9d");
    233       secondary_register_names_.emplace(x86_64::CpuRegister(x86_64::R10), "r10d");
    234       secondary_register_names_.emplace(x86_64::CpuRegister(x86_64::R11), "r11d");
    235       secondary_register_names_.emplace(x86_64::CpuRegister(x86_64::R12), "r12d");
    236       secondary_register_names_.emplace(x86_64::CpuRegister(x86_64::R13), "r13d");
    237       secondary_register_names_.emplace(x86_64::CpuRegister(x86_64::R14), "r14d");
    238       secondary_register_names_.emplace(x86_64::CpuRegister(x86_64::R15), "r15d");
    239 
    240       tertiary_register_names_.emplace(x86_64::CpuRegister(x86_64::RAX), "ax");
    241       tertiary_register_names_.emplace(x86_64::CpuRegister(x86_64::RBX), "bx");
    242       tertiary_register_names_.emplace(x86_64::CpuRegister(x86_64::RCX), "cx");
    243       tertiary_register_names_.emplace(x86_64::CpuRegister(x86_64::RDX), "dx");
    244       tertiary_register_names_.emplace(x86_64::CpuRegister(x86_64::RBP), "bp");
    245       tertiary_register_names_.emplace(x86_64::CpuRegister(x86_64::RSP), "sp");
    246       tertiary_register_names_.emplace(x86_64::CpuRegister(x86_64::RSI), "si");
    247       tertiary_register_names_.emplace(x86_64::CpuRegister(x86_64::RDI), "di");
    248       tertiary_register_names_.emplace(x86_64::CpuRegister(x86_64::R8), "r8w");
    249       tertiary_register_names_.emplace(x86_64::CpuRegister(x86_64::R9), "r9w");
    250       tertiary_register_names_.emplace(x86_64::CpuRegister(x86_64::R10), "r10w");
    251       tertiary_register_names_.emplace(x86_64::CpuRegister(x86_64::R11), "r11w");
    252       tertiary_register_names_.emplace(x86_64::CpuRegister(x86_64::R12), "r12w");
    253       tertiary_register_names_.emplace(x86_64::CpuRegister(x86_64::R13), "r13w");
    254       tertiary_register_names_.emplace(x86_64::CpuRegister(x86_64::R14), "r14w");
    255       tertiary_register_names_.emplace(x86_64::CpuRegister(x86_64::R15), "r15w");
    256 
    257       quaternary_register_names_.emplace(x86_64::CpuRegister(x86_64::RAX), "al");
    258       quaternary_register_names_.emplace(x86_64::CpuRegister(x86_64::RBX), "bl");
    259       quaternary_register_names_.emplace(x86_64::CpuRegister(x86_64::RCX), "cl");
    260       quaternary_register_names_.emplace(x86_64::CpuRegister(x86_64::RDX), "dl");
    261       quaternary_register_names_.emplace(x86_64::CpuRegister(x86_64::RBP), "bpl");
    262       quaternary_register_names_.emplace(x86_64::CpuRegister(x86_64::RSP), "spl");
    263       quaternary_register_names_.emplace(x86_64::CpuRegister(x86_64::RSI), "sil");
    264       quaternary_register_names_.emplace(x86_64::CpuRegister(x86_64::RDI), "dil");
    265       quaternary_register_names_.emplace(x86_64::CpuRegister(x86_64::R8), "r8b");
    266       quaternary_register_names_.emplace(x86_64::CpuRegister(x86_64::R9), "r9b");
    267       quaternary_register_names_.emplace(x86_64::CpuRegister(x86_64::R10), "r10b");
    268       quaternary_register_names_.emplace(x86_64::CpuRegister(x86_64::R11), "r11b");
    269       quaternary_register_names_.emplace(x86_64::CpuRegister(x86_64::R12), "r12b");
    270       quaternary_register_names_.emplace(x86_64::CpuRegister(x86_64::R13), "r13b");
    271       quaternary_register_names_.emplace(x86_64::CpuRegister(x86_64::R14), "r14b");
    272       quaternary_register_names_.emplace(x86_64::CpuRegister(x86_64::R15), "r15b");
    273 
    274       fp_registers_.push_back(new x86_64::XmmRegister(x86_64::XMM0));
    275       fp_registers_.push_back(new x86_64::XmmRegister(x86_64::XMM1));
    276       fp_registers_.push_back(new x86_64::XmmRegister(x86_64::XMM2));
    277       fp_registers_.push_back(new x86_64::XmmRegister(x86_64::XMM3));
    278       fp_registers_.push_back(new x86_64::XmmRegister(x86_64::XMM4));
    279       fp_registers_.push_back(new x86_64::XmmRegister(x86_64::XMM5));
    280       fp_registers_.push_back(new x86_64::XmmRegister(x86_64::XMM6));
    281       fp_registers_.push_back(new x86_64::XmmRegister(x86_64::XMM7));
    282       fp_registers_.push_back(new x86_64::XmmRegister(x86_64::XMM8));
    283       fp_registers_.push_back(new x86_64::XmmRegister(x86_64::XMM9));
    284       fp_registers_.push_back(new x86_64::XmmRegister(x86_64::XMM10));
    285       fp_registers_.push_back(new x86_64::XmmRegister(x86_64::XMM11));
    286       fp_registers_.push_back(new x86_64::XmmRegister(x86_64::XMM12));
    287       fp_registers_.push_back(new x86_64::XmmRegister(x86_64::XMM13));
    288       fp_registers_.push_back(new x86_64::XmmRegister(x86_64::XMM14));
    289       fp_registers_.push_back(new x86_64::XmmRegister(x86_64::XMM15));
    290     }
    291   }
    292 
    293   void TearDown() OVERRIDE {
    294     AssemblerTest::TearDown();
    295     STLDeleteElements(&registers_);
    296     STLDeleteElements(&fp_registers_);
    297   }
    298 
    299   std::vector<x86_64::Address> GetAddresses() {
    300     return addresses_;
    301   }
    302 
    303   std::vector<x86_64::CpuRegister*> GetRegisters() OVERRIDE {
    304     return registers_;
    305   }
    306 
    307   std::vector<x86_64::XmmRegister*> GetFPRegisters() OVERRIDE {
    308     return fp_registers_;
    309   }
    310 
    311   x86_64::Immediate CreateImmediate(int64_t imm_value) OVERRIDE {
    312     return x86_64::Immediate(imm_value);
    313   }
    314 
    315   std::string GetSecondaryRegisterName(const x86_64::CpuRegister& reg) OVERRIDE {
    316     CHECK(secondary_register_names_.find(reg) != secondary_register_names_.end());
    317     return secondary_register_names_[reg];
    318   }
    319 
    320   std::string GetTertiaryRegisterName(const x86_64::CpuRegister& reg) OVERRIDE {
    321     CHECK(tertiary_register_names_.find(reg) != tertiary_register_names_.end());
    322     return tertiary_register_names_[reg];
    323   }
    324 
    325   std::string GetQuaternaryRegisterName(const x86_64::CpuRegister& reg) OVERRIDE {
    326     CHECK(quaternary_register_names_.find(reg) != quaternary_register_names_.end());
    327     return quaternary_register_names_[reg];
    328   }
    329 
    330   std::vector<x86_64::Address> addresses_singleton_;
    331 
    332  private:
    333   std::vector<x86_64::Address> addresses_;
    334   std::vector<x86_64::CpuRegister*> registers_;
    335   std::map<x86_64::CpuRegister, std::string, X86_64CpuRegisterCompare> secondary_register_names_;
    336   std::map<x86_64::CpuRegister, std::string, X86_64CpuRegisterCompare> tertiary_register_names_;
    337   std::map<x86_64::CpuRegister, std::string, X86_64CpuRegisterCompare> quaternary_register_names_;
    338   std::vector<x86_64::XmmRegister*> fp_registers_;
    339 };
    340 
    341 //
    342 // Test some repeat drivers used in the tests.
    343 //
    344 
    345 TEST_F(AssemblerX86_64Test, RepeatI4) {
    346   EXPECT_EQ("$0\n$-1\n$18\n$4660\n$-4660\n$305419896\n$-305419896\n",
    347             RepeatI(/*f*/ nullptr, /*imm_bytes*/ 4U, "${imm}"));
    348 }
    349 
    350 TEST_F(AssemblerX86_64Test, RepeatI8) {
    351   EXPECT_EQ("$0\n$-1\n$18\n$4660\n$-4660\n$305419896\n$-305419896\n"
    352             "$20015998343868\n$-20015998343868\n$1311768467463790320\n"
    353             "$-1311768467463790320\n",
    354             RepeatI(/*f*/ nullptr, /*imm_bytes*/ 8U, "${imm}"));
    355 }
    356 
    357 TEST_F(AssemblerX86_64Test, Repeatr) {
    358   EXPECT_EQ("%eax\n%ebx\n%ecx\n%edx\n%ebp\n%esp\n%esi\n%edi\n"
    359             "%r8d\n%r9d\n%r10d\n%r11d\n%r12d\n%r13d\n%r14d\n%r15d\n",
    360             Repeatr(/*f*/ nullptr, "%{reg}"));
    361 }
    362 
    363 TEST_F(AssemblerX86_64Test, RepeatrI) {
    364   EXPECT_NE(RepeatrI(/*f*/ nullptr, /*imm_bytes*/ 1U, "%{reg} ${imm}").
    365             find("%eax $0\n%eax $-1\n%eax $18\n%ebx $0\n%ebx $-1\n%ebx $18\n"
    366                  "%ecx $0\n%ecx $-1\n%ecx $18\n%edx $0\n%edx $-1\n%edx $18\n"),
    367             std::string::npos);
    368 }
    369 
    370 TEST_F(AssemblerX86_64Test, Repeatrr) {
    371   EXPECT_NE(Repeatrr(/*f*/ nullptr, "%{reg1} %{reg2}")
    372             .find("%eax %eax\n%eax %ebx\n%eax %ecx\n%eax %edx\n"
    373                   "%eax %ebp\n%eax %esp\n%eax %esi\n%eax %edi\n"),
    374             std::string::npos);
    375 }
    376 
    377 TEST_F(AssemblerX86_64Test, Repeatrb) {
    378   EXPECT_NE(Repeatrb(/*f*/ nullptr, "%{reg1} %{reg2}").
    379             find("%eax %al\n%eax %bl\n%eax %cl\n%eax %dl\n%eax %bpl\n"
    380                  "%eax %spl\n%eax %sil\n%eax %dil\n%eax %r8b\n%eax %r9b\n"),
    381             std::string::npos);
    382 }
    383 
    384 TEST_F(AssemblerX86_64Test, RepeatrF) {
    385   EXPECT_NE(RepeatrF(/*f*/ nullptr, "%{reg1} %{reg2}")
    386             .find("%eax %xmm0\n%eax %xmm1\n%eax %xmm2\n%eax %xmm3\n"
    387                   "%eax %xmm4\n%eax %xmm5\n%eax %xmm6\n%eax %xmm7\n"),
    388             std::string::npos);
    389 }
    390 
    391 TEST_F(AssemblerX86_64Test, RepeatR) {
    392   EXPECT_EQ("%rax\n%rbx\n%rcx\n%rdx\n%rbp\n%rsp\n%rsi\n%rdi\n"
    393             "%r8\n%r9\n%r10\n%r11\n%r12\n%r13\n%r14\n%r15\n",
    394             RepeatR(/*f*/ nullptr, "%{reg}"));
    395 }
    396 
    397 TEST_F(AssemblerX86_64Test, RepeatRI) {
    398   EXPECT_NE(RepeatRI(/*f*/ nullptr, /*imm_bytes*/ 1U, "%{reg} ${imm}")
    399             .find("%rax $0\n%rax $-1\n%rax $18\n%rbx $0\n%rbx $-1\n%rbx $18\n"
    400                   "%rcx $0\n%rcx $-1\n%rcx $18\n%rdx $0\n%rdx $-1\n%rdx $18\n"),
    401             std::string::npos);
    402 }
    403 
    404 TEST_F(AssemblerX86_64Test, RepeatRr) {
    405   EXPECT_NE(RepeatRr(/*f*/ nullptr, "%{reg1} %{reg2}")
    406             .find("%rax %eax\n%rax %ebx\n%rax %ecx\n%rax %edx\n%rax %ebp\n"
    407                   "%rax %esp\n%rax %esi\n%rax %edi\n%rax %r8d\n%rax %r9d\n"),
    408             std::string::npos);
    409 }
    410 
    411 TEST_F(AssemblerX86_64Test, RepeatRR) {
    412   EXPECT_NE(RepeatRR(/*f*/ nullptr, "%{reg1} %{reg2}")
    413             .find("%rax %rax\n%rax %rbx\n%rax %rcx\n%rax %rdx\n%rax %rbp\n"
    414                   "%rax %rsp\n%rax %rsi\n%rax %rdi\n%rax %r8\n%rax %r9\n"),
    415             std::string::npos);
    416 }
    417 
    418 TEST_F(AssemblerX86_64Test, RepeatRF) {
    419   EXPECT_NE(RepeatRF(/*f*/ nullptr, "%{reg1} %{reg2}")
    420             .find("%rax %xmm0\n%rax %xmm1\n%rax %xmm2\n%rax %xmm3\n%rax %xmm4\n"
    421                   "%rax %xmm5\n%rax %xmm6\n%rax %xmm7\n%rax %xmm8\n%rax %xmm9\n"),
    422             std::string::npos);
    423 }
    424 
    425 TEST_F(AssemblerX86_64Test, RepeatFF) {
    426   EXPECT_NE(RepeatFF(/*f*/ nullptr, "%{reg1} %{reg2}")
    427             .find("%xmm0 %xmm0\n%xmm0 %xmm1\n%xmm0 %xmm2\n%xmm0 %xmm3\n%xmm0 %xmm4\n"
    428                   "%xmm0 %xmm5\n%xmm0 %xmm6\n%xmm0 %xmm7\n%xmm0 %xmm8\n%xmm0 %xmm9\n"),
    429             std::string::npos);
    430 }
    431 
    432 TEST_F(AssemblerX86_64Test, RepeatFFI) {
    433   EXPECT_NE(RepeatFFI(/*f*/ nullptr, /*imm_bytes*/ 1U, "%{reg1} %{reg2} ${imm}")
    434             .find("%xmm0 %xmm0 $0\n%xmm0 %xmm0 $-1\n%xmm0 %xmm0 $18\n"
    435                   "%xmm0 %xmm1 $0\n%xmm0 %xmm1 $-1\n%xmm0 %xmm1 $18\n"),
    436             std::string::npos);
    437 }
    438 
    439 TEST_F(AssemblerX86_64Test, RepeatA) {
    440   EXPECT_EQ("-1(%rax,%rbx,1)\n", RepeatA(/*f*/ nullptr, addresses_singleton_, "{mem}"));
    441 }
    442 
    443 TEST_F(AssemblerX86_64Test, RepeatAFull) {
    444   EXPECT_EQ("15(%rdi,%rax,1)\n16(%rdi,%rbx,2)\n17(%rdi,%rcx,4)\n18(%rdi,%rdx,8)\n"
    445             "-1(%rax)\n(%rbx)\n1(%rsi)\n987654321(%rdi)\n15(%rsp,%rax,1)\n"
    446             "16(%rsp,%rbx,2)\n17(%rsp,%rcx,4)\n18(%rsp,%rdx,8)\n-1(%rsp)\n"
    447             "(%rsp)\n1(%rsp)\n987654321(%rsp)\n-1(%r8,%r15,2)\n123456789(%r15)\n",
    448             RepeatA(/*f*/ nullptr, "{mem}"));
    449 }
    450 
    451 TEST_F(AssemblerX86_64Test, RepeatAI) {
    452   EXPECT_EQ("-1(%rax,%rbx,1) $0\n-1(%rax,%rbx,1) $-1\n-1(%rax,%rbx,1) $18\n",
    453             RepeatAI(/*f*/ nullptr, /*imm_bytes*/ 1U, addresses_singleton_, "{mem} ${imm}"));
    454 }
    455 
    456 TEST_F(AssemblerX86_64Test, RepeatRA) {
    457   EXPECT_NE(RepeatRA(/*f*/ nullptr, addresses_singleton_, "%{reg} {mem}")
    458             .find("%rax -1(%rax,%rbx,1)\n%rbx -1(%rax,%rbx,1)\n%rcx -1(%rax,%rbx,1)\n"
    459                   "%rdx -1(%rax,%rbx,1)\n%rbp -1(%rax,%rbx,1)\n%rsp -1(%rax,%rbx,1)\n"),
    460             std::string::npos);
    461 }
    462 
    463 TEST_F(AssemblerX86_64Test, RepeatrA) {
    464   EXPECT_NE(RepeatrA(/*f*/ nullptr, addresses_singleton_, "%{reg} {mem}")
    465             .find("%eax -1(%rax,%rbx,1)\n%ebx -1(%rax,%rbx,1)\n%ecx -1(%rax,%rbx,1)\n"
    466                   "%edx -1(%rax,%rbx,1)\n%ebp -1(%rax,%rbx,1)\n%esp -1(%rax,%rbx,1)\n"),
    467             std::string::npos);
    468 }
    469 
    470 TEST_F(AssemblerX86_64Test, RepeatAR) {
    471   EXPECT_NE(RepeatAR(/*f*/ nullptr, addresses_singleton_, "{mem} %{reg}")
    472             .find("-1(%rax,%rbx,1) %rax\n-1(%rax,%rbx,1) %rbx\n-1(%rax,%rbx,1) %rcx\n"
    473                   "-1(%rax,%rbx,1) %rdx\n-1(%rax,%rbx,1) %rbp\n-1(%rax,%rbx,1) %rsp\n"),
    474             std::string::npos);
    475 }
    476 
    477 TEST_F(AssemblerX86_64Test, RepeatAr) {
    478   EXPECT_NE(RepeatAr(/*f*/ nullptr, addresses_singleton_, "{mem} %{reg}")
    479             .find("-1(%rax,%rbx,1) %eax\n-1(%rax,%rbx,1) %ebx\n-1(%rax,%rbx,1) %ecx\n"
    480                   "-1(%rax,%rbx,1) %edx\n-1(%rax,%rbx,1) %ebp\n-1(%rax,%rbx,1) %esp\n"),
    481             std::string::npos);
    482 }
    483 
    484 TEST_F(AssemblerX86_64Test, RepeatFA) {
    485   EXPECT_NE(RepeatFA(/*f*/ nullptr, addresses_singleton_, "%{reg} {mem}").
    486             find("%xmm0 -1(%rax,%rbx,1)\n%xmm1 -1(%rax,%rbx,1)\n%xmm2 -1(%rax,%rbx,1)\n"
    487                  "%xmm3 -1(%rax,%rbx,1)\n%xmm4 -1(%rax,%rbx,1)\n%xmm5 -1(%rax,%rbx,1)\n"),
    488             std::string::npos);
    489 }
    490 
    491 TEST_F(AssemblerX86_64Test, RepeatAF) {
    492   EXPECT_NE(RepeatAF(/*f*/ nullptr, addresses_singleton_, "{mem} %{reg}")
    493             .find("-1(%rax,%rbx,1) %xmm0\n-1(%rax,%rbx,1) %xmm1\n-1(%rax,%rbx,1) %xmm2\n"
    494                   "-1(%rax,%rbx,1) %xmm3\n-1(%rax,%rbx,1) %xmm4\n-1(%rax,%rbx,1) %xmm5\n"),
    495             std::string::npos);
    496 }
    497 
    498 //
    499 // Actual x86-64 instruction assembler tests.
    500 //
    501 
    502 TEST_F(AssemblerX86_64Test, Toolchain) {
    503   EXPECT_TRUE(CheckTools());
    504 }
    505 
    506 TEST_F(AssemblerX86_64Test, PopqAllAddresses) {
    507   // Make sure all addressing modes combinations are tested at least once.
    508   std::vector<x86_64::Address> all_addresses;
    509   for (x86_64::CpuRegister* base : GetRegisters()) {
    510     // Base only.
    511     all_addresses.push_back(x86_64::Address(*base, -1));
    512     all_addresses.push_back(x86_64::Address(*base, 0));
    513     all_addresses.push_back(x86_64::Address(*base, 1));
    514     all_addresses.push_back(x86_64::Address(*base, 123456789));
    515     for (x86_64::CpuRegister* index : GetRegisters()) {
    516       if (index->AsRegister() == x86_64::RSP) {
    517         // Index cannot be RSP.
    518         continue;
    519       } else if (base->AsRegister() == index->AsRegister()) {
    520        // Index only.
    521        all_addresses.push_back(x86_64::Address(*index, x86_64::TIMES_1, -1));
    522        all_addresses.push_back(x86_64::Address(*index, x86_64::TIMES_2, 0));
    523        all_addresses.push_back(x86_64::Address(*index, x86_64::TIMES_4, 1));
    524        all_addresses.push_back(x86_64::Address(*index, x86_64::TIMES_8, 123456789));
    525       }
    526       // Base and index.
    527       all_addresses.push_back(x86_64::Address(*base, *index, x86_64::TIMES_1, -1));
    528       all_addresses.push_back(x86_64::Address(*base, *index, x86_64::TIMES_2, 0));
    529       all_addresses.push_back(x86_64::Address(*base, *index, x86_64::TIMES_4, 1));
    530       all_addresses.push_back(x86_64::Address(*base, *index, x86_64::TIMES_8, 123456789));
    531     }
    532   }
    533   DriverStr(RepeatA(&x86_64::X86_64Assembler::popq, all_addresses, "popq {mem}"), "popq");
    534 }
    535 
    536 TEST_F(AssemblerX86_64Test, PushqRegs) {
    537   DriverStr(RepeatR(&x86_64::X86_64Assembler::pushq, "pushq %{reg}"), "pushq");
    538 }
    539 
    540 TEST_F(AssemblerX86_64Test, PushqImm) {
    541   DriverStr(RepeatI(&x86_64::X86_64Assembler::pushq, /*imm_bytes*/ 4U,
    542                     "pushq ${imm}"), "pushqi");
    543 }
    544 
    545 TEST_F(AssemblerX86_64Test, MovqRegs) {
    546   DriverStr(RepeatRR(&x86_64::X86_64Assembler::movq, "movq %{reg2}, %{reg1}"), "movq");
    547 }
    548 
    549 TEST_F(AssemblerX86_64Test, MovqImm) {
    550   DriverStr(RepeatRI(&x86_64::X86_64Assembler::movq, /*imm_bytes*/ 8U,
    551                      "movq ${imm}, %{reg}"), "movqi");
    552 }
    553 
    554 TEST_F(AssemblerX86_64Test, MovlRegs) {
    555   DriverStr(Repeatrr(&x86_64::X86_64Assembler::movl, "mov %{reg2}, %{reg1}"), "movl");
    556 }
    557 
    558 TEST_F(AssemblerX86_64Test, MovlImm) {
    559   DriverStr(RepeatrI(&x86_64::X86_64Assembler::movl, /*imm_bytes*/ 4U,
    560                      "mov ${imm}, %{reg}"), "movli");
    561 }
    562 
    563 TEST_F(AssemblerX86_64Test, AddqRegs) {
    564   DriverStr(RepeatRR(&x86_64::X86_64Assembler::addq, "addq %{reg2}, %{reg1}"), "addq");
    565 }
    566 
    567 TEST_F(AssemblerX86_64Test, AddqImm) {
    568   DriverStr(RepeatRI(&x86_64::X86_64Assembler::addq, /*imm_bytes*/ 4U,
    569                      "addq ${imm}, %{reg}"), "addqi");
    570 }
    571 
    572 TEST_F(AssemblerX86_64Test, AddlRegs) {
    573   DriverStr(Repeatrr(&x86_64::X86_64Assembler::addl, "add %{reg2}, %{reg1}"), "addl");
    574 }
    575 
    576 TEST_F(AssemblerX86_64Test, AddlImm) {
    577   DriverStr(RepeatrI(&x86_64::X86_64Assembler::addl, /*imm_bytes*/ 4U,
    578                      "add ${imm}, %{reg}"), "addli");
    579 }
    580 
    581 TEST_F(AssemblerX86_64Test, Addw) {
    582   DriverStr(
    583       RepeatAI(&x86_64::X86_64Assembler::addw, /*imm_bytes*/2U, "addw ${imm}, {mem}"), "addw");
    584 }
    585 
    586 TEST_F(AssemblerX86_64Test, ImulqReg1) {
    587   DriverStr(RepeatR(&x86_64::X86_64Assembler::imulq, "imulq %{reg}"), "imulq");
    588 }
    589 
    590 TEST_F(AssemblerX86_64Test, ImulqRegs) {
    591   DriverStr(RepeatRR(&x86_64::X86_64Assembler::imulq, "imulq %{reg2}, %{reg1}"), "imulq");
    592 }
    593 
    594 TEST_F(AssemblerX86_64Test, ImulqImm) {
    595   DriverStr(RepeatRI(&x86_64::X86_64Assembler::imulq, /*imm_bytes*/ 4U,
    596                      "imulq ${imm}, %{reg}, %{reg}"),
    597             "imulqi");
    598 }
    599 
    600 TEST_F(AssemblerX86_64Test, ImullRegs) {
    601   DriverStr(Repeatrr(&x86_64::X86_64Assembler::imull, "imul %{reg2}, %{reg1}"), "imull");
    602 }
    603 
    604 TEST_F(AssemblerX86_64Test, ImullImm) {
    605   DriverStr(RepeatrI(&x86_64::X86_64Assembler::imull, /*imm_bytes*/ 4U,
    606                      "imull ${imm}, %{reg}, %{reg}"),
    607             "imulli");
    608 }
    609 
    610 TEST_F(AssemblerX86_64Test, Mull) {
    611   DriverStr(Repeatr(&x86_64::X86_64Assembler::mull, "mull %{reg}"), "mull");
    612 }
    613 
    614 TEST_F(AssemblerX86_64Test, SubqRegs) {
    615   DriverStr(RepeatRR(&x86_64::X86_64Assembler::subq, "subq %{reg2}, %{reg1}"), "subq");
    616 }
    617 
    618 TEST_F(AssemblerX86_64Test, SubqImm) {
    619   DriverStr(RepeatRI(&x86_64::X86_64Assembler::subq, /*imm_bytes*/ 4U,
    620                      "subq ${imm}, %{reg}"), "subqi");
    621 }
    622 
    623 TEST_F(AssemblerX86_64Test, SublRegs) {
    624   DriverStr(Repeatrr(&x86_64::X86_64Assembler::subl, "sub %{reg2}, %{reg1}"), "subl");
    625 }
    626 
    627 TEST_F(AssemblerX86_64Test, SublImm) {
    628   DriverStr(RepeatrI(&x86_64::X86_64Assembler::subl, /*imm_bytes*/ 4U,
    629                      "sub ${imm}, %{reg}"), "subli");
    630 }
    631 
    632 // Shll only allows CL as the shift count.
    633 std::string shll_fn(AssemblerX86_64Test::Base* assembler_test, x86_64::X86_64Assembler* assembler) {
    634   std::ostringstream str;
    635   std::vector<x86_64::CpuRegister*> registers = assembler_test->GetRegisters();
    636   x86_64::CpuRegister shifter(x86_64::RCX);
    637   for (auto reg : registers) {
    638     assembler->shll(*reg, shifter);
    639     str << "shll %cl, %" << assembler_test->GetSecondaryRegisterName(*reg) << "\n";
    640   }
    641   return str.str();
    642 }
    643 
    644 TEST_F(AssemblerX86_64Test, ShllReg) {
    645   DriverFn(&shll_fn, "shll");
    646 }
    647 
    648 TEST_F(AssemblerX86_64Test, ShllImm) {
    649   DriverStr(RepeatrI(&x86_64::X86_64Assembler::shll, /*imm_bytes*/ 1U,
    650                      "shll ${imm}, %{reg}"), "shlli");
    651 }
    652 
    653 // Shlq only allows CL as the shift count.
    654 std::string shlq_fn(AssemblerX86_64Test::Base* assembler_test, x86_64::X86_64Assembler* assembler) {
    655   std::ostringstream str;
    656   std::vector<x86_64::CpuRegister*> registers = assembler_test->GetRegisters();
    657   x86_64::CpuRegister shifter(x86_64::RCX);
    658   for (auto reg : registers) {
    659     assembler->shlq(*reg, shifter);
    660     str << "shlq %cl, %" << assembler_test->GetRegisterName(*reg) << "\n";
    661   }
    662   return str.str();
    663 }
    664 
    665 TEST_F(AssemblerX86_64Test, ShlqReg) {
    666   DriverFn(&shlq_fn, "shlq");
    667 }
    668 
    669 TEST_F(AssemblerX86_64Test, ShlqImm) {
    670   DriverStr(RepeatRI(&x86_64::X86_64Assembler::shlq, /*imm_bytes*/ 1U,
    671                      "shlq ${imm}, %{reg}"), "shlqi");
    672 }
    673 
    674 // Shrl only allows CL as the shift count.
    675 std::string shrl_fn(AssemblerX86_64Test::Base* assembler_test, x86_64::X86_64Assembler* assembler) {
    676   std::ostringstream str;
    677   std::vector<x86_64::CpuRegister*> registers = assembler_test->GetRegisters();
    678   x86_64::CpuRegister shifter(x86_64::RCX);
    679   for (auto reg : registers) {
    680     assembler->shrl(*reg, shifter);
    681     str << "shrl %cl, %" << assembler_test->GetSecondaryRegisterName(*reg) << "\n";
    682   }
    683   return str.str();
    684 }
    685 
    686 TEST_F(AssemblerX86_64Test, ShrlReg) {
    687   DriverFn(&shrl_fn, "shrl");
    688 }
    689 
    690 TEST_F(AssemblerX86_64Test, ShrlImm) {
    691   DriverStr(RepeatrI(&x86_64::X86_64Assembler::shrl, /*imm_bytes*/ 1U, "shrl ${imm}, %{reg}"), "shrli");
    692 }
    693 
    694 // Shrq only allows CL as the shift count.
    695 std::string shrq_fn(AssemblerX86_64Test::Base* assembler_test, x86_64::X86_64Assembler* assembler) {
    696   std::ostringstream str;
    697   std::vector<x86_64::CpuRegister*> registers = assembler_test->GetRegisters();
    698   x86_64::CpuRegister shifter(x86_64::RCX);
    699   for (auto reg : registers) {
    700     assembler->shrq(*reg, shifter);
    701     str << "shrq %cl, %" << assembler_test->GetRegisterName(*reg) << "\n";
    702   }
    703   return str.str();
    704 }
    705 
    706 TEST_F(AssemblerX86_64Test, ShrqReg) {
    707   DriverFn(&shrq_fn, "shrq");
    708 }
    709 
    710 TEST_F(AssemblerX86_64Test, ShrqImm) {
    711   DriverStr(RepeatRI(&x86_64::X86_64Assembler::shrq, /*imm_bytes*/ 1U, "shrq ${imm}, %{reg}"), "shrqi");
    712 }
    713 
    714 // Sarl only allows CL as the shift count.
    715 std::string sarl_fn(AssemblerX86_64Test::Base* assembler_test, x86_64::X86_64Assembler* assembler) {
    716   std::ostringstream str;
    717   std::vector<x86_64::CpuRegister*> registers = assembler_test->GetRegisters();
    718   x86_64::CpuRegister shifter(x86_64::RCX);
    719   for (auto reg : registers) {
    720     assembler->sarl(*reg, shifter);
    721     str << "sarl %cl, %" << assembler_test->GetSecondaryRegisterName(*reg) << "\n";
    722   }
    723   return str.str();
    724 }
    725 
    726 TEST_F(AssemblerX86_64Test, SarlReg) {
    727   DriverFn(&sarl_fn, "sarl");
    728 }
    729 
    730 TEST_F(AssemblerX86_64Test, SarlImm) {
    731   DriverStr(RepeatrI(&x86_64::X86_64Assembler::sarl, /*imm_bytes*/ 1U, "sarl ${imm}, %{reg}"), "sarli");
    732 }
    733 
    734 // Sarq only allows CL as the shift count.
    735 std::string sarq_fn(AssemblerX86_64Test::Base* assembler_test, x86_64::X86_64Assembler* assembler) {
    736   std::ostringstream str;
    737   std::vector<x86_64::CpuRegister*> registers = assembler_test->GetRegisters();
    738   x86_64::CpuRegister shifter(x86_64::RCX);
    739   for (auto reg : registers) {
    740     assembler->sarq(*reg, shifter);
    741     str << "sarq %cl, %" << assembler_test->GetRegisterName(*reg) << "\n";
    742   }
    743   return str.str();
    744 }
    745 
    746 TEST_F(AssemblerX86_64Test, SarqReg) {
    747   DriverFn(&sarq_fn, "sarq");
    748 }
    749 
    750 TEST_F(AssemblerX86_64Test, SarqImm) {
    751   DriverStr(RepeatRI(&x86_64::X86_64Assembler::sarq, /*imm_bytes*/ 1U, "sarq ${imm}, %{reg}"), "sarqi");
    752 }
    753 
    754 // Rorl only allows CL as the shift count.
    755 std::string rorl_fn(AssemblerX86_64Test::Base* assembler_test, x86_64::X86_64Assembler* assembler) {
    756   std::ostringstream str;
    757   std::vector<x86_64::CpuRegister*> registers = assembler_test->GetRegisters();
    758   x86_64::CpuRegister shifter(x86_64::RCX);
    759   for (auto reg : registers) {
    760     assembler->rorl(*reg, shifter);
    761     str << "rorl %cl, %" << assembler_test->GetSecondaryRegisterName(*reg) << "\n";
    762   }
    763   return str.str();
    764 }
    765 
    766 TEST_F(AssemblerX86_64Test, RorlReg) {
    767   DriverFn(&rorl_fn, "rorl");
    768 }
    769 
    770 TEST_F(AssemblerX86_64Test, RorlImm) {
    771   DriverStr(RepeatrI(&x86_64::X86_64Assembler::rorl, /*imm_bytes*/ 1U, "rorl ${imm}, %{reg}"), "rorli");
    772 }
    773 
    774 // Roll only allows CL as the shift count.
    775 std::string roll_fn(AssemblerX86_64Test::Base* assembler_test, x86_64::X86_64Assembler* assembler) {
    776   std::ostringstream str;
    777   std::vector<x86_64::CpuRegister*> registers = assembler_test->GetRegisters();
    778   x86_64::CpuRegister shifter(x86_64::RCX);
    779   for (auto reg : registers) {
    780     assembler->roll(*reg, shifter);
    781     str << "roll %cl, %" << assembler_test->GetSecondaryRegisterName(*reg) << "\n";
    782   }
    783   return str.str();
    784 }
    785 
    786 TEST_F(AssemblerX86_64Test, RollReg) {
    787   DriverFn(&roll_fn, "roll");
    788 }
    789 
    790 TEST_F(AssemblerX86_64Test, RollImm) {
    791   DriverStr(RepeatrI(&x86_64::X86_64Assembler::roll, /*imm_bytes*/ 1U, "roll ${imm}, %{reg}"), "rolli");
    792 }
    793 
    794 // Rorq only allows CL as the shift count.
    795 std::string rorq_fn(AssemblerX86_64Test::Base* assembler_test, x86_64::X86_64Assembler* assembler) {
    796   std::ostringstream str;
    797   std::vector<x86_64::CpuRegister*> registers = assembler_test->GetRegisters();
    798   x86_64::CpuRegister shifter(x86_64::RCX);
    799   for (auto reg : registers) {
    800     assembler->rorq(*reg, shifter);
    801     str << "rorq %cl, %" << assembler_test->GetRegisterName(*reg) << "\n";
    802   }
    803   return str.str();
    804 }
    805 
    806 TEST_F(AssemblerX86_64Test, RorqReg) {
    807   DriverFn(&rorq_fn, "rorq");
    808 }
    809 
    810 TEST_F(AssemblerX86_64Test, RorqImm) {
    811   DriverStr(RepeatRI(&x86_64::X86_64Assembler::rorq, /*imm_bytes*/ 1U, "rorq ${imm}, %{reg}"), "rorqi");
    812 }
    813 
    814 // Rolq only allows CL as the shift count.
    815 std::string rolq_fn(AssemblerX86_64Test::Base* assembler_test, x86_64::X86_64Assembler* assembler) {
    816   std::ostringstream str;
    817   std::vector<x86_64::CpuRegister*> registers = assembler_test->GetRegisters();
    818   x86_64::CpuRegister shifter(x86_64::RCX);
    819   for (auto reg : registers) {
    820     assembler->rolq(*reg, shifter);
    821     str << "rolq %cl, %" << assembler_test->GetRegisterName(*reg) << "\n";
    822   }
    823   return str.str();
    824 }
    825 
    826 TEST_F(AssemblerX86_64Test, RolqReg) {
    827   DriverFn(&rolq_fn, "rolq");
    828 }
    829 
    830 TEST_F(AssemblerX86_64Test, RolqImm) {
    831   DriverStr(RepeatRI(&x86_64::X86_64Assembler::rolq, /*imm_bytes*/ 1U, "rolq ${imm}, %{reg}"), "rolqi");
    832 }
    833 
    834 TEST_F(AssemblerX86_64Test, CmpqRegs) {
    835   DriverStr(RepeatRR(&x86_64::X86_64Assembler::cmpq, "cmpq %{reg2}, %{reg1}"), "cmpq");
    836 }
    837 
    838 TEST_F(AssemblerX86_64Test, CmpqImm) {
    839   DriverStr(RepeatRI(&x86_64::X86_64Assembler::cmpq,
    840                      /*imm_bytes*/ 4U,
    841                      "cmpq ${imm}, %{reg}"), "cmpqi");  // only imm32
    842 }
    843 
    844 TEST_F(AssemblerX86_64Test, CmplRegs) {
    845   DriverStr(Repeatrr(&x86_64::X86_64Assembler::cmpl, "cmp %{reg2}, %{reg1}"), "cmpl");
    846 }
    847 
    848 TEST_F(AssemblerX86_64Test, CmplImm) {
    849   DriverStr(RepeatrI(&x86_64::X86_64Assembler::cmpl, /*imm_bytes*/ 4U, "cmpl ${imm}, %{reg}"), "cmpli");
    850 }
    851 
    852 TEST_F(AssemblerX86_64Test, Testl) {
    853   // Note: uses different order for GCC than usual. This makes GCC happy, and doesn't have an
    854   // impact on functional correctness.
    855   DriverStr(Repeatrr(&x86_64::X86_64Assembler::testl, "testl %{reg1}, %{reg2}"), "testl");
    856 }
    857 
    858 TEST_F(AssemblerX86_64Test, Negq) {
    859   DriverStr(RepeatR(&x86_64::X86_64Assembler::negq, "negq %{reg}"), "negq");
    860 }
    861 
    862 TEST_F(AssemblerX86_64Test, Negl) {
    863   DriverStr(Repeatr(&x86_64::X86_64Assembler::negl, "negl %{reg}"), "negl");
    864 }
    865 
    866 TEST_F(AssemblerX86_64Test, Notq) {
    867   DriverStr(RepeatR(&x86_64::X86_64Assembler::notq, "notq %{reg}"), "notq");
    868 }
    869 
    870 TEST_F(AssemblerX86_64Test, Notl) {
    871   DriverStr(Repeatr(&x86_64::X86_64Assembler::notl, "notl %{reg}"), "notl");
    872 }
    873 
    874 TEST_F(AssemblerX86_64Test, AndqRegs) {
    875   DriverStr(RepeatRR(&x86_64::X86_64Assembler::andq, "andq %{reg2}, %{reg1}"), "andq");
    876 }
    877 
    878 TEST_F(AssemblerX86_64Test, AndqImm) {
    879   DriverStr(RepeatRI(&x86_64::X86_64Assembler::andq,
    880                      /*imm_bytes*/ 4U,
    881                      "andq ${imm}, %{reg}"), "andqi");  // only imm32
    882 }
    883 
    884 TEST_F(AssemblerX86_64Test, AndlRegs) {
    885   DriverStr(Repeatrr(&x86_64::X86_64Assembler::andl, "andl %{reg2}, %{reg1}"), "andl");
    886 }
    887 
    888 TEST_F(AssemblerX86_64Test, AndlImm) {
    889   DriverStr(RepeatrI(&x86_64::X86_64Assembler::andl,
    890                      /*imm_bytes*/ 4U,
    891                      "andl ${imm}, %{reg}"), "andli");
    892 }
    893 
    894 TEST_F(AssemblerX86_64Test, OrqRegs) {
    895   DriverStr(RepeatRR(&x86_64::X86_64Assembler::orq, "orq %{reg2}, %{reg1}"), "orq");
    896 }
    897 
    898 TEST_F(AssemblerX86_64Test, OrlRegs) {
    899   DriverStr(Repeatrr(&x86_64::X86_64Assembler::orl, "orl %{reg2}, %{reg1}"), "orl");
    900 }
    901 
    902 TEST_F(AssemblerX86_64Test, OrlImm) {
    903   DriverStr(RepeatrI(&x86_64::X86_64Assembler::orl,
    904                      /*imm_bytes*/ 4U, "orl ${imm}, %{reg}"), "orli");
    905 }
    906 
    907 TEST_F(AssemblerX86_64Test, XorqRegs) {
    908   DriverStr(RepeatRR(&x86_64::X86_64Assembler::xorq, "xorq %{reg2}, %{reg1}"), "xorq");
    909 }
    910 
    911 TEST_F(AssemblerX86_64Test, XorqImm) {
    912   DriverStr(RepeatRI(&x86_64::X86_64Assembler::xorq,
    913                      /*imm_bytes*/ 4U, "xorq ${imm}, %{reg}"), "xorqi");
    914 }
    915 
    916 TEST_F(AssemblerX86_64Test, XorlRegs) {
    917   DriverStr(Repeatrr(&x86_64::X86_64Assembler::xorl, "xor %{reg2}, %{reg1}"), "xorl");
    918 }
    919 
    920 TEST_F(AssemblerX86_64Test, XorlImm) {
    921   DriverStr(RepeatrI(&x86_64::X86_64Assembler::xorl,
    922                      /*imm_bytes*/ 4U, "xor ${imm}, %{reg}"), "xorli");
    923 }
    924 
    925 TEST_F(AssemblerX86_64Test, Xchgq) {
    926   DriverStr(RepeatRR(&x86_64::X86_64Assembler::xchgq, "xchgq %{reg2}, %{reg1}"), "xchgq");
    927 }
    928 
    929 TEST_F(AssemblerX86_64Test, Xchgl) {
    930   // TODO: Test is disabled because GCC generates 0x87 0xC0 for xchgl eax, eax. All other cases
    931   // are the same. Anyone know why it doesn't emit a simple 0x90? It does so for xchgq rax, rax...
    932   // DriverStr(Repeatrr(&x86_64::X86_64Assembler::xchgl, "xchgl %{reg2}, %{reg1}"), "xchgl");
    933 }
    934 
    935 TEST_F(AssemblerX86_64Test, LockCmpxchgl) {
    936   DriverStr(RepeatAr(&x86_64::X86_64Assembler::LockCmpxchgl,
    937                      "lock cmpxchgl %{reg}, {mem}"), "lock_cmpxchgl");
    938 }
    939 
    940 TEST_F(AssemblerX86_64Test, LockCmpxchgq) {
    941   DriverStr(RepeatAR(&x86_64::X86_64Assembler::LockCmpxchgq,
    942                      "lock cmpxchg %{reg}, {mem}"), "lock_cmpxchg");
    943 }
    944 
    945 TEST_F(AssemblerX86_64Test, MovqStore) {
    946   DriverStr(RepeatAR(&x86_64::X86_64Assembler::movq, "movq %{reg}, {mem}"), "movq_s");
    947 }
    948 
    949 TEST_F(AssemblerX86_64Test, MovqLoad) {
    950   DriverStr(RepeatRA(&x86_64::X86_64Assembler::movq, "movq {mem}, %{reg}"), "movq_l");
    951 }
    952 
    953 TEST_F(AssemblerX86_64Test, MovlStore) {
    954   DriverStr(RepeatAr(&x86_64::X86_64Assembler::movl, "movl %{reg}, {mem}"), "movl_s");
    955 }
    956 
    957 TEST_F(AssemblerX86_64Test, MovlLoad) {
    958   DriverStr(RepeatrA(&x86_64::X86_64Assembler::movl, "movl {mem}, %{reg}"), "movl_l");
    959 }
    960 
    961 TEST_F(AssemblerX86_64Test, MovwStore) {
    962   DriverStr(RepeatAw(&x86_64::X86_64Assembler::movw, "movw %{reg}, {mem}"), "movw_s");
    963 }
    964 
    965 TEST_F(AssemblerX86_64Test, MovbStore) {
    966   DriverStr(RepeatAb(&x86_64::X86_64Assembler::movb, "movb %{reg}, {mem}"), "movb_s");
    967 }
    968 
    969 TEST_F(AssemblerX86_64Test, Cmpw) {
    970   DriverStr(
    971       RepeatAI(&x86_64::X86_64Assembler::cmpw, /*imm_bytes*/ 2U, "cmpw ${imm}, {mem}"), "cmpw");
    972 }
    973 
    974 TEST_F(AssemblerX86_64Test, MovqAddrImm) {
    975   DriverStr(RepeatAI(&x86_64::X86_64Assembler::movq,
    976                      /*imm_bytes*/ 4U,
    977                      "movq ${imm}, {mem}"), "movq");  // only imm32
    978 }
    979 
    980 TEST_F(AssemblerX86_64Test, MovlAddrImm) {
    981   DriverStr(RepeatAI(&x86_64::X86_64Assembler::movl,
    982                      /*imm_bytes*/ 4U, "movl ${imm}, {mem}"), "movl");
    983 }
    984 
    985 TEST_F(AssemblerX86_64Test, MovwAddrImm) {
    986   DriverStr(RepeatAI(&x86_64::X86_64Assembler::movw,
    987                      /*imm_bytes*/ 2U, "movw ${imm}, {mem}"), "movw");
    988 }
    989 
    990 TEST_F(AssemblerX86_64Test, MovbAddrImm) {
    991   DriverStr(RepeatAI(&x86_64::X86_64Assembler::movb,
    992                      /*imm_bytes*/ 1U, "movb ${imm}, {mem}"), "movb");
    993 }
    994 
    995 TEST_F(AssemblerX86_64Test, Movntl) {
    996   DriverStr(RepeatAr(&x86_64::X86_64Assembler::movntl, "movntil %{reg}, {mem}"), "movntl");
    997 }
    998 
    999 TEST_F(AssemblerX86_64Test, Movntq) {
   1000   DriverStr(RepeatAR(&x86_64::X86_64Assembler::movntq, "movntiq %{reg}, {mem}"), "movntq");
   1001 }
   1002 
   1003 TEST_F(AssemblerX86_64Test, Cvtsi2ssAddr) {
   1004   GetAssembler()->cvtsi2ss(x86_64::XmmRegister(x86_64::XMM0),
   1005                            x86_64::Address(x86_64::CpuRegister(x86_64::RAX), 0),
   1006                            /*is64bit*/ false);
   1007   GetAssembler()->cvtsi2ss(x86_64::XmmRegister(x86_64::XMM0),
   1008                            x86_64::Address(x86_64::CpuRegister(x86_64::RAX), 0),
   1009                            /*is64bit*/ true);
   1010   const char* expected = "cvtsi2ss 0(%RAX), %xmm0\n"
   1011                          "cvtsi2ssq 0(%RAX), %xmm0\n";
   1012   DriverStr(expected, "cvtsi2ss");
   1013 }
   1014 
   1015 TEST_F(AssemblerX86_64Test, Cvtsi2sdAddr) {
   1016   GetAssembler()->cvtsi2sd(x86_64::XmmRegister(x86_64::XMM0),
   1017                            x86_64::Address(x86_64::CpuRegister(x86_64::RAX), 0),
   1018                            /*is64bit*/ false);
   1019   GetAssembler()->cvtsi2sd(x86_64::XmmRegister(x86_64::XMM0),
   1020                            x86_64::Address(x86_64::CpuRegister(x86_64::RAX), 0),
   1021                            /*is64bit*/ true);
   1022   const char* expected = "cvtsi2sd 0(%RAX), %xmm0\n"
   1023                          "cvtsi2sdq 0(%RAX), %xmm0\n";
   1024   DriverStr(expected, "cvtsi2sd");
   1025 }
   1026 
   1027 TEST_F(AssemblerX86_64Test, CmpqAddr) {
   1028   DriverStr(RepeatRA(&x86_64::X86_64Assembler::cmpq, "cmpq {mem}, %{reg}"), "cmpq");
   1029 }
   1030 
   1031 TEST_F(AssemblerX86_64Test, MovsxdAddr) {
   1032   DriverStr(RepeatRA(&x86_64::X86_64Assembler::movsxd, "movslq {mem}, %{reg}"), "movsxd");
   1033 }
   1034 
   1035 TEST_F(AssemblerX86_64Test, TestqAddr) {
   1036   DriverStr(RepeatRA(&x86_64::X86_64Assembler::testq, "testq {mem}, %{reg}"), "testq");
   1037 }
   1038 
   1039 TEST_F(AssemblerX86_64Test, AddqAddr) {
   1040   DriverStr(RepeatRA(&x86_64::X86_64Assembler::addq, "addq {mem}, %{reg}"), "addq");
   1041 }
   1042 
   1043 TEST_F(AssemblerX86_64Test, SubqAddr) {
   1044   DriverStr(RepeatRA(&x86_64::X86_64Assembler::subq, "subq {mem}, %{reg}"), "subq");
   1045 }
   1046 
   1047 TEST_F(AssemblerX86_64Test, Cvtss2sdAddr) {
   1048   DriverStr(RepeatFA(&x86_64::X86_64Assembler::cvtss2sd, "cvtss2sd {mem}, %{reg}"), "cvtss2sd");
   1049 }
   1050 
   1051 TEST_F(AssemblerX86_64Test, Cvtsd2ssAddr) {
   1052   DriverStr(RepeatFA(&x86_64::X86_64Assembler::cvtsd2ss, "cvtsd2ss {mem}, %{reg}"), "cvtsd2ss");
   1053 }
   1054 
   1055 TEST_F(AssemblerX86_64Test, ComissAddr) {
   1056   DriverStr(RepeatFA(&x86_64::X86_64Assembler::comiss, "comiss {mem}, %{reg}"), "comiss");
   1057 }
   1058 
   1059 TEST_F(AssemblerX86_64Test, ComisdAddr) {
   1060   DriverStr(RepeatFA(&x86_64::X86_64Assembler::comisd, "comisd {mem}, %{reg}"), "comisd");
   1061 }
   1062 
   1063 TEST_F(AssemblerX86_64Test, UComissAddr) {
   1064   DriverStr(RepeatFA(&x86_64::X86_64Assembler::ucomiss, "ucomiss {mem}, %{reg}"), "ucomiss");
   1065 }
   1066 
   1067 TEST_F(AssemblerX86_64Test, UComisdAddr) {
   1068   DriverStr(RepeatFA(&x86_64::X86_64Assembler::ucomisd, "ucomisd {mem}, %{reg}"), "ucomisd");
   1069 }
   1070 
   1071 TEST_F(AssemblerX86_64Test, Andq) {
   1072   DriverStr(RepeatRA(&x86_64::X86_64Assembler::andq, "andq {mem}, %{reg}"), "andq");
   1073 }
   1074 
   1075 TEST_F(AssemblerX86_64Test, Orq) {
   1076   DriverStr(RepeatRA(&x86_64::X86_64Assembler::orq, "orq {mem}, %{reg}"), "orq");
   1077 }
   1078 
   1079 TEST_F(AssemblerX86_64Test, Xorq) {
   1080   DriverStr(RepeatRA(&x86_64::X86_64Assembler::xorq, "xorq {mem}, %{reg}"), "xorq");
   1081 }
   1082 
   1083 TEST_F(AssemblerX86_64Test, RepneScasb) {
   1084   GetAssembler()->repne_scasb();
   1085   const char* expected = "repne scasb\n";
   1086   DriverStr(expected, "repne_scasb");
   1087 }
   1088 
   1089 TEST_F(AssemblerX86_64Test, RepneScasw) {
   1090   GetAssembler()->repne_scasw();
   1091   const char* expected = "repne scasw\n";
   1092   DriverStr(expected, "repne_scasw");
   1093 }
   1094 
   1095 TEST_F(AssemblerX86_64Test, RepMovsw) {
   1096   GetAssembler()->rep_movsw();
   1097   const char* expected = "rep movsw\n";
   1098   DriverStr(expected, "rep_movsw");
   1099 }
   1100 
   1101 TEST_F(AssemblerX86_64Test, Movsxd) {
   1102   DriverStr(RepeatRr(&x86_64::X86_64Assembler::movsxd, "movsxd %{reg2}, %{reg1}"), "movsxd");
   1103 }
   1104 
   1105 TEST_F(AssemblerX86_64Test, Movaps) {
   1106   DriverStr(RepeatFF(&x86_64::X86_64Assembler::movaps, "movaps %{reg2}, %{reg1}"), "movaps");
   1107 }
   1108 
   1109 TEST_F(AssemblerX86_64Test, MovapsStore) {
   1110   DriverStr(RepeatAF(&x86_64::X86_64Assembler::movaps, "movaps %{reg}, {mem}"), "movaps_s");
   1111 }
   1112 
   1113 TEST_F(AssemblerX86_64Test, MovapsLoad) {
   1114   DriverStr(RepeatFA(&x86_64::X86_64Assembler::movaps, "movaps {mem}, %{reg}"), "movaps_l");
   1115 }
   1116 
   1117 TEST_F(AssemblerX86_64Test, MovupsStore) {
   1118   DriverStr(RepeatAF(&x86_64::X86_64Assembler::movups, "movups %{reg}, {mem}"), "movups_s");
   1119 }
   1120 
   1121 TEST_F(AssemblerX86_64Test, MovupsLoad) {
   1122   DriverStr(RepeatFA(&x86_64::X86_64Assembler::movups, "movups {mem}, %{reg}"), "movups_l");
   1123 }
   1124 
   1125 TEST_F(AssemblerX86_64Test, Movss) {
   1126   DriverStr(RepeatFF(&x86_64::X86_64Assembler::movss, "movss %{reg2}, %{reg1}"), "movss");
   1127 }
   1128 
   1129 TEST_F(AssemblerX86_64Test, Movapd) {
   1130   DriverStr(RepeatFF(&x86_64::X86_64Assembler::movapd, "movapd %{reg2}, %{reg1}"), "movapd");
   1131 }
   1132 
   1133 TEST_F(AssemblerX86_64Test, MovapdStore) {
   1134   DriverStr(RepeatAF(&x86_64::X86_64Assembler::movapd, "movapd %{reg}, {mem}"), "movapd_s");
   1135 }
   1136 
   1137 TEST_F(AssemblerX86_64Test, MovapdLoad) {
   1138   DriverStr(RepeatFA(&x86_64::X86_64Assembler::movapd, "movapd {mem}, %{reg}"), "movapd_l");
   1139 }
   1140 
   1141 TEST_F(AssemblerX86_64Test, MovupdStore) {
   1142   DriverStr(RepeatAF(&x86_64::X86_64Assembler::movupd, "movupd %{reg}, {mem}"), "movupd_s");
   1143 }
   1144 
   1145 TEST_F(AssemblerX86_64Test, MovupdLoad) {
   1146   DriverStr(RepeatFA(&x86_64::X86_64Assembler::movupd, "movupd {mem}, %{reg}"), "movupd_l");
   1147 }
   1148 
   1149 TEST_F(AssemblerX86_64Test, Movsd) {
   1150   DriverStr(RepeatFF(&x86_64::X86_64Assembler::movsd, "movsd %{reg2}, %{reg1}"), "movsd");
   1151 }
   1152 
   1153 TEST_F(AssemblerX86_64Test, Movdqa) {
   1154   DriverStr(RepeatFF(&x86_64::X86_64Assembler::movdqa, "movdqa %{reg2}, %{reg1}"), "movdqa");
   1155 }
   1156 
   1157 TEST_F(AssemblerX86_64Test, MovdqaStore) {
   1158   DriverStr(RepeatAF(&x86_64::X86_64Assembler::movdqa, "movdqa %{reg}, {mem}"), "movdqa_s");
   1159 }
   1160 
   1161 TEST_F(AssemblerX86_64Test, MovdqaLoad) {
   1162   DriverStr(RepeatFA(&x86_64::X86_64Assembler::movdqa, "movdqa {mem}, %{reg}"), "movdqa_l");
   1163 }
   1164 
   1165 TEST_F(AssemblerX86_64Test, MovdquStore) {
   1166   DriverStr(RepeatAF(&x86_64::X86_64Assembler::movdqu, "movdqu %{reg}, {mem}"), "movdqu_s");
   1167 }
   1168 
   1169 TEST_F(AssemblerX86_64Test, MovdquLoad) {
   1170   DriverStr(RepeatFA(&x86_64::X86_64Assembler::movdqu, "movdqu {mem}, %{reg}"), "movdqu_l");
   1171 }
   1172 
   1173 TEST_F(AssemblerX86_64Test, Movd1) {
   1174   DriverStr(RepeatFR(&x86_64::X86_64Assembler::movd, "movd %{reg2}, %{reg1}"), "movd.1");
   1175 }
   1176 
   1177 TEST_F(AssemblerX86_64Test, Movd2) {
   1178   DriverStr(RepeatRF(&x86_64::X86_64Assembler::movd, "movd %{reg2}, %{reg1}"), "movd.2");
   1179 }
   1180 
   1181 TEST_F(AssemblerX86_64Test, Addss) {
   1182   DriverStr(RepeatFF(&x86_64::X86_64Assembler::addss, "addss %{reg2}, %{reg1}"), "addss");
   1183 }
   1184 
   1185 TEST_F(AssemblerX86_64Test, Addsd) {
   1186   DriverStr(RepeatFF(&x86_64::X86_64Assembler::addsd, "addsd %{reg2}, %{reg1}"), "addsd");
   1187 }
   1188 
   1189 TEST_F(AssemblerX86_64Test, Addps) {
   1190   DriverStr(RepeatFF(&x86_64::X86_64Assembler::addps, "addps %{reg2}, %{reg1}"), "addps");
   1191 }
   1192 
   1193 TEST_F(AssemblerX86_64Test, Addpd) {
   1194   DriverStr(RepeatFF(&x86_64::X86_64Assembler::addpd, "addpd %{reg2}, %{reg1}"), "addpd");
   1195 }
   1196 
   1197 TEST_F(AssemblerX86_64Test, Subss) {
   1198   DriverStr(RepeatFF(&x86_64::X86_64Assembler::subss, "subss %{reg2}, %{reg1}"), "subss");
   1199 }
   1200 
   1201 TEST_F(AssemblerX86_64Test, Subsd) {
   1202   DriverStr(RepeatFF(&x86_64::X86_64Assembler::subsd, "subsd %{reg2}, %{reg1}"), "subsd");
   1203 }
   1204 
   1205 TEST_F(AssemblerX86_64Test, Subps) {
   1206   DriverStr(RepeatFF(&x86_64::X86_64Assembler::subps, "subps %{reg2}, %{reg1}"), "subps");
   1207 }
   1208 
   1209 TEST_F(AssemblerX86_64Test, Subpd) {
   1210   DriverStr(RepeatFF(&x86_64::X86_64Assembler::subpd, "subpd %{reg2}, %{reg1}"), "subpd");
   1211 }
   1212 
   1213 TEST_F(AssemblerX86_64Test, Mulss) {
   1214   DriverStr(RepeatFF(&x86_64::X86_64Assembler::mulss, "mulss %{reg2}, %{reg1}"), "mulss");
   1215 }
   1216 
   1217 TEST_F(AssemblerX86_64Test, Mulsd) {
   1218   DriverStr(RepeatFF(&x86_64::X86_64Assembler::mulsd, "mulsd %{reg2}, %{reg1}"), "mulsd");
   1219 }
   1220 
   1221 TEST_F(AssemblerX86_64Test, Mulps) {
   1222   DriverStr(RepeatFF(&x86_64::X86_64Assembler::mulps, "mulps %{reg2}, %{reg1}"), "mulps");
   1223 }
   1224 
   1225 TEST_F(AssemblerX86_64Test, Mulpd) {
   1226   DriverStr(RepeatFF(&x86_64::X86_64Assembler::mulpd, "mulpd %{reg2}, %{reg1}"), "mulpd");
   1227 }
   1228 
   1229 TEST_F(AssemblerX86_64Test, Divss) {
   1230   DriverStr(RepeatFF(&x86_64::X86_64Assembler::divss, "divss %{reg2}, %{reg1}"), "divss");
   1231 }
   1232 
   1233 TEST_F(AssemblerX86_64Test, Divsd) {
   1234   DriverStr(RepeatFF(&x86_64::X86_64Assembler::divsd, "divsd %{reg2}, %{reg1}"), "divsd");
   1235 }
   1236 
   1237 TEST_F(AssemblerX86_64Test, Divps) {
   1238   DriverStr(RepeatFF(&x86_64::X86_64Assembler::divps, "divps %{reg2}, %{reg1}"), "divps");
   1239 }
   1240 
   1241 TEST_F(AssemblerX86_64Test, Divpd) {
   1242   DriverStr(RepeatFF(&x86_64::X86_64Assembler::divpd, "divpd %{reg2}, %{reg1}"), "divpd");
   1243 }
   1244 
   1245 TEST_F(AssemblerX86_64Test, Paddb) {
   1246   DriverStr(RepeatFF(&x86_64::X86_64Assembler::paddb, "paddb %{reg2}, %{reg1}"), "paddb");
   1247 }
   1248 
   1249 TEST_F(AssemblerX86_64Test, Psubb) {
   1250   DriverStr(RepeatFF(&x86_64::X86_64Assembler::psubb, "psubb %{reg2}, %{reg1}"), "psubb");
   1251 }
   1252 
   1253 TEST_F(AssemblerX86_64Test, Paddw) {
   1254   DriverStr(RepeatFF(&x86_64::X86_64Assembler::paddw, "paddw %{reg2}, %{reg1}"), "paddw");
   1255 }
   1256 
   1257 TEST_F(AssemblerX86_64Test, Psubw) {
   1258   DriverStr(RepeatFF(&x86_64::X86_64Assembler::psubw, "psubw %{reg2}, %{reg1}"), "psubw");
   1259 }
   1260 
   1261 TEST_F(AssemblerX86_64Test, Pmullw) {
   1262   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pmullw, "pmullw %{reg2}, %{reg1}"), "pmullw");
   1263 }
   1264 
   1265 TEST_F(AssemblerX86_64Test, Paddd) {
   1266   DriverStr(RepeatFF(&x86_64::X86_64Assembler::paddd, "paddd %{reg2}, %{reg1}"), "paddd");
   1267 }
   1268 
   1269 TEST_F(AssemblerX86_64Test, Psubd) {
   1270   DriverStr(RepeatFF(&x86_64::X86_64Assembler::psubd, "psubd %{reg2}, %{reg1}"), "psubd");
   1271 }
   1272 
   1273 TEST_F(AssemblerX86_64Test, Pmulld) {
   1274   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pmulld, "pmulld %{reg2}, %{reg1}"), "pmulld");
   1275 }
   1276 
   1277 TEST_F(AssemblerX86_64Test, Paddq) {
   1278   DriverStr(RepeatFF(&x86_64::X86_64Assembler::paddq, "paddq %{reg2}, %{reg1}"), "paddq");
   1279 }
   1280 
   1281 TEST_F(AssemblerX86_64Test, Psubq) {
   1282   DriverStr(RepeatFF(&x86_64::X86_64Assembler::psubq, "psubq %{reg2}, %{reg1}"), "psubq");
   1283 }
   1284 
   1285 TEST_F(AssemblerX86_64Test, Cvtsi2ss) {
   1286   DriverStr(RepeatFr(&x86_64::X86_64Assembler::cvtsi2ss, "cvtsi2ss %{reg2}, %{reg1}"), "cvtsi2ss");
   1287 }
   1288 
   1289 TEST_F(AssemblerX86_64Test, Cvtsi2sd) {
   1290   DriverStr(RepeatFr(&x86_64::X86_64Assembler::cvtsi2sd, "cvtsi2sd %{reg2}, %{reg1}"), "cvtsi2sd");
   1291 }
   1292 
   1293 TEST_F(AssemblerX86_64Test, Cvtss2si) {
   1294   DriverStr(RepeatrF(&x86_64::X86_64Assembler::cvtss2si, "cvtss2si %{reg2}, %{reg1}"), "cvtss2si");
   1295 }
   1296 
   1297 TEST_F(AssemblerX86_64Test, Cvtss2sd) {
   1298   DriverStr(RepeatFF(&x86_64::X86_64Assembler::cvtss2sd, "cvtss2sd %{reg2}, %{reg1}"), "cvtss2sd");
   1299 }
   1300 
   1301 TEST_F(AssemblerX86_64Test, Cvtsd2si) {
   1302   DriverStr(RepeatrF(&x86_64::X86_64Assembler::cvtsd2si, "cvtsd2si %{reg2}, %{reg1}"), "cvtsd2si");
   1303 }
   1304 
   1305 TEST_F(AssemblerX86_64Test, Cvttss2si) {
   1306   DriverStr(RepeatrF(&x86_64::X86_64Assembler::cvttss2si, "cvttss2si %{reg2}, %{reg1}"),
   1307             "cvttss2si");
   1308 }
   1309 
   1310 TEST_F(AssemblerX86_64Test, Cvttsd2si) {
   1311   DriverStr(RepeatrF(&x86_64::X86_64Assembler::cvttsd2si, "cvttsd2si %{reg2}, %{reg1}"),
   1312             "cvttsd2si");
   1313 }
   1314 
   1315 TEST_F(AssemblerX86_64Test, Cvtsd2ss) {
   1316   DriverStr(RepeatFF(&x86_64::X86_64Assembler::cvtsd2ss, "cvtsd2ss %{reg2}, %{reg1}"), "cvtsd2ss");
   1317 }
   1318 
   1319 TEST_F(AssemblerX86_64Test, Cvtdq2ps) {
   1320   DriverStr(RepeatFF(&x86_64::X86_64Assembler::cvtdq2ps, "cvtdq2ps %{reg2}, %{reg1}"), "cvtdq2ps");
   1321 }
   1322 
   1323 TEST_F(AssemblerX86_64Test, Cvtdq2pd) {
   1324   DriverStr(RepeatFF(&x86_64::X86_64Assembler::cvtdq2pd, "cvtdq2pd %{reg2}, %{reg1}"), "cvtdq2pd");
   1325 }
   1326 
   1327 TEST_F(AssemblerX86_64Test, Comiss) {
   1328   DriverStr(RepeatFF(&x86_64::X86_64Assembler::comiss, "comiss %{reg2}, %{reg1}"), "comiss");
   1329 }
   1330 
   1331 TEST_F(AssemblerX86_64Test, Comisd) {
   1332   DriverStr(RepeatFF(&x86_64::X86_64Assembler::comisd, "comisd %{reg2}, %{reg1}"), "comisd");
   1333 }
   1334 
   1335 TEST_F(AssemblerX86_64Test, Ucomiss) {
   1336   DriverStr(RepeatFF(&x86_64::X86_64Assembler::ucomiss, "ucomiss %{reg2}, %{reg1}"), "ucomiss");
   1337 }
   1338 
   1339 TEST_F(AssemblerX86_64Test, Ucomisd) {
   1340   DriverStr(RepeatFF(&x86_64::X86_64Assembler::ucomisd, "ucomisd %{reg2}, %{reg1}"), "ucomisd");
   1341 }
   1342 
   1343 TEST_F(AssemblerX86_64Test, Sqrtss) {
   1344   DriverStr(RepeatFF(&x86_64::X86_64Assembler::sqrtss, "sqrtss %{reg2}, %{reg1}"), "sqrtss");
   1345 }
   1346 
   1347 TEST_F(AssemblerX86_64Test, Sqrtsd) {
   1348   DriverStr(RepeatFF(&x86_64::X86_64Assembler::sqrtsd, "sqrtsd %{reg2}, %{reg1}"), "sqrtsd");
   1349 }
   1350 
   1351 TEST_F(AssemblerX86_64Test, Roundss) {
   1352   DriverStr(RepeatFFI(&x86_64::X86_64Assembler::roundss, /*imm_bytes*/ 1U,
   1353                       "roundss ${imm}, %{reg2}, %{reg1}"), "roundss");
   1354 }
   1355 
   1356 TEST_F(AssemblerX86_64Test, Roundsd) {
   1357   DriverStr(RepeatFFI(&x86_64::X86_64Assembler::roundsd, /*imm_bytes*/ 1U,
   1358                       "roundsd ${imm}, %{reg2}, %{reg1}"), "roundsd");
   1359 }
   1360 
   1361 TEST_F(AssemblerX86_64Test, Xorps) {
   1362   DriverStr(RepeatFF(&x86_64::X86_64Assembler::xorps, "xorps %{reg2}, %{reg1}"), "xorps");
   1363 }
   1364 
   1365 TEST_F(AssemblerX86_64Test, Xorpd) {
   1366   DriverStr(RepeatFF(&x86_64::X86_64Assembler::xorpd, "xorpd %{reg2}, %{reg1}"), "xorpd");
   1367 }
   1368 
   1369 TEST_F(AssemblerX86_64Test, Pxor) {
   1370   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pxor, "pxor %{reg2}, %{reg1}"), "pxor");
   1371 }
   1372 
   1373 TEST_F(AssemblerX86_64Test, Andps) {
   1374   DriverStr(RepeatFF(&x86_64::X86_64Assembler::andps, "andps %{reg2}, %{reg1}"), "andps");
   1375 }
   1376 
   1377 TEST_F(AssemblerX86_64Test, Andpd) {
   1378   DriverStr(RepeatFF(&x86_64::X86_64Assembler::andpd, "andpd %{reg2}, %{reg1}"), "andpd");
   1379 }
   1380 
   1381 TEST_F(AssemblerX86_64Test, Pand) {
   1382   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pand, "pand %{reg2}, %{reg1}"), "pand");
   1383 }
   1384 
   1385 TEST_F(AssemblerX86_64Test, andnpd) {
   1386   DriverStr(RepeatFF(&x86_64::X86_64Assembler::andnpd, "andnpd %{reg2}, %{reg1}"), "andnpd");
   1387 }
   1388 
   1389 TEST_F(AssemblerX86_64Test, andnps) {
   1390   DriverStr(RepeatFF(&x86_64::X86_64Assembler::andnps, "andnps %{reg2}, %{reg1}"), "andnps");
   1391 }
   1392 
   1393 TEST_F(AssemblerX86_64Test, Pandn) {
   1394   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pandn, "pandn %{reg2}, %{reg1}"), "pandn");
   1395 }
   1396 
   1397 TEST_F(AssemblerX86_64Test, Orps) {
   1398   DriverStr(RepeatFF(&x86_64::X86_64Assembler::orps, "orps %{reg2}, %{reg1}"), "orps");
   1399 }
   1400 
   1401 TEST_F(AssemblerX86_64Test, Orpd) {
   1402   DriverStr(RepeatFF(&x86_64::X86_64Assembler::orpd, "orpd %{reg2}, %{reg1}"), "orpd");
   1403 }
   1404 
   1405 TEST_F(AssemblerX86_64Test, Por) {
   1406   DriverStr(RepeatFF(&x86_64::X86_64Assembler::por, "por %{reg2}, %{reg1}"), "por");
   1407 }
   1408 
   1409 TEST_F(AssemblerX86_64Test, Pavgb) {
   1410   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pavgb, "pavgb %{reg2}, %{reg1}"), "pavgb");
   1411 }
   1412 
   1413 TEST_F(AssemblerX86_64Test, Pavgw) {
   1414   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pavgw, "pavgw %{reg2}, %{reg1}"), "pavgw");
   1415 }
   1416 
   1417 TEST_F(AssemblerX86_64Test, Psadbw) {
   1418   DriverStr(RepeatFF(&x86_64::X86_64Assembler::psadbw, "psadbw %{reg2}, %{reg1}"), "psadbw");
   1419 }
   1420 
   1421 TEST_F(AssemblerX86_64Test, Pmaddwd) {
   1422   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pmaddwd, "pmaddwd %{reg2}, %{reg1}"), "pmadwd");
   1423 }
   1424 
   1425 TEST_F(AssemblerX86_64Test, Phaddw) {
   1426   DriverStr(RepeatFF(&x86_64::X86_64Assembler::phaddw, "phaddw %{reg2}, %{reg1}"), "phaddw");
   1427 }
   1428 
   1429 TEST_F(AssemblerX86_64Test, Phaddd) {
   1430   DriverStr(RepeatFF(&x86_64::X86_64Assembler::phaddd, "phaddd %{reg2}, %{reg1}"), "phaddd");
   1431 }
   1432 
   1433 TEST_F(AssemblerX86_64Test, Haddps) {
   1434   DriverStr(RepeatFF(&x86_64::X86_64Assembler::haddps, "haddps %{reg2}, %{reg1}"), "haddps");
   1435 }
   1436 
   1437 TEST_F(AssemblerX86_64Test, Haddpd) {
   1438   DriverStr(RepeatFF(&x86_64::X86_64Assembler::haddpd, "haddpd %{reg2}, %{reg1}"), "haddpd");
   1439 }
   1440 
   1441 TEST_F(AssemblerX86_64Test, Phsubw) {
   1442   DriverStr(RepeatFF(&x86_64::X86_64Assembler::phsubw, "phsubw %{reg2}, %{reg1}"), "phsubw");
   1443 }
   1444 
   1445 TEST_F(AssemblerX86_64Test, Phsubd) {
   1446   DriverStr(RepeatFF(&x86_64::X86_64Assembler::phsubd, "phsubd %{reg2}, %{reg1}"), "phsubd");
   1447 }
   1448 
   1449 TEST_F(AssemblerX86_64Test, Hsubps) {
   1450   DriverStr(RepeatFF(&x86_64::X86_64Assembler::hsubps, "hsubps %{reg2}, %{reg1}"), "hsubps");
   1451 }
   1452 
   1453 TEST_F(AssemblerX86_64Test, Hsubpd) {
   1454   DriverStr(RepeatFF(&x86_64::X86_64Assembler::hsubpd, "hsubpd %{reg2}, %{reg1}"), "hsubpd");
   1455 }
   1456 
   1457 TEST_F(AssemblerX86_64Test, Pminsb) {
   1458   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pminsb, "pminsb %{reg2}, %{reg1}"), "pminsb");
   1459 }
   1460 
   1461 TEST_F(AssemblerX86_64Test, Pmaxsb) {
   1462   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pmaxsb, "pmaxsb %{reg2}, %{reg1}"), "pmaxsb");
   1463 }
   1464 
   1465 TEST_F(AssemblerX86_64Test, Pminsw) {
   1466   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pminsw, "pminsw %{reg2}, %{reg1}"), "pminsw");
   1467 }
   1468 
   1469 TEST_F(AssemblerX86_64Test, Pmaxsw) {
   1470   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pmaxsw, "pmaxsw %{reg2}, %{reg1}"), "pmaxsw");
   1471 }
   1472 
   1473 TEST_F(AssemblerX86_64Test, Pminsd) {
   1474   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pminsd, "pminsd %{reg2}, %{reg1}"), "pminsd");
   1475 }
   1476 
   1477 TEST_F(AssemblerX86_64Test, Pmaxsd) {
   1478   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pmaxsd, "pmaxsd %{reg2}, %{reg1}"), "pmaxsd");
   1479 }
   1480 
   1481 TEST_F(AssemblerX86_64Test, Pminub) {
   1482   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pminub, "pminub %{reg2}, %{reg1}"), "pminub");
   1483 }
   1484 
   1485 TEST_F(AssemblerX86_64Test, Pmaxub) {
   1486   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pmaxub, "pmaxub %{reg2}, %{reg1}"), "pmaxub");
   1487 }
   1488 
   1489 TEST_F(AssemblerX86_64Test, Pminuw) {
   1490   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pminuw, "pminuw %{reg2}, %{reg1}"), "pminuw");
   1491 }
   1492 
   1493 TEST_F(AssemblerX86_64Test, Pmaxuw) {
   1494   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pmaxuw, "pmaxuw %{reg2}, %{reg1}"), "pmaxuw");
   1495 }
   1496 
   1497 TEST_F(AssemblerX86_64Test, Pminud) {
   1498   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pminud, "pminud %{reg2}, %{reg1}"), "pminud");
   1499 }
   1500 
   1501 TEST_F(AssemblerX86_64Test, Pmaxud) {
   1502   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pmaxud, "pmaxud %{reg2}, %{reg1}"), "pmaxud");
   1503 }
   1504 
   1505 TEST_F(AssemblerX86_64Test, Minps) {
   1506   DriverStr(RepeatFF(&x86_64::X86_64Assembler::minps, "minps %{reg2}, %{reg1}"), "minps");
   1507 }
   1508 
   1509 TEST_F(AssemblerX86_64Test, Maxps) {
   1510   DriverStr(RepeatFF(&x86_64::X86_64Assembler::maxps, "maxps %{reg2}, %{reg1}"), "maxps");
   1511 }
   1512 
   1513 TEST_F(AssemblerX86_64Test, Minpd) {
   1514   DriverStr(RepeatFF(&x86_64::X86_64Assembler::minpd, "minpd %{reg2}, %{reg1}"), "minpd");
   1515 }
   1516 
   1517 TEST_F(AssemblerX86_64Test, Maxpd) {
   1518   DriverStr(RepeatFF(&x86_64::X86_64Assembler::maxpd, "maxpd %{reg2}, %{reg1}"), "maxpd");
   1519 }
   1520 
   1521 TEST_F(AssemblerX86_64Test, PCmpeqb) {
   1522   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpeqb, "pcmpeqb %{reg2}, %{reg1}"), "pcmpeqb");
   1523 }
   1524 
   1525 TEST_F(AssemblerX86_64Test, PCmpeqw) {
   1526   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpeqw, "pcmpeqw %{reg2}, %{reg1}"), "pcmpeqw");
   1527 }
   1528 
   1529 TEST_F(AssemblerX86_64Test, PCmpeqd) {
   1530   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpeqd, "pcmpeqd %{reg2}, %{reg1}"), "pcmpeqd");
   1531 }
   1532 
   1533 TEST_F(AssemblerX86_64Test, PCmpeqq) {
   1534   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpeqq, "pcmpeqq %{reg2}, %{reg1}"), "pcmpeqq");
   1535 }
   1536 
   1537 TEST_F(AssemblerX86_64Test, PCmpgtb) {
   1538   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpgtb, "pcmpgtb %{reg2}, %{reg1}"), "pcmpgtb");
   1539 }
   1540 
   1541 TEST_F(AssemblerX86_64Test, PCmpgtw) {
   1542   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpgtw, "pcmpgtw %{reg2}, %{reg1}"), "pcmpgtw");
   1543 }
   1544 
   1545 TEST_F(AssemblerX86_64Test, PCmpgtd) {
   1546   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpgtd, "pcmpgtd %{reg2}, %{reg1}"), "pcmpgtd");
   1547 }
   1548 
   1549 TEST_F(AssemblerX86_64Test, PCmpgtq) {
   1550   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpgtq, "pcmpgtq %{reg2}, %{reg1}"), "pcmpgtq");
   1551 }
   1552 
   1553 TEST_F(AssemblerX86_64Test, Shufps) {
   1554   DriverStr(RepeatFFI(&x86_64::X86_64Assembler::shufps, /*imm_bytes*/ 1U,
   1555                       "shufps ${imm}, %{reg2}, %{reg1}"), "shufps");
   1556 }
   1557 
   1558 TEST_F(AssemblerX86_64Test, Shufpd) {
   1559   DriverStr(RepeatFFI(&x86_64::X86_64Assembler::shufpd, /*imm_bytes*/ 1U,
   1560                       "shufpd ${imm}, %{reg2}, %{reg1}"), "shufpd");
   1561 }
   1562 
   1563 TEST_F(AssemblerX86_64Test, PShufd) {
   1564   DriverStr(RepeatFFI(&x86_64::X86_64Assembler::pshufd, /*imm_bytes*/ 1U,
   1565                       "pshufd ${imm}, %{reg2}, %{reg1}"), "pshufd");
   1566 }
   1567 
   1568 TEST_F(AssemblerX86_64Test, Punpcklbw) {
   1569   DriverStr(RepeatFF(&x86_64::X86_64Assembler::punpcklbw,
   1570                      "punpcklbw %{reg2}, %{reg1}"), "punpcklbw");
   1571 }
   1572 
   1573 TEST_F(AssemblerX86_64Test, Punpcklwd) {
   1574   DriverStr(RepeatFF(&x86_64::X86_64Assembler::punpcklwd,
   1575                      "punpcklwd %{reg2}, %{reg1}"), "punpcklwd");
   1576 }
   1577 
   1578 TEST_F(AssemblerX86_64Test, Punpckldq) {
   1579   DriverStr(RepeatFF(&x86_64::X86_64Assembler::punpckldq,
   1580                      "punpckldq %{reg2}, %{reg1}"), "punpckldq");
   1581 }
   1582 
   1583 TEST_F(AssemblerX86_64Test, Punpcklqdq) {
   1584   DriverStr(RepeatFF(&x86_64::X86_64Assembler::punpcklqdq,
   1585                      "punpcklqdq %{reg2}, %{reg1}"), "punpcklqdq");
   1586 }
   1587 
   1588 TEST_F(AssemblerX86_64Test, Punpckhbw) {
   1589   DriverStr(RepeatFF(&x86_64::X86_64Assembler::punpckhbw,
   1590                      "punpckhbw %{reg2}, %{reg1}"), "punpckhbw");
   1591 }
   1592 
   1593 TEST_F(AssemblerX86_64Test, Punpckhwd) {
   1594   DriverStr(RepeatFF(&x86_64::X86_64Assembler::punpckhwd,
   1595                      "punpckhwd %{reg2}, %{reg1}"), "punpckhwd");
   1596 }
   1597 
   1598 TEST_F(AssemblerX86_64Test, Punpckhdq) {
   1599   DriverStr(RepeatFF(&x86_64::X86_64Assembler::punpckhdq,
   1600                      "punpckhdq %{reg2}, %{reg1}"), "punpckhdq");
   1601 }
   1602 
   1603 TEST_F(AssemblerX86_64Test, Punpckhqdq) {
   1604   DriverStr(RepeatFF(&x86_64::X86_64Assembler::punpckhqdq,
   1605                      "punpckhqdq %{reg2}, %{reg1}"), "punpckhqdq");
   1606 }
   1607 
   1608 TEST_F(AssemblerX86_64Test, Psllw) {
   1609   GetAssembler()->psllw(x86_64::XmmRegister(x86_64::XMM0),  x86_64::Immediate(1));
   1610   GetAssembler()->psllw(x86_64::XmmRegister(x86_64::XMM15), x86_64::Immediate(2));
   1611   DriverStr("psllw $1, %xmm0\n"
   1612             "psllw $2, %xmm15\n", "psllwi");
   1613 }
   1614 
   1615 TEST_F(AssemblerX86_64Test, Pslld) {
   1616   GetAssembler()->pslld(x86_64::XmmRegister(x86_64::XMM0),  x86_64::Immediate(1));
   1617   GetAssembler()->pslld(x86_64::XmmRegister(x86_64::XMM15), x86_64::Immediate(2));
   1618   DriverStr("pslld $1, %xmm0\n"
   1619             "pslld $2, %xmm15\n", "pslldi");
   1620 }
   1621 
   1622 TEST_F(AssemblerX86_64Test, Psllq) {
   1623   GetAssembler()->psllq(x86_64::XmmRegister(x86_64::XMM0),  x86_64::Immediate(1));
   1624   GetAssembler()->psllq(x86_64::XmmRegister(x86_64::XMM15), x86_64::Immediate(2));
   1625   DriverStr("psllq $1, %xmm0\n"
   1626             "psllq $2, %xmm15\n", "psllqi");
   1627 }
   1628 
   1629 TEST_F(AssemblerX86_64Test, Psraw) {
   1630   GetAssembler()->psraw(x86_64::XmmRegister(x86_64::XMM0),  x86_64::Immediate(1));
   1631   GetAssembler()->psraw(x86_64::XmmRegister(x86_64::XMM15), x86_64::Immediate(2));
   1632   DriverStr("psraw $1, %xmm0\n"
   1633             "psraw $2, %xmm15\n", "psrawi");
   1634 }
   1635 
   1636 TEST_F(AssemblerX86_64Test, Psrad) {
   1637   GetAssembler()->psrad(x86_64::XmmRegister(x86_64::XMM0),  x86_64::Immediate(1));
   1638   GetAssembler()->psrad(x86_64::XmmRegister(x86_64::XMM15), x86_64::Immediate(2));
   1639   DriverStr("psrad $1, %xmm0\n"
   1640             "psrad $2, %xmm15\n", "psradi");
   1641 }
   1642 
   1643 TEST_F(AssemblerX86_64Test, Psrlw) {
   1644   GetAssembler()->psrlw(x86_64::XmmRegister(x86_64::XMM0),  x86_64::Immediate(1));
   1645   GetAssembler()->psrlw(x86_64::XmmRegister(x86_64::XMM15), x86_64::Immediate(2));
   1646   DriverStr("psrlw $1, %xmm0\n"
   1647             "psrlw $2, %xmm15\n", "psrlwi");
   1648 }
   1649 
   1650 TEST_F(AssemblerX86_64Test, Psrld) {
   1651   GetAssembler()->psrld(x86_64::XmmRegister(x86_64::XMM0),  x86_64::Immediate(1));
   1652   GetAssembler()->psrld(x86_64::XmmRegister(x86_64::XMM15), x86_64::Immediate(2));
   1653   DriverStr("psrld $1, %xmm0\n"
   1654             "psrld $2, %xmm15\n", "psrldi");
   1655 }
   1656 
   1657 TEST_F(AssemblerX86_64Test, Psrlq) {
   1658   GetAssembler()->psrlq(x86_64::XmmRegister(x86_64::XMM0),  x86_64::Immediate(1));
   1659   GetAssembler()->psrlq(x86_64::XmmRegister(x86_64::XMM15), x86_64::Immediate(2));
   1660   DriverStr("psrlq $1, %xmm0\n"
   1661             "psrlq $2, %xmm15\n", "psrlqi");
   1662 }
   1663 
   1664 TEST_F(AssemblerX86_64Test, Psrldq) {
   1665   GetAssembler()->psrldq(x86_64::XmmRegister(x86_64::XMM0),  x86_64::Immediate(1));
   1666   GetAssembler()->psrldq(x86_64::XmmRegister(x86_64::XMM15), x86_64::Immediate(2));
   1667   DriverStr("psrldq $1, %xmm0\n"
   1668             "psrldq $2, %xmm15\n", "psrldqi");
   1669 }
   1670 
   1671 std::string x87_fn(AssemblerX86_64Test::Base* assembler_test ATTRIBUTE_UNUSED,
   1672                    x86_64::X86_64Assembler* assembler) {
   1673   std::ostringstream str;
   1674 
   1675   assembler->fincstp();
   1676   str << "fincstp\n";
   1677 
   1678   assembler->fsin();
   1679   str << "fsin\n";
   1680 
   1681   assembler->fcos();
   1682   str << "fcos\n";
   1683 
   1684   assembler->fptan();
   1685   str << "fptan\n";
   1686 
   1687   return str.str();
   1688 }
   1689 
   1690 TEST_F(AssemblerX86_64Test, X87) {
   1691   DriverFn(&x87_fn, "x87");
   1692 }
   1693 
   1694 TEST_F(AssemblerX86_64Test, FPUIntegerLoads) {
   1695   DriverStr(RepeatA(&x86_64::X86_64Assembler::filds,
   1696                     addresses_singleton_,  // no ext addressing
   1697                     "fildl {mem}"), "filds");
   1698 }
   1699 
   1700 TEST_F(AssemblerX86_64Test, FPUIntegerLoadl) {
   1701   DriverStr(RepeatA(&x86_64::X86_64Assembler::fildl,
   1702                     addresses_singleton_,  // no ext addressing
   1703                     "fildll {mem}"), "fildl");
   1704 }
   1705 
   1706 TEST_F(AssemblerX86_64Test, FPUIntegerStores) {
   1707   DriverStr(RepeatA(&x86_64::X86_64Assembler::fistps,
   1708                     addresses_singleton_,  // no ext addressing
   1709                     "fistpl {mem}"), "fistps");
   1710 }
   1711 
   1712 TEST_F(AssemblerX86_64Test, FPUIntegerStorel) {
   1713   DriverStr(RepeatA(&x86_64::X86_64Assembler::fistpl,
   1714                     addresses_singleton_,  // no ext addressing
   1715                     "fistpll {mem}"), "fistpl");
   1716 }
   1717 
   1718 TEST_F(AssemblerX86_64Test, Call) {
   1719   DriverStr(RepeatR(&x86_64::X86_64Assembler::call, "call *%{reg}"), "call");
   1720 }
   1721 
   1722 TEST_F(AssemblerX86_64Test, Jmp) {
   1723   DriverStr(RepeatR(&x86_64::X86_64Assembler::jmp, "jmp *%{reg}"), "jmp");
   1724 }
   1725 
   1726 TEST_F(AssemblerX86_64Test, Enter) {
   1727   DriverStr(RepeatI(&x86_64::X86_64Assembler::enter,
   1728                     /*imm_bytes*/ 2U,
   1729                     "enter ${imm}, $0", /*non-negative*/ true), "enter");
   1730 }
   1731 
   1732 TEST_F(AssemblerX86_64Test, RetImm) {
   1733   DriverStr(RepeatI(&x86_64::X86_64Assembler::ret,
   1734                     /*imm_bytes*/ 2U,
   1735                     "ret ${imm}", /*non-negative*/ true), "ret");
   1736 }
   1737 
   1738 std::string ret_and_leave_fn(AssemblerX86_64Test::Base* assembler_test ATTRIBUTE_UNUSED,
   1739                              x86_64::X86_64Assembler* assembler) {
   1740   std::ostringstream str;
   1741 
   1742   assembler->ret();
   1743   str << "ret\n";
   1744 
   1745   assembler->leave();
   1746   str << "leave\n";
   1747 
   1748   return str.str();
   1749 }
   1750 
   1751 TEST_F(AssemblerX86_64Test, RetAndLeave) {
   1752   DriverFn(&ret_and_leave_fn, "retleave");
   1753 }
   1754 
   1755 TEST_F(AssemblerX86_64Test, Bswapl) {
   1756   DriverStr(Repeatr(&x86_64::X86_64Assembler::bswapl, "bswap %{reg}"), "bswapl");
   1757 }
   1758 
   1759 TEST_F(AssemblerX86_64Test, Bswapq) {
   1760   DriverStr(RepeatR(&x86_64::X86_64Assembler::bswapq, "bswap %{reg}"), "bswapq");
   1761 }
   1762 
   1763 TEST_F(AssemblerX86_64Test, Bsfl) {
   1764   DriverStr(Repeatrr(&x86_64::X86_64Assembler::bsfl, "bsfl %{reg2}, %{reg1}"), "bsfl");
   1765 }
   1766 
   1767 TEST_F(AssemblerX86_64Test, BsflAddress) {
   1768   DriverStr(RepeatrA(&x86_64::X86_64Assembler::bsfl, "bsfl {mem}, %{reg}"), "bsfl_address");
   1769 }
   1770 
   1771 TEST_F(AssemblerX86_64Test, Bsfq) {
   1772   DriverStr(RepeatRR(&x86_64::X86_64Assembler::bsfq, "bsfq %{reg2}, %{reg1}"), "bsfq");
   1773 }
   1774 
   1775 TEST_F(AssemblerX86_64Test, BsfqAddress) {
   1776   DriverStr(RepeatRA(&x86_64::X86_64Assembler::bsfq, "bsfq {mem}, %{reg}"), "bsfq_address");
   1777 }
   1778 
   1779 TEST_F(AssemblerX86_64Test, Bsrl) {
   1780   DriverStr(Repeatrr(&x86_64::X86_64Assembler::bsrl, "bsrl %{reg2}, %{reg1}"), "bsrl");
   1781 }
   1782 
   1783 TEST_F(AssemblerX86_64Test, BsrlAddress) {
   1784   DriverStr(RepeatrA(&x86_64::X86_64Assembler::bsrl, "bsrl {mem}, %{reg}"), "bsrl_address");
   1785 }
   1786 
   1787 TEST_F(AssemblerX86_64Test, Bsrq) {
   1788   DriverStr(RepeatRR(&x86_64::X86_64Assembler::bsrq, "bsrq %{reg2}, %{reg1}"), "bsrq");
   1789 }
   1790 
   1791 TEST_F(AssemblerX86_64Test, BsrqAddress) {
   1792   DriverStr(RepeatRA(&x86_64::X86_64Assembler::bsrq, "bsrq {mem}, %{reg}"), "bsrq_address");
   1793 }
   1794 
   1795 TEST_F(AssemblerX86_64Test, Popcntl) {
   1796   DriverStr(Repeatrr(&x86_64::X86_64Assembler::popcntl, "popcntl %{reg2}, %{reg1}"), "popcntl");
   1797 }
   1798 
   1799 TEST_F(AssemblerX86_64Test, PopcntlAddress) {
   1800   DriverStr(RepeatrA(&x86_64::X86_64Assembler::popcntl, "popcntl {mem}, %{reg}"), "popcntl_address");
   1801 }
   1802 
   1803 TEST_F(AssemblerX86_64Test, Popcntq) {
   1804   DriverStr(RepeatRR(&x86_64::X86_64Assembler::popcntq, "popcntq %{reg2}, %{reg1}"), "popcntq");
   1805 }
   1806 
   1807 TEST_F(AssemblerX86_64Test, PopcntqAddress) {
   1808   DriverStr(RepeatRA(&x86_64::X86_64Assembler::popcntq, "popcntq {mem}, %{reg}"), "popcntq_address");
   1809 }
   1810 
   1811 TEST_F(AssemblerX86_64Test, CmovlAddress) {
   1812   GetAssembler()->cmov(x86_64::kEqual, x86_64::CpuRegister(x86_64::R10), x86_64::Address(
   1813       x86_64::CpuRegister(x86_64::RDI), x86_64::CpuRegister(x86_64::RBX), x86_64::TIMES_4, 12), false);
   1814   GetAssembler()->cmov(x86_64::kNotEqual, x86_64::CpuRegister(x86_64::RDI), x86_64::Address(
   1815       x86_64::CpuRegister(x86_64::R10), x86_64::CpuRegister(x86_64::RBX), x86_64::TIMES_4, 12), false);
   1816   GetAssembler()->cmov(x86_64::kEqual, x86_64::CpuRegister(x86_64::RDI), x86_64::Address(
   1817       x86_64::CpuRegister(x86_64::RDI), x86_64::CpuRegister(x86_64::R9), x86_64::TIMES_4, 12), false);
   1818   const char* expected =
   1819     "cmovzl 0xc(%RDI,%RBX,4), %R10d\n"
   1820     "cmovnzl 0xc(%R10,%RBX,4), %edi\n"
   1821     "cmovzl 0xc(%RDI,%R9,4), %edi\n";
   1822   DriverStr(expected, "cmovl_address");
   1823 }
   1824 
   1825 TEST_F(AssemblerX86_64Test, CmovqAddress) {
   1826   GetAssembler()->cmov(x86_64::kEqual, x86_64::CpuRegister(x86_64::R10), x86_64::Address(
   1827       x86_64::CpuRegister(x86_64::RDI), x86_64::CpuRegister(x86_64::RBX), x86_64::TIMES_4, 12), true);
   1828   GetAssembler()->cmov(x86_64::kNotEqual, x86_64::CpuRegister(x86_64::RDI), x86_64::Address(
   1829       x86_64::CpuRegister(x86_64::R10), x86_64::CpuRegister(x86_64::RBX), x86_64::TIMES_4, 12), true);
   1830   GetAssembler()->cmov(x86_64::kEqual, x86_64::CpuRegister(x86_64::RDI), x86_64::Address(
   1831       x86_64::CpuRegister(x86_64::RDI), x86_64::CpuRegister(x86_64::R9), x86_64::TIMES_4, 12), true);
   1832   const char* expected =
   1833     "cmovzq 0xc(%RDI,%RBX,4), %R10\n"
   1834     "cmovnzq 0xc(%R10,%RBX,4), %rdi\n"
   1835     "cmovzq 0xc(%RDI,%R9,4), %rdi\n";
   1836   DriverStr(expected, "cmovq_address");
   1837 }
   1838 
   1839 TEST_F(AssemblerX86_64Test, Jrcxz) {
   1840   x86_64::NearLabel target;
   1841   GetAssembler()->jrcxz(&target);
   1842   GetAssembler()->addl(x86_64::CpuRegister(x86_64::RDI),
   1843                        x86_64::Address(x86_64::CpuRegister(x86_64::RSP), 4));
   1844   GetAssembler()->Bind(&target);
   1845   const char* expected =
   1846     "jrcxz 1f\n"
   1847     "addl 4(%RSP),%EDI\n"
   1848     "1:\n";
   1849 
   1850   DriverStr(expected, "jrcxz");
   1851 }
   1852 
   1853 TEST_F(AssemblerX86_64Test, NearLabel) {
   1854   // Test both forward and backward branches.
   1855   x86_64::NearLabel start, target;
   1856   GetAssembler()->Bind(&start);
   1857   GetAssembler()->j(x86_64::kEqual, &target);
   1858   GetAssembler()->jmp(&target);
   1859   GetAssembler()->jrcxz(&target);
   1860   GetAssembler()->addl(x86_64::CpuRegister(x86_64::RDI),
   1861                        x86_64::Address(x86_64::CpuRegister(x86_64::RSP), 4));
   1862   GetAssembler()->Bind(&target);
   1863   GetAssembler()->j(x86_64::kNotEqual, &start);
   1864   GetAssembler()->jmp(&start);
   1865   const char* expected =
   1866     "1: je 2f\n"
   1867     "jmp 2f\n"
   1868     "jrcxz 2f\n"
   1869     "addl 4(%RSP),%EDI\n"
   1870     "2: jne 1b\n"
   1871     "jmp 1b\n";
   1872 
   1873   DriverStr(expected, "near_label");
   1874 }
   1875 
   1876 std::string setcc_test_fn(AssemblerX86_64Test::Base* assembler_test,
   1877                           x86_64::X86_64Assembler* assembler) {
   1878   // From Condition
   1879   /*
   1880   kOverflow     =  0,
   1881   kNoOverflow   =  1,
   1882   kBelow        =  2,
   1883   kAboveEqual   =  3,
   1884   kEqual        =  4,
   1885   kNotEqual     =  5,
   1886   kBelowEqual   =  6,
   1887   kAbove        =  7,
   1888   kSign         =  8,
   1889   kNotSign      =  9,
   1890   kParityEven   = 10,
   1891   kParityOdd    = 11,
   1892   kLess         = 12,
   1893   kGreaterEqual = 13,
   1894   kLessEqual    = 14,
   1895   */
   1896   std::string suffixes[15] = { "o", "no", "b", "ae", "e", "ne", "be", "a", "s", "ns", "pe", "po",
   1897                                "l", "ge", "le" };
   1898 
   1899   std::vector<x86_64::CpuRegister*> registers = assembler_test->GetRegisters();
   1900   std::ostringstream str;
   1901 
   1902   for (auto reg : registers) {
   1903     for (size_t i = 0; i < 15; ++i) {
   1904       assembler->setcc(static_cast<x86_64::Condition>(i), *reg);
   1905       str << "set" << suffixes[i] << " %" << assembler_test->GetQuaternaryRegisterName(*reg) << "\n";
   1906     }
   1907   }
   1908 
   1909   return str.str();
   1910 }
   1911 
   1912 TEST_F(AssemblerX86_64Test, SetCC) {
   1913   DriverFn(&setcc_test_fn, "setcc");
   1914 }
   1915 
   1916 TEST_F(AssemblerX86_64Test, MovzxbRegs) {
   1917   DriverStr(Repeatrb(&x86_64::X86_64Assembler::movzxb, "movzbl %{reg2}, %{reg1}"), "movzxb");
   1918 }
   1919 
   1920 TEST_F(AssemblerX86_64Test, MovsxbRegs) {
   1921   DriverStr(Repeatrb(&x86_64::X86_64Assembler::movsxb, "movsbl %{reg2}, %{reg1}"), "movsxb");
   1922 }
   1923 
   1924 TEST_F(AssemblerX86_64Test, Repnescasw) {
   1925   GetAssembler()->repne_scasw();
   1926   const char* expected = "repne scasw\n";
   1927   DriverStr(expected, "Repnescasw");
   1928 }
   1929 
   1930 TEST_F(AssemblerX86_64Test, Repecmpsw) {
   1931   GetAssembler()->repe_cmpsw();
   1932   const char* expected = "repe cmpsw\n";
   1933   DriverStr(expected, "Repecmpsw");
   1934 }
   1935 
   1936 TEST_F(AssemblerX86_64Test, Repecmpsl) {
   1937   GetAssembler()->repe_cmpsl();
   1938   const char* expected = "repe cmpsl\n";
   1939   DriverStr(expected, "Repecmpsl");
   1940 }
   1941 
   1942 TEST_F(AssemblerX86_64Test, Repecmpsq) {
   1943   GetAssembler()->repe_cmpsq();
   1944   const char* expected = "repe cmpsq\n";
   1945   DriverStr(expected, "Repecmpsq");
   1946 }
   1947 
   1948 TEST_F(AssemblerX86_64Test, Cmpb) {
   1949   DriverStr(RepeatAI(&x86_64::X86_64Assembler::cmpb,
   1950                      /*imm_bytes*/ 1U,
   1951                      "cmpb ${imm}, {mem}"), "cmpb");
   1952 }
   1953 
   1954 TEST_F(AssemblerX86_64Test, TestbAddressImmediate) {
   1955   DriverStr(RepeatAI(&x86_64::X86_64Assembler::testb,
   1956                      /*imm_bytes*/ 1U,
   1957                      "testb ${imm}, {mem}"), "testbi");
   1958 }
   1959 
   1960 TEST_F(AssemblerX86_64Test, TestlAddressImmediate) {
   1961   DriverStr(RepeatAI(&x86_64::X86_64Assembler::testl,
   1962                      /*imm_bytes*/ 4U,
   1963                      "testl ${imm}, {mem}"), "testli");
   1964 }
   1965 
   1966 class JNIMacroAssemblerX86_64Test : public JNIMacroAssemblerTest<x86_64::X86_64JNIMacroAssembler> {
   1967  public:
   1968   using Base = JNIMacroAssemblerTest<x86_64::X86_64JNIMacroAssembler>;
   1969 
   1970  protected:
   1971   // Get the typically used name for this architecture, e.g., aarch64, x86-64, ...
   1972   std::string GetArchitectureString() OVERRIDE {
   1973     return "x86_64";
   1974   }
   1975 
   1976   std::string GetDisassembleParameters() OVERRIDE {
   1977     return " -D -bbinary -mi386:x86-64 -Mx86-64,addr64,data32 --no-show-raw-insn";
   1978   }
   1979 
   1980  private:
   1981 };
   1982 
   1983 static x86_64::X86_64ManagedRegister ManagedFromCpu(x86_64::Register r) {
   1984   return x86_64::X86_64ManagedRegister::FromCpuRegister(r);
   1985 }
   1986 
   1987 static x86_64::X86_64ManagedRegister ManagedFromFpu(x86_64::FloatRegister r) {
   1988   return x86_64::X86_64ManagedRegister::FromXmmRegister(r);
   1989 }
   1990 
   1991 std::string buildframe_test_fn(JNIMacroAssemblerX86_64Test::Base* assembler_test ATTRIBUTE_UNUSED,
   1992                                x86_64::X86_64JNIMacroAssembler* assembler) {
   1993   // TODO: more interesting spill registers / entry spills.
   1994 
   1995   // Two random spill regs.
   1996   const ManagedRegister raw_spill_regs[] = {
   1997       ManagedFromCpu(x86_64::R10),
   1998       ManagedFromCpu(x86_64::RSI)
   1999   };
   2000   ArrayRef<const ManagedRegister> spill_regs(raw_spill_regs);
   2001 
   2002   // Three random entry spills.
   2003   ManagedRegisterEntrySpills entry_spills;
   2004   ManagedRegisterSpill spill(ManagedFromCpu(x86_64::RAX), 8, 0);
   2005   entry_spills.push_back(spill);
   2006   ManagedRegisterSpill spill2(ManagedFromCpu(x86_64::RBX), 8, 8);
   2007   entry_spills.push_back(spill2);
   2008   ManagedRegisterSpill spill3(ManagedFromFpu(x86_64::XMM1), 8, 16);
   2009   entry_spills.push_back(spill3);
   2010 
   2011   x86_64::X86_64ManagedRegister method_reg = ManagedFromCpu(x86_64::RDI);
   2012 
   2013   size_t frame_size = 10 * kStackAlignment;
   2014   assembler->BuildFrame(frame_size, method_reg, spill_regs, entry_spills);
   2015 
   2016   // Construct assembly text counterpart.
   2017   std::ostringstream str;
   2018   // (1) Push the spill_regs.
   2019   str << "pushq %rsi\n";
   2020   str << "pushq %r10\n";
   2021   // (2) Move down the stack pointer.
   2022   ssize_t displacement = static_cast<ssize_t>(frame_size) - (spill_regs.size() * 8 + 8);
   2023   str << "subq $" << displacement << ", %rsp\n";
   2024   // (3) Store method reference.
   2025   str << "movq %rdi, (%rsp)\n";
   2026   // (4) Entry spills.
   2027   str << "movq %rax, " << frame_size + 0 << "(%rsp)\n";
   2028   str << "movq %rbx, " << frame_size + 8 << "(%rsp)\n";
   2029   str << "movsd %xmm1, " << frame_size + 16 << "(%rsp)\n";
   2030 
   2031   return str.str();
   2032 }
   2033 
   2034 TEST_F(JNIMacroAssemblerX86_64Test, BuildFrame) {
   2035   DriverFn(&buildframe_test_fn, "BuildFrame");
   2036 }
   2037 
   2038 std::string removeframe_test_fn(JNIMacroAssemblerX86_64Test::Base* assembler_test ATTRIBUTE_UNUSED,
   2039                                 x86_64::X86_64JNIMacroAssembler* assembler) {
   2040   // TODO: more interesting spill registers / entry spills.
   2041 
   2042   // Two random spill regs.
   2043   const ManagedRegister raw_spill_regs[] = {
   2044       ManagedFromCpu(x86_64::R10),
   2045       ManagedFromCpu(x86_64::RSI)
   2046   };
   2047   ArrayRef<const ManagedRegister> spill_regs(raw_spill_regs);
   2048 
   2049   size_t frame_size = 10 * kStackAlignment;
   2050   assembler->RemoveFrame(frame_size, spill_regs, /* may_suspend */ true);
   2051 
   2052   // Construct assembly text counterpart.
   2053   std::ostringstream str;
   2054   // (1) Move up the stack pointer.
   2055   ssize_t displacement = static_cast<ssize_t>(frame_size) - spill_regs.size() * 8 - 8;
   2056   str << "addq $" << displacement << ", %rsp\n";
   2057   // (2) Pop spill regs.
   2058   str << "popq %r10\n";
   2059   str << "popq %rsi\n";
   2060   str << "ret\n";
   2061 
   2062   return str.str();
   2063 }
   2064 
   2065 TEST_F(JNIMacroAssemblerX86_64Test, RemoveFrame) {
   2066   DriverFn(&removeframe_test_fn, "RemoveFrame");
   2067 }
   2068 
   2069 std::string increaseframe_test_fn(
   2070     JNIMacroAssemblerX86_64Test::Base* assembler_test ATTRIBUTE_UNUSED,
   2071     x86_64::X86_64JNIMacroAssembler* assembler) {
   2072   assembler->IncreaseFrameSize(0U);
   2073   assembler->IncreaseFrameSize(kStackAlignment);
   2074   assembler->IncreaseFrameSize(10 * kStackAlignment);
   2075 
   2076   // Construct assembly text counterpart.
   2077   std::ostringstream str;
   2078   str << "addq $0, %rsp\n";
   2079   str << "addq $-" << kStackAlignment << ", %rsp\n";
   2080   str << "addq $-" << 10 * kStackAlignment << ", %rsp\n";
   2081 
   2082   return str.str();
   2083 }
   2084 
   2085 TEST_F(JNIMacroAssemblerX86_64Test, IncreaseFrame) {
   2086   DriverFn(&increaseframe_test_fn, "IncreaseFrame");
   2087 }
   2088 
   2089 std::string decreaseframe_test_fn(
   2090     JNIMacroAssemblerX86_64Test::Base* assembler_test ATTRIBUTE_UNUSED,
   2091     x86_64::X86_64JNIMacroAssembler* assembler) {
   2092   assembler->DecreaseFrameSize(0U);
   2093   assembler->DecreaseFrameSize(kStackAlignment);
   2094   assembler->DecreaseFrameSize(10 * kStackAlignment);
   2095 
   2096   // Construct assembly text counterpart.
   2097   std::ostringstream str;
   2098   str << "addq $0, %rsp\n";
   2099   str << "addq $" << kStackAlignment << ", %rsp\n";
   2100   str << "addq $" << 10 * kStackAlignment << ", %rsp\n";
   2101 
   2102   return str.str();
   2103 }
   2104 
   2105 TEST_F(JNIMacroAssemblerX86_64Test, DecreaseFrame) {
   2106   DriverFn(&decreaseframe_test_fn, "DecreaseFrame");
   2107 }
   2108 
   2109 }  // namespace art
   2110