blob: 063d8bd8257b8c3df3a9ecc2ef0aba4307824e11 [file] [log] [blame]
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001/*
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_mips.h"
18
19#include <map>
20
21#include "base/stl_util.h"
22#include "utils/assembler_test.h"
23
24namespace art {
25
26struct MIPSCpuRegisterCompare {
27 bool operator()(const mips::Register& a, const mips::Register& b) const {
28 return a < b;
29 }
30};
31
32class AssemblerMIPSTest : public AssemblerTest<mips::MipsAssembler,
33 mips::Register,
34 mips::FRegister,
35 uint32_t> {
36 public:
37 typedef AssemblerTest<mips::MipsAssembler, mips::Register, mips::FRegister, uint32_t> Base;
38
39 protected:
40 // Get the typically used name for this architecture, e.g., aarch64, x86-64, ...
41 std::string GetArchitectureString() OVERRIDE {
42 return "mips";
43 }
44
45 std::string GetAssemblerParameters() OVERRIDE {
46 return " --no-warn -32 -march=mips32r2";
47 }
48
49 std::string GetDisassembleParameters() OVERRIDE {
50 return " -D -bbinary -mmips:isa32r2";
51 }
52
53 void SetUpHelpers() OVERRIDE {
54 if (registers_.size() == 0) {
55 registers_.push_back(new mips::Register(mips::ZERO));
56 registers_.push_back(new mips::Register(mips::AT));
57 registers_.push_back(new mips::Register(mips::V0));
58 registers_.push_back(new mips::Register(mips::V1));
59 registers_.push_back(new mips::Register(mips::A0));
60 registers_.push_back(new mips::Register(mips::A1));
61 registers_.push_back(new mips::Register(mips::A2));
62 registers_.push_back(new mips::Register(mips::A3));
63 registers_.push_back(new mips::Register(mips::T0));
64 registers_.push_back(new mips::Register(mips::T1));
65 registers_.push_back(new mips::Register(mips::T2));
66 registers_.push_back(new mips::Register(mips::T3));
67 registers_.push_back(new mips::Register(mips::T4));
68 registers_.push_back(new mips::Register(mips::T5));
69 registers_.push_back(new mips::Register(mips::T6));
70 registers_.push_back(new mips::Register(mips::T7));
71 registers_.push_back(new mips::Register(mips::S0));
72 registers_.push_back(new mips::Register(mips::S1));
73 registers_.push_back(new mips::Register(mips::S2));
74 registers_.push_back(new mips::Register(mips::S3));
75 registers_.push_back(new mips::Register(mips::S4));
76 registers_.push_back(new mips::Register(mips::S5));
77 registers_.push_back(new mips::Register(mips::S6));
78 registers_.push_back(new mips::Register(mips::S7));
79 registers_.push_back(new mips::Register(mips::T8));
80 registers_.push_back(new mips::Register(mips::T9));
81 registers_.push_back(new mips::Register(mips::K0));
82 registers_.push_back(new mips::Register(mips::K1));
83 registers_.push_back(new mips::Register(mips::GP));
84 registers_.push_back(new mips::Register(mips::SP));
85 registers_.push_back(new mips::Register(mips::FP));
86 registers_.push_back(new mips::Register(mips::RA));
87
88 secondary_register_names_.emplace(mips::Register(mips::ZERO), "zero");
89 secondary_register_names_.emplace(mips::Register(mips::AT), "at");
90 secondary_register_names_.emplace(mips::Register(mips::V0), "v0");
91 secondary_register_names_.emplace(mips::Register(mips::V1), "v1");
92 secondary_register_names_.emplace(mips::Register(mips::A0), "a0");
93 secondary_register_names_.emplace(mips::Register(mips::A1), "a1");
94 secondary_register_names_.emplace(mips::Register(mips::A2), "a2");
95 secondary_register_names_.emplace(mips::Register(mips::A3), "a3");
96 secondary_register_names_.emplace(mips::Register(mips::T0), "t0");
97 secondary_register_names_.emplace(mips::Register(mips::T1), "t1");
98 secondary_register_names_.emplace(mips::Register(mips::T2), "t2");
99 secondary_register_names_.emplace(mips::Register(mips::T3), "t3");
100 secondary_register_names_.emplace(mips::Register(mips::T4), "t4");
101 secondary_register_names_.emplace(mips::Register(mips::T5), "t5");
102 secondary_register_names_.emplace(mips::Register(mips::T6), "t6");
103 secondary_register_names_.emplace(mips::Register(mips::T7), "t7");
104 secondary_register_names_.emplace(mips::Register(mips::S0), "s0");
105 secondary_register_names_.emplace(mips::Register(mips::S1), "s1");
106 secondary_register_names_.emplace(mips::Register(mips::S2), "s2");
107 secondary_register_names_.emplace(mips::Register(mips::S3), "s3");
108 secondary_register_names_.emplace(mips::Register(mips::S4), "s4");
109 secondary_register_names_.emplace(mips::Register(mips::S5), "s5");
110 secondary_register_names_.emplace(mips::Register(mips::S6), "s6");
111 secondary_register_names_.emplace(mips::Register(mips::S7), "s7");
112 secondary_register_names_.emplace(mips::Register(mips::T8), "t8");
113 secondary_register_names_.emplace(mips::Register(mips::T9), "t9");
114 secondary_register_names_.emplace(mips::Register(mips::K0), "k0");
115 secondary_register_names_.emplace(mips::Register(mips::K1), "k1");
116 secondary_register_names_.emplace(mips::Register(mips::GP), "gp");
117 secondary_register_names_.emplace(mips::Register(mips::SP), "sp");
118 secondary_register_names_.emplace(mips::Register(mips::FP), "fp");
119 secondary_register_names_.emplace(mips::Register(mips::RA), "ra");
120
121 fp_registers_.push_back(new mips::FRegister(mips::F0));
122 fp_registers_.push_back(new mips::FRegister(mips::F1));
123 fp_registers_.push_back(new mips::FRegister(mips::F2));
124 fp_registers_.push_back(new mips::FRegister(mips::F3));
125 fp_registers_.push_back(new mips::FRegister(mips::F4));
126 fp_registers_.push_back(new mips::FRegister(mips::F5));
127 fp_registers_.push_back(new mips::FRegister(mips::F6));
128 fp_registers_.push_back(new mips::FRegister(mips::F7));
129 fp_registers_.push_back(new mips::FRegister(mips::F8));
130 fp_registers_.push_back(new mips::FRegister(mips::F9));
131 fp_registers_.push_back(new mips::FRegister(mips::F10));
132 fp_registers_.push_back(new mips::FRegister(mips::F11));
133 fp_registers_.push_back(new mips::FRegister(mips::F12));
134 fp_registers_.push_back(new mips::FRegister(mips::F13));
135 fp_registers_.push_back(new mips::FRegister(mips::F14));
136 fp_registers_.push_back(new mips::FRegister(mips::F15));
137 fp_registers_.push_back(new mips::FRegister(mips::F16));
138 fp_registers_.push_back(new mips::FRegister(mips::F17));
139 fp_registers_.push_back(new mips::FRegister(mips::F18));
140 fp_registers_.push_back(new mips::FRegister(mips::F19));
141 fp_registers_.push_back(new mips::FRegister(mips::F20));
142 fp_registers_.push_back(new mips::FRegister(mips::F21));
143 fp_registers_.push_back(new mips::FRegister(mips::F22));
144 fp_registers_.push_back(new mips::FRegister(mips::F23));
145 fp_registers_.push_back(new mips::FRegister(mips::F24));
146 fp_registers_.push_back(new mips::FRegister(mips::F25));
147 fp_registers_.push_back(new mips::FRegister(mips::F26));
148 fp_registers_.push_back(new mips::FRegister(mips::F27));
149 fp_registers_.push_back(new mips::FRegister(mips::F28));
150 fp_registers_.push_back(new mips::FRegister(mips::F29));
151 fp_registers_.push_back(new mips::FRegister(mips::F30));
152 fp_registers_.push_back(new mips::FRegister(mips::F31));
153 }
154 }
155
156 void TearDown() OVERRIDE {
157 AssemblerTest::TearDown();
158 STLDeleteElements(&registers_);
159 STLDeleteElements(&fp_registers_);
160 }
161
162 std::vector<mips::Register*> GetRegisters() OVERRIDE {
163 return registers_;
164 }
165
166 std::vector<mips::FRegister*> GetFPRegisters() OVERRIDE {
167 return fp_registers_;
168 }
169
170 uint32_t CreateImmediate(int64_t imm_value) OVERRIDE {
171 return imm_value;
172 }
173
174 std::string GetSecondaryRegisterName(const mips::Register& reg) OVERRIDE {
175 CHECK(secondary_register_names_.find(reg) != secondary_register_names_.end());
176 return secondary_register_names_[reg];
177 }
178
179 std::string RepeatInsn(size_t count, const std::string& insn) {
180 std::string result;
181 for (; count != 0u; --count) {
182 result += insn;
183 }
184 return result;
185 }
186
187 private:
188 std::vector<mips::Register*> registers_;
189 std::map<mips::Register, std::string, MIPSCpuRegisterCompare> secondary_register_names_;
190
191 std::vector<mips::FRegister*> fp_registers_;
192};
193
194
195TEST_F(AssemblerMIPSTest, Toolchain) {
196 EXPECT_TRUE(CheckTools());
197}
198
199#define __ GetAssembler()->
200
201TEST_F(AssemblerMIPSTest, Addu) {
202 DriverStr(RepeatRRR(&mips::MipsAssembler::Addu, "addu ${reg1}, ${reg2}, ${reg3}"), "Addu");
203}
204
205TEST_F(AssemblerMIPSTest, Addiu) {
206 DriverStr(RepeatRRIb(&mips::MipsAssembler::Addiu, -16, "addiu ${reg1}, ${reg2}, {imm}"), "Addiu");
207}
208
209TEST_F(AssemblerMIPSTest, Subu) {
210 DriverStr(RepeatRRR(&mips::MipsAssembler::Subu, "subu ${reg1}, ${reg2}, ${reg3}"), "Subu");
211}
212
213TEST_F(AssemblerMIPSTest, MultR2) {
214 DriverStr(RepeatRR(&mips::MipsAssembler::MultR2, "mult ${reg1}, ${reg2}"), "MultR2");
215}
216
217TEST_F(AssemblerMIPSTest, MultuR2) {
218 DriverStr(RepeatRR(&mips::MipsAssembler::MultuR2, "multu ${reg1}, ${reg2}"), "MultuR2");
219}
220
221TEST_F(AssemblerMIPSTest, DivR2Basic) {
222 DriverStr(RepeatRR(&mips::MipsAssembler::DivR2, "div $zero, ${reg1}, ${reg2}"), "DivR2Basic");
223}
224
225TEST_F(AssemblerMIPSTest, DivuR2Basic) {
226 DriverStr(RepeatRR(&mips::MipsAssembler::DivuR2, "divu $zero, ${reg1}, ${reg2}"), "DivuR2Basic");
227}
228
229TEST_F(AssemblerMIPSTest, MulR2) {
230 DriverStr(RepeatRRR(&mips::MipsAssembler::MulR2, "mul ${reg1}, ${reg2}, ${reg3}"), "MulR2");
231}
232
233TEST_F(AssemblerMIPSTest, DivR2) {
234 DriverStr(RepeatRRR(&mips::MipsAssembler::DivR2, "div $zero, ${reg2}, ${reg3}\nmflo ${reg1}"),
235 "DivR2");
236}
237
238TEST_F(AssemblerMIPSTest, ModR2) {
239 DriverStr(RepeatRRR(&mips::MipsAssembler::ModR2, "div $zero, ${reg2}, ${reg3}\nmfhi ${reg1}"),
240 "ModR2");
241}
242
243TEST_F(AssemblerMIPSTest, DivuR2) {
244 DriverStr(RepeatRRR(&mips::MipsAssembler::DivuR2, "divu $zero, ${reg2}, ${reg3}\nmflo ${reg1}"),
245 "DivuR2");
246}
247
248TEST_F(AssemblerMIPSTest, ModuR2) {
249 DriverStr(RepeatRRR(&mips::MipsAssembler::ModuR2, "divu $zero, ${reg2}, ${reg3}\nmfhi ${reg1}"),
250 "ModuR2");
251}
252
253TEST_F(AssemblerMIPSTest, And) {
254 DriverStr(RepeatRRR(&mips::MipsAssembler::And, "and ${reg1}, ${reg2}, ${reg3}"), "And");
255}
256
257TEST_F(AssemblerMIPSTest, Andi) {
258 DriverStr(RepeatRRIb(&mips::MipsAssembler::Andi, 16, "andi ${reg1}, ${reg2}, {imm}"), "Andi");
259}
260
261TEST_F(AssemblerMIPSTest, Or) {
262 DriverStr(RepeatRRR(&mips::MipsAssembler::Or, "or ${reg1}, ${reg2}, ${reg3}"), "Or");
263}
264
265TEST_F(AssemblerMIPSTest, Ori) {
266 DriverStr(RepeatRRIb(&mips::MipsAssembler::Ori, 16, "ori ${reg1}, ${reg2}, {imm}"), "Ori");
267}
268
269TEST_F(AssemblerMIPSTest, Xor) {
270 DriverStr(RepeatRRR(&mips::MipsAssembler::Xor, "xor ${reg1}, ${reg2}, ${reg3}"), "Xor");
271}
272
273TEST_F(AssemblerMIPSTest, Xori) {
274 DriverStr(RepeatRRIb(&mips::MipsAssembler::Xori, 16, "xori ${reg1}, ${reg2}, {imm}"), "Xori");
275}
276
277TEST_F(AssemblerMIPSTest, Nor) {
278 DriverStr(RepeatRRR(&mips::MipsAssembler::Nor, "nor ${reg1}, ${reg2}, ${reg3}"), "Nor");
279}
280
281TEST_F(AssemblerMIPSTest, Seb) {
282 DriverStr(RepeatRR(&mips::MipsAssembler::Seb, "seb ${reg1}, ${reg2}"), "Seb");
283}
284
285TEST_F(AssemblerMIPSTest, Seh) {
286 DriverStr(RepeatRR(&mips::MipsAssembler::Seh, "seh ${reg1}, ${reg2}"), "Seh");
287}
288
289TEST_F(AssemblerMIPSTest, Sll) {
290 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sll, 5, "sll ${reg1}, ${reg2}, {imm}"), "Sll");
291}
292
293TEST_F(AssemblerMIPSTest, Srl) {
294 DriverStr(RepeatRRIb(&mips::MipsAssembler::Srl, 5, "srl ${reg1}, ${reg2}, {imm}"), "Srl");
295}
296
297TEST_F(AssemblerMIPSTest, Sra) {
298 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sra, 5, "sra ${reg1}, ${reg2}, {imm}"), "Sra");
299}
300
301TEST_F(AssemblerMIPSTest, Sllv) {
302 DriverStr(RepeatRRR(&mips::MipsAssembler::Sllv, "sllv ${reg1}, ${reg2}, ${reg3}"), "Sllv");
303}
304
305TEST_F(AssemblerMIPSTest, Srlv) {
306 DriverStr(RepeatRRR(&mips::MipsAssembler::Srlv, "srlv ${reg1}, ${reg2}, ${reg3}"), "Srlv");
307}
308
309TEST_F(AssemblerMIPSTest, Srav) {
310 DriverStr(RepeatRRR(&mips::MipsAssembler::Srav, "srav ${reg1}, ${reg2}, ${reg3}"), "Srav");
311}
312
313TEST_F(AssemblerMIPSTest, Lb) {
314 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lb, -16, "lb ${reg1}, {imm}(${reg2})"), "Lb");
315}
316
317TEST_F(AssemblerMIPSTest, Lh) {
318 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lh, -16, "lh ${reg1}, {imm}(${reg2})"), "Lh");
319}
320
321TEST_F(AssemblerMIPSTest, Lw) {
322 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lw, -16, "lw ${reg1}, {imm}(${reg2})"), "Lw");
323}
324
325TEST_F(AssemblerMIPSTest, Lbu) {
326 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lbu, -16, "lbu ${reg1}, {imm}(${reg2})"), "Lbu");
327}
328
329TEST_F(AssemblerMIPSTest, Lhu) {
330 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lhu, -16, "lhu ${reg1}, {imm}(${reg2})"), "Lhu");
331}
332
333TEST_F(AssemblerMIPSTest, Lui) {
334 DriverStr(RepeatRIb(&mips::MipsAssembler::Lui, 16, "lui ${reg}, {imm}"), "Lui");
335}
336
337TEST_F(AssemblerMIPSTest, Mfhi) {
338 DriverStr(RepeatR(&mips::MipsAssembler::Mfhi, "mfhi ${reg}"), "Mfhi");
339}
340
341TEST_F(AssemblerMIPSTest, Mflo) {
342 DriverStr(RepeatR(&mips::MipsAssembler::Mflo, "mflo ${reg}"), "Mflo");
343}
344
345TEST_F(AssemblerMIPSTest, Sb) {
346 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sb, -16, "sb ${reg1}, {imm}(${reg2})"), "Sb");
347}
348
349TEST_F(AssemblerMIPSTest, Sh) {
350 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sh, -16, "sh ${reg1}, {imm}(${reg2})"), "Sh");
351}
352
353TEST_F(AssemblerMIPSTest, Sw) {
354 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sw, -16, "sw ${reg1}, {imm}(${reg2})"), "Sw");
355}
356
357TEST_F(AssemblerMIPSTest, Slt) {
358 DriverStr(RepeatRRR(&mips::MipsAssembler::Slt, "slt ${reg1}, ${reg2}, ${reg3}"), "Slt");
359}
360
361TEST_F(AssemblerMIPSTest, Sltu) {
362 DriverStr(RepeatRRR(&mips::MipsAssembler::Sltu, "sltu ${reg1}, ${reg2}, ${reg3}"), "Sltu");
363}
364
365TEST_F(AssemblerMIPSTest, Slti) {
366 DriverStr(RepeatRRIb(&mips::MipsAssembler::Slti, -16, "slti ${reg1}, ${reg2}, {imm}"), "Slti");
367}
368
369TEST_F(AssemblerMIPSTest, Sltiu) {
370 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sltiu, -16, "sltiu ${reg1}, ${reg2}, {imm}"), "Sltiu");
371}
372
373TEST_F(AssemblerMIPSTest, AddS) {
374 DriverStr(RepeatFFF(&mips::MipsAssembler::AddS, "add.s ${reg1}, ${reg2}, ${reg3}"), "AddS");
375}
376
377TEST_F(AssemblerMIPSTest, AddD) {
378 DriverStr(RepeatFFF(&mips::MipsAssembler::AddD, "add.d ${reg1}, ${reg2}, ${reg3}"), "AddD");
379}
380
381TEST_F(AssemblerMIPSTest, SubS) {
382 DriverStr(RepeatFFF(&mips::MipsAssembler::SubS, "sub.s ${reg1}, ${reg2}, ${reg3}"), "SubS");
383}
384
385TEST_F(AssemblerMIPSTest, SubD) {
386 DriverStr(RepeatFFF(&mips::MipsAssembler::SubD, "sub.d ${reg1}, ${reg2}, ${reg3}"), "SubD");
387}
388
389TEST_F(AssemblerMIPSTest, MulS) {
390 DriverStr(RepeatFFF(&mips::MipsAssembler::MulS, "mul.s ${reg1}, ${reg2}, ${reg3}"), "MulS");
391}
392
393TEST_F(AssemblerMIPSTest, MulD) {
394 DriverStr(RepeatFFF(&mips::MipsAssembler::MulD, "mul.d ${reg1}, ${reg2}, ${reg3}"), "MulD");
395}
396
397TEST_F(AssemblerMIPSTest, DivS) {
398 DriverStr(RepeatFFF(&mips::MipsAssembler::DivS, "div.s ${reg1}, ${reg2}, ${reg3}"), "DivS");
399}
400
401TEST_F(AssemblerMIPSTest, DivD) {
402 DriverStr(RepeatFFF(&mips::MipsAssembler::DivD, "div.d ${reg1}, ${reg2}, ${reg3}"), "DivD");
403}
404
405TEST_F(AssemblerMIPSTest, MovS) {
406 DriverStr(RepeatFF(&mips::MipsAssembler::MovS, "mov.s ${reg1}, ${reg2}"), "MovS");
407}
408
409TEST_F(AssemblerMIPSTest, MovD) {
410 DriverStr(RepeatFF(&mips::MipsAssembler::MovD, "mov.d ${reg1}, ${reg2}"), "MovD");
411}
412
413TEST_F(AssemblerMIPSTest, NegS) {
414 DriverStr(RepeatFF(&mips::MipsAssembler::NegS, "neg.s ${reg1}, ${reg2}"), "NegS");
415}
416
417TEST_F(AssemblerMIPSTest, NegD) {
418 DriverStr(RepeatFF(&mips::MipsAssembler::NegD, "neg.d ${reg1}, ${reg2}"), "NegD");
419}
420
421TEST_F(AssemblerMIPSTest, CvtSW) {
422 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtsw, "cvt.s.w ${reg1}, ${reg2}"), "CvtSW");
423}
424
425TEST_F(AssemblerMIPSTest, CvtDW) {
426 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtdw, "cvt.d.w ${reg1}, ${reg2}"), "CvtDW");
427}
428
429TEST_F(AssemblerMIPSTest, CvtSD) {
430 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtsd, "cvt.s.d ${reg1}, ${reg2}"), "CvtSD");
431}
432
433TEST_F(AssemblerMIPSTest, CvtDS) {
434 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtds, "cvt.d.s ${reg1}, ${reg2}"), "CvtDS");
435}
436
437TEST_F(AssemblerMIPSTest, Mfc1) {
438 DriverStr(RepeatRF(&mips::MipsAssembler::Mfc1, "mfc1 ${reg1}, ${reg2}"), "Mfc1");
439}
440
441TEST_F(AssemblerMIPSTest, Mtc1) {
442 DriverStr(RepeatRF(&mips::MipsAssembler::Mtc1, "mtc1 ${reg1}, ${reg2}"), "Mtc1");
443}
444
445TEST_F(AssemblerMIPSTest, Mfhc1) {
446 DriverStr(RepeatRF(&mips::MipsAssembler::Mfhc1, "mfhc1 ${reg1}, ${reg2}"), "Mfhc1");
447}
448
449TEST_F(AssemblerMIPSTest, Mthc1) {
450 DriverStr(RepeatRF(&mips::MipsAssembler::Mthc1, "mthc1 ${reg1}, ${reg2}"), "Mthc1");
451}
452
453TEST_F(AssemblerMIPSTest, Lwc1) {
454 DriverStr(RepeatFRIb(&mips::MipsAssembler::Lwc1, -16, "lwc1 ${reg1}, {imm}(${reg2})"), "Lwc1");
455}
456
457TEST_F(AssemblerMIPSTest, Ldc1) {
458 DriverStr(RepeatFRIb(&mips::MipsAssembler::Ldc1, -16, "ldc1 ${reg1}, {imm}(${reg2})"), "Ldc1");
459}
460
461TEST_F(AssemblerMIPSTest, Swc1) {
462 DriverStr(RepeatFRIb(&mips::MipsAssembler::Swc1, -16, "swc1 ${reg1}, {imm}(${reg2})"), "Swc1");
463}
464
465TEST_F(AssemblerMIPSTest, Sdc1) {
466 DriverStr(RepeatFRIb(&mips::MipsAssembler::Sdc1, -16, "sdc1 ${reg1}, {imm}(${reg2})"), "Sdc1");
467}
468
469TEST_F(AssemblerMIPSTest, Move) {
470 DriverStr(RepeatRR(&mips::MipsAssembler::Move, "or ${reg1}, ${reg2}, $zero"), "Move");
471}
472
473TEST_F(AssemblerMIPSTest, Clear) {
474 DriverStr(RepeatR(&mips::MipsAssembler::Clear, "or ${reg}, $zero, $zero"), "Clear");
475}
476
477TEST_F(AssemblerMIPSTest, Not) {
478 DriverStr(RepeatRR(&mips::MipsAssembler::Not, "nor ${reg1}, ${reg2}, $zero"), "Not");
479}
480
481TEST_F(AssemblerMIPSTest, LoadFromOffset) {
482 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A0, 0);
483 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 0);
484 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 256);
485 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 1000);
486 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 0x8000);
487 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 0x10000);
488 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 0x12345678);
489 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, -256);
490 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 0xFFFF8000);
491 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 0xABCDEF00);
492
493 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A0, 0);
494 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 0);
495 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 256);
496 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 1000);
497 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 0x8000);
498 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 0x10000);
499 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 0x12345678);
500 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, -256);
501 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 0xFFFF8000);
502 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 0xABCDEF00);
503
504 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A0, 0);
505 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 0);
506 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 256);
507 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 1000);
508 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 0x8000);
509 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 0x10000);
510 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 0x12345678);
511 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, -256);
512 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 0xFFFF8000);
513 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 0xABCDEF00);
514
515 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A0, 0);
516 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 0);
517 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 256);
518 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 1000);
519 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 0x8000);
520 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 0x10000);
521 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 0x12345678);
522 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, -256);
523 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 0xFFFF8000);
524 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 0xABCDEF00);
525
526 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A0, 0);
527 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 0);
528 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 256);
529 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 1000);
530 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 0x8000);
531 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 0x10000);
532 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 0x12345678);
533 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, -256);
534 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 0xFFFF8000);
535 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 0xABCDEF00);
536
537 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A0, 0);
538 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A1, 0);
539 __ LoadFromOffset(mips::kLoadDoubleword, mips::A1, mips::A0, 0);
540 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 0);
541 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 256);
542 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 1000);
543 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 0x8000);
544 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 0x10000);
545 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 0x12345678);
546 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -256);
547 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 0xFFFF8000);
548 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 0xABCDEF00);
549
550 const char* expected =
551 "lb $a0, 0($a0)\n"
552 "lb $a0, 0($a1)\n"
553 "lb $a0, 256($a1)\n"
554 "lb $a0, 1000($a1)\n"
555 "ori $at, $zero, 0x8000\n"
556 "addu $at, $at, $a1\n"
557 "lb $a0, 0($at)\n"
558 "lui $at, 1\n"
559 "addu $at, $at, $a1\n"
560 "lb $a0, 0($at)\n"
561 "lui $at, 0x1234\n"
562 "ori $at, 0x5678\n"
563 "addu $at, $at, $a1\n"
564 "lb $a0, 0($at)\n"
565 "lb $a0, -256($a1)\n"
566 "lb $a0, 0xFFFF8000($a1)\n"
567 "lui $at, 0xABCD\n"
568 "ori $at, 0xEF00\n"
569 "addu $at, $at, $a1\n"
570 "lb $a0, 0($at)\n"
571
572 "lbu $a0, 0($a0)\n"
573 "lbu $a0, 0($a1)\n"
574 "lbu $a0, 256($a1)\n"
575 "lbu $a0, 1000($a1)\n"
576 "ori $at, $zero, 0x8000\n"
577 "addu $at, $at, $a1\n"
578 "lbu $a0, 0($at)\n"
579 "lui $at, 1\n"
580 "addu $at, $at, $a1\n"
581 "lbu $a0, 0($at)\n"
582 "lui $at, 0x1234\n"
583 "ori $at, 0x5678\n"
584 "addu $at, $at, $a1\n"
585 "lbu $a0, 0($at)\n"
586 "lbu $a0, -256($a1)\n"
587 "lbu $a0, 0xFFFF8000($a1)\n"
588 "lui $at, 0xABCD\n"
589 "ori $at, 0xEF00\n"
590 "addu $at, $at, $a1\n"
591 "lbu $a0, 0($at)\n"
592
593 "lh $a0, 0($a0)\n"
594 "lh $a0, 0($a1)\n"
595 "lh $a0, 256($a1)\n"
596 "lh $a0, 1000($a1)\n"
597 "ori $at, $zero, 0x8000\n"
598 "addu $at, $at, $a1\n"
599 "lh $a0, 0($at)\n"
600 "lui $at, 1\n"
601 "addu $at, $at, $a1\n"
602 "lh $a0, 0($at)\n"
603 "lui $at, 0x1234\n"
604 "ori $at, 0x5678\n"
605 "addu $at, $at, $a1\n"
606 "lh $a0, 0($at)\n"
607 "lh $a0, -256($a1)\n"
608 "lh $a0, 0xFFFF8000($a1)\n"
609 "lui $at, 0xABCD\n"
610 "ori $at, 0xEF00\n"
611 "addu $at, $at, $a1\n"
612 "lh $a0, 0($at)\n"
613
614 "lhu $a0, 0($a0)\n"
615 "lhu $a0, 0($a1)\n"
616 "lhu $a0, 256($a1)\n"
617 "lhu $a0, 1000($a1)\n"
618 "ori $at, $zero, 0x8000\n"
619 "addu $at, $at, $a1\n"
620 "lhu $a0, 0($at)\n"
621 "lui $at, 1\n"
622 "addu $at, $at, $a1\n"
623 "lhu $a0, 0($at)\n"
624 "lui $at, 0x1234\n"
625 "ori $at, 0x5678\n"
626 "addu $at, $at, $a1\n"
627 "lhu $a0, 0($at)\n"
628 "lhu $a0, -256($a1)\n"
629 "lhu $a0, 0xFFFF8000($a1)\n"
630 "lui $at, 0xABCD\n"
631 "ori $at, 0xEF00\n"
632 "addu $at, $at, $a1\n"
633 "lhu $a0, 0($at)\n"
634
635 "lw $a0, 0($a0)\n"
636 "lw $a0, 0($a1)\n"
637 "lw $a0, 256($a1)\n"
638 "lw $a0, 1000($a1)\n"
639 "ori $at, $zero, 0x8000\n"
640 "addu $at, $at, $a1\n"
641 "lw $a0, 0($at)\n"
642 "lui $at, 1\n"
643 "addu $at, $at, $a1\n"
644 "lw $a0, 0($at)\n"
645 "lui $at, 0x1234\n"
646 "ori $at, 0x5678\n"
647 "addu $at, $at, $a1\n"
648 "lw $a0, 0($at)\n"
649 "lw $a0, -256($a1)\n"
650 "lw $a0, 0xFFFF8000($a1)\n"
651 "lui $at, 0xABCD\n"
652 "ori $at, 0xEF00\n"
653 "addu $at, $at, $a1\n"
654 "lw $a0, 0($at)\n"
655
656 "lw $a1, 4($a0)\n"
657 "lw $a0, 0($a0)\n"
658 "lw $a0, 0($a1)\n"
659 "lw $a1, 4($a1)\n"
660 "lw $a1, 0($a0)\n"
661 "lw $a2, 4($a0)\n"
662 "lw $a0, 0($a2)\n"
663 "lw $a1, 4($a2)\n"
664 "lw $a0, 256($a2)\n"
665 "lw $a1, 260($a2)\n"
666 "lw $a0, 1000($a2)\n"
667 "lw $a1, 1004($a2)\n"
668 "ori $at, $zero, 0x8000\n"
669 "addu $at, $at, $a2\n"
670 "lw $a0, 0($at)\n"
671 "lw $a1, 4($at)\n"
672 "lui $at, 1\n"
673 "addu $at, $at, $a2\n"
674 "lw $a0, 0($at)\n"
675 "lw $a1, 4($at)\n"
676 "lui $at, 0x1234\n"
677 "ori $at, 0x5678\n"
678 "addu $at, $at, $a2\n"
679 "lw $a0, 0($at)\n"
680 "lw $a1, 4($at)\n"
681 "lw $a0, -256($a2)\n"
682 "lw $a1, -252($a2)\n"
683 "lw $a0, 0xFFFF8000($a2)\n"
684 "lw $a1, 0xFFFF8004($a2)\n"
685 "lui $at, 0xABCD\n"
686 "ori $at, 0xEF00\n"
687 "addu $at, $at, $a2\n"
688 "lw $a0, 0($at)\n"
689 "lw $a1, 4($at)\n";
690 DriverStr(expected, "LoadFromOffset");
691}
692
693TEST_F(AssemblerMIPSTest, LoadSFromOffset) {
694 __ LoadSFromOffset(mips::F0, mips::A0, 0);
695 __ LoadSFromOffset(mips::F0, mips::A0, 4);
696 __ LoadSFromOffset(mips::F0, mips::A0, 256);
697 __ LoadSFromOffset(mips::F0, mips::A0, 0x8000);
698 __ LoadSFromOffset(mips::F0, mips::A0, 0x10000);
699 __ LoadSFromOffset(mips::F0, mips::A0, 0x12345678);
700 __ LoadSFromOffset(mips::F0, mips::A0, -256);
701 __ LoadSFromOffset(mips::F0, mips::A0, 0xFFFF8000);
702 __ LoadSFromOffset(mips::F0, mips::A0, 0xABCDEF00);
703
704 const char* expected =
705 "lwc1 $f0, 0($a0)\n"
706 "lwc1 $f0, 4($a0)\n"
707 "lwc1 $f0, 256($a0)\n"
708 "ori $at, $zero, 0x8000\n"
709 "addu $at, $at, $a0\n"
710 "lwc1 $f0, 0($at)\n"
711 "lui $at, 1\n"
712 "addu $at, $at, $a0\n"
713 "lwc1 $f0, 0($at)\n"
714 "lui $at, 0x1234\n"
715 "ori $at, 0x5678\n"
716 "addu $at, $at, $a0\n"
717 "lwc1 $f0, 0($at)\n"
718 "lwc1 $f0, -256($a0)\n"
719 "lwc1 $f0, 0xFFFF8000($a0)\n"
720 "lui $at, 0xABCD\n"
721 "ori $at, 0xEF00\n"
722 "addu $at, $at, $a0\n"
723 "lwc1 $f0, 0($at)\n";
724 DriverStr(expected, "LoadSFromOffset");
725}
726
727
728TEST_F(AssemblerMIPSTest, LoadDFromOffset) {
729 __ LoadDFromOffset(mips::F0, mips::A0, 0);
730 __ LoadDFromOffset(mips::F0, mips::A0, 4);
731 __ LoadDFromOffset(mips::F0, mips::A0, 256);
732 __ LoadDFromOffset(mips::F0, mips::A0, 0x8000);
733 __ LoadDFromOffset(mips::F0, mips::A0, 0x10000);
734 __ LoadDFromOffset(mips::F0, mips::A0, 0x12345678);
735 __ LoadDFromOffset(mips::F0, mips::A0, -256);
736 __ LoadDFromOffset(mips::F0, mips::A0, 0xFFFF8000);
737 __ LoadDFromOffset(mips::F0, mips::A0, 0xABCDEF00);
738
739 const char* expected =
740 "ldc1 $f0, 0($a0)\n"
741 "lwc1 $f0, 4($a0)\n"
742 "lwc1 $f1, 8($a0)\n"
743 "ldc1 $f0, 256($a0)\n"
744 "ori $at, $zero, 0x8000\n"
745 "addu $at, $at, $a0\n"
746 "ldc1 $f0, 0($at)\n"
747 "lui $at, 1\n"
748 "addu $at, $at, $a0\n"
749 "ldc1 $f0, 0($at)\n"
750 "lui $at, 0x1234\n"
751 "ori $at, 0x5678\n"
752 "addu $at, $at, $a0\n"
753 "ldc1 $f0, 0($at)\n"
754 "ldc1 $f0, -256($a0)\n"
755 "ldc1 $f0, 0xFFFF8000($a0)\n"
756 "lui $at, 0xABCD\n"
757 "ori $at, 0xEF00\n"
758 "addu $at, $at, $a0\n"
759 "ldc1 $f0, 0($at)\n";
760 DriverStr(expected, "LoadDFromOffset");
761}
762
763TEST_F(AssemblerMIPSTest, StoreToOffset) {
764 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A0, 0);
765 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 0);
766 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 256);
767 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 1000);
768 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 0x8000);
769 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 0x10000);
770 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 0x12345678);
771 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, -256);
772 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 0xFFFF8000);
773 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 0xABCDEF00);
774
775 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A0, 0);
776 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 0);
777 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 256);
778 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 1000);
779 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 0x8000);
780 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 0x10000);
781 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 0x12345678);
782 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, -256);
783 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 0xFFFF8000);
784 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 0xABCDEF00);
785
786 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A0, 0);
787 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 0);
788 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 256);
789 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 1000);
790 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 0x8000);
791 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 0x10000);
792 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 0x12345678);
793 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, -256);
794 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 0xFFFF8000);
795 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 0xABCDEF00);
796
797 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 0);
798 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 256);
799 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 1000);
800 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 0x8000);
801 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 0x10000);
802 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 0x12345678);
803 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -256);
804 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 0xFFFF8000);
805 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 0xABCDEF00);
806
807 const char* expected =
808 "sb $a0, 0($a0)\n"
809 "sb $a0, 0($a1)\n"
810 "sb $a0, 256($a1)\n"
811 "sb $a0, 1000($a1)\n"
812 "ori $at, $zero, 0x8000\n"
813 "addu $at, $at, $a1\n"
814 "sb $a0, 0($at)\n"
815 "lui $at, 1\n"
816 "addu $at, $at, $a1\n"
817 "sb $a0, 0($at)\n"
818 "lui $at, 0x1234\n"
819 "ori $at, 0x5678\n"
820 "addu $at, $at, $a1\n"
821 "sb $a0, 0($at)\n"
822 "sb $a0, -256($a1)\n"
823 "sb $a0, 0xFFFF8000($a1)\n"
824 "lui $at, 0xABCD\n"
825 "ori $at, 0xEF00\n"
826 "addu $at, $at, $a1\n"
827 "sb $a0, 0($at)\n"
828
829 "sh $a0, 0($a0)\n"
830 "sh $a0, 0($a1)\n"
831 "sh $a0, 256($a1)\n"
832 "sh $a0, 1000($a1)\n"
833 "ori $at, $zero, 0x8000\n"
834 "addu $at, $at, $a1\n"
835 "sh $a0, 0($at)\n"
836 "lui $at, 1\n"
837 "addu $at, $at, $a1\n"
838 "sh $a0, 0($at)\n"
839 "lui $at, 0x1234\n"
840 "ori $at, 0x5678\n"
841 "addu $at, $at, $a1\n"
842 "sh $a0, 0($at)\n"
843 "sh $a0, -256($a1)\n"
844 "sh $a0, 0xFFFF8000($a1)\n"
845 "lui $at, 0xABCD\n"
846 "ori $at, 0xEF00\n"
847 "addu $at, $at, $a1\n"
848 "sh $a0, 0($at)\n"
849
850 "sw $a0, 0($a0)\n"
851 "sw $a0, 0($a1)\n"
852 "sw $a0, 256($a1)\n"
853 "sw $a0, 1000($a1)\n"
854 "ori $at, $zero, 0x8000\n"
855 "addu $at, $at, $a1\n"
856 "sw $a0, 0($at)\n"
857 "lui $at, 1\n"
858 "addu $at, $at, $a1\n"
859 "sw $a0, 0($at)\n"
860 "lui $at, 0x1234\n"
861 "ori $at, 0x5678\n"
862 "addu $at, $at, $a1\n"
863 "sw $a0, 0($at)\n"
864 "sw $a0, -256($a1)\n"
865 "sw $a0, 0xFFFF8000($a1)\n"
866 "lui $at, 0xABCD\n"
867 "ori $at, 0xEF00\n"
868 "addu $at, $at, $a1\n"
869 "sw $a0, 0($at)\n"
870
871 "sw $a0, 0($a2)\n"
872 "sw $a1, 4($a2)\n"
873 "sw $a0, 256($a2)\n"
874 "sw $a1, 260($a2)\n"
875 "sw $a0, 1000($a2)\n"
876 "sw $a1, 1004($a2)\n"
877 "ori $at, $zero, 0x8000\n"
878 "addu $at, $at, $a2\n"
879 "sw $a0, 0($at)\n"
880 "sw $a1, 4($at)\n"
881 "lui $at, 1\n"
882 "addu $at, $at, $a2\n"
883 "sw $a0, 0($at)\n"
884 "sw $a1, 4($at)\n"
885 "lui $at, 0x1234\n"
886 "ori $at, 0x5678\n"
887 "addu $at, $at, $a2\n"
888 "sw $a0, 0($at)\n"
889 "sw $a1, 4($at)\n"
890 "sw $a0, -256($a2)\n"
891 "sw $a1, -252($a2)\n"
892 "sw $a0, 0xFFFF8000($a2)\n"
893 "sw $a1, 0xFFFF8004($a2)\n"
894 "lui $at, 0xABCD\n"
895 "ori $at, 0xEF00\n"
896 "addu $at, $at, $a2\n"
897 "sw $a0, 0($at)\n"
898 "sw $a1, 4($at)\n";
899 DriverStr(expected, "StoreToOffset");
900}
901
902TEST_F(AssemblerMIPSTest, StoreSToOffset) {
903 __ StoreSToOffset(mips::F0, mips::A0, 0);
904 __ StoreSToOffset(mips::F0, mips::A0, 4);
905 __ StoreSToOffset(mips::F0, mips::A0, 256);
906 __ StoreSToOffset(mips::F0, mips::A0, 0x8000);
907 __ StoreSToOffset(mips::F0, mips::A0, 0x10000);
908 __ StoreSToOffset(mips::F0, mips::A0, 0x12345678);
909 __ StoreSToOffset(mips::F0, mips::A0, -256);
910 __ StoreSToOffset(mips::F0, mips::A0, 0xFFFF8000);
911 __ StoreSToOffset(mips::F0, mips::A0, 0xABCDEF00);
912
913 const char* expected =
914 "swc1 $f0, 0($a0)\n"
915 "swc1 $f0, 4($a0)\n"
916 "swc1 $f0, 256($a0)\n"
917 "ori $at, $zero, 0x8000\n"
918 "addu $at, $at, $a0\n"
919 "swc1 $f0, 0($at)\n"
920 "lui $at, 1\n"
921 "addu $at, $at, $a0\n"
922 "swc1 $f0, 0($at)\n"
923 "lui $at, 0x1234\n"
924 "ori $at, 0x5678\n"
925 "addu $at, $at, $a0\n"
926 "swc1 $f0, 0($at)\n"
927 "swc1 $f0, -256($a0)\n"
928 "swc1 $f0, 0xFFFF8000($a0)\n"
929 "lui $at, 0xABCD\n"
930 "ori $at, 0xEF00\n"
931 "addu $at, $at, $a0\n"
932 "swc1 $f0, 0($at)\n";
933 DriverStr(expected, "StoreSToOffset");
934}
935
936TEST_F(AssemblerMIPSTest, StoreDToOffset) {
937 __ StoreDToOffset(mips::F0, mips::A0, 0);
938 __ StoreDToOffset(mips::F0, mips::A0, 4);
939 __ StoreDToOffset(mips::F0, mips::A0, 256);
940 __ StoreDToOffset(mips::F0, mips::A0, 0x8000);
941 __ StoreDToOffset(mips::F0, mips::A0, 0x10000);
942 __ StoreDToOffset(mips::F0, mips::A0, 0x12345678);
943 __ StoreDToOffset(mips::F0, mips::A0, -256);
944 __ StoreDToOffset(mips::F0, mips::A0, 0xFFFF8000);
945 __ StoreDToOffset(mips::F0, mips::A0, 0xABCDEF00);
946
947 const char* expected =
948 "sdc1 $f0, 0($a0)\n"
949 "swc1 $f0, 4($a0)\n"
950 "swc1 $f1, 8($a0)\n"
951 "sdc1 $f0, 256($a0)\n"
952 "ori $at, $zero, 0x8000\n"
953 "addu $at, $at, $a0\n"
954 "sdc1 $f0, 0($at)\n"
955 "lui $at, 1\n"
956 "addu $at, $at, $a0\n"
957 "sdc1 $f0, 0($at)\n"
958 "lui $at, 0x1234\n"
959 "ori $at, 0x5678\n"
960 "addu $at, $at, $a0\n"
961 "sdc1 $f0, 0($at)\n"
962 "sdc1 $f0, -256($a0)\n"
963 "sdc1 $f0, 0xFFFF8000($a0)\n"
964 "lui $at, 0xABCD\n"
965 "ori $at, 0xEF00\n"
966 "addu $at, $at, $a0\n"
967 "sdc1 $f0, 0($at)\n";
968 DriverStr(expected, "StoreDToOffset");
969}
970
971TEST_F(AssemblerMIPSTest, B) {
972 mips::MipsLabel label1, label2;
973 __ B(&label1);
974 constexpr size_t kAdduCount1 = 63;
975 for (size_t i = 0; i != kAdduCount1; ++i) {
976 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
977 }
978 __ Bind(&label1);
979 __ B(&label2);
980 constexpr size_t kAdduCount2 = 64;
981 for (size_t i = 0; i != kAdduCount2; ++i) {
982 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
983 }
984 __ Bind(&label2);
985 __ B(&label1);
986
987 std::string expected =
988 ".set noreorder\n"
989 "b 1f\n"
990 "nop\n" +
991 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
992 "1:\n"
993 "b 2f\n"
994 "nop\n" +
995 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
996 "2:\n"
997 "b 1b\n"
998 "nop\n";
999 DriverStr(expected, "B");
1000}
1001
1002TEST_F(AssemblerMIPSTest, Beq) {
1003 mips::MipsLabel label;
1004 __ Beq(mips::A0, mips::A1, &label);
1005 constexpr size_t kAdduCount1 = 63;
1006 for (size_t i = 0; i != kAdduCount1; ++i) {
1007 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1008 }
1009 __ Bind(&label);
1010 constexpr size_t kAdduCount2 = 64;
1011 for (size_t i = 0; i != kAdduCount2; ++i) {
1012 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1013 }
1014 __ Beq(mips::A2, mips::A3, &label);
1015
1016 std::string expected =
1017 ".set noreorder\n"
1018 "beq $a0, $a1, 1f\n"
1019 "nop\n" +
1020 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1021 "1:\n" +
1022 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1023 "beq $a2, $a3, 1b\n"
1024 "nop\n";
1025 DriverStr(expected, "Beq");
1026}
1027
1028TEST_F(AssemblerMIPSTest, Bne) {
1029 mips::MipsLabel label;
1030 __ Bne(mips::A0, mips::A1, &label);
1031 constexpr size_t kAdduCount1 = 63;
1032 for (size_t i = 0; i != kAdduCount1; ++i) {
1033 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1034 }
1035 __ Bind(&label);
1036 constexpr size_t kAdduCount2 = 64;
1037 for (size_t i = 0; i != kAdduCount2; ++i) {
1038 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1039 }
1040 __ Bne(mips::A2, mips::A3, &label);
1041
1042 std::string expected =
1043 ".set noreorder\n"
1044 "bne $a0, $a1, 1f\n"
1045 "nop\n" +
1046 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1047 "1:\n" +
1048 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1049 "bne $a2, $a3, 1b\n"
1050 "nop\n";
1051 DriverStr(expected, "Bne");
1052}
1053
1054TEST_F(AssemblerMIPSTest, Beqz) {
1055 mips::MipsLabel label;
1056 __ Beqz(mips::A0, &label);
1057 constexpr size_t kAdduCount1 = 63;
1058 for (size_t i = 0; i != kAdduCount1; ++i) {
1059 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1060 }
1061 __ Bind(&label);
1062 constexpr size_t kAdduCount2 = 64;
1063 for (size_t i = 0; i != kAdduCount2; ++i) {
1064 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1065 }
1066 __ Beqz(mips::A1, &label);
1067
1068 std::string expected =
1069 ".set noreorder\n"
1070 "beq $zero, $a0, 1f\n"
1071 "nop\n" +
1072 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1073 "1:\n" +
1074 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1075 "beq $zero, $a1, 1b\n"
1076 "nop\n";
1077 DriverStr(expected, "Beqz");
1078}
1079
1080TEST_F(AssemblerMIPSTest, Bnez) {
1081 mips::MipsLabel label;
1082 __ Bnez(mips::A0, &label);
1083 constexpr size_t kAdduCount1 = 63;
1084 for (size_t i = 0; i != kAdduCount1; ++i) {
1085 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1086 }
1087 __ Bind(&label);
1088 constexpr size_t kAdduCount2 = 64;
1089 for (size_t i = 0; i != kAdduCount2; ++i) {
1090 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1091 }
1092 __ Bnez(mips::A1, &label);
1093
1094 std::string expected =
1095 ".set noreorder\n"
1096 "bne $zero, $a0, 1f\n"
1097 "nop\n" +
1098 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1099 "1:\n" +
1100 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1101 "bne $zero, $a1, 1b\n"
1102 "nop\n";
1103 DriverStr(expected, "Bnez");
1104}
1105
1106TEST_F(AssemblerMIPSTest, Bltz) {
1107 mips::MipsLabel label;
1108 __ Bltz(mips::A0, &label);
1109 constexpr size_t kAdduCount1 = 63;
1110 for (size_t i = 0; i != kAdduCount1; ++i) {
1111 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1112 }
1113 __ Bind(&label);
1114 constexpr size_t kAdduCount2 = 64;
1115 for (size_t i = 0; i != kAdduCount2; ++i) {
1116 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1117 }
1118 __ Bltz(mips::A1, &label);
1119
1120 std::string expected =
1121 ".set noreorder\n"
1122 "bltz $a0, 1f\n"
1123 "nop\n" +
1124 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1125 "1:\n" +
1126 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1127 "bltz $a1, 1b\n"
1128 "nop\n";
1129 DriverStr(expected, "Bltz");
1130}
1131
1132TEST_F(AssemblerMIPSTest, Bgez) {
1133 mips::MipsLabel label;
1134 __ Bgez(mips::A0, &label);
1135 constexpr size_t kAdduCount1 = 63;
1136 for (size_t i = 0; i != kAdduCount1; ++i) {
1137 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1138 }
1139 __ Bind(&label);
1140 constexpr size_t kAdduCount2 = 64;
1141 for (size_t i = 0; i != kAdduCount2; ++i) {
1142 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1143 }
1144 __ Bgez(mips::A1, &label);
1145
1146 std::string expected =
1147 ".set noreorder\n"
1148 "bgez $a0, 1f\n"
1149 "nop\n" +
1150 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1151 "1:\n" +
1152 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1153 "bgez $a1, 1b\n"
1154 "nop\n";
1155 DriverStr(expected, "Bgez");
1156}
1157
1158TEST_F(AssemblerMIPSTest, Blez) {
1159 mips::MipsLabel label;
1160 __ Blez(mips::A0, &label);
1161 constexpr size_t kAdduCount1 = 63;
1162 for (size_t i = 0; i != kAdduCount1; ++i) {
1163 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1164 }
1165 __ Bind(&label);
1166 constexpr size_t kAdduCount2 = 64;
1167 for (size_t i = 0; i != kAdduCount2; ++i) {
1168 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1169 }
1170 __ Blez(mips::A1, &label);
1171
1172 std::string expected =
1173 ".set noreorder\n"
1174 "blez $a0, 1f\n"
1175 "nop\n" +
1176 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1177 "1:\n" +
1178 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1179 "blez $a1, 1b\n"
1180 "nop\n";
1181 DriverStr(expected, "Blez");
1182}
1183
1184TEST_F(AssemblerMIPSTest, Bgtz) {
1185 mips::MipsLabel label;
1186 __ Bgtz(mips::A0, &label);
1187 constexpr size_t kAdduCount1 = 63;
1188 for (size_t i = 0; i != kAdduCount1; ++i) {
1189 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1190 }
1191 __ Bind(&label);
1192 constexpr size_t kAdduCount2 = 64;
1193 for (size_t i = 0; i != kAdduCount2; ++i) {
1194 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1195 }
1196 __ Bgtz(mips::A1, &label);
1197
1198 std::string expected =
1199 ".set noreorder\n"
1200 "bgtz $a0, 1f\n"
1201 "nop\n" +
1202 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1203 "1:\n" +
1204 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1205 "bgtz $a1, 1b\n"
1206 "nop\n";
1207 DriverStr(expected, "Bgtz");
1208}
1209
1210TEST_F(AssemblerMIPSTest, Blt) {
1211 mips::MipsLabel label;
1212 __ Blt(mips::A0, mips::A1, &label);
1213 constexpr size_t kAdduCount1 = 63;
1214 for (size_t i = 0; i != kAdduCount1; ++i) {
1215 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1216 }
1217 __ Bind(&label);
1218 constexpr size_t kAdduCount2 = 64;
1219 for (size_t i = 0; i != kAdduCount2; ++i) {
1220 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1221 }
1222 __ Blt(mips::A2, mips::A3, &label);
1223
1224 std::string expected =
1225 ".set noreorder\n"
1226 "slt $at, $a0, $a1\n"
1227 "bne $zero, $at, 1f\n"
1228 "nop\n" +
1229 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1230 "1:\n" +
1231 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1232 "slt $at, $a2, $a3\n"
1233 "bne $zero, $at, 1b\n"
1234 "nop\n";
1235 DriverStr(expected, "Blt");
1236}
1237
1238TEST_F(AssemblerMIPSTest, Bge) {
1239 mips::MipsLabel label;
1240 __ Bge(mips::A0, mips::A1, &label);
1241 constexpr size_t kAdduCount1 = 63;
1242 for (size_t i = 0; i != kAdduCount1; ++i) {
1243 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1244 }
1245 __ Bind(&label);
1246 constexpr size_t kAdduCount2 = 64;
1247 for (size_t i = 0; i != kAdduCount2; ++i) {
1248 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1249 }
1250 __ Bge(mips::A2, mips::A3, &label);
1251
1252 std::string expected =
1253 ".set noreorder\n"
1254 "slt $at, $a0, $a1\n"
1255 "beq $zero, $at, 1f\n"
1256 "nop\n" +
1257 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1258 "1:\n" +
1259 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1260 "slt $at, $a2, $a3\n"
1261 "beq $zero, $at, 1b\n"
1262 "nop\n";
1263 DriverStr(expected, "Bge");
1264}
1265
1266TEST_F(AssemblerMIPSTest, Bltu) {
1267 mips::MipsLabel label;
1268 __ Bltu(mips::A0, mips::A1, &label);
1269 constexpr size_t kAdduCount1 = 63;
1270 for (size_t i = 0; i != kAdduCount1; ++i) {
1271 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1272 }
1273 __ Bind(&label);
1274 constexpr size_t kAdduCount2 = 64;
1275 for (size_t i = 0; i != kAdduCount2; ++i) {
1276 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1277 }
1278 __ Bltu(mips::A2, mips::A3, &label);
1279
1280 std::string expected =
1281 ".set noreorder\n"
1282 "sltu $at, $a0, $a1\n"
1283 "bne $zero, $at, 1f\n"
1284 "nop\n" +
1285 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1286 "1:\n" +
1287 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1288 "sltu $at, $a2, $a3\n"
1289 "bne $zero, $at, 1b\n"
1290 "nop\n";
1291 DriverStr(expected, "Bltu");
1292}
1293
1294TEST_F(AssemblerMIPSTest, Bgeu) {
1295 mips::MipsLabel label;
1296 __ Bgeu(mips::A0, mips::A1, &label);
1297 constexpr size_t kAdduCount1 = 63;
1298 for (size_t i = 0; i != kAdduCount1; ++i) {
1299 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1300 }
1301 __ Bind(&label);
1302 constexpr size_t kAdduCount2 = 64;
1303 for (size_t i = 0; i != kAdduCount2; ++i) {
1304 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1305 }
1306 __ Bgeu(mips::A2, mips::A3, &label);
1307
1308 std::string expected =
1309 ".set noreorder\n"
1310 "sltu $at, $a0, $a1\n"
1311 "beq $zero, $at, 1f\n"
1312 "nop\n" +
1313 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1314 "1:\n" +
1315 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1316 "sltu $at, $a2, $a3\n"
1317 "beq $zero, $at, 1b\n"
1318 "nop\n";
1319 DriverStr(expected, "Bgeu");
1320}
1321
1322#undef __
1323
1324} // namespace art