blob: e5d3605b015079a33f12c50381cf2f8f13c107e6 [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,
Aart Bik219bf252017-03-15 20:37:50 +000040 uint32_t> {
Chris Larsendbce0d72015-09-17 13:34:00 -070041 public:
42 typedef AssemblerTest<mips64::Mips64Assembler,
43 mips64::GpuRegister,
44 mips64::FpuRegister,
Aart Bik219bf252017-03-15 20:37:50 +000045 uint32_t> Base;
Chris Larsendbce0d72015-09-17 13:34:00 -070046
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).
Aart Bik219bf252017-03-15 20:37:50 +000063 return " -march=mips64r6 -Wa,--no-warn -Wl,-Ttext=0 -Wl,-e0 -nostdlib";
Alexey Frunzea0e87b02015-09-24 22:57:20 -070064 }
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
Alexey Frunzec061de12017-02-14 13:27:23 -08001272TEST_F(AssemblerMIPS64Test, Daui) {
1273 std::vector<mips64::GpuRegister*> reg1_registers = GetRegisters();
1274 std::vector<mips64::GpuRegister*> reg2_registers = GetRegisters();
1275 reg2_registers.erase(reg2_registers.begin()); // reg2 can't be ZERO, remove it.
1276 std::vector<int64_t> imms = CreateImmediateValuesBits(/* imm_bits */ 16, /* as_uint */ true);
1277 WarnOnCombinations(reg1_registers.size() * reg2_registers.size() * imms.size());
1278 std::ostringstream expected;
1279 for (mips64::GpuRegister* reg1 : reg1_registers) {
1280 for (mips64::GpuRegister* reg2 : reg2_registers) {
1281 for (int64_t imm : imms) {
1282 __ Daui(*reg1, *reg2, imm);
1283 expected << "daui $" << *reg1 << ", $" << *reg2 << ", " << imm << "\n";
1284 }
1285 }
1286 }
1287 DriverStr(expected.str(), "daui");
1288}
1289
Goran Jakovljevic95f27142017-01-20 11:11:11 +01001290TEST_F(AssemblerMIPS64Test, Dahi) {
1291 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Dahi, 16, "dahi ${reg}, ${reg}, {imm}"), "dahi");
1292}
1293
1294TEST_F(AssemblerMIPS64Test, Dati) {
1295 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Dati, 16, "dati ${reg}, ${reg}, {imm}"), "dati");
1296}
1297
1298TEST_F(AssemblerMIPS64Test, Sb) {
1299 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sb, -16, "sb ${reg1}, {imm}(${reg2})"), "sb");
1300}
1301
1302TEST_F(AssemblerMIPS64Test, Sh) {
1303 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sh, -16, "sh ${reg1}, {imm}(${reg2})"), "sh");
1304}
1305
1306TEST_F(AssemblerMIPS64Test, Sw) {
1307 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sw, -16, "sw ${reg1}, {imm}(${reg2})"), "sw");
1308}
1309
1310TEST_F(AssemblerMIPS64Test, Sd) {
1311 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sd, -16, "sd ${reg1}, {imm}(${reg2})"), "sd");
1312}
1313
1314TEST_F(AssemblerMIPS64Test, Slt) {
1315 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Slt, "slt ${reg1}, ${reg2}, ${reg3}"), "slt");
1316}
1317
1318TEST_F(AssemblerMIPS64Test, Sltu) {
1319 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Sltu, "sltu ${reg1}, ${reg2}, ${reg3}"), "sltu");
1320}
1321
1322TEST_F(AssemblerMIPS64Test, Slti) {
1323 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Slti, -16, "slti ${reg1}, ${reg2}, {imm}"),
1324 "slti");
1325}
1326
1327TEST_F(AssemblerMIPS64Test, Sltiu) {
1328 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sltiu, -16, "sltiu ${reg1}, ${reg2}, {imm}"),
1329 "sltiu");
1330}
1331
1332TEST_F(AssemblerMIPS64Test, Move) {
1333 DriverStr(RepeatRR(&mips64::Mips64Assembler::Move, "or ${reg1}, ${reg2}, $zero"), "move");
1334}
1335
1336TEST_F(AssemblerMIPS64Test, Clear) {
1337 DriverStr(RepeatR(&mips64::Mips64Assembler::Clear, "or ${reg}, $zero, $zero"), "clear");
1338}
1339
1340TEST_F(AssemblerMIPS64Test, Not) {
1341 DriverStr(RepeatRR(&mips64::Mips64Assembler::Not, "nor ${reg1}, ${reg2}, $zero"), "not");
1342}
1343
Chris Larsendbce0d72015-09-17 13:34:00 -07001344TEST_F(AssemblerMIPS64Test, Bitswap) {
1345 DriverStr(RepeatRR(&mips64::Mips64Assembler::Bitswap, "bitswap ${reg1}, ${reg2}"), "bitswap");
1346}
1347
1348TEST_F(AssemblerMIPS64Test, Dbitswap) {
1349 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dbitswap, "dbitswap ${reg1}, ${reg2}"), "dbitswap");
1350}
1351
Chris Larsen51417632015-10-02 13:24:25 -07001352TEST_F(AssemblerMIPS64Test, Seb) {
1353 DriverStr(RepeatRR(&mips64::Mips64Assembler::Seb, "seb ${reg1}, ${reg2}"), "seb");
1354}
1355
1356TEST_F(AssemblerMIPS64Test, Seh) {
1357 DriverStr(RepeatRR(&mips64::Mips64Assembler::Seh, "seh ${reg1}, ${reg2}"), "seh");
1358}
1359
Chris Larsendbce0d72015-09-17 13:34:00 -07001360TEST_F(AssemblerMIPS64Test, Dsbh) {
1361 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dsbh, "dsbh ${reg1}, ${reg2}"), "dsbh");
1362}
1363
1364TEST_F(AssemblerMIPS64Test, Dshd) {
1365 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dshd, "dshd ${reg1}, ${reg2}"), "dshd");
1366}
1367
Lazar Trsicd9672662015-09-03 17:33:01 +02001368TEST_F(AssemblerMIPS64Test, Dext) {
1369 std::vector<mips64::GpuRegister*> reg1_registers = GetRegisters();
1370 std::vector<mips64::GpuRegister*> reg2_registers = GetRegisters();
1371 WarnOnCombinations(reg1_registers.size() * reg2_registers.size() * 33 * 16);
1372 std::ostringstream expected;
1373 for (mips64::GpuRegister* reg1 : reg1_registers) {
1374 for (mips64::GpuRegister* reg2 : reg2_registers) {
1375 for (int32_t pos = 0; pos < 32; pos++) {
1376 for (int32_t size = 1; size <= 32; size++) {
1377 __ Dext(*reg1, *reg2, pos, size);
1378 expected << "dext $" << *reg1 << ", $" << *reg2 << ", " << pos << ", " << size << "\n";
1379 }
1380 }
1381 }
1382 }
1383
1384 DriverStr(expected.str(), "Dext");
1385}
1386
1387TEST_F(AssemblerMIPS64Test, Dinsu) {
1388 std::vector<mips64::GpuRegister*> reg1_registers = GetRegisters();
1389 std::vector<mips64::GpuRegister*> reg2_registers = GetRegisters();
1390 WarnOnCombinations(reg1_registers.size() * reg2_registers.size() * 33 * 16);
1391 std::ostringstream expected;
1392 for (mips64::GpuRegister* reg1 : reg1_registers) {
1393 for (mips64::GpuRegister* reg2 : reg2_registers) {
1394 for (int32_t pos = 32; pos < 64; pos++) {
1395 for (int32_t size = 1; pos + size <= 64; size++) {
1396 __ Dinsu(*reg1, *reg2, pos, size);
1397 expected << "dinsu $" << *reg1 << ", $" << *reg2 << ", " << pos << ", " << size << "\n";
1398 }
1399 }
1400 }
1401 }
1402
1403 DriverStr(expected.str(), "Dinsu");
1404}
1405
Chris Larsene3660592016-11-09 11:13:42 -08001406TEST_F(AssemblerMIPS64Test, Lsa) {
1407 DriverStr(RepeatRRRIb(&mips64::Mips64Assembler::Lsa,
1408 2,
1409 "lsa ${reg1}, ${reg2}, ${reg3}, {imm}",
1410 1),
1411 "lsa");
1412}
1413
1414TEST_F(AssemblerMIPS64Test, Dlsa) {
1415 DriverStr(RepeatRRRIb(&mips64::Mips64Assembler::Dlsa,
1416 2,
1417 "dlsa ${reg1}, ${reg2}, ${reg3}, {imm}",
1418 1),
1419 "dlsa");
1420}
1421
Chris Larsendbce0d72015-09-17 13:34:00 -07001422TEST_F(AssemblerMIPS64Test, Wsbh) {
1423 DriverStr(RepeatRR(&mips64::Mips64Assembler::Wsbh, "wsbh ${reg1}, ${reg2}"), "wsbh");
1424}
1425
Chris Larsen51417632015-10-02 13:24:25 -07001426TEST_F(AssemblerMIPS64Test, Sll) {
1427 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sll, 5, "sll ${reg1}, ${reg2}, {imm}"), "sll");
1428}
1429
1430TEST_F(AssemblerMIPS64Test, Srl) {
1431 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Srl, 5, "srl ${reg1}, ${reg2}, {imm}"), "srl");
1432}
1433
Chris Larsen98a73e12015-10-19 14:17:16 -07001434TEST_F(AssemblerMIPS64Test, Rotr) {
1435 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Rotr, 5, "rotr ${reg1}, ${reg2}, {imm}"), "rotr");
1436}
1437
Chris Larsen51417632015-10-02 13:24:25 -07001438TEST_F(AssemblerMIPS64Test, Sra) {
1439 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sra, 5, "sra ${reg1}, ${reg2}, {imm}"), "sra");
1440}
1441
Chris Larsen98a73e12015-10-19 14:17:16 -07001442TEST_F(AssemblerMIPS64Test, Sllv) {
1443 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Sllv, "sllv ${reg1}, ${reg2}, ${reg3}"), "sllv");
1444}
1445
1446TEST_F(AssemblerMIPS64Test, Srlv) {
1447 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Srlv, "srlv ${reg1}, ${reg2}, ${reg3}"), "srlv");
1448}
1449
1450TEST_F(AssemblerMIPS64Test, Rotrv) {
1451 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Rotrv, "rotrv ${reg1}, ${reg2}, ${reg3}"), "rotrv");
1452}
1453
1454TEST_F(AssemblerMIPS64Test, Srav) {
1455 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Srav, "srav ${reg1}, ${reg2}, ${reg3}"), "srav");
1456}
1457
Chris Larsen51417632015-10-02 13:24:25 -07001458TEST_F(AssemblerMIPS64Test, Dsll) {
1459 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsll, 5, "dsll ${reg1}, ${reg2}, {imm}"), "dsll");
1460}
1461
1462TEST_F(AssemblerMIPS64Test, Dsrl) {
1463 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsrl, 5, "dsrl ${reg1}, ${reg2}, {imm}"), "dsrl");
1464}
1465
Chris Larsen98a73e12015-10-19 14:17:16 -07001466TEST_F(AssemblerMIPS64Test, Drotr) {
1467 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Drotr, 5, "drotr ${reg1}, ${reg2}, {imm}"),
1468 "drotr");
1469}
1470
Chris Larsen51417632015-10-02 13:24:25 -07001471TEST_F(AssemblerMIPS64Test, Dsra) {
1472 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsra, 5, "dsra ${reg1}, ${reg2}, {imm}"), "dsra");
1473}
1474
1475TEST_F(AssemblerMIPS64Test, Dsll32) {
Chris Larsen98a73e12015-10-19 14:17:16 -07001476 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsll32, 5, "dsll32 ${reg1}, ${reg2}, {imm}"),
1477 "dsll32");
Chris Larsen51417632015-10-02 13:24:25 -07001478}
1479
1480TEST_F(AssemblerMIPS64Test, Dsrl32) {
Chris Larsen98a73e12015-10-19 14:17:16 -07001481 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsrl32, 5, "dsrl32 ${reg1}, ${reg2}, {imm}"),
1482 "dsrl32");
1483}
1484
1485TEST_F(AssemblerMIPS64Test, Drotr32) {
1486 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Drotr32, 5, "drotr32 ${reg1}, ${reg2}, {imm}"),
1487 "drotr32");
Chris Larsen51417632015-10-02 13:24:25 -07001488}
1489
1490TEST_F(AssemblerMIPS64Test, Dsra32) {
Chris Larsen98a73e12015-10-19 14:17:16 -07001491 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsra32, 5, "dsra32 ${reg1}, ${reg2}, {imm}"),
1492 "dsra32");
Chris Larsen51417632015-10-02 13:24:25 -07001493}
1494
Goran Jakovljevic95f27142017-01-20 11:11:11 +01001495TEST_F(AssemblerMIPS64Test, Dsllv) {
1496 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dsllv, "dsllv ${reg1}, ${reg2}, ${reg3}"), "dsllv");
1497}
1498
1499TEST_F(AssemblerMIPS64Test, Dsrlv) {
1500 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dsrlv, "dsrlv ${reg1}, ${reg2}, ${reg3}"), "dsrlv");
1501}
1502
1503TEST_F(AssemblerMIPS64Test, Dsrav) {
1504 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dsrav, "dsrav ${reg1}, ${reg2}, ${reg3}"), "dsrav");
1505}
1506
Chris Larsendbce0d72015-09-17 13:34:00 -07001507TEST_F(AssemblerMIPS64Test, Sc) {
1508 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sc, -9, "sc ${reg1}, {imm}(${reg2})"), "sc");
1509}
1510
1511TEST_F(AssemblerMIPS64Test, Scd) {
1512 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Scd, -9, "scd ${reg1}, {imm}(${reg2})"), "scd");
1513}
1514
1515TEST_F(AssemblerMIPS64Test, Ll) {
1516 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Ll, -9, "ll ${reg1}, {imm}(${reg2})"), "ll");
1517}
1518
1519TEST_F(AssemblerMIPS64Test, Lld) {
1520 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lld, -9, "lld ${reg1}, {imm}(${reg2})"), "lld");
1521}
1522
Chris Larsendbce0d72015-09-17 13:34:00 -07001523TEST_F(AssemblerMIPS64Test, Seleqz) {
1524 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Seleqz, "seleqz ${reg1}, ${reg2}, ${reg3}"),
1525 "seleqz");
1526}
1527
1528TEST_F(AssemblerMIPS64Test, Selnez) {
1529 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Selnez, "selnez ${reg1}, ${reg2}, ${reg3}"),
1530 "selnez");
1531}
1532
1533TEST_F(AssemblerMIPS64Test, Clz) {
1534 DriverStr(RepeatRR(&mips64::Mips64Assembler::Clz, "clz ${reg1}, ${reg2}"), "clz");
1535}
1536
1537TEST_F(AssemblerMIPS64Test, Clo) {
1538 DriverStr(RepeatRR(&mips64::Mips64Assembler::Clo, "clo ${reg1}, ${reg2}"), "clo");
1539}
1540
1541TEST_F(AssemblerMIPS64Test, Dclz) {
1542 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dclz, "dclz ${reg1}, ${reg2}"), "dclz");
1543}
1544
1545TEST_F(AssemblerMIPS64Test, Dclo) {
1546 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dclo, "dclo ${reg1}, ${reg2}"), "dclo");
1547}
1548
Lazar Trsicd9672662015-09-03 17:33:01 +02001549TEST_F(AssemblerMIPS64Test, LoadFromOffset) {
1550 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A0, 0);
1551 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0);
1552 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 1);
1553 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 256);
1554 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 1000);
1555 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x7FFF);
1556 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x8000);
1557 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x8001);
1558 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x10000);
1559 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x12345678);
1560 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, -256);
1561 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, -32768);
1562 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001563 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x7FFFFFFE);
1564 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x7FFFFFFF);
1565 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x80000000);
1566 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x80000001);
Lazar Trsicd9672662015-09-03 17:33:01 +02001567
1568 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A0, 0);
1569 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0);
1570 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 1);
1571 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 256);
1572 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 1000);
1573 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x7FFF);
1574 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x8000);
1575 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x8001);
1576 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x10000);
1577 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x12345678);
1578 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, -256);
1579 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, -32768);
1580 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001581 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x7FFFFFFE);
1582 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x7FFFFFFF);
1583 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x80000000);
1584 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x80000001);
Lazar Trsicd9672662015-09-03 17:33:01 +02001585
1586 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A0, 0);
1587 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0);
1588 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 2);
1589 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 256);
1590 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 1000);
1591 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x7FFE);
1592 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x8000);
1593 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x8002);
1594 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x10000);
1595 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x12345678);
1596 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, -256);
1597 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, -32768);
1598 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001599 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x7FFFFFFC);
1600 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x7FFFFFFE);
1601 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x80000000);
1602 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x80000002);
Lazar Trsicd9672662015-09-03 17:33:01 +02001603
1604 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A0, 0);
1605 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0);
1606 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 2);
1607 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 256);
1608 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 1000);
1609 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x7FFE);
1610 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x8000);
1611 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x8002);
1612 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x10000);
1613 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x12345678);
1614 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, -256);
1615 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, -32768);
1616 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001617 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x7FFFFFFC);
1618 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x7FFFFFFE);
1619 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x80000000);
1620 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x80000002);
Lazar Trsicd9672662015-09-03 17:33:01 +02001621
1622 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A0, 0);
1623 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0);
1624 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 4);
1625 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 256);
1626 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 1000);
1627 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x7FFC);
1628 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x8000);
1629 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x8004);
1630 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x10000);
1631 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x12345678);
1632 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, -256);
1633 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, -32768);
1634 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001635 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x7FFFFFF8);
1636 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x7FFFFFFC);
1637 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x80000000);
1638 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x80000004);
Lazar Trsicd9672662015-09-03 17:33:01 +02001639
1640 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A0, 0);
1641 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0);
1642 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 4);
1643 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 256);
1644 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 1000);
1645 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x7FFC);
1646 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x8000);
1647 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x8004);
1648 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x10000);
1649 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x12345678);
1650 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, -256);
1651 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, -32768);
1652 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001653 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x7FFFFFF8);
1654 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x7FFFFFFC);
1655 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x80000000);
1656 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x80000004);
Lazar Trsicd9672662015-09-03 17:33:01 +02001657
1658 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A0, 0);
1659 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0);
1660 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 4);
1661 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 256);
1662 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 1000);
1663 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x7FFC);
1664 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x8000);
1665 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x8004);
1666 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x10000);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001667 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x27FFC);
Lazar Trsicd9672662015-09-03 17:33:01 +02001668 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x12345678);
1669 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, -256);
1670 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, -32768);
1671 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001672 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x7FFFFFF8);
1673 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x7FFFFFFC);
1674 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x80000000);
1675 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x80000004);
Lazar Trsicd9672662015-09-03 17:33:01 +02001676
1677 const char* expected =
1678 "lb $a0, 0($a0)\n"
1679 "lb $a0, 0($a1)\n"
1680 "lb $a0, 1($a1)\n"
1681 "lb $a0, 256($a1)\n"
1682 "lb $a0, 1000($a1)\n"
1683 "lb $a0, 0x7FFF($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001684 "daddiu $at, $a1, 0x7FF8\n"
1685 "lb $a0, 8($at)\n"
1686 "daddiu $at, $a1, 32760\n"
1687 "lb $a0, 9($at)\n"
1688 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001689 "lb $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001690 "daui $at, $a1, 0x1234\n"
1691 "lb $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001692 "lb $a0, -256($a1)\n"
1693 "lb $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001694 "daui $at, $a1, 0xABCE\n"
1695 "lb $a0, -4352($at)\n"
1696 "daui $at, $a1, 32768\n"
1697 "dahi $at, $at, 1\n"
1698 "lb $a0, -2($at)\n"
1699 "daui $at, $a1, 32768\n"
1700 "dahi $at, $at, 1\n"
1701 "lb $a0, -1($at)\n"
1702 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001703 "lb $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001704 "daui $at, $a1, 32768\n"
1705 "lb $a0, 1($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001706
1707 "lbu $a0, 0($a0)\n"
1708 "lbu $a0, 0($a1)\n"
1709 "lbu $a0, 1($a1)\n"
1710 "lbu $a0, 256($a1)\n"
1711 "lbu $a0, 1000($a1)\n"
1712 "lbu $a0, 0x7FFF($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001713 "daddiu $at, $a1, 0x7FF8\n"
1714 "lbu $a0, 8($at)\n"
1715 "daddiu $at, $a1, 32760\n"
1716 "lbu $a0, 9($at)\n"
1717 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001718 "lbu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001719 "daui $at, $a1, 0x1234\n"
1720 "lbu $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001721 "lbu $a0, -256($a1)\n"
1722 "lbu $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001723 "daui $at, $a1, 0xABCE\n"
1724 "lbu $a0, -4352($at)\n"
1725 "daui $at, $a1, 32768\n"
1726 "dahi $at, $at, 1\n"
1727 "lbu $a0, -2($at)\n"
1728 "daui $at, $a1, 32768\n"
1729 "dahi $at, $at, 1\n"
1730 "lbu $a0, -1($at)\n"
1731 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001732 "lbu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001733 "daui $at, $a1, 32768\n"
1734 "lbu $a0, 1($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001735
1736 "lh $a0, 0($a0)\n"
1737 "lh $a0, 0($a1)\n"
1738 "lh $a0, 2($a1)\n"
1739 "lh $a0, 256($a1)\n"
1740 "lh $a0, 1000($a1)\n"
1741 "lh $a0, 0x7FFE($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001742 "daddiu $at, $a1, 0x7FF8\n"
1743 "lh $a0, 8($at)\n"
1744 "daddiu $at, $a1, 32760\n"
1745 "lh $a0, 10($at)\n"
1746 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001747 "lh $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001748 "daui $at, $a1, 0x1234\n"
1749 "lh $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001750 "lh $a0, -256($a1)\n"
1751 "lh $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001752 "daui $at, $a1, 0xABCE\n"
1753 "lh $a0, -4352($at)\n"
1754 "daui $at, $a1, 32768\n"
1755 "dahi $at, $at, 1\n"
1756 "lh $a0, -4($at)\n"
1757 "daui $at, $a1, 32768\n"
1758 "dahi $at, $at, 1\n"
1759 "lh $a0, -2($at)\n"
1760 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001761 "lh $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001762 "daui $at, $a1, 32768\n"
1763 "lh $a0, 2($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001764
1765 "lhu $a0, 0($a0)\n"
1766 "lhu $a0, 0($a1)\n"
1767 "lhu $a0, 2($a1)\n"
1768 "lhu $a0, 256($a1)\n"
1769 "lhu $a0, 1000($a1)\n"
1770 "lhu $a0, 0x7FFE($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001771 "daddiu $at, $a1, 0x7FF8\n"
1772 "lhu $a0, 8($at)\n"
1773 "daddiu $at, $a1, 32760\n"
1774 "lhu $a0, 10($at)\n"
1775 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001776 "lhu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001777 "daui $at, $a1, 0x1234\n"
1778 "lhu $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001779 "lhu $a0, -256($a1)\n"
1780 "lhu $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001781 "daui $at, $a1, 0xABCE\n"
1782 "lhu $a0, -4352($at)\n"
1783 "daui $at, $a1, 32768\n"
1784 "dahi $at, $at, 1\n"
1785 "lhu $a0, -4($at)\n"
1786 "daui $at, $a1, 32768\n"
1787 "dahi $at, $at, 1\n"
1788 "lhu $a0, -2($at)\n"
1789 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001790 "lhu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001791 "daui $at, $a1, 32768\n"
1792 "lhu $a0, 2($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001793
1794 "lw $a0, 0($a0)\n"
1795 "lw $a0, 0($a1)\n"
1796 "lw $a0, 4($a1)\n"
1797 "lw $a0, 256($a1)\n"
1798 "lw $a0, 1000($a1)\n"
1799 "lw $a0, 0x7FFC($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001800 "daddiu $at, $a1, 0x7FF8\n"
1801 "lw $a0, 8($at)\n"
1802 "daddiu $at, $a1, 32760\n"
1803 "lw $a0, 12($at)\n"
1804 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001805 "lw $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001806 "daui $at, $a1, 0x1234\n"
1807 "lw $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001808 "lw $a0, -256($a1)\n"
1809 "lw $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001810 "daui $at, $a1, 0xABCE\n"
1811 "lw $a0, -4352($at)\n"
1812 "daui $at, $a1, 32768\n"
1813 "dahi $at, $at, 1\n"
1814 "lw $a0, -8($at)\n"
1815 "daui $at, $a1, 32768\n"
1816 "dahi $at, $at, 1\n"
1817 "lw $a0, -4($at)\n"
1818 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001819 "lw $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001820 "daui $at, $a1, 32768\n"
1821 "lw $a0, 4($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001822
1823 "lwu $a0, 0($a0)\n"
1824 "lwu $a0, 0($a1)\n"
1825 "lwu $a0, 4($a1)\n"
1826 "lwu $a0, 256($a1)\n"
1827 "lwu $a0, 1000($a1)\n"
1828 "lwu $a0, 0x7FFC($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001829 "daddiu $at, $a1, 0x7FF8\n"
1830 "lwu $a0, 8($at)\n"
1831 "daddiu $at, $a1, 32760\n"
1832 "lwu $a0, 12($at)\n"
1833 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001834 "lwu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001835 "daui $at, $a1, 0x1234\n"
1836 "lwu $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001837 "lwu $a0, -256($a1)\n"
1838 "lwu $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001839 "daui $at, $a1, 0xABCE\n"
1840 "lwu $a0, -4352($at)\n"
1841 "daui $at, $a1, 32768\n"
1842 "dahi $at, $at, 1\n"
1843 "lwu $a0, -8($at)\n"
1844 "daui $at, $a1, 32768\n"
1845 "dahi $at, $at, 1\n"
1846 "lwu $a0, -4($at)\n"
1847 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001848 "lwu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001849 "daui $at, $a1, 32768\n"
1850 "lwu $a0, 4($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001851
1852 "ld $a0, 0($a0)\n"
1853 "ld $a0, 0($a1)\n"
1854 "lwu $a0, 4($a1)\n"
1855 "lwu $t3, 8($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001856 "dinsu $a0, $t3, 32, 32\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001857 "ld $a0, 256($a1)\n"
1858 "ld $a0, 1000($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001859 "daddiu $at, $a1, 32760\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001860 "lwu $a0, 4($at)\n"
1861 "lwu $t3, 8($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001862 "dinsu $a0, $t3, 32, 32\n"
1863 "daddiu $at, $a1, 32760\n"
1864 "ld $a0, 8($at)\n"
1865 "daddiu $at, $a1, 32760\n"
1866 "lwu $a0, 12($at)\n"
1867 "lwu $t3, 16($at)\n"
1868 "dinsu $a0, $t3, 32, 32\n"
1869 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001870 "ld $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001871 "daui $at, $a1, 2\n"
1872 "daddiu $at, $at, 8\n"
1873 "lwu $a0, 0x7ff4($at)\n"
1874 "lwu $t3, 0x7ff8($at)\n"
1875 "dinsu $a0, $t3, 32, 32\n"
1876 "daui $at, $a1, 0x1234\n"
1877 "ld $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001878 "ld $a0, -256($a1)\n"
1879 "ld $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001880 "daui $at, $a1, 0xABCE\n"
1881 "ld $a0, -4352($at)\n"
1882 "daui $at, $a1, 32768\n"
1883 "dahi $at, $at, 1\n"
1884 "ld $a0, -8($at)\n"
1885 "daui $at, $a1, 32768\n"
1886 "dahi $at, $at, 1\n"
1887 "lwu $a0, -4($at)\n"
1888 "lwu $t3, 0($at)\n"
1889 "dinsu $a0, $t3, 32, 32\n"
1890 "daui $at, $a1, 32768\n"
1891 "ld $a0, 0($at)\n"
1892 "daui $at, $a1, 32768\n"
1893 "lwu $a0, 4($at)\n"
1894 "lwu $t3, 8($at)\n"
1895 "dinsu $a0, $t3, 32, 32\n";
Lazar Trsicd9672662015-09-03 17:33:01 +02001896 DriverStr(expected, "LoadFromOffset");
1897}
1898
1899TEST_F(AssemblerMIPS64Test, LoadFpuFromOffset) {
1900 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0);
1901 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 4);
1902 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 256);
1903 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x7FFC);
1904 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x8000);
1905 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x8004);
1906 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x10000);
1907 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x12345678);
1908 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, -256);
1909 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, -32768);
1910 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0xABCDEF00);
1911
1912 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0);
1913 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 4);
1914 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 256);
1915 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x7FFC);
1916 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x8000);
1917 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x8004);
1918 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x10000);
1919 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x12345678);
1920 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, -256);
1921 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, -32768);
1922 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0xABCDEF00);
1923
1924 const char* expected =
1925 "lwc1 $f0, 0($a0)\n"
1926 "lwc1 $f0, 4($a0)\n"
1927 "lwc1 $f0, 256($a0)\n"
1928 "lwc1 $f0, 0x7FFC($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001929 "daddiu $at, $a0, 32760 # 0x7FF8\n"
1930 "lwc1 $f0, 8($at)\n"
1931 "daddiu $at, $a0, 32760 # 0x7FF8\n"
1932 "lwc1 $f0, 12($at)\n"
1933 "daui $at, $a0, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001934 "lwc1 $f0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001935 "daui $at, $a0, 4660 # 0x1234\n"
1936 "lwc1 $f0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001937 "lwc1 $f0, -256($a0)\n"
1938 "lwc1 $f0, -32768($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001939 "daui $at, $a0, 0xABCE\n"
1940 "lwc1 $f0, -0x1100($at) # 0xEF00\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001941
1942 "ldc1 $f0, 0($a0)\n"
1943 "lwc1 $f0, 4($a0)\n"
1944 "lw $t3, 8($a0)\n"
1945 "mthc1 $t3, $f0\n"
1946 "ldc1 $f0, 256($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001947 "daddiu $at, $a0, 32760 # 0x7FF8\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001948 "lwc1 $f0, 4($at)\n"
1949 "lw $t3, 8($at)\n"
1950 "mthc1 $t3, $f0\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001951 "daddiu $at, $a0, 32760 # 0x7FF8\n"
1952 "ldc1 $f0, 8($at)\n"
1953 "daddiu $at, $a0, 32760 # 0x7FF8\n"
1954 "lwc1 $f0, 12($at)\n"
1955 "lw $t3, 16($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001956 "mthc1 $t3, $f0\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001957 "daui $at, $a0, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001958 "ldc1 $f0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001959 "daui $at, $a0, 4660 # 0x1234\n"
1960 "ldc1 $f0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001961 "ldc1 $f0, -256($a0)\n"
1962 "ldc1 $f0, -32768($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001963 "daui $at, $a0, 0xABCE\n"
1964 "ldc1 $f0, -0x1100($at) # 0xEF00\n";
Lazar Trsicd9672662015-09-03 17:33:01 +02001965 DriverStr(expected, "LoadFpuFromOffset");
1966}
1967
1968TEST_F(AssemblerMIPS64Test, StoreToOffset) {
1969 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A0, 0);
1970 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0);
1971 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 1);
1972 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 256);
1973 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 1000);
1974 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x7FFF);
1975 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x8000);
1976 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x8001);
1977 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x10000);
1978 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x12345678);
1979 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, -256);
1980 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, -32768);
1981 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0xABCDEF00);
1982
1983 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A0, 0);
1984 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0);
1985 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 2);
1986 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 256);
1987 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 1000);
1988 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x7FFE);
1989 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x8000);
1990 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x8002);
1991 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x10000);
1992 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x12345678);
1993 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, -256);
1994 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, -32768);
1995 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0xABCDEF00);
1996
1997 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A0, 0);
1998 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0);
1999 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 4);
2000 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 256);
2001 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 1000);
2002 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x7FFC);
2003 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x8000);
2004 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x8004);
2005 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x10000);
2006 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x12345678);
2007 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, -256);
2008 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, -32768);
2009 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0xABCDEF00);
2010
2011 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A0, 0);
2012 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0);
2013 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 4);
2014 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 256);
2015 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 1000);
2016 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x7FFC);
2017 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x8000);
2018 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x8004);
2019 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x10000);
2020 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x12345678);
2021 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, -256);
2022 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, -32768);
2023 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002024 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x7FFFFFF8);
2025 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x7FFFFFFC);
2026 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x80000000);
2027 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x80000004);
Lazar Trsicd9672662015-09-03 17:33:01 +02002028
2029 const char* expected =
2030 "sb $a0, 0($a0)\n"
2031 "sb $a0, 0($a1)\n"
2032 "sb $a0, 1($a1)\n"
2033 "sb $a0, 256($a1)\n"
2034 "sb $a0, 1000($a1)\n"
2035 "sb $a0, 0x7FFF($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002036 "daddiu $at, $a1, 0x7FF8\n"
2037 "sb $a0, 8($at)\n"
2038 "daddiu $at, $a1, 0x7FF8\n"
2039 "sb $a0, 9($at)\n"
2040 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002041 "sb $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002042 "daui $at, $a1, 4660 # 0x1234\n"
2043 "sb $a0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002044 "sb $a0, -256($a1)\n"
2045 "sb $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002046 "daui $at, $a1, 43982 # 0xABCE\n"
2047 "sb $a0, -4352($at) # 0xEF00\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002048
2049 "sh $a0, 0($a0)\n"
2050 "sh $a0, 0($a1)\n"
2051 "sh $a0, 2($a1)\n"
2052 "sh $a0, 256($a1)\n"
2053 "sh $a0, 1000($a1)\n"
2054 "sh $a0, 0x7FFE($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002055 "daddiu $at, $a1, 0x7FF8\n"
2056 "sh $a0, 8($at)\n"
2057 "daddiu $at, $a1, 0x7FF8\n"
2058 "sh $a0, 10($at)\n"
2059 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002060 "sh $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002061 "daui $at, $a1, 4660 # 0x1234\n"
2062 "sh $a0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002063 "sh $a0, -256($a1)\n"
2064 "sh $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002065 "daui $at, $a1, 43982 # 0xABCE\n"
2066 "sh $a0, -4352($at) # 0xEF00\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002067
2068 "sw $a0, 0($a0)\n"
2069 "sw $a0, 0($a1)\n"
2070 "sw $a0, 4($a1)\n"
2071 "sw $a0, 256($a1)\n"
2072 "sw $a0, 1000($a1)\n"
2073 "sw $a0, 0x7FFC($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002074 "daddiu $at, $a1, 0x7FF8\n"
2075 "sw $a0, 8($at)\n"
2076 "daddiu $at, $a1, 0x7FF8\n"
2077 "sw $a0, 12($at)\n"
2078 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002079 "sw $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002080 "daui $at, $a1, 4660 # 0x1234\n"
2081 "sw $a0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002082 "sw $a0, -256($a1)\n"
2083 "sw $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002084 "daui $at, $a1, 43982 # 0xABCE\n"
2085 "sw $a0, -4352($at) # 0xEF00\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002086
2087 "sd $a0, 0($a0)\n"
2088 "sd $a0, 0($a1)\n"
2089 "sw $a0, 4($a1)\n"
2090 "dsrl32 $t3, $a0, 0\n"
2091 "sw $t3, 8($a1)\n"
2092 "sd $a0, 256($a1)\n"
2093 "sd $a0, 1000($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002094 "daddiu $at, $a1, 0x7FF8\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002095 "sw $a0, 4($at)\n"
2096 "dsrl32 $t3, $a0, 0\n"
2097 "sw $t3, 8($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002098 "daddiu $at, $a1, 32760 # 0x7FF8\n"
2099 "sd $a0, 8($at)\n"
2100 "daddiu $at, $a1, 32760 # 0x7FF8\n"
2101 "sw $a0, 12($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002102 "dsrl32 $t3, $a0, 0\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002103 "sw $t3, 16($at)\n"
2104 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002105 "sd $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002106 "daui $at, $a1, 4660 # 0x1234\n"
2107 "sd $a0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002108 "sd $a0, -256($a1)\n"
2109 "sd $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002110 "daui $at, $a1, 0xABCE\n"
2111 "sd $a0, -0x1100($at)\n"
2112 "daui $at, $a1, 0x8000\n"
2113 "dahi $at, $at, 1\n"
2114 "sd $a0, -8($at)\n"
2115 "daui $at, $a1, 0x8000\n"
2116 "dahi $at, $at, 1\n"
2117 "sw $a0, -4($at) # 0xFFFC\n"
2118 "dsrl32 $t3, $a0, 0\n"
2119 "sw $t3, 0($at) # 0x0\n"
2120 "daui $at, $a1, 0x8000\n"
2121 "sd $a0, 0($at) # 0x0\n"
2122 "daui $at, $a1, 0x8000\n"
2123 "sw $a0, 4($at) # 0x4\n"
2124 "dsrl32 $t3, $a0, 0\n"
2125 "sw $t3, 8($at) # 0x8\n";
Lazar Trsicd9672662015-09-03 17:33:01 +02002126 DriverStr(expected, "StoreToOffset");
2127}
2128
2129TEST_F(AssemblerMIPS64Test, StoreFpuToOffset) {
2130 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0);
2131 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 4);
2132 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 256);
2133 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x7FFC);
2134 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x8000);
2135 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x8004);
2136 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x10000);
2137 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x12345678);
2138 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, -256);
2139 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, -32768);
2140 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0xABCDEF00);
2141
2142 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0);
2143 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 4);
2144 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 256);
2145 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x7FFC);
2146 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x8000);
2147 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x8004);
2148 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x10000);
2149 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x12345678);
2150 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, -256);
2151 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, -32768);
2152 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0xABCDEF00);
2153
2154 const char* expected =
2155 "swc1 $f0, 0($a0)\n"
2156 "swc1 $f0, 4($a0)\n"
2157 "swc1 $f0, 256($a0)\n"
2158 "swc1 $f0, 0x7FFC($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002159 "daddiu $at, $a0, 32760 # 0x7FF8\n"
2160 "swc1 $f0, 8($at)\n"
2161 "daddiu $at, $a0, 32760 # 0x7FF8\n"
2162 "swc1 $f0, 12($at)\n"
2163 "daui $at, $a0, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002164 "swc1 $f0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002165 "daui $at, $a0, 4660 # 0x1234\n"
2166 "swc1 $f0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002167 "swc1 $f0, -256($a0)\n"
2168 "swc1 $f0, -32768($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002169 "daui $at, $a0, 0xABCE\n"
2170 "swc1 $f0, -0x1100($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002171
2172 "sdc1 $f0, 0($a0)\n"
2173 "mfhc1 $t3, $f0\n"
2174 "swc1 $f0, 4($a0)\n"
2175 "sw $t3, 8($a0)\n"
2176 "sdc1 $f0, 256($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002177 "daddiu $at, $a0, 32760 # 0x7FF8\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002178 "mfhc1 $t3, $f0\n"
2179 "swc1 $f0, 4($at)\n"
2180 "sw $t3, 8($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002181 "daddiu $at, $a0, 32760 # 0x7FF8\n"
2182 "sdc1 $f0, 8($at)\n"
2183 "daddiu $at, $a0, 32760 # 0x7FF8\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002184 "mfhc1 $t3, $f0\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002185 "swc1 $f0, 12($at)\n"
2186 "sw $t3, 16($at)\n"
2187 "daui $at, $a0, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002188 "sdc1 $f0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002189 "daui $at, $a0, 4660 # 0x1234\n"
2190 "sdc1 $f0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002191 "sdc1 $f0, -256($a0)\n"
2192 "sdc1 $f0, -32768($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002193 "daui $at, $a0, 0xABCE\n"
2194 "sdc1 $f0, -0x1100($at)\n";
Lazar Trsicd9672662015-09-03 17:33:01 +02002195 DriverStr(expected, "StoreFpuToOffset");
2196}
2197
Tijana Jakovljevicba89c342017-03-10 13:36:08 +01002198TEST_F(AssemblerMIPS64Test, StoreConstToOffset) {
2199 __ StoreConstToOffset(mips64::kStoreByte, 0xFF, mips64::A1, +0, mips64::T8);
2200 __ StoreConstToOffset(mips64::kStoreHalfword, 0xFFFF, mips64::A1, +0, mips64::T8);
2201 __ StoreConstToOffset(mips64::kStoreWord, 0x12345678, mips64::A1, +0, mips64::T8);
2202 __ StoreConstToOffset(mips64::kStoreDoubleword, 0x123456789ABCDEF0, mips64::A1, +0, mips64::T8);
2203
2204 __ StoreConstToOffset(mips64::kStoreByte, 0, mips64::A1, +0, mips64::T8);
2205 __ StoreConstToOffset(mips64::kStoreHalfword, 0, mips64::A1, +0, mips64::T8);
2206 __ StoreConstToOffset(mips64::kStoreWord, 0, mips64::A1, +0, mips64::T8);
2207 __ StoreConstToOffset(mips64::kStoreDoubleword, 0, mips64::A1, +0, mips64::T8);
2208
2209 __ StoreConstToOffset(mips64::kStoreDoubleword, 0x1234567812345678, mips64::A1, +0, mips64::T8);
2210 __ StoreConstToOffset(mips64::kStoreDoubleword, 0x1234567800000000, mips64::A1, +0, mips64::T8);
2211 __ StoreConstToOffset(mips64::kStoreDoubleword, 0x0000000012345678, mips64::A1, +0, mips64::T8);
2212
2213 __ StoreConstToOffset(mips64::kStoreWord, 0, mips64::T8, +0, mips64::T8);
2214 __ StoreConstToOffset(mips64::kStoreWord, 0x12345678, mips64::T8, +0, mips64::T8);
2215
2216 __ StoreConstToOffset(mips64::kStoreWord, 0, mips64::A1, -0xFFF0, mips64::T8);
2217 __ StoreConstToOffset(mips64::kStoreWord, 0x12345678, mips64::A1, +0xFFF0, mips64::T8);
2218
2219 __ StoreConstToOffset(mips64::kStoreWord, 0, mips64::T8, -0xFFF0, mips64::T8);
2220 __ StoreConstToOffset(mips64::kStoreWord, 0x12345678, mips64::T8, +0xFFF0, mips64::T8);
2221
2222 const char* expected =
2223 "ori $t8, $zero, 0xFF\n"
2224 "sb $t8, 0($a1)\n"
2225 "ori $t8, $zero, 0xFFFF\n"
2226 "sh $t8, 0($a1)\n"
2227 "lui $t8, 0x1234\n"
2228 "ori $t8, $t8,0x5678\n"
2229 "sw $t8, 0($a1)\n"
2230 "lui $t8, 0x9abc\n"
2231 "ori $t8, $t8,0xdef0\n"
2232 "dahi $t8, $t8, 0x5679\n"
2233 "dati $t8, $t8, 0x1234\n"
2234 "sd $t8, 0($a1)\n"
2235 "sb $zero, 0($a1)\n"
2236 "sh $zero, 0($a1)\n"
2237 "sw $zero, 0($a1)\n"
2238 "sd $zero, 0($a1)\n"
2239 "lui $t8, 0x1234\n"
2240 "ori $t8, $t8,0x5678\n"
2241 "dins $t8, $t8, 0x20, 0x20\n"
2242 "sd $t8, 0($a1)\n"
2243 "lui $t8, 0x246\n"
2244 "ori $t8, $t8, 0x8acf\n"
2245 "dsll32 $t8, $t8, 0x3\n"
2246 "sd $t8, 0($a1)\n"
2247 "lui $t8, 0x1234\n"
2248 "ori $t8, $t8, 0x5678\n"
2249 "sd $t8, 0($a1)\n"
2250 "sw $zero, 0($t8)\n"
2251 "lui $at,0x1234\n"
2252 "ori $at, $at, 0x5678\n"
2253 "sw $at, 0($t8)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002254 "daddiu $at, $a1, -32760 # 0x8008\n"
2255 "sw $zero, -32760($at) # 0x8008\n"
2256 "daddiu $at, $a1, 32760 # 0x7FF8\n"
2257 "lui $t8, 4660 # 0x1234\n"
2258 "ori $t8, $t8, 22136 # 0x5678\n"
2259 "sw $t8, 32760($at) # 0x7FF8\n"
2260 "daddiu $at, $t8, -32760 # 0x8008\n"
2261 "sw $zero, -32760($at) # 0x8008\n"
2262 "daddiu $at, $t8, 32760 # 0x7FF8\n"
2263 "lui $t8, 4660 # 0x1234\n"
2264 "ori $t8, $t8, 22136 # 0x5678\n"
2265 "sw $t8, 32760($at) # 0x7FF8\n";
Tijana Jakovljevicba89c342017-03-10 13:36:08 +01002266 DriverStr(expected, "StoreConstToOffset");
2267}
Alexey Frunze0960ac52016-12-20 17:24:59 -08002268//////////////////////////////
2269// Loading/adding Constants //
2270//////////////////////////////
Chris Larsenc733dca2016-05-13 16:11:47 -07002271
2272TEST_F(AssemblerMIPS64Test, LoadConst32) {
2273 // IsUint<16>(value)
2274 __ LoadConst32(mips64::V0, 0);
2275 __ LoadConst32(mips64::V0, 65535);
2276 // IsInt<16>(value)
2277 __ LoadConst32(mips64::V0, -1);
2278 __ LoadConst32(mips64::V0, -32768);
2279 // Everything else
2280 __ LoadConst32(mips64::V0, 65536);
2281 __ LoadConst32(mips64::V0, 65537);
2282 __ LoadConst32(mips64::V0, 2147483647);
2283 __ LoadConst32(mips64::V0, -32769);
2284 __ LoadConst32(mips64::V0, -65536);
2285 __ LoadConst32(mips64::V0, -65537);
2286 __ LoadConst32(mips64::V0, -2147483647);
2287 __ LoadConst32(mips64::V0, -2147483648);
2288
2289 const char* expected =
2290 // IsUint<16>(value)
2291 "ori $v0, $zero, 0\n" // __ LoadConst32(mips64::V0, 0);
2292 "ori $v0, $zero, 65535\n" // __ LoadConst32(mips64::V0, 65535);
2293 // IsInt<16>(value)
2294 "addiu $v0, $zero, -1\n" // __ LoadConst32(mips64::V0, -1);
2295 "addiu $v0, $zero, -32768\n" // __ LoadConst32(mips64::V0, -32768);
2296 // Everything else
2297 "lui $v0, 1\n" // __ LoadConst32(mips64::V0, 65536);
2298 "lui $v0, 1\n" // __ LoadConst32(mips64::V0, 65537);
2299 "ori $v0, 1\n" // "
2300 "lui $v0, 32767\n" // __ LoadConst32(mips64::V0, 2147483647);
2301 "ori $v0, 65535\n" // "
2302 "lui $v0, 65535\n" // __ LoadConst32(mips64::V0, -32769);
2303 "ori $v0, 32767\n" // "
2304 "lui $v0, 65535\n" // __ LoadConst32(mips64::V0, -65536);
2305 "lui $v0, 65534\n" // __ LoadConst32(mips64::V0, -65537);
2306 "ori $v0, 65535\n" // "
2307 "lui $v0, 32768\n" // __ LoadConst32(mips64::V0, -2147483647);
2308 "ori $v0, 1\n" // "
2309 "lui $v0, 32768\n"; // __ LoadConst32(mips64::V0, -2147483648);
2310 DriverStr(expected, "LoadConst32");
2311}
2312
Alexey Frunze0960ac52016-12-20 17:24:59 -08002313TEST_F(AssemblerMIPS64Test, Addiu32) {
2314 __ Addiu32(mips64::A1, mips64::A2, -0x8000);
2315 __ Addiu32(mips64::A1, mips64::A2, +0);
2316 __ Addiu32(mips64::A1, mips64::A2, +0x7FFF);
2317 __ Addiu32(mips64::A1, mips64::A2, -0x8001);
2318 __ Addiu32(mips64::A1, mips64::A2, +0x8000);
2319 __ Addiu32(mips64::A1, mips64::A2, -0x10000);
2320 __ Addiu32(mips64::A1, mips64::A2, +0x10000);
2321 __ Addiu32(mips64::A1, mips64::A2, +0x12345678);
2322
2323 const char* expected =
2324 "addiu $a1, $a2, -0x8000\n"
2325 "addiu $a1, $a2, 0\n"
2326 "addiu $a1, $a2, 0x7FFF\n"
2327 "aui $a1, $a2, 0xFFFF\n"
2328 "addiu $a1, $a1, 0x7FFF\n"
2329 "aui $a1, $a2, 1\n"
2330 "addiu $a1, $a1, -0x8000\n"
2331 "aui $a1, $a2, 0xFFFF\n"
2332 "aui $a1, $a2, 1\n"
2333 "aui $a1, $a2, 0x1234\n"
2334 "addiu $a1, $a1, 0x5678\n";
2335 DriverStr(expected, "Addiu32");
2336}
2337
Chris Larsenc733dca2016-05-13 16:11:47 -07002338static uint64_t SignExtend16To64(uint16_t n) {
2339 return static_cast<int16_t>(n);
2340}
2341
2342// The art::mips64::Mips64Assembler::LoadConst64() method uses a template
2343// to minimize the number of instructions needed to load a 64-bit constant
2344// value into a register. The template calls various methods which emit
2345// MIPS machine instructions. This struct (class) uses the same template
2346// but overrides the definitions of the methods which emit MIPS instructions
2347// to use methods which simulate the operation of the corresponding MIPS
2348// instructions. After invoking LoadConst64() the target register should
2349// contain the same 64-bit value as was input to LoadConst64(). If the
2350// simulated register doesn't contain the correct value then there is probably
2351// an error in the template function.
2352struct LoadConst64Tester {
2353 LoadConst64Tester() {
2354 // Initialize all of the registers for simulation to zero.
2355 for (int r = 0; r < 32; r++) {
2356 regs_[r] = 0;
2357 }
2358 // Clear all of the path flags.
2359 loadconst64_paths_ = art::mips64::kLoadConst64PathZero;
2360 }
2361 void Addiu(mips64::GpuRegister rd, mips64::GpuRegister rs, uint16_t c) {
2362 regs_[rd] = static_cast<int32_t>(regs_[rs] + SignExtend16To64(c));
2363 }
2364 void Daddiu(mips64::GpuRegister rd, mips64::GpuRegister rs, uint16_t c) {
2365 regs_[rd] = regs_[rs] + SignExtend16To64(c);
2366 }
2367 void Dahi(mips64::GpuRegister rd, uint16_t c) {
2368 regs_[rd] += SignExtend16To64(c) << 32;
2369 }
2370 void Dati(mips64::GpuRegister rd, uint16_t c) {
2371 regs_[rd] += SignExtend16To64(c) << 48;
2372 }
2373 void Dinsu(mips64::GpuRegister rt, mips64::GpuRegister rs, int pos, int size) {
2374 CHECK(IsUint<5>(pos - 32)) << pos;
2375 CHECK(IsUint<5>(size - 1)) << size;
2376 CHECK(IsUint<5>(pos + size - 33)) << pos << " + " << size;
2377 uint64_t src_mask = (UINT64_C(1) << size) - 1;
2378 uint64_t dsk_mask = ~(src_mask << pos);
2379
2380 regs_[rt] = (regs_[rt] & dsk_mask) | ((regs_[rs] & src_mask) << pos);
2381 }
2382 void Dsll(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2383 regs_[rd] = regs_[rt] << (shamt & 0x1f);
2384 }
2385 void Dsll32(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2386 regs_[rd] = regs_[rt] << (32 + (shamt & 0x1f));
2387 }
2388 void Dsrl(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2389 regs_[rd] = regs_[rt] >> (shamt & 0x1f);
2390 }
2391 void Dsrl32(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2392 regs_[rd] = regs_[rt] >> (32 + (shamt & 0x1f));
2393 }
2394 void Lui(mips64::GpuRegister rd, uint16_t c) {
2395 regs_[rd] = SignExtend16To64(c) << 16;
2396 }
2397 void Ori(mips64::GpuRegister rd, mips64::GpuRegister rs, uint16_t c) {
2398 regs_[rd] = regs_[rs] | c;
2399 }
2400 void LoadConst32(mips64::GpuRegister rd, int32_t c) {
2401 CHECK_NE(rd, 0);
2402 mips64::TemplateLoadConst32<LoadConst64Tester>(this, rd, c);
2403 CHECK_EQ(regs_[rd], static_cast<uint64_t>(c));
2404 }
2405 void LoadConst64(mips64::GpuRegister rd, int64_t c) {
2406 CHECK_NE(rd, 0);
2407 mips64::TemplateLoadConst64<LoadConst64Tester>(this, rd, c);
2408 CHECK_EQ(regs_[rd], static_cast<uint64_t>(c));
2409 }
2410 uint64_t regs_[32];
2411
2412 // Getter function for loadconst64_paths_.
2413 int GetPathsCovered() {
2414 return loadconst64_paths_;
2415 }
2416
2417 void RecordLoadConst64Path(int value) {
2418 loadconst64_paths_ |= value;
2419 }
2420
2421 private:
2422 // This variable holds a bitmask to tell us which paths were taken
2423 // through the template function which loads 64-bit values.
2424 int loadconst64_paths_;
2425};
2426
2427TEST_F(AssemblerMIPS64Test, LoadConst64) {
2428 const uint16_t imms[] = {
2429 0, 1, 2, 3, 4, 0x33, 0x66, 0x55, 0x99, 0xaa, 0xcc, 0xff, 0x5500, 0x5555,
2430 0x7ffc, 0x7ffd, 0x7ffe, 0x7fff, 0x8000, 0x8001, 0x8002, 0x8003, 0x8004,
2431 0xaaaa, 0xfffc, 0xfffd, 0xfffe, 0xffff
2432 };
2433 unsigned d0, d1, d2, d3;
2434 LoadConst64Tester tester;
2435
2436 union {
2437 int64_t v64;
2438 uint16_t v16[4];
2439 } u;
2440
2441 for (d3 = 0; d3 < sizeof imms / sizeof imms[0]; d3++) {
2442 u.v16[3] = imms[d3];
2443
2444 for (d2 = 0; d2 < sizeof imms / sizeof imms[0]; d2++) {
2445 u.v16[2] = imms[d2];
2446
2447 for (d1 = 0; d1 < sizeof imms / sizeof imms[0]; d1++) {
2448 u.v16[1] = imms[d1];
2449
2450 for (d0 = 0; d0 < sizeof imms / sizeof imms[0]; d0++) {
2451 u.v16[0] = imms[d0];
2452
2453 tester.LoadConst64(mips64::V0, u.v64);
2454 }
2455 }
2456 }
2457 }
2458
2459 // Verify that we tested all paths through the "load 64-bit value"
2460 // function template.
2461 EXPECT_EQ(tester.GetPathsCovered(), art::mips64::kLoadConst64PathAllPaths);
2462}
2463
Lazar Trsicd9672662015-09-03 17:33:01 +02002464#undef __
2465
Chris Larsendbce0d72015-09-17 13:34:00 -07002466} // namespace art