blob: 4361843c54dbad9c16c7ce0aa67c25669356febb [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
338TEST_F(AssemblerMIPSTest, Seb) {
339 DriverStr(RepeatRR(&mips::MipsAssembler::Seb, "seb ${reg1}, ${reg2}"), "Seb");
340}
341
342TEST_F(AssemblerMIPSTest, Seh) {
343 DriverStr(RepeatRR(&mips::MipsAssembler::Seh, "seh ${reg1}, ${reg2}"), "Seh");
344}
345
346TEST_F(AssemblerMIPSTest, Sll) {
347 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sll, 5, "sll ${reg1}, ${reg2}, {imm}"), "Sll");
348}
349
350TEST_F(AssemblerMIPSTest, Srl) {
351 DriverStr(RepeatRRIb(&mips::MipsAssembler::Srl, 5, "srl ${reg1}, ${reg2}, {imm}"), "Srl");
352}
353
354TEST_F(AssemblerMIPSTest, Sra) {
355 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sra, 5, "sra ${reg1}, ${reg2}, {imm}"), "Sra");
356}
357
358TEST_F(AssemblerMIPSTest, Sllv) {
359 DriverStr(RepeatRRR(&mips::MipsAssembler::Sllv, "sllv ${reg1}, ${reg2}, ${reg3}"), "Sllv");
360}
361
362TEST_F(AssemblerMIPSTest, Srlv) {
363 DriverStr(RepeatRRR(&mips::MipsAssembler::Srlv, "srlv ${reg1}, ${reg2}, ${reg3}"), "Srlv");
364}
365
366TEST_F(AssemblerMIPSTest, Srav) {
367 DriverStr(RepeatRRR(&mips::MipsAssembler::Srav, "srav ${reg1}, ${reg2}, ${reg3}"), "Srav");
368}
369
Alexey Frunze5c7aed32015-11-25 19:41:54 -0800370TEST_F(AssemblerMIPSTest, Ins) {
371 std::vector<mips::Register*> regs = GetRegisters();
372 WarnOnCombinations(regs.size() * regs.size() * 33 * 16);
373 std::string expected;
374 for (mips::Register* reg1 : regs) {
375 for (mips::Register* reg2 : regs) {
376 for (int32_t pos = 0; pos < 32; pos++) {
377 for (int32_t size = 1; pos + size <= 32; size++) {
378 __ Ins(*reg1, *reg2, pos, size);
379 std::ostringstream instr;
380 instr << "ins $" << *reg1 << ", $" << *reg2 << ", " << pos << ", " << size << "\n";
381 expected += instr.str();
382 }
383 }
384 }
385 }
386 DriverStr(expected, "Ins");
387}
388
389TEST_F(AssemblerMIPSTest, Ext) {
390 std::vector<mips::Register*> regs = GetRegisters();
391 WarnOnCombinations(regs.size() * regs.size() * 33 * 16);
392 std::string expected;
393 for (mips::Register* reg1 : regs) {
394 for (mips::Register* reg2 : regs) {
395 for (int32_t pos = 0; pos < 32; pos++) {
396 for (int32_t size = 1; pos + size <= 32; size++) {
397 __ Ext(*reg1, *reg2, pos, size);
398 std::ostringstream instr;
399 instr << "ext $" << *reg1 << ", $" << *reg2 << ", " << pos << ", " << size << "\n";
400 expected += instr.str();
401 }
402 }
403 }
404 }
405 DriverStr(expected, "Ext");
406}
407
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200408TEST_F(AssemblerMIPSTest, Lb) {
409 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lb, -16, "lb ${reg1}, {imm}(${reg2})"), "Lb");
410}
411
412TEST_F(AssemblerMIPSTest, Lh) {
413 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lh, -16, "lh ${reg1}, {imm}(${reg2})"), "Lh");
414}
415
416TEST_F(AssemblerMIPSTest, Lw) {
417 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lw, -16, "lw ${reg1}, {imm}(${reg2})"), "Lw");
418}
419
420TEST_F(AssemblerMIPSTest, Lbu) {
421 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lbu, -16, "lbu ${reg1}, {imm}(${reg2})"), "Lbu");
422}
423
424TEST_F(AssemblerMIPSTest, Lhu) {
425 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lhu, -16, "lhu ${reg1}, {imm}(${reg2})"), "Lhu");
426}
427
428TEST_F(AssemblerMIPSTest, Lui) {
429 DriverStr(RepeatRIb(&mips::MipsAssembler::Lui, 16, "lui ${reg}, {imm}"), "Lui");
430}
431
432TEST_F(AssemblerMIPSTest, Mfhi) {
433 DriverStr(RepeatR(&mips::MipsAssembler::Mfhi, "mfhi ${reg}"), "Mfhi");
434}
435
436TEST_F(AssemblerMIPSTest, Mflo) {
437 DriverStr(RepeatR(&mips::MipsAssembler::Mflo, "mflo ${reg}"), "Mflo");
438}
439
440TEST_F(AssemblerMIPSTest, Sb) {
441 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sb, -16, "sb ${reg1}, {imm}(${reg2})"), "Sb");
442}
443
444TEST_F(AssemblerMIPSTest, Sh) {
445 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sh, -16, "sh ${reg1}, {imm}(${reg2})"), "Sh");
446}
447
448TEST_F(AssemblerMIPSTest, Sw) {
449 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sw, -16, "sw ${reg1}, {imm}(${reg2})"), "Sw");
450}
451
452TEST_F(AssemblerMIPSTest, Slt) {
453 DriverStr(RepeatRRR(&mips::MipsAssembler::Slt, "slt ${reg1}, ${reg2}, ${reg3}"), "Slt");
454}
455
456TEST_F(AssemblerMIPSTest, Sltu) {
457 DriverStr(RepeatRRR(&mips::MipsAssembler::Sltu, "sltu ${reg1}, ${reg2}, ${reg3}"), "Sltu");
458}
459
460TEST_F(AssemblerMIPSTest, Slti) {
461 DriverStr(RepeatRRIb(&mips::MipsAssembler::Slti, -16, "slti ${reg1}, ${reg2}, {imm}"), "Slti");
462}
463
464TEST_F(AssemblerMIPSTest, Sltiu) {
465 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sltiu, -16, "sltiu ${reg1}, ${reg2}, {imm}"), "Sltiu");
466}
467
468TEST_F(AssemblerMIPSTest, AddS) {
469 DriverStr(RepeatFFF(&mips::MipsAssembler::AddS, "add.s ${reg1}, ${reg2}, ${reg3}"), "AddS");
470}
471
472TEST_F(AssemblerMIPSTest, AddD) {
473 DriverStr(RepeatFFF(&mips::MipsAssembler::AddD, "add.d ${reg1}, ${reg2}, ${reg3}"), "AddD");
474}
475
476TEST_F(AssemblerMIPSTest, SubS) {
477 DriverStr(RepeatFFF(&mips::MipsAssembler::SubS, "sub.s ${reg1}, ${reg2}, ${reg3}"), "SubS");
478}
479
480TEST_F(AssemblerMIPSTest, SubD) {
481 DriverStr(RepeatFFF(&mips::MipsAssembler::SubD, "sub.d ${reg1}, ${reg2}, ${reg3}"), "SubD");
482}
483
484TEST_F(AssemblerMIPSTest, MulS) {
485 DriverStr(RepeatFFF(&mips::MipsAssembler::MulS, "mul.s ${reg1}, ${reg2}, ${reg3}"), "MulS");
486}
487
488TEST_F(AssemblerMIPSTest, MulD) {
489 DriverStr(RepeatFFF(&mips::MipsAssembler::MulD, "mul.d ${reg1}, ${reg2}, ${reg3}"), "MulD");
490}
491
492TEST_F(AssemblerMIPSTest, DivS) {
493 DriverStr(RepeatFFF(&mips::MipsAssembler::DivS, "div.s ${reg1}, ${reg2}, ${reg3}"), "DivS");
494}
495
496TEST_F(AssemblerMIPSTest, DivD) {
497 DriverStr(RepeatFFF(&mips::MipsAssembler::DivD, "div.d ${reg1}, ${reg2}, ${reg3}"), "DivD");
498}
499
500TEST_F(AssemblerMIPSTest, MovS) {
501 DriverStr(RepeatFF(&mips::MipsAssembler::MovS, "mov.s ${reg1}, ${reg2}"), "MovS");
502}
503
504TEST_F(AssemblerMIPSTest, MovD) {
505 DriverStr(RepeatFF(&mips::MipsAssembler::MovD, "mov.d ${reg1}, ${reg2}"), "MovD");
506}
507
508TEST_F(AssemblerMIPSTest, NegS) {
509 DriverStr(RepeatFF(&mips::MipsAssembler::NegS, "neg.s ${reg1}, ${reg2}"), "NegS");
510}
511
512TEST_F(AssemblerMIPSTest, NegD) {
513 DriverStr(RepeatFF(&mips::MipsAssembler::NegD, "neg.d ${reg1}, ${reg2}"), "NegD");
514}
515
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -0800516TEST_F(AssemblerMIPSTest, CunS) {
517 DriverStr(RepeatIbFF(&mips::MipsAssembler::CunS, 3, "c.un.s $fcc{imm}, ${reg1}, ${reg2}"),
518 "CunS");
519}
520
521TEST_F(AssemblerMIPSTest, CeqS) {
522 DriverStr(RepeatIbFF(&mips::MipsAssembler::CeqS, 3, "c.eq.s $fcc{imm}, ${reg1}, ${reg2}"),
523 "CeqS");
524}
525
526TEST_F(AssemblerMIPSTest, CueqS) {
527 DriverStr(RepeatIbFF(&mips::MipsAssembler::CueqS, 3, "c.ueq.s $fcc{imm}, ${reg1}, ${reg2}"),
528 "CueqS");
529}
530
531TEST_F(AssemblerMIPSTest, ColtS) {
532 DriverStr(RepeatIbFF(&mips::MipsAssembler::ColtS, 3, "c.olt.s $fcc{imm}, ${reg1}, ${reg2}"),
533 "ColtS");
534}
535
536TEST_F(AssemblerMIPSTest, CultS) {
537 DriverStr(RepeatIbFF(&mips::MipsAssembler::CultS, 3, "c.ult.s $fcc{imm}, ${reg1}, ${reg2}"),
538 "CultS");
539}
540
541TEST_F(AssemblerMIPSTest, ColeS) {
542 DriverStr(RepeatIbFF(&mips::MipsAssembler::ColeS, 3, "c.ole.s $fcc{imm}, ${reg1}, ${reg2}"),
543 "ColeS");
544}
545
546TEST_F(AssemblerMIPSTest, CuleS) {
547 DriverStr(RepeatIbFF(&mips::MipsAssembler::CuleS, 3, "c.ule.s $fcc{imm}, ${reg1}, ${reg2}"),
548 "CuleS");
549}
550
551TEST_F(AssemblerMIPSTest, CunD) {
552 DriverStr(RepeatIbFF(&mips::MipsAssembler::CunD, 3, "c.un.d $fcc{imm}, ${reg1}, ${reg2}"),
553 "CunD");
554}
555
556TEST_F(AssemblerMIPSTest, CeqD) {
557 DriverStr(RepeatIbFF(&mips::MipsAssembler::CeqD, 3, "c.eq.d $fcc{imm}, ${reg1}, ${reg2}"),
558 "CeqD");
559}
560
561TEST_F(AssemblerMIPSTest, CueqD) {
562 DriverStr(RepeatIbFF(&mips::MipsAssembler::CueqD, 3, "c.ueq.d $fcc{imm}, ${reg1}, ${reg2}"),
563 "CueqD");
564}
565
566TEST_F(AssemblerMIPSTest, ColtD) {
567 DriverStr(RepeatIbFF(&mips::MipsAssembler::ColtD, 3, "c.olt.d $fcc{imm}, ${reg1}, ${reg2}"),
568 "ColtD");
569}
570
571TEST_F(AssemblerMIPSTest, CultD) {
572 DriverStr(RepeatIbFF(&mips::MipsAssembler::CultD, 3, "c.ult.d $fcc{imm}, ${reg1}, ${reg2}"),
573 "CultD");
574}
575
576TEST_F(AssemblerMIPSTest, ColeD) {
577 DriverStr(RepeatIbFF(&mips::MipsAssembler::ColeD, 3, "c.ole.d $fcc{imm}, ${reg1}, ${reg2}"),
578 "ColeD");
579}
580
581TEST_F(AssemblerMIPSTest, CuleD) {
582 DriverStr(RepeatIbFF(&mips::MipsAssembler::CuleD, 3, "c.ule.d $fcc{imm}, ${reg1}, ${reg2}"),
583 "CuleD");
584}
585
586TEST_F(AssemblerMIPSTest, Movf) {
587 DriverStr(RepeatRRIb(&mips::MipsAssembler::Movf, 3, "movf ${reg1}, ${reg2}, $fcc{imm}"), "Movf");
588}
589
590TEST_F(AssemblerMIPSTest, Movt) {
591 DriverStr(RepeatRRIb(&mips::MipsAssembler::Movt, 3, "movt ${reg1}, ${reg2}, $fcc{imm}"), "Movt");
592}
593
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200594TEST_F(AssemblerMIPSTest, CvtSW) {
595 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtsw, "cvt.s.w ${reg1}, ${reg2}"), "CvtSW");
596}
597
598TEST_F(AssemblerMIPSTest, CvtDW) {
599 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtdw, "cvt.d.w ${reg1}, ${reg2}"), "CvtDW");
600}
601
602TEST_F(AssemblerMIPSTest, CvtSD) {
603 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtsd, "cvt.s.d ${reg1}, ${reg2}"), "CvtSD");
604}
605
606TEST_F(AssemblerMIPSTest, CvtDS) {
607 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtds, "cvt.d.s ${reg1}, ${reg2}"), "CvtDS");
608}
609
610TEST_F(AssemblerMIPSTest, Mfc1) {
611 DriverStr(RepeatRF(&mips::MipsAssembler::Mfc1, "mfc1 ${reg1}, ${reg2}"), "Mfc1");
612}
613
614TEST_F(AssemblerMIPSTest, Mtc1) {
615 DriverStr(RepeatRF(&mips::MipsAssembler::Mtc1, "mtc1 ${reg1}, ${reg2}"), "Mtc1");
616}
617
618TEST_F(AssemblerMIPSTest, Mfhc1) {
619 DriverStr(RepeatRF(&mips::MipsAssembler::Mfhc1, "mfhc1 ${reg1}, ${reg2}"), "Mfhc1");
620}
621
622TEST_F(AssemblerMIPSTest, Mthc1) {
623 DriverStr(RepeatRF(&mips::MipsAssembler::Mthc1, "mthc1 ${reg1}, ${reg2}"), "Mthc1");
624}
625
626TEST_F(AssemblerMIPSTest, Lwc1) {
627 DriverStr(RepeatFRIb(&mips::MipsAssembler::Lwc1, -16, "lwc1 ${reg1}, {imm}(${reg2})"), "Lwc1");
628}
629
630TEST_F(AssemblerMIPSTest, Ldc1) {
631 DriverStr(RepeatFRIb(&mips::MipsAssembler::Ldc1, -16, "ldc1 ${reg1}, {imm}(${reg2})"), "Ldc1");
632}
633
634TEST_F(AssemblerMIPSTest, Swc1) {
635 DriverStr(RepeatFRIb(&mips::MipsAssembler::Swc1, -16, "swc1 ${reg1}, {imm}(${reg2})"), "Swc1");
636}
637
638TEST_F(AssemblerMIPSTest, Sdc1) {
639 DriverStr(RepeatFRIb(&mips::MipsAssembler::Sdc1, -16, "sdc1 ${reg1}, {imm}(${reg2})"), "Sdc1");
640}
641
642TEST_F(AssemblerMIPSTest, Move) {
643 DriverStr(RepeatRR(&mips::MipsAssembler::Move, "or ${reg1}, ${reg2}, $zero"), "Move");
644}
645
646TEST_F(AssemblerMIPSTest, Clear) {
647 DriverStr(RepeatR(&mips::MipsAssembler::Clear, "or ${reg}, $zero, $zero"), "Clear");
648}
649
650TEST_F(AssemblerMIPSTest, Not) {
651 DriverStr(RepeatRR(&mips::MipsAssembler::Not, "nor ${reg1}, ${reg2}, $zero"), "Not");
652}
653
654TEST_F(AssemblerMIPSTest, LoadFromOffset) {
655 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A0, 0);
656 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 0);
657 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 256);
658 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 1000);
659 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 0x8000);
660 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 0x10000);
661 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 0x12345678);
662 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, -256);
663 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 0xFFFF8000);
664 __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 0xABCDEF00);
665
666 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A0, 0);
667 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 0);
668 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 256);
669 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 1000);
670 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 0x8000);
671 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 0x10000);
672 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 0x12345678);
673 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, -256);
674 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 0xFFFF8000);
675 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 0xABCDEF00);
676
677 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A0, 0);
678 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 0);
679 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 256);
680 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 1000);
681 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 0x8000);
682 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 0x10000);
683 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 0x12345678);
684 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, -256);
685 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 0xFFFF8000);
686 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 0xABCDEF00);
687
688 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A0, 0);
689 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 0);
690 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 256);
691 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 1000);
692 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 0x8000);
693 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 0x10000);
694 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 0x12345678);
695 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, -256);
696 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 0xFFFF8000);
697 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 0xABCDEF00);
698
699 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A0, 0);
700 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 0);
701 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 256);
702 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 1000);
703 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 0x8000);
704 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 0x10000);
705 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 0x12345678);
706 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, -256);
707 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 0xFFFF8000);
708 __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 0xABCDEF00);
709
710 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A0, 0);
711 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A1, 0);
712 __ LoadFromOffset(mips::kLoadDoubleword, mips::A1, mips::A0, 0);
713 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 0);
714 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 256);
715 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 1000);
716 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 0x8000);
717 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 0x10000);
718 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 0x12345678);
719 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -256);
720 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 0xFFFF8000);
721 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 0xABCDEF00);
722
723 const char* expected =
724 "lb $a0, 0($a0)\n"
725 "lb $a0, 0($a1)\n"
726 "lb $a0, 256($a1)\n"
727 "lb $a0, 1000($a1)\n"
728 "ori $at, $zero, 0x8000\n"
729 "addu $at, $at, $a1\n"
730 "lb $a0, 0($at)\n"
731 "lui $at, 1\n"
732 "addu $at, $at, $a1\n"
733 "lb $a0, 0($at)\n"
734 "lui $at, 0x1234\n"
735 "ori $at, 0x5678\n"
736 "addu $at, $at, $a1\n"
737 "lb $a0, 0($at)\n"
738 "lb $a0, -256($a1)\n"
739 "lb $a0, 0xFFFF8000($a1)\n"
740 "lui $at, 0xABCD\n"
741 "ori $at, 0xEF00\n"
742 "addu $at, $at, $a1\n"
743 "lb $a0, 0($at)\n"
744
745 "lbu $a0, 0($a0)\n"
746 "lbu $a0, 0($a1)\n"
747 "lbu $a0, 256($a1)\n"
748 "lbu $a0, 1000($a1)\n"
749 "ori $at, $zero, 0x8000\n"
750 "addu $at, $at, $a1\n"
751 "lbu $a0, 0($at)\n"
752 "lui $at, 1\n"
753 "addu $at, $at, $a1\n"
754 "lbu $a0, 0($at)\n"
755 "lui $at, 0x1234\n"
756 "ori $at, 0x5678\n"
757 "addu $at, $at, $a1\n"
758 "lbu $a0, 0($at)\n"
759 "lbu $a0, -256($a1)\n"
760 "lbu $a0, 0xFFFF8000($a1)\n"
761 "lui $at, 0xABCD\n"
762 "ori $at, 0xEF00\n"
763 "addu $at, $at, $a1\n"
764 "lbu $a0, 0($at)\n"
765
766 "lh $a0, 0($a0)\n"
767 "lh $a0, 0($a1)\n"
768 "lh $a0, 256($a1)\n"
769 "lh $a0, 1000($a1)\n"
770 "ori $at, $zero, 0x8000\n"
771 "addu $at, $at, $a1\n"
772 "lh $a0, 0($at)\n"
773 "lui $at, 1\n"
774 "addu $at, $at, $a1\n"
775 "lh $a0, 0($at)\n"
776 "lui $at, 0x1234\n"
777 "ori $at, 0x5678\n"
778 "addu $at, $at, $a1\n"
779 "lh $a0, 0($at)\n"
780 "lh $a0, -256($a1)\n"
781 "lh $a0, 0xFFFF8000($a1)\n"
782 "lui $at, 0xABCD\n"
783 "ori $at, 0xEF00\n"
784 "addu $at, $at, $a1\n"
785 "lh $a0, 0($at)\n"
786
787 "lhu $a0, 0($a0)\n"
788 "lhu $a0, 0($a1)\n"
789 "lhu $a0, 256($a1)\n"
790 "lhu $a0, 1000($a1)\n"
791 "ori $at, $zero, 0x8000\n"
792 "addu $at, $at, $a1\n"
793 "lhu $a0, 0($at)\n"
794 "lui $at, 1\n"
795 "addu $at, $at, $a1\n"
796 "lhu $a0, 0($at)\n"
797 "lui $at, 0x1234\n"
798 "ori $at, 0x5678\n"
799 "addu $at, $at, $a1\n"
800 "lhu $a0, 0($at)\n"
801 "lhu $a0, -256($a1)\n"
802 "lhu $a0, 0xFFFF8000($a1)\n"
803 "lui $at, 0xABCD\n"
804 "ori $at, 0xEF00\n"
805 "addu $at, $at, $a1\n"
806 "lhu $a0, 0($at)\n"
807
808 "lw $a0, 0($a0)\n"
809 "lw $a0, 0($a1)\n"
810 "lw $a0, 256($a1)\n"
811 "lw $a0, 1000($a1)\n"
812 "ori $at, $zero, 0x8000\n"
813 "addu $at, $at, $a1\n"
814 "lw $a0, 0($at)\n"
815 "lui $at, 1\n"
816 "addu $at, $at, $a1\n"
817 "lw $a0, 0($at)\n"
818 "lui $at, 0x1234\n"
819 "ori $at, 0x5678\n"
820 "addu $at, $at, $a1\n"
821 "lw $a0, 0($at)\n"
822 "lw $a0, -256($a1)\n"
823 "lw $a0, 0xFFFF8000($a1)\n"
824 "lui $at, 0xABCD\n"
825 "ori $at, 0xEF00\n"
826 "addu $at, $at, $a1\n"
827 "lw $a0, 0($at)\n"
828
829 "lw $a1, 4($a0)\n"
830 "lw $a0, 0($a0)\n"
831 "lw $a0, 0($a1)\n"
832 "lw $a1, 4($a1)\n"
833 "lw $a1, 0($a0)\n"
834 "lw $a2, 4($a0)\n"
835 "lw $a0, 0($a2)\n"
836 "lw $a1, 4($a2)\n"
837 "lw $a0, 256($a2)\n"
838 "lw $a1, 260($a2)\n"
839 "lw $a0, 1000($a2)\n"
840 "lw $a1, 1004($a2)\n"
841 "ori $at, $zero, 0x8000\n"
842 "addu $at, $at, $a2\n"
843 "lw $a0, 0($at)\n"
844 "lw $a1, 4($at)\n"
845 "lui $at, 1\n"
846 "addu $at, $at, $a2\n"
847 "lw $a0, 0($at)\n"
848 "lw $a1, 4($at)\n"
849 "lui $at, 0x1234\n"
850 "ori $at, 0x5678\n"
851 "addu $at, $at, $a2\n"
852 "lw $a0, 0($at)\n"
853 "lw $a1, 4($at)\n"
854 "lw $a0, -256($a2)\n"
855 "lw $a1, -252($a2)\n"
856 "lw $a0, 0xFFFF8000($a2)\n"
857 "lw $a1, 0xFFFF8004($a2)\n"
858 "lui $at, 0xABCD\n"
859 "ori $at, 0xEF00\n"
860 "addu $at, $at, $a2\n"
861 "lw $a0, 0($at)\n"
862 "lw $a1, 4($at)\n";
863 DriverStr(expected, "LoadFromOffset");
864}
865
866TEST_F(AssemblerMIPSTest, LoadSFromOffset) {
867 __ LoadSFromOffset(mips::F0, mips::A0, 0);
868 __ LoadSFromOffset(mips::F0, mips::A0, 4);
869 __ LoadSFromOffset(mips::F0, mips::A0, 256);
870 __ LoadSFromOffset(mips::F0, mips::A0, 0x8000);
871 __ LoadSFromOffset(mips::F0, mips::A0, 0x10000);
872 __ LoadSFromOffset(mips::F0, mips::A0, 0x12345678);
873 __ LoadSFromOffset(mips::F0, mips::A0, -256);
874 __ LoadSFromOffset(mips::F0, mips::A0, 0xFFFF8000);
875 __ LoadSFromOffset(mips::F0, mips::A0, 0xABCDEF00);
876
877 const char* expected =
878 "lwc1 $f0, 0($a0)\n"
879 "lwc1 $f0, 4($a0)\n"
880 "lwc1 $f0, 256($a0)\n"
881 "ori $at, $zero, 0x8000\n"
882 "addu $at, $at, $a0\n"
883 "lwc1 $f0, 0($at)\n"
884 "lui $at, 1\n"
885 "addu $at, $at, $a0\n"
886 "lwc1 $f0, 0($at)\n"
887 "lui $at, 0x1234\n"
888 "ori $at, 0x5678\n"
889 "addu $at, $at, $a0\n"
890 "lwc1 $f0, 0($at)\n"
891 "lwc1 $f0, -256($a0)\n"
892 "lwc1 $f0, 0xFFFF8000($a0)\n"
893 "lui $at, 0xABCD\n"
894 "ori $at, 0xEF00\n"
895 "addu $at, $at, $a0\n"
896 "lwc1 $f0, 0($at)\n";
897 DriverStr(expected, "LoadSFromOffset");
898}
899
900
901TEST_F(AssemblerMIPSTest, LoadDFromOffset) {
902 __ LoadDFromOffset(mips::F0, mips::A0, 0);
903 __ LoadDFromOffset(mips::F0, mips::A0, 4);
904 __ LoadDFromOffset(mips::F0, mips::A0, 256);
905 __ LoadDFromOffset(mips::F0, mips::A0, 0x8000);
906 __ LoadDFromOffset(mips::F0, mips::A0, 0x10000);
907 __ LoadDFromOffset(mips::F0, mips::A0, 0x12345678);
908 __ LoadDFromOffset(mips::F0, mips::A0, -256);
909 __ LoadDFromOffset(mips::F0, mips::A0, 0xFFFF8000);
910 __ LoadDFromOffset(mips::F0, mips::A0, 0xABCDEF00);
911
912 const char* expected =
913 "ldc1 $f0, 0($a0)\n"
914 "lwc1 $f0, 4($a0)\n"
915 "lwc1 $f1, 8($a0)\n"
916 "ldc1 $f0, 256($a0)\n"
917 "ori $at, $zero, 0x8000\n"
918 "addu $at, $at, $a0\n"
919 "ldc1 $f0, 0($at)\n"
920 "lui $at, 1\n"
921 "addu $at, $at, $a0\n"
922 "ldc1 $f0, 0($at)\n"
923 "lui $at, 0x1234\n"
924 "ori $at, 0x5678\n"
925 "addu $at, $at, $a0\n"
926 "ldc1 $f0, 0($at)\n"
927 "ldc1 $f0, -256($a0)\n"
928 "ldc1 $f0, 0xFFFF8000($a0)\n"
929 "lui $at, 0xABCD\n"
930 "ori $at, 0xEF00\n"
931 "addu $at, $at, $a0\n"
932 "ldc1 $f0, 0($at)\n";
933 DriverStr(expected, "LoadDFromOffset");
934}
935
936TEST_F(AssemblerMIPSTest, StoreToOffset) {
937 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A0, 0);
938 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 0);
939 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 256);
940 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 1000);
941 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 0x8000);
942 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 0x10000);
943 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 0x12345678);
944 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, -256);
945 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 0xFFFF8000);
946 __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 0xABCDEF00);
947
948 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A0, 0);
949 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 0);
950 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 256);
951 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 1000);
952 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 0x8000);
953 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 0x10000);
954 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 0x12345678);
955 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, -256);
956 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 0xFFFF8000);
957 __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 0xABCDEF00);
958
959 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A0, 0);
960 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 0);
961 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 256);
962 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 1000);
963 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 0x8000);
964 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 0x10000);
965 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 0x12345678);
966 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, -256);
967 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 0xFFFF8000);
968 __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 0xABCDEF00);
969
970 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 0);
971 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 256);
972 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 1000);
973 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 0x8000);
974 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 0x10000);
975 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 0x12345678);
976 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -256);
977 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 0xFFFF8000);
978 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 0xABCDEF00);
979
980 const char* expected =
981 "sb $a0, 0($a0)\n"
982 "sb $a0, 0($a1)\n"
983 "sb $a0, 256($a1)\n"
984 "sb $a0, 1000($a1)\n"
985 "ori $at, $zero, 0x8000\n"
986 "addu $at, $at, $a1\n"
987 "sb $a0, 0($at)\n"
988 "lui $at, 1\n"
989 "addu $at, $at, $a1\n"
990 "sb $a0, 0($at)\n"
991 "lui $at, 0x1234\n"
992 "ori $at, 0x5678\n"
993 "addu $at, $at, $a1\n"
994 "sb $a0, 0($at)\n"
995 "sb $a0, -256($a1)\n"
996 "sb $a0, 0xFFFF8000($a1)\n"
997 "lui $at, 0xABCD\n"
998 "ori $at, 0xEF00\n"
999 "addu $at, $at, $a1\n"
1000 "sb $a0, 0($at)\n"
1001
1002 "sh $a0, 0($a0)\n"
1003 "sh $a0, 0($a1)\n"
1004 "sh $a0, 256($a1)\n"
1005 "sh $a0, 1000($a1)\n"
1006 "ori $at, $zero, 0x8000\n"
1007 "addu $at, $at, $a1\n"
1008 "sh $a0, 0($at)\n"
1009 "lui $at, 1\n"
1010 "addu $at, $at, $a1\n"
1011 "sh $a0, 0($at)\n"
1012 "lui $at, 0x1234\n"
1013 "ori $at, 0x5678\n"
1014 "addu $at, $at, $a1\n"
1015 "sh $a0, 0($at)\n"
1016 "sh $a0, -256($a1)\n"
1017 "sh $a0, 0xFFFF8000($a1)\n"
1018 "lui $at, 0xABCD\n"
1019 "ori $at, 0xEF00\n"
1020 "addu $at, $at, $a1\n"
1021 "sh $a0, 0($at)\n"
1022
1023 "sw $a0, 0($a0)\n"
1024 "sw $a0, 0($a1)\n"
1025 "sw $a0, 256($a1)\n"
1026 "sw $a0, 1000($a1)\n"
1027 "ori $at, $zero, 0x8000\n"
1028 "addu $at, $at, $a1\n"
1029 "sw $a0, 0($at)\n"
1030 "lui $at, 1\n"
1031 "addu $at, $at, $a1\n"
1032 "sw $a0, 0($at)\n"
1033 "lui $at, 0x1234\n"
1034 "ori $at, 0x5678\n"
1035 "addu $at, $at, $a1\n"
1036 "sw $a0, 0($at)\n"
1037 "sw $a0, -256($a1)\n"
1038 "sw $a0, 0xFFFF8000($a1)\n"
1039 "lui $at, 0xABCD\n"
1040 "ori $at, 0xEF00\n"
1041 "addu $at, $at, $a1\n"
1042 "sw $a0, 0($at)\n"
1043
1044 "sw $a0, 0($a2)\n"
1045 "sw $a1, 4($a2)\n"
1046 "sw $a0, 256($a2)\n"
1047 "sw $a1, 260($a2)\n"
1048 "sw $a0, 1000($a2)\n"
1049 "sw $a1, 1004($a2)\n"
1050 "ori $at, $zero, 0x8000\n"
1051 "addu $at, $at, $a2\n"
1052 "sw $a0, 0($at)\n"
1053 "sw $a1, 4($at)\n"
1054 "lui $at, 1\n"
1055 "addu $at, $at, $a2\n"
1056 "sw $a0, 0($at)\n"
1057 "sw $a1, 4($at)\n"
1058 "lui $at, 0x1234\n"
1059 "ori $at, 0x5678\n"
1060 "addu $at, $at, $a2\n"
1061 "sw $a0, 0($at)\n"
1062 "sw $a1, 4($at)\n"
1063 "sw $a0, -256($a2)\n"
1064 "sw $a1, -252($a2)\n"
1065 "sw $a0, 0xFFFF8000($a2)\n"
1066 "sw $a1, 0xFFFF8004($a2)\n"
1067 "lui $at, 0xABCD\n"
1068 "ori $at, 0xEF00\n"
1069 "addu $at, $at, $a2\n"
1070 "sw $a0, 0($at)\n"
1071 "sw $a1, 4($at)\n";
1072 DriverStr(expected, "StoreToOffset");
1073}
1074
1075TEST_F(AssemblerMIPSTest, StoreSToOffset) {
1076 __ StoreSToOffset(mips::F0, mips::A0, 0);
1077 __ StoreSToOffset(mips::F0, mips::A0, 4);
1078 __ StoreSToOffset(mips::F0, mips::A0, 256);
1079 __ StoreSToOffset(mips::F0, mips::A0, 0x8000);
1080 __ StoreSToOffset(mips::F0, mips::A0, 0x10000);
1081 __ StoreSToOffset(mips::F0, mips::A0, 0x12345678);
1082 __ StoreSToOffset(mips::F0, mips::A0, -256);
1083 __ StoreSToOffset(mips::F0, mips::A0, 0xFFFF8000);
1084 __ StoreSToOffset(mips::F0, mips::A0, 0xABCDEF00);
1085
1086 const char* expected =
1087 "swc1 $f0, 0($a0)\n"
1088 "swc1 $f0, 4($a0)\n"
1089 "swc1 $f0, 256($a0)\n"
1090 "ori $at, $zero, 0x8000\n"
1091 "addu $at, $at, $a0\n"
1092 "swc1 $f0, 0($at)\n"
1093 "lui $at, 1\n"
1094 "addu $at, $at, $a0\n"
1095 "swc1 $f0, 0($at)\n"
1096 "lui $at, 0x1234\n"
1097 "ori $at, 0x5678\n"
1098 "addu $at, $at, $a0\n"
1099 "swc1 $f0, 0($at)\n"
1100 "swc1 $f0, -256($a0)\n"
1101 "swc1 $f0, 0xFFFF8000($a0)\n"
1102 "lui $at, 0xABCD\n"
1103 "ori $at, 0xEF00\n"
1104 "addu $at, $at, $a0\n"
1105 "swc1 $f0, 0($at)\n";
1106 DriverStr(expected, "StoreSToOffset");
1107}
1108
1109TEST_F(AssemblerMIPSTest, StoreDToOffset) {
1110 __ StoreDToOffset(mips::F0, mips::A0, 0);
1111 __ StoreDToOffset(mips::F0, mips::A0, 4);
1112 __ StoreDToOffset(mips::F0, mips::A0, 256);
1113 __ StoreDToOffset(mips::F0, mips::A0, 0x8000);
1114 __ StoreDToOffset(mips::F0, mips::A0, 0x10000);
1115 __ StoreDToOffset(mips::F0, mips::A0, 0x12345678);
1116 __ StoreDToOffset(mips::F0, mips::A0, -256);
1117 __ StoreDToOffset(mips::F0, mips::A0, 0xFFFF8000);
1118 __ StoreDToOffset(mips::F0, mips::A0, 0xABCDEF00);
1119
1120 const char* expected =
1121 "sdc1 $f0, 0($a0)\n"
1122 "swc1 $f0, 4($a0)\n"
1123 "swc1 $f1, 8($a0)\n"
1124 "sdc1 $f0, 256($a0)\n"
1125 "ori $at, $zero, 0x8000\n"
1126 "addu $at, $at, $a0\n"
1127 "sdc1 $f0, 0($at)\n"
1128 "lui $at, 1\n"
1129 "addu $at, $at, $a0\n"
1130 "sdc1 $f0, 0($at)\n"
1131 "lui $at, 0x1234\n"
1132 "ori $at, 0x5678\n"
1133 "addu $at, $at, $a0\n"
1134 "sdc1 $f0, 0($at)\n"
1135 "sdc1 $f0, -256($a0)\n"
1136 "sdc1 $f0, 0xFFFF8000($a0)\n"
1137 "lui $at, 0xABCD\n"
1138 "ori $at, 0xEF00\n"
1139 "addu $at, $at, $a0\n"
1140 "sdc1 $f0, 0($at)\n";
1141 DriverStr(expected, "StoreDToOffset");
1142}
1143
1144TEST_F(AssemblerMIPSTest, B) {
1145 mips::MipsLabel label1, label2;
1146 __ B(&label1);
1147 constexpr size_t kAdduCount1 = 63;
1148 for (size_t i = 0; i != kAdduCount1; ++i) {
1149 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1150 }
1151 __ Bind(&label1);
1152 __ B(&label2);
1153 constexpr size_t kAdduCount2 = 64;
1154 for (size_t i = 0; i != kAdduCount2; ++i) {
1155 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1156 }
1157 __ Bind(&label2);
1158 __ B(&label1);
1159
1160 std::string expected =
1161 ".set noreorder\n"
1162 "b 1f\n"
1163 "nop\n" +
1164 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1165 "1:\n"
1166 "b 2f\n"
1167 "nop\n" +
1168 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1169 "2:\n"
1170 "b 1b\n"
1171 "nop\n";
1172 DriverStr(expected, "B");
1173}
1174
1175TEST_F(AssemblerMIPSTest, Beq) {
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08001176 BranchCondTwoRegsHelper(&mips::MipsAssembler::Beq, "Beq");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001177}
1178
1179TEST_F(AssemblerMIPSTest, Bne) {
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08001180 BranchCondTwoRegsHelper(&mips::MipsAssembler::Bne, "Bne");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001181}
1182
1183TEST_F(AssemblerMIPSTest, Beqz) {
1184 mips::MipsLabel label;
1185 __ Beqz(mips::A0, &label);
1186 constexpr size_t kAdduCount1 = 63;
1187 for (size_t i = 0; i != kAdduCount1; ++i) {
1188 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1189 }
1190 __ Bind(&label);
1191 constexpr size_t kAdduCount2 = 64;
1192 for (size_t i = 0; i != kAdduCount2; ++i) {
1193 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1194 }
1195 __ Beqz(mips::A1, &label);
1196
1197 std::string expected =
1198 ".set noreorder\n"
1199 "beq $zero, $a0, 1f\n"
1200 "nop\n" +
1201 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1202 "1:\n" +
1203 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1204 "beq $zero, $a1, 1b\n"
1205 "nop\n";
1206 DriverStr(expected, "Beqz");
1207}
1208
1209TEST_F(AssemblerMIPSTest, Bnez) {
1210 mips::MipsLabel label;
1211 __ Bnez(mips::A0, &label);
1212 constexpr size_t kAdduCount1 = 63;
1213 for (size_t i = 0; i != kAdduCount1; ++i) {
1214 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1215 }
1216 __ Bind(&label);
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 __ Bnez(mips::A1, &label);
1222
1223 std::string expected =
1224 ".set noreorder\n"
1225 "bne $zero, $a0, 1f\n"
1226 "nop\n" +
1227 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1228 "1:\n" +
1229 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1230 "bne $zero, $a1, 1b\n"
1231 "nop\n";
1232 DriverStr(expected, "Bnez");
1233}
1234
1235TEST_F(AssemblerMIPSTest, Bltz) {
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08001236 BranchCondOneRegHelper(&mips::MipsAssembler::Bltz, "Bltz");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001237}
1238
1239TEST_F(AssemblerMIPSTest, Bgez) {
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08001240 BranchCondOneRegHelper(&mips::MipsAssembler::Bgez, "Bgez");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001241}
1242
1243TEST_F(AssemblerMIPSTest, Blez) {
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08001244 BranchCondOneRegHelper(&mips::MipsAssembler::Blez, "Blez");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001245}
1246
1247TEST_F(AssemblerMIPSTest, Bgtz) {
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08001248 BranchCondOneRegHelper(&mips::MipsAssembler::Bgtz, "Bgtz");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001249}
1250
1251TEST_F(AssemblerMIPSTest, Blt) {
1252 mips::MipsLabel label;
1253 __ Blt(mips::A0, mips::A1, &label);
1254 constexpr size_t kAdduCount1 = 63;
1255 for (size_t i = 0; i != kAdduCount1; ++i) {
1256 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1257 }
1258 __ Bind(&label);
1259 constexpr size_t kAdduCount2 = 64;
1260 for (size_t i = 0; i != kAdduCount2; ++i) {
1261 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1262 }
1263 __ Blt(mips::A2, mips::A3, &label);
1264
1265 std::string expected =
1266 ".set noreorder\n"
1267 "slt $at, $a0, $a1\n"
1268 "bne $zero, $at, 1f\n"
1269 "nop\n" +
1270 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1271 "1:\n" +
1272 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1273 "slt $at, $a2, $a3\n"
1274 "bne $zero, $at, 1b\n"
1275 "nop\n";
1276 DriverStr(expected, "Blt");
1277}
1278
1279TEST_F(AssemblerMIPSTest, Bge) {
1280 mips::MipsLabel label;
1281 __ Bge(mips::A0, mips::A1, &label);
1282 constexpr size_t kAdduCount1 = 63;
1283 for (size_t i = 0; i != kAdduCount1; ++i) {
1284 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1285 }
1286 __ Bind(&label);
1287 constexpr size_t kAdduCount2 = 64;
1288 for (size_t i = 0; i != kAdduCount2; ++i) {
1289 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1290 }
1291 __ Bge(mips::A2, mips::A3, &label);
1292
1293 std::string expected =
1294 ".set noreorder\n"
1295 "slt $at, $a0, $a1\n"
1296 "beq $zero, $at, 1f\n"
1297 "nop\n" +
1298 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1299 "1:\n" +
1300 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1301 "slt $at, $a2, $a3\n"
1302 "beq $zero, $at, 1b\n"
1303 "nop\n";
1304 DriverStr(expected, "Bge");
1305}
1306
1307TEST_F(AssemblerMIPSTest, Bltu) {
1308 mips::MipsLabel label;
1309 __ Bltu(mips::A0, mips::A1, &label);
1310 constexpr size_t kAdduCount1 = 63;
1311 for (size_t i = 0; i != kAdduCount1; ++i) {
1312 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1313 }
1314 __ Bind(&label);
1315 constexpr size_t kAdduCount2 = 64;
1316 for (size_t i = 0; i != kAdduCount2; ++i) {
1317 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1318 }
1319 __ Bltu(mips::A2, mips::A3, &label);
1320
1321 std::string expected =
1322 ".set noreorder\n"
1323 "sltu $at, $a0, $a1\n"
1324 "bne $zero, $at, 1f\n"
1325 "nop\n" +
1326 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1327 "1:\n" +
1328 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1329 "sltu $at, $a2, $a3\n"
1330 "bne $zero, $at, 1b\n"
1331 "nop\n";
1332 DriverStr(expected, "Bltu");
1333}
1334
1335TEST_F(AssemblerMIPSTest, Bgeu) {
1336 mips::MipsLabel label;
1337 __ Bgeu(mips::A0, mips::A1, &label);
1338 constexpr size_t kAdduCount1 = 63;
1339 for (size_t i = 0; i != kAdduCount1; ++i) {
1340 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1341 }
1342 __ Bind(&label);
1343 constexpr size_t kAdduCount2 = 64;
1344 for (size_t i = 0; i != kAdduCount2; ++i) {
1345 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1346 }
1347 __ Bgeu(mips::A2, mips::A3, &label);
1348
1349 std::string expected =
1350 ".set noreorder\n"
1351 "sltu $at, $a0, $a1\n"
1352 "beq $zero, $at, 1f\n"
1353 "nop\n" +
1354 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1355 "1:\n" +
1356 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1357 "sltu $at, $a2, $a3\n"
1358 "beq $zero, $at, 1b\n"
1359 "nop\n";
1360 DriverStr(expected, "Bgeu");
1361}
1362
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08001363TEST_F(AssemblerMIPSTest, Bc1f) {
1364 mips::MipsLabel label;
1365 __ Bc1f(0, &label);
1366 constexpr size_t kAdduCount1 = 63;
1367 for (size_t i = 0; i != kAdduCount1; ++i) {
1368 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1369 }
1370 __ Bind(&label);
1371 constexpr size_t kAdduCount2 = 64;
1372 for (size_t i = 0; i != kAdduCount2; ++i) {
1373 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1374 }
1375 __ Bc1f(7, &label);
1376
1377 std::string expected =
1378 ".set noreorder\n"
1379 "bc1f $fcc0, 1f\n"
1380 "nop\n" +
1381 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1382 "1:\n" +
1383 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1384 "bc1f $fcc7, 1b\n"
1385 "nop\n";
1386 DriverStr(expected, "Bc1f");
1387}
1388
1389TEST_F(AssemblerMIPSTest, Bc1t) {
1390 mips::MipsLabel label;
1391 __ Bc1t(0, &label);
1392 constexpr size_t kAdduCount1 = 63;
1393 for (size_t i = 0; i != kAdduCount1; ++i) {
1394 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1395 }
1396 __ Bind(&label);
1397 constexpr size_t kAdduCount2 = 64;
1398 for (size_t i = 0; i != kAdduCount2; ++i) {
1399 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1400 }
1401 __ Bc1t(7, &label);
1402
1403 std::string expected =
1404 ".set noreorder\n"
1405 "bc1t $fcc0, 1f\n"
1406 "nop\n" +
1407 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1408 "1:\n" +
1409 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1410 "bc1t $fcc7, 1b\n"
1411 "nop\n";
1412 DriverStr(expected, "Bc1t");
1413}
1414
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001415#undef __
1416
1417} // namespace art