blob: d4642607ad3c82f7bf3738e9d1722de6984dadf3 [file] [log] [blame]
Chris Larsen3add9cb2016-04-14 14:01:33 -07001/*
2 * Copyright (C) 2016 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_mips.h"
18
19#include <map>
20
21#include "base/stl_util.h"
22#include "utils/assembler_test.h"
23
24#define __ GetAssembler()->
25
26namespace art {
27
28struct MIPSCpuRegisterCompare {
29 bool operator()(const mips::Register& a, const mips::Register& b) const {
30 return a < b;
31 }
32};
33
34class AssemblerMIPS32r6Test : public AssemblerTest<mips::MipsAssembler,
35 mips::Register,
36 mips::FRegister,
Lena Djokic0758ae72017-05-23 11:06:23 +020037 uint32_t,
38 mips::VectorRegister> {
Chris Larsen3add9cb2016-04-14 14:01:33 -070039 public:
Lena Djokic0758ae72017-05-23 11:06:23 +020040 typedef AssemblerTest<mips::MipsAssembler,
41 mips::Register,
42 mips::FRegister,
43 uint32_t,
44 mips::VectorRegister> Base;
Chris Larsen3add9cb2016-04-14 14:01:33 -070045
46 AssemblerMIPS32r6Test() :
47 instruction_set_features_(MipsInstructionSetFeatures::FromVariant("mips32r6", nullptr)) {
48 }
49
50 protected:
51 // Get the typically used name for this architecture, e.g., aarch64, x86-64, ...
52 std::string GetArchitectureString() OVERRIDE {
53 return "mips";
54 }
55
Alexey Frunzee3fb2452016-05-10 16:08:05 -070056 std::string GetAssemblerCmdName() OVERRIDE {
57 // We assemble and link for MIPS32R6. See GetAssemblerParameters() for details.
58 return "gcc";
59 }
60
Chris Larsen3add9cb2016-04-14 14:01:33 -070061 std::string GetAssemblerParameters() OVERRIDE {
Alexey Frunzee3fb2452016-05-10 16:08:05 -070062 // We assemble and link for MIPS32R6. The reason is that object files produced for MIPS32R6
63 // (and MIPS64R6) with the GNU assembler don't have correct final offsets in PC-relative
64 // branches in the .text section and so they require a relocation pass (there's a relocation
65 // section, .rela.text, that has the needed info to fix up the branches).
66 // We use "-modd-spreg" so we can use odd-numbered single precision FPU registers.
67 // We put the code at address 0x1000000 (instead of 0) to avoid overlapping with the
68 // .MIPS.abiflags section (there doesn't seem to be a way to suppress its generation easily).
Lena Djokic0758ae72017-05-23 11:06:23 +020069 return " -march=mips32r6 -mmsa -modd-spreg -Wa,--no-warn"
Alexey Frunzee3fb2452016-05-10 16:08:05 -070070 " -Wl,-Ttext=0x1000000 -Wl,-e0x1000000 -nostdlib";
71 }
72
73 void Pad(std::vector<uint8_t>& data) OVERRIDE {
74 // The GNU linker unconditionally pads the code segment with NOPs to a size that is a multiple
75 // of 16 and there doesn't appear to be a way to suppress this padding. Our assembler doesn't
76 // pad, so, in order for two assembler outputs to match, we need to match the padding as well.
77 // NOP is encoded as four zero bytes on MIPS.
78 size_t pad_size = RoundUp(data.size(), 16u) - data.size();
79 data.insert(data.end(), pad_size, 0);
Chris Larsen3add9cb2016-04-14 14:01:33 -070080 }
81
82 std::string GetDisassembleParameters() OVERRIDE {
83 return " -D -bbinary -mmips:isa32r6";
84 }
85
86 mips::MipsAssembler* CreateAssembler(ArenaAllocator* arena) OVERRIDE {
87 return new (arena) mips::MipsAssembler(arena, instruction_set_features_.get());
88 }
89
90 void SetUpHelpers() OVERRIDE {
91 if (registers_.size() == 0) {
92 registers_.push_back(new mips::Register(mips::ZERO));
93 registers_.push_back(new mips::Register(mips::AT));
94 registers_.push_back(new mips::Register(mips::V0));
95 registers_.push_back(new mips::Register(mips::V1));
96 registers_.push_back(new mips::Register(mips::A0));
97 registers_.push_back(new mips::Register(mips::A1));
98 registers_.push_back(new mips::Register(mips::A2));
99 registers_.push_back(new mips::Register(mips::A3));
100 registers_.push_back(new mips::Register(mips::T0));
101 registers_.push_back(new mips::Register(mips::T1));
102 registers_.push_back(new mips::Register(mips::T2));
103 registers_.push_back(new mips::Register(mips::T3));
104 registers_.push_back(new mips::Register(mips::T4));
105 registers_.push_back(new mips::Register(mips::T5));
106 registers_.push_back(new mips::Register(mips::T6));
107 registers_.push_back(new mips::Register(mips::T7));
108 registers_.push_back(new mips::Register(mips::S0));
109 registers_.push_back(new mips::Register(mips::S1));
110 registers_.push_back(new mips::Register(mips::S2));
111 registers_.push_back(new mips::Register(mips::S3));
112 registers_.push_back(new mips::Register(mips::S4));
113 registers_.push_back(new mips::Register(mips::S5));
114 registers_.push_back(new mips::Register(mips::S6));
115 registers_.push_back(new mips::Register(mips::S7));
116 registers_.push_back(new mips::Register(mips::T8));
117 registers_.push_back(new mips::Register(mips::T9));
118 registers_.push_back(new mips::Register(mips::K0));
119 registers_.push_back(new mips::Register(mips::K1));
120 registers_.push_back(new mips::Register(mips::GP));
121 registers_.push_back(new mips::Register(mips::SP));
122 registers_.push_back(new mips::Register(mips::FP));
123 registers_.push_back(new mips::Register(mips::RA));
124
125 secondary_register_names_.emplace(mips::Register(mips::ZERO), "zero");
126 secondary_register_names_.emplace(mips::Register(mips::AT), "at");
127 secondary_register_names_.emplace(mips::Register(mips::V0), "v0");
128 secondary_register_names_.emplace(mips::Register(mips::V1), "v1");
129 secondary_register_names_.emplace(mips::Register(mips::A0), "a0");
130 secondary_register_names_.emplace(mips::Register(mips::A1), "a1");
131 secondary_register_names_.emplace(mips::Register(mips::A2), "a2");
132 secondary_register_names_.emplace(mips::Register(mips::A3), "a3");
133 secondary_register_names_.emplace(mips::Register(mips::T0), "t0");
134 secondary_register_names_.emplace(mips::Register(mips::T1), "t1");
135 secondary_register_names_.emplace(mips::Register(mips::T2), "t2");
136 secondary_register_names_.emplace(mips::Register(mips::T3), "t3");
137 secondary_register_names_.emplace(mips::Register(mips::T4), "t4");
138 secondary_register_names_.emplace(mips::Register(mips::T5), "t5");
139 secondary_register_names_.emplace(mips::Register(mips::T6), "t6");
140 secondary_register_names_.emplace(mips::Register(mips::T7), "t7");
141 secondary_register_names_.emplace(mips::Register(mips::S0), "s0");
142 secondary_register_names_.emplace(mips::Register(mips::S1), "s1");
143 secondary_register_names_.emplace(mips::Register(mips::S2), "s2");
144 secondary_register_names_.emplace(mips::Register(mips::S3), "s3");
145 secondary_register_names_.emplace(mips::Register(mips::S4), "s4");
146 secondary_register_names_.emplace(mips::Register(mips::S5), "s5");
147 secondary_register_names_.emplace(mips::Register(mips::S6), "s6");
148 secondary_register_names_.emplace(mips::Register(mips::S7), "s7");
149 secondary_register_names_.emplace(mips::Register(mips::T8), "t8");
150 secondary_register_names_.emplace(mips::Register(mips::T9), "t9");
151 secondary_register_names_.emplace(mips::Register(mips::K0), "k0");
152 secondary_register_names_.emplace(mips::Register(mips::K1), "k1");
153 secondary_register_names_.emplace(mips::Register(mips::GP), "gp");
154 secondary_register_names_.emplace(mips::Register(mips::SP), "sp");
155 secondary_register_names_.emplace(mips::Register(mips::FP), "fp");
156 secondary_register_names_.emplace(mips::Register(mips::RA), "ra");
157
158 fp_registers_.push_back(new mips::FRegister(mips::F0));
159 fp_registers_.push_back(new mips::FRegister(mips::F1));
160 fp_registers_.push_back(new mips::FRegister(mips::F2));
161 fp_registers_.push_back(new mips::FRegister(mips::F3));
162 fp_registers_.push_back(new mips::FRegister(mips::F4));
163 fp_registers_.push_back(new mips::FRegister(mips::F5));
164 fp_registers_.push_back(new mips::FRegister(mips::F6));
165 fp_registers_.push_back(new mips::FRegister(mips::F7));
166 fp_registers_.push_back(new mips::FRegister(mips::F8));
167 fp_registers_.push_back(new mips::FRegister(mips::F9));
168 fp_registers_.push_back(new mips::FRegister(mips::F10));
169 fp_registers_.push_back(new mips::FRegister(mips::F11));
170 fp_registers_.push_back(new mips::FRegister(mips::F12));
171 fp_registers_.push_back(new mips::FRegister(mips::F13));
172 fp_registers_.push_back(new mips::FRegister(mips::F14));
173 fp_registers_.push_back(new mips::FRegister(mips::F15));
174 fp_registers_.push_back(new mips::FRegister(mips::F16));
175 fp_registers_.push_back(new mips::FRegister(mips::F17));
176 fp_registers_.push_back(new mips::FRegister(mips::F18));
177 fp_registers_.push_back(new mips::FRegister(mips::F19));
178 fp_registers_.push_back(new mips::FRegister(mips::F20));
179 fp_registers_.push_back(new mips::FRegister(mips::F21));
180 fp_registers_.push_back(new mips::FRegister(mips::F22));
181 fp_registers_.push_back(new mips::FRegister(mips::F23));
182 fp_registers_.push_back(new mips::FRegister(mips::F24));
183 fp_registers_.push_back(new mips::FRegister(mips::F25));
184 fp_registers_.push_back(new mips::FRegister(mips::F26));
185 fp_registers_.push_back(new mips::FRegister(mips::F27));
186 fp_registers_.push_back(new mips::FRegister(mips::F28));
187 fp_registers_.push_back(new mips::FRegister(mips::F29));
188 fp_registers_.push_back(new mips::FRegister(mips::F30));
189 fp_registers_.push_back(new mips::FRegister(mips::F31));
Lena Djokic0758ae72017-05-23 11:06:23 +0200190
191 vec_registers_.push_back(new mips::VectorRegister(mips::W0));
192 vec_registers_.push_back(new mips::VectorRegister(mips::W1));
193 vec_registers_.push_back(new mips::VectorRegister(mips::W2));
194 vec_registers_.push_back(new mips::VectorRegister(mips::W3));
195 vec_registers_.push_back(new mips::VectorRegister(mips::W4));
196 vec_registers_.push_back(new mips::VectorRegister(mips::W5));
197 vec_registers_.push_back(new mips::VectorRegister(mips::W6));
198 vec_registers_.push_back(new mips::VectorRegister(mips::W7));
199 vec_registers_.push_back(new mips::VectorRegister(mips::W8));
200 vec_registers_.push_back(new mips::VectorRegister(mips::W9));
201 vec_registers_.push_back(new mips::VectorRegister(mips::W10));
202 vec_registers_.push_back(new mips::VectorRegister(mips::W11));
203 vec_registers_.push_back(new mips::VectorRegister(mips::W12));
204 vec_registers_.push_back(new mips::VectorRegister(mips::W13));
205 vec_registers_.push_back(new mips::VectorRegister(mips::W14));
206 vec_registers_.push_back(new mips::VectorRegister(mips::W15));
207 vec_registers_.push_back(new mips::VectorRegister(mips::W16));
208 vec_registers_.push_back(new mips::VectorRegister(mips::W17));
209 vec_registers_.push_back(new mips::VectorRegister(mips::W18));
210 vec_registers_.push_back(new mips::VectorRegister(mips::W19));
211 vec_registers_.push_back(new mips::VectorRegister(mips::W20));
212 vec_registers_.push_back(new mips::VectorRegister(mips::W21));
213 vec_registers_.push_back(new mips::VectorRegister(mips::W22));
214 vec_registers_.push_back(new mips::VectorRegister(mips::W23));
215 vec_registers_.push_back(new mips::VectorRegister(mips::W24));
216 vec_registers_.push_back(new mips::VectorRegister(mips::W25));
217 vec_registers_.push_back(new mips::VectorRegister(mips::W26));
218 vec_registers_.push_back(new mips::VectorRegister(mips::W27));
219 vec_registers_.push_back(new mips::VectorRegister(mips::W28));
220 vec_registers_.push_back(new mips::VectorRegister(mips::W29));
221 vec_registers_.push_back(new mips::VectorRegister(mips::W30));
222 vec_registers_.push_back(new mips::VectorRegister(mips::W31));
Chris Larsen3add9cb2016-04-14 14:01:33 -0700223 }
224 }
225
226 void TearDown() OVERRIDE {
227 AssemblerTest::TearDown();
228 STLDeleteElements(&registers_);
229 STLDeleteElements(&fp_registers_);
Lena Djokic0758ae72017-05-23 11:06:23 +0200230 STLDeleteElements(&vec_registers_);
Chris Larsen3add9cb2016-04-14 14:01:33 -0700231 }
232
233 std::vector<mips::Register*> GetRegisters() OVERRIDE {
234 return registers_;
235 }
236
237 std::vector<mips::FRegister*> GetFPRegisters() OVERRIDE {
238 return fp_registers_;
239 }
240
Lena Djokic0758ae72017-05-23 11:06:23 +0200241 std::vector<mips::VectorRegister*> GetVectorRegisters() OVERRIDE {
242 return vec_registers_;
243 }
244
Chris Larsen3add9cb2016-04-14 14:01:33 -0700245 uint32_t CreateImmediate(int64_t imm_value) OVERRIDE {
246 return imm_value;
247 }
248
249 std::string GetSecondaryRegisterName(const mips::Register& reg) OVERRIDE {
250 CHECK(secondary_register_names_.find(reg) != secondary_register_names_.end());
251 return secondary_register_names_[reg];
252 }
253
254 std::string RepeatInsn(size_t count, const std::string& insn) {
255 std::string result;
256 for (; count != 0u; --count) {
257 result += insn;
258 }
259 return result;
260 }
261
262 void BranchCondTwoRegsHelper(void (mips::MipsAssembler::*f)(mips::Register,
263 mips::Register,
264 mips::MipsLabel*),
Andreas Gampe2e965ac2016-11-03 17:24:15 -0700265 const std::string& instr_name) {
Chris Larsen3add9cb2016-04-14 14:01:33 -0700266 mips::MipsLabel label;
267 (Base::GetAssembler()->*f)(mips::A0, mips::A1, &label);
268 constexpr size_t kAdduCount1 = 63;
269 for (size_t i = 0; i != kAdduCount1; ++i) {
270 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
271 }
272 __ Bind(&label);
273 constexpr size_t kAdduCount2 = 64;
274 for (size_t i = 0; i != kAdduCount2; ++i) {
275 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
276 }
277 (Base::GetAssembler()->*f)(mips::A2, mips::A3, &label);
278
279 std::string expected =
280 ".set noreorder\n" +
281 instr_name + " $a0, $a1, 1f\n"
282 "nop\n" +
283 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
284 "1:\n" +
285 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
286 instr_name + " $a2, $a3, 1b\n"
287 "nop\n";
288 DriverStr(expected, instr_name);
289 }
290
291 private:
292 std::vector<mips::Register*> registers_;
293 std::map<mips::Register, std::string, MIPSCpuRegisterCompare> secondary_register_names_;
294
295 std::vector<mips::FRegister*> fp_registers_;
Lena Djokic0758ae72017-05-23 11:06:23 +0200296 std::vector<mips::VectorRegister*> vec_registers_;
Chris Larsen3add9cb2016-04-14 14:01:33 -0700297 std::unique_ptr<const MipsInstructionSetFeatures> instruction_set_features_;
298};
299
300
301TEST_F(AssemblerMIPS32r6Test, Toolchain) {
302 EXPECT_TRUE(CheckTools());
303}
304
305TEST_F(AssemblerMIPS32r6Test, MulR6) {
306 DriverStr(RepeatRRR(&mips::MipsAssembler::MulR6, "mul ${reg1}, ${reg2}, ${reg3}"), "MulR6");
307}
308
309TEST_F(AssemblerMIPS32r6Test, MuhR6) {
310 DriverStr(RepeatRRR(&mips::MipsAssembler::MuhR6, "muh ${reg1}, ${reg2}, ${reg3}"), "MuhR6");
311}
312
313TEST_F(AssemblerMIPS32r6Test, MuhuR6) {
314 DriverStr(RepeatRRR(&mips::MipsAssembler::MuhuR6, "muhu ${reg1}, ${reg2}, ${reg3}"), "MuhuR6");
315}
316
317TEST_F(AssemblerMIPS32r6Test, DivR6) {
318 DriverStr(RepeatRRR(&mips::MipsAssembler::DivR6, "div ${reg1}, ${reg2}, ${reg3}"), "DivR6");
319}
320
321TEST_F(AssemblerMIPS32r6Test, ModR6) {
322 DriverStr(RepeatRRR(&mips::MipsAssembler::ModR6, "mod ${reg1}, ${reg2}, ${reg3}"), "ModR6");
323}
324
325TEST_F(AssemblerMIPS32r6Test, DivuR6) {
326 DriverStr(RepeatRRR(&mips::MipsAssembler::DivuR6, "divu ${reg1}, ${reg2}, ${reg3}"), "DivuR6");
327}
328
329TEST_F(AssemblerMIPS32r6Test, ModuR6) {
330 DriverStr(RepeatRRR(&mips::MipsAssembler::ModuR6, "modu ${reg1}, ${reg2}, ${reg3}"), "ModuR6");
331}
332
333//////////
334// MISC //
335//////////
336
337TEST_F(AssemblerMIPS32r6Test, Aui) {
338 DriverStr(RepeatRRIb(&mips::MipsAssembler::Aui, 16, "aui ${reg1}, ${reg2}, {imm}"), "Aui");
339}
340
Alexey Frunzee3fb2452016-05-10 16:08:05 -0700341TEST_F(AssemblerMIPS32r6Test, Auipc) {
342 DriverStr(RepeatRIb(&mips::MipsAssembler::Auipc, 16, "auipc ${reg}, {imm}"), "Auipc");
343}
344
345TEST_F(AssemblerMIPS32r6Test, Lwpc) {
346 // Lwpc() takes an unsigned 19-bit immediate, while the GNU assembler needs a signed offset,
347 // hence the sign extension from bit 18 with `imm - ((imm & 0x40000) << 1)`.
348 // The GNU assembler also wants the offset to be a multiple of 4, which it will shift right
349 // by 2 positions when encoding, hence `<< 2` to compensate for that shift.
350 // We capture the value of the immediate with `.set imm, {imm}` because the value is needed
351 // twice for the sign extension, but `{imm}` is substituted only once.
352 const char* code = ".set imm, {imm}\nlw ${reg}, ((imm - ((imm & 0x40000) << 1)) << 2)($pc)";
353 DriverStr(RepeatRIb(&mips::MipsAssembler::Lwpc, 19, code), "Lwpc");
354}
355
Alexey Frunze96b66822016-09-10 02:32:44 -0700356TEST_F(AssemblerMIPS32r6Test, Addiupc) {
357 // The comment from the Lwpc() test applies to this Addiupc() test as well.
358 const char* code = ".set imm, {imm}\naddiupc ${reg}, (imm - ((imm & 0x40000) << 1)) << 2";
359 DriverStr(RepeatRIb(&mips::MipsAssembler::Addiupc, 19, code), "Addiupc");
360}
361
Chris Larsen3add9cb2016-04-14 14:01:33 -0700362TEST_F(AssemblerMIPS32r6Test, Bitswap) {
363 DriverStr(RepeatRR(&mips::MipsAssembler::Bitswap, "bitswap ${reg1}, ${reg2}"), "bitswap");
364}
365
Chris Larsen692235e2016-11-21 16:04:53 -0800366TEST_F(AssemblerMIPS32r6Test, Lsa) {
367 DriverStr(RepeatRRRIb(&mips::MipsAssembler::Lsa,
368 2,
369 "lsa ${reg1}, ${reg2}, ${reg3}, {imm}",
370 1),
371 "lsa");
372}
373
Chris Larsen3add9cb2016-04-14 14:01:33 -0700374TEST_F(AssemblerMIPS32r6Test, Seleqz) {
Lena Djokic0758ae72017-05-23 11:06:23 +0200375 DriverStr(RepeatRRR(&mips::MipsAssembler::Seleqz, "seleqz ${reg1}, ${reg2}, ${reg3}"), "seleqz");
Chris Larsen3add9cb2016-04-14 14:01:33 -0700376}
377
378TEST_F(AssemblerMIPS32r6Test, Selnez) {
Lena Djokic0758ae72017-05-23 11:06:23 +0200379 DriverStr(RepeatRRR(&mips::MipsAssembler::Selnez, "selnez ${reg1}, ${reg2}, ${reg3}"), "selnez");
Chris Larsen3add9cb2016-04-14 14:01:33 -0700380}
381
382TEST_F(AssemblerMIPS32r6Test, ClzR6) {
383 DriverStr(RepeatRR(&mips::MipsAssembler::ClzR6, "clz ${reg1}, ${reg2}"), "clzR6");
384}
385
386TEST_F(AssemblerMIPS32r6Test, CloR6) {
387 DriverStr(RepeatRR(&mips::MipsAssembler::CloR6, "clo ${reg1}, ${reg2}"), "cloR6");
388}
389
390////////////////////
391// FLOATING POINT //
392////////////////////
393
394TEST_F(AssemblerMIPS32r6Test, SelS) {
395 DriverStr(RepeatFFF(&mips::MipsAssembler::SelS, "sel.s ${reg1}, ${reg2}, ${reg3}"), "sel.s");
396}
397
398TEST_F(AssemblerMIPS32r6Test, SelD) {
399 DriverStr(RepeatFFF(&mips::MipsAssembler::SelD, "sel.d ${reg1}, ${reg2}, ${reg3}"), "sel.d");
400}
401
Alexey Frunze674b9ee2016-09-20 14:54:15 -0700402TEST_F(AssemblerMIPS32r6Test, SeleqzS) {
403 DriverStr(RepeatFFF(&mips::MipsAssembler::SeleqzS, "seleqz.s ${reg1}, ${reg2}, ${reg3}"),
404 "seleqz.s");
405}
406
407TEST_F(AssemblerMIPS32r6Test, SeleqzD) {
408 DriverStr(RepeatFFF(&mips::MipsAssembler::SeleqzD, "seleqz.d ${reg1}, ${reg2}, ${reg3}"),
409 "seleqz.d");
410}
411
412TEST_F(AssemblerMIPS32r6Test, SelnezS) {
413 DriverStr(RepeatFFF(&mips::MipsAssembler::SelnezS, "selnez.s ${reg1}, ${reg2}, ${reg3}"),
414 "selnez.s");
415}
416
417TEST_F(AssemblerMIPS32r6Test, SelnezD) {
418 DriverStr(RepeatFFF(&mips::MipsAssembler::SelnezD, "selnez.d ${reg1}, ${reg2}, ${reg3}"),
419 "selnez.d");
420}
421
Chris Larsen3add9cb2016-04-14 14:01:33 -0700422TEST_F(AssemblerMIPS32r6Test, ClassS) {
423 DriverStr(RepeatFF(&mips::MipsAssembler::ClassS, "class.s ${reg1}, ${reg2}"), "class.s");
424}
425
426TEST_F(AssemblerMIPS32r6Test, ClassD) {
427 DriverStr(RepeatFF(&mips::MipsAssembler::ClassD, "class.d ${reg1}, ${reg2}"), "class.d");
428}
429
430TEST_F(AssemblerMIPS32r6Test, MinS) {
431 DriverStr(RepeatFFF(&mips::MipsAssembler::MinS, "min.s ${reg1}, ${reg2}, ${reg3}"), "min.s");
432}
433
434TEST_F(AssemblerMIPS32r6Test, MinD) {
435 DriverStr(RepeatFFF(&mips::MipsAssembler::MinD, "min.d ${reg1}, ${reg2}, ${reg3}"), "min.d");
436}
437
438TEST_F(AssemblerMIPS32r6Test, MaxS) {
439 DriverStr(RepeatFFF(&mips::MipsAssembler::MaxS, "max.s ${reg1}, ${reg2}, ${reg3}"), "max.s");
440}
441
442TEST_F(AssemblerMIPS32r6Test, MaxD) {
443 DriverStr(RepeatFFF(&mips::MipsAssembler::MaxD, "max.d ${reg1}, ${reg2}, ${reg3}"), "max.d");
444}
445
446TEST_F(AssemblerMIPS32r6Test, CmpUnS) {
447 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpUnS, "cmp.un.s ${reg1}, ${reg2}, ${reg3}"),
448 "cmp.un.s");
449}
450
451TEST_F(AssemblerMIPS32r6Test, CmpEqS) {
452 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpEqS, "cmp.eq.s ${reg1}, ${reg2}, ${reg3}"),
453 "cmp.eq.s");
454}
455
456TEST_F(AssemblerMIPS32r6Test, CmpUeqS) {
457 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpUeqS, "cmp.ueq.s ${reg1}, ${reg2}, ${reg3}"),
458 "cmp.ueq.s");
459}
460
461TEST_F(AssemblerMIPS32r6Test, CmpLtS) {
462 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpLtS, "cmp.lt.s ${reg1}, ${reg2}, ${reg3}"),
463 "cmp.lt.s");
464}
465
466TEST_F(AssemblerMIPS32r6Test, CmpUltS) {
467 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpUltS, "cmp.ult.s ${reg1}, ${reg2}, ${reg3}"),
468 "cmp.ult.s");
469}
470
471TEST_F(AssemblerMIPS32r6Test, CmpLeS) {
472 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpLeS, "cmp.le.s ${reg1}, ${reg2}, ${reg3}"),
473 "cmp.le.s");
474}
475
476TEST_F(AssemblerMIPS32r6Test, CmpUleS) {
477 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpUleS, "cmp.ule.s ${reg1}, ${reg2}, ${reg3}"),
478 "cmp.ule.s");
479}
480
481TEST_F(AssemblerMIPS32r6Test, CmpOrS) {
482 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpOrS, "cmp.or.s ${reg1}, ${reg2}, ${reg3}"),
483 "cmp.or.s");
484}
485
486TEST_F(AssemblerMIPS32r6Test, CmpUneS) {
487 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpUneS, "cmp.une.s ${reg1}, ${reg2}, ${reg3}"),
488 "cmp.une.s");
489}
490
491TEST_F(AssemblerMIPS32r6Test, CmpNeS) {
492 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpNeS, "cmp.ne.s ${reg1}, ${reg2}, ${reg3}"),
493 "cmp.ne.s");
494}
495
496TEST_F(AssemblerMIPS32r6Test, CmpUnD) {
497 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpUnD, "cmp.un.d ${reg1}, ${reg2}, ${reg3}"),
498 "cmp.un.d");
499}
500
501TEST_F(AssemblerMIPS32r6Test, CmpEqD) {
502 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpEqD, "cmp.eq.d ${reg1}, ${reg2}, ${reg3}"),
503 "cmp.eq.d");
504}
505
506TEST_F(AssemblerMIPS32r6Test, CmpUeqD) {
507 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpUeqD, "cmp.ueq.d ${reg1}, ${reg2}, ${reg3}"),
508 "cmp.ueq.d");
509}
510
511TEST_F(AssemblerMIPS32r6Test, CmpLtD) {
512 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpLtD, "cmp.lt.d ${reg1}, ${reg2}, ${reg3}"),
513 "cmp.lt.d");
514}
515
516TEST_F(AssemblerMIPS32r6Test, CmpUltD) {
517 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpUltD, "cmp.ult.d ${reg1}, ${reg2}, ${reg3}"),
518 "cmp.ult.d");
519}
520
521TEST_F(AssemblerMIPS32r6Test, CmpLeD) {
522 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpLeD, "cmp.le.d ${reg1}, ${reg2}, ${reg3}"),
523 "cmp.le.d");
524}
525
526TEST_F(AssemblerMIPS32r6Test, CmpUleD) {
527 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpUleD, "cmp.ule.d ${reg1}, ${reg2}, ${reg3}"),
528 "cmp.ule.d");
529}
530
531TEST_F(AssemblerMIPS32r6Test, CmpOrD) {
532 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpOrD, "cmp.or.d ${reg1}, ${reg2}, ${reg3}"),
533 "cmp.or.d");
534}
535
536TEST_F(AssemblerMIPS32r6Test, CmpUneD) {
537 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpUneD, "cmp.une.d ${reg1}, ${reg2}, ${reg3}"),
538 "cmp.une.d");
539}
540
541TEST_F(AssemblerMIPS32r6Test, CmpNeD) {
542 DriverStr(RepeatFFF(&mips::MipsAssembler::CmpNeD, "cmp.ne.d ${reg1}, ${reg2}, ${reg3}"),
543 "cmp.ne.d");
544}
545
546TEST_F(AssemblerMIPS32r6Test, LoadDFromOffset) {
547 __ LoadDFromOffset(mips::F0, mips::A0, -0x8000);
548 __ LoadDFromOffset(mips::F0, mips::A0, +0);
549 __ LoadDFromOffset(mips::F0, mips::A0, +0x7FF8);
550 __ LoadDFromOffset(mips::F0, mips::A0, +0x7FFB);
551 __ LoadDFromOffset(mips::F0, mips::A0, +0x7FFC);
552 __ LoadDFromOffset(mips::F0, mips::A0, +0x7FFF);
553 __ LoadDFromOffset(mips::F0, mips::A0, -0xFFF0);
554 __ LoadDFromOffset(mips::F0, mips::A0, -0x8008);
555 __ LoadDFromOffset(mips::F0, mips::A0, -0x8001);
556 __ LoadDFromOffset(mips::F0, mips::A0, +0x8000);
557 __ LoadDFromOffset(mips::F0, mips::A0, +0xFFF0);
558 __ LoadDFromOffset(mips::F0, mips::A0, -0x17FE8);
559 __ LoadDFromOffset(mips::F0, mips::A0, -0x0FFF8);
560 __ LoadDFromOffset(mips::F0, mips::A0, -0x0FFF1);
561 __ LoadDFromOffset(mips::F0, mips::A0, +0x0FFF1);
562 __ LoadDFromOffset(mips::F0, mips::A0, +0x0FFF8);
563 __ LoadDFromOffset(mips::F0, mips::A0, +0x17FE8);
564 __ LoadDFromOffset(mips::F0, mips::A0, -0x17FF0);
565 __ LoadDFromOffset(mips::F0, mips::A0, -0x17FE9);
566 __ LoadDFromOffset(mips::F0, mips::A0, +0x17FE9);
567 __ LoadDFromOffset(mips::F0, mips::A0, +0x17FF0);
568 __ LoadDFromOffset(mips::F0, mips::A0, +0x12345678);
569
570 const char* expected =
571 "ldc1 $f0, -0x8000($a0)\n"
572 "ldc1 $f0, 0($a0)\n"
573 "ldc1 $f0, 0x7FF8($a0)\n"
574 "lwc1 $f0, 0x7FFB($a0)\n"
575 "lw $t8, 0x7FFF($a0)\n"
576 "mthc1 $t8, $f0\n"
577 "addiu $at, $a0, 0x7FF8\n"
578 "lwc1 $f0, 4($at)\n"
579 "lw $t8, 8($at)\n"
580 "mthc1 $t8, $f0\n"
581 "addiu $at, $a0, 0x7FF8\n"
582 "lwc1 $f0, 7($at)\n"
583 "lw $t8, 11($at)\n"
584 "mthc1 $t8, $f0\n"
585 "addiu $at, $a0, -0x7FF8\n"
586 "ldc1 $f0, -0x7FF8($at)\n"
587 "addiu $at, $a0, -0x7FF8\n"
588 "ldc1 $f0, -0x10($at)\n"
589 "addiu $at, $a0, -0x7FF8\n"
590 "lwc1 $f0, -9($at)\n"
591 "lw $t8, -5($at)\n"
592 "mthc1 $t8, $f0\n"
593 "addiu $at, $a0, 0x7FF8\n"
594 "ldc1 $f0, 8($at)\n"
595 "addiu $at, $a0, 0x7FF8\n"
596 "ldc1 $f0, 0x7FF8($at)\n"
597 "aui $at, $a0, 0xFFFF\n"
598 "ldc1 $f0, -0x7FE8($at)\n"
599 "aui $at, $a0, 0xFFFF\n"
600 "ldc1 $f0, 0x8($at)\n"
601 "aui $at, $a0, 0xFFFF\n"
602 "lwc1 $f0, 0xF($at)\n"
603 "lw $t8, 0x13($at)\n"
604 "mthc1 $t8, $f0\n"
605 "aui $at, $a0, 0x1\n"
606 "lwc1 $f0, -0xF($at)\n"
607 "lw $t8, -0xB($at)\n"
608 "mthc1 $t8, $f0\n"
609 "aui $at, $a0, 0x1\n"
610 "ldc1 $f0, -0x8($at)\n"
611 "aui $at, $a0, 0x1\n"
612 "ldc1 $f0, 0x7FE8($at)\n"
613 "aui $at, $a0, 0xFFFF\n"
614 "ldc1 $f0, -0x7FF0($at)\n"
615 "aui $at, $a0, 0xFFFF\n"
616 "lwc1 $f0, -0x7FE9($at)\n"
617 "lw $t8, -0x7FE5($at)\n"
618 "mthc1 $t8, $f0\n"
619 "aui $at, $a0, 0x1\n"
620 "lwc1 $f0, 0x7FE9($at)\n"
621 "lw $t8, 0x7FED($at)\n"
622 "mthc1 $t8, $f0\n"
623 "aui $at, $a0, 0x1\n"
624 "ldc1 $f0, 0x7FF0($at)\n"
625 "aui $at, $a0, 0x1234\n"
626 "ldc1 $f0, 0x5678($at)\n";
627 DriverStr(expected, "LoadDFromOffset");
628}
629
630TEST_F(AssemblerMIPS32r6Test, StoreDToOffset) {
631 __ StoreDToOffset(mips::F0, mips::A0, -0x8000);
632 __ StoreDToOffset(mips::F0, mips::A0, +0);
633 __ StoreDToOffset(mips::F0, mips::A0, +0x7FF8);
634 __ StoreDToOffset(mips::F0, mips::A0, +0x7FFB);
635 __ StoreDToOffset(mips::F0, mips::A0, +0x7FFC);
636 __ StoreDToOffset(mips::F0, mips::A0, +0x7FFF);
637 __ StoreDToOffset(mips::F0, mips::A0, -0xFFF0);
638 __ StoreDToOffset(mips::F0, mips::A0, -0x8008);
639 __ StoreDToOffset(mips::F0, mips::A0, -0x8001);
640 __ StoreDToOffset(mips::F0, mips::A0, +0x8000);
641 __ StoreDToOffset(mips::F0, mips::A0, +0xFFF0);
642 __ StoreDToOffset(mips::F0, mips::A0, -0x17FE8);
643 __ StoreDToOffset(mips::F0, mips::A0, -0x0FFF8);
644 __ StoreDToOffset(mips::F0, mips::A0, -0x0FFF1);
645 __ StoreDToOffset(mips::F0, mips::A0, +0x0FFF1);
646 __ StoreDToOffset(mips::F0, mips::A0, +0x0FFF8);
647 __ StoreDToOffset(mips::F0, mips::A0, +0x17FE8);
648 __ StoreDToOffset(mips::F0, mips::A0, -0x17FF0);
649 __ StoreDToOffset(mips::F0, mips::A0, -0x17FE9);
650 __ StoreDToOffset(mips::F0, mips::A0, +0x17FE9);
651 __ StoreDToOffset(mips::F0, mips::A0, +0x17FF0);
652 __ StoreDToOffset(mips::F0, mips::A0, +0x12345678);
653
654 const char* expected =
655 "sdc1 $f0, -0x8000($a0)\n"
656 "sdc1 $f0, 0($a0)\n"
657 "sdc1 $f0, 0x7FF8($a0)\n"
658 "mfhc1 $t8, $f0\n"
659 "swc1 $f0, 0x7FFB($a0)\n"
660 "sw $t8, 0x7FFF($a0)\n"
661 "addiu $at, $a0, 0x7FF8\n"
662 "mfhc1 $t8, $f0\n"
663 "swc1 $f0, 4($at)\n"
664 "sw $t8, 8($at)\n"
665 "addiu $at, $a0, 0x7FF8\n"
666 "mfhc1 $t8, $f0\n"
667 "swc1 $f0, 7($at)\n"
668 "sw $t8, 11($at)\n"
669 "addiu $at, $a0, -0x7FF8\n"
670 "sdc1 $f0, -0x7FF8($at)\n"
671 "addiu $at, $a0, -0x7FF8\n"
672 "sdc1 $f0, -0x10($at)\n"
673 "addiu $at, $a0, -0x7FF8\n"
674 "mfhc1 $t8, $f0\n"
675 "swc1 $f0, -9($at)\n"
676 "sw $t8, -5($at)\n"
677 "addiu $at, $a0, 0x7FF8\n"
678 "sdc1 $f0, 8($at)\n"
679 "addiu $at, $a0, 0x7FF8\n"
680 "sdc1 $f0, 0x7FF8($at)\n"
681 "aui $at, $a0, 0xFFFF\n"
682 "sdc1 $f0, -0x7FE8($at)\n"
683 "aui $at, $a0, 0xFFFF\n"
684 "sdc1 $f0, 0x8($at)\n"
685 "aui $at, $a0, 0xFFFF\n"
686 "mfhc1 $t8, $f0\n"
687 "swc1 $f0, 0xF($at)\n"
688 "sw $t8, 0x13($at)\n"
689 "aui $at, $a0, 0x1\n"
690 "mfhc1 $t8, $f0\n"
691 "swc1 $f0, -0xF($at)\n"
692 "sw $t8, -0xB($at)\n"
693 "aui $at, $a0, 0x1\n"
694 "sdc1 $f0, -0x8($at)\n"
695 "aui $at, $a0, 0x1\n"
696 "sdc1 $f0, 0x7FE8($at)\n"
697 "aui $at, $a0, 0xFFFF\n"
698 "sdc1 $f0, -0x7FF0($at)\n"
699 "aui $at, $a0, 0xFFFF\n"
700 "mfhc1 $t8, $f0\n"
701 "swc1 $f0, -0x7FE9($at)\n"
702 "sw $t8, -0x7FE5($at)\n"
703 "aui $at, $a0, 0x1\n"
704 "mfhc1 $t8, $f0\n"
705 "swc1 $f0, 0x7FE9($at)\n"
706 "sw $t8, 0x7FED($at)\n"
707 "aui $at, $a0, 0x1\n"
708 "sdc1 $f0, 0x7FF0($at)\n"
709 "aui $at, $a0, 0x1234\n"
710 "sdc1 $f0, 0x5678($at)\n";
711 DriverStr(expected, "StoreDToOffset");
712}
713
Alexey Frunze96b66822016-09-10 02:32:44 -0700714TEST_F(AssemblerMIPS32r6Test, LoadFarthestNearLabelAddress) {
715 mips::MipsLabel label;
716 __ LoadLabelAddress(mips::V0, mips::ZERO, &label);
717 constexpr size_t kAdduCount = 0x3FFDE;
718 for (size_t i = 0; i != kAdduCount; ++i) {
719 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
720 }
721 __ Bind(&label);
722
723 std::string expected =
724 "lapc $v0, 1f\n" +
725 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
726 "1:\n";
727 DriverStr(expected, "LoadFarthestNearLabelAddress");
728}
729
730TEST_F(AssemblerMIPS32r6Test, LoadNearestFarLabelAddress) {
731 mips::MipsLabel label;
732 __ LoadLabelAddress(mips::V0, mips::ZERO, &label);
733 constexpr size_t kAdduCount = 0x3FFDF;
734 for (size_t i = 0; i != kAdduCount; ++i) {
735 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
736 }
737 __ Bind(&label);
738
739 std::string expected =
740 "1:\n"
741 "auipc $at, %hi(2f - 1b)\n"
742 "addiu $v0, $at, %lo(2f - 1b)\n" +
743 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
744 "2:\n";
745 DriverStr(expected, "LoadNearestFarLabelAddress");
746}
747
Alexey Frunzee3fb2452016-05-10 16:08:05 -0700748TEST_F(AssemblerMIPS32r6Test, LoadFarthestNearLiteral) {
749 mips::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
750 __ LoadLiteral(mips::V0, mips::ZERO, literal);
751 constexpr size_t kAdduCount = 0x3FFDE;
752 for (size_t i = 0; i != kAdduCount; ++i) {
753 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
754 }
755
756 std::string expected =
757 "lwpc $v0, 1f\n" +
758 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
759 "1:\n"
760 ".word 0x12345678\n";
761 DriverStr(expected, "LoadFarthestNearLiteral");
762}
763
764TEST_F(AssemblerMIPS32r6Test, LoadNearestFarLiteral) {
765 mips::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
766 __ LoadLiteral(mips::V0, mips::ZERO, literal);
767 constexpr size_t kAdduCount = 0x3FFDF;
768 for (size_t i = 0; i != kAdduCount; ++i) {
769 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
770 }
771
772 std::string expected =
773 "1:\n"
774 "auipc $at, %hi(2f - 1b)\n"
775 "lw $v0, %lo(2f - 1b)($at)\n" +
776 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
777 "2:\n"
778 ".word 0x12345678\n";
779 DriverStr(expected, "LoadNearestFarLiteral");
780}
781
Chris Larsen3add9cb2016-04-14 14:01:33 -0700782//////////////
783// BRANCHES //
784//////////////
785
Alexey Frunze57eb0f52016-07-29 22:04:46 -0700786TEST_F(AssemblerMIPS32r6Test, ImpossibleReordering) {
787 mips::MipsLabel label;
788 __ SetReorder(true);
789 __ Bind(&label);
790
791 __ CmpLtD(mips::F0, mips::F2, mips::F4);
792 __ Bc1nez(mips::F0, &label); // F0 dependency.
793
794 __ MulD(mips::F10, mips::F2, mips::F4);
795 __ Bc1eqz(mips::F10, &label); // F10 dependency.
796
797 std::string expected =
798 ".set noreorder\n"
799 "1:\n"
800
801 "cmp.lt.d $f0, $f2, $f4\n"
802 "bc1nez $f0, 1b\n"
803 "nop\n"
804
805 "mul.d $f10, $f2, $f4\n"
806 "bc1eqz $f10, 1b\n"
807 "nop\n";
808 DriverStr(expected, "ImpossibleReordering");
809}
810
811TEST_F(AssemblerMIPS32r6Test, Reordering) {
812 mips::MipsLabel label;
813 __ SetReorder(true);
814 __ Bind(&label);
815
816 __ CmpLtD(mips::F0, mips::F2, mips::F4);
817 __ Bc1nez(mips::F2, &label);
818
819 __ MulD(mips::F0, mips::F2, mips::F4);
820 __ Bc1eqz(mips::F4, &label);
821
822 std::string expected =
823 ".set noreorder\n"
824 "1:\n"
825
826 "bc1nez $f2, 1b\n"
827 "cmp.lt.d $f0, $f2, $f4\n"
828
829 "bc1eqz $f4, 1b\n"
830 "mul.d $f0, $f2, $f4\n";
831 DriverStr(expected, "Reordering");
832}
833
834TEST_F(AssemblerMIPS32r6Test, SetReorder) {
835 mips::MipsLabel label1, label2, label3, label4;
836
837 __ SetReorder(true);
838 __ Bind(&label1);
839 __ Addu(mips::T0, mips::T1, mips::T2);
840 __ Bc1nez(mips::F0, &label1);
841
842 __ SetReorder(false);
843 __ Bind(&label2);
844 __ Addu(mips::T0, mips::T1, mips::T2);
845 __ Bc1nez(mips::F0, &label2);
846
847 __ SetReorder(true);
848 __ Bind(&label3);
849 __ Addu(mips::T0, mips::T1, mips::T2);
850 __ Bc1eqz(mips::F0, &label3);
851
852 __ SetReorder(false);
853 __ Bind(&label4);
854 __ Addu(mips::T0, mips::T1, mips::T2);
855 __ Bc1eqz(mips::F0, &label4);
856
857 std::string expected =
858 ".set noreorder\n"
859 "1:\n"
860 "bc1nez $f0, 1b\n"
861 "addu $t0, $t1, $t2\n"
862
863 "2:\n"
864 "addu $t0, $t1, $t2\n"
865 "bc1nez $f0, 2b\n"
866 "nop\n"
867
868 "3:\n"
869 "bc1eqz $f0, 3b\n"
870 "addu $t0, $t1, $t2\n"
871
872 "4:\n"
873 "addu $t0, $t1, $t2\n"
874 "bc1eqz $f0, 4b\n"
875 "nop\n";
876 DriverStr(expected, "SetReorder");
877}
878
879TEST_F(AssemblerMIPS32r6Test, LongBranchReorder) {
880 mips::MipsLabel label;
881 __ SetReorder(true);
882 __ Subu(mips::T0, mips::T1, mips::T2);
883 __ Bc1nez(mips::F0, &label);
884 constexpr uint32_t kAdduCount1 = (1u << 15) + 1;
885 for (uint32_t i = 0; i != kAdduCount1; ++i) {
886 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
887 }
888 __ Bind(&label);
889 constexpr uint32_t kAdduCount2 = (1u << 15) + 1;
890 for (uint32_t i = 0; i != kAdduCount2; ++i) {
891 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
892 }
893 __ Subu(mips::T0, mips::T1, mips::T2);
894 __ Bc1eqz(mips::F0, &label);
895
896 uint32_t offset_forward = 2 + kAdduCount1; // 2: account for auipc and jic.
897 offset_forward <<= 2;
898 offset_forward += (offset_forward & 0x8000) << 1; // Account for sign extension in jic.
899
900 uint32_t offset_back = -(kAdduCount2 + 2); // 2: account for subu and bc1nez.
901 offset_back <<= 2;
902 offset_back += (offset_back & 0x8000) << 1; // Account for sign extension in jic.
903
904 std::ostringstream oss;
905 oss <<
906 ".set noreorder\n"
907 "subu $t0, $t1, $t2\n"
908 "bc1eqz $f0, 1f\n"
909 "auipc $at, 0x" << std::hex << High16Bits(offset_forward) << "\n"
910 "jic $at, 0x" << std::hex << Low16Bits(offset_forward) << "\n"
911 "1:\n" <<
912 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") <<
913 "2:\n" <<
914 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") <<
915 "subu $t0, $t1, $t2\n"
916 "bc1nez $f0, 3f\n"
917 "auipc $at, 0x" << std::hex << High16Bits(offset_back) << "\n"
918 "jic $at, 0x" << std::hex << Low16Bits(offset_back) << "\n"
919 "3:\n";
920 std::string expected = oss.str();
921 DriverStr(expected, "LongBeqc");
922}
923
Alexey Frunze96b66822016-09-10 02:32:44 -0700924// TODO: MipsAssembler::Bc
Chris Larsen3add9cb2016-04-14 14:01:33 -0700925// MipsAssembler::Jic
926// MipsAssembler::Jialc
927// MipsAssembler::Bltc
928// MipsAssembler::Bltzc
929// MipsAssembler::Bgtzc
930// MipsAssembler::Bgec
931// MipsAssembler::Bgezc
932// MipsAssembler::Blezc
933// MipsAssembler::Bltuc
934// MipsAssembler::Bgeuc
935// MipsAssembler::Beqc
936// MipsAssembler::Bnec
937// MipsAssembler::Beqzc
938// MipsAssembler::Bnezc
939// MipsAssembler::Bc1eqz
940// MipsAssembler::Bc1nez
941// MipsAssembler::Buncond
942// MipsAssembler::Bcond
943// MipsAssembler::Call
944
945// TODO: AssemblerMIPS32r6Test.B
946// AssemblerMIPS32r6Test.Beq
947// AssemblerMIPS32r6Test.Bne
948// AssemblerMIPS32r6Test.Beqz
949// AssemblerMIPS32r6Test.Bnez
950// AssemblerMIPS32r6Test.Bltz
951// AssemblerMIPS32r6Test.Bgez
952// AssemblerMIPS32r6Test.Blez
953// AssemblerMIPS32r6Test.Bgtz
954// AssemblerMIPS32r6Test.Blt
955// AssemblerMIPS32r6Test.Bge
956// AssemblerMIPS32r6Test.Bltu
957// AssemblerMIPS32r6Test.Bgeu
958
Lena Djokic0758ae72017-05-23 11:06:23 +0200959// MSA instructions.
960
961TEST_F(AssemblerMIPS32r6Test, AndV) {
962 DriverStr(RepeatVVV(&mips::MipsAssembler::AndV, "and.v ${reg1}, ${reg2}, ${reg3}"), "and.v");
963}
964
965TEST_F(AssemblerMIPS32r6Test, OrV) {
966 DriverStr(RepeatVVV(&mips::MipsAssembler::OrV, "or.v ${reg1}, ${reg2}, ${reg3}"), "or.v");
967}
968
969TEST_F(AssemblerMIPS32r6Test, NorV) {
970 DriverStr(RepeatVVV(&mips::MipsAssembler::NorV, "nor.v ${reg1}, ${reg2}, ${reg3}"), "nor.v");
971}
972
973TEST_F(AssemblerMIPS32r6Test, XorV) {
974 DriverStr(RepeatVVV(&mips::MipsAssembler::XorV, "xor.v ${reg1}, ${reg2}, ${reg3}"), "xor.v");
975}
976
977TEST_F(AssemblerMIPS32r6Test, AddvB) {
978 DriverStr(RepeatVVV(&mips::MipsAssembler::AddvB, "addv.b ${reg1}, ${reg2}, ${reg3}"), "addv.b");
979}
980
981TEST_F(AssemblerMIPS32r6Test, AddvH) {
982 DriverStr(RepeatVVV(&mips::MipsAssembler::AddvH, "addv.h ${reg1}, ${reg2}, ${reg3}"), "addv.h");
983}
984
985TEST_F(AssemblerMIPS32r6Test, AddvW) {
986 DriverStr(RepeatVVV(&mips::MipsAssembler::AddvW, "addv.w ${reg1}, ${reg2}, ${reg3}"), "addv.w");
987}
988
989TEST_F(AssemblerMIPS32r6Test, AddvD) {
990 DriverStr(RepeatVVV(&mips::MipsAssembler::AddvD, "addv.d ${reg1}, ${reg2}, ${reg3}"), "addv.d");
991}
992
993TEST_F(AssemblerMIPS32r6Test, SubvB) {
994 DriverStr(RepeatVVV(&mips::MipsAssembler::SubvB, "subv.b ${reg1}, ${reg2}, ${reg3}"), "subv.b");
995}
996
997TEST_F(AssemblerMIPS32r6Test, SubvH) {
998 DriverStr(RepeatVVV(&mips::MipsAssembler::SubvH, "subv.h ${reg1}, ${reg2}, ${reg3}"), "subv.h");
999}
1000
1001TEST_F(AssemblerMIPS32r6Test, SubvW) {
1002 DriverStr(RepeatVVV(&mips::MipsAssembler::SubvW, "subv.w ${reg1}, ${reg2}, ${reg3}"), "subv.w");
1003}
1004
1005TEST_F(AssemblerMIPS32r6Test, SubvD) {
1006 DriverStr(RepeatVVV(&mips::MipsAssembler::SubvD, "subv.d ${reg1}, ${reg2}, ${reg3}"), "subv.d");
1007}
1008
1009TEST_F(AssemblerMIPS32r6Test, MulvB) {
1010 DriverStr(RepeatVVV(&mips::MipsAssembler::MulvB, "mulv.b ${reg1}, ${reg2}, ${reg3}"), "mulv.b");
1011}
1012
1013TEST_F(AssemblerMIPS32r6Test, MulvH) {
1014 DriverStr(RepeatVVV(&mips::MipsAssembler::MulvH, "mulv.h ${reg1}, ${reg2}, ${reg3}"), "mulv.h");
1015}
1016
1017TEST_F(AssemblerMIPS32r6Test, MulvW) {
1018 DriverStr(RepeatVVV(&mips::MipsAssembler::MulvW, "mulv.w ${reg1}, ${reg2}, ${reg3}"), "mulv.w");
1019}
1020
1021TEST_F(AssemblerMIPS32r6Test, MulvD) {
1022 DriverStr(RepeatVVV(&mips::MipsAssembler::MulvD, "mulv.d ${reg1}, ${reg2}, ${reg3}"), "mulv.d");
1023}
1024
1025TEST_F(AssemblerMIPS32r6Test, Div_sB) {
1026 DriverStr(RepeatVVV(&mips::MipsAssembler::Div_sB, "div_s.b ${reg1}, ${reg2}, ${reg3}"),
1027 "div_s.b");
1028}
1029
1030TEST_F(AssemblerMIPS32r6Test, Div_sH) {
1031 DriverStr(RepeatVVV(&mips::MipsAssembler::Div_sH, "div_s.h ${reg1}, ${reg2}, ${reg3}"),
1032 "div_s.h");
1033}
1034
1035TEST_F(AssemblerMIPS32r6Test, Div_sW) {
1036 DriverStr(RepeatVVV(&mips::MipsAssembler::Div_sW, "div_s.w ${reg1}, ${reg2}, ${reg3}"),
1037 "div_s.w");
1038}
1039
1040TEST_F(AssemblerMIPS32r6Test, Div_sD) {
1041 DriverStr(RepeatVVV(&mips::MipsAssembler::Div_sD, "div_s.d ${reg1}, ${reg2}, ${reg3}"),
1042 "div_s.d");
1043}
1044
1045TEST_F(AssemblerMIPS32r6Test, Div_uB) {
1046 DriverStr(RepeatVVV(&mips::MipsAssembler::Div_uB, "div_u.b ${reg1}, ${reg2}, ${reg3}"),
1047 "div_u.b");
1048}
1049
1050TEST_F(AssemblerMIPS32r6Test, Div_uH) {
1051 DriverStr(RepeatVVV(&mips::MipsAssembler::Div_uH, "div_u.h ${reg1}, ${reg2}, ${reg3}"),
1052 "div_u.h");
1053}
1054
1055TEST_F(AssemblerMIPS32r6Test, Div_uW) {
1056 DriverStr(RepeatVVV(&mips::MipsAssembler::Div_uW, "div_u.w ${reg1}, ${reg2}, ${reg3}"),
1057 "div_u.w");
1058}
1059
1060TEST_F(AssemblerMIPS32r6Test, Div_uD) {
1061 DriverStr(RepeatVVV(&mips::MipsAssembler::Div_uD, "div_u.d ${reg1}, ${reg2}, ${reg3}"),
1062 "div_u.d");
1063}
1064
1065TEST_F(AssemblerMIPS32r6Test, Mod_sB) {
1066 DriverStr(RepeatVVV(&mips::MipsAssembler::Mod_sB, "mod_s.b ${reg1}, ${reg2}, ${reg3}"),
1067 "mod_s.b");
1068}
1069
1070TEST_F(AssemblerMIPS32r6Test, Mod_sH) {
1071 DriverStr(RepeatVVV(&mips::MipsAssembler::Mod_sH, "mod_s.h ${reg1}, ${reg2}, ${reg3}"),
1072 "mod_s.h");
1073}
1074
1075TEST_F(AssemblerMIPS32r6Test, Mod_sW) {
1076 DriverStr(RepeatVVV(&mips::MipsAssembler::Mod_sW, "mod_s.w ${reg1}, ${reg2}, ${reg3}"),
1077 "mod_s.w");
1078}
1079
1080TEST_F(AssemblerMIPS32r6Test, Mod_sD) {
1081 DriverStr(RepeatVVV(&mips::MipsAssembler::Mod_sD, "mod_s.d ${reg1}, ${reg2}, ${reg3}"),
1082 "mod_s.d");
1083}
1084
1085TEST_F(AssemblerMIPS32r6Test, Mod_uB) {
1086 DriverStr(RepeatVVV(&mips::MipsAssembler::Mod_uB, "mod_u.b ${reg1}, ${reg2}, ${reg3}"),
1087 "mod_u.b");
1088}
1089
1090TEST_F(AssemblerMIPS32r6Test, Mod_uH) {
1091 DriverStr(RepeatVVV(&mips::MipsAssembler::Mod_uH, "mod_u.h ${reg1}, ${reg2}, ${reg3}"),
1092 "mod_u.h");
1093}
1094
1095TEST_F(AssemblerMIPS32r6Test, Mod_uW) {
1096 DriverStr(RepeatVVV(&mips::MipsAssembler::Mod_uW, "mod_u.w ${reg1}, ${reg2}, ${reg3}"),
1097 "mod_u.w");
1098}
1099
1100TEST_F(AssemblerMIPS32r6Test, Mod_uD) {
1101 DriverStr(RepeatVVV(&mips::MipsAssembler::Mod_uD, "mod_u.d ${reg1}, ${reg2}, ${reg3}"),
1102 "mod_u.d");
1103}
1104
1105TEST_F(AssemblerMIPS32r6Test, Add_aB) {
1106 DriverStr(RepeatVVV(&mips::MipsAssembler::Add_aB, "add_a.b ${reg1}, ${reg2}, ${reg3}"),
1107 "add_a.b");
1108}
1109
1110TEST_F(AssemblerMIPS32r6Test, Add_aH) {
1111 DriverStr(RepeatVVV(&mips::MipsAssembler::Add_aH, "add_a.h ${reg1}, ${reg2}, ${reg3}"),
1112 "add_a.h");
1113}
1114
1115TEST_F(AssemblerMIPS32r6Test, Add_aW) {
1116 DriverStr(RepeatVVV(&mips::MipsAssembler::Add_aW, "add_a.w ${reg1}, ${reg2}, ${reg3}"),
1117 "add_a.w");
1118}
1119
1120TEST_F(AssemblerMIPS32r6Test, Add_aD) {
1121 DriverStr(RepeatVVV(&mips::MipsAssembler::Add_aD, "add_a.d ${reg1}, ${reg2}, ${reg3}"),
1122 "add_a.d");
1123}
1124
1125TEST_F(AssemblerMIPS32r6Test, Ave_sB) {
1126 DriverStr(RepeatVVV(&mips::MipsAssembler::Ave_sB, "ave_s.b ${reg1}, ${reg2}, ${reg3}"),
1127 "ave_s.b");
1128}
1129
1130TEST_F(AssemblerMIPS32r6Test, Ave_sH) {
1131 DriverStr(RepeatVVV(&mips::MipsAssembler::Ave_sH, "ave_s.h ${reg1}, ${reg2}, ${reg3}"),
1132 "ave_s.h");
1133}
1134
1135TEST_F(AssemblerMIPS32r6Test, Ave_sW) {
1136 DriverStr(RepeatVVV(&mips::MipsAssembler::Ave_sW, "ave_s.w ${reg1}, ${reg2}, ${reg3}"),
1137 "ave_s.w");
1138}
1139
1140TEST_F(AssemblerMIPS32r6Test, Ave_sD) {
1141 DriverStr(RepeatVVV(&mips::MipsAssembler::Ave_sD, "ave_s.d ${reg1}, ${reg2}, ${reg3}"),
1142 "ave_s.d");
1143}
1144
1145TEST_F(AssemblerMIPS32r6Test, Ave_uB) {
1146 DriverStr(RepeatVVV(&mips::MipsAssembler::Ave_uB, "ave_u.b ${reg1}, ${reg2}, ${reg3}"),
1147 "ave_u.b");
1148}
1149
1150TEST_F(AssemblerMIPS32r6Test, Ave_uH) {
1151 DriverStr(RepeatVVV(&mips::MipsAssembler::Ave_uH, "ave_u.h ${reg1}, ${reg2}, ${reg3}"),
1152 "ave_u.h");
1153}
1154
1155TEST_F(AssemblerMIPS32r6Test, Ave_uW) {
1156 DriverStr(RepeatVVV(&mips::MipsAssembler::Ave_uW, "ave_u.w ${reg1}, ${reg2}, ${reg3}"),
1157 "ave_u.w");
1158}
1159
1160TEST_F(AssemblerMIPS32r6Test, Ave_uD) {
1161 DriverStr(RepeatVVV(&mips::MipsAssembler::Ave_uD, "ave_u.d ${reg1}, ${reg2}, ${reg3}"),
1162 "ave_u.d");
1163}
1164
1165TEST_F(AssemblerMIPS32r6Test, Aver_sB) {
1166 DriverStr(RepeatVVV(&mips::MipsAssembler::Aver_sB, "aver_s.b ${reg1}, ${reg2}, ${reg3}"),
1167 "aver_s.b");
1168}
1169
1170TEST_F(AssemblerMIPS32r6Test, Aver_sH) {
1171 DriverStr(RepeatVVV(&mips::MipsAssembler::Aver_sH, "aver_s.h ${reg1}, ${reg2}, ${reg3}"),
1172 "aver_s.h");
1173}
1174
1175TEST_F(AssemblerMIPS32r6Test, Aver_sW) {
1176 DriverStr(RepeatVVV(&mips::MipsAssembler::Aver_sW, "aver_s.w ${reg1}, ${reg2}, ${reg3}"),
1177 "aver_s.w");
1178}
1179
1180TEST_F(AssemblerMIPS32r6Test, Aver_sD) {
1181 DriverStr(RepeatVVV(&mips::MipsAssembler::Aver_sD, "aver_s.d ${reg1}, ${reg2}, ${reg3}"),
1182 "aver_s.d");
1183}
1184
1185TEST_F(AssemblerMIPS32r6Test, Aver_uB) {
1186 DriverStr(RepeatVVV(&mips::MipsAssembler::Aver_uB, "aver_u.b ${reg1}, ${reg2}, ${reg3}"),
1187 "aver_u.b");
1188}
1189
1190TEST_F(AssemblerMIPS32r6Test, Aver_uH) {
1191 DriverStr(RepeatVVV(&mips::MipsAssembler::Aver_uH, "aver_u.h ${reg1}, ${reg2}, ${reg3}"),
1192 "aver_u.h");
1193}
1194
1195TEST_F(AssemblerMIPS32r6Test, Aver_uW) {
1196 DriverStr(RepeatVVV(&mips::MipsAssembler::Aver_uW, "aver_u.w ${reg1}, ${reg2}, ${reg3}"),
1197 "aver_u.w");
1198}
1199
1200TEST_F(AssemblerMIPS32r6Test, Aver_uD) {
1201 DriverStr(RepeatVVV(&mips::MipsAssembler::Aver_uD, "aver_u.d ${reg1}, ${reg2}, ${reg3}"),
1202 "aver_u.d");
1203}
1204
1205TEST_F(AssemblerMIPS32r6Test, Max_sB) {
1206 DriverStr(RepeatVVV(&mips::MipsAssembler::Max_sB, "max_s.b ${reg1}, ${reg2}, ${reg3}"),
1207 "max_s.b");
1208}
1209
1210TEST_F(AssemblerMIPS32r6Test, Max_sH) {
1211 DriverStr(RepeatVVV(&mips::MipsAssembler::Max_sH, "max_s.h ${reg1}, ${reg2}, ${reg3}"),
1212 "max_s.h");
1213}
1214
1215TEST_F(AssemblerMIPS32r6Test, Max_sW) {
1216 DriverStr(RepeatVVV(&mips::MipsAssembler::Max_sW, "max_s.w ${reg1}, ${reg2}, ${reg3}"),
1217 "max_s.w");
1218}
1219
1220TEST_F(AssemblerMIPS32r6Test, Max_sD) {
1221 DriverStr(RepeatVVV(&mips::MipsAssembler::Max_sD, "max_s.d ${reg1}, ${reg2}, ${reg3}"),
1222 "max_s.d");
1223}
1224
1225TEST_F(AssemblerMIPS32r6Test, Max_uB) {
1226 DriverStr(RepeatVVV(&mips::MipsAssembler::Max_uB, "max_u.b ${reg1}, ${reg2}, ${reg3}"),
1227 "max_u.b");
1228}
1229
1230TEST_F(AssemblerMIPS32r6Test, Max_uH) {
1231 DriverStr(RepeatVVV(&mips::MipsAssembler::Max_uH, "max_u.h ${reg1}, ${reg2}, ${reg3}"),
1232 "max_u.h");
1233}
1234
1235TEST_F(AssemblerMIPS32r6Test, Max_uW) {
1236 DriverStr(RepeatVVV(&mips::MipsAssembler::Max_uW, "max_u.w ${reg1}, ${reg2}, ${reg3}"),
1237 "max_u.w");
1238}
1239
1240TEST_F(AssemblerMIPS32r6Test, Max_uD) {
1241 DriverStr(RepeatVVV(&mips::MipsAssembler::Max_uD, "max_u.d ${reg1}, ${reg2}, ${reg3}"),
1242 "max_u.d");
1243}
1244
1245TEST_F(AssemblerMIPS32r6Test, Min_sB) {
1246 DriverStr(RepeatVVV(&mips::MipsAssembler::Min_sB, "min_s.b ${reg1}, ${reg2}, ${reg3}"),
1247 "min_s.b");
1248}
1249
1250TEST_F(AssemblerMIPS32r6Test, Min_sH) {
1251 DriverStr(RepeatVVV(&mips::MipsAssembler::Min_sH, "min_s.h ${reg1}, ${reg2}, ${reg3}"),
1252 "min_s.h");
1253}
1254
1255TEST_F(AssemblerMIPS32r6Test, Min_sW) {
1256 DriverStr(RepeatVVV(&mips::MipsAssembler::Min_sW, "min_s.w ${reg1}, ${reg2}, ${reg3}"),
1257 "min_s.w");
1258}
1259
1260TEST_F(AssemblerMIPS32r6Test, Min_sD) {
1261 DriverStr(RepeatVVV(&mips::MipsAssembler::Min_sD, "min_s.d ${reg1}, ${reg2}, ${reg3}"),
1262 "min_s.d");
1263}
1264
1265TEST_F(AssemblerMIPS32r6Test, Min_uB) {
1266 DriverStr(RepeatVVV(&mips::MipsAssembler::Min_uB, "min_u.b ${reg1}, ${reg2}, ${reg3}"),
1267 "min_u.b");
1268}
1269
1270TEST_F(AssemblerMIPS32r6Test, Min_uH) {
1271 DriverStr(RepeatVVV(&mips::MipsAssembler::Min_uH, "min_u.h ${reg1}, ${reg2}, ${reg3}"),
1272 "min_u.h");
1273}
1274
1275TEST_F(AssemblerMIPS32r6Test, Min_uW) {
1276 DriverStr(RepeatVVV(&mips::MipsAssembler::Min_uW, "min_u.w ${reg1}, ${reg2}, ${reg3}"),
1277 "min_u.w");
1278}
1279
1280TEST_F(AssemblerMIPS32r6Test, Min_uD) {
1281 DriverStr(RepeatVVV(&mips::MipsAssembler::Min_uD, "min_u.d ${reg1}, ${reg2}, ${reg3}"),
1282 "min_u.d");
1283}
1284
1285TEST_F(AssemblerMIPS32r6Test, FaddW) {
1286 DriverStr(RepeatVVV(&mips::MipsAssembler::FaddW, "fadd.w ${reg1}, ${reg2}, ${reg3}"), "fadd.w");
1287}
1288
1289TEST_F(AssemblerMIPS32r6Test, FaddD) {
1290 DriverStr(RepeatVVV(&mips::MipsAssembler::FaddD, "fadd.d ${reg1}, ${reg2}, ${reg3}"), "fadd.d");
1291}
1292
1293TEST_F(AssemblerMIPS32r6Test, FsubW) {
1294 DriverStr(RepeatVVV(&mips::MipsAssembler::FsubW, "fsub.w ${reg1}, ${reg2}, ${reg3}"), "fsub.w");
1295}
1296
1297TEST_F(AssemblerMIPS32r6Test, FsubD) {
1298 DriverStr(RepeatVVV(&mips::MipsAssembler::FsubD, "fsub.d ${reg1}, ${reg2}, ${reg3}"), "fsub.d");
1299}
1300
1301TEST_F(AssemblerMIPS32r6Test, FmulW) {
1302 DriverStr(RepeatVVV(&mips::MipsAssembler::FmulW, "fmul.w ${reg1}, ${reg2}, ${reg3}"), "fmul.w");
1303}
1304
1305TEST_F(AssemblerMIPS32r6Test, FmulD) {
1306 DriverStr(RepeatVVV(&mips::MipsAssembler::FmulD, "fmul.d ${reg1}, ${reg2}, ${reg3}"), "fmul.d");
1307}
1308
1309TEST_F(AssemblerMIPS32r6Test, FdivW) {
1310 DriverStr(RepeatVVV(&mips::MipsAssembler::FdivW, "fdiv.w ${reg1}, ${reg2}, ${reg3}"), "fdiv.w");
1311}
1312
1313TEST_F(AssemblerMIPS32r6Test, FdivD) {
1314 DriverStr(RepeatVVV(&mips::MipsAssembler::FdivD, "fdiv.d ${reg1}, ${reg2}, ${reg3}"), "fdiv.d");
1315}
1316
1317TEST_F(AssemblerMIPS32r6Test, FmaxW) {
1318 DriverStr(RepeatVVV(&mips::MipsAssembler::FmaxW, "fmax.w ${reg1}, ${reg2}, ${reg3}"), "fmax.w");
1319}
1320
1321TEST_F(AssemblerMIPS32r6Test, FmaxD) {
1322 DriverStr(RepeatVVV(&mips::MipsAssembler::FmaxD, "fmax.d ${reg1}, ${reg2}, ${reg3}"), "fmax.d");
1323}
1324
1325TEST_F(AssemblerMIPS32r6Test, FminW) {
1326 DriverStr(RepeatVVV(&mips::MipsAssembler::FminW, "fmin.w ${reg1}, ${reg2}, ${reg3}"), "fmin.w");
1327}
1328
1329TEST_F(AssemblerMIPS32r6Test, FminD) {
1330 DriverStr(RepeatVVV(&mips::MipsAssembler::FminD, "fmin.d ${reg1}, ${reg2}, ${reg3}"), "fmin.d");
1331}
1332
1333TEST_F(AssemblerMIPS32r6Test, Ffint_sW) {
1334 DriverStr(RepeatVV(&mips::MipsAssembler::Ffint_sW, "ffint_s.w ${reg1}, ${reg2}"), "ffint_s.w");
1335}
1336
1337TEST_F(AssemblerMIPS32r6Test, Ffint_sD) {
1338 DriverStr(RepeatVV(&mips::MipsAssembler::Ffint_sD, "ffint_s.d ${reg1}, ${reg2}"), "ffint_s.d");
1339}
1340
1341TEST_F(AssemblerMIPS32r6Test, Ftint_sW) {
1342 DriverStr(RepeatVV(&mips::MipsAssembler::Ftint_sW, "ftint_s.w ${reg1}, ${reg2}"), "ftint_s.w");
1343}
1344
1345TEST_F(AssemblerMIPS32r6Test, Ftint_sD) {
1346 DriverStr(RepeatVV(&mips::MipsAssembler::Ftint_sD, "ftint_s.d ${reg1}, ${reg2}"), "ftint_s.d");
1347}
1348
1349TEST_F(AssemblerMIPS32r6Test, SllB) {
1350 DriverStr(RepeatVVV(&mips::MipsAssembler::SllB, "sll.b ${reg1}, ${reg2}, ${reg3}"), "sll.b");
1351}
1352
1353TEST_F(AssemblerMIPS32r6Test, SllH) {
1354 DriverStr(RepeatVVV(&mips::MipsAssembler::SllH, "sll.h ${reg1}, ${reg2}, ${reg3}"), "sll.h");
1355}
1356
1357TEST_F(AssemblerMIPS32r6Test, SllW) {
1358 DriverStr(RepeatVVV(&mips::MipsAssembler::SllW, "sll.w ${reg1}, ${reg2}, ${reg3}"), "sll.w");
1359}
1360
1361TEST_F(AssemblerMIPS32r6Test, SllD) {
1362 DriverStr(RepeatVVV(&mips::MipsAssembler::SllD, "sll.d ${reg1}, ${reg2}, ${reg3}"), "sll.d");
1363}
1364
1365TEST_F(AssemblerMIPS32r6Test, SraB) {
1366 DriverStr(RepeatVVV(&mips::MipsAssembler::SraB, "sra.b ${reg1}, ${reg2}, ${reg3}"), "sra.b");
1367}
1368
1369TEST_F(AssemblerMIPS32r6Test, SraH) {
1370 DriverStr(RepeatVVV(&mips::MipsAssembler::SraH, "sra.h ${reg1}, ${reg2}, ${reg3}"), "sra.h");
1371}
1372
1373TEST_F(AssemblerMIPS32r6Test, SraW) {
1374 DriverStr(RepeatVVV(&mips::MipsAssembler::SraW, "sra.w ${reg1}, ${reg2}, ${reg3}"), "sra.w");
1375}
1376
1377TEST_F(AssemblerMIPS32r6Test, SraD) {
1378 DriverStr(RepeatVVV(&mips::MipsAssembler::SraD, "sra.d ${reg1}, ${reg2}, ${reg3}"), "sra.d");
1379}
1380
1381TEST_F(AssemblerMIPS32r6Test, SrlB) {
1382 DriverStr(RepeatVVV(&mips::MipsAssembler::SrlB, "srl.b ${reg1}, ${reg2}, ${reg3}"), "srl.b");
1383}
1384
1385TEST_F(AssemblerMIPS32r6Test, SrlH) {
1386 DriverStr(RepeatVVV(&mips::MipsAssembler::SrlH, "srl.h ${reg1}, ${reg2}, ${reg3}"), "srl.h");
1387}
1388
1389TEST_F(AssemblerMIPS32r6Test, SrlW) {
1390 DriverStr(RepeatVVV(&mips::MipsAssembler::SrlW, "srl.w ${reg1}, ${reg2}, ${reg3}"), "srl.w");
1391}
1392
1393TEST_F(AssemblerMIPS32r6Test, SrlD) {
1394 DriverStr(RepeatVVV(&mips::MipsAssembler::SrlD, "srl.d ${reg1}, ${reg2}, ${reg3}"), "srl.d");
1395}
1396
1397TEST_F(AssemblerMIPS32r6Test, SlliB) {
1398 DriverStr(RepeatVVIb(&mips::MipsAssembler::SlliB, 3, "slli.b ${reg1}, ${reg2}, {imm}"), "slli.b");
1399}
1400
1401TEST_F(AssemblerMIPS32r6Test, SlliH) {
1402 DriverStr(RepeatVVIb(&mips::MipsAssembler::SlliH, 4, "slli.h ${reg1}, ${reg2}, {imm}"), "slli.h");
1403}
1404
1405TEST_F(AssemblerMIPS32r6Test, SlliW) {
1406 DriverStr(RepeatVVIb(&mips::MipsAssembler::SlliW, 5, "slli.w ${reg1}, ${reg2}, {imm}"), "slli.w");
1407}
1408
1409TEST_F(AssemblerMIPS32r6Test, SlliD) {
1410 DriverStr(RepeatVVIb(&mips::MipsAssembler::SlliD, 6, "slli.d ${reg1}, ${reg2}, {imm}"), "slli.d");
1411}
1412
1413TEST_F(AssemblerMIPS32r6Test, MoveV) {
1414 DriverStr(RepeatVV(&mips::MipsAssembler::MoveV, "move.v ${reg1}, ${reg2}"), "move.v");
1415}
1416
1417TEST_F(AssemblerMIPS32r6Test, SplatiB) {
1418 DriverStr(RepeatVVIb(&mips::MipsAssembler::SplatiB, 4, "splati.b ${reg1}, ${reg2}[{imm}]"),
1419 "splati.b");
1420}
1421
1422TEST_F(AssemblerMIPS32r6Test, SplatiH) {
1423 DriverStr(RepeatVVIb(&mips::MipsAssembler::SplatiH, 3, "splati.h ${reg1}, ${reg2}[{imm}]"),
1424 "splati.h");
1425}
1426
1427TEST_F(AssemblerMIPS32r6Test, SplatiW) {
1428 DriverStr(RepeatVVIb(&mips::MipsAssembler::SplatiW, 2, "splati.w ${reg1}, ${reg2}[{imm}]"),
1429 "splati.w");
1430}
1431
1432TEST_F(AssemblerMIPS32r6Test, SplatiD) {
1433 DriverStr(RepeatVVIb(&mips::MipsAssembler::SplatiD, 1, "splati.d ${reg1}, ${reg2}[{imm}]"),
1434 "splati.d");
1435}
1436
1437TEST_F(AssemblerMIPS32r6Test, FillB) {
1438 DriverStr(RepeatVR(&mips::MipsAssembler::FillB, "fill.b ${reg1}, ${reg2}"), "fill.b");
1439}
1440
1441TEST_F(AssemblerMIPS32r6Test, FillH) {
1442 DriverStr(RepeatVR(&mips::MipsAssembler::FillH, "fill.h ${reg1}, ${reg2}"), "fill.h");
1443}
1444
1445TEST_F(AssemblerMIPS32r6Test, FillW) {
1446 DriverStr(RepeatVR(&mips::MipsAssembler::FillW, "fill.w ${reg1}, ${reg2}"), "fill.w");
1447}
1448
1449TEST_F(AssemblerMIPS32r6Test, LdiB) {
1450 DriverStr(RepeatVIb(&mips::MipsAssembler::LdiB, -8, "ldi.b ${reg}, {imm}"), "ldi.b");
1451}
1452
1453TEST_F(AssemblerMIPS32r6Test, LdiH) {
1454 DriverStr(RepeatVIb(&mips::MipsAssembler::LdiH, -10, "ldi.h ${reg}, {imm}"), "ldi.h");
1455}
1456
1457TEST_F(AssemblerMIPS32r6Test, LdiW) {
1458 DriverStr(RepeatVIb(&mips::MipsAssembler::LdiW, -10, "ldi.w ${reg}, {imm}"), "ldi.w");
1459}
1460
1461TEST_F(AssemblerMIPS32r6Test, LdiD) {
1462 DriverStr(RepeatVIb(&mips::MipsAssembler::LdiD, -10, "ldi.d ${reg}, {imm}"), "ldi.d");
1463}
1464
1465TEST_F(AssemblerMIPS32r6Test, LdB) {
1466 DriverStr(RepeatVRIb(&mips::MipsAssembler::LdB, -10, "ld.b ${reg1}, {imm}(${reg2})"), "ld.b");
1467}
1468
1469TEST_F(AssemblerMIPS32r6Test, LdH) {
1470 DriverStr(RepeatVRIb(&mips::MipsAssembler::LdH, -10, "ld.h ${reg1}, {imm}(${reg2})", 0, 2),
1471 "ld.h");
1472}
1473
1474TEST_F(AssemblerMIPS32r6Test, LdW) {
1475 DriverStr(RepeatVRIb(&mips::MipsAssembler::LdW, -10, "ld.w ${reg1}, {imm}(${reg2})", 0, 4),
1476 "ld.w");
1477}
1478
1479TEST_F(AssemblerMIPS32r6Test, LdD) {
1480 DriverStr(RepeatVRIb(&mips::MipsAssembler::LdD, -10, "ld.d ${reg1}, {imm}(${reg2})", 0, 8),
1481 "ld.d");
1482}
1483
1484TEST_F(AssemblerMIPS32r6Test, StB) {
1485 DriverStr(RepeatVRIb(&mips::MipsAssembler::StB, -10, "st.b ${reg1}, {imm}(${reg2})"), "st.b");
1486}
1487
1488TEST_F(AssemblerMIPS32r6Test, StH) {
1489 DriverStr(RepeatVRIb(&mips::MipsAssembler::StH, -10, "st.h ${reg1}, {imm}(${reg2})", 0, 2),
1490 "st.h");
1491}
1492
1493TEST_F(AssemblerMIPS32r6Test, StW) {
1494 DriverStr(RepeatVRIb(&mips::MipsAssembler::StW, -10, "st.w ${reg1}, {imm}(${reg2})", 0, 4),
1495 "st.w");
1496}
1497
1498TEST_F(AssemblerMIPS32r6Test, StD) {
1499 DriverStr(RepeatVRIb(&mips::MipsAssembler::StD, -10, "st.d ${reg1}, {imm}(${reg2})", 0, 8),
1500 "st.d");
1501}
1502
1503TEST_F(AssemblerMIPS32r6Test, IlvrB) {
1504 DriverStr(RepeatVVV(&mips::MipsAssembler::IlvrB, "ilvr.b ${reg1}, ${reg2}, ${reg3}"), "ilvr.b");
1505}
1506
1507TEST_F(AssemblerMIPS32r6Test, IlvrH) {
1508 DriverStr(RepeatVVV(&mips::MipsAssembler::IlvrH, "ilvr.h ${reg1}, ${reg2}, ${reg3}"), "ilvr.h");
1509}
1510
1511TEST_F(AssemblerMIPS32r6Test, IlvrW) {
1512 DriverStr(RepeatVVV(&mips::MipsAssembler::IlvrW, "ilvr.w ${reg1}, ${reg2}, ${reg3}"), "ilvr.w");
1513}
1514
1515TEST_F(AssemblerMIPS32r6Test, IlvrD) {
1516 DriverStr(RepeatVVV(&mips::MipsAssembler::IlvrD, "ilvr.d ${reg1}, ${reg2}, ${reg3}"), "ilvr.d");
1517}
1518
Chris Larsen3add9cb2016-04-14 14:01:33 -07001519#undef __
1520
1521} // namespace art