blob: a9abf2f86e8da40191e34fdf3d524bb70b20b9c2 [file] [log] [blame]
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "assembler_mips.h"
18
19#include <map>
20
21#include "base/stl_util.h"
22#include "utils/assembler_test.h"
23
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -080024#define __ GetAssembler()->
25
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +020026namespace art {
27
28struct MIPSCpuRegisterCompare {
29 bool operator()(const mips::Register& a, const mips::Register& b) const {
30 return a < b;
31 }
32};
33
34class AssemblerMIPSTest : public AssemblerTest<mips::MipsAssembler,
35 mips::Register,
36 mips::FRegister,
37 uint32_t> {
38 public:
39 typedef AssemblerTest<mips::MipsAssembler, mips::Register, mips::FRegister, uint32_t> Base;
40
41 protected:
42 // Get the typically used name for this architecture, e.g., aarch64, x86-64, ...
43 std::string GetArchitectureString() OVERRIDE {
44 return "mips";
45 }
46
47 std::string GetAssemblerParameters() OVERRIDE {
48 return " --no-warn -32 -march=mips32r2";
49 }
50
51 std::string GetDisassembleParameters() OVERRIDE {
52 return " -D -bbinary -mmips:isa32r2";
53 }
54
55 void SetUpHelpers() OVERRIDE {
56 if (registers_.size() == 0) {
57 registers_.push_back(new mips::Register(mips::ZERO));
58 registers_.push_back(new mips::Register(mips::AT));
59 registers_.push_back(new mips::Register(mips::V0));
60 registers_.push_back(new mips::Register(mips::V1));
61 registers_.push_back(new mips::Register(mips::A0));
62 registers_.push_back(new mips::Register(mips::A1));
63 registers_.push_back(new mips::Register(mips::A2));
64 registers_.push_back(new mips::Register(mips::A3));
65 registers_.push_back(new mips::Register(mips::T0));
66 registers_.push_back(new mips::Register(mips::T1));
67 registers_.push_back(new mips::Register(mips::T2));
68 registers_.push_back(new mips::Register(mips::T3));
69 registers_.push_back(new mips::Register(mips::T4));
70 registers_.push_back(new mips::Register(mips::T5));
71 registers_.push_back(new mips::Register(mips::T6));
72 registers_.push_back(new mips::Register(mips::T7));
73 registers_.push_back(new mips::Register(mips::S0));
74 registers_.push_back(new mips::Register(mips::S1));
75 registers_.push_back(new mips::Register(mips::S2));
76 registers_.push_back(new mips::Register(mips::S3));
77 registers_.push_back(new mips::Register(mips::S4));
78 registers_.push_back(new mips::Register(mips::S5));
79 registers_.push_back(new mips::Register(mips::S6));
80 registers_.push_back(new mips::Register(mips::S7));
81 registers_.push_back(new mips::Register(mips::T8));
82 registers_.push_back(new mips::Register(mips::T9));
83 registers_.push_back(new mips::Register(mips::K0));
84 registers_.push_back(new mips::Register(mips::K1));
85 registers_.push_back(new mips::Register(mips::GP));
86 registers_.push_back(new mips::Register(mips::SP));
87 registers_.push_back(new mips::Register(mips::FP));
88 registers_.push_back(new mips::Register(mips::RA));
89
90 secondary_register_names_.emplace(mips::Register(mips::ZERO), "zero");
91 secondary_register_names_.emplace(mips::Register(mips::AT), "at");
92 secondary_register_names_.emplace(mips::Register(mips::V0), "v0");
93 secondary_register_names_.emplace(mips::Register(mips::V1), "v1");
94 secondary_register_names_.emplace(mips::Register(mips::A0), "a0");
95 secondary_register_names_.emplace(mips::Register(mips::A1), "a1");
96 secondary_register_names_.emplace(mips::Register(mips::A2), "a2");
97 secondary_register_names_.emplace(mips::Register(mips::A3), "a3");
98 secondary_register_names_.emplace(mips::Register(mips::T0), "t0");
99 secondary_register_names_.emplace(mips::Register(mips::T1), "t1");
100 secondary_register_names_.emplace(mips::Register(mips::T2), "t2");
101 secondary_register_names_.emplace(mips::Register(mips::T3), "t3");
102 secondary_register_names_.emplace(mips::Register(mips::T4), "t4");
103 secondary_register_names_.emplace(mips::Register(mips::T5), "t5");
104 secondary_register_names_.emplace(mips::Register(mips::T6), "t6");
105 secondary_register_names_.emplace(mips::Register(mips::T7), "t7");
106 secondary_register_names_.emplace(mips::Register(mips::S0), "s0");
107 secondary_register_names_.emplace(mips::Register(mips::S1), "s1");
108 secondary_register_names_.emplace(mips::Register(mips::S2), "s2");
109 secondary_register_names_.emplace(mips::Register(mips::S3), "s3");
110 secondary_register_names_.emplace(mips::Register(mips::S4), "s4");
111 secondary_register_names_.emplace(mips::Register(mips::S5), "s5");
112 secondary_register_names_.emplace(mips::Register(mips::S6), "s6");
113 secondary_register_names_.emplace(mips::Register(mips::S7), "s7");
114 secondary_register_names_.emplace(mips::Register(mips::T8), "t8");
115 secondary_register_names_.emplace(mips::Register(mips::T9), "t9");
116 secondary_register_names_.emplace(mips::Register(mips::K0), "k0");
117 secondary_register_names_.emplace(mips::Register(mips::K1), "k1");
118 secondary_register_names_.emplace(mips::Register(mips::GP), "gp");
119 secondary_register_names_.emplace(mips::Register(mips::SP), "sp");
120 secondary_register_names_.emplace(mips::Register(mips::FP), "fp");
121 secondary_register_names_.emplace(mips::Register(mips::RA), "ra");
122
123 fp_registers_.push_back(new mips::FRegister(mips::F0));
124 fp_registers_.push_back(new mips::FRegister(mips::F1));
125 fp_registers_.push_back(new mips::FRegister(mips::F2));
126 fp_registers_.push_back(new mips::FRegister(mips::F3));
127 fp_registers_.push_back(new mips::FRegister(mips::F4));
128 fp_registers_.push_back(new mips::FRegister(mips::F5));
129 fp_registers_.push_back(new mips::FRegister(mips::F6));
130 fp_registers_.push_back(new mips::FRegister(mips::F7));
131 fp_registers_.push_back(new mips::FRegister(mips::F8));
132 fp_registers_.push_back(new mips::FRegister(mips::F9));
133 fp_registers_.push_back(new mips::FRegister(mips::F10));
134 fp_registers_.push_back(new mips::FRegister(mips::F11));
135 fp_registers_.push_back(new mips::FRegister(mips::F12));
136 fp_registers_.push_back(new mips::FRegister(mips::F13));
137 fp_registers_.push_back(new mips::FRegister(mips::F14));
138 fp_registers_.push_back(new mips::FRegister(mips::F15));
139 fp_registers_.push_back(new mips::FRegister(mips::F16));
140 fp_registers_.push_back(new mips::FRegister(mips::F17));
141 fp_registers_.push_back(new mips::FRegister(mips::F18));
142 fp_registers_.push_back(new mips::FRegister(mips::F19));
143 fp_registers_.push_back(new mips::FRegister(mips::F20));
144 fp_registers_.push_back(new mips::FRegister(mips::F21));
145 fp_registers_.push_back(new mips::FRegister(mips::F22));
146 fp_registers_.push_back(new mips::FRegister(mips::F23));
147 fp_registers_.push_back(new mips::FRegister(mips::F24));
148 fp_registers_.push_back(new mips::FRegister(mips::F25));
149 fp_registers_.push_back(new mips::FRegister(mips::F26));
150 fp_registers_.push_back(new mips::FRegister(mips::F27));
151 fp_registers_.push_back(new mips::FRegister(mips::F28));
152 fp_registers_.push_back(new mips::FRegister(mips::F29));
153 fp_registers_.push_back(new mips::FRegister(mips::F30));
154 fp_registers_.push_back(new mips::FRegister(mips::F31));
155 }
156 }
157
158 void TearDown() OVERRIDE {
159 AssemblerTest::TearDown();
160 STLDeleteElements(&registers_);
161 STLDeleteElements(&fp_registers_);
162 }
163
164 std::vector<mips::Register*> GetRegisters() OVERRIDE {
165 return registers_;
166 }
167
168 std::vector<mips::FRegister*> GetFPRegisters() OVERRIDE {
169 return fp_registers_;
170 }
171
172 uint32_t CreateImmediate(int64_t imm_value) OVERRIDE {
173 return imm_value;
174 }
175
176 std::string GetSecondaryRegisterName(const mips::Register& reg) OVERRIDE {
177 CHECK(secondary_register_names_.find(reg) != secondary_register_names_.end());
178 return secondary_register_names_[reg];
179 }
180
181 std::string RepeatInsn(size_t count, const std::string& insn) {
182 std::string result;
183 for (; count != 0u; --count) {
184 result += insn;
185 }
186 return result;
187 }
188
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -0800189 void BranchCondOneRegHelper(void (mips::MipsAssembler::*f)(mips::Register,
190 mips::MipsLabel*),
191 std::string instr_name) {
192 mips::MipsLabel label;
193 (Base::GetAssembler()->*f)(mips::A0, &label);
194 constexpr size_t kAdduCount1 = 63;
195 for (size_t i = 0; i != kAdduCount1; ++i) {
196 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
197 }
198 __ Bind(&label);
199 constexpr size_t kAdduCount2 = 64;
200 for (size_t i = 0; i != kAdduCount2; ++i) {
201 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
202 }
203 (Base::GetAssembler()->*f)(mips::A1, &label);
204
205 std::string expected =
206 ".set noreorder\n" +
207 instr_name + " $a0, 1f\n"
208 "nop\n" +
209 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
210 "1:\n" +
211 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
212 instr_name + " $a1, 1b\n"
213 "nop\n";
214 DriverStr(expected, instr_name);
215 }
216
217 void BranchCondTwoRegsHelper(void (mips::MipsAssembler::*f)(mips::Register,
218 mips::Register,
219 mips::MipsLabel*),
220 std::string instr_name) {
221 mips::MipsLabel label;
222 (Base::GetAssembler()->*f)(mips::A0, mips::A1, &label);
223 constexpr size_t kAdduCount1 = 63;
224 for (size_t i = 0; i != kAdduCount1; ++i) {
225 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
226 }
227 __ Bind(&label);
228 constexpr size_t kAdduCount2 = 64;
229 for (size_t i = 0; i != kAdduCount2; ++i) {
230 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
231 }
232 (Base::GetAssembler()->*f)(mips::A2, mips::A3, &label);
233
234 std::string expected =
235 ".set noreorder\n" +
236 instr_name + " $a0, $a1, 1f\n"
237 "nop\n" +
238 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
239 "1:\n" +
240 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
241 instr_name + " $a2, $a3, 1b\n"
242 "nop\n";
243 DriverStr(expected, instr_name);
244 }
245
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200246 private:
247 std::vector<mips::Register*> registers_;
248 std::map<mips::Register, std::string, MIPSCpuRegisterCompare> secondary_register_names_;
249
250 std::vector<mips::FRegister*> fp_registers_;
251};
252
253
254TEST_F(AssemblerMIPSTest, Toolchain) {
255 EXPECT_TRUE(CheckTools());
256}
257
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200258TEST_F(AssemblerMIPSTest, Addu) {
259 DriverStr(RepeatRRR(&mips::MipsAssembler::Addu, "addu ${reg1}, ${reg2}, ${reg3}"), "Addu");
260}
261
262TEST_F(AssemblerMIPSTest, Addiu) {
263 DriverStr(RepeatRRIb(&mips::MipsAssembler::Addiu, -16, "addiu ${reg1}, ${reg2}, {imm}"), "Addiu");
264}
265
266TEST_F(AssemblerMIPSTest, Subu) {
267 DriverStr(RepeatRRR(&mips::MipsAssembler::Subu, "subu ${reg1}, ${reg2}, ${reg3}"), "Subu");
268}
269
270TEST_F(AssemblerMIPSTest, MultR2) {
271 DriverStr(RepeatRR(&mips::MipsAssembler::MultR2, "mult ${reg1}, ${reg2}"), "MultR2");
272}
273
274TEST_F(AssemblerMIPSTest, MultuR2) {
275 DriverStr(RepeatRR(&mips::MipsAssembler::MultuR2, "multu ${reg1}, ${reg2}"), "MultuR2");
276}
277
278TEST_F(AssemblerMIPSTest, DivR2Basic) {
279 DriverStr(RepeatRR(&mips::MipsAssembler::DivR2, "div $zero, ${reg1}, ${reg2}"), "DivR2Basic");
280}
281
282TEST_F(AssemblerMIPSTest, DivuR2Basic) {
283 DriverStr(RepeatRR(&mips::MipsAssembler::DivuR2, "divu $zero, ${reg1}, ${reg2}"), "DivuR2Basic");
284}
285
286TEST_F(AssemblerMIPSTest, MulR2) {
287 DriverStr(RepeatRRR(&mips::MipsAssembler::MulR2, "mul ${reg1}, ${reg2}, ${reg3}"), "MulR2");
288}
289
290TEST_F(AssemblerMIPSTest, DivR2) {
291 DriverStr(RepeatRRR(&mips::MipsAssembler::DivR2, "div $zero, ${reg2}, ${reg3}\nmflo ${reg1}"),
292 "DivR2");
293}
294
295TEST_F(AssemblerMIPSTest, ModR2) {
296 DriverStr(RepeatRRR(&mips::MipsAssembler::ModR2, "div $zero, ${reg2}, ${reg3}\nmfhi ${reg1}"),
297 "ModR2");
298}
299
300TEST_F(AssemblerMIPSTest, DivuR2) {
301 DriverStr(RepeatRRR(&mips::MipsAssembler::DivuR2, "divu $zero, ${reg2}, ${reg3}\nmflo ${reg1}"),
302 "DivuR2");
303}
304
305TEST_F(AssemblerMIPSTest, ModuR2) {
306 DriverStr(RepeatRRR(&mips::MipsAssembler::ModuR2, "divu $zero, ${reg2}, ${reg3}\nmfhi ${reg1}"),
307 "ModuR2");
308}
309
310TEST_F(AssemblerMIPSTest, And) {
311 DriverStr(RepeatRRR(&mips::MipsAssembler::And, "and ${reg1}, ${reg2}, ${reg3}"), "And");
312}
313
314TEST_F(AssemblerMIPSTest, Andi) {
315 DriverStr(RepeatRRIb(&mips::MipsAssembler::Andi, 16, "andi ${reg1}, ${reg2}, {imm}"), "Andi");
316}
317
318TEST_F(AssemblerMIPSTest, Or) {
319 DriverStr(RepeatRRR(&mips::MipsAssembler::Or, "or ${reg1}, ${reg2}, ${reg3}"), "Or");
320}
321
322TEST_F(AssemblerMIPSTest, Ori) {
323 DriverStr(RepeatRRIb(&mips::MipsAssembler::Ori, 16, "ori ${reg1}, ${reg2}, {imm}"), "Ori");
324}
325
326TEST_F(AssemblerMIPSTest, Xor) {
327 DriverStr(RepeatRRR(&mips::MipsAssembler::Xor, "xor ${reg1}, ${reg2}, ${reg3}"), "Xor");
328}
329
330TEST_F(AssemblerMIPSTest, Xori) {
331 DriverStr(RepeatRRIb(&mips::MipsAssembler::Xori, 16, "xori ${reg1}, ${reg2}, {imm}"), "Xori");
332}
333
334TEST_F(AssemblerMIPSTest, Nor) {
335 DriverStr(RepeatRRR(&mips::MipsAssembler::Nor, "nor ${reg1}, ${reg2}, ${reg3}"), "Nor");
336}
337
Chris Larsen3acee732015-11-18 13:31:08 -0800338//////////
339// MISC //
340//////////
341
342TEST_F(AssemblerMIPSTest, Movz) {
343 DriverStr(RepeatRRR(&mips::MipsAssembler::Movz, "movz ${reg1}, ${reg2}, ${reg3}"), "Movz");
344}
345
346TEST_F(AssemblerMIPSTest, Movn) {
347 DriverStr(RepeatRRR(&mips::MipsAssembler::Movn, "movn ${reg1}, ${reg2}, ${reg3}"), "Movn");
348}
349
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200350TEST_F(AssemblerMIPSTest, Seb) {
351 DriverStr(RepeatRR(&mips::MipsAssembler::Seb, "seb ${reg1}, ${reg2}"), "Seb");
352}
353
354TEST_F(AssemblerMIPSTest, Seh) {
355 DriverStr(RepeatRR(&mips::MipsAssembler::Seh, "seh ${reg1}, ${reg2}"), "Seh");
356}
357
358TEST_F(AssemblerMIPSTest, Sll) {
359 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sll, 5, "sll ${reg1}, ${reg2}, {imm}"), "Sll");
360}
361
362TEST_F(AssemblerMIPSTest, Srl) {
363 DriverStr(RepeatRRIb(&mips::MipsAssembler::Srl, 5, "srl ${reg1}, ${reg2}, {imm}"), "Srl");
364}
365
366TEST_F(AssemblerMIPSTest, Sra) {
367 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sra, 5, "sra ${reg1}, ${reg2}, {imm}"), "Sra");
368}
369
370TEST_F(AssemblerMIPSTest, Sllv) {
371 DriverStr(RepeatRRR(&mips::MipsAssembler::Sllv, "sllv ${reg1}, ${reg2}, ${reg3}"), "Sllv");
372}
373
374TEST_F(AssemblerMIPSTest, Srlv) {
375 DriverStr(RepeatRRR(&mips::MipsAssembler::Srlv, "srlv ${reg1}, ${reg2}, ${reg3}"), "Srlv");
376}
377
Chris Larsen3acee732015-11-18 13:31:08 -0800378TEST_F(AssemblerMIPSTest, Rotrv) {
379 DriverStr(RepeatRRR(&mips::MipsAssembler::Rotrv, "rotrv ${reg1}, ${reg2}, ${reg3}"), "rotrv");
380}
381
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200382TEST_F(AssemblerMIPSTest, Srav) {
383 DriverStr(RepeatRRR(&mips::MipsAssembler::Srav, "srav ${reg1}, ${reg2}, ${reg3}"), "Srav");
384}
385
Alexey Frunze5c7aed32015-11-25 19:41:54 -0800386TEST_F(AssemblerMIPSTest, Ins) {
387 std::vector<mips::Register*> regs = GetRegisters();
388 WarnOnCombinations(regs.size() * regs.size() * 33 * 16);
389 std::string expected;
390 for (mips::Register* reg1 : regs) {
391 for (mips::Register* reg2 : regs) {
392 for (int32_t pos = 0; pos < 32; pos++) {
393 for (int32_t size = 1; pos + size <= 32; size++) {
394 __ Ins(*reg1, *reg2, pos, size);
395 std::ostringstream instr;
396 instr << "ins $" << *reg1 << ", $" << *reg2 << ", " << pos << ", " << size << "\n";
397 expected += instr.str();
398 }
399 }
400 }
401 }
402 DriverStr(expected, "Ins");
403}
404
405TEST_F(AssemblerMIPSTest, Ext) {
406 std::vector<mips::Register*> regs = GetRegisters();
407 WarnOnCombinations(regs.size() * regs.size() * 33 * 16);
408 std::string expected;
409 for (mips::Register* reg1 : regs) {
410 for (mips::Register* reg2 : regs) {
411 for (int32_t pos = 0; pos < 32; pos++) {
412 for (int32_t size = 1; pos + size <= 32; size++) {
413 __ Ext(*reg1, *reg2, pos, size);
414 std::ostringstream instr;
415 instr << "ext $" << *reg1 << ", $" << *reg2 << ", " << pos << ", " << size << "\n";
416 expected += instr.str();
417 }
418 }
419 }
420 }
421 DriverStr(expected, "Ext");
422}
423
Chris Larsen3acee732015-11-18 13:31:08 -0800424TEST_F(AssemblerMIPSTest, ClzR2) {
425 DriverStr(RepeatRR(&mips::MipsAssembler::ClzR2, "clz ${reg1}, ${reg2}"), "clzR2");
426}
427
428TEST_F(AssemblerMIPSTest, CloR2) {
429 DriverStr(RepeatRR(&mips::MipsAssembler::CloR2, "clo ${reg1}, ${reg2}"), "cloR2");
430}
431
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200432TEST_F(AssemblerMIPSTest, Lb) {
433 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lb, -16, "lb ${reg1}, {imm}(${reg2})"), "Lb");
434}
435
436TEST_F(AssemblerMIPSTest, Lh) {
437 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lh, -16, "lh ${reg1}, {imm}(${reg2})"), "Lh");
438}
439
Chris Larsen3acee732015-11-18 13:31:08 -0800440TEST_F(AssemblerMIPSTest, Lwl) {
441 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lwl, -16, "lwl ${reg1}, {imm}(${reg2})"), "Lwl");
442}
443
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200444TEST_F(AssemblerMIPSTest, Lw) {
445 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lw, -16, "lw ${reg1}, {imm}(${reg2})"), "Lw");
446}
447
Chris Larsen3acee732015-11-18 13:31:08 -0800448TEST_F(AssemblerMIPSTest, Lwr) {
449 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lwr, -16, "lwr ${reg1}, {imm}(${reg2})"), "Lwr");
450}
451
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200452TEST_F(AssemblerMIPSTest, Lbu) {
453 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lbu, -16, "lbu ${reg1}, {imm}(${reg2})"), "Lbu");
454}
455
456TEST_F(AssemblerMIPSTest, Lhu) {
457 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lhu, -16, "lhu ${reg1}, {imm}(${reg2})"), "Lhu");
458}
459
460TEST_F(AssemblerMIPSTest, Lui) {
461 DriverStr(RepeatRIb(&mips::MipsAssembler::Lui, 16, "lui ${reg}, {imm}"), "Lui");
462}
463
464TEST_F(AssemblerMIPSTest, Mfhi) {
465 DriverStr(RepeatR(&mips::MipsAssembler::Mfhi, "mfhi ${reg}"), "Mfhi");
466}
467
468TEST_F(AssemblerMIPSTest, Mflo) {
469 DriverStr(RepeatR(&mips::MipsAssembler::Mflo, "mflo ${reg}"), "Mflo");
470}
471
472TEST_F(AssemblerMIPSTest, Sb) {
473 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sb, -16, "sb ${reg1}, {imm}(${reg2})"), "Sb");
474}
475
476TEST_F(AssemblerMIPSTest, Sh) {
477 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sh, -16, "sh ${reg1}, {imm}(${reg2})"), "Sh");
478}
479
Chris Larsen3acee732015-11-18 13:31:08 -0800480TEST_F(AssemblerMIPSTest, Swl) {
481 DriverStr(RepeatRRIb(&mips::MipsAssembler::Swl, -16, "swl ${reg1}, {imm}(${reg2})"), "Swl");
482}
483
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200484TEST_F(AssemblerMIPSTest, Sw) {
485 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sw, -16, "sw ${reg1}, {imm}(${reg2})"), "Sw");
486}
487
Chris Larsen3acee732015-11-18 13:31:08 -0800488TEST_F(AssemblerMIPSTest, Swr) {
489 DriverStr(RepeatRRIb(&mips::MipsAssembler::Swr, -16, "swr ${reg1}, {imm}(${reg2})"), "Swr");
490}
491
Alexey Frunze51aff3a2016-03-17 17:21:45 -0700492TEST_F(AssemblerMIPSTest, LlR2) {
493 DriverStr(RepeatRRIb(&mips::MipsAssembler::LlR2, -16, "ll ${reg1}, {imm}(${reg2})"), "LlR2");
494}
495
496TEST_F(AssemblerMIPSTest, ScR2) {
497 DriverStr(RepeatRRIb(&mips::MipsAssembler::ScR2, -16, "sc ${reg1}, {imm}(${reg2})"), "ScR2");
498}
499
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200500TEST_F(AssemblerMIPSTest, Slt) {
501 DriverStr(RepeatRRR(&mips::MipsAssembler::Slt, "slt ${reg1}, ${reg2}, ${reg3}"), "Slt");
502}
503
504TEST_F(AssemblerMIPSTest, Sltu) {
505 DriverStr(RepeatRRR(&mips::MipsAssembler::Sltu, "sltu ${reg1}, ${reg2}, ${reg3}"), "Sltu");
506}
507
508TEST_F(AssemblerMIPSTest, Slti) {
509 DriverStr(RepeatRRIb(&mips::MipsAssembler::Slti, -16, "slti ${reg1}, ${reg2}, {imm}"), "Slti");
510}
511
512TEST_F(AssemblerMIPSTest, Sltiu) {
513 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sltiu, -16, "sltiu ${reg1}, ${reg2}, {imm}"), "Sltiu");
514}
515
516TEST_F(AssemblerMIPSTest, AddS) {
517 DriverStr(RepeatFFF(&mips::MipsAssembler::AddS, "add.s ${reg1}, ${reg2}, ${reg3}"), "AddS");
518}
519
520TEST_F(AssemblerMIPSTest, AddD) {
521 DriverStr(RepeatFFF(&mips::MipsAssembler::AddD, "add.d ${reg1}, ${reg2}, ${reg3}"), "AddD");
522}
523
524TEST_F(AssemblerMIPSTest, SubS) {
525 DriverStr(RepeatFFF(&mips::MipsAssembler::SubS, "sub.s ${reg1}, ${reg2}, ${reg3}"), "SubS");
526}
527
528TEST_F(AssemblerMIPSTest, SubD) {
529 DriverStr(RepeatFFF(&mips::MipsAssembler::SubD, "sub.d ${reg1}, ${reg2}, ${reg3}"), "SubD");
530}
531
532TEST_F(AssemblerMIPSTest, MulS) {
533 DriverStr(RepeatFFF(&mips::MipsAssembler::MulS, "mul.s ${reg1}, ${reg2}, ${reg3}"), "MulS");
534}
535
536TEST_F(AssemblerMIPSTest, MulD) {
537 DriverStr(RepeatFFF(&mips::MipsAssembler::MulD, "mul.d ${reg1}, ${reg2}, ${reg3}"), "MulD");
538}
539
540TEST_F(AssemblerMIPSTest, DivS) {
541 DriverStr(RepeatFFF(&mips::MipsAssembler::DivS, "div.s ${reg1}, ${reg2}, ${reg3}"), "DivS");
542}
543
544TEST_F(AssemblerMIPSTest, DivD) {
545 DriverStr(RepeatFFF(&mips::MipsAssembler::DivD, "div.d ${reg1}, ${reg2}, ${reg3}"), "DivD");
546}
547
548TEST_F(AssemblerMIPSTest, MovS) {
549 DriverStr(RepeatFF(&mips::MipsAssembler::MovS, "mov.s ${reg1}, ${reg2}"), "MovS");
550}
551
552TEST_F(AssemblerMIPSTest, MovD) {
553 DriverStr(RepeatFF(&mips::MipsAssembler::MovD, "mov.d ${reg1}, ${reg2}"), "MovD");
554}
555
556TEST_F(AssemblerMIPSTest, NegS) {
557 DriverStr(RepeatFF(&mips::MipsAssembler::NegS, "neg.s ${reg1}, ${reg2}"), "NegS");
558}
559
560TEST_F(AssemblerMIPSTest, NegD) {
561 DriverStr(RepeatFF(&mips::MipsAssembler::NegD, "neg.d ${reg1}, ${reg2}"), "NegD");
562}
563
Chris Larsenf09d5322016-04-22 12:06:34 -0700564TEST_F(AssemblerMIPSTest, FloorWS) {
565 DriverStr(RepeatFF(&mips::MipsAssembler::FloorWS, "floor.w.s ${reg1}, ${reg2}"), "floor.w.s");
566}
567
568TEST_F(AssemblerMIPSTest, FloorWD) {
569 DriverStr(RepeatFF(&mips::MipsAssembler::FloorWD, "floor.w.d ${reg1}, ${reg2}"), "floor.w.d");
570}
571
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -0800572TEST_F(AssemblerMIPSTest, CunS) {
573 DriverStr(RepeatIbFF(&mips::MipsAssembler::CunS, 3, "c.un.s $fcc{imm}, ${reg1}, ${reg2}"),
574 "CunS");
575}
576
577TEST_F(AssemblerMIPSTest, CeqS) {
578 DriverStr(RepeatIbFF(&mips::MipsAssembler::CeqS, 3, "c.eq.s $fcc{imm}, ${reg1}, ${reg2}"),
579 "CeqS");
580}
581
582TEST_F(AssemblerMIPSTest, CueqS) {
583 DriverStr(RepeatIbFF(&mips::MipsAssembler::CueqS, 3, "c.ueq.s $fcc{imm}, ${reg1}, ${reg2}"),
584 "CueqS");
585}
586
587TEST_F(AssemblerMIPSTest, ColtS) {
588 DriverStr(RepeatIbFF(&mips::MipsAssembler::ColtS, 3, "c.olt.s $fcc{imm}, ${reg1}, ${reg2}"),
589 "ColtS");
590}
591
592TEST_F(AssemblerMIPSTest, CultS) {
593 DriverStr(RepeatIbFF(&mips::MipsAssembler::CultS, 3, "c.ult.s $fcc{imm}, ${reg1}, ${reg2}"),
594 "CultS");
595}
596
597TEST_F(AssemblerMIPSTest, ColeS) {
598 DriverStr(RepeatIbFF(&mips::MipsAssembler::ColeS, 3, "c.ole.s $fcc{imm}, ${reg1}, ${reg2}"),
599 "ColeS");
600}
601
602TEST_F(AssemblerMIPSTest, CuleS) {
603 DriverStr(RepeatIbFF(&mips::MipsAssembler::CuleS, 3, "c.ule.s $fcc{imm}, ${reg1}, ${reg2}"),
604 "CuleS");
605}
606
607TEST_F(AssemblerMIPSTest, CunD) {
608 DriverStr(RepeatIbFF(&mips::MipsAssembler::CunD, 3, "c.un.d $fcc{imm}, ${reg1}, ${reg2}"),
609 "CunD");
610}
611
612TEST_F(AssemblerMIPSTest, CeqD) {
613 DriverStr(RepeatIbFF(&mips::MipsAssembler::CeqD, 3, "c.eq.d $fcc{imm}, ${reg1}, ${reg2}"),
614 "CeqD");
615}
616
617TEST_F(AssemblerMIPSTest, CueqD) {
618 DriverStr(RepeatIbFF(&mips::MipsAssembler::CueqD, 3, "c.ueq.d $fcc{imm}, ${reg1}, ${reg2}"),
619 "CueqD");
620}
621
622TEST_F(AssemblerMIPSTest, ColtD) {
623 DriverStr(RepeatIbFF(&mips::MipsAssembler::ColtD, 3, "c.olt.d $fcc{imm}, ${reg1}, ${reg2}"),
624 "ColtD");
625}
626
627TEST_F(AssemblerMIPSTest, CultD) {
628 DriverStr(RepeatIbFF(&mips::MipsAssembler::CultD, 3, "c.ult.d $fcc{imm}, ${reg1}, ${reg2}"),
629 "CultD");
630}
631
632TEST_F(AssemblerMIPSTest, ColeD) {
633 DriverStr(RepeatIbFF(&mips::MipsAssembler::ColeD, 3, "c.ole.d $fcc{imm}, ${reg1}, ${reg2}"),
634 "ColeD");
635}
636
637TEST_F(AssemblerMIPSTest, CuleD) {
638 DriverStr(RepeatIbFF(&mips::MipsAssembler::CuleD, 3, "c.ule.d $fcc{imm}, ${reg1}, ${reg2}"),
639 "CuleD");
640}
641
642TEST_F(AssemblerMIPSTest, Movf) {
643 DriverStr(RepeatRRIb(&mips::MipsAssembler::Movf, 3, "movf ${reg1}, ${reg2}, $fcc{imm}"), "Movf");
644}
645
646TEST_F(AssemblerMIPSTest, Movt) {
647 DriverStr(RepeatRRIb(&mips::MipsAssembler::Movt, 3, "movt ${reg1}, ${reg2}, $fcc{imm}"), "Movt");
648}
649
Alexey Frunzea8aaf5a2016-06-27 14:48:20 -0700650TEST_F(AssemblerMIPSTest, MovfS) {
651 DriverStr(RepeatFFIb(&mips::MipsAssembler::MovfS, 3, "movf.s ${reg1}, ${reg2}, $fcc{imm}"),
652 "MovfS");
653}
654
655TEST_F(AssemblerMIPSTest, MovfD) {
656 DriverStr(RepeatFFIb(&mips::MipsAssembler::MovfD, 3, "movf.d ${reg1}, ${reg2}, $fcc{imm}"),
657 "MovfD");
658}
659
660TEST_F(AssemblerMIPSTest, MovtS) {
661 DriverStr(RepeatFFIb(&mips::MipsAssembler::MovtS, 3, "movt.s ${reg1}, ${reg2}, $fcc{imm}"),
662 "MovtS");
663}
664
665TEST_F(AssemblerMIPSTest, MovtD) {
666 DriverStr(RepeatFFIb(&mips::MipsAssembler::MovtD, 3, "movt.d ${reg1}, ${reg2}, $fcc{imm}"),
667 "MovtD");
668}
669
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200670TEST_F(AssemblerMIPSTest, CvtSW) {
671 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtsw, "cvt.s.w ${reg1}, ${reg2}"), "CvtSW");
672}
673
674TEST_F(AssemblerMIPSTest, CvtDW) {
675 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtdw, "cvt.d.w ${reg1}, ${reg2}"), "CvtDW");
676}
677
Alexey Frunzebaf60b72015-12-22 15:15:03 -0800678TEST_F(AssemblerMIPSTest, CvtSL) {
679 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtsl, "cvt.s.l ${reg1}, ${reg2}"), "CvtSL");
680}
681
682TEST_F(AssemblerMIPSTest, CvtDL) {
683 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtdl, "cvt.d.l ${reg1}, ${reg2}"), "CvtDL");
684}
685
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200686TEST_F(AssemblerMIPSTest, CvtSD) {
687 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtsd, "cvt.s.d ${reg1}, ${reg2}"), "CvtSD");
688}
689
690TEST_F(AssemblerMIPSTest, CvtDS) {
691 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtds, "cvt.d.s ${reg1}, ${reg2}"), "CvtDS");
692}
693
Alexey Frunzebaf60b72015-12-22 15:15:03 -0800694TEST_F(AssemblerMIPSTest, TruncWS) {
695 DriverStr(RepeatFF(&mips::MipsAssembler::TruncWS, "trunc.w.s ${reg1}, ${reg2}"), "TruncWS");
696}
697
698TEST_F(AssemblerMIPSTest, TruncWD) {
699 DriverStr(RepeatFF(&mips::MipsAssembler::TruncWD, "trunc.w.d ${reg1}, ${reg2}"), "TruncWD");
700}
701
702TEST_F(AssemblerMIPSTest, TruncLS) {
703 DriverStr(RepeatFF(&mips::MipsAssembler::TruncLS, "trunc.l.s ${reg1}, ${reg2}"), "TruncLS");
704}
705
706TEST_F(AssemblerMIPSTest, TruncLD) {
707 DriverStr(RepeatFF(&mips::MipsAssembler::TruncLD, "trunc.l.d ${reg1}, ${reg2}"), "TruncLD");
708}
709
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200710TEST_F(AssemblerMIPSTest, Mfc1) {
711 DriverStr(RepeatRF(&mips::MipsAssembler::Mfc1, "mfc1 ${reg1}, ${reg2}"), "Mfc1");
712}
713
714TEST_F(AssemblerMIPSTest, Mtc1) {
715 DriverStr(RepeatRF(&mips::MipsAssembler::Mtc1, "mtc1 ${reg1}, ${reg2}"), "Mtc1");
716}
717
718TEST_F(AssemblerMIPSTest, Mfhc1) {
719 DriverStr(RepeatRF(&mips::MipsAssembler::Mfhc1, "mfhc1 ${reg1}, ${reg2}"), "Mfhc1");
720}
721
722TEST_F(AssemblerMIPSTest, Mthc1) {
723 DriverStr(RepeatRF(&mips::MipsAssembler::Mthc1, "mthc1 ${reg1}, ${reg2}"), "Mthc1");
724}
725
726TEST_F(AssemblerMIPSTest, Lwc1) {
727 DriverStr(RepeatFRIb(&mips::MipsAssembler::Lwc1, -16, "lwc1 ${reg1}, {imm}(${reg2})"), "Lwc1");
728}
729
730TEST_F(AssemblerMIPSTest, Ldc1) {
731 DriverStr(RepeatFRIb(&mips::MipsAssembler::Ldc1, -16, "ldc1 ${reg1}, {imm}(${reg2})"), "Ldc1");
732}
733
734TEST_F(AssemblerMIPSTest, Swc1) {
735 DriverStr(RepeatFRIb(&mips::MipsAssembler::Swc1, -16, "swc1 ${reg1}, {imm}(${reg2})"), "Swc1");
736}
737
738TEST_F(AssemblerMIPSTest, Sdc1) {
739 DriverStr(RepeatFRIb(&mips::MipsAssembler::Sdc1, -16, "sdc1 ${reg1}, {imm}(${reg2})"), "Sdc1");
740}
741
742TEST_F(AssemblerMIPSTest, Move) {
743 DriverStr(RepeatRR(&mips::MipsAssembler::Move, "or ${reg1}, ${reg2}, $zero"), "Move");
744}
745
746TEST_F(AssemblerMIPSTest, Clear) {
747 DriverStr(RepeatR(&mips::MipsAssembler::Clear, "or ${reg}, $zero, $zero"), "Clear");
748}
749
750TEST_F(AssemblerMIPSTest, Not) {
751 DriverStr(RepeatRR(&mips::MipsAssembler::Not, "nor ${reg1}, ${reg2}, $zero"), "Not");
752}
753
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700754TEST_F(AssemblerMIPSTest, Addiu32) {
755 __ Addiu32(mips::A1, mips::A2, -0x8000);
756 __ Addiu32(mips::A1, mips::A2, +0);
757 __ Addiu32(mips::A1, mips::A2, +0x7FFF);
758 __ Addiu32(mips::A1, mips::A2, -0x10000);
759 __ Addiu32(mips::A1, mips::A2, -0x8001);
760 __ Addiu32(mips::A1, mips::A2, +0x8000);
761 __ Addiu32(mips::A1, mips::A2, +0xFFFE);
762 __ Addiu32(mips::A1, mips::A2, -0x10001);
763 __ Addiu32(mips::A1, mips::A2, +0xFFFF);
764 __ Addiu32(mips::A1, mips::A2, +0x10000);
765 __ Addiu32(mips::A1, mips::A2, +0x10001);
766 __ Addiu32(mips::A1, mips::A2, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200767
768 const char* expected =
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700769 "addiu $a1, $a2, -0x8000\n"
770 "addiu $a1, $a2, 0\n"
771 "addiu $a1, $a2, 0x7FFF\n"
772 "addiu $at, $a2, -0x8000\n"
773 "addiu $a1, $at, -0x8000\n"
774 "addiu $at, $a2, -0x8000\n"
775 "addiu $a1, $at, -1\n"
776 "addiu $at, $a2, 0x7FFF\n"
777 "addiu $a1, $at, 1\n"
778 "addiu $at, $a2, 0x7FFF\n"
779 "addiu $a1, $at, 0x7FFF\n"
780 "lui $at, 0xFFFE\n"
781 "ori $at, $at, 0xFFFF\n"
782 "addu $a1, $a2, $at\n"
783 "ori $at, $zero, 0xFFFF\n"
784 "addu $a1, $a2, $at\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200785 "lui $at, 1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700786 "addu $a1, $a2, $at\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200787 "lui $at, 1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700788 "ori $at, $at, 1\n"
789 "addu $a1, $a2, $at\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200790 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700791 "ori $at, $at, 0x5678\n"
792 "addu $a1, $a2, $at\n";
793 DriverStr(expected, "Addiu32");
794}
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200795
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700796TEST_F(AssemblerMIPSTest, LoadFromOffset) {
797 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x8000);
798 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0);
799 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x7FF8);
800 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x7FFB);
801 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x7FFC);
802 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x7FFF);
803 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0xFFF0);
804 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x8008);
805 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x8001);
806 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x8000);
807 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0xFFF0);
808 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x17FE8);
809 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x0FFF8);
810 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x0FFF1);
811 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x0FFF1);
812 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x0FFF8);
813 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x17FE8);
814 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x17FF0);
815 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x17FE9);
816 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x17FE9);
817 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x17FF0);
818 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x12345678);
819
820 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x8000);
821 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0);
822 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x7FF8);
823 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x7FFB);
824 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x7FFC);
825 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x7FFF);
826 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0xFFF0);
827 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x8008);
828 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x8001);
829 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x8000);
830 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0xFFF0);
831 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x17FE8);
832 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x0FFF8);
833 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x0FFF1);
834 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x0FFF1);
835 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x0FFF8);
836 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x17FE8);
837 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x17FF0);
838 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x17FE9);
839 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x17FE9);
840 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x17FF0);
841 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x12345678);
842
843 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x8000);
844 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0);
845 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x7FF8);
846 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x7FFB);
847 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x7FFC);
848 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x7FFF);
849 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0xFFF0);
850 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x8008);
851 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x8001);
852 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x8000);
853 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0xFFF0);
854 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x17FE8);
855 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x0FFF8);
856 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x0FFF1);
857 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x0FFF1);
858 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x0FFF8);
859 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x17FE8);
860 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x17FF0);
861 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x17FE9);
862 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x17FE9);
863 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x17FF0);
864 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x12345678);
865
866 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x8000);
867 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0);
868 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x7FF8);
869 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x7FFB);
870 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x7FFC);
871 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x7FFF);
872 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0xFFF0);
873 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x8008);
874 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x8001);
875 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x8000);
876 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0xFFF0);
877 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x17FE8);
878 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x0FFF8);
879 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x0FFF1);
880 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x0FFF1);
881 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x0FFF8);
882 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x17FE8);
883 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x17FF0);
884 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x17FE9);
885 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x17FE9);
886 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x17FF0);
887 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x12345678);
888
889 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x8000);
890 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0);
891 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x7FF8);
892 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x7FFB);
893 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x7FFC);
894 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x7FFF);
895 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0xFFF0);
896 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x8008);
897 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x8001);
898 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x8000);
899 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0xFFF0);
900 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x17FE8);
901 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x0FFF8);
902 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x0FFF1);
903 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x0FFF1);
904 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x0FFF8);
905 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x17FE8);
906 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x17FF0);
907 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x17FE9);
908 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x17FE9);
909 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x17FF0);
910 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x12345678);
911
912 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x8000);
913 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0);
914 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x7FF8);
915 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x7FFB);
916 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x7FFC);
917 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x7FFF);
918 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0xFFF0);
919 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x8008);
920 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x8001);
921 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x8000);
922 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0xFFF0);
923 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x17FE8);
924 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x0FFF8);
925 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x0FFF1);
926 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x0FFF1);
927 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x0FFF8);
928 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x17FE8);
929 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x17FF0);
930 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x17FE9);
931 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x17FE9);
932 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x17FF0);
933 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x12345678);
934
935 const char* expected =
936 "lb $a3, -0x8000($a1)\n"
937 "lb $a3, 0($a1)\n"
938 "lb $a3, 0x7FF8($a1)\n"
939 "lb $a3, 0x7FFB($a1)\n"
940 "lb $a3, 0x7FFC($a1)\n"
941 "lb $a3, 0x7FFF($a1)\n"
942 "addiu $at, $a1, -0x7FF8\n"
943 "lb $a3, -0x7FF8($at)\n"
944 "addiu $at, $a1, -0x7FF8\n"
945 "lb $a3, -0x10($at)\n"
946 "addiu $at, $a1, -0x7FF8\n"
947 "lb $a3, -9($at)\n"
948 "addiu $at, $a1, 0x7FF8\n"
949 "lb $a3, 8($at)\n"
950 "addiu $at, $a1, 0x7FF8\n"
951 "lb $a3, 0x7FF8($at)\n"
952 "addiu $at, $a1, -0x7FF8\n"
953 "addiu $at, $at, -0x7FF8\n"
954 "lb $a3, -0x7FF8($at)\n"
955 "addiu $at, $a1, -0x7FF8\n"
956 "addiu $at, $at, -0x7FF8\n"
957 "lb $a3, -8($at)\n"
958 "addiu $at, $a1, -0x7FF8\n"
959 "addiu $at, $at, -0x7FF8\n"
960 "lb $a3, -1($at)\n"
961 "addiu $at, $a1, 0x7FF8\n"
962 "addiu $at, $at, 0x7FF8\n"
963 "lb $a3, 1($at)\n"
964 "addiu $at, $a1, 0x7FF8\n"
965 "addiu $at, $at, 0x7FF8\n"
966 "lb $a3, 8($at)\n"
967 "addiu $at, $a1, 0x7FF8\n"
968 "addiu $at, $at, 0x7FF8\n"
969 "lb $a3, 0x7FF8($at)\n"
970 "lui $at, 0xFFFE\n"
971 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200972 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700973 "lb $a3, 0($at)\n"
974 "lui $at, 0xFFFE\n"
975 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200976 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700977 "lb $a3, 7($at)\n"
978 "lui $at, 0x1\n"
979 "ori $at, $at, 0x7FE8\n"
980 "addu $at, $at, $a1\n"
981 "lb $a3, 1($at)\n"
982 "lui $at, 0x1\n"
983 "ori $at, $at, 0x7FF0\n"
984 "addu $at, $at, $a1\n"
985 "lb $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200986 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700987 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200988 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700989 "lb $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200990
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700991 "lbu $a3, -0x8000($a1)\n"
992 "lbu $a3, 0($a1)\n"
993 "lbu $a3, 0x7FF8($a1)\n"
994 "lbu $a3, 0x7FFB($a1)\n"
995 "lbu $a3, 0x7FFC($a1)\n"
996 "lbu $a3, 0x7FFF($a1)\n"
997 "addiu $at, $a1, -0x7FF8\n"
998 "lbu $a3, -0x7FF8($at)\n"
999 "addiu $at, $a1, -0x7FF8\n"
1000 "lbu $a3, -0x10($at)\n"
1001 "addiu $at, $a1, -0x7FF8\n"
1002 "lbu $a3, -9($at)\n"
1003 "addiu $at, $a1, 0x7FF8\n"
1004 "lbu $a3, 8($at)\n"
1005 "addiu $at, $a1, 0x7FF8\n"
1006 "lbu $a3, 0x7FF8($at)\n"
1007 "addiu $at, $a1, -0x7FF8\n"
1008 "addiu $at, $at, -0x7FF8\n"
1009 "lbu $a3, -0x7FF8($at)\n"
1010 "addiu $at, $a1, -0x7FF8\n"
1011 "addiu $at, $at, -0x7FF8\n"
1012 "lbu $a3, -8($at)\n"
1013 "addiu $at, $a1, -0x7FF8\n"
1014 "addiu $at, $at, -0x7FF8\n"
1015 "lbu $a3, -1($at)\n"
1016 "addiu $at, $a1, 0x7FF8\n"
1017 "addiu $at, $at, 0x7FF8\n"
1018 "lbu $a3, 1($at)\n"
1019 "addiu $at, $a1, 0x7FF8\n"
1020 "addiu $at, $at, 0x7FF8\n"
1021 "lbu $a3, 8($at)\n"
1022 "addiu $at, $a1, 0x7FF8\n"
1023 "addiu $at, $at, 0x7FF8\n"
1024 "lbu $a3, 0x7FF8($at)\n"
1025 "lui $at, 0xFFFE\n"
1026 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001027 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001028 "lbu $a3, 0($at)\n"
1029 "lui $at, 0xFFFE\n"
1030 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001031 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001032 "lbu $a3, 7($at)\n"
1033 "lui $at, 0x1\n"
1034 "ori $at, $at, 0x7FE8\n"
1035 "addu $at, $at, $a1\n"
1036 "lbu $a3, 1($at)\n"
1037 "lui $at, 0x1\n"
1038 "ori $at, $at, 0x7FF0\n"
1039 "addu $at, $at, $a1\n"
1040 "lbu $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001041 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001042 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001043 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001044 "lbu $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001045
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001046 "lh $a3, -0x8000($a1)\n"
1047 "lh $a3, 0($a1)\n"
1048 "lh $a3, 0x7FF8($a1)\n"
1049 "lh $a3, 0x7FFB($a1)\n"
1050 "lh $a3, 0x7FFC($a1)\n"
1051 "lh $a3, 0x7FFF($a1)\n"
1052 "addiu $at, $a1, -0x7FF8\n"
1053 "lh $a3, -0x7FF8($at)\n"
1054 "addiu $at, $a1, -0x7FF8\n"
1055 "lh $a3, -0x10($at)\n"
1056 "addiu $at, $a1, -0x7FF8\n"
1057 "lh $a3, -9($at)\n"
1058 "addiu $at, $a1, 0x7FF8\n"
1059 "lh $a3, 8($at)\n"
1060 "addiu $at, $a1, 0x7FF8\n"
1061 "lh $a3, 0x7FF8($at)\n"
1062 "addiu $at, $a1, -0x7FF8\n"
1063 "addiu $at, $at, -0x7FF8\n"
1064 "lh $a3, -0x7FF8($at)\n"
1065 "addiu $at, $a1, -0x7FF8\n"
1066 "addiu $at, $at, -0x7FF8\n"
1067 "lh $a3, -8($at)\n"
1068 "addiu $at, $a1, -0x7FF8\n"
1069 "addiu $at, $at, -0x7FF8\n"
1070 "lh $a3, -1($at)\n"
1071 "addiu $at, $a1, 0x7FF8\n"
1072 "addiu $at, $at, 0x7FF8\n"
1073 "lh $a3, 1($at)\n"
1074 "addiu $at, $a1, 0x7FF8\n"
1075 "addiu $at, $at, 0x7FF8\n"
1076 "lh $a3, 8($at)\n"
1077 "addiu $at, $a1, 0x7FF8\n"
1078 "addiu $at, $at, 0x7FF8\n"
1079 "lh $a3, 0x7FF8($at)\n"
1080 "lui $at, 0xFFFE\n"
1081 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001082 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001083 "lh $a3, 0($at)\n"
1084 "lui $at, 0xFFFE\n"
1085 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001086 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001087 "lh $a3, 7($at)\n"
1088 "lui $at, 0x1\n"
1089 "ori $at, $at, 0x7FE8\n"
1090 "addu $at, $at, $a1\n"
1091 "lh $a3, 1($at)\n"
1092 "lui $at, 0x1\n"
1093 "ori $at, $at, 0x7FF0\n"
1094 "addu $at, $at, $a1\n"
1095 "lh $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001096 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001097 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001098 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001099 "lh $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001100
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001101 "lhu $a3, -0x8000($a1)\n"
1102 "lhu $a3, 0($a1)\n"
1103 "lhu $a3, 0x7FF8($a1)\n"
1104 "lhu $a3, 0x7FFB($a1)\n"
1105 "lhu $a3, 0x7FFC($a1)\n"
1106 "lhu $a3, 0x7FFF($a1)\n"
1107 "addiu $at, $a1, -0x7FF8\n"
1108 "lhu $a3, -0x7FF8($at)\n"
1109 "addiu $at, $a1, -0x7FF8\n"
1110 "lhu $a3, -0x10($at)\n"
1111 "addiu $at, $a1, -0x7FF8\n"
1112 "lhu $a3, -9($at)\n"
1113 "addiu $at, $a1, 0x7FF8\n"
1114 "lhu $a3, 8($at)\n"
1115 "addiu $at, $a1, 0x7FF8\n"
1116 "lhu $a3, 0x7FF8($at)\n"
1117 "addiu $at, $a1, -0x7FF8\n"
1118 "addiu $at, $at, -0x7FF8\n"
1119 "lhu $a3, -0x7FF8($at)\n"
1120 "addiu $at, $a1, -0x7FF8\n"
1121 "addiu $at, $at, -0x7FF8\n"
1122 "lhu $a3, -8($at)\n"
1123 "addiu $at, $a1, -0x7FF8\n"
1124 "addiu $at, $at, -0x7FF8\n"
1125 "lhu $a3, -1($at)\n"
1126 "addiu $at, $a1, 0x7FF8\n"
1127 "addiu $at, $at, 0x7FF8\n"
1128 "lhu $a3, 1($at)\n"
1129 "addiu $at, $a1, 0x7FF8\n"
1130 "addiu $at, $at, 0x7FF8\n"
1131 "lhu $a3, 8($at)\n"
1132 "addiu $at, $a1, 0x7FF8\n"
1133 "addiu $at, $at, 0x7FF8\n"
1134 "lhu $a3, 0x7FF8($at)\n"
1135 "lui $at, 0xFFFE\n"
1136 "ori $at, $at, 0x8010\n"
1137 "addu $at, $at, $a1\n"
1138 "lhu $a3, 0($at)\n"
1139 "lui $at, 0xFFFE\n"
1140 "ori $at, $at, 0x8010\n"
1141 "addu $at, $at, $a1\n"
1142 "lhu $a3, 7($at)\n"
1143 "lui $at, 0x1\n"
1144 "ori $at, $at, 0x7FE8\n"
1145 "addu $at, $at, $a1\n"
1146 "lhu $a3, 1($at)\n"
1147 "lui $at, 0x1\n"
1148 "ori $at, $at, 0x7FF0\n"
1149 "addu $at, $at, $a1\n"
1150 "lhu $a3, 0($at)\n"
1151 "lui $at, 0x1234\n"
1152 "ori $at, $at, 0x5678\n"
1153 "addu $at, $at, $a1\n"
1154 "lhu $a3, 0($at)\n"
1155
1156 "lw $a3, -0x8000($a1)\n"
1157 "lw $a3, 0($a1)\n"
1158 "lw $a3, 0x7FF8($a1)\n"
1159 "lw $a3, 0x7FFB($a1)\n"
1160 "lw $a3, 0x7FFC($a1)\n"
1161 "lw $a3, 0x7FFF($a1)\n"
1162 "addiu $at, $a1, -0x7FF8\n"
1163 "lw $a3, -0x7FF8($at)\n"
1164 "addiu $at, $a1, -0x7FF8\n"
1165 "lw $a3, -0x10($at)\n"
1166 "addiu $at, $a1, -0x7FF8\n"
1167 "lw $a3, -9($at)\n"
1168 "addiu $at, $a1, 0x7FF8\n"
1169 "lw $a3, 8($at)\n"
1170 "addiu $at, $a1, 0x7FF8\n"
1171 "lw $a3, 0x7FF8($at)\n"
1172 "addiu $at, $a1, -0x7FF8\n"
1173 "addiu $at, $at, -0x7FF8\n"
1174 "lw $a3, -0x7FF8($at)\n"
1175 "addiu $at, $a1, -0x7FF8\n"
1176 "addiu $at, $at, -0x7FF8\n"
1177 "lw $a3, -8($at)\n"
1178 "addiu $at, $a1, -0x7FF8\n"
1179 "addiu $at, $at, -0x7FF8\n"
1180 "lw $a3, -1($at)\n"
1181 "addiu $at, $a1, 0x7FF8\n"
1182 "addiu $at, $at, 0x7FF8\n"
1183 "lw $a3, 1($at)\n"
1184 "addiu $at, $a1, 0x7FF8\n"
1185 "addiu $at, $at, 0x7FF8\n"
1186 "lw $a3, 8($at)\n"
1187 "addiu $at, $a1, 0x7FF8\n"
1188 "addiu $at, $at, 0x7FF8\n"
1189 "lw $a3, 0x7FF8($at)\n"
1190 "lui $at, 0xFFFE\n"
1191 "ori $at, $at, 0x8010\n"
1192 "addu $at, $at, $a1\n"
1193 "lw $a3, 0($at)\n"
1194 "lui $at, 0xFFFE\n"
1195 "ori $at, $at, 0x8010\n"
1196 "addu $at, $at, $a1\n"
1197 "lw $a3, 7($at)\n"
1198 "lui $at, 0x1\n"
1199 "ori $at, $at, 0x7FE8\n"
1200 "addu $at, $at, $a1\n"
1201 "lw $a3, 1($at)\n"
1202 "lui $at, 0x1\n"
1203 "ori $at, $at, 0x7FF0\n"
1204 "addu $at, $at, $a1\n"
1205 "lw $a3, 0($at)\n"
1206 "lui $at, 0x1234\n"
1207 "ori $at, $at, 0x5678\n"
1208 "addu $at, $at, $a1\n"
1209 "lw $a3, 0($at)\n"
1210
1211 "lw $a0, -0x8000($a2)\n"
1212 "lw $a1, -0x7FFC($a2)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001213 "lw $a0, 0($a2)\n"
1214 "lw $a1, 4($a2)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001215 "lw $a0, 0x7FF8($a2)\n"
1216 "lw $a1, 0x7FFC($a2)\n"
1217 "lw $a0, 0x7FFB($a2)\n"
1218 "lw $a1, 0x7FFF($a2)\n"
1219 "addiu $at, $a2, 0x7FF8\n"
1220 "lw $a0, 4($at)\n"
1221 "lw $a1, 8($at)\n"
1222 "addiu $at, $a2, 0x7FF8\n"
1223 "lw $a0, 7($at)\n"
1224 "lw $a1, 11($at)\n"
1225 "addiu $at, $a2, -0x7FF8\n"
1226 "lw $a0, -0x7FF8($at)\n"
1227 "lw $a1, -0x7FF4($at)\n"
1228 "addiu $at, $a2, -0x7FF8\n"
1229 "lw $a0, -0x10($at)\n"
1230 "lw $a1, -0xC($at)\n"
1231 "addiu $at, $a2, -0x7FF8\n"
1232 "lw $a0, -9($at)\n"
1233 "lw $a1, -5($at)\n"
1234 "addiu $at, $a2, 0x7FF8\n"
1235 "lw $a0, 8($at)\n"
1236 "lw $a1, 12($at)\n"
1237 "addiu $at, $a2, 0x7FF8\n"
1238 "lw $a0, 0x7FF8($at)\n"
1239 "lw $a1, 0x7FFC($at)\n"
1240 "addiu $at, $a2, -0x7FF8\n"
1241 "addiu $at, $at, -0x7FF8\n"
1242 "lw $a0, -0x7FF8($at)\n"
1243 "lw $a1, -0x7FF4($at)\n"
1244 "addiu $at, $a2, -0x7FF8\n"
1245 "addiu $at, $at, -0x7FF8\n"
1246 "lw $a0, -8($at)\n"
1247 "lw $a1, -4($at)\n"
1248 "addiu $at, $a2, -0x7FF8\n"
1249 "addiu $at, $at, -0x7FF8\n"
1250 "lw $a0, -1($at)\n"
1251 "lw $a1, 3($at)\n"
1252 "addiu $at, $a2, 0x7FF8\n"
1253 "addiu $at, $at, 0x7FF8\n"
1254 "lw $a0, 1($at)\n"
1255 "lw $a1, 5($at)\n"
1256 "addiu $at, $a2, 0x7FF8\n"
1257 "addiu $at, $at, 0x7FF8\n"
1258 "lw $a0, 8($at)\n"
1259 "lw $a1, 12($at)\n"
1260 "addiu $at, $a2, 0x7FF8\n"
1261 "addiu $at, $at, 0x7FF8\n"
1262 "lw $a0, 0x7FF8($at)\n"
1263 "lw $a1, 0x7FFC($at)\n"
1264 "lui $at, 0xFFFE\n"
1265 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001266 "addu $at, $at, $a2\n"
1267 "lw $a0, 0($at)\n"
1268 "lw $a1, 4($at)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001269 "lui $at, 0xFFFE\n"
1270 "ori $at, $at, 0x8010\n"
1271 "addu $at, $at, $a2\n"
1272 "lw $a0, 7($at)\n"
1273 "lw $a1, 11($at)\n"
1274 "lui $at, 0x1\n"
1275 "ori $at, $at, 0x7FE8\n"
1276 "addu $at, $at, $a2\n"
1277 "lw $a0, 1($at)\n"
1278 "lw $a1, 5($at)\n"
1279 "lui $at, 0x1\n"
1280 "ori $at, $at, 0x7FF0\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001281 "addu $at, $at, $a2\n"
1282 "lw $a0, 0($at)\n"
1283 "lw $a1, 4($at)\n"
1284 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001285 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001286 "addu $at, $at, $a2\n"
1287 "lw $a0, 0($at)\n"
1288 "lw $a1, 4($at)\n";
1289 DriverStr(expected, "LoadFromOffset");
1290}
1291
1292TEST_F(AssemblerMIPSTest, LoadSFromOffset) {
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001293 __ LoadSFromOffset(mips::F2, mips::A0, -0x8000);
1294 __ LoadSFromOffset(mips::F2, mips::A0, +0);
1295 __ LoadSFromOffset(mips::F2, mips::A0, +0x7FF8);
1296 __ LoadSFromOffset(mips::F2, mips::A0, +0x7FFB);
1297 __ LoadSFromOffset(mips::F2, mips::A0, +0x7FFC);
1298 __ LoadSFromOffset(mips::F2, mips::A0, +0x7FFF);
1299 __ LoadSFromOffset(mips::F2, mips::A0, -0xFFF0);
1300 __ LoadSFromOffset(mips::F2, mips::A0, -0x8008);
1301 __ LoadSFromOffset(mips::F2, mips::A0, -0x8001);
1302 __ LoadSFromOffset(mips::F2, mips::A0, +0x8000);
1303 __ LoadSFromOffset(mips::F2, mips::A0, +0xFFF0);
1304 __ LoadSFromOffset(mips::F2, mips::A0, -0x17FE8);
1305 __ LoadSFromOffset(mips::F2, mips::A0, -0x0FFF8);
1306 __ LoadSFromOffset(mips::F2, mips::A0, -0x0FFF1);
1307 __ LoadSFromOffset(mips::F2, mips::A0, +0x0FFF1);
1308 __ LoadSFromOffset(mips::F2, mips::A0, +0x0FFF8);
1309 __ LoadSFromOffset(mips::F2, mips::A0, +0x17FE8);
1310 __ LoadSFromOffset(mips::F2, mips::A0, -0x17FF0);
1311 __ LoadSFromOffset(mips::F2, mips::A0, -0x17FE9);
1312 __ LoadSFromOffset(mips::F2, mips::A0, +0x17FE9);
1313 __ LoadSFromOffset(mips::F2, mips::A0, +0x17FF0);
1314 __ LoadSFromOffset(mips::F2, mips::A0, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001315
1316 const char* expected =
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001317 "lwc1 $f2, -0x8000($a0)\n"
1318 "lwc1 $f2, 0($a0)\n"
1319 "lwc1 $f2, 0x7FF8($a0)\n"
1320 "lwc1 $f2, 0x7FFB($a0)\n"
1321 "lwc1 $f2, 0x7FFC($a0)\n"
1322 "lwc1 $f2, 0x7FFF($a0)\n"
1323 "addiu $at, $a0, -0x7FF8\n"
1324 "lwc1 $f2, -0x7FF8($at)\n"
1325 "addiu $at, $a0, -0x7FF8\n"
1326 "lwc1 $f2, -0x10($at)\n"
1327 "addiu $at, $a0, -0x7FF8\n"
1328 "lwc1 $f2, -9($at)\n"
1329 "addiu $at, $a0, 0x7FF8\n"
1330 "lwc1 $f2, 8($at)\n"
1331 "addiu $at, $a0, 0x7FF8\n"
1332 "lwc1 $f2, 0x7FF8($at)\n"
1333 "addiu $at, $a0, -0x7FF8\n"
1334 "addiu $at, $at, -0x7FF8\n"
1335 "lwc1 $f2, -0x7FF8($at)\n"
1336 "addiu $at, $a0, -0x7FF8\n"
1337 "addiu $at, $at, -0x7FF8\n"
1338 "lwc1 $f2, -8($at)\n"
1339 "addiu $at, $a0, -0x7FF8\n"
1340 "addiu $at, $at, -0x7FF8\n"
1341 "lwc1 $f2, -1($at)\n"
1342 "addiu $at, $a0, 0x7FF8\n"
1343 "addiu $at, $at, 0x7FF8\n"
1344 "lwc1 $f2, 1($at)\n"
1345 "addiu $at, $a0, 0x7FF8\n"
1346 "addiu $at, $at, 0x7FF8\n"
1347 "lwc1 $f2, 8($at)\n"
1348 "addiu $at, $a0, 0x7FF8\n"
1349 "addiu $at, $at, 0x7FF8\n"
1350 "lwc1 $f2, 0x7FF8($at)\n"
1351 "lui $at, 0xFFFE\n"
1352 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001353 "addu $at, $at, $a0\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001354 "lwc1 $f2, 0($at)\n"
1355 "lui $at, 0xFFFE\n"
1356 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001357 "addu $at, $at, $a0\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001358 "lwc1 $f2, 7($at)\n"
1359 "lui $at, 0x1\n"
1360 "ori $at, $at, 0x7FE8\n"
1361 "addu $at, $at, $a0\n"
1362 "lwc1 $f2, 1($at)\n"
1363 "lui $at, 0x1\n"
1364 "ori $at, $at, 0x7FF0\n"
1365 "addu $at, $at, $a0\n"
1366 "lwc1 $f2, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001367 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001368 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001369 "addu $at, $at, $a0\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001370 "lwc1 $f2, 0($at)\n";
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001371 DriverStr(expected, "LoadSFromOffset");
1372}
1373
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001374TEST_F(AssemblerMIPSTest, LoadDFromOffset) {
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001375 __ LoadDFromOffset(mips::F0, mips::A0, -0x8000);
1376 __ LoadDFromOffset(mips::F0, mips::A0, +0);
1377 __ LoadDFromOffset(mips::F0, mips::A0, +0x7FF8);
1378 __ LoadDFromOffset(mips::F0, mips::A0, +0x7FFB);
1379 __ LoadDFromOffset(mips::F0, mips::A0, +0x7FFC);
1380 __ LoadDFromOffset(mips::F0, mips::A0, +0x7FFF);
1381 __ LoadDFromOffset(mips::F0, mips::A0, -0xFFF0);
1382 __ LoadDFromOffset(mips::F0, mips::A0, -0x8008);
1383 __ LoadDFromOffset(mips::F0, mips::A0, -0x8001);
1384 __ LoadDFromOffset(mips::F0, mips::A0, +0x8000);
1385 __ LoadDFromOffset(mips::F0, mips::A0, +0xFFF0);
1386 __ LoadDFromOffset(mips::F0, mips::A0, -0x17FE8);
1387 __ LoadDFromOffset(mips::F0, mips::A0, -0x0FFF8);
1388 __ LoadDFromOffset(mips::F0, mips::A0, -0x0FFF1);
1389 __ LoadDFromOffset(mips::F0, mips::A0, +0x0FFF1);
1390 __ LoadDFromOffset(mips::F0, mips::A0, +0x0FFF8);
1391 __ LoadDFromOffset(mips::F0, mips::A0, +0x17FE8);
1392 __ LoadDFromOffset(mips::F0, mips::A0, -0x17FF0);
1393 __ LoadDFromOffset(mips::F0, mips::A0, -0x17FE9);
1394 __ LoadDFromOffset(mips::F0, mips::A0, +0x17FE9);
1395 __ LoadDFromOffset(mips::F0, mips::A0, +0x17FF0);
1396 __ LoadDFromOffset(mips::F0, mips::A0, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001397
1398 const char* expected =
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001399 "ldc1 $f0, -0x8000($a0)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001400 "ldc1 $f0, 0($a0)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001401 "ldc1 $f0, 0x7FF8($a0)\n"
1402 "lwc1 $f0, 0x7FFB($a0)\n"
1403 "lwc1 $f1, 0x7FFF($a0)\n"
1404 "addiu $at, $a0, 0x7FF8\n"
1405 "lwc1 $f0, 4($at)\n"
1406 "lwc1 $f1, 8($at)\n"
1407 "addiu $at, $a0, 0x7FF8\n"
1408 "lwc1 $f0, 7($at)\n"
1409 "lwc1 $f1, 11($at)\n"
1410 "addiu $at, $a0, -0x7FF8\n"
1411 "ldc1 $f0, -0x7FF8($at)\n"
1412 "addiu $at, $a0, -0x7FF8\n"
1413 "ldc1 $f0, -0x10($at)\n"
1414 "addiu $at, $a0, -0x7FF8\n"
1415 "lwc1 $f0, -9($at)\n"
1416 "lwc1 $f1, -5($at)\n"
1417 "addiu $at, $a0, 0x7FF8\n"
1418 "ldc1 $f0, 8($at)\n"
1419 "addiu $at, $a0, 0x7FF8\n"
1420 "ldc1 $f0, 0x7FF8($at)\n"
1421 "addiu $at, $a0, -0x7FF8\n"
1422 "addiu $at, $at, -0x7FF8\n"
1423 "ldc1 $f0, -0x7FF8($at)\n"
1424 "addiu $at, $a0, -0x7FF8\n"
1425 "addiu $at, $at, -0x7FF8\n"
1426 "ldc1 $f0, -8($at)\n"
1427 "addiu $at, $a0, -0x7FF8\n"
1428 "addiu $at, $at, -0x7FF8\n"
1429 "lwc1 $f0, -1($at)\n"
1430 "lwc1 $f1, 3($at)\n"
1431 "addiu $at, $a0, 0x7FF8\n"
1432 "addiu $at, $at, 0x7FF8\n"
1433 "lwc1 $f0, 1($at)\n"
1434 "lwc1 $f1, 5($at)\n"
1435 "addiu $at, $a0, 0x7FF8\n"
1436 "addiu $at, $at, 0x7FF8\n"
1437 "ldc1 $f0, 8($at)\n"
1438 "addiu $at, $a0, 0x7FF8\n"
1439 "addiu $at, $at, 0x7FF8\n"
1440 "ldc1 $f0, 0x7FF8($at)\n"
1441 "lui $at, 0xFFFE\n"
1442 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001443 "addu $at, $at, $a0\n"
1444 "ldc1 $f0, 0($at)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001445 "lui $at, 0xFFFE\n"
1446 "ori $at, $at, 0x8010\n"
1447 "addu $at, $at, $a0\n"
1448 "lwc1 $f0, 7($at)\n"
1449 "lwc1 $f1, 11($at)\n"
1450 "lui $at, 0x1\n"
1451 "ori $at, $at, 0x7FE8\n"
1452 "addu $at, $at, $a0\n"
1453 "lwc1 $f0, 1($at)\n"
1454 "lwc1 $f1, 5($at)\n"
1455 "lui $at, 0x1\n"
1456 "ori $at, $at, 0x7FF0\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001457 "addu $at, $at, $a0\n"
1458 "ldc1 $f0, 0($at)\n"
1459 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001460 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001461 "addu $at, $at, $a0\n"
1462 "ldc1 $f0, 0($at)\n";
1463 DriverStr(expected, "LoadDFromOffset");
1464}
1465
1466TEST_F(AssemblerMIPSTest, StoreToOffset) {
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001467 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x8000);
1468 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0);
1469 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x7FF8);
1470 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x7FFB);
1471 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x7FFC);
1472 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x7FFF);
1473 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0xFFF0);
1474 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x8008);
1475 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x8001);
1476 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x8000);
1477 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0xFFF0);
1478 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x17FE8);
1479 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x0FFF8);
1480 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x0FFF1);
1481 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x0FFF1);
1482 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x0FFF8);
1483 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x17FE8);
1484 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x17FF0);
1485 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x17FE9);
1486 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x17FE9);
1487 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x17FF0);
1488 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001489
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001490 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x8000);
1491 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0);
1492 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x7FF8);
1493 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x7FFB);
1494 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x7FFC);
1495 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x7FFF);
1496 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0xFFF0);
1497 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x8008);
1498 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x8001);
1499 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x8000);
1500 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0xFFF0);
1501 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x17FE8);
1502 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x0FFF8);
1503 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x0FFF1);
1504 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x0FFF1);
1505 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x0FFF8);
1506 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x17FE8);
1507 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x17FF0);
1508 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x17FE9);
1509 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x17FE9);
1510 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x17FF0);
1511 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001512
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001513 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x8000);
1514 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0);
1515 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x7FF8);
1516 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x7FFB);
1517 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x7FFC);
1518 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x7FFF);
1519 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0xFFF0);
1520 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x8008);
1521 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x8001);
1522 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x8000);
1523 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0xFFF0);
1524 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x17FE8);
1525 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x0FFF8);
1526 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x0FFF1);
1527 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x0FFF1);
1528 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x0FFF8);
1529 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x17FE8);
1530 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x17FF0);
1531 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x17FE9);
1532 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x17FE9);
1533 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x17FF0);
1534 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001535
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001536 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x8000);
1537 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0);
1538 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x7FF8);
1539 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x7FFB);
1540 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x7FFC);
1541 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x7FFF);
1542 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0xFFF0);
1543 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x8008);
1544 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x8001);
1545 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x8000);
1546 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0xFFF0);
1547 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x17FE8);
1548 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x0FFF8);
1549 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x0FFF1);
1550 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x0FFF1);
1551 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x0FFF8);
1552 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x17FE8);
1553 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x17FF0);
1554 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x17FE9);
1555 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x17FE9);
1556 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x17FF0);
1557 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001558
1559 const char* expected =
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001560 "sb $a3, -0x8000($a1)\n"
1561 "sb $a3, 0($a1)\n"
1562 "sb $a3, 0x7FF8($a1)\n"
1563 "sb $a3, 0x7FFB($a1)\n"
1564 "sb $a3, 0x7FFC($a1)\n"
1565 "sb $a3, 0x7FFF($a1)\n"
1566 "addiu $at, $a1, -0x7FF8\n"
1567 "sb $a3, -0x7FF8($at)\n"
1568 "addiu $at, $a1, -0x7FF8\n"
1569 "sb $a3, -0x10($at)\n"
1570 "addiu $at, $a1, -0x7FF8\n"
1571 "sb $a3, -9($at)\n"
1572 "addiu $at, $a1, 0x7FF8\n"
1573 "sb $a3, 8($at)\n"
1574 "addiu $at, $a1, 0x7FF8\n"
1575 "sb $a3, 0x7FF8($at)\n"
1576 "addiu $at, $a1, -0x7FF8\n"
1577 "addiu $at, $at, -0x7FF8\n"
1578 "sb $a3, -0x7FF8($at)\n"
1579 "addiu $at, $a1, -0x7FF8\n"
1580 "addiu $at, $at, -0x7FF8\n"
1581 "sb $a3, -8($at)\n"
1582 "addiu $at, $a1, -0x7FF8\n"
1583 "addiu $at, $at, -0x7FF8\n"
1584 "sb $a3, -1($at)\n"
1585 "addiu $at, $a1, 0x7FF8\n"
1586 "addiu $at, $at, 0x7FF8\n"
1587 "sb $a3, 1($at)\n"
1588 "addiu $at, $a1, 0x7FF8\n"
1589 "addiu $at, $at, 0x7FF8\n"
1590 "sb $a3, 8($at)\n"
1591 "addiu $at, $a1, 0x7FF8\n"
1592 "addiu $at, $at, 0x7FF8\n"
1593 "sb $a3, 0x7FF8($at)\n"
1594 "lui $at, 0xFFFE\n"
1595 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001596 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001597 "sb $a3, 0($at)\n"
1598 "lui $at, 0xFFFE\n"
1599 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001600 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001601 "sb $a3, 7($at)\n"
1602 "lui $at, 0x1\n"
1603 "ori $at, $at, 0x7FE8\n"
1604 "addu $at, $at, $a1\n"
1605 "sb $a3, 1($at)\n"
1606 "lui $at, 0x1\n"
1607 "ori $at, $at, 0x7FF0\n"
1608 "addu $at, $at, $a1\n"
1609 "sb $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001610 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001611 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001612 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001613 "sb $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001614
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001615 "sh $a3, -0x8000($a1)\n"
1616 "sh $a3, 0($a1)\n"
1617 "sh $a3, 0x7FF8($a1)\n"
1618 "sh $a3, 0x7FFB($a1)\n"
1619 "sh $a3, 0x7FFC($a1)\n"
1620 "sh $a3, 0x7FFF($a1)\n"
1621 "addiu $at, $a1, -0x7FF8\n"
1622 "sh $a3, -0x7FF8($at)\n"
1623 "addiu $at, $a1, -0x7FF8\n"
1624 "sh $a3, -0x10($at)\n"
1625 "addiu $at, $a1, -0x7FF8\n"
1626 "sh $a3, -9($at)\n"
1627 "addiu $at, $a1, 0x7FF8\n"
1628 "sh $a3, 8($at)\n"
1629 "addiu $at, $a1, 0x7FF8\n"
1630 "sh $a3, 0x7FF8($at)\n"
1631 "addiu $at, $a1, -0x7FF8\n"
1632 "addiu $at, $at, -0x7FF8\n"
1633 "sh $a3, -0x7FF8($at)\n"
1634 "addiu $at, $a1, -0x7FF8\n"
1635 "addiu $at, $at, -0x7FF8\n"
1636 "sh $a3, -8($at)\n"
1637 "addiu $at, $a1, -0x7FF8\n"
1638 "addiu $at, $at, -0x7FF8\n"
1639 "sh $a3, -1($at)\n"
1640 "addiu $at, $a1, 0x7FF8\n"
1641 "addiu $at, $at, 0x7FF8\n"
1642 "sh $a3, 1($at)\n"
1643 "addiu $at, $a1, 0x7FF8\n"
1644 "addiu $at, $at, 0x7FF8\n"
1645 "sh $a3, 8($at)\n"
1646 "addiu $at, $a1, 0x7FF8\n"
1647 "addiu $at, $at, 0x7FF8\n"
1648 "sh $a3, 0x7FF8($at)\n"
1649 "lui $at, 0xFFFE\n"
1650 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001651 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001652 "sh $a3, 0($at)\n"
1653 "lui $at, 0xFFFE\n"
1654 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001655 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001656 "sh $a3, 7($at)\n"
1657 "lui $at, 0x1\n"
1658 "ori $at, $at, 0x7FE8\n"
1659 "addu $at, $at, $a1\n"
1660 "sh $a3, 1($at)\n"
1661 "lui $at, 0x1\n"
1662 "ori $at, $at, 0x7FF0\n"
1663 "addu $at, $at, $a1\n"
1664 "sh $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001665 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001666 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001667 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001668 "sh $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001669
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001670 "sw $a3, -0x8000($a1)\n"
1671 "sw $a3, 0($a1)\n"
1672 "sw $a3, 0x7FF8($a1)\n"
1673 "sw $a3, 0x7FFB($a1)\n"
1674 "sw $a3, 0x7FFC($a1)\n"
1675 "sw $a3, 0x7FFF($a1)\n"
1676 "addiu $at, $a1, -0x7FF8\n"
1677 "sw $a3, -0x7FF8($at)\n"
1678 "addiu $at, $a1, -0x7FF8\n"
1679 "sw $a3, -0x10($at)\n"
1680 "addiu $at, $a1, -0x7FF8\n"
1681 "sw $a3, -9($at)\n"
1682 "addiu $at, $a1, 0x7FF8\n"
1683 "sw $a3, 8($at)\n"
1684 "addiu $at, $a1, 0x7FF8\n"
1685 "sw $a3, 0x7FF8($at)\n"
1686 "addiu $at, $a1, -0x7FF8\n"
1687 "addiu $at, $at, -0x7FF8\n"
1688 "sw $a3, -0x7FF8($at)\n"
1689 "addiu $at, $a1, -0x7FF8\n"
1690 "addiu $at, $at, -0x7FF8\n"
1691 "sw $a3, -8($at)\n"
1692 "addiu $at, $a1, -0x7FF8\n"
1693 "addiu $at, $at, -0x7FF8\n"
1694 "sw $a3, -1($at)\n"
1695 "addiu $at, $a1, 0x7FF8\n"
1696 "addiu $at, $at, 0x7FF8\n"
1697 "sw $a3, 1($at)\n"
1698 "addiu $at, $a1, 0x7FF8\n"
1699 "addiu $at, $at, 0x7FF8\n"
1700 "sw $a3, 8($at)\n"
1701 "addiu $at, $a1, 0x7FF8\n"
1702 "addiu $at, $at, 0x7FF8\n"
1703 "sw $a3, 0x7FF8($at)\n"
1704 "lui $at, 0xFFFE\n"
1705 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001706 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001707 "sw $a3, 0($at)\n"
1708 "lui $at, 0xFFFE\n"
1709 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001710 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001711 "sw $a3, 7($at)\n"
1712 "lui $at, 0x1\n"
1713 "ori $at, $at, 0x7FE8\n"
1714 "addu $at, $at, $a1\n"
1715 "sw $a3, 1($at)\n"
1716 "lui $at, 0x1\n"
1717 "ori $at, $at, 0x7FF0\n"
1718 "addu $at, $at, $a1\n"
1719 "sw $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001720 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001721 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001722 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001723 "sw $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001724
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001725 "sw $a0, -0x8000($a2)\n"
1726 "sw $a1, -0x7FFC($a2)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001727 "sw $a0, 0($a2)\n"
1728 "sw $a1, 4($a2)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001729 "sw $a0, 0x7FF8($a2)\n"
1730 "sw $a1, 0x7FFC($a2)\n"
1731 "sw $a0, 0x7FFB($a2)\n"
1732 "sw $a1, 0x7FFF($a2)\n"
1733 "addiu $at, $a2, 0x7FF8\n"
1734 "sw $a0, 4($at)\n"
1735 "sw $a1, 8($at)\n"
1736 "addiu $at, $a2, 0x7FF8\n"
1737 "sw $a0, 7($at)\n"
1738 "sw $a1, 11($at)\n"
1739 "addiu $at, $a2, -0x7FF8\n"
1740 "sw $a0, -0x7FF8($at)\n"
1741 "sw $a1, -0x7FF4($at)\n"
1742 "addiu $at, $a2, -0x7FF8\n"
1743 "sw $a0, -0x10($at)\n"
1744 "sw $a1, -0xC($at)\n"
1745 "addiu $at, $a2, -0x7FF8\n"
1746 "sw $a0, -9($at)\n"
1747 "sw $a1, -5($at)\n"
1748 "addiu $at, $a2, 0x7FF8\n"
1749 "sw $a0, 8($at)\n"
1750 "sw $a1, 12($at)\n"
1751 "addiu $at, $a2, 0x7FF8\n"
1752 "sw $a0, 0x7FF8($at)\n"
1753 "sw $a1, 0x7FFC($at)\n"
1754 "addiu $at, $a2, -0x7FF8\n"
1755 "addiu $at, $at, -0x7FF8\n"
1756 "sw $a0, -0x7FF8($at)\n"
1757 "sw $a1, -0x7FF4($at)\n"
1758 "addiu $at, $a2, -0x7FF8\n"
1759 "addiu $at, $at, -0x7FF8\n"
1760 "sw $a0, -8($at)\n"
1761 "sw $a1, -4($at)\n"
1762 "addiu $at, $a2, -0x7FF8\n"
1763 "addiu $at, $at, -0x7FF8\n"
1764 "sw $a0, -1($at)\n"
1765 "sw $a1, 3($at)\n"
1766 "addiu $at, $a2, 0x7FF8\n"
1767 "addiu $at, $at, 0x7FF8\n"
1768 "sw $a0, 1($at)\n"
1769 "sw $a1, 5($at)\n"
1770 "addiu $at, $a2, 0x7FF8\n"
1771 "addiu $at, $at, 0x7FF8\n"
1772 "sw $a0, 8($at)\n"
1773 "sw $a1, 12($at)\n"
1774 "addiu $at, $a2, 0x7FF8\n"
1775 "addiu $at, $at, 0x7FF8\n"
1776 "sw $a0, 0x7FF8($at)\n"
1777 "sw $a1, 0x7FFC($at)\n"
1778 "lui $at, 0xFFFE\n"
1779 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001780 "addu $at, $at, $a2\n"
1781 "sw $a0, 0($at)\n"
1782 "sw $a1, 4($at)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001783 "lui $at, 0xFFFE\n"
1784 "ori $at, $at, 0x8010\n"
1785 "addu $at, $at, $a2\n"
1786 "sw $a0, 7($at)\n"
1787 "sw $a1, 11($at)\n"
1788 "lui $at, 0x1\n"
1789 "ori $at, $at, 0x7FE8\n"
1790 "addu $at, $at, $a2\n"
1791 "sw $a0, 1($at)\n"
1792 "sw $a1, 5($at)\n"
1793 "lui $at, 0x1\n"
1794 "ori $at, $at, 0x7FF0\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001795 "addu $at, $at, $a2\n"
1796 "sw $a0, 0($at)\n"
1797 "sw $a1, 4($at)\n"
1798 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001799 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001800 "addu $at, $at, $a2\n"
1801 "sw $a0, 0($at)\n"
1802 "sw $a1, 4($at)\n";
1803 DriverStr(expected, "StoreToOffset");
1804}
1805
1806TEST_F(AssemblerMIPSTest, StoreSToOffset) {
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001807 __ StoreSToOffset(mips::F2, mips::A0, -0x8000);
1808 __ StoreSToOffset(mips::F2, mips::A0, +0);
1809 __ StoreSToOffset(mips::F2, mips::A0, +0x7FF8);
1810 __ StoreSToOffset(mips::F2, mips::A0, +0x7FFB);
1811 __ StoreSToOffset(mips::F2, mips::A0, +0x7FFC);
1812 __ StoreSToOffset(mips::F2, mips::A0, +0x7FFF);
1813 __ StoreSToOffset(mips::F2, mips::A0, -0xFFF0);
1814 __ StoreSToOffset(mips::F2, mips::A0, -0x8008);
1815 __ StoreSToOffset(mips::F2, mips::A0, -0x8001);
1816 __ StoreSToOffset(mips::F2, mips::A0, +0x8000);
1817 __ StoreSToOffset(mips::F2, mips::A0, +0xFFF0);
1818 __ StoreSToOffset(mips::F2, mips::A0, -0x17FE8);
1819 __ StoreSToOffset(mips::F2, mips::A0, -0x0FFF8);
1820 __ StoreSToOffset(mips::F2, mips::A0, -0x0FFF1);
1821 __ StoreSToOffset(mips::F2, mips::A0, +0x0FFF1);
1822 __ StoreSToOffset(mips::F2, mips::A0, +0x0FFF8);
1823 __ StoreSToOffset(mips::F2, mips::A0, +0x17FE8);
1824 __ StoreSToOffset(mips::F2, mips::A0, -0x17FF0);
1825 __ StoreSToOffset(mips::F2, mips::A0, -0x17FE9);
1826 __ StoreSToOffset(mips::F2, mips::A0, +0x17FE9);
1827 __ StoreSToOffset(mips::F2, mips::A0, +0x17FF0);
1828 __ StoreSToOffset(mips::F2, mips::A0, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001829
1830 const char* expected =
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001831 "swc1 $f2, -0x8000($a0)\n"
1832 "swc1 $f2, 0($a0)\n"
1833 "swc1 $f2, 0x7FF8($a0)\n"
1834 "swc1 $f2, 0x7FFB($a0)\n"
1835 "swc1 $f2, 0x7FFC($a0)\n"
1836 "swc1 $f2, 0x7FFF($a0)\n"
1837 "addiu $at, $a0, -0x7FF8\n"
1838 "swc1 $f2, -0x7FF8($at)\n"
1839 "addiu $at, $a0, -0x7FF8\n"
1840 "swc1 $f2, -0x10($at)\n"
1841 "addiu $at, $a0, -0x7FF8\n"
1842 "swc1 $f2, -9($at)\n"
1843 "addiu $at, $a0, 0x7FF8\n"
1844 "swc1 $f2, 8($at)\n"
1845 "addiu $at, $a0, 0x7FF8\n"
1846 "swc1 $f2, 0x7FF8($at)\n"
1847 "addiu $at, $a0, -0x7FF8\n"
1848 "addiu $at, $at, -0x7FF8\n"
1849 "swc1 $f2, -0x7FF8($at)\n"
1850 "addiu $at, $a0, -0x7FF8\n"
1851 "addiu $at, $at, -0x7FF8\n"
1852 "swc1 $f2, -8($at)\n"
1853 "addiu $at, $a0, -0x7FF8\n"
1854 "addiu $at, $at, -0x7FF8\n"
1855 "swc1 $f2, -1($at)\n"
1856 "addiu $at, $a0, 0x7FF8\n"
1857 "addiu $at, $at, 0x7FF8\n"
1858 "swc1 $f2, 1($at)\n"
1859 "addiu $at, $a0, 0x7FF8\n"
1860 "addiu $at, $at, 0x7FF8\n"
1861 "swc1 $f2, 8($at)\n"
1862 "addiu $at, $a0, 0x7FF8\n"
1863 "addiu $at, $at, 0x7FF8\n"
1864 "swc1 $f2, 0x7FF8($at)\n"
1865 "lui $at, 0xFFFE\n"
1866 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001867 "addu $at, $at, $a0\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001868 "swc1 $f2, 0($at)\n"
1869 "lui $at, 0xFFFE\n"
1870 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001871 "addu $at, $at, $a0\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001872 "swc1 $f2, 7($at)\n"
1873 "lui $at, 0x1\n"
1874 "ori $at, $at, 0x7FE8\n"
1875 "addu $at, $at, $a0\n"
1876 "swc1 $f2, 1($at)\n"
1877 "lui $at, 0x1\n"
1878 "ori $at, $at, 0x7FF0\n"
1879 "addu $at, $at, $a0\n"
1880 "swc1 $f2, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001881 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001882 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001883 "addu $at, $at, $a0\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001884 "swc1 $f2, 0($at)\n";
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001885 DriverStr(expected, "StoreSToOffset");
1886}
1887
1888TEST_F(AssemblerMIPSTest, StoreDToOffset) {
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001889 __ StoreDToOffset(mips::F0, mips::A0, -0x8000);
1890 __ StoreDToOffset(mips::F0, mips::A0, +0);
1891 __ StoreDToOffset(mips::F0, mips::A0, +0x7FF8);
1892 __ StoreDToOffset(mips::F0, mips::A0, +0x7FFB);
1893 __ StoreDToOffset(mips::F0, mips::A0, +0x7FFC);
1894 __ StoreDToOffset(mips::F0, mips::A0, +0x7FFF);
1895 __ StoreDToOffset(mips::F0, mips::A0, -0xFFF0);
1896 __ StoreDToOffset(mips::F0, mips::A0, -0x8008);
1897 __ StoreDToOffset(mips::F0, mips::A0, -0x8001);
1898 __ StoreDToOffset(mips::F0, mips::A0, +0x8000);
1899 __ StoreDToOffset(mips::F0, mips::A0, +0xFFF0);
1900 __ StoreDToOffset(mips::F0, mips::A0, -0x17FE8);
1901 __ StoreDToOffset(mips::F0, mips::A0, -0x0FFF8);
1902 __ StoreDToOffset(mips::F0, mips::A0, -0x0FFF1);
1903 __ StoreDToOffset(mips::F0, mips::A0, +0x0FFF1);
1904 __ StoreDToOffset(mips::F0, mips::A0, +0x0FFF8);
1905 __ StoreDToOffset(mips::F0, mips::A0, +0x17FE8);
1906 __ StoreDToOffset(mips::F0, mips::A0, -0x17FF0);
1907 __ StoreDToOffset(mips::F0, mips::A0, -0x17FE9);
1908 __ StoreDToOffset(mips::F0, mips::A0, +0x17FE9);
1909 __ StoreDToOffset(mips::F0, mips::A0, +0x17FF0);
1910 __ StoreDToOffset(mips::F0, mips::A0, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001911
1912 const char* expected =
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001913 "sdc1 $f0, -0x8000($a0)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001914 "sdc1 $f0, 0($a0)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001915 "sdc1 $f0, 0x7FF8($a0)\n"
1916 "swc1 $f0, 0x7FFB($a0)\n"
1917 "swc1 $f1, 0x7FFF($a0)\n"
1918 "addiu $at, $a0, 0x7FF8\n"
1919 "swc1 $f0, 4($at)\n"
1920 "swc1 $f1, 8($at)\n"
1921 "addiu $at, $a0, 0x7FF8\n"
1922 "swc1 $f0, 7($at)\n"
1923 "swc1 $f1, 11($at)\n"
1924 "addiu $at, $a0, -0x7FF8\n"
1925 "sdc1 $f0, -0x7FF8($at)\n"
1926 "addiu $at, $a0, -0x7FF8\n"
1927 "sdc1 $f0, -0x10($at)\n"
1928 "addiu $at, $a0, -0x7FF8\n"
1929 "swc1 $f0, -9($at)\n"
1930 "swc1 $f1, -5($at)\n"
1931 "addiu $at, $a0, 0x7FF8\n"
1932 "sdc1 $f0, 8($at)\n"
1933 "addiu $at, $a0, 0x7FF8\n"
1934 "sdc1 $f0, 0x7FF8($at)\n"
1935 "addiu $at, $a0, -0x7FF8\n"
1936 "addiu $at, $at, -0x7FF8\n"
1937 "sdc1 $f0, -0x7FF8($at)\n"
1938 "addiu $at, $a0, -0x7FF8\n"
1939 "addiu $at, $at, -0x7FF8\n"
1940 "sdc1 $f0, -8($at)\n"
1941 "addiu $at, $a0, -0x7FF8\n"
1942 "addiu $at, $at, -0x7FF8\n"
1943 "swc1 $f0, -1($at)\n"
1944 "swc1 $f1, 3($at)\n"
1945 "addiu $at, $a0, 0x7FF8\n"
1946 "addiu $at, $at, 0x7FF8\n"
1947 "swc1 $f0, 1($at)\n"
1948 "swc1 $f1, 5($at)\n"
1949 "addiu $at, $a0, 0x7FF8\n"
1950 "addiu $at, $at, 0x7FF8\n"
1951 "sdc1 $f0, 8($at)\n"
1952 "addiu $at, $a0, 0x7FF8\n"
1953 "addiu $at, $at, 0x7FF8\n"
1954 "sdc1 $f0, 0x7FF8($at)\n"
1955 "lui $at, 0xFFFE\n"
1956 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001957 "addu $at, $at, $a0\n"
1958 "sdc1 $f0, 0($at)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001959 "lui $at, 0xFFFE\n"
1960 "ori $at, $at, 0x8010\n"
1961 "addu $at, $at, $a0\n"
1962 "swc1 $f0, 7($at)\n"
1963 "swc1 $f1, 11($at)\n"
1964 "lui $at, 0x1\n"
1965 "ori $at, $at, 0x7FE8\n"
1966 "addu $at, $at, $a0\n"
1967 "swc1 $f0, 1($at)\n"
1968 "swc1 $f1, 5($at)\n"
1969 "lui $at, 0x1\n"
1970 "ori $at, $at, 0x7FF0\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001971 "addu $at, $at, $a0\n"
1972 "sdc1 $f0, 0($at)\n"
1973 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001974 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001975 "addu $at, $at, $a0\n"
1976 "sdc1 $f0, 0($at)\n";
1977 DriverStr(expected, "StoreDToOffset");
1978}
1979
Alexey Frunzef58b2482016-09-02 22:14:06 -07001980TEST_F(AssemblerMIPSTest, StoreConstToOffset) {
1981 __ StoreConstToOffset(mips::kStoreByte, 0xFF, mips::A1, +0, mips::T8);
1982 __ StoreConstToOffset(mips::kStoreHalfword, 0xFFFF, mips::A1, +0, mips::T8);
1983 __ StoreConstToOffset(mips::kStoreWord, 0x12345678, mips::A1, +0, mips::T8);
1984 __ StoreConstToOffset(mips::kStoreDoubleword, 0x123456789ABCDEF0, mips::A1, +0, mips::T8);
1985
1986 __ StoreConstToOffset(mips::kStoreByte, 0, mips::A1, +0, mips::T8);
1987 __ StoreConstToOffset(mips::kStoreHalfword, 0, mips::A1, +0, mips::T8);
1988 __ StoreConstToOffset(mips::kStoreWord, 0, mips::A1, +0, mips::T8);
1989 __ StoreConstToOffset(mips::kStoreDoubleword, 0, mips::A1, +0, mips::T8);
1990
1991 __ StoreConstToOffset(mips::kStoreDoubleword, 0x1234567812345678, mips::A1, +0, mips::T8);
1992 __ StoreConstToOffset(mips::kStoreDoubleword, 0x1234567800000000, mips::A1, +0, mips::T8);
1993 __ StoreConstToOffset(mips::kStoreDoubleword, 0x0000000012345678, mips::A1, +0, mips::T8);
1994
1995 __ StoreConstToOffset(mips::kStoreWord, 0, mips::T8, +0, mips::T8);
1996 __ StoreConstToOffset(mips::kStoreWord, 0x12345678, mips::T8, +0, mips::T8);
1997
1998 __ StoreConstToOffset(mips::kStoreWord, 0, mips::A1, -0xFFF0, mips::T8);
1999 __ StoreConstToOffset(mips::kStoreWord, 0x12345678, mips::A1, +0xFFF0, mips::T8);
2000
2001 __ StoreConstToOffset(mips::kStoreWord, 0, mips::T8, -0xFFF0, mips::T8);
2002 __ StoreConstToOffset(mips::kStoreWord, 0x12345678, mips::T8, +0xFFF0, mips::T8);
2003
2004 const char* expected =
2005 "ori $t8, $zero, 0xFF\n"
2006 "sb $t8, 0($a1)\n"
2007 "ori $t8, $zero, 0xFFFF\n"
2008 "sh $t8, 0($a1)\n"
2009 "lui $t8, 0x1234\n"
2010 "ori $t8, $t8, 0x5678\n"
2011 "sw $t8, 0($a1)\n"
2012 "lui $t8, 0x9ABC\n"
2013 "ori $t8, $t8, 0xDEF0\n"
2014 "sw $t8, 0($a1)\n"
2015 "lui $t8, 0x1234\n"
2016 "ori $t8, $t8, 0x5678\n"
2017 "sw $t8, 4($a1)\n"
2018
2019 "sb $zero, 0($a1)\n"
2020 "sh $zero, 0($a1)\n"
2021 "sw $zero, 0($a1)\n"
2022 "sw $zero, 0($a1)\n"
2023 "sw $zero, 4($a1)\n"
2024
2025 "lui $t8, 0x1234\n"
2026 "ori $t8, $t8, 0x5678\n"
2027 "sw $t8, 0($a1)\n"
2028 "sw $t8, 4($a1)\n"
2029 "sw $zero, 0($a1)\n"
2030 "lui $t8, 0x1234\n"
2031 "ori $t8, $t8, 0x5678\n"
2032 "sw $t8, 4($a1)\n"
2033 "lui $t8, 0x1234\n"
2034 "ori $t8, $t8, 0x5678\n"
2035 "sw $t8, 0($a1)\n"
2036 "sw $zero, 4($a1)\n"
2037
2038 "sw $zero, 0($t8)\n"
2039 "lui $at, 0x1234\n"
2040 "ori $at, $at, 0x5678\n"
2041 "sw $at, 0($t8)\n"
2042
2043 "addiu $at, $a1, -0x7FF8\n"
2044 "sw $zero, -0x7FF8($at)\n"
2045 "addiu $at, $a1, 0x7FF8\n"
2046 "lui $t8, 0x1234\n"
2047 "ori $t8, $t8, 0x5678\n"
2048 "sw $t8, 0x7FF8($at)\n"
2049
2050 "addiu $at, $t8, -0x7FF8\n"
2051 "sw $zero, -0x7FF8($at)\n"
2052 "addiu $at, $t8, 0x7FF8\n"
2053 "lui $t8, 0x1234\n"
2054 "ori $t8, $t8, 0x5678\n"
2055 "sw $t8, 0x7FF8($at)\n";
2056 DriverStr(expected, "StoreConstToOffset");
2057}
2058
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002059TEST_F(AssemblerMIPSTest, B) {
2060 mips::MipsLabel label1, label2;
2061 __ B(&label1);
2062 constexpr size_t kAdduCount1 = 63;
2063 for (size_t i = 0; i != kAdduCount1; ++i) {
2064 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2065 }
2066 __ Bind(&label1);
2067 __ B(&label2);
2068 constexpr size_t kAdduCount2 = 64;
2069 for (size_t i = 0; i != kAdduCount2; ++i) {
2070 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2071 }
2072 __ Bind(&label2);
2073 __ B(&label1);
2074
2075 std::string expected =
2076 ".set noreorder\n"
2077 "b 1f\n"
2078 "nop\n" +
2079 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
2080 "1:\n"
2081 "b 2f\n"
2082 "nop\n" +
2083 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
2084 "2:\n"
2085 "b 1b\n"
2086 "nop\n";
2087 DriverStr(expected, "B");
2088}
2089
2090TEST_F(AssemblerMIPSTest, Beq) {
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002091 __ SetReorder(false);
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002092 BranchCondTwoRegsHelper(&mips::MipsAssembler::Beq, "Beq");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002093}
2094
2095TEST_F(AssemblerMIPSTest, Bne) {
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002096 __ SetReorder(false);
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002097 BranchCondTwoRegsHelper(&mips::MipsAssembler::Bne, "Bne");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002098}
2099
2100TEST_F(AssemblerMIPSTest, Beqz) {
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002101 __ SetReorder(false);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002102 mips::MipsLabel label;
2103 __ Beqz(mips::A0, &label);
2104 constexpr size_t kAdduCount1 = 63;
2105 for (size_t i = 0; i != kAdduCount1; ++i) {
2106 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2107 }
2108 __ Bind(&label);
2109 constexpr size_t kAdduCount2 = 64;
2110 for (size_t i = 0; i != kAdduCount2; ++i) {
2111 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2112 }
2113 __ Beqz(mips::A1, &label);
2114
2115 std::string expected =
2116 ".set noreorder\n"
2117 "beq $zero, $a0, 1f\n"
2118 "nop\n" +
2119 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
2120 "1:\n" +
2121 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
2122 "beq $zero, $a1, 1b\n"
2123 "nop\n";
2124 DriverStr(expected, "Beqz");
2125}
2126
2127TEST_F(AssemblerMIPSTest, Bnez) {
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002128 __ SetReorder(false);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002129 mips::MipsLabel label;
2130 __ Bnez(mips::A0, &label);
2131 constexpr size_t kAdduCount1 = 63;
2132 for (size_t i = 0; i != kAdduCount1; ++i) {
2133 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2134 }
2135 __ Bind(&label);
2136 constexpr size_t kAdduCount2 = 64;
2137 for (size_t i = 0; i != kAdduCount2; ++i) {
2138 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2139 }
2140 __ Bnez(mips::A1, &label);
2141
2142 std::string expected =
2143 ".set noreorder\n"
2144 "bne $zero, $a0, 1f\n"
2145 "nop\n" +
2146 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
2147 "1:\n" +
2148 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
2149 "bne $zero, $a1, 1b\n"
2150 "nop\n";
2151 DriverStr(expected, "Bnez");
2152}
2153
2154TEST_F(AssemblerMIPSTest, Bltz) {
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002155 __ SetReorder(false);
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002156 BranchCondOneRegHelper(&mips::MipsAssembler::Bltz, "Bltz");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002157}
2158
2159TEST_F(AssemblerMIPSTest, Bgez) {
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002160 __ SetReorder(false);
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002161 BranchCondOneRegHelper(&mips::MipsAssembler::Bgez, "Bgez");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002162}
2163
2164TEST_F(AssemblerMIPSTest, Blez) {
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002165 __ SetReorder(false);
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002166 BranchCondOneRegHelper(&mips::MipsAssembler::Blez, "Blez");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002167}
2168
2169TEST_F(AssemblerMIPSTest, Bgtz) {
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002170 __ SetReorder(false);
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002171 BranchCondOneRegHelper(&mips::MipsAssembler::Bgtz, "Bgtz");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002172}
2173
2174TEST_F(AssemblerMIPSTest, Blt) {
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002175 __ SetReorder(false);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002176 mips::MipsLabel label;
2177 __ Blt(mips::A0, mips::A1, &label);
2178 constexpr size_t kAdduCount1 = 63;
2179 for (size_t i = 0; i != kAdduCount1; ++i) {
2180 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2181 }
2182 __ Bind(&label);
2183 constexpr size_t kAdduCount2 = 64;
2184 for (size_t i = 0; i != kAdduCount2; ++i) {
2185 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2186 }
2187 __ Blt(mips::A2, mips::A3, &label);
2188
2189 std::string expected =
2190 ".set noreorder\n"
2191 "slt $at, $a0, $a1\n"
2192 "bne $zero, $at, 1f\n"
2193 "nop\n" +
2194 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
2195 "1:\n" +
2196 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
2197 "slt $at, $a2, $a3\n"
2198 "bne $zero, $at, 1b\n"
2199 "nop\n";
2200 DriverStr(expected, "Blt");
2201}
2202
2203TEST_F(AssemblerMIPSTest, Bge) {
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002204 __ SetReorder(false);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002205 mips::MipsLabel label;
2206 __ Bge(mips::A0, mips::A1, &label);
2207 constexpr size_t kAdduCount1 = 63;
2208 for (size_t i = 0; i != kAdduCount1; ++i) {
2209 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2210 }
2211 __ Bind(&label);
2212 constexpr size_t kAdduCount2 = 64;
2213 for (size_t i = 0; i != kAdduCount2; ++i) {
2214 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2215 }
2216 __ Bge(mips::A2, mips::A3, &label);
2217
2218 std::string expected =
2219 ".set noreorder\n"
2220 "slt $at, $a0, $a1\n"
2221 "beq $zero, $at, 1f\n"
2222 "nop\n" +
2223 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
2224 "1:\n" +
2225 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
2226 "slt $at, $a2, $a3\n"
2227 "beq $zero, $at, 1b\n"
2228 "nop\n";
2229 DriverStr(expected, "Bge");
2230}
2231
2232TEST_F(AssemblerMIPSTest, Bltu) {
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002233 __ SetReorder(false);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002234 mips::MipsLabel label;
2235 __ Bltu(mips::A0, mips::A1, &label);
2236 constexpr size_t kAdduCount1 = 63;
2237 for (size_t i = 0; i != kAdduCount1; ++i) {
2238 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2239 }
2240 __ Bind(&label);
2241 constexpr size_t kAdduCount2 = 64;
2242 for (size_t i = 0; i != kAdduCount2; ++i) {
2243 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2244 }
2245 __ Bltu(mips::A2, mips::A3, &label);
2246
2247 std::string expected =
2248 ".set noreorder\n"
2249 "sltu $at, $a0, $a1\n"
2250 "bne $zero, $at, 1f\n"
2251 "nop\n" +
2252 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
2253 "1:\n" +
2254 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
2255 "sltu $at, $a2, $a3\n"
2256 "bne $zero, $at, 1b\n"
2257 "nop\n";
2258 DriverStr(expected, "Bltu");
2259}
2260
2261TEST_F(AssemblerMIPSTest, Bgeu) {
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002262 __ SetReorder(false);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002263 mips::MipsLabel label;
2264 __ Bgeu(mips::A0, mips::A1, &label);
2265 constexpr size_t kAdduCount1 = 63;
2266 for (size_t i = 0; i != kAdduCount1; ++i) {
2267 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2268 }
2269 __ Bind(&label);
2270 constexpr size_t kAdduCount2 = 64;
2271 for (size_t i = 0; i != kAdduCount2; ++i) {
2272 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2273 }
2274 __ Bgeu(mips::A2, mips::A3, &label);
2275
2276 std::string expected =
2277 ".set noreorder\n"
2278 "sltu $at, $a0, $a1\n"
2279 "beq $zero, $at, 1f\n"
2280 "nop\n" +
2281 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
2282 "1:\n" +
2283 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
2284 "sltu $at, $a2, $a3\n"
2285 "beq $zero, $at, 1b\n"
2286 "nop\n";
2287 DriverStr(expected, "Bgeu");
2288}
2289
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002290TEST_F(AssemblerMIPSTest, Bc1f) {
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002291 __ SetReorder(false);
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002292 mips::MipsLabel label;
2293 __ Bc1f(0, &label);
2294 constexpr size_t kAdduCount1 = 63;
2295 for (size_t i = 0; i != kAdduCount1; ++i) {
2296 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2297 }
2298 __ Bind(&label);
2299 constexpr size_t kAdduCount2 = 64;
2300 for (size_t i = 0; i != kAdduCount2; ++i) {
2301 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2302 }
2303 __ Bc1f(7, &label);
2304
2305 std::string expected =
2306 ".set noreorder\n"
2307 "bc1f $fcc0, 1f\n"
2308 "nop\n" +
2309 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
2310 "1:\n" +
2311 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
2312 "bc1f $fcc7, 1b\n"
2313 "nop\n";
2314 DriverStr(expected, "Bc1f");
2315}
2316
2317TEST_F(AssemblerMIPSTest, Bc1t) {
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002318 __ SetReorder(false);
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002319 mips::MipsLabel label;
2320 __ Bc1t(0, &label);
2321 constexpr size_t kAdduCount1 = 63;
2322 for (size_t i = 0; i != kAdduCount1; ++i) {
2323 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2324 }
2325 __ Bind(&label);
2326 constexpr size_t kAdduCount2 = 64;
2327 for (size_t i = 0; i != kAdduCount2; ++i) {
2328 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2329 }
2330 __ Bc1t(7, &label);
2331
2332 std::string expected =
2333 ".set noreorder\n"
2334 "bc1t $fcc0, 1f\n"
2335 "nop\n" +
2336 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
2337 "1:\n" +
2338 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
2339 "bc1t $fcc7, 1b\n"
2340 "nop\n";
2341 DriverStr(expected, "Bc1t");
2342}
2343
Chris Larsen3add9cb2016-04-14 14:01:33 -07002344///////////////////////
2345// Loading Constants //
2346///////////////////////
2347
2348TEST_F(AssemblerMIPSTest, LoadConst32) {
2349 // IsUint<16>(value)
2350 __ LoadConst32(mips::V0, 0);
2351 __ LoadConst32(mips::V0, 65535);
2352 // IsInt<16>(value)
2353 __ LoadConst32(mips::V0, -1);
2354 __ LoadConst32(mips::V0, -32768);
2355 // Everything else
2356 __ LoadConst32(mips::V0, 65536);
2357 __ LoadConst32(mips::V0, 65537);
2358 __ LoadConst32(mips::V0, 2147483647);
2359 __ LoadConst32(mips::V0, -32769);
2360 __ LoadConst32(mips::V0, -65536);
2361 __ LoadConst32(mips::V0, -65537);
2362 __ LoadConst32(mips::V0, -2147483647);
2363 __ LoadConst32(mips::V0, -2147483648);
2364
2365 const char* expected =
2366 // IsUint<16>(value)
2367 "ori $v0, $zero, 0\n" // __ LoadConst32(mips::V0, 0);
2368 "ori $v0, $zero, 65535\n" // __ LoadConst32(mips::V0, 65535);
2369 // IsInt<16>(value)
2370 "addiu $v0, $zero, -1\n" // __ LoadConst32(mips::V0, -1);
2371 "addiu $v0, $zero, -32768\n" // __ LoadConst32(mips::V0, -32768);
2372 // Everything else
2373 "lui $v0, 1\n" // __ LoadConst32(mips::V0, 65536);
2374 "lui $v0, 1\n" // __ LoadConst32(mips::V0, 65537);
2375 "ori $v0, 1\n" // "
2376 "lui $v0, 32767\n" // __ LoadConst32(mips::V0, 2147483647);
2377 "ori $v0, 65535\n" // "
2378 "lui $v0, 65535\n" // __ LoadConst32(mips::V0, -32769);
2379 "ori $v0, 32767\n" // "
2380 "lui $v0, 65535\n" // __ LoadConst32(mips::V0, -65536);
2381 "lui $v0, 65534\n" // __ LoadConst32(mips::V0, -65537);
2382 "ori $v0, 65535\n" // "
2383 "lui $v0, 32768\n" // __ LoadConst32(mips::V0, -2147483647);
2384 "ori $v0, 1\n" // "
2385 "lui $v0, 32768\n"; // __ LoadConst32(mips::V0, -2147483648);
2386 DriverStr(expected, "LoadConst32");
2387}
2388
Alexey Frunze96b66822016-09-10 02:32:44 -07002389TEST_F(AssemblerMIPSTest, LoadFarthestNearLabelAddress) {
2390 mips::MipsLabel label;
2391 __ BindPcRelBaseLabel();
2392 __ LoadLabelAddress(mips::V0, mips::V1, &label);
2393 constexpr size_t kAddiuCount = 0x1FDE;
2394 for (size_t i = 0; i != kAddiuCount; ++i) {
2395 __ Addiu(mips::A0, mips::A1, 0);
2396 }
2397 __ Bind(&label);
2398
2399 std::string expected =
2400 "1:\n"
2401 "addiu $v0, $v1, %lo(2f - 1b)\n" +
2402 RepeatInsn(kAddiuCount, "addiu $a0, $a1, %hi(2f - 1b)\n") +
2403 "2:\n";
2404 DriverStr(expected, "LoadFarthestNearLabelAddress");
2405}
2406
2407TEST_F(AssemblerMIPSTest, LoadNearestFarLabelAddress) {
2408 mips::MipsLabel label;
2409 __ BindPcRelBaseLabel();
2410 __ LoadLabelAddress(mips::V0, mips::V1, &label);
2411 constexpr size_t kAdduCount = 0x1FDF;
2412 for (size_t i = 0; i != kAdduCount; ++i) {
2413 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2414 }
2415 __ Bind(&label);
2416
2417 std::string expected =
2418 "1:\n"
2419 "lui $at, %hi(2f - 1b)\n"
2420 "ori $at, $at, %lo(2f - 1b)\n"
2421 "addu $v0, $at, $v1\n" +
2422 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2423 "2:\n";
2424 DriverStr(expected, "LoadNearestFarLabelAddress");
2425}
2426
Alexey Frunzee3fb2452016-05-10 16:08:05 -07002427TEST_F(AssemblerMIPSTest, LoadFarthestNearLiteral) {
2428 mips::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
2429 __ BindPcRelBaseLabel();
2430 __ LoadLiteral(mips::V0, mips::V1, literal);
2431 constexpr size_t kAddiuCount = 0x1FDE;
2432 for (size_t i = 0; i != kAddiuCount; ++i) {
2433 __ Addiu(mips::A0, mips::A1, 0);
2434 }
2435
2436 std::string expected =
2437 "1:\n"
2438 "lw $v0, %lo(2f - 1b)($v1)\n" +
2439 RepeatInsn(kAddiuCount, "addiu $a0, $a1, %hi(2f - 1b)\n") +
2440 "2:\n"
2441 ".word 0x12345678\n";
2442 DriverStr(expected, "LoadFarthestNearLiteral");
2443}
2444
2445TEST_F(AssemblerMIPSTest, LoadNearestFarLiteral) {
2446 mips::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
2447 __ BindPcRelBaseLabel();
2448 __ LoadLiteral(mips::V0, mips::V1, literal);
2449 constexpr size_t kAdduCount = 0x1FDF;
2450 for (size_t i = 0; i != kAdduCount; ++i) {
2451 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2452 }
2453
2454 std::string expected =
2455 "1:\n"
2456 "lui $at, %hi(2f - 1b)\n"
2457 "addu $at, $at, $v1\n"
2458 "lw $v0, %lo(2f - 1b)($at)\n" +
2459 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2460 "2:\n"
2461 ".word 0x12345678\n";
2462 DriverStr(expected, "LoadNearestFarLiteral");
2463}
2464
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002465TEST_F(AssemblerMIPSTest, ImpossibleReordering) {
2466 mips::MipsLabel label1, label2;
2467 __ SetReorder(true);
2468
2469 __ B(&label1); // No preceding or target instruction for the delay slot.
2470
2471 __ Addu(mips::T0, mips::T1, mips::T2);
2472 __ Bind(&label1);
2473 __ B(&label1); // The preceding label prevents moving Addu into the delay slot.
2474 __ B(&label1); // No preceding or target instruction for the delay slot.
2475
2476 __ Addu(mips::T0, mips::T1, mips::T2);
2477 __ Beqz(mips::T0, &label1); // T0 dependency.
2478
2479 __ Or(mips::T1, mips::T2, mips::T3);
2480 __ Bne(mips::T2, mips::T1, &label1); // T1 dependency.
2481
2482 __ And(mips::T0, mips::T1, mips::T2);
2483 __ Blt(mips::T1, mips::T0, &label1); // T0 dependency.
2484
2485 __ Xor(mips::AT, mips::T0, mips::T1);
2486 __ Bge(mips::T1, mips::T0, &label1); // AT dependency.
2487
2488 __ Subu(mips::T0, mips::T1, mips::AT);
2489 __ Bltu(mips::T1, mips::T0, &label1); // AT dependency.
2490
2491 __ ColtS(1, mips::F2, mips::F4);
2492 __ Bc1t(1, &label1); // cc1 dependency.
2493
2494 __ Move(mips::T0, mips::RA);
2495 __ Bal(&label1); // RA dependency.
2496
2497 __ Lw(mips::RA, mips::T0, 0);
2498 __ Bal(&label1); // RA dependency.
2499
2500 __ LlR2(mips::T9, mips::T0, 0);
2501 __ Jalr(mips::T9); // T9 dependency.
2502
2503 __ Sw(mips::RA, mips::T0, 0);
2504 __ Jalr(mips::T9); // RA dependency.
2505
2506 __ Lw(mips::T1, mips::T0, 0);
2507 __ Jalr(mips::T1, mips::T9); // T1 dependency.
2508
2509 __ ScR2(mips::T9, mips::T0, 0);
2510 __ Jr(mips::T9); // T9 dependency.
2511
2512 __ Bind(&label2);
2513
2514 __ Bnez(mips::T0, &label2); // No preceding instruction for the delay slot.
2515
2516 __ Bgeu(mips::T1, mips::T0, &label2); // No preceding instruction for the delay slot.
2517
2518 __ Bc1f(2, &label2); // No preceding instruction for the delay slot.
2519
2520 __ Bal(&label2); // No preceding instruction for the delay slot.
2521
2522 __ Jalr(mips::T9); // No preceding instruction for the delay slot.
2523
2524 __ Addu(mips::T0, mips::T1, mips::T2);
2525 __ CodePosition(); // Drops the delay slot candidate (the last instruction).
2526 __ Beq(mips::T1, mips::T2, &label2); // No preceding or target instruction for the delay slot.
2527
2528 std::string expected =
2529 ".set noreorder\n"
2530 "b 1f\n"
2531 "nop\n"
2532
2533 "addu $t0, $t1, $t2\n"
2534 "1:\n"
2535 "b 1b\n"
2536 "nop\n"
2537 "b 1b\n"
2538 "nop\n"
2539
2540 "addu $t0, $t1, $t2\n"
2541 "beq $zero, $t0, 1b\n"
2542 "nop\n"
2543
2544 "or $t1, $t2, $t3\n"
2545 "bne $t2, $t1, 1b\n"
2546 "nop\n"
2547
2548 "and $t0, $t1, $t2\n"
2549 "slt $at, $t1, $t0\n"
2550 "bne $zero, $at, 1b\n"
2551 "nop\n"
2552
2553 "xor $at, $t0, $t1\n"
2554 "slt $at, $t1, $t0\n"
2555 "beq $zero, $at, 1b\n"
2556 "nop\n"
2557
2558 "subu $t0, $t1, $at\n"
2559 "sltu $at, $t1, $t0\n"
2560 "bne $zero, $at, 1b\n"
2561 "nop\n"
2562
2563 "c.olt.s $fcc1, $f2, $f4\n"
2564 "bc1t $fcc1, 1b\n"
2565 "nop\n"
2566
2567 "or $t0, $ra, $zero\n"
2568 "bal 1b\n"
2569 "nop\n"
2570
2571 "lw $ra, 0($t0)\n"
2572 "bal 1b\n"
2573 "nop\n"
2574
2575 "ll $t9, 0($t0)\n"
2576 "jalr $t9\n"
2577 "nop\n"
2578
2579 "sw $ra, 0($t0)\n"
2580 "jalr $t9\n"
2581 "nop\n"
2582
2583 "lw $t1, 0($t0)\n"
2584 "jalr $t1, $t9\n"
2585 "nop\n"
2586
2587 "sc $t9, 0($t0)\n"
2588 "jalr $zero, $t9\n"
2589 "nop\n"
2590
2591 "2:\n"
2592
2593 "bne $zero, $t0, 2b\n"
2594 "nop\n"
2595
2596 "sltu $at, $t1, $t0\n"
2597 "beq $zero, $at, 2b\n"
2598 "nop\n"
2599
2600 "bc1f $fcc2, 2b\n"
2601 "nop\n"
2602
2603 "bal 2b\n"
2604 "nop\n"
2605
2606 "jalr $t9\n"
2607 "nop\n"
2608
2609 "addu $t0, $t1, $t2\n"
2610 "beq $t1, $t2, 2b\n"
2611 "nop\n";
2612 DriverStr(expected, "ImpossibleReordering");
2613}
2614
2615TEST_F(AssemblerMIPSTest, Reordering) {
2616 mips::MipsLabel label1, label2;
2617 __ SetReorder(true);
2618
2619 __ Bind(&label1);
2620 __ Bind(&label2);
2621
2622 __ Addu(mips::T0, mips::T1, mips::T2);
2623 __ Beqz(mips::T1, &label1);
2624
2625 __ Or(mips::T1, mips::T2, mips::T3);
2626 __ Bne(mips::T2, mips::T3, &label1);
2627
2628 __ And(mips::T0, mips::T1, mips::T2);
2629 __ Blt(mips::T1, mips::T2, &label1);
2630
2631 __ Xor(mips::T2, mips::T0, mips::T1);
2632 __ Bge(mips::T1, mips::T0, &label1);
2633
2634 __ Subu(mips::T2, mips::T1, mips::T0);
2635 __ Bltu(mips::T1, mips::T0, &label1);
2636
2637 __ ColtS(0, mips::F2, mips::F4);
2638 __ Bc1t(1, &label1);
2639
2640 __ Move(mips::T0, mips::T1);
2641 __ Bal(&label1);
2642
2643 __ LlR2(mips::T1, mips::T0, 0);
2644 __ Jalr(mips::T9);
2645
2646 __ ScR2(mips::T1, mips::T0, 0);
2647 __ Jr(mips::T9);
2648
2649 std::string expected =
2650 ".set noreorder\n"
2651 "1:\n"
2652
2653 "beq $zero, $t1, 1b\n"
2654 "addu $t0, $t1, $t2\n"
2655
2656 "bne $t2, $t3, 1b\n"
2657 "or $t1, $t2, $t3\n"
2658
2659 "slt $at, $t1, $t2\n"
2660 "bne $zero, $at, 1b\n"
2661 "and $t0, $t1, $t2\n"
2662
2663 "slt $at, $t1, $t0\n"
2664 "beq $zero, $at, 1b\n"
2665 "xor $t2, $t0, $t1\n"
2666
2667 "sltu $at, $t1, $t0\n"
2668 "bne $zero, $at, 1b\n"
2669 "subu $t2, $t1, $t0\n"
2670
2671 "bc1t $fcc1, 1b\n"
2672 "c.olt.s $fcc0, $f2, $f4\n"
2673
2674 "bal 1b\n"
2675 "or $t0, $t1, $zero\n"
2676
2677 "jalr $t9\n"
2678 "ll $t1, 0($t0)\n"
2679
2680 "jalr $zero, $t9\n"
2681 "sc $t1, 0($t0)\n";
2682 DriverStr(expected, "Reordering");
2683}
2684
2685TEST_F(AssemblerMIPSTest, AbsorbTargetInstruction) {
2686 mips::MipsLabel label1, label2, label3, label4, label5, label6;
2687 __ SetReorder(true);
2688
2689 __ B(&label1);
2690 __ Bind(&label1);
2691 __ Addu(mips::T0, mips::T1, mips::T2);
2692
2693 __ Bind(&label2);
2694 __ Xor(mips::T0, mips::T1, mips::T2);
2695 __ Addu(mips::T0, mips::T1, mips::T2);
2696 __ Bind(&label3); // Prevents reordering ADDU above with B below.
2697 __ B(&label2);
2698
2699 __ B(&label4);
2700 __ Bind(&label4);
2701 __ Addu(mips::T0, mips::T1, mips::T2);
2702 __ CodePosition(); // Prevents absorbing ADDU above.
2703
2704 __ B(&label5);
2705 __ Bind(&label5);
2706 __ Addu(mips::T0, mips::T1, mips::T2);
2707 __ Bind(&label6);
2708 __ CodePosition(); // Even across Bind(), CodePosition() prevents absorbing the ADDU above.
2709
2710 std::string expected =
2711 ".set noreorder\n"
2712 "b 1f\n"
2713 "addu $t0, $t1, $t2\n"
2714 "addu $t0, $t1, $t2\n"
2715 "1:\n"
2716
2717 "xor $t0, $t1, $t2\n"
2718 "2:\n"
2719 "addu $t0, $t1, $t2\n"
2720 "b 2b\n"
2721 "xor $t0, $t1, $t2\n"
2722
2723 "b 4f\n"
2724 "nop\n"
2725 "4:\n"
2726 "addu $t0, $t1, $t2\n"
2727
2728 "b 5f\n"
2729 "nop\n"
2730 "5:\n"
2731 "addu $t0, $t1, $t2\n";
2732 DriverStr(expected, "AbsorbTargetInstruction");
2733}
2734
2735TEST_F(AssemblerMIPSTest, SetReorder) {
2736 mips::MipsLabel label1, label2, label3, label4, label5, label6;
2737
2738 __ SetReorder(true);
2739 __ Bind(&label1);
2740 __ Addu(mips::T0, mips::T1, mips::T2);
2741 __ B(&label1);
2742 __ B(&label5);
2743 __ B(&label6);
2744
2745 __ SetReorder(false);
2746 __ Bind(&label2);
2747 __ Addu(mips::T0, mips::T1, mips::T2);
2748 __ B(&label2);
2749 __ B(&label5);
2750 __ B(&label6);
2751
2752 __ SetReorder(true);
2753 __ Bind(&label3);
2754 __ Addu(mips::T0, mips::T1, mips::T2);
2755 __ B(&label3);
2756 __ B(&label5);
2757 __ B(&label6);
2758
2759 __ SetReorder(false);
2760 __ Bind(&label4);
2761 __ Addu(mips::T0, mips::T1, mips::T2);
2762 __ B(&label4);
2763 __ B(&label5);
2764 __ B(&label6);
2765
2766 __ SetReorder(true);
2767 __ Bind(&label5);
2768 __ Subu(mips::T0, mips::T1, mips::T2);
2769
2770 __ SetReorder(false);
2771 __ Bind(&label6);
2772 __ Xor(mips::T0, mips::T1, mips::T2);
2773
2774 std::string expected =
2775 ".set noreorder\n"
2776 "1:\n"
2777 "b 1b\n"
2778 "addu $t0, $t1, $t2\n"
2779 "b 55f\n"
2780 "subu $t0, $t1, $t2\n"
2781 "b 6f\n"
2782 "nop\n"
2783
2784 "2:\n"
2785 "addu $t0, $t1, $t2\n"
2786 "b 2b\n"
2787 "nop\n"
2788 "b 5f\n"
2789 "nop\n"
2790 "b 6f\n"
2791 "nop\n"
2792
2793 "3:\n"
2794 "b 3b\n"
2795 "addu $t0, $t1, $t2\n"
2796 "b 55f\n"
2797 "subu $t0, $t1, $t2\n"
2798 "b 6f\n"
2799 "nop\n"
2800
2801 "4:\n"
2802 "addu $t0, $t1, $t2\n"
2803 "b 4b\n"
2804 "nop\n"
2805 "b 5f\n"
2806 "nop\n"
2807 "b 6f\n"
2808 "nop\n"
2809
2810 "5:\n"
2811 "subu $t0, $t1, $t2\n"
2812 "55:\n"
2813 "6:\n"
2814 "xor $t0, $t1, $t2\n";
2815 DriverStr(expected, "SetReorder");
2816}
2817
2818TEST_F(AssemblerMIPSTest, LongBranchReorder) {
2819 mips::MipsLabel label;
2820 __ SetReorder(true);
2821 __ Subu(mips::T0, mips::T1, mips::T2);
2822 __ B(&label);
2823 constexpr uint32_t kAdduCount1 = (1u << 15) + 1;
2824 for (size_t i = 0; i != kAdduCount1; ++i) {
2825 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2826 }
2827 __ Bind(&label);
2828 constexpr uint32_t kAdduCount2 = (1u << 15) + 1;
2829 for (size_t i = 0; i != kAdduCount2; ++i) {
2830 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2831 }
2832 __ Subu(mips::T0, mips::T1, mips::T2);
2833 __ B(&label);
2834
2835 // Account for 5 extra instructions: ori, addu, lw, jalr, addiu.
2836 uint32_t offset_forward = (kAdduCount1 + 5) * sizeof(uint32_t);
2837 // Account for 5 extra instructions: subu, addiu, sw, nal, lui.
2838 uint32_t offset_back = -(kAdduCount1 + 5) * sizeof(uint32_t);
2839
2840 std::ostringstream oss;
2841 oss <<
2842 ".set noreorder\n"
2843 "subu $t0, $t1, $t2\n"
2844 "addiu $sp, $sp, -4\n"
2845 "sw $ra, 0($sp)\n"
2846 "bltzal $zero, .+4\n"
2847 "lui $at, 0x" << std::hex << High16Bits(offset_forward) << "\n"
2848 "ori $at, $at, 0x" << std::hex << Low16Bits(offset_forward) << "\n"
2849 "addu $at, $at, $ra\n"
2850 "lw $ra, 0($sp)\n"
2851 "jalr $zero, $at\n"
2852 "addiu $sp, $sp, 4\n" <<
2853 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") <<
2854 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") <<
2855 "subu $t0, $t1, $t2\n"
2856 "addiu $sp, $sp, -4\n"
2857 "sw $ra, 0($sp)\n"
2858 "bltzal $zero, .+4\n"
2859 "lui $at, 0x" << std::hex << High16Bits(offset_back) << "\n"
2860 "ori $at, $at, 0x" << std::hex << Low16Bits(offset_back) << "\n"
2861 "addu $at, $at, $ra\n"
2862 "lw $ra, 0($sp)\n"
2863 "jalr $zero, $at\n"
2864 "addiu $sp, $sp, 4\n";
2865 std::string expected = oss.str();
2866 DriverStr(expected, "LongBranchReorder");
2867}
2868
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002869#undef __
2870
2871} // namespace art