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