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(®isters_);
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