blob: 74b8f068c1b8a8be7e7c9386f6b308073b32d874 [file] [log] [blame]
Chris Larsendbce0d72015-09-17 13:34:00 -07001/*
2 * Copyright (C) 2015 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_mips64.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 "utils/assembler_test.h"
26
Alexey Frunzea0e87b02015-09-24 22:57:20 -070027#define __ GetAssembler()->
28
Chris Larsendbce0d72015-09-17 13:34:00 -070029namespace art {
30
31struct MIPS64CpuRegisterCompare {
32 bool operator()(const mips64::GpuRegister& a, const mips64::GpuRegister& b) const {
33 return a < b;
34 }
35};
36
37class AssemblerMIPS64Test : public AssemblerTest<mips64::Mips64Assembler,
38 mips64::GpuRegister,
39 mips64::FpuRegister,
40 uint32_t> {
41 public:
42 typedef AssemblerTest<mips64::Mips64Assembler,
43 mips64::GpuRegister,
44 mips64::FpuRegister,
45 uint32_t> Base;
46
47 protected:
48 // Get the typically used name for this architecture, e.g., aarch64, x86-64, ...
49 std::string GetArchitectureString() OVERRIDE {
50 return "mips64";
51 }
52
Alexey Frunzea0e87b02015-09-24 22:57:20 -070053 std::string GetAssemblerCmdName() OVERRIDE {
54 // We assemble and link for MIPS64R6. See GetAssemblerParameters() for details.
55 return "gcc";
56 }
57
Chris Larsendbce0d72015-09-17 13:34:00 -070058 std::string GetAssemblerParameters() OVERRIDE {
Alexey Frunzea0e87b02015-09-24 22:57:20 -070059 // We assemble and link for MIPS64R6. The reason is that object files produced for MIPS64R6
60 // (and MIPS32R6) with the GNU assembler don't have correct final offsets in PC-relative
61 // branches in the .text section and so they require a relocation pass (there's a relocation
62 // section, .rela.text, that has the needed info to fix up the branches).
63 return " -march=mips64r6 -Wa,--no-warn -Wl,-Ttext=0 -Wl,-e0 -nostdlib";
64 }
65
66 void Pad(std::vector<uint8_t>& data) OVERRIDE {
67 // The GNU linker unconditionally pads the code segment with NOPs to a size that is a multiple
68 // of 16 and there doesn't appear to be a way to suppress this padding. Our assembler doesn't
69 // pad, so, in order for two assembler outputs to match, we need to match the padding as well.
70 // NOP is encoded as four zero bytes on MIPS.
71 size_t pad_size = RoundUp(data.size(), 16u) - data.size();
72 data.insert(data.end(), pad_size, 0);
Chris Larsendbce0d72015-09-17 13:34:00 -070073 }
74
75 std::string GetDisassembleParameters() OVERRIDE {
76 return " -D -bbinary -mmips:isa64r6";
77 }
78
79 void SetUpHelpers() OVERRIDE {
80 if (registers_.size() == 0) {
81 registers_.push_back(new mips64::GpuRegister(mips64::ZERO));
82 registers_.push_back(new mips64::GpuRegister(mips64::AT));
83 registers_.push_back(new mips64::GpuRegister(mips64::V0));
84 registers_.push_back(new mips64::GpuRegister(mips64::V1));
85 registers_.push_back(new mips64::GpuRegister(mips64::A0));
86 registers_.push_back(new mips64::GpuRegister(mips64::A1));
87 registers_.push_back(new mips64::GpuRegister(mips64::A2));
88 registers_.push_back(new mips64::GpuRegister(mips64::A3));
89 registers_.push_back(new mips64::GpuRegister(mips64::A4));
90 registers_.push_back(new mips64::GpuRegister(mips64::A5));
91 registers_.push_back(new mips64::GpuRegister(mips64::A6));
92 registers_.push_back(new mips64::GpuRegister(mips64::A7));
93 registers_.push_back(new mips64::GpuRegister(mips64::T0));
94 registers_.push_back(new mips64::GpuRegister(mips64::T1));
95 registers_.push_back(new mips64::GpuRegister(mips64::T2));
96 registers_.push_back(new mips64::GpuRegister(mips64::T3));
97 registers_.push_back(new mips64::GpuRegister(mips64::S0));
98 registers_.push_back(new mips64::GpuRegister(mips64::S1));
99 registers_.push_back(new mips64::GpuRegister(mips64::S2));
100 registers_.push_back(new mips64::GpuRegister(mips64::S3));
101 registers_.push_back(new mips64::GpuRegister(mips64::S4));
102 registers_.push_back(new mips64::GpuRegister(mips64::S5));
103 registers_.push_back(new mips64::GpuRegister(mips64::S6));
104 registers_.push_back(new mips64::GpuRegister(mips64::S7));
105 registers_.push_back(new mips64::GpuRegister(mips64::T8));
106 registers_.push_back(new mips64::GpuRegister(mips64::T9));
107 registers_.push_back(new mips64::GpuRegister(mips64::K0));
108 registers_.push_back(new mips64::GpuRegister(mips64::K1));
109 registers_.push_back(new mips64::GpuRegister(mips64::GP));
110 registers_.push_back(new mips64::GpuRegister(mips64::SP));
111 registers_.push_back(new mips64::GpuRegister(mips64::S8));
112 registers_.push_back(new mips64::GpuRegister(mips64::RA));
113
114 secondary_register_names_.emplace(mips64::GpuRegister(mips64::ZERO), "zero");
115 secondary_register_names_.emplace(mips64::GpuRegister(mips64::AT), "at");
116 secondary_register_names_.emplace(mips64::GpuRegister(mips64::V0), "v0");
117 secondary_register_names_.emplace(mips64::GpuRegister(mips64::V1), "v1");
118 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A0), "a0");
119 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A1), "a1");
120 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A2), "a2");
121 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A3), "a3");
122 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A4), "a4");
123 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A5), "a5");
124 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A6), "a6");
125 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A7), "a7");
126 secondary_register_names_.emplace(mips64::GpuRegister(mips64::T0), "t0");
127 secondary_register_names_.emplace(mips64::GpuRegister(mips64::T1), "t1");
128 secondary_register_names_.emplace(mips64::GpuRegister(mips64::T2), "t2");
129 secondary_register_names_.emplace(mips64::GpuRegister(mips64::T3), "t3");
130 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S0), "s0");
131 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S1), "s1");
132 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S2), "s2");
133 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S3), "s3");
134 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S4), "s4");
135 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S5), "s5");
136 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S6), "s6");
137 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S7), "s7");
138 secondary_register_names_.emplace(mips64::GpuRegister(mips64::T8), "t8");
139 secondary_register_names_.emplace(mips64::GpuRegister(mips64::T9), "t9");
140 secondary_register_names_.emplace(mips64::GpuRegister(mips64::K0), "k0");
141 secondary_register_names_.emplace(mips64::GpuRegister(mips64::K1), "k1");
142 secondary_register_names_.emplace(mips64::GpuRegister(mips64::GP), "gp");
143 secondary_register_names_.emplace(mips64::GpuRegister(mips64::SP), "sp");
144 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S8), "s8");
145 secondary_register_names_.emplace(mips64::GpuRegister(mips64::RA), "ra");
146
147 fp_registers_.push_back(new mips64::FpuRegister(mips64::F0));
148 fp_registers_.push_back(new mips64::FpuRegister(mips64::F1));
149 fp_registers_.push_back(new mips64::FpuRegister(mips64::F2));
150 fp_registers_.push_back(new mips64::FpuRegister(mips64::F3));
151 fp_registers_.push_back(new mips64::FpuRegister(mips64::F4));
152 fp_registers_.push_back(new mips64::FpuRegister(mips64::F5));
153 fp_registers_.push_back(new mips64::FpuRegister(mips64::F6));
154 fp_registers_.push_back(new mips64::FpuRegister(mips64::F7));
155 fp_registers_.push_back(new mips64::FpuRegister(mips64::F8));
156 fp_registers_.push_back(new mips64::FpuRegister(mips64::F9));
157 fp_registers_.push_back(new mips64::FpuRegister(mips64::F10));
158 fp_registers_.push_back(new mips64::FpuRegister(mips64::F11));
159 fp_registers_.push_back(new mips64::FpuRegister(mips64::F12));
160 fp_registers_.push_back(new mips64::FpuRegister(mips64::F13));
161 fp_registers_.push_back(new mips64::FpuRegister(mips64::F14));
162 fp_registers_.push_back(new mips64::FpuRegister(mips64::F15));
163 fp_registers_.push_back(new mips64::FpuRegister(mips64::F16));
164 fp_registers_.push_back(new mips64::FpuRegister(mips64::F17));
165 fp_registers_.push_back(new mips64::FpuRegister(mips64::F18));
166 fp_registers_.push_back(new mips64::FpuRegister(mips64::F19));
167 fp_registers_.push_back(new mips64::FpuRegister(mips64::F20));
168 fp_registers_.push_back(new mips64::FpuRegister(mips64::F21));
169 fp_registers_.push_back(new mips64::FpuRegister(mips64::F22));
170 fp_registers_.push_back(new mips64::FpuRegister(mips64::F23));
171 fp_registers_.push_back(new mips64::FpuRegister(mips64::F24));
172 fp_registers_.push_back(new mips64::FpuRegister(mips64::F25));
173 fp_registers_.push_back(new mips64::FpuRegister(mips64::F26));
174 fp_registers_.push_back(new mips64::FpuRegister(mips64::F27));
175 fp_registers_.push_back(new mips64::FpuRegister(mips64::F28));
176 fp_registers_.push_back(new mips64::FpuRegister(mips64::F29));
177 fp_registers_.push_back(new mips64::FpuRegister(mips64::F30));
178 fp_registers_.push_back(new mips64::FpuRegister(mips64::F31));
179 }
180 }
181
182 void TearDown() OVERRIDE {
183 AssemblerTest::TearDown();
184 STLDeleteElements(&registers_);
185 STLDeleteElements(&fp_registers_);
186 }
187
188 std::vector<mips64::GpuRegister*> GetRegisters() OVERRIDE {
189 return registers_;
190 }
191
192 std::vector<mips64::FpuRegister*> GetFPRegisters() OVERRIDE {
193 return fp_registers_;
194 }
195
196 uint32_t CreateImmediate(int64_t imm_value) OVERRIDE {
197 return imm_value;
198 }
199
200 std::string GetSecondaryRegisterName(const mips64::GpuRegister& reg) OVERRIDE {
201 CHECK(secondary_register_names_.find(reg) != secondary_register_names_.end());
202 return secondary_register_names_[reg];
203 }
204
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700205 std::string RepeatInsn(size_t count, const std::string& insn) {
206 std::string result;
207 for (; count != 0u; --count) {
208 result += insn;
209 }
210 return result;
211 }
212
213 void BranchCondOneRegHelper(void (mips64::Mips64Assembler::*f)(mips64::GpuRegister,
214 mips64::Mips64Label*),
Andreas Gampe2e965ac2016-11-03 17:24:15 -0700215 const std::string& instr_name) {
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700216 mips64::Mips64Label label;
217 (Base::GetAssembler()->*f)(mips64::A0, &label);
218 constexpr size_t kAdduCount1 = 63;
219 for (size_t i = 0; i != kAdduCount1; ++i) {
220 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
221 }
222 __ Bind(&label);
223 constexpr size_t kAdduCount2 = 64;
224 for (size_t i = 0; i != kAdduCount2; ++i) {
225 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
226 }
227 (Base::GetAssembler()->*f)(mips64::A1, &label);
228
229 std::string expected =
230 ".set noreorder\n" +
231 instr_name + " $a0, 1f\n"
232 "nop\n" +
233 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
234 "1:\n" +
235 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
236 instr_name + " $a1, 1b\n"
237 "nop\n";
238 DriverStr(expected, instr_name);
239 }
240
241 void BranchCondTwoRegsHelper(void (mips64::Mips64Assembler::*f)(mips64::GpuRegister,
242 mips64::GpuRegister,
243 mips64::Mips64Label*),
Andreas Gampe2e965ac2016-11-03 17:24:15 -0700244 const std::string& instr_name) {
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700245 mips64::Mips64Label label;
246 (Base::GetAssembler()->*f)(mips64::A0, mips64::A1, &label);
247 constexpr size_t kAdduCount1 = 63;
248 for (size_t i = 0; i != kAdduCount1; ++i) {
249 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
250 }
251 __ Bind(&label);
252 constexpr size_t kAdduCount2 = 64;
253 for (size_t i = 0; i != kAdduCount2; ++i) {
254 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
255 }
256 (Base::GetAssembler()->*f)(mips64::A2, mips64::A3, &label);
257
258 std::string expected =
259 ".set noreorder\n" +
260 instr_name + " $a0, $a1, 1f\n"
261 "nop\n" +
262 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
263 "1:\n" +
264 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
265 instr_name + " $a2, $a3, 1b\n"
266 "nop\n";
267 DriverStr(expected, instr_name);
268 }
269
Chris Larsendbce0d72015-09-17 13:34:00 -0700270 private:
271 std::vector<mips64::GpuRegister*> registers_;
272 std::map<mips64::GpuRegister, std::string, MIPS64CpuRegisterCompare> secondary_register_names_;
273
274 std::vector<mips64::FpuRegister*> fp_registers_;
275};
276
277
278TEST_F(AssemblerMIPS64Test, Toolchain) {
279 EXPECT_TRUE(CheckTools());
280}
281
Chris Larsendbce0d72015-09-17 13:34:00 -0700282///////////////////
283// FP Operations //
284///////////////////
285
Goran Jakovljevic95f27142017-01-20 11:11:11 +0100286TEST_F(AssemblerMIPS64Test, AddS) {
287 DriverStr(RepeatFFF(&mips64::Mips64Assembler::AddS, "add.s ${reg1}, ${reg2}, ${reg3}"), "add.s");
288}
289
290TEST_F(AssemblerMIPS64Test, AddD) {
291 DriverStr(RepeatFFF(&mips64::Mips64Assembler::AddD, "add.d ${reg1}, ${reg2}, ${reg3}"), "add.d");
292}
293
294TEST_F(AssemblerMIPS64Test, SubS) {
295 DriverStr(RepeatFFF(&mips64::Mips64Assembler::SubS, "sub.s ${reg1}, ${reg2}, ${reg3}"), "sub.s");
296}
297
298TEST_F(AssemblerMIPS64Test, SubD) {
299 DriverStr(RepeatFFF(&mips64::Mips64Assembler::SubD, "sub.d ${reg1}, ${reg2}, ${reg3}"), "sub.d");
300}
301
302TEST_F(AssemblerMIPS64Test, MulS) {
303 DriverStr(RepeatFFF(&mips64::Mips64Assembler::MulS, "mul.s ${reg1}, ${reg2}, ${reg3}"), "mul.s");
304}
305
306TEST_F(AssemblerMIPS64Test, MulD) {
307 DriverStr(RepeatFFF(&mips64::Mips64Assembler::MulD, "mul.d ${reg1}, ${reg2}, ${reg3}"), "mul.d");
308}
309
310TEST_F(AssemblerMIPS64Test, DivS) {
311 DriverStr(RepeatFFF(&mips64::Mips64Assembler::DivS, "div.s ${reg1}, ${reg2}, ${reg3}"), "div.s");
312}
313
314TEST_F(AssemblerMIPS64Test, DivD) {
315 DriverStr(RepeatFFF(&mips64::Mips64Assembler::DivD, "div.d ${reg1}, ${reg2}, ${reg3}"), "div.d");
316}
317
Chris Larsendbce0d72015-09-17 13:34:00 -0700318TEST_F(AssemblerMIPS64Test, SqrtS) {
319 DriverStr(RepeatFF(&mips64::Mips64Assembler::SqrtS, "sqrt.s ${reg1}, ${reg2}"), "sqrt.s");
320}
321
322TEST_F(AssemblerMIPS64Test, SqrtD) {
323 DriverStr(RepeatFF(&mips64::Mips64Assembler::SqrtD, "sqrt.d ${reg1}, ${reg2}"), "sqrt.d");
324}
325
326TEST_F(AssemblerMIPS64Test, AbsS) {
327 DriverStr(RepeatFF(&mips64::Mips64Assembler::AbsS, "abs.s ${reg1}, ${reg2}"), "abs.s");
328}
329
330TEST_F(AssemblerMIPS64Test, AbsD) {
331 DriverStr(RepeatFF(&mips64::Mips64Assembler::AbsD, "abs.d ${reg1}, ${reg2}"), "abs.d");
332}
333
Chris Larsen51417632015-10-02 13:24:25 -0700334TEST_F(AssemblerMIPS64Test, MovS) {
335 DriverStr(RepeatFF(&mips64::Mips64Assembler::MovS, "mov.s ${reg1}, ${reg2}"), "mov.s");
336}
337
338TEST_F(AssemblerMIPS64Test, MovD) {
339 DriverStr(RepeatFF(&mips64::Mips64Assembler::MovD, "mov.d ${reg1}, ${reg2}"), "mov.d");
340}
341
342TEST_F(AssemblerMIPS64Test, NegS) {
343 DriverStr(RepeatFF(&mips64::Mips64Assembler::NegS, "neg.s ${reg1}, ${reg2}"), "neg.s");
344}
345
346TEST_F(AssemblerMIPS64Test, NegD) {
347 DriverStr(RepeatFF(&mips64::Mips64Assembler::NegD, "neg.d ${reg1}, ${reg2}"), "neg.d");
348}
349
Chris Larsendbce0d72015-09-17 13:34:00 -0700350TEST_F(AssemblerMIPS64Test, RoundLS) {
351 DriverStr(RepeatFF(&mips64::Mips64Assembler::RoundLS, "round.l.s ${reg1}, ${reg2}"), "round.l.s");
352}
353
354TEST_F(AssemblerMIPS64Test, RoundLD) {
355 DriverStr(RepeatFF(&mips64::Mips64Assembler::RoundLD, "round.l.d ${reg1}, ${reg2}"), "round.l.d");
356}
357
358TEST_F(AssemblerMIPS64Test, RoundWS) {
359 DriverStr(RepeatFF(&mips64::Mips64Assembler::RoundWS, "round.w.s ${reg1}, ${reg2}"), "round.w.s");
360}
361
362TEST_F(AssemblerMIPS64Test, RoundWD) {
363 DriverStr(RepeatFF(&mips64::Mips64Assembler::RoundWD, "round.w.d ${reg1}, ${reg2}"), "round.w.d");
364}
365
366TEST_F(AssemblerMIPS64Test, CeilLS) {
367 DriverStr(RepeatFF(&mips64::Mips64Assembler::CeilLS, "ceil.l.s ${reg1}, ${reg2}"), "ceil.l.s");
368}
369
370TEST_F(AssemblerMIPS64Test, CeilLD) {
371 DriverStr(RepeatFF(&mips64::Mips64Assembler::CeilLD, "ceil.l.d ${reg1}, ${reg2}"), "ceil.l.d");
372}
373
374TEST_F(AssemblerMIPS64Test, CeilWS) {
375 DriverStr(RepeatFF(&mips64::Mips64Assembler::CeilWS, "ceil.w.s ${reg1}, ${reg2}"), "ceil.w.s");
376}
377
378TEST_F(AssemblerMIPS64Test, CeilWD) {
379 DriverStr(RepeatFF(&mips64::Mips64Assembler::CeilWD, "ceil.w.d ${reg1}, ${reg2}"), "ceil.w.d");
380}
381
382TEST_F(AssemblerMIPS64Test, FloorLS) {
383 DriverStr(RepeatFF(&mips64::Mips64Assembler::FloorLS, "floor.l.s ${reg1}, ${reg2}"), "floor.l.s");
384}
385
386TEST_F(AssemblerMIPS64Test, FloorLD) {
387 DriverStr(RepeatFF(&mips64::Mips64Assembler::FloorLD, "floor.l.d ${reg1}, ${reg2}"), "floor.l.d");
388}
389
390TEST_F(AssemblerMIPS64Test, FloorWS) {
391 DriverStr(RepeatFF(&mips64::Mips64Assembler::FloorWS, "floor.w.s ${reg1}, ${reg2}"), "floor.w.s");
392}
393
394TEST_F(AssemblerMIPS64Test, FloorWD) {
395 DriverStr(RepeatFF(&mips64::Mips64Assembler::FloorWD, "floor.w.d ${reg1}, ${reg2}"), "floor.w.d");
396}
397
398TEST_F(AssemblerMIPS64Test, SelS) {
399 DriverStr(RepeatFFF(&mips64::Mips64Assembler::SelS, "sel.s ${reg1}, ${reg2}, ${reg3}"), "sel.s");
400}
401
402TEST_F(AssemblerMIPS64Test, SelD) {
403 DriverStr(RepeatFFF(&mips64::Mips64Assembler::SelD, "sel.d ${reg1}, ${reg2}, ${reg3}"), "sel.d");
404}
405
406TEST_F(AssemblerMIPS64Test, RintS) {
407 DriverStr(RepeatFF(&mips64::Mips64Assembler::RintS, "rint.s ${reg1}, ${reg2}"), "rint.s");
408}
409
410TEST_F(AssemblerMIPS64Test, RintD) {
411 DriverStr(RepeatFF(&mips64::Mips64Assembler::RintD, "rint.d ${reg1}, ${reg2}"), "rint.d");
412}
413
414TEST_F(AssemblerMIPS64Test, ClassS) {
415 DriverStr(RepeatFF(&mips64::Mips64Assembler::ClassS, "class.s ${reg1}, ${reg2}"), "class.s");
416}
417
418TEST_F(AssemblerMIPS64Test, ClassD) {
419 DriverStr(RepeatFF(&mips64::Mips64Assembler::ClassD, "class.d ${reg1}, ${reg2}"), "class.d");
420}
421
422TEST_F(AssemblerMIPS64Test, MinS) {
423 DriverStr(RepeatFFF(&mips64::Mips64Assembler::MinS, "min.s ${reg1}, ${reg2}, ${reg3}"), "min.s");
424}
425
426TEST_F(AssemblerMIPS64Test, MinD) {
427 DriverStr(RepeatFFF(&mips64::Mips64Assembler::MinD, "min.d ${reg1}, ${reg2}, ${reg3}"), "min.d");
428}
429
430TEST_F(AssemblerMIPS64Test, MaxS) {
431 DriverStr(RepeatFFF(&mips64::Mips64Assembler::MaxS, "max.s ${reg1}, ${reg2}, ${reg3}"), "max.s");
432}
433
434TEST_F(AssemblerMIPS64Test, MaxD) {
435 DriverStr(RepeatFFF(&mips64::Mips64Assembler::MaxD, "max.d ${reg1}, ${reg2}, ${reg3}"), "max.d");
436}
437
Alexey Frunze299a9392015-12-08 16:08:02 -0800438TEST_F(AssemblerMIPS64Test, CmpUnS) {
439 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUnS, "cmp.un.s ${reg1}, ${reg2}, ${reg3}"),
440 "cmp.un.s");
441}
442
443TEST_F(AssemblerMIPS64Test, CmpEqS) {
444 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpEqS, "cmp.eq.s ${reg1}, ${reg2}, ${reg3}"),
445 "cmp.eq.s");
446}
447
448TEST_F(AssemblerMIPS64Test, CmpUeqS) {
449 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUeqS, "cmp.ueq.s ${reg1}, ${reg2}, ${reg3}"),
450 "cmp.ueq.s");
451}
452
453TEST_F(AssemblerMIPS64Test, CmpLtS) {
454 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpLtS, "cmp.lt.s ${reg1}, ${reg2}, ${reg3}"),
455 "cmp.lt.s");
456}
457
458TEST_F(AssemblerMIPS64Test, CmpUltS) {
459 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUltS, "cmp.ult.s ${reg1}, ${reg2}, ${reg3}"),
460 "cmp.ult.s");
461}
462
463TEST_F(AssemblerMIPS64Test, CmpLeS) {
464 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpLeS, "cmp.le.s ${reg1}, ${reg2}, ${reg3}"),
465 "cmp.le.s");
466}
467
468TEST_F(AssemblerMIPS64Test, CmpUleS) {
469 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUleS, "cmp.ule.s ${reg1}, ${reg2}, ${reg3}"),
470 "cmp.ule.s");
471}
472
473TEST_F(AssemblerMIPS64Test, CmpOrS) {
474 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpOrS, "cmp.or.s ${reg1}, ${reg2}, ${reg3}"),
475 "cmp.or.s");
476}
477
478TEST_F(AssemblerMIPS64Test, CmpUneS) {
479 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUneS, "cmp.une.s ${reg1}, ${reg2}, ${reg3}"),
480 "cmp.une.s");
481}
482
483TEST_F(AssemblerMIPS64Test, CmpNeS) {
484 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpNeS, "cmp.ne.s ${reg1}, ${reg2}, ${reg3}"),
485 "cmp.ne.s");
486}
487
488TEST_F(AssemblerMIPS64Test, CmpUnD) {
489 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUnD, "cmp.un.d ${reg1}, ${reg2}, ${reg3}"),
490 "cmp.un.d");
491}
492
493TEST_F(AssemblerMIPS64Test, CmpEqD) {
494 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpEqD, "cmp.eq.d ${reg1}, ${reg2}, ${reg3}"),
495 "cmp.eq.d");
496}
497
498TEST_F(AssemblerMIPS64Test, CmpUeqD) {
499 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUeqD, "cmp.ueq.d ${reg1}, ${reg2}, ${reg3}"),
500 "cmp.ueq.d");
501}
502
503TEST_F(AssemblerMIPS64Test, CmpLtD) {
504 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpLtD, "cmp.lt.d ${reg1}, ${reg2}, ${reg3}"),
505 "cmp.lt.d");
506}
507
508TEST_F(AssemblerMIPS64Test, CmpUltD) {
509 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUltD, "cmp.ult.d ${reg1}, ${reg2}, ${reg3}"),
510 "cmp.ult.d");
511}
512
513TEST_F(AssemblerMIPS64Test, CmpLeD) {
514 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpLeD, "cmp.le.d ${reg1}, ${reg2}, ${reg3}"),
515 "cmp.le.d");
516}
517
518TEST_F(AssemblerMIPS64Test, CmpUleD) {
519 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUleD, "cmp.ule.d ${reg1}, ${reg2}, ${reg3}"),
520 "cmp.ule.d");
521}
522
523TEST_F(AssemblerMIPS64Test, CmpOrD) {
524 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpOrD, "cmp.or.d ${reg1}, ${reg2}, ${reg3}"),
525 "cmp.or.d");
526}
527
528TEST_F(AssemblerMIPS64Test, CmpUneD) {
529 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUneD, "cmp.une.d ${reg1}, ${reg2}, ${reg3}"),
530 "cmp.une.d");
531}
532
533TEST_F(AssemblerMIPS64Test, CmpNeD) {
534 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpNeD, "cmp.ne.d ${reg1}, ${reg2}, ${reg3}"),
535 "cmp.ne.d");
536}
537
Chris Larsendbce0d72015-09-17 13:34:00 -0700538TEST_F(AssemblerMIPS64Test, CvtDL) {
539 DriverStr(RepeatFF(&mips64::Mips64Assembler::Cvtdl, "cvt.d.l ${reg1}, ${reg2}"), "cvt.d.l");
540}
541
Chris Larsen51417632015-10-02 13:24:25 -0700542TEST_F(AssemblerMIPS64Test, CvtDS) {
543 DriverStr(RepeatFF(&mips64::Mips64Assembler::Cvtds, "cvt.d.s ${reg1}, ${reg2}"), "cvt.d.s");
544}
545
546TEST_F(AssemblerMIPS64Test, CvtDW) {
547 DriverStr(RepeatFF(&mips64::Mips64Assembler::Cvtdw, "cvt.d.w ${reg1}, ${reg2}"), "cvt.d.w");
548}
549
550TEST_F(AssemblerMIPS64Test, CvtSL) {
551 DriverStr(RepeatFF(&mips64::Mips64Assembler::Cvtsl, "cvt.s.l ${reg1}, ${reg2}"), "cvt.s.l");
552}
553
554TEST_F(AssemblerMIPS64Test, CvtSD) {
555 DriverStr(RepeatFF(&mips64::Mips64Assembler::Cvtsd, "cvt.s.d ${reg1}, ${reg2}"), "cvt.s.d");
556}
557
558TEST_F(AssemblerMIPS64Test, CvtSW) {
559 DriverStr(RepeatFF(&mips64::Mips64Assembler::Cvtsw, "cvt.s.w ${reg1}, ${reg2}"), "cvt.s.w");
560}
561
Alexey Frunzebaf60b72015-12-22 15:15:03 -0800562TEST_F(AssemblerMIPS64Test, TruncWS) {
563 DriverStr(RepeatFF(&mips64::Mips64Assembler::TruncWS, "trunc.w.s ${reg1}, ${reg2}"), "trunc.w.s");
564}
565
566TEST_F(AssemblerMIPS64Test, TruncWD) {
567 DriverStr(RepeatFF(&mips64::Mips64Assembler::TruncWD, "trunc.w.d ${reg1}, ${reg2}"), "trunc.w.d");
568}
569
570TEST_F(AssemblerMIPS64Test, TruncLS) {
571 DriverStr(RepeatFF(&mips64::Mips64Assembler::TruncLS, "trunc.l.s ${reg1}, ${reg2}"), "trunc.l.s");
572}
573
574TEST_F(AssemblerMIPS64Test, TruncLD) {
575 DriverStr(RepeatFF(&mips64::Mips64Assembler::TruncLD, "trunc.l.d ${reg1}, ${reg2}"), "trunc.l.d");
576}
577
Lazar Trsicd9672662015-09-03 17:33:01 +0200578TEST_F(AssemblerMIPS64Test, Mfc1) {
579 DriverStr(RepeatRF(&mips64::Mips64Assembler::Mfc1, "mfc1 ${reg1}, ${reg2}"), "Mfc1");
580}
581
582TEST_F(AssemblerMIPS64Test, Mfhc1) {
583 DriverStr(RepeatRF(&mips64::Mips64Assembler::Mfhc1, "mfhc1 ${reg1}, ${reg2}"), "Mfhc1");
584}
585
586TEST_F(AssemblerMIPS64Test, Mtc1) {
587 DriverStr(RepeatRF(&mips64::Mips64Assembler::Mtc1, "mtc1 ${reg1}, ${reg2}"), "Mtc1");
588}
589
590TEST_F(AssemblerMIPS64Test, Mthc1) {
591 DriverStr(RepeatRF(&mips64::Mips64Assembler::Mthc1, "mthc1 ${reg1}, ${reg2}"), "Mthc1");
592}
593
594TEST_F(AssemblerMIPS64Test, Dmfc1) {
595 DriverStr(RepeatRF(&mips64::Mips64Assembler::Dmfc1, "dmfc1 ${reg1}, ${reg2}"), "Dmfc1");
596}
597
598TEST_F(AssemblerMIPS64Test, Dmtc1) {
599 DriverStr(RepeatRF(&mips64::Mips64Assembler::Dmtc1, "dmtc1 ${reg1}, ${reg2}"), "Dmtc1");
600}
601
Goran Jakovljevic95f27142017-01-20 11:11:11 +0100602TEST_F(AssemblerMIPS64Test, Lwc1) {
603 DriverStr(RepeatFRIb(&mips64::Mips64Assembler::Lwc1, -16, "lwc1 ${reg1}, {imm}(${reg2})"),
604 "lwc1");
605}
606
607TEST_F(AssemblerMIPS64Test, Ldc1) {
608 DriverStr(RepeatFRIb(&mips64::Mips64Assembler::Ldc1, -16, "ldc1 ${reg1}, {imm}(${reg2})"),
609 "ldc1");
610}
611
612TEST_F(AssemblerMIPS64Test, Swc1) {
613 DriverStr(RepeatFRIb(&mips64::Mips64Assembler::Swc1, -16, "swc1 ${reg1}, {imm}(${reg2})"),
614 "swc1");
615}
616
617TEST_F(AssemblerMIPS64Test, Sdc1) {
618 DriverStr(RepeatFRIb(&mips64::Mips64Assembler::Sdc1, -16, "sdc1 ${reg1}, {imm}(${reg2})"),
619 "sdc1");
620}
621
Chris Larsen51417632015-10-02 13:24:25 -0700622////////////////
623// CALL / JMP //
624////////////////
625
626TEST_F(AssemblerMIPS64Test, Jalr) {
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700627 DriverStr(".set noreorder\n" +
628 RepeatRRNoDupes(&mips64::Mips64Assembler::Jalr, "jalr ${reg1}, ${reg2}"), "jalr");
629}
630
Alexey Frunze19f6c692016-11-30 19:19:55 -0800631TEST_F(AssemblerMIPS64Test, Balc) {
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700632 mips64::Mips64Label label1, label2;
Alexey Frunze19f6c692016-11-30 19:19:55 -0800633 __ Balc(&label1);
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700634 constexpr size_t kAdduCount1 = 63;
635 for (size_t i = 0; i != kAdduCount1; ++i) {
636 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
637 }
638 __ Bind(&label1);
Alexey Frunze19f6c692016-11-30 19:19:55 -0800639 __ Balc(&label2);
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700640 constexpr size_t kAdduCount2 = 64;
641 for (size_t i = 0; i != kAdduCount2; ++i) {
642 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
643 }
644 __ Bind(&label2);
Alexey Frunze19f6c692016-11-30 19:19:55 -0800645 __ Balc(&label1);
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700646
647 std::string expected =
648 ".set noreorder\n"
Alexey Frunze19f6c692016-11-30 19:19:55 -0800649 "balc 1f\n" +
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700650 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
651 "1:\n"
Alexey Frunze19f6c692016-11-30 19:19:55 -0800652 "balc 2f\n" +
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700653 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
654 "2:\n"
Alexey Frunze19f6c692016-11-30 19:19:55 -0800655 "balc 1b\n";
656 DriverStr(expected, "Balc");
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700657}
658
Alexey Frunze19f6c692016-11-30 19:19:55 -0800659TEST_F(AssemblerMIPS64Test, LongBalc) {
Vladimir Marko36073942016-12-14 14:18:22 +0000660 constexpr uint32_t kNopCount1 = (1u << 25) + 1;
661 constexpr uint32_t kNopCount2 = (1u << 25) + 1;
662 constexpr uint32_t kRequiredCapacity = (kNopCount1 + kNopCount2 + 6u) * 4u;
663 ASSERT_LT(__ GetBuffer()->Capacity(), kRequiredCapacity);
664 __ GetBuffer()->ExtendCapacity(kRequiredCapacity);
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700665 mips64::Mips64Label label1, label2;
Alexey Frunze19f6c692016-11-30 19:19:55 -0800666 __ Balc(&label1);
Alexey Frunze19f6c692016-11-30 19:19:55 -0800667 for (uint32_t i = 0; i != kNopCount1; ++i) {
668 __ Nop();
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700669 }
670 __ Bind(&label1);
Alexey Frunze19f6c692016-11-30 19:19:55 -0800671 __ Balc(&label2);
Alexey Frunze19f6c692016-11-30 19:19:55 -0800672 for (uint32_t i = 0; i != kNopCount2; ++i) {
673 __ Nop();
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700674 }
675 __ Bind(&label2);
Alexey Frunze19f6c692016-11-30 19:19:55 -0800676 __ Balc(&label1);
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700677
Alexey Frunze19f6c692016-11-30 19:19:55 -0800678 uint32_t offset_forward1 = 2 + kNopCount1; // 2: account for auipc and jialc.
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700679 offset_forward1 <<= 2;
Alexey Frunze19f6c692016-11-30 19:19:55 -0800680 offset_forward1 += (offset_forward1 & 0x8000) << 1; // Account for sign extension in jialc.
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700681
Alexey Frunze19f6c692016-11-30 19:19:55 -0800682 uint32_t offset_forward2 = 2 + kNopCount2; // 2: account for auipc and jialc.
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700683 offset_forward2 <<= 2;
Alexey Frunze19f6c692016-11-30 19:19:55 -0800684 offset_forward2 += (offset_forward2 & 0x8000) << 1; // Account for sign extension in jialc.
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700685
Alexey Frunze19f6c692016-11-30 19:19:55 -0800686 uint32_t offset_back = -(2 + kNopCount2); // 2: account for auipc and jialc.
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700687 offset_back <<= 2;
Alexey Frunze19f6c692016-11-30 19:19:55 -0800688 offset_back += (offset_back & 0x8000) << 1; // Account for sign extension in jialc.
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700689
Alexey Frunze19f6c692016-11-30 19:19:55 -0800690 // Note, we're using the ".fill" directive to tell the assembler to generate many NOPs
691 // instead of generating them ourselves in the source code. This saves a few minutes
692 // of test time.
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700693 std::ostringstream oss;
694 oss <<
695 ".set noreorder\n"
Alexey Frunze19f6c692016-11-30 19:19:55 -0800696 "auipc $at, 0x" << std::hex << High16Bits(offset_forward1) << "\n"
697 "jialc $at, 0x" << std::hex << Low16Bits(offset_forward1) << "\n"
698 ".fill 0x" << std::hex << kNopCount1 << " , 4, 0\n"
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700699 "1:\n"
Alexey Frunze19f6c692016-11-30 19:19:55 -0800700 "auipc $at, 0x" << std::hex << High16Bits(offset_forward2) << "\n"
701 "jialc $at, 0x" << std::hex << Low16Bits(offset_forward2) << "\n"
702 ".fill 0x" << std::hex << kNopCount2 << " , 4, 0\n"
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700703 "2:\n"
Alexey Frunze19f6c692016-11-30 19:19:55 -0800704 "auipc $at, 0x" << std::hex << High16Bits(offset_back) << "\n"
705 "jialc $at, 0x" << std::hex << Low16Bits(offset_back) << "\n";
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700706 std::string expected = oss.str();
Alexey Frunze19f6c692016-11-30 19:19:55 -0800707 DriverStr(expected, "LongBalc");
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700708}
709
710TEST_F(AssemblerMIPS64Test, Bc) {
711 mips64::Mips64Label label1, label2;
712 __ Bc(&label1);
713 constexpr size_t kAdduCount1 = 63;
714 for (size_t i = 0; i != kAdduCount1; ++i) {
715 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
716 }
717 __ Bind(&label1);
718 __ Bc(&label2);
719 constexpr size_t kAdduCount2 = 64;
720 for (size_t i = 0; i != kAdduCount2; ++i) {
721 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
722 }
723 __ Bind(&label2);
724 __ Bc(&label1);
725
726 std::string expected =
727 ".set noreorder\n"
728 "bc 1f\n" +
729 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
730 "1:\n"
731 "bc 2f\n" +
732 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
733 "2:\n"
734 "bc 1b\n";
735 DriverStr(expected, "Bc");
736}
737
738TEST_F(AssemblerMIPS64Test, Beqzc) {
739 BranchCondOneRegHelper(&mips64::Mips64Assembler::Beqzc, "Beqzc");
740}
741
742TEST_F(AssemblerMIPS64Test, Bnezc) {
743 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bnezc, "Bnezc");
744}
745
746TEST_F(AssemblerMIPS64Test, Bltzc) {
747 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bltzc, "Bltzc");
748}
749
750TEST_F(AssemblerMIPS64Test, Bgezc) {
751 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bgezc, "Bgezc");
752}
753
754TEST_F(AssemblerMIPS64Test, Blezc) {
755 BranchCondOneRegHelper(&mips64::Mips64Assembler::Blezc, "Blezc");
756}
757
758TEST_F(AssemblerMIPS64Test, Bgtzc) {
759 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bgtzc, "Bgtzc");
760}
761
762TEST_F(AssemblerMIPS64Test, Beqc) {
763 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Beqc, "Beqc");
764}
765
766TEST_F(AssemblerMIPS64Test, Bnec) {
767 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bnec, "Bnec");
768}
769
770TEST_F(AssemblerMIPS64Test, Bltc) {
771 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bltc, "Bltc");
772}
773
774TEST_F(AssemblerMIPS64Test, Bgec) {
775 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bgec, "Bgec");
776}
777
778TEST_F(AssemblerMIPS64Test, Bltuc) {
779 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bltuc, "Bltuc");
780}
781
782TEST_F(AssemblerMIPS64Test, Bgeuc) {
783 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bgeuc, "Bgeuc");
784}
785
Alexey Frunze299a9392015-12-08 16:08:02 -0800786TEST_F(AssemblerMIPS64Test, Bc1eqz) {
787 mips64::Mips64Label label;
788 __ Bc1eqz(mips64::F0, &label);
789 constexpr size_t kAdduCount1 = 63;
790 for (size_t i = 0; i != kAdduCount1; ++i) {
791 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
792 }
793 __ Bind(&label);
794 constexpr size_t kAdduCount2 = 64;
795 for (size_t i = 0; i != kAdduCount2; ++i) {
796 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
797 }
798 __ Bc1eqz(mips64::F31, &label);
799
800 std::string expected =
801 ".set noreorder\n"
802 "bc1eqz $f0, 1f\n"
803 "nop\n" +
804 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
805 "1:\n" +
806 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
807 "bc1eqz $f31, 1b\n"
808 "nop\n";
809 DriverStr(expected, "Bc1eqz");
810}
811
812TEST_F(AssemblerMIPS64Test, Bc1nez) {
813 mips64::Mips64Label label;
814 __ Bc1nez(mips64::F0, &label);
815 constexpr size_t kAdduCount1 = 63;
816 for (size_t i = 0; i != kAdduCount1; ++i) {
817 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
818 }
819 __ Bind(&label);
820 constexpr size_t kAdduCount2 = 64;
821 for (size_t i = 0; i != kAdduCount2; ++i) {
822 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
823 }
824 __ Bc1nez(mips64::F31, &label);
825
826 std::string expected =
827 ".set noreorder\n"
828 "bc1nez $f0, 1f\n"
829 "nop\n" +
830 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
831 "1:\n" +
832 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
833 "bc1nez $f31, 1b\n"
834 "nop\n";
835 DriverStr(expected, "Bc1nez");
836}
837
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700838TEST_F(AssemblerMIPS64Test, LongBeqc) {
839 mips64::Mips64Label label;
840 __ Beqc(mips64::A0, mips64::A1, &label);
841 constexpr uint32_t kAdduCount1 = (1u << 15) + 1;
842 for (uint32_t i = 0; i != kAdduCount1; ++i) {
843 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
844 }
845 __ Bind(&label);
846 constexpr uint32_t kAdduCount2 = (1u << 15) + 1;
847 for (uint32_t i = 0; i != kAdduCount2; ++i) {
848 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
849 }
850 __ Beqc(mips64::A2, mips64::A3, &label);
851
852 uint32_t offset_forward = 2 + kAdduCount1; // 2: account for auipc and jic.
853 offset_forward <<= 2;
854 offset_forward += (offset_forward & 0x8000) << 1; // Account for sign extension in jic.
855
856 uint32_t offset_back = -(kAdduCount2 + 1); // 1: account for bnec.
857 offset_back <<= 2;
858 offset_back += (offset_back & 0x8000) << 1; // Account for sign extension in jic.
859
860 std::ostringstream oss;
861 oss <<
862 ".set noreorder\n"
863 "bnec $a0, $a1, 1f\n"
864 "auipc $at, 0x" << std::hex << High16Bits(offset_forward) << "\n"
865 "jic $at, 0x" << std::hex << Low16Bits(offset_forward) << "\n"
866 "1:\n" <<
867 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") <<
868 "2:\n" <<
869 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") <<
870 "bnec $a2, $a3, 3f\n"
871 "auipc $at, 0x" << std::hex << High16Bits(offset_back) << "\n"
872 "jic $at, 0x" << std::hex << Low16Bits(offset_back) << "\n"
873 "3:\n";
874 std::string expected = oss.str();
875 DriverStr(expected, "LongBeqc");
Chris Larsen51417632015-10-02 13:24:25 -0700876}
877
Chris Larsendbce0d72015-09-17 13:34:00 -0700878//////////
879// MISC //
880//////////
881
Alexey Frunze19f6c692016-11-30 19:19:55 -0800882TEST_F(AssemblerMIPS64Test, Lwpc) {
883 // Lwpc() takes an unsigned 19-bit immediate, while the GNU assembler needs a signed offset,
884 // hence the sign extension from bit 18 with `imm - ((imm & 0x40000) << 1)`.
885 // The GNU assembler also wants the offset to be a multiple of 4, which it will shift right
886 // by 2 positions when encoding, hence `<< 2` to compensate for that shift.
887 // We capture the value of the immediate with `.set imm, {imm}` because the value is needed
888 // twice for the sign extension, but `{imm}` is substituted only once.
889 const char* code = ".set imm, {imm}\nlw ${reg}, ((imm - ((imm & 0x40000) << 1)) << 2)($pc)";
890 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Lwpc, 19, code), "Lwpc");
891}
892
893TEST_F(AssemblerMIPS64Test, Lwupc) {
894 // The comment for the Lwpc test applies here as well.
895 const char* code = ".set imm, {imm}\nlwu ${reg}, ((imm - ((imm & 0x40000) << 1)) << 2)($pc)";
896 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Lwupc, 19, code), "Lwupc");
897}
898
899TEST_F(AssemblerMIPS64Test, Ldpc) {
900 // The comment for the Lwpc test applies here as well.
901 const char* code = ".set imm, {imm}\nld ${reg}, ((imm - ((imm & 0x20000) << 1)) << 3)($pc)";
902 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Ldpc, 18, code), "Ldpc");
903}
904
Goran Jakovljevic95f27142017-01-20 11:11:11 +0100905TEST_F(AssemblerMIPS64Test, Auipc) {
906 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Auipc, 16, "auipc ${reg}, {imm}"), "Auipc");
907}
908
909TEST_F(AssemblerMIPS64Test, Addiupc) {
910 // The comment from the Lwpc() test applies to this Addiupc() test as well.
911 const char* code = ".set imm, {imm}\naddiupc ${reg}, (imm - ((imm & 0x40000) << 1)) << 2";
912 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Addiupc, 19, code), "Addiupc");
913}
914
Alexey Frunze19f6c692016-11-30 19:19:55 -0800915TEST_F(AssemblerMIPS64Test, LoadFarthestNearLabelAddress) {
916 mips64::Mips64Label label;
917 __ LoadLabelAddress(mips64::V0, &label);
918 constexpr uint32_t kAdduCount = 0x3FFDE;
919 for (uint32_t i = 0; i != kAdduCount; ++i) {
920 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
921 }
922 __ Bind(&label);
923
924 std::string expected =
925 "lapc $v0, 1f\n" +
926 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
927 "1:\n";
928 DriverStr(expected, "LoadFarthestNearLabelAddress");
929 EXPECT_EQ(__ GetLabelLocation(&label), (1 + kAdduCount) * 4);
930}
931
932TEST_F(AssemblerMIPS64Test, LoadNearestFarLabelAddress) {
933 mips64::Mips64Label label;
934 __ LoadLabelAddress(mips64::V0, &label);
935 constexpr uint32_t kAdduCount = 0x3FFDF;
936 for (uint32_t i = 0; i != kAdduCount; ++i) {
937 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
938 }
939 __ Bind(&label);
940
941 std::string expected =
942 "1:\n"
943 "auipc $at, %hi(2f - 1b)\n"
Alexey Frunzef63f5692016-12-13 17:43:11 -0800944 "daddiu $v0, $at, %lo(2f - 1b)\n" +
Alexey Frunze19f6c692016-11-30 19:19:55 -0800945 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
946 "2:\n";
947 DriverStr(expected, "LoadNearestFarLabelAddress");
948 EXPECT_EQ(__ GetLabelLocation(&label), (2 + kAdduCount) * 4);
949}
950
951TEST_F(AssemblerMIPS64Test, LoadFarthestNearLiteral) {
952 mips64::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
953 __ LoadLiteral(mips64::V0, mips64::kLoadWord, literal);
954 constexpr uint32_t kAdduCount = 0x3FFDE;
955 for (uint32_t i = 0; i != kAdduCount; ++i) {
956 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
957 }
958
959 std::string expected =
960 "lwpc $v0, 1f\n" +
961 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
962 "1:\n"
963 ".word 0x12345678\n";
964 DriverStr(expected, "LoadFarthestNearLiteral");
965 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (1 + kAdduCount) * 4);
966}
967
968TEST_F(AssemblerMIPS64Test, LoadNearestFarLiteral) {
969 mips64::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
970 __ LoadLiteral(mips64::V0, mips64::kLoadWord, literal);
971 constexpr uint32_t kAdduCount = 0x3FFDF;
972 for (uint32_t i = 0; i != kAdduCount; ++i) {
973 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
974 }
975
976 std::string expected =
977 "1:\n"
978 "auipc $at, %hi(2f - 1b)\n"
979 "lw $v0, %lo(2f - 1b)($at)\n" +
980 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
981 "2:\n"
982 ".word 0x12345678\n";
983 DriverStr(expected, "LoadNearestFarLiteral");
984 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (2 + kAdduCount) * 4);
985}
986
987TEST_F(AssemblerMIPS64Test, LoadFarthestNearLiteralUnsigned) {
988 mips64::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
989 __ LoadLiteral(mips64::V0, mips64::kLoadUnsignedWord, literal);
990 constexpr uint32_t kAdduCount = 0x3FFDE;
991 for (uint32_t i = 0; i != kAdduCount; ++i) {
992 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
993 }
994
995 std::string expected =
996 "lwupc $v0, 1f\n" +
997 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
998 "1:\n"
999 ".word 0x12345678\n";
1000 DriverStr(expected, "LoadFarthestNearLiteralUnsigned");
1001 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (1 + kAdduCount) * 4);
1002}
1003
1004TEST_F(AssemblerMIPS64Test, LoadNearestFarLiteralUnsigned) {
1005 mips64::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
1006 __ LoadLiteral(mips64::V0, mips64::kLoadUnsignedWord, literal);
1007 constexpr uint32_t kAdduCount = 0x3FFDF;
1008 for (uint32_t i = 0; i != kAdduCount; ++i) {
1009 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
1010 }
1011
1012 std::string expected =
1013 "1:\n"
1014 "auipc $at, %hi(2f - 1b)\n"
1015 "lwu $v0, %lo(2f - 1b)($at)\n" +
1016 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
1017 "2:\n"
1018 ".word 0x12345678\n";
1019 DriverStr(expected, "LoadNearestFarLiteralUnsigned");
1020 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (2 + kAdduCount) * 4);
1021}
1022
1023TEST_F(AssemblerMIPS64Test, LoadFarthestNearLiteralLong) {
1024 mips64::Literal* literal = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
1025 __ LoadLiteral(mips64::V0, mips64::kLoadDoubleword, literal);
1026 constexpr uint32_t kAdduCount = 0x3FFDD;
1027 for (uint32_t i = 0; i != kAdduCount; ++i) {
1028 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
1029 }
1030
1031 std::string expected =
1032 "ldpc $v0, 1f\n" +
1033 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
1034 "1:\n"
1035 ".dword 0x0123456789ABCDEF\n";
1036 DriverStr(expected, "LoadFarthestNearLiteralLong");
1037 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (1 + kAdduCount) * 4);
1038}
1039
1040TEST_F(AssemblerMIPS64Test, LoadNearestFarLiteralLong) {
1041 mips64::Literal* literal = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
1042 __ LoadLiteral(mips64::V0, mips64::kLoadDoubleword, literal);
1043 constexpr uint32_t kAdduCount = 0x3FFDE;
1044 for (uint32_t i = 0; i != kAdduCount; ++i) {
1045 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
1046 }
1047
1048 std::string expected =
1049 "1:\n"
1050 "auipc $at, %hi(2f - 1b)\n"
1051 "ld $v0, %lo(2f - 1b)($at)\n" +
1052 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
1053 "2:\n"
1054 ".dword 0x0123456789ABCDEF\n";
1055 DriverStr(expected, "LoadNearestFarLiteralLong");
1056 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (2 + kAdduCount) * 4);
1057}
1058
1059TEST_F(AssemblerMIPS64Test, LongLiteralAlignmentNop) {
1060 mips64::Literal* literal1 = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
1061 mips64::Literal* literal2 = __ NewLiteral<uint64_t>(UINT64_C(0x5555555555555555));
1062 mips64::Literal* literal3 = __ NewLiteral<uint64_t>(UINT64_C(0xAAAAAAAAAAAAAAAA));
1063 __ LoadLiteral(mips64::A1, mips64::kLoadDoubleword, literal1);
1064 __ LoadLiteral(mips64::A2, mips64::kLoadDoubleword, literal2);
1065 __ LoadLiteral(mips64::A3, mips64::kLoadDoubleword, literal3);
1066 __ LoadLabelAddress(mips64::V0, literal1->GetLabel());
1067 __ LoadLabelAddress(mips64::V1, literal2->GetLabel());
1068 // A nop will be inserted here before the 64-bit literals.
1069
1070 std::string expected =
1071 "ldpc $a1, 1f\n"
1072 // The GNU assembler incorrectly requires the ldpc instruction to be located
1073 // at an address that's a multiple of 8. TODO: Remove this workaround if/when
1074 // the assembler is fixed.
1075 // "ldpc $a2, 2f\n"
1076 ".word 0xECD80004\n"
1077 "ldpc $a3, 3f\n"
1078 "lapc $v0, 1f\n"
1079 "lapc $v1, 2f\n"
1080 "nop\n"
1081 "1:\n"
1082 ".dword 0x0123456789ABCDEF\n"
1083 "2:\n"
1084 ".dword 0x5555555555555555\n"
1085 "3:\n"
1086 ".dword 0xAAAAAAAAAAAAAAAA\n";
1087 DriverStr(expected, "LongLiteralAlignmentNop");
1088 EXPECT_EQ(__ GetLabelLocation(literal1->GetLabel()), 6 * 4u);
1089 EXPECT_EQ(__ GetLabelLocation(literal2->GetLabel()), 8 * 4u);
1090 EXPECT_EQ(__ GetLabelLocation(literal3->GetLabel()), 10 * 4u);
1091}
1092
1093TEST_F(AssemblerMIPS64Test, LongLiteralAlignmentNoNop) {
1094 mips64::Literal* literal1 = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
1095 mips64::Literal* literal2 = __ NewLiteral<uint64_t>(UINT64_C(0x5555555555555555));
1096 __ LoadLiteral(mips64::A1, mips64::kLoadDoubleword, literal1);
1097 __ LoadLiteral(mips64::A2, mips64::kLoadDoubleword, literal2);
1098 __ LoadLabelAddress(mips64::V0, literal1->GetLabel());
1099 __ LoadLabelAddress(mips64::V1, literal2->GetLabel());
1100
1101 std::string expected =
1102 "ldpc $a1, 1f\n"
1103 // The GNU assembler incorrectly requires the ldpc instruction to be located
1104 // at an address that's a multiple of 8. TODO: Remove this workaround if/when
1105 // the assembler is fixed.
1106 // "ldpc $a2, 2f\n"
1107 ".word 0xECD80003\n"
1108 "lapc $v0, 1f\n"
1109 "lapc $v1, 2f\n"
1110 "1:\n"
1111 ".dword 0x0123456789ABCDEF\n"
1112 "2:\n"
1113 ".dword 0x5555555555555555\n";
1114 DriverStr(expected, "LongLiteralAlignmentNoNop");
1115 EXPECT_EQ(__ GetLabelLocation(literal1->GetLabel()), 4 * 4u);
1116 EXPECT_EQ(__ GetLabelLocation(literal2->GetLabel()), 6 * 4u);
1117}
1118
1119TEST_F(AssemblerMIPS64Test, FarLongLiteralAlignmentNop) {
1120 mips64::Literal* literal = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
1121 __ LoadLiteral(mips64::V0, mips64::kLoadDoubleword, literal);
1122 __ LoadLabelAddress(mips64::V1, literal->GetLabel());
1123 constexpr uint32_t kAdduCount = 0x3FFDF;
1124 for (uint32_t i = 0; i != kAdduCount; ++i) {
1125 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
1126 }
1127 // A nop will be inserted here before the 64-bit literal.
1128
1129 std::string expected =
1130 "1:\n"
1131 "auipc $at, %hi(3f - 1b)\n"
1132 "ld $v0, %lo(3f - 1b)($at)\n"
1133 "2:\n"
1134 "auipc $at, %hi(3f - 2b)\n"
Alexey Frunzef63f5692016-12-13 17:43:11 -08001135 "daddiu $v1, $at, %lo(3f - 2b)\n" +
Alexey Frunze19f6c692016-11-30 19:19:55 -08001136 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
1137 "nop\n"
1138 "3:\n"
1139 ".dword 0x0123456789ABCDEF\n";
1140 DriverStr(expected, "FarLongLiteralAlignmentNop");
1141 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (5 + kAdduCount) * 4);
1142}
1143
Goran Jakovljevic95f27142017-01-20 11:11:11 +01001144TEST_F(AssemblerMIPS64Test, Addu) {
1145 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Addu, "addu ${reg1}, ${reg2}, ${reg3}"), "addu");
1146}
1147
1148TEST_F(AssemblerMIPS64Test, Addiu) {
1149 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Addiu, -16, "addiu ${reg1}, ${reg2}, {imm}"),
1150 "addiu");
1151}
1152
1153TEST_F(AssemblerMIPS64Test, Daddu) {
1154 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Daddu, "daddu ${reg1}, ${reg2}, ${reg3}"), "daddu");
1155}
1156
1157TEST_F(AssemblerMIPS64Test, Daddiu) {
1158 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Daddiu, -16, "daddiu ${reg1}, ${reg2}, {imm}"),
1159 "daddiu");
1160}
1161
1162TEST_F(AssemblerMIPS64Test, Subu) {
1163 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Subu, "subu ${reg1}, ${reg2}, ${reg3}"), "subu");
1164}
1165
1166TEST_F(AssemblerMIPS64Test, Dsubu) {
1167 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dsubu, "dsubu ${reg1}, ${reg2}, ${reg3}"), "dsubu");
1168}
1169
1170TEST_F(AssemblerMIPS64Test, MulR6) {
1171 DriverStr(RepeatRRR(&mips64::Mips64Assembler::MulR6, "mul ${reg1}, ${reg2}, ${reg3}"), "mulR6");
1172}
1173
1174TEST_F(AssemblerMIPS64Test, DivR6) {
1175 DriverStr(RepeatRRR(&mips64::Mips64Assembler::DivR6, "div ${reg1}, ${reg2}, ${reg3}"), "divR6");
1176}
1177
1178TEST_F(AssemblerMIPS64Test, ModR6) {
1179 DriverStr(RepeatRRR(&mips64::Mips64Assembler::ModR6, "mod ${reg1}, ${reg2}, ${reg3}"), "modR6");
1180}
1181
1182TEST_F(AssemblerMIPS64Test, DivuR6) {
1183 DriverStr(RepeatRRR(&mips64::Mips64Assembler::DivuR6, "divu ${reg1}, ${reg2}, ${reg3}"),
1184 "divuR6");
1185}
1186
1187TEST_F(AssemblerMIPS64Test, ModuR6) {
1188 DriverStr(RepeatRRR(&mips64::Mips64Assembler::ModuR6, "modu ${reg1}, ${reg2}, ${reg3}"),
1189 "moduR6");
1190}
1191
1192TEST_F(AssemblerMIPS64Test, Dmul) {
1193 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dmul, "dmul ${reg1}, ${reg2}, ${reg3}"), "dmul");
1194}
1195
1196TEST_F(AssemblerMIPS64Test, Ddiv) {
1197 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Ddiv, "ddiv ${reg1}, ${reg2}, ${reg3}"), "ddiv");
1198}
1199
1200TEST_F(AssemblerMIPS64Test, Dmod) {
1201 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dmod, "dmod ${reg1}, ${reg2}, ${reg3}"), "dmod");
1202}
1203
1204TEST_F(AssemblerMIPS64Test, Ddivu) {
1205 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Ddivu, "ddivu ${reg1}, ${reg2}, ${reg3}"), "ddivu");
1206}
1207
1208TEST_F(AssemblerMIPS64Test, Dmodu) {
1209 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dmodu, "dmodu ${reg1}, ${reg2}, ${reg3}"), "dmodu");
1210}
1211
1212TEST_F(AssemblerMIPS64Test, And) {
1213 DriverStr(RepeatRRR(&mips64::Mips64Assembler::And, "and ${reg1}, ${reg2}, ${reg3}"), "and");
1214}
1215
1216TEST_F(AssemblerMIPS64Test, Andi) {
1217 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Andi, 16, "andi ${reg1}, ${reg2}, {imm}"), "andi");
1218}
1219
1220TEST_F(AssemblerMIPS64Test, Or) {
1221 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Or, "or ${reg1}, ${reg2}, ${reg3}"), "or");
1222}
1223
1224TEST_F(AssemblerMIPS64Test, Ori) {
1225 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Ori, 16, "ori ${reg1}, ${reg2}, {imm}"), "ori");
1226}
1227
1228TEST_F(AssemblerMIPS64Test, Xor) {
1229 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Xor, "xor ${reg1}, ${reg2}, ${reg3}"), "xor");
1230}
1231
1232TEST_F(AssemblerMIPS64Test, Xori) {
1233 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Xori, 16, "xori ${reg1}, ${reg2}, {imm}"), "xori");
1234}
1235
1236TEST_F(AssemblerMIPS64Test, Nor) {
1237 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Nor, "nor ${reg1}, ${reg2}, ${reg3}"), "nor");
1238}
1239
1240TEST_F(AssemblerMIPS64Test, Lb) {
1241 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lb, -16, "lb ${reg1}, {imm}(${reg2})"), "lb");
1242}
1243
1244TEST_F(AssemblerMIPS64Test, Lh) {
1245 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lh, -16, "lh ${reg1}, {imm}(${reg2})"), "lh");
1246}
1247
1248TEST_F(AssemblerMIPS64Test, Lw) {
1249 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lw, -16, "lw ${reg1}, {imm}(${reg2})"), "lw");
1250}
1251
1252TEST_F(AssemblerMIPS64Test, Ld) {
1253 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Ld, -16, "ld ${reg1}, {imm}(${reg2})"), "ld");
1254}
1255
1256TEST_F(AssemblerMIPS64Test, Lbu) {
1257 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lbu, -16, "lbu ${reg1}, {imm}(${reg2})"), "lbu");
1258}
1259
1260TEST_F(AssemblerMIPS64Test, Lhu) {
1261 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lhu, -16, "lhu ${reg1}, {imm}(${reg2})"), "lhu");
1262}
1263
1264TEST_F(AssemblerMIPS64Test, Lwu) {
1265 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lwu, -16, "lwu ${reg1}, {imm}(${reg2})"), "lwu");
1266}
1267
1268TEST_F(AssemblerMIPS64Test, Lui) {
1269 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Lui, 16, "lui ${reg}, {imm}"), "lui");
1270}
1271
1272TEST_F(AssemblerMIPS64Test, Dahi) {
1273 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Dahi, 16, "dahi ${reg}, ${reg}, {imm}"), "dahi");
1274}
1275
1276TEST_F(AssemblerMIPS64Test, Dati) {
1277 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Dati, 16, "dati ${reg}, ${reg}, {imm}"), "dati");
1278}
1279
1280TEST_F(AssemblerMIPS64Test, Sb) {
1281 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sb, -16, "sb ${reg1}, {imm}(${reg2})"), "sb");
1282}
1283
1284TEST_F(AssemblerMIPS64Test, Sh) {
1285 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sh, -16, "sh ${reg1}, {imm}(${reg2})"), "sh");
1286}
1287
1288TEST_F(AssemblerMIPS64Test, Sw) {
1289 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sw, -16, "sw ${reg1}, {imm}(${reg2})"), "sw");
1290}
1291
1292TEST_F(AssemblerMIPS64Test, Sd) {
1293 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sd, -16, "sd ${reg1}, {imm}(${reg2})"), "sd");
1294}
1295
1296TEST_F(AssemblerMIPS64Test, Slt) {
1297 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Slt, "slt ${reg1}, ${reg2}, ${reg3}"), "slt");
1298}
1299
1300TEST_F(AssemblerMIPS64Test, Sltu) {
1301 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Sltu, "sltu ${reg1}, ${reg2}, ${reg3}"), "sltu");
1302}
1303
1304TEST_F(AssemblerMIPS64Test, Slti) {
1305 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Slti, -16, "slti ${reg1}, ${reg2}, {imm}"),
1306 "slti");
1307}
1308
1309TEST_F(AssemblerMIPS64Test, Sltiu) {
1310 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sltiu, -16, "sltiu ${reg1}, ${reg2}, {imm}"),
1311 "sltiu");
1312}
1313
1314TEST_F(AssemblerMIPS64Test, Move) {
1315 DriverStr(RepeatRR(&mips64::Mips64Assembler::Move, "or ${reg1}, ${reg2}, $zero"), "move");
1316}
1317
1318TEST_F(AssemblerMIPS64Test, Clear) {
1319 DriverStr(RepeatR(&mips64::Mips64Assembler::Clear, "or ${reg}, $zero, $zero"), "clear");
1320}
1321
1322TEST_F(AssemblerMIPS64Test, Not) {
1323 DriverStr(RepeatRR(&mips64::Mips64Assembler::Not, "nor ${reg1}, ${reg2}, $zero"), "not");
1324}
1325
Chris Larsendbce0d72015-09-17 13:34:00 -07001326TEST_F(AssemblerMIPS64Test, Bitswap) {
1327 DriverStr(RepeatRR(&mips64::Mips64Assembler::Bitswap, "bitswap ${reg1}, ${reg2}"), "bitswap");
1328}
1329
1330TEST_F(AssemblerMIPS64Test, Dbitswap) {
1331 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dbitswap, "dbitswap ${reg1}, ${reg2}"), "dbitswap");
1332}
1333
Chris Larsen51417632015-10-02 13:24:25 -07001334TEST_F(AssemblerMIPS64Test, Seb) {
1335 DriverStr(RepeatRR(&mips64::Mips64Assembler::Seb, "seb ${reg1}, ${reg2}"), "seb");
1336}
1337
1338TEST_F(AssemblerMIPS64Test, Seh) {
1339 DriverStr(RepeatRR(&mips64::Mips64Assembler::Seh, "seh ${reg1}, ${reg2}"), "seh");
1340}
1341
Chris Larsendbce0d72015-09-17 13:34:00 -07001342TEST_F(AssemblerMIPS64Test, Dsbh) {
1343 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dsbh, "dsbh ${reg1}, ${reg2}"), "dsbh");
1344}
1345
1346TEST_F(AssemblerMIPS64Test, Dshd) {
1347 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dshd, "dshd ${reg1}, ${reg2}"), "dshd");
1348}
1349
Lazar Trsicd9672662015-09-03 17:33:01 +02001350TEST_F(AssemblerMIPS64Test, Dext) {
1351 std::vector<mips64::GpuRegister*> reg1_registers = GetRegisters();
1352 std::vector<mips64::GpuRegister*> reg2_registers = GetRegisters();
1353 WarnOnCombinations(reg1_registers.size() * reg2_registers.size() * 33 * 16);
1354 std::ostringstream expected;
1355 for (mips64::GpuRegister* reg1 : reg1_registers) {
1356 for (mips64::GpuRegister* reg2 : reg2_registers) {
1357 for (int32_t pos = 0; pos < 32; pos++) {
1358 for (int32_t size = 1; size <= 32; size++) {
1359 __ Dext(*reg1, *reg2, pos, size);
1360 expected << "dext $" << *reg1 << ", $" << *reg2 << ", " << pos << ", " << size << "\n";
1361 }
1362 }
1363 }
1364 }
1365
1366 DriverStr(expected.str(), "Dext");
1367}
1368
1369TEST_F(AssemblerMIPS64Test, Dinsu) {
1370 std::vector<mips64::GpuRegister*> reg1_registers = GetRegisters();
1371 std::vector<mips64::GpuRegister*> reg2_registers = GetRegisters();
1372 WarnOnCombinations(reg1_registers.size() * reg2_registers.size() * 33 * 16);
1373 std::ostringstream expected;
1374 for (mips64::GpuRegister* reg1 : reg1_registers) {
1375 for (mips64::GpuRegister* reg2 : reg2_registers) {
1376 for (int32_t pos = 32; pos < 64; pos++) {
1377 for (int32_t size = 1; pos + size <= 64; size++) {
1378 __ Dinsu(*reg1, *reg2, pos, size);
1379 expected << "dinsu $" << *reg1 << ", $" << *reg2 << ", " << pos << ", " << size << "\n";
1380 }
1381 }
1382 }
1383 }
1384
1385 DriverStr(expected.str(), "Dinsu");
1386}
1387
Chris Larsene3660592016-11-09 11:13:42 -08001388TEST_F(AssemblerMIPS64Test, Lsa) {
1389 DriverStr(RepeatRRRIb(&mips64::Mips64Assembler::Lsa,
1390 2,
1391 "lsa ${reg1}, ${reg2}, ${reg3}, {imm}",
1392 1),
1393 "lsa");
1394}
1395
1396TEST_F(AssemblerMIPS64Test, Dlsa) {
1397 DriverStr(RepeatRRRIb(&mips64::Mips64Assembler::Dlsa,
1398 2,
1399 "dlsa ${reg1}, ${reg2}, ${reg3}, {imm}",
1400 1),
1401 "dlsa");
1402}
1403
Chris Larsendbce0d72015-09-17 13:34:00 -07001404TEST_F(AssemblerMIPS64Test, Wsbh) {
1405 DriverStr(RepeatRR(&mips64::Mips64Assembler::Wsbh, "wsbh ${reg1}, ${reg2}"), "wsbh");
1406}
1407
Chris Larsen51417632015-10-02 13:24:25 -07001408TEST_F(AssemblerMIPS64Test, Sll) {
1409 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sll, 5, "sll ${reg1}, ${reg2}, {imm}"), "sll");
1410}
1411
1412TEST_F(AssemblerMIPS64Test, Srl) {
1413 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Srl, 5, "srl ${reg1}, ${reg2}, {imm}"), "srl");
1414}
1415
Chris Larsen98a73e12015-10-19 14:17:16 -07001416TEST_F(AssemblerMIPS64Test, Rotr) {
1417 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Rotr, 5, "rotr ${reg1}, ${reg2}, {imm}"), "rotr");
1418}
1419
Chris Larsen51417632015-10-02 13:24:25 -07001420TEST_F(AssemblerMIPS64Test, Sra) {
1421 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sra, 5, "sra ${reg1}, ${reg2}, {imm}"), "sra");
1422}
1423
Chris Larsen98a73e12015-10-19 14:17:16 -07001424TEST_F(AssemblerMIPS64Test, Sllv) {
1425 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Sllv, "sllv ${reg1}, ${reg2}, ${reg3}"), "sllv");
1426}
1427
1428TEST_F(AssemblerMIPS64Test, Srlv) {
1429 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Srlv, "srlv ${reg1}, ${reg2}, ${reg3}"), "srlv");
1430}
1431
1432TEST_F(AssemblerMIPS64Test, Rotrv) {
1433 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Rotrv, "rotrv ${reg1}, ${reg2}, ${reg3}"), "rotrv");
1434}
1435
1436TEST_F(AssemblerMIPS64Test, Srav) {
1437 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Srav, "srav ${reg1}, ${reg2}, ${reg3}"), "srav");
1438}
1439
Chris Larsen51417632015-10-02 13:24:25 -07001440TEST_F(AssemblerMIPS64Test, Dsll) {
1441 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsll, 5, "dsll ${reg1}, ${reg2}, {imm}"), "dsll");
1442}
1443
1444TEST_F(AssemblerMIPS64Test, Dsrl) {
1445 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsrl, 5, "dsrl ${reg1}, ${reg2}, {imm}"), "dsrl");
1446}
1447
Chris Larsen98a73e12015-10-19 14:17:16 -07001448TEST_F(AssemblerMIPS64Test, Drotr) {
1449 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Drotr, 5, "drotr ${reg1}, ${reg2}, {imm}"),
1450 "drotr");
1451}
1452
Chris Larsen51417632015-10-02 13:24:25 -07001453TEST_F(AssemblerMIPS64Test, Dsra) {
1454 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsra, 5, "dsra ${reg1}, ${reg2}, {imm}"), "dsra");
1455}
1456
1457TEST_F(AssemblerMIPS64Test, Dsll32) {
Chris Larsen98a73e12015-10-19 14:17:16 -07001458 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsll32, 5, "dsll32 ${reg1}, ${reg2}, {imm}"),
1459 "dsll32");
Chris Larsen51417632015-10-02 13:24:25 -07001460}
1461
1462TEST_F(AssemblerMIPS64Test, Dsrl32) {
Chris Larsen98a73e12015-10-19 14:17:16 -07001463 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsrl32, 5, "dsrl32 ${reg1}, ${reg2}, {imm}"),
1464 "dsrl32");
1465}
1466
1467TEST_F(AssemblerMIPS64Test, Drotr32) {
1468 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Drotr32, 5, "drotr32 ${reg1}, ${reg2}, {imm}"),
1469 "drotr32");
Chris Larsen51417632015-10-02 13:24:25 -07001470}
1471
1472TEST_F(AssemblerMIPS64Test, Dsra32) {
Chris Larsen98a73e12015-10-19 14:17:16 -07001473 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsra32, 5, "dsra32 ${reg1}, ${reg2}, {imm}"),
1474 "dsra32");
Chris Larsen51417632015-10-02 13:24:25 -07001475}
1476
Goran Jakovljevic95f27142017-01-20 11:11:11 +01001477TEST_F(AssemblerMIPS64Test, Dsllv) {
1478 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dsllv, "dsllv ${reg1}, ${reg2}, ${reg3}"), "dsllv");
1479}
1480
1481TEST_F(AssemblerMIPS64Test, Dsrlv) {
1482 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dsrlv, "dsrlv ${reg1}, ${reg2}, ${reg3}"), "dsrlv");
1483}
1484
1485TEST_F(AssemblerMIPS64Test, Dsrav) {
1486 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dsrav, "dsrav ${reg1}, ${reg2}, ${reg3}"), "dsrav");
1487}
1488
Chris Larsendbce0d72015-09-17 13:34:00 -07001489TEST_F(AssemblerMIPS64Test, Sc) {
1490 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sc, -9, "sc ${reg1}, {imm}(${reg2})"), "sc");
1491}
1492
1493TEST_F(AssemblerMIPS64Test, Scd) {
1494 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Scd, -9, "scd ${reg1}, {imm}(${reg2})"), "scd");
1495}
1496
1497TEST_F(AssemblerMIPS64Test, Ll) {
1498 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Ll, -9, "ll ${reg1}, {imm}(${reg2})"), "ll");
1499}
1500
1501TEST_F(AssemblerMIPS64Test, Lld) {
1502 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lld, -9, "lld ${reg1}, {imm}(${reg2})"), "lld");
1503}
1504
Chris Larsendbce0d72015-09-17 13:34:00 -07001505TEST_F(AssemblerMIPS64Test, Seleqz) {
1506 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Seleqz, "seleqz ${reg1}, ${reg2}, ${reg3}"),
1507 "seleqz");
1508}
1509
1510TEST_F(AssemblerMIPS64Test, Selnez) {
1511 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Selnez, "selnez ${reg1}, ${reg2}, ${reg3}"),
1512 "selnez");
1513}
1514
1515TEST_F(AssemblerMIPS64Test, Clz) {
1516 DriverStr(RepeatRR(&mips64::Mips64Assembler::Clz, "clz ${reg1}, ${reg2}"), "clz");
1517}
1518
1519TEST_F(AssemblerMIPS64Test, Clo) {
1520 DriverStr(RepeatRR(&mips64::Mips64Assembler::Clo, "clo ${reg1}, ${reg2}"), "clo");
1521}
1522
1523TEST_F(AssemblerMIPS64Test, Dclz) {
1524 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dclz, "dclz ${reg1}, ${reg2}"), "dclz");
1525}
1526
1527TEST_F(AssemblerMIPS64Test, Dclo) {
1528 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dclo, "dclo ${reg1}, ${reg2}"), "dclo");
1529}
1530
Lazar Trsicd9672662015-09-03 17:33:01 +02001531TEST_F(AssemblerMIPS64Test, LoadFromOffset) {
1532 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A0, 0);
1533 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0);
1534 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 1);
1535 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 256);
1536 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 1000);
1537 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x7FFF);
1538 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x8000);
1539 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x8001);
1540 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x10000);
1541 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x12345678);
1542 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, -256);
1543 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, -32768);
1544 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0xABCDEF00);
1545
1546 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A0, 0);
1547 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0);
1548 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 1);
1549 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 256);
1550 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 1000);
1551 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x7FFF);
1552 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x8000);
1553 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x8001);
1554 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x10000);
1555 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x12345678);
1556 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, -256);
1557 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, -32768);
1558 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0xABCDEF00);
1559
1560 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A0, 0);
1561 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0);
1562 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 2);
1563 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 256);
1564 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 1000);
1565 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x7FFE);
1566 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x8000);
1567 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x8002);
1568 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x10000);
1569 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x12345678);
1570 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, -256);
1571 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, -32768);
1572 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0xABCDEF00);
1573
1574 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A0, 0);
1575 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0);
1576 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 2);
1577 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 256);
1578 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 1000);
1579 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x7FFE);
1580 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x8000);
1581 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x8002);
1582 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x10000);
1583 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x12345678);
1584 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, -256);
1585 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, -32768);
1586 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0xABCDEF00);
1587
1588 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A0, 0);
1589 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0);
1590 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 4);
1591 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 256);
1592 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 1000);
1593 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x7FFC);
1594 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x8000);
1595 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x8004);
1596 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x10000);
1597 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x12345678);
1598 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, -256);
1599 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, -32768);
1600 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0xABCDEF00);
1601
1602 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A0, 0);
1603 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0);
1604 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 4);
1605 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 256);
1606 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 1000);
1607 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x7FFC);
1608 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x8000);
1609 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x8004);
1610 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x10000);
1611 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x12345678);
1612 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, -256);
1613 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, -32768);
1614 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0xABCDEF00);
1615
1616 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A0, 0);
1617 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0);
1618 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 4);
1619 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 256);
1620 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 1000);
1621 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x7FFC);
1622 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x8000);
1623 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x8004);
1624 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x10000);
1625 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x12345678);
1626 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, -256);
1627 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, -32768);
1628 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0xABCDEF00);
1629
1630 const char* expected =
1631 "lb $a0, 0($a0)\n"
1632 "lb $a0, 0($a1)\n"
1633 "lb $a0, 1($a1)\n"
1634 "lb $a0, 256($a1)\n"
1635 "lb $a0, 1000($a1)\n"
1636 "lb $a0, 0x7FFF($a1)\n"
1637 "ori $at, $zero, 0x8000\n"
1638 "daddu $at, $at, $a1\n"
1639 "lb $a0, 0($at)\n"
1640 "ori $at, $zero, 0x8000\n"
1641 "daddu $at, $at, $a1\n"
1642 "lb $a0, 1($at)\n"
1643 "lui $at, 1\n"
1644 "daddu $at, $at, $a1\n"
1645 "lb $a0, 0($at)\n"
1646 "lui $at, 0x1234\n"
1647 "ori $at, 0x5678\n"
1648 "daddu $at, $at, $a1\n"
1649 "lb $a0, 0($at)\n"
1650 "lb $a0, -256($a1)\n"
1651 "lb $a0, -32768($a1)\n"
1652 "lui $at, 0xABCD\n"
1653 "ori $at, 0xEF00\n"
1654 "daddu $at, $at, $a1\n"
1655 "lb $a0, 0($at)\n"
1656
1657 "lbu $a0, 0($a0)\n"
1658 "lbu $a0, 0($a1)\n"
1659 "lbu $a0, 1($a1)\n"
1660 "lbu $a0, 256($a1)\n"
1661 "lbu $a0, 1000($a1)\n"
1662 "lbu $a0, 0x7FFF($a1)\n"
1663 "ori $at, $zero, 0x8000\n"
1664 "daddu $at, $at, $a1\n"
1665 "lbu $a0, 0($at)\n"
1666 "ori $at, $zero, 0x8000\n"
1667 "daddu $at, $at, $a1\n"
1668 "lbu $a0, 1($at)\n"
1669 "lui $at, 1\n"
1670 "daddu $at, $at, $a1\n"
1671 "lbu $a0, 0($at)\n"
1672 "lui $at, 0x1234\n"
1673 "ori $at, 0x5678\n"
1674 "daddu $at, $at, $a1\n"
1675 "lbu $a0, 0($at)\n"
1676 "lbu $a0, -256($a1)\n"
1677 "lbu $a0, -32768($a1)\n"
1678 "lui $at, 0xABCD\n"
1679 "ori $at, 0xEF00\n"
1680 "daddu $at, $at, $a1\n"
1681 "lbu $a0, 0($at)\n"
1682
1683 "lh $a0, 0($a0)\n"
1684 "lh $a0, 0($a1)\n"
1685 "lh $a0, 2($a1)\n"
1686 "lh $a0, 256($a1)\n"
1687 "lh $a0, 1000($a1)\n"
1688 "lh $a0, 0x7FFE($a1)\n"
1689 "ori $at, $zero, 0x8000\n"
1690 "daddu $at, $at, $a1\n"
1691 "lh $a0, 0($at)\n"
1692 "ori $at, $zero, 0x8000\n"
1693 "daddu $at, $at, $a1\n"
1694 "lh $a0, 2($at)\n"
1695 "lui $at, 1\n"
1696 "daddu $at, $at, $a1\n"
1697 "lh $a0, 0($at)\n"
1698 "lui $at, 0x1234\n"
1699 "ori $at, 0x5678\n"
1700 "daddu $at, $at, $a1\n"
1701 "lh $a0, 0($at)\n"
1702 "lh $a0, -256($a1)\n"
1703 "lh $a0, -32768($a1)\n"
1704 "lui $at, 0xABCD\n"
1705 "ori $at, 0xEF00\n"
1706 "daddu $at, $at, $a1\n"
1707 "lh $a0, 0($at)\n"
1708
1709 "lhu $a0, 0($a0)\n"
1710 "lhu $a0, 0($a1)\n"
1711 "lhu $a0, 2($a1)\n"
1712 "lhu $a0, 256($a1)\n"
1713 "lhu $a0, 1000($a1)\n"
1714 "lhu $a0, 0x7FFE($a1)\n"
1715 "ori $at, $zero, 0x8000\n"
1716 "daddu $at, $at, $a1\n"
1717 "lhu $a0, 0($at)\n"
1718 "ori $at, $zero, 0x8000\n"
1719 "daddu $at, $at, $a1\n"
1720 "lhu $a0, 2($at)\n"
1721 "lui $at, 1\n"
1722 "daddu $at, $at, $a1\n"
1723 "lhu $a0, 0($at)\n"
1724 "lui $at, 0x1234\n"
1725 "ori $at, 0x5678\n"
1726 "daddu $at, $at, $a1\n"
1727 "lhu $a0, 0($at)\n"
1728 "lhu $a0, -256($a1)\n"
1729 "lhu $a0, -32768($a1)\n"
1730 "lui $at, 0xABCD\n"
1731 "ori $at, 0xEF00\n"
1732 "daddu $at, $at, $a1\n"
1733 "lhu $a0, 0($at)\n"
1734
1735 "lw $a0, 0($a0)\n"
1736 "lw $a0, 0($a1)\n"
1737 "lw $a0, 4($a1)\n"
1738 "lw $a0, 256($a1)\n"
1739 "lw $a0, 1000($a1)\n"
1740 "lw $a0, 0x7FFC($a1)\n"
1741 "ori $at, $zero, 0x8000\n"
1742 "daddu $at, $at, $a1\n"
1743 "lw $a0, 0($at)\n"
1744 "ori $at, $zero, 0x8000\n"
1745 "daddu $at, $at, $a1\n"
1746 "lw $a0, 4($at)\n"
1747 "lui $at, 1\n"
1748 "daddu $at, $at, $a1\n"
1749 "lw $a0, 0($at)\n"
1750 "lui $at, 0x1234\n"
1751 "ori $at, 0x5678\n"
1752 "daddu $at, $at, $a1\n"
1753 "lw $a0, 0($at)\n"
1754 "lw $a0, -256($a1)\n"
1755 "lw $a0, -32768($a1)\n"
1756 "lui $at, 0xABCD\n"
1757 "ori $at, 0xEF00\n"
1758 "daddu $at, $at, $a1\n"
1759 "lw $a0, 0($at)\n"
1760
1761 "lwu $a0, 0($a0)\n"
1762 "lwu $a0, 0($a1)\n"
1763 "lwu $a0, 4($a1)\n"
1764 "lwu $a0, 256($a1)\n"
1765 "lwu $a0, 1000($a1)\n"
1766 "lwu $a0, 0x7FFC($a1)\n"
1767 "ori $at, $zero, 0x8000\n"
1768 "daddu $at, $at, $a1\n"
1769 "lwu $a0, 0($at)\n"
1770 "ori $at, $zero, 0x8000\n"
1771 "daddu $at, $at, $a1\n"
1772 "lwu $a0, 4($at)\n"
1773 "lui $at, 1\n"
1774 "daddu $at, $at, $a1\n"
1775 "lwu $a0, 0($at)\n"
1776 "lui $at, 0x1234\n"
1777 "ori $at, 0x5678\n"
1778 "daddu $at, $at, $a1\n"
1779 "lwu $a0, 0($at)\n"
1780 "lwu $a0, -256($a1)\n"
1781 "lwu $a0, -32768($a1)\n"
1782 "lui $at, 0xABCD\n"
1783 "ori $at, 0xEF00\n"
1784 "daddu $at, $at, $a1\n"
1785 "lwu $a0, 0($at)\n"
1786
1787 "ld $a0, 0($a0)\n"
1788 "ld $a0, 0($a1)\n"
1789 "lwu $a0, 4($a1)\n"
1790 "lwu $t3, 8($a1)\n"
1791 "dins $a0, $t3, 32, 32\n"
1792 "ld $a0, 256($a1)\n"
1793 "ld $a0, 1000($a1)\n"
1794 "ori $at, $zero, 0x7FF8\n"
1795 "daddu $at, $at, $a1\n"
1796 "lwu $a0, 4($at)\n"
1797 "lwu $t3, 8($at)\n"
1798 "dins $a0, $t3, 32, 32\n"
1799 "ori $at, $zero, 0x8000\n"
1800 "daddu $at, $at, $a1\n"
1801 "ld $a0, 0($at)\n"
1802 "ori $at, $zero, 0x8000\n"
1803 "daddu $at, $at, $a1\n"
1804 "lwu $a0, 4($at)\n"
1805 "lwu $t3, 8($at)\n"
1806 "dins $a0, $t3, 32, 32\n"
1807 "lui $at, 1\n"
1808 "daddu $at, $at, $a1\n"
1809 "ld $a0, 0($at)\n"
1810 "lui $at, 0x1234\n"
1811 "ori $at, 0x5678\n"
1812 "daddu $at, $at, $a1\n"
1813 "ld $a0, 0($at)\n"
1814 "ld $a0, -256($a1)\n"
1815 "ld $a0, -32768($a1)\n"
1816 "lui $at, 0xABCD\n"
1817 "ori $at, 0xEF00\n"
1818 "daddu $at, $at, $a1\n"
1819 "ld $a0, 0($at)\n";
1820 DriverStr(expected, "LoadFromOffset");
1821}
1822
1823TEST_F(AssemblerMIPS64Test, LoadFpuFromOffset) {
1824 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0);
1825 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 4);
1826 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 256);
1827 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x7FFC);
1828 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x8000);
1829 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x8004);
1830 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x10000);
1831 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x12345678);
1832 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, -256);
1833 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, -32768);
1834 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0xABCDEF00);
1835
1836 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0);
1837 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 4);
1838 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 256);
1839 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x7FFC);
1840 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x8000);
1841 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x8004);
1842 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x10000);
1843 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x12345678);
1844 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, -256);
1845 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, -32768);
1846 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0xABCDEF00);
1847
1848 const char* expected =
1849 "lwc1 $f0, 0($a0)\n"
1850 "lwc1 $f0, 4($a0)\n"
1851 "lwc1 $f0, 256($a0)\n"
1852 "lwc1 $f0, 0x7FFC($a0)\n"
1853 "ori $at, $zero, 0x8000\n"
1854 "daddu $at, $at, $a0\n"
1855 "lwc1 $f0, 0($at)\n"
1856 "ori $at, $zero, 0x8000\n"
1857 "daddu $at, $at, $a0\n"
1858 "lwc1 $f0, 4($at)\n"
1859 "lui $at, 1\n"
1860 "daddu $at, $at, $a0\n"
1861 "lwc1 $f0, 0($at)\n"
1862 "lui $at, 0x1234\n"
1863 "ori $at, 0x5678\n"
1864 "daddu $at, $at, $a0\n"
1865 "lwc1 $f0, 0($at)\n"
1866 "lwc1 $f0, -256($a0)\n"
1867 "lwc1 $f0, -32768($a0)\n"
1868 "lui $at, 0xABCD\n"
1869 "ori $at, 0xEF00\n"
1870 "daddu $at, $at, $a0\n"
1871 "lwc1 $f0, 0($at)\n"
1872
1873 "ldc1 $f0, 0($a0)\n"
1874 "lwc1 $f0, 4($a0)\n"
1875 "lw $t3, 8($a0)\n"
1876 "mthc1 $t3, $f0\n"
1877 "ldc1 $f0, 256($a0)\n"
1878 "ori $at, $zero, 0x7FF8\n"
1879 "daddu $at, $at, $a0\n"
1880 "lwc1 $f0, 4($at)\n"
1881 "lw $t3, 8($at)\n"
1882 "mthc1 $t3, $f0\n"
1883 "ori $at, $zero, 0x8000\n"
1884 "daddu $at, $at, $a0\n"
1885 "ldc1 $f0, 0($at)\n"
1886 "ori $at, $zero, 0x8000\n"
1887 "daddu $at, $at, $a0\n"
1888 "lwc1 $f0, 4($at)\n"
1889 "lw $t3, 8($at)\n"
1890 "mthc1 $t3, $f0\n"
1891 "lui $at, 1\n"
1892 "daddu $at, $at, $a0\n"
1893 "ldc1 $f0, 0($at)\n"
1894 "lui $at, 0x1234\n"
1895 "ori $at, 0x5678\n"
1896 "daddu $at, $at, $a0\n"
1897 "ldc1 $f0, 0($at)\n"
1898 "ldc1 $f0, -256($a0)\n"
1899 "ldc1 $f0, -32768($a0)\n"
1900 "lui $at, 0xABCD\n"
1901 "ori $at, 0xEF00\n"
1902 "daddu $at, $at, $a0\n"
1903 "ldc1 $f0, 0($at)\n";
1904 DriverStr(expected, "LoadFpuFromOffset");
1905}
1906
1907TEST_F(AssemblerMIPS64Test, StoreToOffset) {
1908 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A0, 0);
1909 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0);
1910 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 1);
1911 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 256);
1912 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 1000);
1913 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x7FFF);
1914 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x8000);
1915 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x8001);
1916 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x10000);
1917 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x12345678);
1918 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, -256);
1919 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, -32768);
1920 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0xABCDEF00);
1921
1922 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A0, 0);
1923 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0);
1924 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 2);
1925 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 256);
1926 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 1000);
1927 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x7FFE);
1928 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x8000);
1929 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x8002);
1930 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x10000);
1931 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x12345678);
1932 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, -256);
1933 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, -32768);
1934 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0xABCDEF00);
1935
1936 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A0, 0);
1937 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0);
1938 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 4);
1939 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 256);
1940 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 1000);
1941 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x7FFC);
1942 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x8000);
1943 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x8004);
1944 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x10000);
1945 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x12345678);
1946 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, -256);
1947 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, -32768);
1948 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0xABCDEF00);
1949
1950 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A0, 0);
1951 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0);
1952 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 4);
1953 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 256);
1954 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 1000);
1955 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x7FFC);
1956 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x8000);
1957 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x8004);
1958 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x10000);
1959 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x12345678);
1960 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, -256);
1961 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, -32768);
1962 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0xABCDEF00);
1963
1964 const char* expected =
1965 "sb $a0, 0($a0)\n"
1966 "sb $a0, 0($a1)\n"
1967 "sb $a0, 1($a1)\n"
1968 "sb $a0, 256($a1)\n"
1969 "sb $a0, 1000($a1)\n"
1970 "sb $a0, 0x7FFF($a1)\n"
1971 "ori $at, $zero, 0x8000\n"
1972 "daddu $at, $at, $a1\n"
1973 "sb $a0, 0($at)\n"
1974 "ori $at, $zero, 0x8000\n"
1975 "daddu $at, $at, $a1\n"
1976 "sb $a0, 1($at)\n"
1977 "lui $at, 1\n"
1978 "daddu $at, $at, $a1\n"
1979 "sb $a0, 0($at)\n"
1980 "lui $at, 0x1234\n"
1981 "ori $at, 0x5678\n"
1982 "daddu $at, $at, $a1\n"
1983 "sb $a0, 0($at)\n"
1984 "sb $a0, -256($a1)\n"
1985 "sb $a0, -32768($a1)\n"
1986 "lui $at, 0xABCD\n"
1987 "ori $at, 0xEF00\n"
1988 "daddu $at, $at, $a1\n"
1989 "sb $a0, 0($at)\n"
1990
1991 "sh $a0, 0($a0)\n"
1992 "sh $a0, 0($a1)\n"
1993 "sh $a0, 2($a1)\n"
1994 "sh $a0, 256($a1)\n"
1995 "sh $a0, 1000($a1)\n"
1996 "sh $a0, 0x7FFE($a1)\n"
1997 "ori $at, $zero, 0x8000\n"
1998 "daddu $at, $at, $a1\n"
1999 "sh $a0, 0($at)\n"
2000 "ori $at, $zero, 0x8000\n"
2001 "daddu $at, $at, $a1\n"
2002 "sh $a0, 2($at)\n"
2003 "lui $at, 1\n"
2004 "daddu $at, $at, $a1\n"
2005 "sh $a0, 0($at)\n"
2006 "lui $at, 0x1234\n"
2007 "ori $at, 0x5678\n"
2008 "daddu $at, $at, $a1\n"
2009 "sh $a0, 0($at)\n"
2010 "sh $a0, -256($a1)\n"
2011 "sh $a0, -32768($a1)\n"
2012 "lui $at, 0xABCD\n"
2013 "ori $at, 0xEF00\n"
2014 "daddu $at, $at, $a1\n"
2015 "sh $a0, 0($at)\n"
2016
2017 "sw $a0, 0($a0)\n"
2018 "sw $a0, 0($a1)\n"
2019 "sw $a0, 4($a1)\n"
2020 "sw $a0, 256($a1)\n"
2021 "sw $a0, 1000($a1)\n"
2022 "sw $a0, 0x7FFC($a1)\n"
2023 "ori $at, $zero, 0x8000\n"
2024 "daddu $at, $at, $a1\n"
2025 "sw $a0, 0($at)\n"
2026 "ori $at, $zero, 0x8000\n"
2027 "daddu $at, $at, $a1\n"
2028 "sw $a0, 4($at)\n"
2029 "lui $at, 1\n"
2030 "daddu $at, $at, $a1\n"
2031 "sw $a0, 0($at)\n"
2032 "lui $at, 0x1234\n"
2033 "ori $at, 0x5678\n"
2034 "daddu $at, $at, $a1\n"
2035 "sw $a0, 0($at)\n"
2036 "sw $a0, -256($a1)\n"
2037 "sw $a0, -32768($a1)\n"
2038 "lui $at, 0xABCD\n"
2039 "ori $at, 0xEF00\n"
2040 "daddu $at, $at, $a1\n"
2041 "sw $a0, 0($at)\n"
2042
2043 "sd $a0, 0($a0)\n"
2044 "sd $a0, 0($a1)\n"
2045 "sw $a0, 4($a1)\n"
2046 "dsrl32 $t3, $a0, 0\n"
2047 "sw $t3, 8($a1)\n"
2048 "sd $a0, 256($a1)\n"
2049 "sd $a0, 1000($a1)\n"
2050 "ori $at, $zero, 0x7FF8\n"
2051 "daddu $at, $at, $a1\n"
2052 "sw $a0, 4($at)\n"
2053 "dsrl32 $t3, $a0, 0\n"
2054 "sw $t3, 8($at)\n"
2055 "ori $at, $zero, 0x8000\n"
2056 "daddu $at, $at, $a1\n"
2057 "sd $a0, 0($at)\n"
2058 "ori $at, $zero, 0x8000\n"
2059 "daddu $at, $at, $a1\n"
2060 "sw $a0, 4($at)\n"
2061 "dsrl32 $t3, $a0, 0\n"
2062 "sw $t3, 8($at)\n"
2063 "lui $at, 1\n"
2064 "daddu $at, $at, $a1\n"
2065 "sd $a0, 0($at)\n"
2066 "lui $at, 0x1234\n"
2067 "ori $at, 0x5678\n"
2068 "daddu $at, $at, $a1\n"
2069 "sd $a0, 0($at)\n"
2070 "sd $a0, -256($a1)\n"
2071 "sd $a0, -32768($a1)\n"
2072 "lui $at, 0xABCD\n"
2073 "ori $at, 0xEF00\n"
2074 "daddu $at, $at, $a1\n"
2075 "sd $a0, 0($at)\n";
2076 DriverStr(expected, "StoreToOffset");
2077}
2078
2079TEST_F(AssemblerMIPS64Test, StoreFpuToOffset) {
2080 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0);
2081 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 4);
2082 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 256);
2083 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x7FFC);
2084 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x8000);
2085 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x8004);
2086 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x10000);
2087 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x12345678);
2088 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, -256);
2089 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, -32768);
2090 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0xABCDEF00);
2091
2092 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0);
2093 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 4);
2094 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 256);
2095 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x7FFC);
2096 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x8000);
2097 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x8004);
2098 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x10000);
2099 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x12345678);
2100 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, -256);
2101 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, -32768);
2102 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0xABCDEF00);
2103
2104 const char* expected =
2105 "swc1 $f0, 0($a0)\n"
2106 "swc1 $f0, 4($a0)\n"
2107 "swc1 $f0, 256($a0)\n"
2108 "swc1 $f0, 0x7FFC($a0)\n"
2109 "ori $at, $zero, 0x8000\n"
2110 "daddu $at, $at, $a0\n"
2111 "swc1 $f0, 0($at)\n"
2112 "ori $at, $zero, 0x8000\n"
2113 "daddu $at, $at, $a0\n"
2114 "swc1 $f0, 4($at)\n"
2115 "lui $at, 1\n"
2116 "daddu $at, $at, $a0\n"
2117 "swc1 $f0, 0($at)\n"
2118 "lui $at, 0x1234\n"
2119 "ori $at, 0x5678\n"
2120 "daddu $at, $at, $a0\n"
2121 "swc1 $f0, 0($at)\n"
2122 "swc1 $f0, -256($a0)\n"
2123 "swc1 $f0, -32768($a0)\n"
2124 "lui $at, 0xABCD\n"
2125 "ori $at, 0xEF00\n"
2126 "daddu $at, $at, $a0\n"
2127 "swc1 $f0, 0($at)\n"
2128
2129 "sdc1 $f0, 0($a0)\n"
2130 "mfhc1 $t3, $f0\n"
2131 "swc1 $f0, 4($a0)\n"
2132 "sw $t3, 8($a0)\n"
2133 "sdc1 $f0, 256($a0)\n"
2134 "ori $at, $zero, 0x7FF8\n"
2135 "daddu $at, $at, $a0\n"
2136 "mfhc1 $t3, $f0\n"
2137 "swc1 $f0, 4($at)\n"
2138 "sw $t3, 8($at)\n"
2139 "ori $at, $zero, 0x8000\n"
2140 "daddu $at, $at, $a0\n"
2141 "sdc1 $f0, 0($at)\n"
2142 "ori $at, $zero, 0x8000\n"
2143 "daddu $at, $at, $a0\n"
2144 "mfhc1 $t3, $f0\n"
2145 "swc1 $f0, 4($at)\n"
2146 "sw $t3, 8($at)\n"
2147 "lui $at, 1\n"
2148 "daddu $at, $at, $a0\n"
2149 "sdc1 $f0, 0($at)\n"
2150 "lui $at, 0x1234\n"
2151 "ori $at, 0x5678\n"
2152 "daddu $at, $at, $a0\n"
2153 "sdc1 $f0, 0($at)\n"
2154 "sdc1 $f0, -256($a0)\n"
2155 "sdc1 $f0, -32768($a0)\n"
2156 "lui $at, 0xABCD\n"
2157 "ori $at, 0xEF00\n"
2158 "daddu $at, $at, $a0\n"
2159 "sdc1 $f0, 0($at)\n";
2160 DriverStr(expected, "StoreFpuToOffset");
2161}
2162
Alexey Frunze0960ac52016-12-20 17:24:59 -08002163//////////////////////////////
2164// Loading/adding Constants //
2165//////////////////////////////
Chris Larsenc733dca2016-05-13 16:11:47 -07002166
2167TEST_F(AssemblerMIPS64Test, LoadConst32) {
2168 // IsUint<16>(value)
2169 __ LoadConst32(mips64::V0, 0);
2170 __ LoadConst32(mips64::V0, 65535);
2171 // IsInt<16>(value)
2172 __ LoadConst32(mips64::V0, -1);
2173 __ LoadConst32(mips64::V0, -32768);
2174 // Everything else
2175 __ LoadConst32(mips64::V0, 65536);
2176 __ LoadConst32(mips64::V0, 65537);
2177 __ LoadConst32(mips64::V0, 2147483647);
2178 __ LoadConst32(mips64::V0, -32769);
2179 __ LoadConst32(mips64::V0, -65536);
2180 __ LoadConst32(mips64::V0, -65537);
2181 __ LoadConst32(mips64::V0, -2147483647);
2182 __ LoadConst32(mips64::V0, -2147483648);
2183
2184 const char* expected =
2185 // IsUint<16>(value)
2186 "ori $v0, $zero, 0\n" // __ LoadConst32(mips64::V0, 0);
2187 "ori $v0, $zero, 65535\n" // __ LoadConst32(mips64::V0, 65535);
2188 // IsInt<16>(value)
2189 "addiu $v0, $zero, -1\n" // __ LoadConst32(mips64::V0, -1);
2190 "addiu $v0, $zero, -32768\n" // __ LoadConst32(mips64::V0, -32768);
2191 // Everything else
2192 "lui $v0, 1\n" // __ LoadConst32(mips64::V0, 65536);
2193 "lui $v0, 1\n" // __ LoadConst32(mips64::V0, 65537);
2194 "ori $v0, 1\n" // "
2195 "lui $v0, 32767\n" // __ LoadConst32(mips64::V0, 2147483647);
2196 "ori $v0, 65535\n" // "
2197 "lui $v0, 65535\n" // __ LoadConst32(mips64::V0, -32769);
2198 "ori $v0, 32767\n" // "
2199 "lui $v0, 65535\n" // __ LoadConst32(mips64::V0, -65536);
2200 "lui $v0, 65534\n" // __ LoadConst32(mips64::V0, -65537);
2201 "ori $v0, 65535\n" // "
2202 "lui $v0, 32768\n" // __ LoadConst32(mips64::V0, -2147483647);
2203 "ori $v0, 1\n" // "
2204 "lui $v0, 32768\n"; // __ LoadConst32(mips64::V0, -2147483648);
2205 DriverStr(expected, "LoadConst32");
2206}
2207
Alexey Frunze0960ac52016-12-20 17:24:59 -08002208TEST_F(AssemblerMIPS64Test, Addiu32) {
2209 __ Addiu32(mips64::A1, mips64::A2, -0x8000);
2210 __ Addiu32(mips64::A1, mips64::A2, +0);
2211 __ Addiu32(mips64::A1, mips64::A2, +0x7FFF);
2212 __ Addiu32(mips64::A1, mips64::A2, -0x8001);
2213 __ Addiu32(mips64::A1, mips64::A2, +0x8000);
2214 __ Addiu32(mips64::A1, mips64::A2, -0x10000);
2215 __ Addiu32(mips64::A1, mips64::A2, +0x10000);
2216 __ Addiu32(mips64::A1, mips64::A2, +0x12345678);
2217
2218 const char* expected =
2219 "addiu $a1, $a2, -0x8000\n"
2220 "addiu $a1, $a2, 0\n"
2221 "addiu $a1, $a2, 0x7FFF\n"
2222 "aui $a1, $a2, 0xFFFF\n"
2223 "addiu $a1, $a1, 0x7FFF\n"
2224 "aui $a1, $a2, 1\n"
2225 "addiu $a1, $a1, -0x8000\n"
2226 "aui $a1, $a2, 0xFFFF\n"
2227 "aui $a1, $a2, 1\n"
2228 "aui $a1, $a2, 0x1234\n"
2229 "addiu $a1, $a1, 0x5678\n";
2230 DriverStr(expected, "Addiu32");
2231}
2232
Chris Larsenc733dca2016-05-13 16:11:47 -07002233static uint64_t SignExtend16To64(uint16_t n) {
2234 return static_cast<int16_t>(n);
2235}
2236
2237// The art::mips64::Mips64Assembler::LoadConst64() method uses a template
2238// to minimize the number of instructions needed to load a 64-bit constant
2239// value into a register. The template calls various methods which emit
2240// MIPS machine instructions. This struct (class) uses the same template
2241// but overrides the definitions of the methods which emit MIPS instructions
2242// to use methods which simulate the operation of the corresponding MIPS
2243// instructions. After invoking LoadConst64() the target register should
2244// contain the same 64-bit value as was input to LoadConst64(). If the
2245// simulated register doesn't contain the correct value then there is probably
2246// an error in the template function.
2247struct LoadConst64Tester {
2248 LoadConst64Tester() {
2249 // Initialize all of the registers for simulation to zero.
2250 for (int r = 0; r < 32; r++) {
2251 regs_[r] = 0;
2252 }
2253 // Clear all of the path flags.
2254 loadconst64_paths_ = art::mips64::kLoadConst64PathZero;
2255 }
2256 void Addiu(mips64::GpuRegister rd, mips64::GpuRegister rs, uint16_t c) {
2257 regs_[rd] = static_cast<int32_t>(regs_[rs] + SignExtend16To64(c));
2258 }
2259 void Daddiu(mips64::GpuRegister rd, mips64::GpuRegister rs, uint16_t c) {
2260 regs_[rd] = regs_[rs] + SignExtend16To64(c);
2261 }
2262 void Dahi(mips64::GpuRegister rd, uint16_t c) {
2263 regs_[rd] += SignExtend16To64(c) << 32;
2264 }
2265 void Dati(mips64::GpuRegister rd, uint16_t c) {
2266 regs_[rd] += SignExtend16To64(c) << 48;
2267 }
2268 void Dinsu(mips64::GpuRegister rt, mips64::GpuRegister rs, int pos, int size) {
2269 CHECK(IsUint<5>(pos - 32)) << pos;
2270 CHECK(IsUint<5>(size - 1)) << size;
2271 CHECK(IsUint<5>(pos + size - 33)) << pos << " + " << size;
2272 uint64_t src_mask = (UINT64_C(1) << size) - 1;
2273 uint64_t dsk_mask = ~(src_mask << pos);
2274
2275 regs_[rt] = (regs_[rt] & dsk_mask) | ((regs_[rs] & src_mask) << pos);
2276 }
2277 void Dsll(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2278 regs_[rd] = regs_[rt] << (shamt & 0x1f);
2279 }
2280 void Dsll32(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2281 regs_[rd] = regs_[rt] << (32 + (shamt & 0x1f));
2282 }
2283 void Dsrl(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2284 regs_[rd] = regs_[rt] >> (shamt & 0x1f);
2285 }
2286 void Dsrl32(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2287 regs_[rd] = regs_[rt] >> (32 + (shamt & 0x1f));
2288 }
2289 void Lui(mips64::GpuRegister rd, uint16_t c) {
2290 regs_[rd] = SignExtend16To64(c) << 16;
2291 }
2292 void Ori(mips64::GpuRegister rd, mips64::GpuRegister rs, uint16_t c) {
2293 regs_[rd] = regs_[rs] | c;
2294 }
2295 void LoadConst32(mips64::GpuRegister rd, int32_t c) {
2296 CHECK_NE(rd, 0);
2297 mips64::TemplateLoadConst32<LoadConst64Tester>(this, rd, c);
2298 CHECK_EQ(regs_[rd], static_cast<uint64_t>(c));
2299 }
2300 void LoadConst64(mips64::GpuRegister rd, int64_t c) {
2301 CHECK_NE(rd, 0);
2302 mips64::TemplateLoadConst64<LoadConst64Tester>(this, rd, c);
2303 CHECK_EQ(regs_[rd], static_cast<uint64_t>(c));
2304 }
2305 uint64_t regs_[32];
2306
2307 // Getter function for loadconst64_paths_.
2308 int GetPathsCovered() {
2309 return loadconst64_paths_;
2310 }
2311
2312 void RecordLoadConst64Path(int value) {
2313 loadconst64_paths_ |= value;
2314 }
2315
2316 private:
2317 // This variable holds a bitmask to tell us which paths were taken
2318 // through the template function which loads 64-bit values.
2319 int loadconst64_paths_;
2320};
2321
2322TEST_F(AssemblerMIPS64Test, LoadConst64) {
2323 const uint16_t imms[] = {
2324 0, 1, 2, 3, 4, 0x33, 0x66, 0x55, 0x99, 0xaa, 0xcc, 0xff, 0x5500, 0x5555,
2325 0x7ffc, 0x7ffd, 0x7ffe, 0x7fff, 0x8000, 0x8001, 0x8002, 0x8003, 0x8004,
2326 0xaaaa, 0xfffc, 0xfffd, 0xfffe, 0xffff
2327 };
2328 unsigned d0, d1, d2, d3;
2329 LoadConst64Tester tester;
2330
2331 union {
2332 int64_t v64;
2333 uint16_t v16[4];
2334 } u;
2335
2336 for (d3 = 0; d3 < sizeof imms / sizeof imms[0]; d3++) {
2337 u.v16[3] = imms[d3];
2338
2339 for (d2 = 0; d2 < sizeof imms / sizeof imms[0]; d2++) {
2340 u.v16[2] = imms[d2];
2341
2342 for (d1 = 0; d1 < sizeof imms / sizeof imms[0]; d1++) {
2343 u.v16[1] = imms[d1];
2344
2345 for (d0 = 0; d0 < sizeof imms / sizeof imms[0]; d0++) {
2346 u.v16[0] = imms[d0];
2347
2348 tester.LoadConst64(mips64::V0, u.v64);
2349 }
2350 }
2351 }
2352 }
2353
2354 // Verify that we tested all paths through the "load 64-bit value"
2355 // function template.
2356 EXPECT_EQ(tester.GetPathsCovered(), art::mips64::kLoadConst64PathAllPaths);
2357}
2358
Lazar Trsicd9672662015-09-03 17:33:01 +02002359#undef __
2360
Chris Larsendbce0d72015-09-17 13:34:00 -07002361} // namespace art