assembler_mips_test.cc revision baf60b7cceb3968ae36540e2f7f92cec3805f6ed
1/*
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
24#define __ GetAssembler()->
25
26namespace art {
27
28struct MIPSCpuRegisterCompare {
29  bool operator()(const mips::Register& a, const mips::Register& b) const {
30    return a < b;
31  }
32};
33
34class 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
189  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
246 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
258TEST_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
370TEST_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
408TEST_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
516TEST_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
594TEST_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, CvtSL) {
603  DriverStr(RepeatFF(&mips::MipsAssembler::Cvtsl, "cvt.s.l ${reg1}, ${reg2}"), "CvtSL");
604}
605
606TEST_F(AssemblerMIPSTest, CvtDL) {
607  DriverStr(RepeatFF(&mips::MipsAssembler::Cvtdl, "cvt.d.l ${reg1}, ${reg2}"), "CvtDL");
608}
609
610TEST_F(AssemblerMIPSTest, CvtSD) {
611  DriverStr(RepeatFF(&mips::MipsAssembler::Cvtsd, "cvt.s.d ${reg1}, ${reg2}"), "CvtSD");
612}
613
614TEST_F(AssemblerMIPSTest, CvtDS) {
615  DriverStr(RepeatFF(&mips::MipsAssembler::Cvtds, "cvt.d.s ${reg1}, ${reg2}"), "CvtDS");
616}
617
618TEST_F(AssemblerMIPSTest, TruncWS) {
619  DriverStr(RepeatFF(&mips::MipsAssembler::TruncWS, "trunc.w.s ${reg1}, ${reg2}"), "TruncWS");
620}
621
622TEST_F(AssemblerMIPSTest, TruncWD) {
623  DriverStr(RepeatFF(&mips::MipsAssembler::TruncWD, "trunc.w.d ${reg1}, ${reg2}"), "TruncWD");
624}
625
626TEST_F(AssemblerMIPSTest, TruncLS) {
627  DriverStr(RepeatFF(&mips::MipsAssembler::TruncLS, "trunc.l.s ${reg1}, ${reg2}"), "TruncLS");
628}
629
630TEST_F(AssemblerMIPSTest, TruncLD) {
631  DriverStr(RepeatFF(&mips::MipsAssembler::TruncLD, "trunc.l.d ${reg1}, ${reg2}"), "TruncLD");
632}
633
634TEST_F(AssemblerMIPSTest, Mfc1) {
635  DriverStr(RepeatRF(&mips::MipsAssembler::Mfc1, "mfc1 ${reg1}, ${reg2}"), "Mfc1");
636}
637
638TEST_F(AssemblerMIPSTest, Mtc1) {
639  DriverStr(RepeatRF(&mips::MipsAssembler::Mtc1, "mtc1 ${reg1}, ${reg2}"), "Mtc1");
640}
641
642TEST_F(AssemblerMIPSTest, Mfhc1) {
643  DriverStr(RepeatRF(&mips::MipsAssembler::Mfhc1, "mfhc1 ${reg1}, ${reg2}"), "Mfhc1");
644}
645
646TEST_F(AssemblerMIPSTest, Mthc1) {
647  DriverStr(RepeatRF(&mips::MipsAssembler::Mthc1, "mthc1 ${reg1}, ${reg2}"), "Mthc1");
648}
649
650TEST_F(AssemblerMIPSTest, Lwc1) {
651  DriverStr(RepeatFRIb(&mips::MipsAssembler::Lwc1, -16, "lwc1 ${reg1}, {imm}(${reg2})"), "Lwc1");
652}
653
654TEST_F(AssemblerMIPSTest, Ldc1) {
655  DriverStr(RepeatFRIb(&mips::MipsAssembler::Ldc1, -16, "ldc1 ${reg1}, {imm}(${reg2})"), "Ldc1");
656}
657
658TEST_F(AssemblerMIPSTest, Swc1) {
659  DriverStr(RepeatFRIb(&mips::MipsAssembler::Swc1, -16, "swc1 ${reg1}, {imm}(${reg2})"), "Swc1");
660}
661
662TEST_F(AssemblerMIPSTest, Sdc1) {
663  DriverStr(RepeatFRIb(&mips::MipsAssembler::Sdc1, -16, "sdc1 ${reg1}, {imm}(${reg2})"), "Sdc1");
664}
665
666TEST_F(AssemblerMIPSTest, Move) {
667  DriverStr(RepeatRR(&mips::MipsAssembler::Move, "or ${reg1}, ${reg2}, $zero"), "Move");
668}
669
670TEST_F(AssemblerMIPSTest, Clear) {
671  DriverStr(RepeatR(&mips::MipsAssembler::Clear, "or ${reg}, $zero, $zero"), "Clear");
672}
673
674TEST_F(AssemblerMIPSTest, Not) {
675  DriverStr(RepeatRR(&mips::MipsAssembler::Not, "nor ${reg1}, ${reg2}, $zero"), "Not");
676}
677
678TEST_F(AssemblerMIPSTest, LoadFromOffset) {
679  __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A0, 0);
680  __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 0);
681  __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 256);
682  __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 1000);
683  __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 0x8000);
684  __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 0x10000);
685  __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 0x12345678);
686  __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, -256);
687  __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 0xFFFF8000);
688  __ LoadFromOffset(mips::kLoadSignedByte, mips::A0, mips::A1, 0xABCDEF00);
689
690  __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A0, 0);
691  __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 0);
692  __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 256);
693  __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 1000);
694  __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 0x8000);
695  __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 0x10000);
696  __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 0x12345678);
697  __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, -256);
698  __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 0xFFFF8000);
699  __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A0, mips::A1, 0xABCDEF00);
700
701  __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A0, 0);
702  __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 0);
703  __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 256);
704  __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 1000);
705  __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 0x8000);
706  __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 0x10000);
707  __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 0x12345678);
708  __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, -256);
709  __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 0xFFFF8000);
710  __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A0, mips::A1, 0xABCDEF00);
711
712  __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A0, 0);
713  __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 0);
714  __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 256);
715  __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 1000);
716  __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 0x8000);
717  __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 0x10000);
718  __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 0x12345678);
719  __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, -256);
720  __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 0xFFFF8000);
721  __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A0, mips::A1, 0xABCDEF00);
722
723  __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A0, 0);
724  __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 0);
725  __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 256);
726  __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 1000);
727  __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 0x8000);
728  __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 0x10000);
729  __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 0x12345678);
730  __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, -256);
731  __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 0xFFFF8000);
732  __ LoadFromOffset(mips::kLoadWord, mips::A0, mips::A1, 0xABCDEF00);
733
734  __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A0, 0);
735  __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A1, 0);
736  __ LoadFromOffset(mips::kLoadDoubleword, mips::A1, mips::A0, 0);
737  __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 0);
738  __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 256);
739  __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 1000);
740  __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 0x8000);
741  __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 0x10000);
742  __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 0x12345678);
743  __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -256);
744  __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 0xFFFF8000);
745  __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, 0xABCDEF00);
746
747  const char* expected =
748      "lb $a0, 0($a0)\n"
749      "lb $a0, 0($a1)\n"
750      "lb $a0, 256($a1)\n"
751      "lb $a0, 1000($a1)\n"
752      "ori $at, $zero, 0x8000\n"
753      "addu $at, $at, $a1\n"
754      "lb $a0, 0($at)\n"
755      "lui $at, 1\n"
756      "addu $at, $at, $a1\n"
757      "lb $a0, 0($at)\n"
758      "lui $at, 0x1234\n"
759      "ori $at, 0x5678\n"
760      "addu $at, $at, $a1\n"
761      "lb $a0, 0($at)\n"
762      "lb $a0, -256($a1)\n"
763      "lb $a0, 0xFFFF8000($a1)\n"
764      "lui $at, 0xABCD\n"
765      "ori $at, 0xEF00\n"
766      "addu $at, $at, $a1\n"
767      "lb $a0, 0($at)\n"
768
769      "lbu $a0, 0($a0)\n"
770      "lbu $a0, 0($a1)\n"
771      "lbu $a0, 256($a1)\n"
772      "lbu $a0, 1000($a1)\n"
773      "ori $at, $zero, 0x8000\n"
774      "addu $at, $at, $a1\n"
775      "lbu $a0, 0($at)\n"
776      "lui $at, 1\n"
777      "addu $at, $at, $a1\n"
778      "lbu $a0, 0($at)\n"
779      "lui $at, 0x1234\n"
780      "ori $at, 0x5678\n"
781      "addu $at, $at, $a1\n"
782      "lbu $a0, 0($at)\n"
783      "lbu $a0, -256($a1)\n"
784      "lbu $a0, 0xFFFF8000($a1)\n"
785      "lui $at, 0xABCD\n"
786      "ori $at, 0xEF00\n"
787      "addu $at, $at, $a1\n"
788      "lbu $a0, 0($at)\n"
789
790      "lh $a0, 0($a0)\n"
791      "lh $a0, 0($a1)\n"
792      "lh $a0, 256($a1)\n"
793      "lh $a0, 1000($a1)\n"
794      "ori $at, $zero, 0x8000\n"
795      "addu $at, $at, $a1\n"
796      "lh $a0, 0($at)\n"
797      "lui $at, 1\n"
798      "addu $at, $at, $a1\n"
799      "lh $a0, 0($at)\n"
800      "lui $at, 0x1234\n"
801      "ori $at, 0x5678\n"
802      "addu $at, $at, $a1\n"
803      "lh $a0, 0($at)\n"
804      "lh $a0, -256($a1)\n"
805      "lh $a0, 0xFFFF8000($a1)\n"
806      "lui $at, 0xABCD\n"
807      "ori $at, 0xEF00\n"
808      "addu $at, $at, $a1\n"
809      "lh $a0, 0($at)\n"
810
811      "lhu $a0, 0($a0)\n"
812      "lhu $a0, 0($a1)\n"
813      "lhu $a0, 256($a1)\n"
814      "lhu $a0, 1000($a1)\n"
815      "ori $at, $zero, 0x8000\n"
816      "addu $at, $at, $a1\n"
817      "lhu $a0, 0($at)\n"
818      "lui $at, 1\n"
819      "addu $at, $at, $a1\n"
820      "lhu $a0, 0($at)\n"
821      "lui $at, 0x1234\n"
822      "ori $at, 0x5678\n"
823      "addu $at, $at, $a1\n"
824      "lhu $a0, 0($at)\n"
825      "lhu $a0, -256($a1)\n"
826      "lhu $a0, 0xFFFF8000($a1)\n"
827      "lui $at, 0xABCD\n"
828      "ori $at, 0xEF00\n"
829      "addu $at, $at, $a1\n"
830      "lhu $a0, 0($at)\n"
831
832      "lw $a0, 0($a0)\n"
833      "lw $a0, 0($a1)\n"
834      "lw $a0, 256($a1)\n"
835      "lw $a0, 1000($a1)\n"
836      "ori $at, $zero, 0x8000\n"
837      "addu $at, $at, $a1\n"
838      "lw $a0, 0($at)\n"
839      "lui $at, 1\n"
840      "addu $at, $at, $a1\n"
841      "lw $a0, 0($at)\n"
842      "lui $at, 0x1234\n"
843      "ori $at, 0x5678\n"
844      "addu $at, $at, $a1\n"
845      "lw $a0, 0($at)\n"
846      "lw $a0, -256($a1)\n"
847      "lw $a0, 0xFFFF8000($a1)\n"
848      "lui $at, 0xABCD\n"
849      "ori $at, 0xEF00\n"
850      "addu $at, $at, $a1\n"
851      "lw $a0, 0($at)\n"
852
853      "lw $a1, 4($a0)\n"
854      "lw $a0, 0($a0)\n"
855      "lw $a0, 0($a1)\n"
856      "lw $a1, 4($a1)\n"
857      "lw $a1, 0($a0)\n"
858      "lw $a2, 4($a0)\n"
859      "lw $a0, 0($a2)\n"
860      "lw $a1, 4($a2)\n"
861      "lw $a0, 256($a2)\n"
862      "lw $a1, 260($a2)\n"
863      "lw $a0, 1000($a2)\n"
864      "lw $a1, 1004($a2)\n"
865      "ori $at, $zero, 0x8000\n"
866      "addu $at, $at, $a2\n"
867      "lw $a0, 0($at)\n"
868      "lw $a1, 4($at)\n"
869      "lui $at, 1\n"
870      "addu $at, $at, $a2\n"
871      "lw $a0, 0($at)\n"
872      "lw $a1, 4($at)\n"
873      "lui $at, 0x1234\n"
874      "ori $at, 0x5678\n"
875      "addu $at, $at, $a2\n"
876      "lw $a0, 0($at)\n"
877      "lw $a1, 4($at)\n"
878      "lw $a0, -256($a2)\n"
879      "lw $a1, -252($a2)\n"
880      "lw $a0, 0xFFFF8000($a2)\n"
881      "lw $a1, 0xFFFF8004($a2)\n"
882      "lui $at, 0xABCD\n"
883      "ori $at, 0xEF00\n"
884      "addu $at, $at, $a2\n"
885      "lw $a0, 0($at)\n"
886      "lw $a1, 4($at)\n";
887  DriverStr(expected, "LoadFromOffset");
888}
889
890TEST_F(AssemblerMIPSTest, LoadSFromOffset) {
891  __ LoadSFromOffset(mips::F0, mips::A0, 0);
892  __ LoadSFromOffset(mips::F0, mips::A0, 4);
893  __ LoadSFromOffset(mips::F0, mips::A0, 256);
894  __ LoadSFromOffset(mips::F0, mips::A0, 0x8000);
895  __ LoadSFromOffset(mips::F0, mips::A0, 0x10000);
896  __ LoadSFromOffset(mips::F0, mips::A0, 0x12345678);
897  __ LoadSFromOffset(mips::F0, mips::A0, -256);
898  __ LoadSFromOffset(mips::F0, mips::A0, 0xFFFF8000);
899  __ LoadSFromOffset(mips::F0, mips::A0, 0xABCDEF00);
900
901  const char* expected =
902      "lwc1 $f0, 0($a0)\n"
903      "lwc1 $f0, 4($a0)\n"
904      "lwc1 $f0, 256($a0)\n"
905      "ori $at, $zero, 0x8000\n"
906      "addu $at, $at, $a0\n"
907      "lwc1 $f0, 0($at)\n"
908      "lui $at, 1\n"
909      "addu $at, $at, $a0\n"
910      "lwc1 $f0, 0($at)\n"
911      "lui $at, 0x1234\n"
912      "ori $at, 0x5678\n"
913      "addu $at, $at, $a0\n"
914      "lwc1 $f0, 0($at)\n"
915      "lwc1 $f0, -256($a0)\n"
916      "lwc1 $f0, 0xFFFF8000($a0)\n"
917      "lui $at, 0xABCD\n"
918      "ori $at, 0xEF00\n"
919      "addu $at, $at, $a0\n"
920      "lwc1 $f0, 0($at)\n";
921  DriverStr(expected, "LoadSFromOffset");
922}
923
924
925TEST_F(AssemblerMIPSTest, LoadDFromOffset) {
926  __ LoadDFromOffset(mips::F0, mips::A0, 0);
927  __ LoadDFromOffset(mips::F0, mips::A0, 4);
928  __ LoadDFromOffset(mips::F0, mips::A0, 256);
929  __ LoadDFromOffset(mips::F0, mips::A0, 0x8000);
930  __ LoadDFromOffset(mips::F0, mips::A0, 0x10000);
931  __ LoadDFromOffset(mips::F0, mips::A0, 0x12345678);
932  __ LoadDFromOffset(mips::F0, mips::A0, -256);
933  __ LoadDFromOffset(mips::F0, mips::A0, 0xFFFF8000);
934  __ LoadDFromOffset(mips::F0, mips::A0, 0xABCDEF00);
935
936  const char* expected =
937      "ldc1 $f0, 0($a0)\n"
938      "lwc1 $f0, 4($a0)\n"
939      "lwc1 $f1, 8($a0)\n"
940      "ldc1 $f0, 256($a0)\n"
941      "ori $at, $zero, 0x8000\n"
942      "addu $at, $at, $a0\n"
943      "ldc1 $f0, 0($at)\n"
944      "lui $at, 1\n"
945      "addu $at, $at, $a0\n"
946      "ldc1 $f0, 0($at)\n"
947      "lui $at, 0x1234\n"
948      "ori $at, 0x5678\n"
949      "addu $at, $at, $a0\n"
950      "ldc1 $f0, 0($at)\n"
951      "ldc1 $f0, -256($a0)\n"
952      "ldc1 $f0, 0xFFFF8000($a0)\n"
953      "lui $at, 0xABCD\n"
954      "ori $at, 0xEF00\n"
955      "addu $at, $at, $a0\n"
956      "ldc1 $f0, 0($at)\n";
957  DriverStr(expected, "LoadDFromOffset");
958}
959
960TEST_F(AssemblerMIPSTest, StoreToOffset) {
961  __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A0, 0);
962  __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 0);
963  __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 256);
964  __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 1000);
965  __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 0x8000);
966  __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 0x10000);
967  __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 0x12345678);
968  __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, -256);
969  __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 0xFFFF8000);
970  __ StoreToOffset(mips::kStoreByte, mips::A0, mips::A1, 0xABCDEF00);
971
972  __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A0, 0);
973  __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 0);
974  __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 256);
975  __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 1000);
976  __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 0x8000);
977  __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 0x10000);
978  __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 0x12345678);
979  __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, -256);
980  __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 0xFFFF8000);
981  __ StoreToOffset(mips::kStoreHalfword, mips::A0, mips::A1, 0xABCDEF00);
982
983  __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A0, 0);
984  __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 0);
985  __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 256);
986  __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 1000);
987  __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 0x8000);
988  __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 0x10000);
989  __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 0x12345678);
990  __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, -256);
991  __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 0xFFFF8000);
992  __ StoreToOffset(mips::kStoreWord, mips::A0, mips::A1, 0xABCDEF00);
993
994  __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 0);
995  __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 256);
996  __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 1000);
997  __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 0x8000);
998  __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 0x10000);
999  __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 0x12345678);
1000  __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -256);
1001  __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 0xFFFF8000);
1002  __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, 0xABCDEF00);
1003
1004  const char* expected =
1005      "sb $a0, 0($a0)\n"
1006      "sb $a0, 0($a1)\n"
1007      "sb $a0, 256($a1)\n"
1008      "sb $a0, 1000($a1)\n"
1009      "ori $at, $zero, 0x8000\n"
1010      "addu $at, $at, $a1\n"
1011      "sb $a0, 0($at)\n"
1012      "lui $at, 1\n"
1013      "addu $at, $at, $a1\n"
1014      "sb $a0, 0($at)\n"
1015      "lui $at, 0x1234\n"
1016      "ori $at, 0x5678\n"
1017      "addu $at, $at, $a1\n"
1018      "sb $a0, 0($at)\n"
1019      "sb $a0, -256($a1)\n"
1020      "sb $a0, 0xFFFF8000($a1)\n"
1021      "lui $at, 0xABCD\n"
1022      "ori $at, 0xEF00\n"
1023      "addu $at, $at, $a1\n"
1024      "sb $a0, 0($at)\n"
1025
1026      "sh $a0, 0($a0)\n"
1027      "sh $a0, 0($a1)\n"
1028      "sh $a0, 256($a1)\n"
1029      "sh $a0, 1000($a1)\n"
1030      "ori $at, $zero, 0x8000\n"
1031      "addu $at, $at, $a1\n"
1032      "sh $a0, 0($at)\n"
1033      "lui $at, 1\n"
1034      "addu $at, $at, $a1\n"
1035      "sh $a0, 0($at)\n"
1036      "lui $at, 0x1234\n"
1037      "ori $at, 0x5678\n"
1038      "addu $at, $at, $a1\n"
1039      "sh $a0, 0($at)\n"
1040      "sh $a0, -256($a1)\n"
1041      "sh $a0, 0xFFFF8000($a1)\n"
1042      "lui $at, 0xABCD\n"
1043      "ori $at, 0xEF00\n"
1044      "addu $at, $at, $a1\n"
1045      "sh $a0, 0($at)\n"
1046
1047      "sw $a0, 0($a0)\n"
1048      "sw $a0, 0($a1)\n"
1049      "sw $a0, 256($a1)\n"
1050      "sw $a0, 1000($a1)\n"
1051      "ori $at, $zero, 0x8000\n"
1052      "addu $at, $at, $a1\n"
1053      "sw $a0, 0($at)\n"
1054      "lui $at, 1\n"
1055      "addu $at, $at, $a1\n"
1056      "sw $a0, 0($at)\n"
1057      "lui $at, 0x1234\n"
1058      "ori $at, 0x5678\n"
1059      "addu $at, $at, $a1\n"
1060      "sw $a0, 0($at)\n"
1061      "sw $a0, -256($a1)\n"
1062      "sw $a0, 0xFFFF8000($a1)\n"
1063      "lui $at, 0xABCD\n"
1064      "ori $at, 0xEF00\n"
1065      "addu $at, $at, $a1\n"
1066      "sw $a0, 0($at)\n"
1067
1068      "sw $a0, 0($a2)\n"
1069      "sw $a1, 4($a2)\n"
1070      "sw $a0, 256($a2)\n"
1071      "sw $a1, 260($a2)\n"
1072      "sw $a0, 1000($a2)\n"
1073      "sw $a1, 1004($a2)\n"
1074      "ori $at, $zero, 0x8000\n"
1075      "addu $at, $at, $a2\n"
1076      "sw $a0, 0($at)\n"
1077      "sw $a1, 4($at)\n"
1078      "lui $at, 1\n"
1079      "addu $at, $at, $a2\n"
1080      "sw $a0, 0($at)\n"
1081      "sw $a1, 4($at)\n"
1082      "lui $at, 0x1234\n"
1083      "ori $at, 0x5678\n"
1084      "addu $at, $at, $a2\n"
1085      "sw $a0, 0($at)\n"
1086      "sw $a1, 4($at)\n"
1087      "sw $a0, -256($a2)\n"
1088      "sw $a1, -252($a2)\n"
1089      "sw $a0, 0xFFFF8000($a2)\n"
1090      "sw $a1, 0xFFFF8004($a2)\n"
1091      "lui $at, 0xABCD\n"
1092      "ori $at, 0xEF00\n"
1093      "addu $at, $at, $a2\n"
1094      "sw $a0, 0($at)\n"
1095      "sw $a1, 4($at)\n";
1096  DriverStr(expected, "StoreToOffset");
1097}
1098
1099TEST_F(AssemblerMIPSTest, StoreSToOffset) {
1100  __ StoreSToOffset(mips::F0, mips::A0, 0);
1101  __ StoreSToOffset(mips::F0, mips::A0, 4);
1102  __ StoreSToOffset(mips::F0, mips::A0, 256);
1103  __ StoreSToOffset(mips::F0, mips::A0, 0x8000);
1104  __ StoreSToOffset(mips::F0, mips::A0, 0x10000);
1105  __ StoreSToOffset(mips::F0, mips::A0, 0x12345678);
1106  __ StoreSToOffset(mips::F0, mips::A0, -256);
1107  __ StoreSToOffset(mips::F0, mips::A0, 0xFFFF8000);
1108  __ StoreSToOffset(mips::F0, mips::A0, 0xABCDEF00);
1109
1110  const char* expected =
1111      "swc1 $f0, 0($a0)\n"
1112      "swc1 $f0, 4($a0)\n"
1113      "swc1 $f0, 256($a0)\n"
1114      "ori $at, $zero, 0x8000\n"
1115      "addu $at, $at, $a0\n"
1116      "swc1 $f0, 0($at)\n"
1117      "lui $at, 1\n"
1118      "addu $at, $at, $a0\n"
1119      "swc1 $f0, 0($at)\n"
1120      "lui $at, 0x1234\n"
1121      "ori $at, 0x5678\n"
1122      "addu $at, $at, $a0\n"
1123      "swc1 $f0, 0($at)\n"
1124      "swc1 $f0, -256($a0)\n"
1125      "swc1 $f0, 0xFFFF8000($a0)\n"
1126      "lui $at, 0xABCD\n"
1127      "ori $at, 0xEF00\n"
1128      "addu $at, $at, $a0\n"
1129      "swc1 $f0, 0($at)\n";
1130  DriverStr(expected, "StoreSToOffset");
1131}
1132
1133TEST_F(AssemblerMIPSTest, StoreDToOffset) {
1134  __ StoreDToOffset(mips::F0, mips::A0, 0);
1135  __ StoreDToOffset(mips::F0, mips::A0, 4);
1136  __ StoreDToOffset(mips::F0, mips::A0, 256);
1137  __ StoreDToOffset(mips::F0, mips::A0, 0x8000);
1138  __ StoreDToOffset(mips::F0, mips::A0, 0x10000);
1139  __ StoreDToOffset(mips::F0, mips::A0, 0x12345678);
1140  __ StoreDToOffset(mips::F0, mips::A0, -256);
1141  __ StoreDToOffset(mips::F0, mips::A0, 0xFFFF8000);
1142  __ StoreDToOffset(mips::F0, mips::A0, 0xABCDEF00);
1143
1144  const char* expected =
1145      "sdc1 $f0, 0($a0)\n"
1146      "swc1 $f0, 4($a0)\n"
1147      "swc1 $f1, 8($a0)\n"
1148      "sdc1 $f0, 256($a0)\n"
1149      "ori $at, $zero, 0x8000\n"
1150      "addu $at, $at, $a0\n"
1151      "sdc1 $f0, 0($at)\n"
1152      "lui $at, 1\n"
1153      "addu $at, $at, $a0\n"
1154      "sdc1 $f0, 0($at)\n"
1155      "lui $at, 0x1234\n"
1156      "ori $at, 0x5678\n"
1157      "addu $at, $at, $a0\n"
1158      "sdc1 $f0, 0($at)\n"
1159      "sdc1 $f0, -256($a0)\n"
1160      "sdc1 $f0, 0xFFFF8000($a0)\n"
1161      "lui $at, 0xABCD\n"
1162      "ori $at, 0xEF00\n"
1163      "addu $at, $at, $a0\n"
1164      "sdc1 $f0, 0($at)\n";
1165  DriverStr(expected, "StoreDToOffset");
1166}
1167
1168TEST_F(AssemblerMIPSTest, B) {
1169  mips::MipsLabel label1, label2;
1170  __ B(&label1);
1171  constexpr size_t kAdduCount1 = 63;
1172  for (size_t i = 0; i != kAdduCount1; ++i) {
1173    __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1174  }
1175  __ Bind(&label1);
1176  __ B(&label2);
1177  constexpr size_t kAdduCount2 = 64;
1178  for (size_t i = 0; i != kAdduCount2; ++i) {
1179    __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1180  }
1181  __ Bind(&label2);
1182  __ B(&label1);
1183
1184  std::string expected =
1185      ".set noreorder\n"
1186      "b 1f\n"
1187      "nop\n" +
1188      RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1189      "1:\n"
1190      "b 2f\n"
1191      "nop\n" +
1192      RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1193      "2:\n"
1194      "b 1b\n"
1195      "nop\n";
1196  DriverStr(expected, "B");
1197}
1198
1199TEST_F(AssemblerMIPSTest, Beq) {
1200  BranchCondTwoRegsHelper(&mips::MipsAssembler::Beq, "Beq");
1201}
1202
1203TEST_F(AssemblerMIPSTest, Bne) {
1204  BranchCondTwoRegsHelper(&mips::MipsAssembler::Bne, "Bne");
1205}
1206
1207TEST_F(AssemblerMIPSTest, Beqz) {
1208  mips::MipsLabel label;
1209  __ Beqz(mips::A0, &label);
1210  constexpr size_t kAdduCount1 = 63;
1211  for (size_t i = 0; i != kAdduCount1; ++i) {
1212    __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1213  }
1214  __ Bind(&label);
1215  constexpr size_t kAdduCount2 = 64;
1216  for (size_t i = 0; i != kAdduCount2; ++i) {
1217    __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1218  }
1219  __ Beqz(mips::A1, &label);
1220
1221  std::string expected =
1222      ".set noreorder\n"
1223      "beq $zero, $a0, 1f\n"
1224      "nop\n" +
1225      RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1226      "1:\n" +
1227      RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1228      "beq $zero, $a1, 1b\n"
1229      "nop\n";
1230  DriverStr(expected, "Beqz");
1231}
1232
1233TEST_F(AssemblerMIPSTest, Bnez) {
1234  mips::MipsLabel label;
1235  __ Bnez(mips::A0, &label);
1236  constexpr size_t kAdduCount1 = 63;
1237  for (size_t i = 0; i != kAdduCount1; ++i) {
1238    __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1239  }
1240  __ Bind(&label);
1241  constexpr size_t kAdduCount2 = 64;
1242  for (size_t i = 0; i != kAdduCount2; ++i) {
1243    __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1244  }
1245  __ Bnez(mips::A1, &label);
1246
1247  std::string expected =
1248      ".set noreorder\n"
1249      "bne $zero, $a0, 1f\n"
1250      "nop\n" +
1251      RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1252      "1:\n" +
1253      RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1254      "bne $zero, $a1, 1b\n"
1255      "nop\n";
1256  DriverStr(expected, "Bnez");
1257}
1258
1259TEST_F(AssemblerMIPSTest, Bltz) {
1260  BranchCondOneRegHelper(&mips::MipsAssembler::Bltz, "Bltz");
1261}
1262
1263TEST_F(AssemblerMIPSTest, Bgez) {
1264  BranchCondOneRegHelper(&mips::MipsAssembler::Bgez, "Bgez");
1265}
1266
1267TEST_F(AssemblerMIPSTest, Blez) {
1268  BranchCondOneRegHelper(&mips::MipsAssembler::Blez, "Blez");
1269}
1270
1271TEST_F(AssemblerMIPSTest, Bgtz) {
1272  BranchCondOneRegHelper(&mips::MipsAssembler::Bgtz, "Bgtz");
1273}
1274
1275TEST_F(AssemblerMIPSTest, Blt) {
1276  mips::MipsLabel label;
1277  __ Blt(mips::A0, mips::A1, &label);
1278  constexpr size_t kAdduCount1 = 63;
1279  for (size_t i = 0; i != kAdduCount1; ++i) {
1280    __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1281  }
1282  __ Bind(&label);
1283  constexpr size_t kAdduCount2 = 64;
1284  for (size_t i = 0; i != kAdduCount2; ++i) {
1285    __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1286  }
1287  __ Blt(mips::A2, mips::A3, &label);
1288
1289  std::string expected =
1290      ".set noreorder\n"
1291      "slt $at, $a0, $a1\n"
1292      "bne $zero, $at, 1f\n"
1293      "nop\n" +
1294      RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1295      "1:\n" +
1296      RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1297      "slt $at, $a2, $a3\n"
1298      "bne $zero, $at, 1b\n"
1299      "nop\n";
1300  DriverStr(expected, "Blt");
1301}
1302
1303TEST_F(AssemblerMIPSTest, Bge) {
1304  mips::MipsLabel label;
1305  __ Bge(mips::A0, mips::A1, &label);
1306  constexpr size_t kAdduCount1 = 63;
1307  for (size_t i = 0; i != kAdduCount1; ++i) {
1308    __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1309  }
1310  __ Bind(&label);
1311  constexpr size_t kAdduCount2 = 64;
1312  for (size_t i = 0; i != kAdduCount2; ++i) {
1313    __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1314  }
1315  __ Bge(mips::A2, mips::A3, &label);
1316
1317  std::string expected =
1318      ".set noreorder\n"
1319      "slt $at, $a0, $a1\n"
1320      "beq $zero, $at, 1f\n"
1321      "nop\n" +
1322      RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1323      "1:\n" +
1324      RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1325      "slt $at, $a2, $a3\n"
1326      "beq $zero, $at, 1b\n"
1327      "nop\n";
1328  DriverStr(expected, "Bge");
1329}
1330
1331TEST_F(AssemblerMIPSTest, Bltu) {
1332  mips::MipsLabel label;
1333  __ Bltu(mips::A0, mips::A1, &label);
1334  constexpr size_t kAdduCount1 = 63;
1335  for (size_t i = 0; i != kAdduCount1; ++i) {
1336    __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1337  }
1338  __ Bind(&label);
1339  constexpr size_t kAdduCount2 = 64;
1340  for (size_t i = 0; i != kAdduCount2; ++i) {
1341    __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1342  }
1343  __ Bltu(mips::A2, mips::A3, &label);
1344
1345  std::string expected =
1346      ".set noreorder\n"
1347      "sltu $at, $a0, $a1\n"
1348      "bne $zero, $at, 1f\n"
1349      "nop\n" +
1350      RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1351      "1:\n" +
1352      RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1353      "sltu $at, $a2, $a3\n"
1354      "bne $zero, $at, 1b\n"
1355      "nop\n";
1356  DriverStr(expected, "Bltu");
1357}
1358
1359TEST_F(AssemblerMIPSTest, Bgeu) {
1360  mips::MipsLabel label;
1361  __ Bgeu(mips::A0, mips::A1, &label);
1362  constexpr size_t kAdduCount1 = 63;
1363  for (size_t i = 0; i != kAdduCount1; ++i) {
1364    __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1365  }
1366  __ Bind(&label);
1367  constexpr size_t kAdduCount2 = 64;
1368  for (size_t i = 0; i != kAdduCount2; ++i) {
1369    __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1370  }
1371  __ Bgeu(mips::A2, mips::A3, &label);
1372
1373  std::string expected =
1374      ".set noreorder\n"
1375      "sltu $at, $a0, $a1\n"
1376      "beq $zero, $at, 1f\n"
1377      "nop\n" +
1378      RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1379      "1:\n" +
1380      RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1381      "sltu $at, $a2, $a3\n"
1382      "beq $zero, $at, 1b\n"
1383      "nop\n";
1384  DriverStr(expected, "Bgeu");
1385}
1386
1387TEST_F(AssemblerMIPSTest, Bc1f) {
1388  mips::MipsLabel label;
1389  __ Bc1f(0, &label);
1390  constexpr size_t kAdduCount1 = 63;
1391  for (size_t i = 0; i != kAdduCount1; ++i) {
1392    __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1393  }
1394  __ Bind(&label);
1395  constexpr size_t kAdduCount2 = 64;
1396  for (size_t i = 0; i != kAdduCount2; ++i) {
1397    __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1398  }
1399  __ Bc1f(7, &label);
1400
1401  std::string expected =
1402      ".set noreorder\n"
1403      "bc1f $fcc0, 1f\n"
1404      "nop\n" +
1405      RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1406      "1:\n" +
1407      RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1408      "bc1f $fcc7, 1b\n"
1409      "nop\n";
1410  DriverStr(expected, "Bc1f");
1411}
1412
1413TEST_F(AssemblerMIPSTest, Bc1t) {
1414  mips::MipsLabel label;
1415  __ Bc1t(0, &label);
1416  constexpr size_t kAdduCount1 = 63;
1417  for (size_t i = 0; i != kAdduCount1; ++i) {
1418    __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1419  }
1420  __ Bind(&label);
1421  constexpr size_t kAdduCount2 = 64;
1422  for (size_t i = 0; i != kAdduCount2; ++i) {
1423    __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1424  }
1425  __ Bc1t(7, &label);
1426
1427  std::string expected =
1428      ".set noreorder\n"
1429      "bc1t $fcc0, 1f\n"
1430      "nop\n" +
1431      RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1432      "1:\n" +
1433      RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1434      "bc1t $fcc7, 1b\n"
1435      "nop\n";
1436  DriverStr(expected, "Bc1t");
1437}
1438
1439#undef __
1440
1441}  // namespace art
1442