• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
TEST(AssemblerX86_64,CreateBuffer)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 
TEST(AssemblerX86_64,SignExtension)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 {
operator ()art::X86_64CpuRegisterCompare124     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, ...
GetArchitectureString()147   std::string GetArchitectureString() OVERRIDE {
148     return "x86_64";
149   }
150 
GetDisassembleParameters()151   std::string GetDisassembleParameters() OVERRIDE {
152     return " -D -bbinary -mi386:x86-64 -Mx86-64,addr64,data32 --no-show-raw-insn";
153   }
154 
SetUpHelpers()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 
TearDown()293   void TearDown() OVERRIDE {
294     AssemblerTest::TearDown();
295     STLDeleteElements(&registers_);
296     STLDeleteElements(&fp_registers_);
297   }
298 
GetAddresses()299   std::vector<x86_64::Address> GetAddresses() {
300     return addresses_;
301   }
302 
GetRegisters()303   std::vector<x86_64::CpuRegister*> GetRegisters() OVERRIDE {
304     return registers_;
305   }
306 
GetFPRegisters()307   std::vector<x86_64::XmmRegister*> GetFPRegisters() OVERRIDE {
308     return fp_registers_;
309   }
310 
CreateImmediate(int64_t imm_value)311   x86_64::Immediate CreateImmediate(int64_t imm_value) OVERRIDE {
312     return x86_64::Immediate(imm_value);
313   }
314 
GetSecondaryRegisterName(const x86_64::CpuRegister & reg)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 
GetTertiaryRegisterName(const x86_64::CpuRegister & reg)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 
GetQuaternaryRegisterName(const x86_64::CpuRegister & reg)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 
TEST_F(AssemblerX86_64Test,RepeatI4)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 
TEST_F(AssemblerX86_64Test,RepeatI8)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 
TEST_F(AssemblerX86_64Test,Repeatr)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 
TEST_F(AssemblerX86_64Test,RepeatrI)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 
TEST_F(AssemblerX86_64Test,Repeatrr)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 
TEST_F(AssemblerX86_64Test,Repeatrb)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 
TEST_F(AssemblerX86_64Test,RepeatrF)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 
TEST_F(AssemblerX86_64Test,RepeatR)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 
TEST_F(AssemblerX86_64Test,RepeatRI)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 
TEST_F(AssemblerX86_64Test,RepeatRr)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 
TEST_F(AssemblerX86_64Test,RepeatRR)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 
TEST_F(AssemblerX86_64Test,RepeatRF)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 
TEST_F(AssemblerX86_64Test,RepeatFF)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 
TEST_F(AssemblerX86_64Test,RepeatFFI)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 
TEST_F(AssemblerX86_64Test,RepeatA)439 TEST_F(AssemblerX86_64Test, RepeatA) {
440   EXPECT_EQ("-1(%rax,%rbx,1)\n", RepeatA(/*f*/ nullptr, addresses_singleton_, "{mem}"));
441 }
442 
TEST_F(AssemblerX86_64Test,RepeatAFull)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 
TEST_F(AssemblerX86_64Test,RepeatAI)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 
TEST_F(AssemblerX86_64Test,RepeatRA)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 
TEST_F(AssemblerX86_64Test,RepeatrA)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 
TEST_F(AssemblerX86_64Test,RepeatAR)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 
TEST_F(AssemblerX86_64Test,RepeatAr)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 
TEST_F(AssemblerX86_64Test,RepeatFA)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 
TEST_F(AssemblerX86_64Test,RepeatAF)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 
TEST_F(AssemblerX86_64Test,Toolchain)502 TEST_F(AssemblerX86_64Test, Toolchain) {
503   EXPECT_TRUE(CheckTools());
504 }
505 
TEST_F(AssemblerX86_64Test,PopqAllAddresses)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 
TEST_F(AssemblerX86_64Test,PushqRegs)536 TEST_F(AssemblerX86_64Test, PushqRegs) {
537   DriverStr(RepeatR(&x86_64::X86_64Assembler::pushq, "pushq %{reg}"), "pushq");
538 }
539 
TEST_F(AssemblerX86_64Test,PushqImm)540 TEST_F(AssemblerX86_64Test, PushqImm) {
541   DriverStr(RepeatI(&x86_64::X86_64Assembler::pushq, /*imm_bytes*/ 4U,
542                     "pushq ${imm}"), "pushqi");
543 }
544 
TEST_F(AssemblerX86_64Test,MovqRegs)545 TEST_F(AssemblerX86_64Test, MovqRegs) {
546   DriverStr(RepeatRR(&x86_64::X86_64Assembler::movq, "movq %{reg2}, %{reg1}"), "movq");
547 }
548 
TEST_F(AssemblerX86_64Test,MovqImm)549 TEST_F(AssemblerX86_64Test, MovqImm) {
550   DriverStr(RepeatRI(&x86_64::X86_64Assembler::movq, /*imm_bytes*/ 8U,
551                      "movq ${imm}, %{reg}"), "movqi");
552 }
553 
TEST_F(AssemblerX86_64Test,MovlRegs)554 TEST_F(AssemblerX86_64Test, MovlRegs) {
555   DriverStr(Repeatrr(&x86_64::X86_64Assembler::movl, "mov %{reg2}, %{reg1}"), "movl");
556 }
557 
TEST_F(AssemblerX86_64Test,MovlImm)558 TEST_F(AssemblerX86_64Test, MovlImm) {
559   DriverStr(RepeatrI(&x86_64::X86_64Assembler::movl, /*imm_bytes*/ 4U,
560                      "mov ${imm}, %{reg}"), "movli");
561 }
562 
TEST_F(AssemblerX86_64Test,AddqRegs)563 TEST_F(AssemblerX86_64Test, AddqRegs) {
564   DriverStr(RepeatRR(&x86_64::X86_64Assembler::addq, "addq %{reg2}, %{reg1}"), "addq");
565 }
566 
TEST_F(AssemblerX86_64Test,AddqImm)567 TEST_F(AssemblerX86_64Test, AddqImm) {
568   DriverStr(RepeatRI(&x86_64::X86_64Assembler::addq, /*imm_bytes*/ 4U,
569                      "addq ${imm}, %{reg}"), "addqi");
570 }
571 
TEST_F(AssemblerX86_64Test,AddlRegs)572 TEST_F(AssemblerX86_64Test, AddlRegs) {
573   DriverStr(Repeatrr(&x86_64::X86_64Assembler::addl, "add %{reg2}, %{reg1}"), "addl");
574 }
575 
TEST_F(AssemblerX86_64Test,AddlImm)576 TEST_F(AssemblerX86_64Test, AddlImm) {
577   DriverStr(RepeatrI(&x86_64::X86_64Assembler::addl, /*imm_bytes*/ 4U,
578                      "add ${imm}, %{reg}"), "addli");
579 }
580 
TEST_F(AssemblerX86_64Test,Addw)581 TEST_F(AssemblerX86_64Test, Addw) {
582   DriverStr(
583       RepeatAI(&x86_64::X86_64Assembler::addw, /*imm_bytes*/2U, "addw ${imm}, {mem}"), "addw");
584 }
585 
TEST_F(AssemblerX86_64Test,ImulqReg1)586 TEST_F(AssemblerX86_64Test, ImulqReg1) {
587   DriverStr(RepeatR(&x86_64::X86_64Assembler::imulq, "imulq %{reg}"), "imulq");
588 }
589 
TEST_F(AssemblerX86_64Test,ImulqRegs)590 TEST_F(AssemblerX86_64Test, ImulqRegs) {
591   DriverStr(RepeatRR(&x86_64::X86_64Assembler::imulq, "imulq %{reg2}, %{reg1}"), "imulq");
592 }
593 
TEST_F(AssemblerX86_64Test,ImulqImm)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 
TEST_F(AssemblerX86_64Test,ImullRegs)600 TEST_F(AssemblerX86_64Test, ImullRegs) {
601   DriverStr(Repeatrr(&x86_64::X86_64Assembler::imull, "imul %{reg2}, %{reg1}"), "imull");
602 }
603 
TEST_F(AssemblerX86_64Test,ImullImm)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 
TEST_F(AssemblerX86_64Test,Mull)610 TEST_F(AssemblerX86_64Test, Mull) {
611   DriverStr(Repeatr(&x86_64::X86_64Assembler::mull, "mull %{reg}"), "mull");
612 }
613 
TEST_F(AssemblerX86_64Test,SubqRegs)614 TEST_F(AssemblerX86_64Test, SubqRegs) {
615   DriverStr(RepeatRR(&x86_64::X86_64Assembler::subq, "subq %{reg2}, %{reg1}"), "subq");
616 }
617 
TEST_F(AssemblerX86_64Test,SubqImm)618 TEST_F(AssemblerX86_64Test, SubqImm) {
619   DriverStr(RepeatRI(&x86_64::X86_64Assembler::subq, /*imm_bytes*/ 4U,
620                      "subq ${imm}, %{reg}"), "subqi");
621 }
622 
TEST_F(AssemblerX86_64Test,SublRegs)623 TEST_F(AssemblerX86_64Test, SublRegs) {
624   DriverStr(Repeatrr(&x86_64::X86_64Assembler::subl, "sub %{reg2}, %{reg1}"), "subl");
625 }
626 
TEST_F(AssemblerX86_64Test,SublImm)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.
shll_fn(AssemblerX86_64Test::Base * assembler_test,x86_64::X86_64Assembler * assembler)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 
TEST_F(AssemblerX86_64Test,ShllReg)644 TEST_F(AssemblerX86_64Test, ShllReg) {
645   DriverFn(&shll_fn, "shll");
646 }
647 
TEST_F(AssemblerX86_64Test,ShllImm)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.
shlq_fn(AssemblerX86_64Test::Base * assembler_test,x86_64::X86_64Assembler * assembler)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 
TEST_F(AssemblerX86_64Test,ShlqReg)665 TEST_F(AssemblerX86_64Test, ShlqReg) {
666   DriverFn(&shlq_fn, "shlq");
667 }
668 
TEST_F(AssemblerX86_64Test,ShlqImm)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.
shrl_fn(AssemblerX86_64Test::Base * assembler_test,x86_64::X86_64Assembler * assembler)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 
TEST_F(AssemblerX86_64Test,ShrlReg)686 TEST_F(AssemblerX86_64Test, ShrlReg) {
687   DriverFn(&shrl_fn, "shrl");
688 }
689 
TEST_F(AssemblerX86_64Test,ShrlImm)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.
shrq_fn(AssemblerX86_64Test::Base * assembler_test,x86_64::X86_64Assembler * assembler)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 
TEST_F(AssemblerX86_64Test,ShrqReg)706 TEST_F(AssemblerX86_64Test, ShrqReg) {
707   DriverFn(&shrq_fn, "shrq");
708 }
709 
TEST_F(AssemblerX86_64Test,ShrqImm)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.
sarl_fn(AssemblerX86_64Test::Base * assembler_test,x86_64::X86_64Assembler * assembler)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 
TEST_F(AssemblerX86_64Test,SarlReg)726 TEST_F(AssemblerX86_64Test, SarlReg) {
727   DriverFn(&sarl_fn, "sarl");
728 }
729 
TEST_F(AssemblerX86_64Test,SarlImm)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.
sarq_fn(AssemblerX86_64Test::Base * assembler_test,x86_64::X86_64Assembler * assembler)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 
TEST_F(AssemblerX86_64Test,SarqReg)746 TEST_F(AssemblerX86_64Test, SarqReg) {
747   DriverFn(&sarq_fn, "sarq");
748 }
749 
TEST_F(AssemblerX86_64Test,SarqImm)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.
rorl_fn(AssemblerX86_64Test::Base * assembler_test,x86_64::X86_64Assembler * assembler)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 
TEST_F(AssemblerX86_64Test,RorlReg)766 TEST_F(AssemblerX86_64Test, RorlReg) {
767   DriverFn(&rorl_fn, "rorl");
768 }
769 
TEST_F(AssemblerX86_64Test,RorlImm)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.
roll_fn(AssemblerX86_64Test::Base * assembler_test,x86_64::X86_64Assembler * assembler)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 
TEST_F(AssemblerX86_64Test,RollReg)786 TEST_F(AssemblerX86_64Test, RollReg) {
787   DriverFn(&roll_fn, "roll");
788 }
789 
TEST_F(AssemblerX86_64Test,RollImm)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.
rorq_fn(AssemblerX86_64Test::Base * assembler_test,x86_64::X86_64Assembler * assembler)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 
TEST_F(AssemblerX86_64Test,RorqReg)806 TEST_F(AssemblerX86_64Test, RorqReg) {
807   DriverFn(&rorq_fn, "rorq");
808 }
809 
TEST_F(AssemblerX86_64Test,RorqImm)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.
rolq_fn(AssemblerX86_64Test::Base * assembler_test,x86_64::X86_64Assembler * assembler)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 
TEST_F(AssemblerX86_64Test,RolqReg)826 TEST_F(AssemblerX86_64Test, RolqReg) {
827   DriverFn(&rolq_fn, "rolq");
828 }
829 
TEST_F(AssemblerX86_64Test,RolqImm)830 TEST_F(AssemblerX86_64Test, RolqImm) {
831   DriverStr(RepeatRI(&x86_64::X86_64Assembler::rolq, /*imm_bytes*/ 1U, "rolq ${imm}, %{reg}"), "rolqi");
832 }
833 
TEST_F(AssemblerX86_64Test,CmpqRegs)834 TEST_F(AssemblerX86_64Test, CmpqRegs) {
835   DriverStr(RepeatRR(&x86_64::X86_64Assembler::cmpq, "cmpq %{reg2}, %{reg1}"), "cmpq");
836 }
837 
TEST_F(AssemblerX86_64Test,CmpqImm)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 
TEST_F(AssemblerX86_64Test,CmplRegs)844 TEST_F(AssemblerX86_64Test, CmplRegs) {
845   DriverStr(Repeatrr(&x86_64::X86_64Assembler::cmpl, "cmp %{reg2}, %{reg1}"), "cmpl");
846 }
847 
TEST_F(AssemblerX86_64Test,CmplImm)848 TEST_F(AssemblerX86_64Test, CmplImm) {
849   DriverStr(RepeatrI(&x86_64::X86_64Assembler::cmpl, /*imm_bytes*/ 4U, "cmpl ${imm}, %{reg}"), "cmpli");
850 }
851 
TEST_F(AssemblerX86_64Test,Testl)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 
TEST_F(AssemblerX86_64Test,Negq)858 TEST_F(AssemblerX86_64Test, Negq) {
859   DriverStr(RepeatR(&x86_64::X86_64Assembler::negq, "negq %{reg}"), "negq");
860 }
861 
TEST_F(AssemblerX86_64Test,Negl)862 TEST_F(AssemblerX86_64Test, Negl) {
863   DriverStr(Repeatr(&x86_64::X86_64Assembler::negl, "negl %{reg}"), "negl");
864 }
865 
TEST_F(AssemblerX86_64Test,Notq)866 TEST_F(AssemblerX86_64Test, Notq) {
867   DriverStr(RepeatR(&x86_64::X86_64Assembler::notq, "notq %{reg}"), "notq");
868 }
869 
TEST_F(AssemblerX86_64Test,Notl)870 TEST_F(AssemblerX86_64Test, Notl) {
871   DriverStr(Repeatr(&x86_64::X86_64Assembler::notl, "notl %{reg}"), "notl");
872 }
873 
TEST_F(AssemblerX86_64Test,AndqRegs)874 TEST_F(AssemblerX86_64Test, AndqRegs) {
875   DriverStr(RepeatRR(&x86_64::X86_64Assembler::andq, "andq %{reg2}, %{reg1}"), "andq");
876 }
877 
TEST_F(AssemblerX86_64Test,AndqImm)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 
TEST_F(AssemblerX86_64Test,AndlRegs)884 TEST_F(AssemblerX86_64Test, AndlRegs) {
885   DriverStr(Repeatrr(&x86_64::X86_64Assembler::andl, "andl %{reg2}, %{reg1}"), "andl");
886 }
887 
TEST_F(AssemblerX86_64Test,AndlImm)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 
TEST_F(AssemblerX86_64Test,OrqRegs)894 TEST_F(AssemblerX86_64Test, OrqRegs) {
895   DriverStr(RepeatRR(&x86_64::X86_64Assembler::orq, "orq %{reg2}, %{reg1}"), "orq");
896 }
897 
TEST_F(AssemblerX86_64Test,OrlRegs)898 TEST_F(AssemblerX86_64Test, OrlRegs) {
899   DriverStr(Repeatrr(&x86_64::X86_64Assembler::orl, "orl %{reg2}, %{reg1}"), "orl");
900 }
901 
TEST_F(AssemblerX86_64Test,OrlImm)902 TEST_F(AssemblerX86_64Test, OrlImm) {
903   DriverStr(RepeatrI(&x86_64::X86_64Assembler::orl,
904                      /*imm_bytes*/ 4U, "orl ${imm}, %{reg}"), "orli");
905 }
906 
TEST_F(AssemblerX86_64Test,XorqRegs)907 TEST_F(AssemblerX86_64Test, XorqRegs) {
908   DriverStr(RepeatRR(&x86_64::X86_64Assembler::xorq, "xorq %{reg2}, %{reg1}"), "xorq");
909 }
910 
TEST_F(AssemblerX86_64Test,XorqImm)911 TEST_F(AssemblerX86_64Test, XorqImm) {
912   DriverStr(RepeatRI(&x86_64::X86_64Assembler::xorq,
913                      /*imm_bytes*/ 4U, "xorq ${imm}, %{reg}"), "xorqi");
914 }
915 
TEST_F(AssemblerX86_64Test,XorlRegs)916 TEST_F(AssemblerX86_64Test, XorlRegs) {
917   DriverStr(Repeatrr(&x86_64::X86_64Assembler::xorl, "xor %{reg2}, %{reg1}"), "xorl");
918 }
919 
TEST_F(AssemblerX86_64Test,XorlImm)920 TEST_F(AssemblerX86_64Test, XorlImm) {
921   DriverStr(RepeatrI(&x86_64::X86_64Assembler::xorl,
922                      /*imm_bytes*/ 4U, "xor ${imm}, %{reg}"), "xorli");
923 }
924 
TEST_F(AssemblerX86_64Test,Xchgq)925 TEST_F(AssemblerX86_64Test, Xchgq) {
926   DriverStr(RepeatRR(&x86_64::X86_64Assembler::xchgq, "xchgq %{reg2}, %{reg1}"), "xchgq");
927 }
928 
TEST_F(AssemblerX86_64Test,Xchgl)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 
TEST_F(AssemblerX86_64Test,LockCmpxchgl)935 TEST_F(AssemblerX86_64Test, LockCmpxchgl) {
936   DriverStr(RepeatAr(&x86_64::X86_64Assembler::LockCmpxchgl,
937                      "lock cmpxchgl %{reg}, {mem}"), "lock_cmpxchgl");
938 }
939 
TEST_F(AssemblerX86_64Test,LockCmpxchgq)940 TEST_F(AssemblerX86_64Test, LockCmpxchgq) {
941   DriverStr(RepeatAR(&x86_64::X86_64Assembler::LockCmpxchgq,
942                      "lock cmpxchg %{reg}, {mem}"), "lock_cmpxchg");
943 }
944 
TEST_F(AssemblerX86_64Test,MovqStore)945 TEST_F(AssemblerX86_64Test, MovqStore) {
946   DriverStr(RepeatAR(&x86_64::X86_64Assembler::movq, "movq %{reg}, {mem}"), "movq_s");
947 }
948 
TEST_F(AssemblerX86_64Test,MovqLoad)949 TEST_F(AssemblerX86_64Test, MovqLoad) {
950   DriverStr(RepeatRA(&x86_64::X86_64Assembler::movq, "movq {mem}, %{reg}"), "movq_l");
951 }
952 
TEST_F(AssemblerX86_64Test,MovlStore)953 TEST_F(AssemblerX86_64Test, MovlStore) {
954   DriverStr(RepeatAr(&x86_64::X86_64Assembler::movl, "movl %{reg}, {mem}"), "movl_s");
955 }
956 
TEST_F(AssemblerX86_64Test,MovlLoad)957 TEST_F(AssemblerX86_64Test, MovlLoad) {
958   DriverStr(RepeatrA(&x86_64::X86_64Assembler::movl, "movl {mem}, %{reg}"), "movl_l");
959 }
960 
TEST_F(AssemblerX86_64Test,MovwStore)961 TEST_F(AssemblerX86_64Test, MovwStore) {
962   DriverStr(RepeatAw(&x86_64::X86_64Assembler::movw, "movw %{reg}, {mem}"), "movw_s");
963 }
964 
TEST_F(AssemblerX86_64Test,MovbStore)965 TEST_F(AssemblerX86_64Test, MovbStore) {
966   DriverStr(RepeatAb(&x86_64::X86_64Assembler::movb, "movb %{reg}, {mem}"), "movb_s");
967 }
968 
TEST_F(AssemblerX86_64Test,Cmpw)969 TEST_F(AssemblerX86_64Test, Cmpw) {
970   DriverStr(
971       RepeatAI(&x86_64::X86_64Assembler::cmpw, /*imm_bytes*/ 2U, "cmpw ${imm}, {mem}"), "cmpw");
972 }
973 
TEST_F(AssemblerX86_64Test,MovqAddrImm)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 
TEST_F(AssemblerX86_64Test,MovlAddrImm)980 TEST_F(AssemblerX86_64Test, MovlAddrImm) {
981   DriverStr(RepeatAI(&x86_64::X86_64Assembler::movl,
982                      /*imm_bytes*/ 4U, "movl ${imm}, {mem}"), "movl");
983 }
984 
TEST_F(AssemblerX86_64Test,MovwAddrImm)985 TEST_F(AssemblerX86_64Test, MovwAddrImm) {
986   DriverStr(RepeatAI(&x86_64::X86_64Assembler::movw,
987                      /*imm_bytes*/ 2U, "movw ${imm}, {mem}"), "movw");
988 }
989 
TEST_F(AssemblerX86_64Test,MovbAddrImm)990 TEST_F(AssemblerX86_64Test, MovbAddrImm) {
991   DriverStr(RepeatAI(&x86_64::X86_64Assembler::movb,
992                      /*imm_bytes*/ 1U, "movb ${imm}, {mem}"), "movb");
993 }
994 
TEST_F(AssemblerX86_64Test,Movntl)995 TEST_F(AssemblerX86_64Test, Movntl) {
996   DriverStr(RepeatAr(&x86_64::X86_64Assembler::movntl, "movntil %{reg}, {mem}"), "movntl");
997 }
998 
TEST_F(AssemblerX86_64Test,Movntq)999 TEST_F(AssemblerX86_64Test, Movntq) {
1000   DriverStr(RepeatAR(&x86_64::X86_64Assembler::movntq, "movntiq %{reg}, {mem}"), "movntq");
1001 }
1002 
TEST_F(AssemblerX86_64Test,Cvtsi2ssAddr)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 
TEST_F(AssemblerX86_64Test,Cvtsi2sdAddr)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 
TEST_F(AssemblerX86_64Test,CmpqAddr)1027 TEST_F(AssemblerX86_64Test, CmpqAddr) {
1028   DriverStr(RepeatRA(&x86_64::X86_64Assembler::cmpq, "cmpq {mem}, %{reg}"), "cmpq");
1029 }
1030 
TEST_F(AssemblerX86_64Test,MovsxdAddr)1031 TEST_F(AssemblerX86_64Test, MovsxdAddr) {
1032   DriverStr(RepeatRA(&x86_64::X86_64Assembler::movsxd, "movslq {mem}, %{reg}"), "movsxd");
1033 }
1034 
TEST_F(AssemblerX86_64Test,TestqAddr)1035 TEST_F(AssemblerX86_64Test, TestqAddr) {
1036   DriverStr(RepeatRA(&x86_64::X86_64Assembler::testq, "testq {mem}, %{reg}"), "testq");
1037 }
1038 
TEST_F(AssemblerX86_64Test,AddqAddr)1039 TEST_F(AssemblerX86_64Test, AddqAddr) {
1040   DriverStr(RepeatRA(&x86_64::X86_64Assembler::addq, "addq {mem}, %{reg}"), "addq");
1041 }
1042 
TEST_F(AssemblerX86_64Test,SubqAddr)1043 TEST_F(AssemblerX86_64Test, SubqAddr) {
1044   DriverStr(RepeatRA(&x86_64::X86_64Assembler::subq, "subq {mem}, %{reg}"), "subq");
1045 }
1046 
TEST_F(AssemblerX86_64Test,Cvtss2sdAddr)1047 TEST_F(AssemblerX86_64Test, Cvtss2sdAddr) {
1048   DriverStr(RepeatFA(&x86_64::X86_64Assembler::cvtss2sd, "cvtss2sd {mem}, %{reg}"), "cvtss2sd");
1049 }
1050 
TEST_F(AssemblerX86_64Test,Cvtsd2ssAddr)1051 TEST_F(AssemblerX86_64Test, Cvtsd2ssAddr) {
1052   DriverStr(RepeatFA(&x86_64::X86_64Assembler::cvtsd2ss, "cvtsd2ss {mem}, %{reg}"), "cvtsd2ss");
1053 }
1054 
TEST_F(AssemblerX86_64Test,ComissAddr)1055 TEST_F(AssemblerX86_64Test, ComissAddr) {
1056   DriverStr(RepeatFA(&x86_64::X86_64Assembler::comiss, "comiss {mem}, %{reg}"), "comiss");
1057 }
1058 
TEST_F(AssemblerX86_64Test,ComisdAddr)1059 TEST_F(AssemblerX86_64Test, ComisdAddr) {
1060   DriverStr(RepeatFA(&x86_64::X86_64Assembler::comisd, "comisd {mem}, %{reg}"), "comisd");
1061 }
1062 
TEST_F(AssemblerX86_64Test,UComissAddr)1063 TEST_F(AssemblerX86_64Test, UComissAddr) {
1064   DriverStr(RepeatFA(&x86_64::X86_64Assembler::ucomiss, "ucomiss {mem}, %{reg}"), "ucomiss");
1065 }
1066 
TEST_F(AssemblerX86_64Test,UComisdAddr)1067 TEST_F(AssemblerX86_64Test, UComisdAddr) {
1068   DriverStr(RepeatFA(&x86_64::X86_64Assembler::ucomisd, "ucomisd {mem}, %{reg}"), "ucomisd");
1069 }
1070 
TEST_F(AssemblerX86_64Test,Andq)1071 TEST_F(AssemblerX86_64Test, Andq) {
1072   DriverStr(RepeatRA(&x86_64::X86_64Assembler::andq, "andq {mem}, %{reg}"), "andq");
1073 }
1074 
TEST_F(AssemblerX86_64Test,Orq)1075 TEST_F(AssemblerX86_64Test, Orq) {
1076   DriverStr(RepeatRA(&x86_64::X86_64Assembler::orq, "orq {mem}, %{reg}"), "orq");
1077 }
1078 
TEST_F(AssemblerX86_64Test,Xorq)1079 TEST_F(AssemblerX86_64Test, Xorq) {
1080   DriverStr(RepeatRA(&x86_64::X86_64Assembler::xorq, "xorq {mem}, %{reg}"), "xorq");
1081 }
1082 
TEST_F(AssemblerX86_64Test,RepneScasb)1083 TEST_F(AssemblerX86_64Test, RepneScasb) {
1084   GetAssembler()->repne_scasb();
1085   const char* expected = "repne scasb\n";
1086   DriverStr(expected, "repne_scasb");
1087 }
1088 
TEST_F(AssemblerX86_64Test,RepneScasw)1089 TEST_F(AssemblerX86_64Test, RepneScasw) {
1090   GetAssembler()->repne_scasw();
1091   const char* expected = "repne scasw\n";
1092   DriverStr(expected, "repne_scasw");
1093 }
1094 
TEST_F(AssemblerX86_64Test,RepMovsw)1095 TEST_F(AssemblerX86_64Test, RepMovsw) {
1096   GetAssembler()->rep_movsw();
1097   const char* expected = "rep movsw\n";
1098   DriverStr(expected, "rep_movsw");
1099 }
1100 
TEST_F(AssemblerX86_64Test,Movsxd)1101 TEST_F(AssemblerX86_64Test, Movsxd) {
1102   DriverStr(RepeatRr(&x86_64::X86_64Assembler::movsxd, "movsxd %{reg2}, %{reg1}"), "movsxd");
1103 }
1104 
TEST_F(AssemblerX86_64Test,Movaps)1105 TEST_F(AssemblerX86_64Test, Movaps) {
1106   DriverStr(RepeatFF(&x86_64::X86_64Assembler::movaps, "movaps %{reg2}, %{reg1}"), "movaps");
1107 }
1108 
TEST_F(AssemblerX86_64Test,MovapsStore)1109 TEST_F(AssemblerX86_64Test, MovapsStore) {
1110   DriverStr(RepeatAF(&x86_64::X86_64Assembler::movaps, "movaps %{reg}, {mem}"), "movaps_s");
1111 }
1112 
TEST_F(AssemblerX86_64Test,MovapsLoad)1113 TEST_F(AssemblerX86_64Test, MovapsLoad) {
1114   DriverStr(RepeatFA(&x86_64::X86_64Assembler::movaps, "movaps {mem}, %{reg}"), "movaps_l");
1115 }
1116 
TEST_F(AssemblerX86_64Test,MovupsStore)1117 TEST_F(AssemblerX86_64Test, MovupsStore) {
1118   DriverStr(RepeatAF(&x86_64::X86_64Assembler::movups, "movups %{reg}, {mem}"), "movups_s");
1119 }
1120 
TEST_F(AssemblerX86_64Test,MovupsLoad)1121 TEST_F(AssemblerX86_64Test, MovupsLoad) {
1122   DriverStr(RepeatFA(&x86_64::X86_64Assembler::movups, "movups {mem}, %{reg}"), "movups_l");
1123 }
1124 
TEST_F(AssemblerX86_64Test,Movss)1125 TEST_F(AssemblerX86_64Test, Movss) {
1126   DriverStr(RepeatFF(&x86_64::X86_64Assembler::movss, "movss %{reg2}, %{reg1}"), "movss");
1127 }
1128 
TEST_F(AssemblerX86_64Test,Movapd)1129 TEST_F(AssemblerX86_64Test, Movapd) {
1130   DriverStr(RepeatFF(&x86_64::X86_64Assembler::movapd, "movapd %{reg2}, %{reg1}"), "movapd");
1131 }
1132 
TEST_F(AssemblerX86_64Test,MovapdStore)1133 TEST_F(AssemblerX86_64Test, MovapdStore) {
1134   DriverStr(RepeatAF(&x86_64::X86_64Assembler::movapd, "movapd %{reg}, {mem}"), "movapd_s");
1135 }
1136 
TEST_F(AssemblerX86_64Test,MovapdLoad)1137 TEST_F(AssemblerX86_64Test, MovapdLoad) {
1138   DriverStr(RepeatFA(&x86_64::X86_64Assembler::movapd, "movapd {mem}, %{reg}"), "movapd_l");
1139 }
1140 
TEST_F(AssemblerX86_64Test,MovupdStore)1141 TEST_F(AssemblerX86_64Test, MovupdStore) {
1142   DriverStr(RepeatAF(&x86_64::X86_64Assembler::movupd, "movupd %{reg}, {mem}"), "movupd_s");
1143 }
1144 
TEST_F(AssemblerX86_64Test,MovupdLoad)1145 TEST_F(AssemblerX86_64Test, MovupdLoad) {
1146   DriverStr(RepeatFA(&x86_64::X86_64Assembler::movupd, "movupd {mem}, %{reg}"), "movupd_l");
1147 }
1148 
TEST_F(AssemblerX86_64Test,Movsd)1149 TEST_F(AssemblerX86_64Test, Movsd) {
1150   DriverStr(RepeatFF(&x86_64::X86_64Assembler::movsd, "movsd %{reg2}, %{reg1}"), "movsd");
1151 }
1152 
TEST_F(AssemblerX86_64Test,Movdqa)1153 TEST_F(AssemblerX86_64Test, Movdqa) {
1154   DriverStr(RepeatFF(&x86_64::X86_64Assembler::movdqa, "movdqa %{reg2}, %{reg1}"), "movdqa");
1155 }
1156 
TEST_F(AssemblerX86_64Test,MovdqaStore)1157 TEST_F(AssemblerX86_64Test, MovdqaStore) {
1158   DriverStr(RepeatAF(&x86_64::X86_64Assembler::movdqa, "movdqa %{reg}, {mem}"), "movdqa_s");
1159 }
1160 
TEST_F(AssemblerX86_64Test,MovdqaLoad)1161 TEST_F(AssemblerX86_64Test, MovdqaLoad) {
1162   DriverStr(RepeatFA(&x86_64::X86_64Assembler::movdqa, "movdqa {mem}, %{reg}"), "movdqa_l");
1163 }
1164 
TEST_F(AssemblerX86_64Test,MovdquStore)1165 TEST_F(AssemblerX86_64Test, MovdquStore) {
1166   DriverStr(RepeatAF(&x86_64::X86_64Assembler::movdqu, "movdqu %{reg}, {mem}"), "movdqu_s");
1167 }
1168 
TEST_F(AssemblerX86_64Test,MovdquLoad)1169 TEST_F(AssemblerX86_64Test, MovdquLoad) {
1170   DriverStr(RepeatFA(&x86_64::X86_64Assembler::movdqu, "movdqu {mem}, %{reg}"), "movdqu_l");
1171 }
1172 
TEST_F(AssemblerX86_64Test,Movd1)1173 TEST_F(AssemblerX86_64Test, Movd1) {
1174   DriverStr(RepeatFR(&x86_64::X86_64Assembler::movd, "movd %{reg2}, %{reg1}"), "movd.1");
1175 }
1176 
TEST_F(AssemblerX86_64Test,Movd2)1177 TEST_F(AssemblerX86_64Test, Movd2) {
1178   DriverStr(RepeatRF(&x86_64::X86_64Assembler::movd, "movd %{reg2}, %{reg1}"), "movd.2");
1179 }
1180 
TEST_F(AssemblerX86_64Test,Addss)1181 TEST_F(AssemblerX86_64Test, Addss) {
1182   DriverStr(RepeatFF(&x86_64::X86_64Assembler::addss, "addss %{reg2}, %{reg1}"), "addss");
1183 }
1184 
TEST_F(AssemblerX86_64Test,Addsd)1185 TEST_F(AssemblerX86_64Test, Addsd) {
1186   DriverStr(RepeatFF(&x86_64::X86_64Assembler::addsd, "addsd %{reg2}, %{reg1}"), "addsd");
1187 }
1188 
TEST_F(AssemblerX86_64Test,Addps)1189 TEST_F(AssemblerX86_64Test, Addps) {
1190   DriverStr(RepeatFF(&x86_64::X86_64Assembler::addps, "addps %{reg2}, %{reg1}"), "addps");
1191 }
1192 
TEST_F(AssemblerX86_64Test,Addpd)1193 TEST_F(AssemblerX86_64Test, Addpd) {
1194   DriverStr(RepeatFF(&x86_64::X86_64Assembler::addpd, "addpd %{reg2}, %{reg1}"), "addpd");
1195 }
1196 
TEST_F(AssemblerX86_64Test,Subss)1197 TEST_F(AssemblerX86_64Test, Subss) {
1198   DriverStr(RepeatFF(&x86_64::X86_64Assembler::subss, "subss %{reg2}, %{reg1}"), "subss");
1199 }
1200 
TEST_F(AssemblerX86_64Test,Subsd)1201 TEST_F(AssemblerX86_64Test, Subsd) {
1202   DriverStr(RepeatFF(&x86_64::X86_64Assembler::subsd, "subsd %{reg2}, %{reg1}"), "subsd");
1203 }
1204 
TEST_F(AssemblerX86_64Test,Subps)1205 TEST_F(AssemblerX86_64Test, Subps) {
1206   DriverStr(RepeatFF(&x86_64::X86_64Assembler::subps, "subps %{reg2}, %{reg1}"), "subps");
1207 }
1208 
TEST_F(AssemblerX86_64Test,Subpd)1209 TEST_F(AssemblerX86_64Test, Subpd) {
1210   DriverStr(RepeatFF(&x86_64::X86_64Assembler::subpd, "subpd %{reg2}, %{reg1}"), "subpd");
1211 }
1212 
TEST_F(AssemblerX86_64Test,Mulss)1213 TEST_F(AssemblerX86_64Test, Mulss) {
1214   DriverStr(RepeatFF(&x86_64::X86_64Assembler::mulss, "mulss %{reg2}, %{reg1}"), "mulss");
1215 }
1216 
TEST_F(AssemblerX86_64Test,Mulsd)1217 TEST_F(AssemblerX86_64Test, Mulsd) {
1218   DriverStr(RepeatFF(&x86_64::X86_64Assembler::mulsd, "mulsd %{reg2}, %{reg1}"), "mulsd");
1219 }
1220 
TEST_F(AssemblerX86_64Test,Mulps)1221 TEST_F(AssemblerX86_64Test, Mulps) {
1222   DriverStr(RepeatFF(&x86_64::X86_64Assembler::mulps, "mulps %{reg2}, %{reg1}"), "mulps");
1223 }
1224 
TEST_F(AssemblerX86_64Test,Mulpd)1225 TEST_F(AssemblerX86_64Test, Mulpd) {
1226   DriverStr(RepeatFF(&x86_64::X86_64Assembler::mulpd, "mulpd %{reg2}, %{reg1}"), "mulpd");
1227 }
1228 
TEST_F(AssemblerX86_64Test,Divss)1229 TEST_F(AssemblerX86_64Test, Divss) {
1230   DriverStr(RepeatFF(&x86_64::X86_64Assembler::divss, "divss %{reg2}, %{reg1}"), "divss");
1231 }
1232 
TEST_F(AssemblerX86_64Test,Divsd)1233 TEST_F(AssemblerX86_64Test, Divsd) {
1234   DriverStr(RepeatFF(&x86_64::X86_64Assembler::divsd, "divsd %{reg2}, %{reg1}"), "divsd");
1235 }
1236 
TEST_F(AssemblerX86_64Test,Divps)1237 TEST_F(AssemblerX86_64Test, Divps) {
1238   DriverStr(RepeatFF(&x86_64::X86_64Assembler::divps, "divps %{reg2}, %{reg1}"), "divps");
1239 }
1240 
TEST_F(AssemblerX86_64Test,Divpd)1241 TEST_F(AssemblerX86_64Test, Divpd) {
1242   DriverStr(RepeatFF(&x86_64::X86_64Assembler::divpd, "divpd %{reg2}, %{reg1}"), "divpd");
1243 }
1244 
TEST_F(AssemblerX86_64Test,Paddb)1245 TEST_F(AssemblerX86_64Test, Paddb) {
1246   DriverStr(RepeatFF(&x86_64::X86_64Assembler::paddb, "paddb %{reg2}, %{reg1}"), "paddb");
1247 }
1248 
TEST_F(AssemblerX86_64Test,Psubb)1249 TEST_F(AssemblerX86_64Test, Psubb) {
1250   DriverStr(RepeatFF(&x86_64::X86_64Assembler::psubb, "psubb %{reg2}, %{reg1}"), "psubb");
1251 }
1252 
TEST_F(AssemblerX86_64Test,Paddw)1253 TEST_F(AssemblerX86_64Test, Paddw) {
1254   DriverStr(RepeatFF(&x86_64::X86_64Assembler::paddw, "paddw %{reg2}, %{reg1}"), "paddw");
1255 }
1256 
TEST_F(AssemblerX86_64Test,Psubw)1257 TEST_F(AssemblerX86_64Test, Psubw) {
1258   DriverStr(RepeatFF(&x86_64::X86_64Assembler::psubw, "psubw %{reg2}, %{reg1}"), "psubw");
1259 }
1260 
TEST_F(AssemblerX86_64Test,Pmullw)1261 TEST_F(AssemblerX86_64Test, Pmullw) {
1262   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pmullw, "pmullw %{reg2}, %{reg1}"), "pmullw");
1263 }
1264 
TEST_F(AssemblerX86_64Test,Paddd)1265 TEST_F(AssemblerX86_64Test, Paddd) {
1266   DriverStr(RepeatFF(&x86_64::X86_64Assembler::paddd, "paddd %{reg2}, %{reg1}"), "paddd");
1267 }
1268 
TEST_F(AssemblerX86_64Test,Psubd)1269 TEST_F(AssemblerX86_64Test, Psubd) {
1270   DriverStr(RepeatFF(&x86_64::X86_64Assembler::psubd, "psubd %{reg2}, %{reg1}"), "psubd");
1271 }
1272 
TEST_F(AssemblerX86_64Test,Pmulld)1273 TEST_F(AssemblerX86_64Test, Pmulld) {
1274   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pmulld, "pmulld %{reg2}, %{reg1}"), "pmulld");
1275 }
1276 
TEST_F(AssemblerX86_64Test,Paddq)1277 TEST_F(AssemblerX86_64Test, Paddq) {
1278   DriverStr(RepeatFF(&x86_64::X86_64Assembler::paddq, "paddq %{reg2}, %{reg1}"), "paddq");
1279 }
1280 
TEST_F(AssemblerX86_64Test,Psubq)1281 TEST_F(AssemblerX86_64Test, Psubq) {
1282   DriverStr(RepeatFF(&x86_64::X86_64Assembler::psubq, "psubq %{reg2}, %{reg1}"), "psubq");
1283 }
1284 
TEST_F(AssemblerX86_64Test,Cvtsi2ss)1285 TEST_F(AssemblerX86_64Test, Cvtsi2ss) {
1286   DriverStr(RepeatFr(&x86_64::X86_64Assembler::cvtsi2ss, "cvtsi2ss %{reg2}, %{reg1}"), "cvtsi2ss");
1287 }
1288 
TEST_F(AssemblerX86_64Test,Cvtsi2sd)1289 TEST_F(AssemblerX86_64Test, Cvtsi2sd) {
1290   DriverStr(RepeatFr(&x86_64::X86_64Assembler::cvtsi2sd, "cvtsi2sd %{reg2}, %{reg1}"), "cvtsi2sd");
1291 }
1292 
TEST_F(AssemblerX86_64Test,Cvtss2si)1293 TEST_F(AssemblerX86_64Test, Cvtss2si) {
1294   DriverStr(RepeatrF(&x86_64::X86_64Assembler::cvtss2si, "cvtss2si %{reg2}, %{reg1}"), "cvtss2si");
1295 }
1296 
TEST_F(AssemblerX86_64Test,Cvtss2sd)1297 TEST_F(AssemblerX86_64Test, Cvtss2sd) {
1298   DriverStr(RepeatFF(&x86_64::X86_64Assembler::cvtss2sd, "cvtss2sd %{reg2}, %{reg1}"), "cvtss2sd");
1299 }
1300 
TEST_F(AssemblerX86_64Test,Cvtsd2si)1301 TEST_F(AssemblerX86_64Test, Cvtsd2si) {
1302   DriverStr(RepeatrF(&x86_64::X86_64Assembler::cvtsd2si, "cvtsd2si %{reg2}, %{reg1}"), "cvtsd2si");
1303 }
1304 
TEST_F(AssemblerX86_64Test,Cvttss2si)1305 TEST_F(AssemblerX86_64Test, Cvttss2si) {
1306   DriverStr(RepeatrF(&x86_64::X86_64Assembler::cvttss2si, "cvttss2si %{reg2}, %{reg1}"),
1307             "cvttss2si");
1308 }
1309 
TEST_F(AssemblerX86_64Test,Cvttsd2si)1310 TEST_F(AssemblerX86_64Test, Cvttsd2si) {
1311   DriverStr(RepeatrF(&x86_64::X86_64Assembler::cvttsd2si, "cvttsd2si %{reg2}, %{reg1}"),
1312             "cvttsd2si");
1313 }
1314 
TEST_F(AssemblerX86_64Test,Cvtsd2ss)1315 TEST_F(AssemblerX86_64Test, Cvtsd2ss) {
1316   DriverStr(RepeatFF(&x86_64::X86_64Assembler::cvtsd2ss, "cvtsd2ss %{reg2}, %{reg1}"), "cvtsd2ss");
1317 }
1318 
TEST_F(AssemblerX86_64Test,Cvtdq2ps)1319 TEST_F(AssemblerX86_64Test, Cvtdq2ps) {
1320   DriverStr(RepeatFF(&x86_64::X86_64Assembler::cvtdq2ps, "cvtdq2ps %{reg2}, %{reg1}"), "cvtdq2ps");
1321 }
1322 
TEST_F(AssemblerX86_64Test,Cvtdq2pd)1323 TEST_F(AssemblerX86_64Test, Cvtdq2pd) {
1324   DriverStr(RepeatFF(&x86_64::X86_64Assembler::cvtdq2pd, "cvtdq2pd %{reg2}, %{reg1}"), "cvtdq2pd");
1325 }
1326 
TEST_F(AssemblerX86_64Test,Comiss)1327 TEST_F(AssemblerX86_64Test, Comiss) {
1328   DriverStr(RepeatFF(&x86_64::X86_64Assembler::comiss, "comiss %{reg2}, %{reg1}"), "comiss");
1329 }
1330 
TEST_F(AssemblerX86_64Test,Comisd)1331 TEST_F(AssemblerX86_64Test, Comisd) {
1332   DriverStr(RepeatFF(&x86_64::X86_64Assembler::comisd, "comisd %{reg2}, %{reg1}"), "comisd");
1333 }
1334 
TEST_F(AssemblerX86_64Test,Ucomiss)1335 TEST_F(AssemblerX86_64Test, Ucomiss) {
1336   DriverStr(RepeatFF(&x86_64::X86_64Assembler::ucomiss, "ucomiss %{reg2}, %{reg1}"), "ucomiss");
1337 }
1338 
TEST_F(AssemblerX86_64Test,Ucomisd)1339 TEST_F(AssemblerX86_64Test, Ucomisd) {
1340   DriverStr(RepeatFF(&x86_64::X86_64Assembler::ucomisd, "ucomisd %{reg2}, %{reg1}"), "ucomisd");
1341 }
1342 
TEST_F(AssemblerX86_64Test,Sqrtss)1343 TEST_F(AssemblerX86_64Test, Sqrtss) {
1344   DriverStr(RepeatFF(&x86_64::X86_64Assembler::sqrtss, "sqrtss %{reg2}, %{reg1}"), "sqrtss");
1345 }
1346 
TEST_F(AssemblerX86_64Test,Sqrtsd)1347 TEST_F(AssemblerX86_64Test, Sqrtsd) {
1348   DriverStr(RepeatFF(&x86_64::X86_64Assembler::sqrtsd, "sqrtsd %{reg2}, %{reg1}"), "sqrtsd");
1349 }
1350 
TEST_F(AssemblerX86_64Test,Roundss)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 
TEST_F(AssemblerX86_64Test,Roundsd)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 
TEST_F(AssemblerX86_64Test,Xorps)1361 TEST_F(AssemblerX86_64Test, Xorps) {
1362   DriverStr(RepeatFF(&x86_64::X86_64Assembler::xorps, "xorps %{reg2}, %{reg1}"), "xorps");
1363 }
1364 
TEST_F(AssemblerX86_64Test,Xorpd)1365 TEST_F(AssemblerX86_64Test, Xorpd) {
1366   DriverStr(RepeatFF(&x86_64::X86_64Assembler::xorpd, "xorpd %{reg2}, %{reg1}"), "xorpd");
1367 }
1368 
TEST_F(AssemblerX86_64Test,Pxor)1369 TEST_F(AssemblerX86_64Test, Pxor) {
1370   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pxor, "pxor %{reg2}, %{reg1}"), "pxor");
1371 }
1372 
TEST_F(AssemblerX86_64Test,Andps)1373 TEST_F(AssemblerX86_64Test, Andps) {
1374   DriverStr(RepeatFF(&x86_64::X86_64Assembler::andps, "andps %{reg2}, %{reg1}"), "andps");
1375 }
1376 
TEST_F(AssemblerX86_64Test,Andpd)1377 TEST_F(AssemblerX86_64Test, Andpd) {
1378   DriverStr(RepeatFF(&x86_64::X86_64Assembler::andpd, "andpd %{reg2}, %{reg1}"), "andpd");
1379 }
1380 
TEST_F(AssemblerX86_64Test,Pand)1381 TEST_F(AssemblerX86_64Test, Pand) {
1382   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pand, "pand %{reg2}, %{reg1}"), "pand");
1383 }
1384 
TEST_F(AssemblerX86_64Test,andnpd)1385 TEST_F(AssemblerX86_64Test, andnpd) {
1386   DriverStr(RepeatFF(&x86_64::X86_64Assembler::andnpd, "andnpd %{reg2}, %{reg1}"), "andnpd");
1387 }
1388 
TEST_F(AssemblerX86_64Test,andnps)1389 TEST_F(AssemblerX86_64Test, andnps) {
1390   DriverStr(RepeatFF(&x86_64::X86_64Assembler::andnps, "andnps %{reg2}, %{reg1}"), "andnps");
1391 }
1392 
TEST_F(AssemblerX86_64Test,Pandn)1393 TEST_F(AssemblerX86_64Test, Pandn) {
1394   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pandn, "pandn %{reg2}, %{reg1}"), "pandn");
1395 }
1396 
TEST_F(AssemblerX86_64Test,Orps)1397 TEST_F(AssemblerX86_64Test, Orps) {
1398   DriverStr(RepeatFF(&x86_64::X86_64Assembler::orps, "orps %{reg2}, %{reg1}"), "orps");
1399 }
1400 
TEST_F(AssemblerX86_64Test,Orpd)1401 TEST_F(AssemblerX86_64Test, Orpd) {
1402   DriverStr(RepeatFF(&x86_64::X86_64Assembler::orpd, "orpd %{reg2}, %{reg1}"), "orpd");
1403 }
1404 
TEST_F(AssemblerX86_64Test,Por)1405 TEST_F(AssemblerX86_64Test, Por) {
1406   DriverStr(RepeatFF(&x86_64::X86_64Assembler::por, "por %{reg2}, %{reg1}"), "por");
1407 }
1408 
TEST_F(AssemblerX86_64Test,Pavgb)1409 TEST_F(AssemblerX86_64Test, Pavgb) {
1410   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pavgb, "pavgb %{reg2}, %{reg1}"), "pavgb");
1411 }
1412 
TEST_F(AssemblerX86_64Test,Pavgw)1413 TEST_F(AssemblerX86_64Test, Pavgw) {
1414   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pavgw, "pavgw %{reg2}, %{reg1}"), "pavgw");
1415 }
1416 
TEST_F(AssemblerX86_64Test,Psadbw)1417 TEST_F(AssemblerX86_64Test, Psadbw) {
1418   DriverStr(RepeatFF(&x86_64::X86_64Assembler::psadbw, "psadbw %{reg2}, %{reg1}"), "psadbw");
1419 }
1420 
TEST_F(AssemblerX86_64Test,Pmaddwd)1421 TEST_F(AssemblerX86_64Test, Pmaddwd) {
1422   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pmaddwd, "pmaddwd %{reg2}, %{reg1}"), "pmadwd");
1423 }
1424 
TEST_F(AssemblerX86_64Test,Phaddw)1425 TEST_F(AssemblerX86_64Test, Phaddw) {
1426   DriverStr(RepeatFF(&x86_64::X86_64Assembler::phaddw, "phaddw %{reg2}, %{reg1}"), "phaddw");
1427 }
1428 
TEST_F(AssemblerX86_64Test,Phaddd)1429 TEST_F(AssemblerX86_64Test, Phaddd) {
1430   DriverStr(RepeatFF(&x86_64::X86_64Assembler::phaddd, "phaddd %{reg2}, %{reg1}"), "phaddd");
1431 }
1432 
TEST_F(AssemblerX86_64Test,Haddps)1433 TEST_F(AssemblerX86_64Test, Haddps) {
1434   DriverStr(RepeatFF(&x86_64::X86_64Assembler::haddps, "haddps %{reg2}, %{reg1}"), "haddps");
1435 }
1436 
TEST_F(AssemblerX86_64Test,Haddpd)1437 TEST_F(AssemblerX86_64Test, Haddpd) {
1438   DriverStr(RepeatFF(&x86_64::X86_64Assembler::haddpd, "haddpd %{reg2}, %{reg1}"), "haddpd");
1439 }
1440 
TEST_F(AssemblerX86_64Test,Phsubw)1441 TEST_F(AssemblerX86_64Test, Phsubw) {
1442   DriverStr(RepeatFF(&x86_64::X86_64Assembler::phsubw, "phsubw %{reg2}, %{reg1}"), "phsubw");
1443 }
1444 
TEST_F(AssemblerX86_64Test,Phsubd)1445 TEST_F(AssemblerX86_64Test, Phsubd) {
1446   DriverStr(RepeatFF(&x86_64::X86_64Assembler::phsubd, "phsubd %{reg2}, %{reg1}"), "phsubd");
1447 }
1448 
TEST_F(AssemblerX86_64Test,Hsubps)1449 TEST_F(AssemblerX86_64Test, Hsubps) {
1450   DriverStr(RepeatFF(&x86_64::X86_64Assembler::hsubps, "hsubps %{reg2}, %{reg1}"), "hsubps");
1451 }
1452 
TEST_F(AssemblerX86_64Test,Hsubpd)1453 TEST_F(AssemblerX86_64Test, Hsubpd) {
1454   DriverStr(RepeatFF(&x86_64::X86_64Assembler::hsubpd, "hsubpd %{reg2}, %{reg1}"), "hsubpd");
1455 }
1456 
TEST_F(AssemblerX86_64Test,Pminsb)1457 TEST_F(AssemblerX86_64Test, Pminsb) {
1458   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pminsb, "pminsb %{reg2}, %{reg1}"), "pminsb");
1459 }
1460 
TEST_F(AssemblerX86_64Test,Pmaxsb)1461 TEST_F(AssemblerX86_64Test, Pmaxsb) {
1462   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pmaxsb, "pmaxsb %{reg2}, %{reg1}"), "pmaxsb");
1463 }
1464 
TEST_F(AssemblerX86_64Test,Pminsw)1465 TEST_F(AssemblerX86_64Test, Pminsw) {
1466   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pminsw, "pminsw %{reg2}, %{reg1}"), "pminsw");
1467 }
1468 
TEST_F(AssemblerX86_64Test,Pmaxsw)1469 TEST_F(AssemblerX86_64Test, Pmaxsw) {
1470   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pmaxsw, "pmaxsw %{reg2}, %{reg1}"), "pmaxsw");
1471 }
1472 
TEST_F(AssemblerX86_64Test,Pminsd)1473 TEST_F(AssemblerX86_64Test, Pminsd) {
1474   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pminsd, "pminsd %{reg2}, %{reg1}"), "pminsd");
1475 }
1476 
TEST_F(AssemblerX86_64Test,Pmaxsd)1477 TEST_F(AssemblerX86_64Test, Pmaxsd) {
1478   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pmaxsd, "pmaxsd %{reg2}, %{reg1}"), "pmaxsd");
1479 }
1480 
TEST_F(AssemblerX86_64Test,Pminub)1481 TEST_F(AssemblerX86_64Test, Pminub) {
1482   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pminub, "pminub %{reg2}, %{reg1}"), "pminub");
1483 }
1484 
TEST_F(AssemblerX86_64Test,Pmaxub)1485 TEST_F(AssemblerX86_64Test, Pmaxub) {
1486   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pmaxub, "pmaxub %{reg2}, %{reg1}"), "pmaxub");
1487 }
1488 
TEST_F(AssemblerX86_64Test,Pminuw)1489 TEST_F(AssemblerX86_64Test, Pminuw) {
1490   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pminuw, "pminuw %{reg2}, %{reg1}"), "pminuw");
1491 }
1492 
TEST_F(AssemblerX86_64Test,Pmaxuw)1493 TEST_F(AssemblerX86_64Test, Pmaxuw) {
1494   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pmaxuw, "pmaxuw %{reg2}, %{reg1}"), "pmaxuw");
1495 }
1496 
TEST_F(AssemblerX86_64Test,Pminud)1497 TEST_F(AssemblerX86_64Test, Pminud) {
1498   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pminud, "pminud %{reg2}, %{reg1}"), "pminud");
1499 }
1500 
TEST_F(AssemblerX86_64Test,Pmaxud)1501 TEST_F(AssemblerX86_64Test, Pmaxud) {
1502   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pmaxud, "pmaxud %{reg2}, %{reg1}"), "pmaxud");
1503 }
1504 
TEST_F(AssemblerX86_64Test,Minps)1505 TEST_F(AssemblerX86_64Test, Minps) {
1506   DriverStr(RepeatFF(&x86_64::X86_64Assembler::minps, "minps %{reg2}, %{reg1}"), "minps");
1507 }
1508 
TEST_F(AssemblerX86_64Test,Maxps)1509 TEST_F(AssemblerX86_64Test, Maxps) {
1510   DriverStr(RepeatFF(&x86_64::X86_64Assembler::maxps, "maxps %{reg2}, %{reg1}"), "maxps");
1511 }
1512 
TEST_F(AssemblerX86_64Test,Minpd)1513 TEST_F(AssemblerX86_64Test, Minpd) {
1514   DriverStr(RepeatFF(&x86_64::X86_64Assembler::minpd, "minpd %{reg2}, %{reg1}"), "minpd");
1515 }
1516 
TEST_F(AssemblerX86_64Test,Maxpd)1517 TEST_F(AssemblerX86_64Test, Maxpd) {
1518   DriverStr(RepeatFF(&x86_64::X86_64Assembler::maxpd, "maxpd %{reg2}, %{reg1}"), "maxpd");
1519 }
1520 
TEST_F(AssemblerX86_64Test,PCmpeqb)1521 TEST_F(AssemblerX86_64Test, PCmpeqb) {
1522   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpeqb, "pcmpeqb %{reg2}, %{reg1}"), "pcmpeqb");
1523 }
1524 
TEST_F(AssemblerX86_64Test,PCmpeqw)1525 TEST_F(AssemblerX86_64Test, PCmpeqw) {
1526   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpeqw, "pcmpeqw %{reg2}, %{reg1}"), "pcmpeqw");
1527 }
1528 
TEST_F(AssemblerX86_64Test,PCmpeqd)1529 TEST_F(AssemblerX86_64Test, PCmpeqd) {
1530   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpeqd, "pcmpeqd %{reg2}, %{reg1}"), "pcmpeqd");
1531 }
1532 
TEST_F(AssemblerX86_64Test,PCmpeqq)1533 TEST_F(AssemblerX86_64Test, PCmpeqq) {
1534   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpeqq, "pcmpeqq %{reg2}, %{reg1}"), "pcmpeqq");
1535 }
1536 
TEST_F(AssemblerX86_64Test,PCmpgtb)1537 TEST_F(AssemblerX86_64Test, PCmpgtb) {
1538   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpgtb, "pcmpgtb %{reg2}, %{reg1}"), "pcmpgtb");
1539 }
1540 
TEST_F(AssemblerX86_64Test,PCmpgtw)1541 TEST_F(AssemblerX86_64Test, PCmpgtw) {
1542   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpgtw, "pcmpgtw %{reg2}, %{reg1}"), "pcmpgtw");
1543 }
1544 
TEST_F(AssemblerX86_64Test,PCmpgtd)1545 TEST_F(AssemblerX86_64Test, PCmpgtd) {
1546   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpgtd, "pcmpgtd %{reg2}, %{reg1}"), "pcmpgtd");
1547 }
1548 
TEST_F(AssemblerX86_64Test,PCmpgtq)1549 TEST_F(AssemblerX86_64Test, PCmpgtq) {
1550   DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpgtq, "pcmpgtq %{reg2}, %{reg1}"), "pcmpgtq");
1551 }
1552 
TEST_F(AssemblerX86_64Test,Shufps)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 
TEST_F(AssemblerX86_64Test,Shufpd)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 
TEST_F(AssemblerX86_64Test,PShufd)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 
TEST_F(AssemblerX86_64Test,Punpcklbw)1568 TEST_F(AssemblerX86_64Test, Punpcklbw) {
1569   DriverStr(RepeatFF(&x86_64::X86_64Assembler::punpcklbw,
1570                      "punpcklbw %{reg2}, %{reg1}"), "punpcklbw");
1571 }
1572 
TEST_F(AssemblerX86_64Test,Punpcklwd)1573 TEST_F(AssemblerX86_64Test, Punpcklwd) {
1574   DriverStr(RepeatFF(&x86_64::X86_64Assembler::punpcklwd,
1575                      "punpcklwd %{reg2}, %{reg1}"), "punpcklwd");
1576 }
1577 
TEST_F(AssemblerX86_64Test,Punpckldq)1578 TEST_F(AssemblerX86_64Test, Punpckldq) {
1579   DriverStr(RepeatFF(&x86_64::X86_64Assembler::punpckldq,
1580                      "punpckldq %{reg2}, %{reg1}"), "punpckldq");
1581 }
1582 
TEST_F(AssemblerX86_64Test,Punpcklqdq)1583 TEST_F(AssemblerX86_64Test, Punpcklqdq) {
1584   DriverStr(RepeatFF(&x86_64::X86_64Assembler::punpcklqdq,
1585                      "punpcklqdq %{reg2}, %{reg1}"), "punpcklqdq");
1586 }
1587 
TEST_F(AssemblerX86_64Test,Punpckhbw)1588 TEST_F(AssemblerX86_64Test, Punpckhbw) {
1589   DriverStr(RepeatFF(&x86_64::X86_64Assembler::punpckhbw,
1590                      "punpckhbw %{reg2}, %{reg1}"), "punpckhbw");
1591 }
1592 
TEST_F(AssemblerX86_64Test,Punpckhwd)1593 TEST_F(AssemblerX86_64Test, Punpckhwd) {
1594   DriverStr(RepeatFF(&x86_64::X86_64Assembler::punpckhwd,
1595                      "punpckhwd %{reg2}, %{reg1}"), "punpckhwd");
1596 }
1597 
TEST_F(AssemblerX86_64Test,Punpckhdq)1598 TEST_F(AssemblerX86_64Test, Punpckhdq) {
1599   DriverStr(RepeatFF(&x86_64::X86_64Assembler::punpckhdq,
1600                      "punpckhdq %{reg2}, %{reg1}"), "punpckhdq");
1601 }
1602 
TEST_F(AssemblerX86_64Test,Punpckhqdq)1603 TEST_F(AssemblerX86_64Test, Punpckhqdq) {
1604   DriverStr(RepeatFF(&x86_64::X86_64Assembler::punpckhqdq,
1605                      "punpckhqdq %{reg2}, %{reg1}"), "punpckhqdq");
1606 }
1607 
TEST_F(AssemblerX86_64Test,Psllw)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 
TEST_F(AssemblerX86_64Test,Pslld)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 
TEST_F(AssemblerX86_64Test,Psllq)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 
TEST_F(AssemblerX86_64Test,Psraw)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 
TEST_F(AssemblerX86_64Test,Psrad)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 
TEST_F(AssemblerX86_64Test,Psrlw)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 
TEST_F(AssemblerX86_64Test,Psrld)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 
TEST_F(AssemblerX86_64Test,Psrlq)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 
TEST_F(AssemblerX86_64Test,Psrldq)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 
x87_fn(AssemblerX86_64Test::Base * assembler_test ATTRIBUTE_UNUSED,x86_64::X86_64Assembler * assembler)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 
TEST_F(AssemblerX86_64Test,X87)1690 TEST_F(AssemblerX86_64Test, X87) {
1691   DriverFn(&x87_fn, "x87");
1692 }
1693 
TEST_F(AssemblerX86_64Test,FPUIntegerLoads)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 
TEST_F(AssemblerX86_64Test,FPUIntegerLoadl)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 
TEST_F(AssemblerX86_64Test,FPUIntegerStores)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 
TEST_F(AssemblerX86_64Test,FPUIntegerStorel)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 
TEST_F(AssemblerX86_64Test,Call)1718 TEST_F(AssemblerX86_64Test, Call) {
1719   DriverStr(RepeatR(&x86_64::X86_64Assembler::call, "call *%{reg}"), "call");
1720 }
1721 
TEST_F(AssemblerX86_64Test,Jmp)1722 TEST_F(AssemblerX86_64Test, Jmp) {
1723   DriverStr(RepeatR(&x86_64::X86_64Assembler::jmp, "jmp *%{reg}"), "jmp");
1724 }
1725 
TEST_F(AssemblerX86_64Test,Enter)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 
TEST_F(AssemblerX86_64Test,RetImm)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 
ret_and_leave_fn(AssemblerX86_64Test::Base * assembler_test ATTRIBUTE_UNUSED,x86_64::X86_64Assembler * assembler)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 
TEST_F(AssemblerX86_64Test,RetAndLeave)1751 TEST_F(AssemblerX86_64Test, RetAndLeave) {
1752   DriverFn(&ret_and_leave_fn, "retleave");
1753 }
1754 
TEST_F(AssemblerX86_64Test,Bswapl)1755 TEST_F(AssemblerX86_64Test, Bswapl) {
1756   DriverStr(Repeatr(&x86_64::X86_64Assembler::bswapl, "bswap %{reg}"), "bswapl");
1757 }
1758 
TEST_F(AssemblerX86_64Test,Bswapq)1759 TEST_F(AssemblerX86_64Test, Bswapq) {
1760   DriverStr(RepeatR(&x86_64::X86_64Assembler::bswapq, "bswap %{reg}"), "bswapq");
1761 }
1762 
TEST_F(AssemblerX86_64Test,Bsfl)1763 TEST_F(AssemblerX86_64Test, Bsfl) {
1764   DriverStr(Repeatrr(&x86_64::X86_64Assembler::bsfl, "bsfl %{reg2}, %{reg1}"), "bsfl");
1765 }
1766 
TEST_F(AssemblerX86_64Test,BsflAddress)1767 TEST_F(AssemblerX86_64Test, BsflAddress) {
1768   DriverStr(RepeatrA(&x86_64::X86_64Assembler::bsfl, "bsfl {mem}, %{reg}"), "bsfl_address");
1769 }
1770 
TEST_F(AssemblerX86_64Test,Bsfq)1771 TEST_F(AssemblerX86_64Test, Bsfq) {
1772   DriverStr(RepeatRR(&x86_64::X86_64Assembler::bsfq, "bsfq %{reg2}, %{reg1}"), "bsfq");
1773 }
1774 
TEST_F(AssemblerX86_64Test,BsfqAddress)1775 TEST_F(AssemblerX86_64Test, BsfqAddress) {
1776   DriverStr(RepeatRA(&x86_64::X86_64Assembler::bsfq, "bsfq {mem}, %{reg}"), "bsfq_address");
1777 }
1778 
TEST_F(AssemblerX86_64Test,Bsrl)1779 TEST_F(AssemblerX86_64Test, Bsrl) {
1780   DriverStr(Repeatrr(&x86_64::X86_64Assembler::bsrl, "bsrl %{reg2}, %{reg1}"), "bsrl");
1781 }
1782 
TEST_F(AssemblerX86_64Test,BsrlAddress)1783 TEST_F(AssemblerX86_64Test, BsrlAddress) {
1784   DriverStr(RepeatrA(&x86_64::X86_64Assembler::bsrl, "bsrl {mem}, %{reg}"), "bsrl_address");
1785 }
1786 
TEST_F(AssemblerX86_64Test,Bsrq)1787 TEST_F(AssemblerX86_64Test, Bsrq) {
1788   DriverStr(RepeatRR(&x86_64::X86_64Assembler::bsrq, "bsrq %{reg2}, %{reg1}"), "bsrq");
1789 }
1790 
TEST_F(AssemblerX86_64Test,BsrqAddress)1791 TEST_F(AssemblerX86_64Test, BsrqAddress) {
1792   DriverStr(RepeatRA(&x86_64::X86_64Assembler::bsrq, "bsrq {mem}, %{reg}"), "bsrq_address");
1793 }
1794 
TEST_F(AssemblerX86_64Test,Popcntl)1795 TEST_F(AssemblerX86_64Test, Popcntl) {
1796   DriverStr(Repeatrr(&x86_64::X86_64Assembler::popcntl, "popcntl %{reg2}, %{reg1}"), "popcntl");
1797 }
1798 
TEST_F(AssemblerX86_64Test,PopcntlAddress)1799 TEST_F(AssemblerX86_64Test, PopcntlAddress) {
1800   DriverStr(RepeatrA(&x86_64::X86_64Assembler::popcntl, "popcntl {mem}, %{reg}"), "popcntl_address");
1801 }
1802 
TEST_F(AssemblerX86_64Test,Popcntq)1803 TEST_F(AssemblerX86_64Test, Popcntq) {
1804   DriverStr(RepeatRR(&x86_64::X86_64Assembler::popcntq, "popcntq %{reg2}, %{reg1}"), "popcntq");
1805 }
1806 
TEST_F(AssemblerX86_64Test,PopcntqAddress)1807 TEST_F(AssemblerX86_64Test, PopcntqAddress) {
1808   DriverStr(RepeatRA(&x86_64::X86_64Assembler::popcntq, "popcntq {mem}, %{reg}"), "popcntq_address");
1809 }
1810 
TEST_F(AssemblerX86_64Test,CmovlAddress)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 
TEST_F(AssemblerX86_64Test,CmovqAddress)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 
TEST_F(AssemblerX86_64Test,Jrcxz)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 
TEST_F(AssemblerX86_64Test,NearLabel)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 
setcc_test_fn(AssemblerX86_64Test::Base * assembler_test,x86_64::X86_64Assembler * assembler)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 
TEST_F(AssemblerX86_64Test,SetCC)1912 TEST_F(AssemblerX86_64Test, SetCC) {
1913   DriverFn(&setcc_test_fn, "setcc");
1914 }
1915 
TEST_F(AssemblerX86_64Test,MovzxbRegs)1916 TEST_F(AssemblerX86_64Test, MovzxbRegs) {
1917   DriverStr(Repeatrb(&x86_64::X86_64Assembler::movzxb, "movzbl %{reg2}, %{reg1}"), "movzxb");
1918 }
1919 
TEST_F(AssemblerX86_64Test,MovsxbRegs)1920 TEST_F(AssemblerX86_64Test, MovsxbRegs) {
1921   DriverStr(Repeatrb(&x86_64::X86_64Assembler::movsxb, "movsbl %{reg2}, %{reg1}"), "movsxb");
1922 }
1923 
TEST_F(AssemblerX86_64Test,Repnescasw)1924 TEST_F(AssemblerX86_64Test, Repnescasw) {
1925   GetAssembler()->repne_scasw();
1926   const char* expected = "repne scasw\n";
1927   DriverStr(expected, "Repnescasw");
1928 }
1929 
TEST_F(AssemblerX86_64Test,Repecmpsw)1930 TEST_F(AssemblerX86_64Test, Repecmpsw) {
1931   GetAssembler()->repe_cmpsw();
1932   const char* expected = "repe cmpsw\n";
1933   DriverStr(expected, "Repecmpsw");
1934 }
1935 
TEST_F(AssemblerX86_64Test,Repecmpsl)1936 TEST_F(AssemblerX86_64Test, Repecmpsl) {
1937   GetAssembler()->repe_cmpsl();
1938   const char* expected = "repe cmpsl\n";
1939   DriverStr(expected, "Repecmpsl");
1940 }
1941 
TEST_F(AssemblerX86_64Test,Repecmpsq)1942 TEST_F(AssemblerX86_64Test, Repecmpsq) {
1943   GetAssembler()->repe_cmpsq();
1944   const char* expected = "repe cmpsq\n";
1945   DriverStr(expected, "Repecmpsq");
1946 }
1947 
TEST_F(AssemblerX86_64Test,Cmpb)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 
TEST_F(AssemblerX86_64Test,TestbAddressImmediate)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 
TEST_F(AssemblerX86_64Test,TestlAddressImmediate)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, ...
GetArchitectureString()1972   std::string GetArchitectureString() OVERRIDE {
1973     return "x86_64";
1974   }
1975 
GetDisassembleParameters()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 
ManagedFromCpu(x86_64::Register r)1983 static x86_64::X86_64ManagedRegister ManagedFromCpu(x86_64::Register r) {
1984   return x86_64::X86_64ManagedRegister::FromCpuRegister(r);
1985 }
1986 
ManagedFromFpu(x86_64::FloatRegister r)1987 static x86_64::X86_64ManagedRegister ManagedFromFpu(x86_64::FloatRegister r) {
1988   return x86_64::X86_64ManagedRegister::FromXmmRegister(r);
1989 }
1990 
buildframe_test_fn(JNIMacroAssemblerX86_64Test::Base * assembler_test ATTRIBUTE_UNUSED,x86_64::X86_64JNIMacroAssembler * assembler)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 
TEST_F(JNIMacroAssemblerX86_64Test,BuildFrame)2034 TEST_F(JNIMacroAssemblerX86_64Test, BuildFrame) {
2035   DriverFn(&buildframe_test_fn, "BuildFrame");
2036 }
2037 
removeframe_test_fn(JNIMacroAssemblerX86_64Test::Base * assembler_test ATTRIBUTE_UNUSED,x86_64::X86_64JNIMacroAssembler * assembler)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 
TEST_F(JNIMacroAssemblerX86_64Test,RemoveFrame)2065 TEST_F(JNIMacroAssemblerX86_64Test, RemoveFrame) {
2066   DriverFn(&removeframe_test_fn, "RemoveFrame");
2067 }
2068 
increaseframe_test_fn(JNIMacroAssemblerX86_64Test::Base * assembler_test ATTRIBUTE_UNUSED,x86_64::X86_64JNIMacroAssembler * assembler)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 
TEST_F(JNIMacroAssemblerX86_64Test,IncreaseFrame)2085 TEST_F(JNIMacroAssemblerX86_64Test, IncreaseFrame) {
2086   DriverFn(&increaseframe_test_fn, "IncreaseFrame");
2087 }
2088 
decreaseframe_test_fn(JNIMacroAssemblerX86_64Test::Base * assembler_test ATTRIBUTE_UNUSED,x86_64::X86_64JNIMacroAssembler * assembler)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 
TEST_F(JNIMacroAssemblerX86_64Test,DecreaseFrame)2105 TEST_F(JNIMacroAssemblerX86_64Test, DecreaseFrame) {
2106   DriverFn(&decreaseframe_test_fn, "DecreaseFrame");
2107 }
2108 
2109 }  // namespace art
2110