blob: 2f7778c0d5d6eaabb5f841366de1465c78044b94 [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
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -0800564TEST_F(AssemblerMIPSTest, CunS) {
565 DriverStr(RepeatIbFF(&mips::MipsAssembler::CunS, 3, "c.un.s $fcc{imm}, ${reg1}, ${reg2}"),
566 "CunS");
567}
568
569TEST_F(AssemblerMIPSTest, CeqS) {
570 DriverStr(RepeatIbFF(&mips::MipsAssembler::CeqS, 3, "c.eq.s $fcc{imm}, ${reg1}, ${reg2}"),
571 "CeqS");
572}
573
574TEST_F(AssemblerMIPSTest, CueqS) {
575 DriverStr(RepeatIbFF(&mips::MipsAssembler::CueqS, 3, "c.ueq.s $fcc{imm}, ${reg1}, ${reg2}"),
576 "CueqS");
577}
578
579TEST_F(AssemblerMIPSTest, ColtS) {
580 DriverStr(RepeatIbFF(&mips::MipsAssembler::ColtS, 3, "c.olt.s $fcc{imm}, ${reg1}, ${reg2}"),
581 "ColtS");
582}
583
584TEST_F(AssemblerMIPSTest, CultS) {
585 DriverStr(RepeatIbFF(&mips::MipsAssembler::CultS, 3, "c.ult.s $fcc{imm}, ${reg1}, ${reg2}"),
586 "CultS");
587}
588
589TEST_F(AssemblerMIPSTest, ColeS) {
590 DriverStr(RepeatIbFF(&mips::MipsAssembler::ColeS, 3, "c.ole.s $fcc{imm}, ${reg1}, ${reg2}"),
591 "ColeS");
592}
593
594TEST_F(AssemblerMIPSTest, CuleS) {
595 DriverStr(RepeatIbFF(&mips::MipsAssembler::CuleS, 3, "c.ule.s $fcc{imm}, ${reg1}, ${reg2}"),
596 "CuleS");
597}
598
599TEST_F(AssemblerMIPSTest, CunD) {
600 DriverStr(RepeatIbFF(&mips::MipsAssembler::CunD, 3, "c.un.d $fcc{imm}, ${reg1}, ${reg2}"),
601 "CunD");
602}
603
604TEST_F(AssemblerMIPSTest, CeqD) {
605 DriverStr(RepeatIbFF(&mips::MipsAssembler::CeqD, 3, "c.eq.d $fcc{imm}, ${reg1}, ${reg2}"),
606 "CeqD");
607}
608
609TEST_F(AssemblerMIPSTest, CueqD) {
610 DriverStr(RepeatIbFF(&mips::MipsAssembler::CueqD, 3, "c.ueq.d $fcc{imm}, ${reg1}, ${reg2}"),
611 "CueqD");
612}
613
614TEST_F(AssemblerMIPSTest, ColtD) {
615 DriverStr(RepeatIbFF(&mips::MipsAssembler::ColtD, 3, "c.olt.d $fcc{imm}, ${reg1}, ${reg2}"),
616 "ColtD");
617}
618
619TEST_F(AssemblerMIPSTest, CultD) {
620 DriverStr(RepeatIbFF(&mips::MipsAssembler::CultD, 3, "c.ult.d $fcc{imm}, ${reg1}, ${reg2}"),
621 "CultD");
622}
623
624TEST_F(AssemblerMIPSTest, ColeD) {
625 DriverStr(RepeatIbFF(&mips::MipsAssembler::ColeD, 3, "c.ole.d $fcc{imm}, ${reg1}, ${reg2}"),
626 "ColeD");
627}
628
629TEST_F(AssemblerMIPSTest, CuleD) {
630 DriverStr(RepeatIbFF(&mips::MipsAssembler::CuleD, 3, "c.ule.d $fcc{imm}, ${reg1}, ${reg2}"),
631 "CuleD");
632}
633
634TEST_F(AssemblerMIPSTest, Movf) {
635 DriverStr(RepeatRRIb(&mips::MipsAssembler::Movf, 3, "movf ${reg1}, ${reg2}, $fcc{imm}"), "Movf");
636}
637
638TEST_F(AssemblerMIPSTest, Movt) {
639 DriverStr(RepeatRRIb(&mips::MipsAssembler::Movt, 3, "movt ${reg1}, ${reg2}, $fcc{imm}"), "Movt");
640}
641
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200642TEST_F(AssemblerMIPSTest, CvtSW) {
643 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtsw, "cvt.s.w ${reg1}, ${reg2}"), "CvtSW");
644}
645
646TEST_F(AssemblerMIPSTest, CvtDW) {
647 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtdw, "cvt.d.w ${reg1}, ${reg2}"), "CvtDW");
648}
649
Alexey Frunzebaf60b72015-12-22 15:15:03 -0800650TEST_F(AssemblerMIPSTest, CvtSL) {
651 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtsl, "cvt.s.l ${reg1}, ${reg2}"), "CvtSL");
652}
653
654TEST_F(AssemblerMIPSTest, CvtDL) {
655 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtdl, "cvt.d.l ${reg1}, ${reg2}"), "CvtDL");
656}
657
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200658TEST_F(AssemblerMIPSTest, CvtSD) {
659 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtsd, "cvt.s.d ${reg1}, ${reg2}"), "CvtSD");
660}
661
662TEST_F(AssemblerMIPSTest, CvtDS) {
663 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtds, "cvt.d.s ${reg1}, ${reg2}"), "CvtDS");
664}
665
Alexey Frunzebaf60b72015-12-22 15:15:03 -0800666TEST_F(AssemblerMIPSTest, TruncWS) {
667 DriverStr(RepeatFF(&mips::MipsAssembler::TruncWS, "trunc.w.s ${reg1}, ${reg2}"), "TruncWS");
668}
669
670TEST_F(AssemblerMIPSTest, TruncWD) {
671 DriverStr(RepeatFF(&mips::MipsAssembler::TruncWD, "trunc.w.d ${reg1}, ${reg2}"), "TruncWD");
672}
673
674TEST_F(AssemblerMIPSTest, TruncLS) {
675 DriverStr(RepeatFF(&mips::MipsAssembler::TruncLS, "trunc.l.s ${reg1}, ${reg2}"), "TruncLS");
676}
677
678TEST_F(AssemblerMIPSTest, TruncLD) {
679 DriverStr(RepeatFF(&mips::MipsAssembler::TruncLD, "trunc.l.d ${reg1}, ${reg2}"), "TruncLD");
680}
681
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200682TEST_F(AssemblerMIPSTest, Mfc1) {
683 DriverStr(RepeatRF(&mips::MipsAssembler::Mfc1, "mfc1 ${reg1}, ${reg2}"), "Mfc1");
684}
685
686TEST_F(AssemblerMIPSTest, Mtc1) {
687 DriverStr(RepeatRF(&mips::MipsAssembler::Mtc1, "mtc1 ${reg1}, ${reg2}"), "Mtc1");
688}
689
690TEST_F(AssemblerMIPSTest, Mfhc1) {
691 DriverStr(RepeatRF(&mips::MipsAssembler::Mfhc1, "mfhc1 ${reg1}, ${reg2}"), "Mfhc1");
692}
693
694TEST_F(AssemblerMIPSTest, Mthc1) {
695 DriverStr(RepeatRF(&mips::MipsAssembler::Mthc1, "mthc1 ${reg1}, ${reg2}"), "Mthc1");
696}
697
698TEST_F(AssemblerMIPSTest, Lwc1) {
699 DriverStr(RepeatFRIb(&mips::MipsAssembler::Lwc1, -16, "lwc1 ${reg1}, {imm}(${reg2})"), "Lwc1");
700}
701
702TEST_F(AssemblerMIPSTest, Ldc1) {
703 DriverStr(RepeatFRIb(&mips::MipsAssembler::Ldc1, -16, "ldc1 ${reg1}, {imm}(${reg2})"), "Ldc1");
704}
705
706TEST_F(AssemblerMIPSTest, Swc1) {
707 DriverStr(RepeatFRIb(&mips::MipsAssembler::Swc1, -16, "swc1 ${reg1}, {imm}(${reg2})"), "Swc1");
708}
709
710TEST_F(AssemblerMIPSTest, Sdc1) {
711 DriverStr(RepeatFRIb(&mips::MipsAssembler::Sdc1, -16, "sdc1 ${reg1}, {imm}(${reg2})"), "Sdc1");
712}
713
714TEST_F(AssemblerMIPSTest, Move) {
715 DriverStr(RepeatRR(&mips::MipsAssembler::Move, "or ${reg1}, ${reg2}, $zero"), "Move");
716}
717
718TEST_F(AssemblerMIPSTest, Clear) {
719 DriverStr(RepeatR(&mips::MipsAssembler::Clear, "or ${reg}, $zero, $zero"), "Clear");
720}
721
722TEST_F(AssemblerMIPSTest, Not) {
723 DriverStr(RepeatRR(&mips::MipsAssembler::Not, "nor ${reg1}, ${reg2}, $zero"), "Not");
724}
725
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700726TEST_F(AssemblerMIPSTest, Addiu32) {
727 __ Addiu32(mips::A1, mips::A2, -0x8000);
728 __ Addiu32(mips::A1, mips::A2, +0);
729 __ Addiu32(mips::A1, mips::A2, +0x7FFF);
730 __ Addiu32(mips::A1, mips::A2, -0x10000);
731 __ Addiu32(mips::A1, mips::A2, -0x8001);
732 __ Addiu32(mips::A1, mips::A2, +0x8000);
733 __ Addiu32(mips::A1, mips::A2, +0xFFFE);
734 __ Addiu32(mips::A1, mips::A2, -0x10001);
735 __ Addiu32(mips::A1, mips::A2, +0xFFFF);
736 __ Addiu32(mips::A1, mips::A2, +0x10000);
737 __ Addiu32(mips::A1, mips::A2, +0x10001);
738 __ Addiu32(mips::A1, mips::A2, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200739
740 const char* expected =
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700741 "addiu $a1, $a2, -0x8000\n"
742 "addiu $a1, $a2, 0\n"
743 "addiu $a1, $a2, 0x7FFF\n"
744 "addiu $at, $a2, -0x8000\n"
745 "addiu $a1, $at, -0x8000\n"
746 "addiu $at, $a2, -0x8000\n"
747 "addiu $a1, $at, -1\n"
748 "addiu $at, $a2, 0x7FFF\n"
749 "addiu $a1, $at, 1\n"
750 "addiu $at, $a2, 0x7FFF\n"
751 "addiu $a1, $at, 0x7FFF\n"
752 "lui $at, 0xFFFE\n"
753 "ori $at, $at, 0xFFFF\n"
754 "addu $a1, $a2, $at\n"
755 "ori $at, $zero, 0xFFFF\n"
756 "addu $a1, $a2, $at\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200757 "lui $at, 1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700758 "addu $a1, $a2, $at\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200759 "lui $at, 1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700760 "ori $at, $at, 1\n"
761 "addu $a1, $a2, $at\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200762 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700763 "ori $at, $at, 0x5678\n"
764 "addu $a1, $a2, $at\n";
765 DriverStr(expected, "Addiu32");
766}
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200767
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700768TEST_F(AssemblerMIPSTest, LoadFromOffset) {
769 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x8000);
770 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0);
771 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x7FF8);
772 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x7FFB);
773 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x7FFC);
774 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x7FFF);
775 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0xFFF0);
776 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x8008);
777 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x8001);
778 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x8000);
779 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0xFFF0);
780 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x17FE8);
781 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x0FFF8);
782 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x0FFF1);
783 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x0FFF1);
784 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x0FFF8);
785 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x17FE8);
786 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x17FF0);
787 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x17FE9);
788 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x17FE9);
789 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x17FF0);
790 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x12345678);
791
792 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x8000);
793 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0);
794 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x7FF8);
795 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x7FFB);
796 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x7FFC);
797 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x7FFF);
798 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0xFFF0);
799 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x8008);
800 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x8001);
801 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x8000);
802 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0xFFF0);
803 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x17FE8);
804 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x0FFF8);
805 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x0FFF1);
806 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x0FFF1);
807 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x0FFF8);
808 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x17FE8);
809 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x17FF0);
810 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x17FE9);
811 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x17FE9);
812 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x17FF0);
813 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x12345678);
814
815 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x8000);
816 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0);
817 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x7FF8);
818 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x7FFB);
819 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x7FFC);
820 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x7FFF);
821 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0xFFF0);
822 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x8008);
823 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x8001);
824 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x8000);
825 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0xFFF0);
826 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x17FE8);
827 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x0FFF8);
828 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x0FFF1);
829 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x0FFF1);
830 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x0FFF8);
831 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x17FE8);
832 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x17FF0);
833 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x17FE9);
834 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x17FE9);
835 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x17FF0);
836 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x12345678);
837
838 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x8000);
839 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0);
840 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x7FF8);
841 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x7FFB);
842 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x7FFC);
843 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x7FFF);
844 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0xFFF0);
845 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x8008);
846 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x8001);
847 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x8000);
848 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0xFFF0);
849 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x17FE8);
850 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x0FFF8);
851 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x0FFF1);
852 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x0FFF1);
853 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x0FFF8);
854 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x17FE8);
855 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x17FF0);
856 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x17FE9);
857 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x17FE9);
858 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x17FF0);
859 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x12345678);
860
861 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x8000);
862 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0);
863 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x7FF8);
864 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x7FFB);
865 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x7FFC);
866 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x7FFF);
867 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0xFFF0);
868 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x8008);
869 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x8001);
870 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x8000);
871 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0xFFF0);
872 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x17FE8);
873 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x0FFF8);
874 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x0FFF1);
875 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x0FFF1);
876 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x0FFF8);
877 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x17FE8);
878 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x17FF0);
879 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x17FE9);
880 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x17FE9);
881 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x17FF0);
882 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x12345678);
883
884 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x8000);
885 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0);
886 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x7FF8);
887 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x7FFB);
888 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x7FFC);
889 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x7FFF);
890 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0xFFF0);
891 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x8008);
892 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x8001);
893 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x8000);
894 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0xFFF0);
895 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x17FE8);
896 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x0FFF8);
897 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x0FFF1);
898 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x0FFF1);
899 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x0FFF8);
900 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x17FE8);
901 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x17FF0);
902 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x17FE9);
903 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x17FE9);
904 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x17FF0);
905 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x12345678);
906
907 const char* expected =
908 "lb $a3, -0x8000($a1)\n"
909 "lb $a3, 0($a1)\n"
910 "lb $a3, 0x7FF8($a1)\n"
911 "lb $a3, 0x7FFB($a1)\n"
912 "lb $a3, 0x7FFC($a1)\n"
913 "lb $a3, 0x7FFF($a1)\n"
914 "addiu $at, $a1, -0x7FF8\n"
915 "lb $a3, -0x7FF8($at)\n"
916 "addiu $at, $a1, -0x7FF8\n"
917 "lb $a3, -0x10($at)\n"
918 "addiu $at, $a1, -0x7FF8\n"
919 "lb $a3, -9($at)\n"
920 "addiu $at, $a1, 0x7FF8\n"
921 "lb $a3, 8($at)\n"
922 "addiu $at, $a1, 0x7FF8\n"
923 "lb $a3, 0x7FF8($at)\n"
924 "addiu $at, $a1, -0x7FF8\n"
925 "addiu $at, $at, -0x7FF8\n"
926 "lb $a3, -0x7FF8($at)\n"
927 "addiu $at, $a1, -0x7FF8\n"
928 "addiu $at, $at, -0x7FF8\n"
929 "lb $a3, -8($at)\n"
930 "addiu $at, $a1, -0x7FF8\n"
931 "addiu $at, $at, -0x7FF8\n"
932 "lb $a3, -1($at)\n"
933 "addiu $at, $a1, 0x7FF8\n"
934 "addiu $at, $at, 0x7FF8\n"
935 "lb $a3, 1($at)\n"
936 "addiu $at, $a1, 0x7FF8\n"
937 "addiu $at, $at, 0x7FF8\n"
938 "lb $a3, 8($at)\n"
939 "addiu $at, $a1, 0x7FF8\n"
940 "addiu $at, $at, 0x7FF8\n"
941 "lb $a3, 0x7FF8($at)\n"
942 "lui $at, 0xFFFE\n"
943 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200944 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700945 "lb $a3, 0($at)\n"
946 "lui $at, 0xFFFE\n"
947 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200948 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700949 "lb $a3, 7($at)\n"
950 "lui $at, 0x1\n"
951 "ori $at, $at, 0x7FE8\n"
952 "addu $at, $at, $a1\n"
953 "lb $a3, 1($at)\n"
954 "lui $at, 0x1\n"
955 "ori $at, $at, 0x7FF0\n"
956 "addu $at, $at, $a1\n"
957 "lb $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200958 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700959 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200960 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700961 "lb $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200962
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700963 "lbu $a3, -0x8000($a1)\n"
964 "lbu $a3, 0($a1)\n"
965 "lbu $a3, 0x7FF8($a1)\n"
966 "lbu $a3, 0x7FFB($a1)\n"
967 "lbu $a3, 0x7FFC($a1)\n"
968 "lbu $a3, 0x7FFF($a1)\n"
969 "addiu $at, $a1, -0x7FF8\n"
970 "lbu $a3, -0x7FF8($at)\n"
971 "addiu $at, $a1, -0x7FF8\n"
972 "lbu $a3, -0x10($at)\n"
973 "addiu $at, $a1, -0x7FF8\n"
974 "lbu $a3, -9($at)\n"
975 "addiu $at, $a1, 0x7FF8\n"
976 "lbu $a3, 8($at)\n"
977 "addiu $at, $a1, 0x7FF8\n"
978 "lbu $a3, 0x7FF8($at)\n"
979 "addiu $at, $a1, -0x7FF8\n"
980 "addiu $at, $at, -0x7FF8\n"
981 "lbu $a3, -0x7FF8($at)\n"
982 "addiu $at, $a1, -0x7FF8\n"
983 "addiu $at, $at, -0x7FF8\n"
984 "lbu $a3, -8($at)\n"
985 "addiu $at, $a1, -0x7FF8\n"
986 "addiu $at, $at, -0x7FF8\n"
987 "lbu $a3, -1($at)\n"
988 "addiu $at, $a1, 0x7FF8\n"
989 "addiu $at, $at, 0x7FF8\n"
990 "lbu $a3, 1($at)\n"
991 "addiu $at, $a1, 0x7FF8\n"
992 "addiu $at, $at, 0x7FF8\n"
993 "lbu $a3, 8($at)\n"
994 "addiu $at, $a1, 0x7FF8\n"
995 "addiu $at, $at, 0x7FF8\n"
996 "lbu $a3, 0x7FF8($at)\n"
997 "lui $at, 0xFFFE\n"
998 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200999 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001000 "lbu $a3, 0($at)\n"
1001 "lui $at, 0xFFFE\n"
1002 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001003 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001004 "lbu $a3, 7($at)\n"
1005 "lui $at, 0x1\n"
1006 "ori $at, $at, 0x7FE8\n"
1007 "addu $at, $at, $a1\n"
1008 "lbu $a3, 1($at)\n"
1009 "lui $at, 0x1\n"
1010 "ori $at, $at, 0x7FF0\n"
1011 "addu $at, $at, $a1\n"
1012 "lbu $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001013 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001014 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001015 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001016 "lbu $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001017
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001018 "lh $a3, -0x8000($a1)\n"
1019 "lh $a3, 0($a1)\n"
1020 "lh $a3, 0x7FF8($a1)\n"
1021 "lh $a3, 0x7FFB($a1)\n"
1022 "lh $a3, 0x7FFC($a1)\n"
1023 "lh $a3, 0x7FFF($a1)\n"
1024 "addiu $at, $a1, -0x7FF8\n"
1025 "lh $a3, -0x7FF8($at)\n"
1026 "addiu $at, $a1, -0x7FF8\n"
1027 "lh $a3, -0x10($at)\n"
1028 "addiu $at, $a1, -0x7FF8\n"
1029 "lh $a3, -9($at)\n"
1030 "addiu $at, $a1, 0x7FF8\n"
1031 "lh $a3, 8($at)\n"
1032 "addiu $at, $a1, 0x7FF8\n"
1033 "lh $a3, 0x7FF8($at)\n"
1034 "addiu $at, $a1, -0x7FF8\n"
1035 "addiu $at, $at, -0x7FF8\n"
1036 "lh $a3, -0x7FF8($at)\n"
1037 "addiu $at, $a1, -0x7FF8\n"
1038 "addiu $at, $at, -0x7FF8\n"
1039 "lh $a3, -8($at)\n"
1040 "addiu $at, $a1, -0x7FF8\n"
1041 "addiu $at, $at, -0x7FF8\n"
1042 "lh $a3, -1($at)\n"
1043 "addiu $at, $a1, 0x7FF8\n"
1044 "addiu $at, $at, 0x7FF8\n"
1045 "lh $a3, 1($at)\n"
1046 "addiu $at, $a1, 0x7FF8\n"
1047 "addiu $at, $at, 0x7FF8\n"
1048 "lh $a3, 8($at)\n"
1049 "addiu $at, $a1, 0x7FF8\n"
1050 "addiu $at, $at, 0x7FF8\n"
1051 "lh $a3, 0x7FF8($at)\n"
1052 "lui $at, 0xFFFE\n"
1053 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001054 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001055 "lh $a3, 0($at)\n"
1056 "lui $at, 0xFFFE\n"
1057 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001058 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001059 "lh $a3, 7($at)\n"
1060 "lui $at, 0x1\n"
1061 "ori $at, $at, 0x7FE8\n"
1062 "addu $at, $at, $a1\n"
1063 "lh $a3, 1($at)\n"
1064 "lui $at, 0x1\n"
1065 "ori $at, $at, 0x7FF0\n"
1066 "addu $at, $at, $a1\n"
1067 "lh $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001068 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001069 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001070 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001071 "lh $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001072
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001073 "lhu $a3, -0x8000($a1)\n"
1074 "lhu $a3, 0($a1)\n"
1075 "lhu $a3, 0x7FF8($a1)\n"
1076 "lhu $a3, 0x7FFB($a1)\n"
1077 "lhu $a3, 0x7FFC($a1)\n"
1078 "lhu $a3, 0x7FFF($a1)\n"
1079 "addiu $at, $a1, -0x7FF8\n"
1080 "lhu $a3, -0x7FF8($at)\n"
1081 "addiu $at, $a1, -0x7FF8\n"
1082 "lhu $a3, -0x10($at)\n"
1083 "addiu $at, $a1, -0x7FF8\n"
1084 "lhu $a3, -9($at)\n"
1085 "addiu $at, $a1, 0x7FF8\n"
1086 "lhu $a3, 8($at)\n"
1087 "addiu $at, $a1, 0x7FF8\n"
1088 "lhu $a3, 0x7FF8($at)\n"
1089 "addiu $at, $a1, -0x7FF8\n"
1090 "addiu $at, $at, -0x7FF8\n"
1091 "lhu $a3, -0x7FF8($at)\n"
1092 "addiu $at, $a1, -0x7FF8\n"
1093 "addiu $at, $at, -0x7FF8\n"
1094 "lhu $a3, -8($at)\n"
1095 "addiu $at, $a1, -0x7FF8\n"
1096 "addiu $at, $at, -0x7FF8\n"
1097 "lhu $a3, -1($at)\n"
1098 "addiu $at, $a1, 0x7FF8\n"
1099 "addiu $at, $at, 0x7FF8\n"
1100 "lhu $a3, 1($at)\n"
1101 "addiu $at, $a1, 0x7FF8\n"
1102 "addiu $at, $at, 0x7FF8\n"
1103 "lhu $a3, 8($at)\n"
1104 "addiu $at, $a1, 0x7FF8\n"
1105 "addiu $at, $at, 0x7FF8\n"
1106 "lhu $a3, 0x7FF8($at)\n"
1107 "lui $at, 0xFFFE\n"
1108 "ori $at, $at, 0x8010\n"
1109 "addu $at, $at, $a1\n"
1110 "lhu $a3, 0($at)\n"
1111 "lui $at, 0xFFFE\n"
1112 "ori $at, $at, 0x8010\n"
1113 "addu $at, $at, $a1\n"
1114 "lhu $a3, 7($at)\n"
1115 "lui $at, 0x1\n"
1116 "ori $at, $at, 0x7FE8\n"
1117 "addu $at, $at, $a1\n"
1118 "lhu $a3, 1($at)\n"
1119 "lui $at, 0x1\n"
1120 "ori $at, $at, 0x7FF0\n"
1121 "addu $at, $at, $a1\n"
1122 "lhu $a3, 0($at)\n"
1123 "lui $at, 0x1234\n"
1124 "ori $at, $at, 0x5678\n"
1125 "addu $at, $at, $a1\n"
1126 "lhu $a3, 0($at)\n"
1127
1128 "lw $a3, -0x8000($a1)\n"
1129 "lw $a3, 0($a1)\n"
1130 "lw $a3, 0x7FF8($a1)\n"
1131 "lw $a3, 0x7FFB($a1)\n"
1132 "lw $a3, 0x7FFC($a1)\n"
1133 "lw $a3, 0x7FFF($a1)\n"
1134 "addiu $at, $a1, -0x7FF8\n"
1135 "lw $a3, -0x7FF8($at)\n"
1136 "addiu $at, $a1, -0x7FF8\n"
1137 "lw $a3, -0x10($at)\n"
1138 "addiu $at, $a1, -0x7FF8\n"
1139 "lw $a3, -9($at)\n"
1140 "addiu $at, $a1, 0x7FF8\n"
1141 "lw $a3, 8($at)\n"
1142 "addiu $at, $a1, 0x7FF8\n"
1143 "lw $a3, 0x7FF8($at)\n"
1144 "addiu $at, $a1, -0x7FF8\n"
1145 "addiu $at, $at, -0x7FF8\n"
1146 "lw $a3, -0x7FF8($at)\n"
1147 "addiu $at, $a1, -0x7FF8\n"
1148 "addiu $at, $at, -0x7FF8\n"
1149 "lw $a3, -8($at)\n"
1150 "addiu $at, $a1, -0x7FF8\n"
1151 "addiu $at, $at, -0x7FF8\n"
1152 "lw $a3, -1($at)\n"
1153 "addiu $at, $a1, 0x7FF8\n"
1154 "addiu $at, $at, 0x7FF8\n"
1155 "lw $a3, 1($at)\n"
1156 "addiu $at, $a1, 0x7FF8\n"
1157 "addiu $at, $at, 0x7FF8\n"
1158 "lw $a3, 8($at)\n"
1159 "addiu $at, $a1, 0x7FF8\n"
1160 "addiu $at, $at, 0x7FF8\n"
1161 "lw $a3, 0x7FF8($at)\n"
1162 "lui $at, 0xFFFE\n"
1163 "ori $at, $at, 0x8010\n"
1164 "addu $at, $at, $a1\n"
1165 "lw $a3, 0($at)\n"
1166 "lui $at, 0xFFFE\n"
1167 "ori $at, $at, 0x8010\n"
1168 "addu $at, $at, $a1\n"
1169 "lw $a3, 7($at)\n"
1170 "lui $at, 0x1\n"
1171 "ori $at, $at, 0x7FE8\n"
1172 "addu $at, $at, $a1\n"
1173 "lw $a3, 1($at)\n"
1174 "lui $at, 0x1\n"
1175 "ori $at, $at, 0x7FF0\n"
1176 "addu $at, $at, $a1\n"
1177 "lw $a3, 0($at)\n"
1178 "lui $at, 0x1234\n"
1179 "ori $at, $at, 0x5678\n"
1180 "addu $at, $at, $a1\n"
1181 "lw $a3, 0($at)\n"
1182
1183 "lw $a0, -0x8000($a2)\n"
1184 "lw $a1, -0x7FFC($a2)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001185 "lw $a0, 0($a2)\n"
1186 "lw $a1, 4($a2)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001187 "lw $a0, 0x7FF8($a2)\n"
1188 "lw $a1, 0x7FFC($a2)\n"
1189 "lw $a0, 0x7FFB($a2)\n"
1190 "lw $a1, 0x7FFF($a2)\n"
1191 "addiu $at, $a2, 0x7FF8\n"
1192 "lw $a0, 4($at)\n"
1193 "lw $a1, 8($at)\n"
1194 "addiu $at, $a2, 0x7FF8\n"
1195 "lw $a0, 7($at)\n"
1196 "lw $a1, 11($at)\n"
1197 "addiu $at, $a2, -0x7FF8\n"
1198 "lw $a0, -0x7FF8($at)\n"
1199 "lw $a1, -0x7FF4($at)\n"
1200 "addiu $at, $a2, -0x7FF8\n"
1201 "lw $a0, -0x10($at)\n"
1202 "lw $a1, -0xC($at)\n"
1203 "addiu $at, $a2, -0x7FF8\n"
1204 "lw $a0, -9($at)\n"
1205 "lw $a1, -5($at)\n"
1206 "addiu $at, $a2, 0x7FF8\n"
1207 "lw $a0, 8($at)\n"
1208 "lw $a1, 12($at)\n"
1209 "addiu $at, $a2, 0x7FF8\n"
1210 "lw $a0, 0x7FF8($at)\n"
1211 "lw $a1, 0x7FFC($at)\n"
1212 "addiu $at, $a2, -0x7FF8\n"
1213 "addiu $at, $at, -0x7FF8\n"
1214 "lw $a0, -0x7FF8($at)\n"
1215 "lw $a1, -0x7FF4($at)\n"
1216 "addiu $at, $a2, -0x7FF8\n"
1217 "addiu $at, $at, -0x7FF8\n"
1218 "lw $a0, -8($at)\n"
1219 "lw $a1, -4($at)\n"
1220 "addiu $at, $a2, -0x7FF8\n"
1221 "addiu $at, $at, -0x7FF8\n"
1222 "lw $a0, -1($at)\n"
1223 "lw $a1, 3($at)\n"
1224 "addiu $at, $a2, 0x7FF8\n"
1225 "addiu $at, $at, 0x7FF8\n"
1226 "lw $a0, 1($at)\n"
1227 "lw $a1, 5($at)\n"
1228 "addiu $at, $a2, 0x7FF8\n"
1229 "addiu $at, $at, 0x7FF8\n"
1230 "lw $a0, 8($at)\n"
1231 "lw $a1, 12($at)\n"
1232 "addiu $at, $a2, 0x7FF8\n"
1233 "addiu $at, $at, 0x7FF8\n"
1234 "lw $a0, 0x7FF8($at)\n"
1235 "lw $a1, 0x7FFC($at)\n"
1236 "lui $at, 0xFFFE\n"
1237 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001238 "addu $at, $at, $a2\n"
1239 "lw $a0, 0($at)\n"
1240 "lw $a1, 4($at)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001241 "lui $at, 0xFFFE\n"
1242 "ori $at, $at, 0x8010\n"
1243 "addu $at, $at, $a2\n"
1244 "lw $a0, 7($at)\n"
1245 "lw $a1, 11($at)\n"
1246 "lui $at, 0x1\n"
1247 "ori $at, $at, 0x7FE8\n"
1248 "addu $at, $at, $a2\n"
1249 "lw $a0, 1($at)\n"
1250 "lw $a1, 5($at)\n"
1251 "lui $at, 0x1\n"
1252 "ori $at, $at, 0x7FF0\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001253 "addu $at, $at, $a2\n"
1254 "lw $a0, 0($at)\n"
1255 "lw $a1, 4($at)\n"
1256 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001257 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001258 "addu $at, $at, $a2\n"
1259 "lw $a0, 0($at)\n"
1260 "lw $a1, 4($at)\n";
1261 DriverStr(expected, "LoadFromOffset");
1262}
1263
1264TEST_F(AssemblerMIPSTest, LoadSFromOffset) {
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001265 __ LoadSFromOffset(mips::F2, mips::A0, -0x8000);
1266 __ LoadSFromOffset(mips::F2, mips::A0, +0);
1267 __ LoadSFromOffset(mips::F2, mips::A0, +0x7FF8);
1268 __ LoadSFromOffset(mips::F2, mips::A0, +0x7FFB);
1269 __ LoadSFromOffset(mips::F2, mips::A0, +0x7FFC);
1270 __ LoadSFromOffset(mips::F2, mips::A0, +0x7FFF);
1271 __ LoadSFromOffset(mips::F2, mips::A0, -0xFFF0);
1272 __ LoadSFromOffset(mips::F2, mips::A0, -0x8008);
1273 __ LoadSFromOffset(mips::F2, mips::A0, -0x8001);
1274 __ LoadSFromOffset(mips::F2, mips::A0, +0x8000);
1275 __ LoadSFromOffset(mips::F2, mips::A0, +0xFFF0);
1276 __ LoadSFromOffset(mips::F2, mips::A0, -0x17FE8);
1277 __ LoadSFromOffset(mips::F2, mips::A0, -0x0FFF8);
1278 __ LoadSFromOffset(mips::F2, mips::A0, -0x0FFF1);
1279 __ LoadSFromOffset(mips::F2, mips::A0, +0x0FFF1);
1280 __ LoadSFromOffset(mips::F2, mips::A0, +0x0FFF8);
1281 __ LoadSFromOffset(mips::F2, mips::A0, +0x17FE8);
1282 __ LoadSFromOffset(mips::F2, mips::A0, -0x17FF0);
1283 __ LoadSFromOffset(mips::F2, mips::A0, -0x17FE9);
1284 __ LoadSFromOffset(mips::F2, mips::A0, +0x17FE9);
1285 __ LoadSFromOffset(mips::F2, mips::A0, +0x17FF0);
1286 __ LoadSFromOffset(mips::F2, mips::A0, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001287
1288 const char* expected =
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001289 "lwc1 $f2, -0x8000($a0)\n"
1290 "lwc1 $f2, 0($a0)\n"
1291 "lwc1 $f2, 0x7FF8($a0)\n"
1292 "lwc1 $f2, 0x7FFB($a0)\n"
1293 "lwc1 $f2, 0x7FFC($a0)\n"
1294 "lwc1 $f2, 0x7FFF($a0)\n"
1295 "addiu $at, $a0, -0x7FF8\n"
1296 "lwc1 $f2, -0x7FF8($at)\n"
1297 "addiu $at, $a0, -0x7FF8\n"
1298 "lwc1 $f2, -0x10($at)\n"
1299 "addiu $at, $a0, -0x7FF8\n"
1300 "lwc1 $f2, -9($at)\n"
1301 "addiu $at, $a0, 0x7FF8\n"
1302 "lwc1 $f2, 8($at)\n"
1303 "addiu $at, $a0, 0x7FF8\n"
1304 "lwc1 $f2, 0x7FF8($at)\n"
1305 "addiu $at, $a0, -0x7FF8\n"
1306 "addiu $at, $at, -0x7FF8\n"
1307 "lwc1 $f2, -0x7FF8($at)\n"
1308 "addiu $at, $a0, -0x7FF8\n"
1309 "addiu $at, $at, -0x7FF8\n"
1310 "lwc1 $f2, -8($at)\n"
1311 "addiu $at, $a0, -0x7FF8\n"
1312 "addiu $at, $at, -0x7FF8\n"
1313 "lwc1 $f2, -1($at)\n"
1314 "addiu $at, $a0, 0x7FF8\n"
1315 "addiu $at, $at, 0x7FF8\n"
1316 "lwc1 $f2, 1($at)\n"
1317 "addiu $at, $a0, 0x7FF8\n"
1318 "addiu $at, $at, 0x7FF8\n"
1319 "lwc1 $f2, 8($at)\n"
1320 "addiu $at, $a0, 0x7FF8\n"
1321 "addiu $at, $at, 0x7FF8\n"
1322 "lwc1 $f2, 0x7FF8($at)\n"
1323 "lui $at, 0xFFFE\n"
1324 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001325 "addu $at, $at, $a0\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001326 "lwc1 $f2, 0($at)\n"
1327 "lui $at, 0xFFFE\n"
1328 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001329 "addu $at, $at, $a0\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001330 "lwc1 $f2, 7($at)\n"
1331 "lui $at, 0x1\n"
1332 "ori $at, $at, 0x7FE8\n"
1333 "addu $at, $at, $a0\n"
1334 "lwc1 $f2, 1($at)\n"
1335 "lui $at, 0x1\n"
1336 "ori $at, $at, 0x7FF0\n"
1337 "addu $at, $at, $a0\n"
1338 "lwc1 $f2, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001339 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001340 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001341 "addu $at, $at, $a0\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001342 "lwc1 $f2, 0($at)\n";
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001343 DriverStr(expected, "LoadSFromOffset");
1344}
1345
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001346TEST_F(AssemblerMIPSTest, LoadDFromOffset) {
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001347 __ LoadDFromOffset(mips::F0, mips::A0, -0x8000);
1348 __ LoadDFromOffset(mips::F0, mips::A0, +0);
1349 __ LoadDFromOffset(mips::F0, mips::A0, +0x7FF8);
1350 __ LoadDFromOffset(mips::F0, mips::A0, +0x7FFB);
1351 __ LoadDFromOffset(mips::F0, mips::A0, +0x7FFC);
1352 __ LoadDFromOffset(mips::F0, mips::A0, +0x7FFF);
1353 __ LoadDFromOffset(mips::F0, mips::A0, -0xFFF0);
1354 __ LoadDFromOffset(mips::F0, mips::A0, -0x8008);
1355 __ LoadDFromOffset(mips::F0, mips::A0, -0x8001);
1356 __ LoadDFromOffset(mips::F0, mips::A0, +0x8000);
1357 __ LoadDFromOffset(mips::F0, mips::A0, +0xFFF0);
1358 __ LoadDFromOffset(mips::F0, mips::A0, -0x17FE8);
1359 __ LoadDFromOffset(mips::F0, mips::A0, -0x0FFF8);
1360 __ LoadDFromOffset(mips::F0, mips::A0, -0x0FFF1);
1361 __ LoadDFromOffset(mips::F0, mips::A0, +0x0FFF1);
1362 __ LoadDFromOffset(mips::F0, mips::A0, +0x0FFF8);
1363 __ LoadDFromOffset(mips::F0, mips::A0, +0x17FE8);
1364 __ LoadDFromOffset(mips::F0, mips::A0, -0x17FF0);
1365 __ LoadDFromOffset(mips::F0, mips::A0, -0x17FE9);
1366 __ LoadDFromOffset(mips::F0, mips::A0, +0x17FE9);
1367 __ LoadDFromOffset(mips::F0, mips::A0, +0x17FF0);
1368 __ LoadDFromOffset(mips::F0, mips::A0, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001369
1370 const char* expected =
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001371 "ldc1 $f0, -0x8000($a0)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001372 "ldc1 $f0, 0($a0)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001373 "ldc1 $f0, 0x7FF8($a0)\n"
1374 "lwc1 $f0, 0x7FFB($a0)\n"
1375 "lwc1 $f1, 0x7FFF($a0)\n"
1376 "addiu $at, $a0, 0x7FF8\n"
1377 "lwc1 $f0, 4($at)\n"
1378 "lwc1 $f1, 8($at)\n"
1379 "addiu $at, $a0, 0x7FF8\n"
1380 "lwc1 $f0, 7($at)\n"
1381 "lwc1 $f1, 11($at)\n"
1382 "addiu $at, $a0, -0x7FF8\n"
1383 "ldc1 $f0, -0x7FF8($at)\n"
1384 "addiu $at, $a0, -0x7FF8\n"
1385 "ldc1 $f0, -0x10($at)\n"
1386 "addiu $at, $a0, -0x7FF8\n"
1387 "lwc1 $f0, -9($at)\n"
1388 "lwc1 $f1, -5($at)\n"
1389 "addiu $at, $a0, 0x7FF8\n"
1390 "ldc1 $f0, 8($at)\n"
1391 "addiu $at, $a0, 0x7FF8\n"
1392 "ldc1 $f0, 0x7FF8($at)\n"
1393 "addiu $at, $a0, -0x7FF8\n"
1394 "addiu $at, $at, -0x7FF8\n"
1395 "ldc1 $f0, -0x7FF8($at)\n"
1396 "addiu $at, $a0, -0x7FF8\n"
1397 "addiu $at, $at, -0x7FF8\n"
1398 "ldc1 $f0, -8($at)\n"
1399 "addiu $at, $a0, -0x7FF8\n"
1400 "addiu $at, $at, -0x7FF8\n"
1401 "lwc1 $f0, -1($at)\n"
1402 "lwc1 $f1, 3($at)\n"
1403 "addiu $at, $a0, 0x7FF8\n"
1404 "addiu $at, $at, 0x7FF8\n"
1405 "lwc1 $f0, 1($at)\n"
1406 "lwc1 $f1, 5($at)\n"
1407 "addiu $at, $a0, 0x7FF8\n"
1408 "addiu $at, $at, 0x7FF8\n"
1409 "ldc1 $f0, 8($at)\n"
1410 "addiu $at, $a0, 0x7FF8\n"
1411 "addiu $at, $at, 0x7FF8\n"
1412 "ldc1 $f0, 0x7FF8($at)\n"
1413 "lui $at, 0xFFFE\n"
1414 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001415 "addu $at, $at, $a0\n"
1416 "ldc1 $f0, 0($at)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001417 "lui $at, 0xFFFE\n"
1418 "ori $at, $at, 0x8010\n"
1419 "addu $at, $at, $a0\n"
1420 "lwc1 $f0, 7($at)\n"
1421 "lwc1 $f1, 11($at)\n"
1422 "lui $at, 0x1\n"
1423 "ori $at, $at, 0x7FE8\n"
1424 "addu $at, $at, $a0\n"
1425 "lwc1 $f0, 1($at)\n"
1426 "lwc1 $f1, 5($at)\n"
1427 "lui $at, 0x1\n"
1428 "ori $at, $at, 0x7FF0\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001429 "addu $at, $at, $a0\n"
1430 "ldc1 $f0, 0($at)\n"
1431 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001432 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001433 "addu $at, $at, $a0\n"
1434 "ldc1 $f0, 0($at)\n";
1435 DriverStr(expected, "LoadDFromOffset");
1436}
1437
1438TEST_F(AssemblerMIPSTest, StoreToOffset) {
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001439 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x8000);
1440 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0);
1441 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x7FF8);
1442 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x7FFB);
1443 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x7FFC);
1444 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x7FFF);
1445 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0xFFF0);
1446 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x8008);
1447 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x8001);
1448 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x8000);
1449 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0xFFF0);
1450 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x17FE8);
1451 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x0FFF8);
1452 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x0FFF1);
1453 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x0FFF1);
1454 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x0FFF8);
1455 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x17FE8);
1456 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x17FF0);
1457 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x17FE9);
1458 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x17FE9);
1459 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x17FF0);
1460 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001461
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001462 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x8000);
1463 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0);
1464 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x7FF8);
1465 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x7FFB);
1466 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x7FFC);
1467 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x7FFF);
1468 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0xFFF0);
1469 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x8008);
1470 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x8001);
1471 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x8000);
1472 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0xFFF0);
1473 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x17FE8);
1474 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x0FFF8);
1475 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x0FFF1);
1476 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x0FFF1);
1477 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x0FFF8);
1478 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x17FE8);
1479 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x17FF0);
1480 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x17FE9);
1481 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x17FE9);
1482 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x17FF0);
1483 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001484
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001485 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x8000);
1486 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0);
1487 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x7FF8);
1488 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x7FFB);
1489 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x7FFC);
1490 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x7FFF);
1491 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0xFFF0);
1492 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x8008);
1493 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x8001);
1494 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x8000);
1495 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0xFFF0);
1496 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x17FE8);
1497 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x0FFF8);
1498 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x0FFF1);
1499 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x0FFF1);
1500 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x0FFF8);
1501 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x17FE8);
1502 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x17FF0);
1503 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x17FE9);
1504 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x17FE9);
1505 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x17FF0);
1506 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001507
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001508 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x8000);
1509 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0);
1510 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x7FF8);
1511 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x7FFB);
1512 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x7FFC);
1513 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x7FFF);
1514 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0xFFF0);
1515 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x8008);
1516 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x8001);
1517 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x8000);
1518 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0xFFF0);
1519 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x17FE8);
1520 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x0FFF8);
1521 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x0FFF1);
1522 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x0FFF1);
1523 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x0FFF8);
1524 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x17FE8);
1525 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x17FF0);
1526 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x17FE9);
1527 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x17FE9);
1528 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x17FF0);
1529 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001530
1531 const char* expected =
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001532 "sb $a3, -0x8000($a1)\n"
1533 "sb $a3, 0($a1)\n"
1534 "sb $a3, 0x7FF8($a1)\n"
1535 "sb $a3, 0x7FFB($a1)\n"
1536 "sb $a3, 0x7FFC($a1)\n"
1537 "sb $a3, 0x7FFF($a1)\n"
1538 "addiu $at, $a1, -0x7FF8\n"
1539 "sb $a3, -0x7FF8($at)\n"
1540 "addiu $at, $a1, -0x7FF8\n"
1541 "sb $a3, -0x10($at)\n"
1542 "addiu $at, $a1, -0x7FF8\n"
1543 "sb $a3, -9($at)\n"
1544 "addiu $at, $a1, 0x7FF8\n"
1545 "sb $a3, 8($at)\n"
1546 "addiu $at, $a1, 0x7FF8\n"
1547 "sb $a3, 0x7FF8($at)\n"
1548 "addiu $at, $a1, -0x7FF8\n"
1549 "addiu $at, $at, -0x7FF8\n"
1550 "sb $a3, -0x7FF8($at)\n"
1551 "addiu $at, $a1, -0x7FF8\n"
1552 "addiu $at, $at, -0x7FF8\n"
1553 "sb $a3, -8($at)\n"
1554 "addiu $at, $a1, -0x7FF8\n"
1555 "addiu $at, $at, -0x7FF8\n"
1556 "sb $a3, -1($at)\n"
1557 "addiu $at, $a1, 0x7FF8\n"
1558 "addiu $at, $at, 0x7FF8\n"
1559 "sb $a3, 1($at)\n"
1560 "addiu $at, $a1, 0x7FF8\n"
1561 "addiu $at, $at, 0x7FF8\n"
1562 "sb $a3, 8($at)\n"
1563 "addiu $at, $a1, 0x7FF8\n"
1564 "addiu $at, $at, 0x7FF8\n"
1565 "sb $a3, 0x7FF8($at)\n"
1566 "lui $at, 0xFFFE\n"
1567 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001568 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001569 "sb $a3, 0($at)\n"
1570 "lui $at, 0xFFFE\n"
1571 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001572 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001573 "sb $a3, 7($at)\n"
1574 "lui $at, 0x1\n"
1575 "ori $at, $at, 0x7FE8\n"
1576 "addu $at, $at, $a1\n"
1577 "sb $a3, 1($at)\n"
1578 "lui $at, 0x1\n"
1579 "ori $at, $at, 0x7FF0\n"
1580 "addu $at, $at, $a1\n"
1581 "sb $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001582 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001583 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001584 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001585 "sb $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001586
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001587 "sh $a3, -0x8000($a1)\n"
1588 "sh $a3, 0($a1)\n"
1589 "sh $a3, 0x7FF8($a1)\n"
1590 "sh $a3, 0x7FFB($a1)\n"
1591 "sh $a3, 0x7FFC($a1)\n"
1592 "sh $a3, 0x7FFF($a1)\n"
1593 "addiu $at, $a1, -0x7FF8\n"
1594 "sh $a3, -0x7FF8($at)\n"
1595 "addiu $at, $a1, -0x7FF8\n"
1596 "sh $a3, -0x10($at)\n"
1597 "addiu $at, $a1, -0x7FF8\n"
1598 "sh $a3, -9($at)\n"
1599 "addiu $at, $a1, 0x7FF8\n"
1600 "sh $a3, 8($at)\n"
1601 "addiu $at, $a1, 0x7FF8\n"
1602 "sh $a3, 0x7FF8($at)\n"
1603 "addiu $at, $a1, -0x7FF8\n"
1604 "addiu $at, $at, -0x7FF8\n"
1605 "sh $a3, -0x7FF8($at)\n"
1606 "addiu $at, $a1, -0x7FF8\n"
1607 "addiu $at, $at, -0x7FF8\n"
1608 "sh $a3, -8($at)\n"
1609 "addiu $at, $a1, -0x7FF8\n"
1610 "addiu $at, $at, -0x7FF8\n"
1611 "sh $a3, -1($at)\n"
1612 "addiu $at, $a1, 0x7FF8\n"
1613 "addiu $at, $at, 0x7FF8\n"
1614 "sh $a3, 1($at)\n"
1615 "addiu $at, $a1, 0x7FF8\n"
1616 "addiu $at, $at, 0x7FF8\n"
1617 "sh $a3, 8($at)\n"
1618 "addiu $at, $a1, 0x7FF8\n"
1619 "addiu $at, $at, 0x7FF8\n"
1620 "sh $a3, 0x7FF8($at)\n"
1621 "lui $at, 0xFFFE\n"
1622 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001623 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001624 "sh $a3, 0($at)\n"
1625 "lui $at, 0xFFFE\n"
1626 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001627 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001628 "sh $a3, 7($at)\n"
1629 "lui $at, 0x1\n"
1630 "ori $at, $at, 0x7FE8\n"
1631 "addu $at, $at, $a1\n"
1632 "sh $a3, 1($at)\n"
1633 "lui $at, 0x1\n"
1634 "ori $at, $at, 0x7FF0\n"
1635 "addu $at, $at, $a1\n"
1636 "sh $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001637 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001638 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001639 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001640 "sh $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001641
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001642 "sw $a3, -0x8000($a1)\n"
1643 "sw $a3, 0($a1)\n"
1644 "sw $a3, 0x7FF8($a1)\n"
1645 "sw $a3, 0x7FFB($a1)\n"
1646 "sw $a3, 0x7FFC($a1)\n"
1647 "sw $a3, 0x7FFF($a1)\n"
1648 "addiu $at, $a1, -0x7FF8\n"
1649 "sw $a3, -0x7FF8($at)\n"
1650 "addiu $at, $a1, -0x7FF8\n"
1651 "sw $a3, -0x10($at)\n"
1652 "addiu $at, $a1, -0x7FF8\n"
1653 "sw $a3, -9($at)\n"
1654 "addiu $at, $a1, 0x7FF8\n"
1655 "sw $a3, 8($at)\n"
1656 "addiu $at, $a1, 0x7FF8\n"
1657 "sw $a3, 0x7FF8($at)\n"
1658 "addiu $at, $a1, -0x7FF8\n"
1659 "addiu $at, $at, -0x7FF8\n"
1660 "sw $a3, -0x7FF8($at)\n"
1661 "addiu $at, $a1, -0x7FF8\n"
1662 "addiu $at, $at, -0x7FF8\n"
1663 "sw $a3, -8($at)\n"
1664 "addiu $at, $a1, -0x7FF8\n"
1665 "addiu $at, $at, -0x7FF8\n"
1666 "sw $a3, -1($at)\n"
1667 "addiu $at, $a1, 0x7FF8\n"
1668 "addiu $at, $at, 0x7FF8\n"
1669 "sw $a3, 1($at)\n"
1670 "addiu $at, $a1, 0x7FF8\n"
1671 "addiu $at, $at, 0x7FF8\n"
1672 "sw $a3, 8($at)\n"
1673 "addiu $at, $a1, 0x7FF8\n"
1674 "addiu $at, $at, 0x7FF8\n"
1675 "sw $a3, 0x7FF8($at)\n"
1676 "lui $at, 0xFFFE\n"
1677 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001678 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001679 "sw $a3, 0($at)\n"
1680 "lui $at, 0xFFFE\n"
1681 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001682 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001683 "sw $a3, 7($at)\n"
1684 "lui $at, 0x1\n"
1685 "ori $at, $at, 0x7FE8\n"
1686 "addu $at, $at, $a1\n"
1687 "sw $a3, 1($at)\n"
1688 "lui $at, 0x1\n"
1689 "ori $at, $at, 0x7FF0\n"
1690 "addu $at, $at, $a1\n"
1691 "sw $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001692 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001693 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001694 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001695 "sw $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001696
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001697 "sw $a0, -0x8000($a2)\n"
1698 "sw $a1, -0x7FFC($a2)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001699 "sw $a0, 0($a2)\n"
1700 "sw $a1, 4($a2)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001701 "sw $a0, 0x7FF8($a2)\n"
1702 "sw $a1, 0x7FFC($a2)\n"
1703 "sw $a0, 0x7FFB($a2)\n"
1704 "sw $a1, 0x7FFF($a2)\n"
1705 "addiu $at, $a2, 0x7FF8\n"
1706 "sw $a0, 4($at)\n"
1707 "sw $a1, 8($at)\n"
1708 "addiu $at, $a2, 0x7FF8\n"
1709 "sw $a0, 7($at)\n"
1710 "sw $a1, 11($at)\n"
1711 "addiu $at, $a2, -0x7FF8\n"
1712 "sw $a0, -0x7FF8($at)\n"
1713 "sw $a1, -0x7FF4($at)\n"
1714 "addiu $at, $a2, -0x7FF8\n"
1715 "sw $a0, -0x10($at)\n"
1716 "sw $a1, -0xC($at)\n"
1717 "addiu $at, $a2, -0x7FF8\n"
1718 "sw $a0, -9($at)\n"
1719 "sw $a1, -5($at)\n"
1720 "addiu $at, $a2, 0x7FF8\n"
1721 "sw $a0, 8($at)\n"
1722 "sw $a1, 12($at)\n"
1723 "addiu $at, $a2, 0x7FF8\n"
1724 "sw $a0, 0x7FF8($at)\n"
1725 "sw $a1, 0x7FFC($at)\n"
1726 "addiu $at, $a2, -0x7FF8\n"
1727 "addiu $at, $at, -0x7FF8\n"
1728 "sw $a0, -0x7FF8($at)\n"
1729 "sw $a1, -0x7FF4($at)\n"
1730 "addiu $at, $a2, -0x7FF8\n"
1731 "addiu $at, $at, -0x7FF8\n"
1732 "sw $a0, -8($at)\n"
1733 "sw $a1, -4($at)\n"
1734 "addiu $at, $a2, -0x7FF8\n"
1735 "addiu $at, $at, -0x7FF8\n"
1736 "sw $a0, -1($at)\n"
1737 "sw $a1, 3($at)\n"
1738 "addiu $at, $a2, 0x7FF8\n"
1739 "addiu $at, $at, 0x7FF8\n"
1740 "sw $a0, 1($at)\n"
1741 "sw $a1, 5($at)\n"
1742 "addiu $at, $a2, 0x7FF8\n"
1743 "addiu $at, $at, 0x7FF8\n"
1744 "sw $a0, 8($at)\n"
1745 "sw $a1, 12($at)\n"
1746 "addiu $at, $a2, 0x7FF8\n"
1747 "addiu $at, $at, 0x7FF8\n"
1748 "sw $a0, 0x7FF8($at)\n"
1749 "sw $a1, 0x7FFC($at)\n"
1750 "lui $at, 0xFFFE\n"
1751 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001752 "addu $at, $at, $a2\n"
1753 "sw $a0, 0($at)\n"
1754 "sw $a1, 4($at)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001755 "lui $at, 0xFFFE\n"
1756 "ori $at, $at, 0x8010\n"
1757 "addu $at, $at, $a2\n"
1758 "sw $a0, 7($at)\n"
1759 "sw $a1, 11($at)\n"
1760 "lui $at, 0x1\n"
1761 "ori $at, $at, 0x7FE8\n"
1762 "addu $at, $at, $a2\n"
1763 "sw $a0, 1($at)\n"
1764 "sw $a1, 5($at)\n"
1765 "lui $at, 0x1\n"
1766 "ori $at, $at, 0x7FF0\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001767 "addu $at, $at, $a2\n"
1768 "sw $a0, 0($at)\n"
1769 "sw $a1, 4($at)\n"
1770 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001771 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001772 "addu $at, $at, $a2\n"
1773 "sw $a0, 0($at)\n"
1774 "sw $a1, 4($at)\n";
1775 DriverStr(expected, "StoreToOffset");
1776}
1777
1778TEST_F(AssemblerMIPSTest, StoreSToOffset) {
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001779 __ StoreSToOffset(mips::F2, mips::A0, -0x8000);
1780 __ StoreSToOffset(mips::F2, mips::A0, +0);
1781 __ StoreSToOffset(mips::F2, mips::A0, +0x7FF8);
1782 __ StoreSToOffset(mips::F2, mips::A0, +0x7FFB);
1783 __ StoreSToOffset(mips::F2, mips::A0, +0x7FFC);
1784 __ StoreSToOffset(mips::F2, mips::A0, +0x7FFF);
1785 __ StoreSToOffset(mips::F2, mips::A0, -0xFFF0);
1786 __ StoreSToOffset(mips::F2, mips::A0, -0x8008);
1787 __ StoreSToOffset(mips::F2, mips::A0, -0x8001);
1788 __ StoreSToOffset(mips::F2, mips::A0, +0x8000);
1789 __ StoreSToOffset(mips::F2, mips::A0, +0xFFF0);
1790 __ StoreSToOffset(mips::F2, mips::A0, -0x17FE8);
1791 __ StoreSToOffset(mips::F2, mips::A0, -0x0FFF8);
1792 __ StoreSToOffset(mips::F2, mips::A0, -0x0FFF1);
1793 __ StoreSToOffset(mips::F2, mips::A0, +0x0FFF1);
1794 __ StoreSToOffset(mips::F2, mips::A0, +0x0FFF8);
1795 __ StoreSToOffset(mips::F2, mips::A0, +0x17FE8);
1796 __ StoreSToOffset(mips::F2, mips::A0, -0x17FF0);
1797 __ StoreSToOffset(mips::F2, mips::A0, -0x17FE9);
1798 __ StoreSToOffset(mips::F2, mips::A0, +0x17FE9);
1799 __ StoreSToOffset(mips::F2, mips::A0, +0x17FF0);
1800 __ StoreSToOffset(mips::F2, mips::A0, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001801
1802 const char* expected =
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001803 "swc1 $f2, -0x8000($a0)\n"
1804 "swc1 $f2, 0($a0)\n"
1805 "swc1 $f2, 0x7FF8($a0)\n"
1806 "swc1 $f2, 0x7FFB($a0)\n"
1807 "swc1 $f2, 0x7FFC($a0)\n"
1808 "swc1 $f2, 0x7FFF($a0)\n"
1809 "addiu $at, $a0, -0x7FF8\n"
1810 "swc1 $f2, -0x7FF8($at)\n"
1811 "addiu $at, $a0, -0x7FF8\n"
1812 "swc1 $f2, -0x10($at)\n"
1813 "addiu $at, $a0, -0x7FF8\n"
1814 "swc1 $f2, -9($at)\n"
1815 "addiu $at, $a0, 0x7FF8\n"
1816 "swc1 $f2, 8($at)\n"
1817 "addiu $at, $a0, 0x7FF8\n"
1818 "swc1 $f2, 0x7FF8($at)\n"
1819 "addiu $at, $a0, -0x7FF8\n"
1820 "addiu $at, $at, -0x7FF8\n"
1821 "swc1 $f2, -0x7FF8($at)\n"
1822 "addiu $at, $a0, -0x7FF8\n"
1823 "addiu $at, $at, -0x7FF8\n"
1824 "swc1 $f2, -8($at)\n"
1825 "addiu $at, $a0, -0x7FF8\n"
1826 "addiu $at, $at, -0x7FF8\n"
1827 "swc1 $f2, -1($at)\n"
1828 "addiu $at, $a0, 0x7FF8\n"
1829 "addiu $at, $at, 0x7FF8\n"
1830 "swc1 $f2, 1($at)\n"
1831 "addiu $at, $a0, 0x7FF8\n"
1832 "addiu $at, $at, 0x7FF8\n"
1833 "swc1 $f2, 8($at)\n"
1834 "addiu $at, $a0, 0x7FF8\n"
1835 "addiu $at, $at, 0x7FF8\n"
1836 "swc1 $f2, 0x7FF8($at)\n"
1837 "lui $at, 0xFFFE\n"
1838 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001839 "addu $at, $at, $a0\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001840 "swc1 $f2, 0($at)\n"
1841 "lui $at, 0xFFFE\n"
1842 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001843 "addu $at, $at, $a0\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001844 "swc1 $f2, 7($at)\n"
1845 "lui $at, 0x1\n"
1846 "ori $at, $at, 0x7FE8\n"
1847 "addu $at, $at, $a0\n"
1848 "swc1 $f2, 1($at)\n"
1849 "lui $at, 0x1\n"
1850 "ori $at, $at, 0x7FF0\n"
1851 "addu $at, $at, $a0\n"
1852 "swc1 $f2, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001853 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001854 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001855 "addu $at, $at, $a0\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001856 "swc1 $f2, 0($at)\n";
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001857 DriverStr(expected, "StoreSToOffset");
1858}
1859
1860TEST_F(AssemblerMIPSTest, StoreDToOffset) {
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001861 __ StoreDToOffset(mips::F0, mips::A0, -0x8000);
1862 __ StoreDToOffset(mips::F0, mips::A0, +0);
1863 __ StoreDToOffset(mips::F0, mips::A0, +0x7FF8);
1864 __ StoreDToOffset(mips::F0, mips::A0, +0x7FFB);
1865 __ StoreDToOffset(mips::F0, mips::A0, +0x7FFC);
1866 __ StoreDToOffset(mips::F0, mips::A0, +0x7FFF);
1867 __ StoreDToOffset(mips::F0, mips::A0, -0xFFF0);
1868 __ StoreDToOffset(mips::F0, mips::A0, -0x8008);
1869 __ StoreDToOffset(mips::F0, mips::A0, -0x8001);
1870 __ StoreDToOffset(mips::F0, mips::A0, +0x8000);
1871 __ StoreDToOffset(mips::F0, mips::A0, +0xFFF0);
1872 __ StoreDToOffset(mips::F0, mips::A0, -0x17FE8);
1873 __ StoreDToOffset(mips::F0, mips::A0, -0x0FFF8);
1874 __ StoreDToOffset(mips::F0, mips::A0, -0x0FFF1);
1875 __ StoreDToOffset(mips::F0, mips::A0, +0x0FFF1);
1876 __ StoreDToOffset(mips::F0, mips::A0, +0x0FFF8);
1877 __ StoreDToOffset(mips::F0, mips::A0, +0x17FE8);
1878 __ StoreDToOffset(mips::F0, mips::A0, -0x17FF0);
1879 __ StoreDToOffset(mips::F0, mips::A0, -0x17FE9);
1880 __ StoreDToOffset(mips::F0, mips::A0, +0x17FE9);
1881 __ StoreDToOffset(mips::F0, mips::A0, +0x17FF0);
1882 __ StoreDToOffset(mips::F0, mips::A0, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001883
1884 const char* expected =
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001885 "sdc1 $f0, -0x8000($a0)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001886 "sdc1 $f0, 0($a0)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001887 "sdc1 $f0, 0x7FF8($a0)\n"
1888 "swc1 $f0, 0x7FFB($a0)\n"
1889 "swc1 $f1, 0x7FFF($a0)\n"
1890 "addiu $at, $a0, 0x7FF8\n"
1891 "swc1 $f0, 4($at)\n"
1892 "swc1 $f1, 8($at)\n"
1893 "addiu $at, $a0, 0x7FF8\n"
1894 "swc1 $f0, 7($at)\n"
1895 "swc1 $f1, 11($at)\n"
1896 "addiu $at, $a0, -0x7FF8\n"
1897 "sdc1 $f0, -0x7FF8($at)\n"
1898 "addiu $at, $a0, -0x7FF8\n"
1899 "sdc1 $f0, -0x10($at)\n"
1900 "addiu $at, $a0, -0x7FF8\n"
1901 "swc1 $f0, -9($at)\n"
1902 "swc1 $f1, -5($at)\n"
1903 "addiu $at, $a0, 0x7FF8\n"
1904 "sdc1 $f0, 8($at)\n"
1905 "addiu $at, $a0, 0x7FF8\n"
1906 "sdc1 $f0, 0x7FF8($at)\n"
1907 "addiu $at, $a0, -0x7FF8\n"
1908 "addiu $at, $at, -0x7FF8\n"
1909 "sdc1 $f0, -0x7FF8($at)\n"
1910 "addiu $at, $a0, -0x7FF8\n"
1911 "addiu $at, $at, -0x7FF8\n"
1912 "sdc1 $f0, -8($at)\n"
1913 "addiu $at, $a0, -0x7FF8\n"
1914 "addiu $at, $at, -0x7FF8\n"
1915 "swc1 $f0, -1($at)\n"
1916 "swc1 $f1, 3($at)\n"
1917 "addiu $at, $a0, 0x7FF8\n"
1918 "addiu $at, $at, 0x7FF8\n"
1919 "swc1 $f0, 1($at)\n"
1920 "swc1 $f1, 5($at)\n"
1921 "addiu $at, $a0, 0x7FF8\n"
1922 "addiu $at, $at, 0x7FF8\n"
1923 "sdc1 $f0, 8($at)\n"
1924 "addiu $at, $a0, 0x7FF8\n"
1925 "addiu $at, $at, 0x7FF8\n"
1926 "sdc1 $f0, 0x7FF8($at)\n"
1927 "lui $at, 0xFFFE\n"
1928 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001929 "addu $at, $at, $a0\n"
1930 "sdc1 $f0, 0($at)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001931 "lui $at, 0xFFFE\n"
1932 "ori $at, $at, 0x8010\n"
1933 "addu $at, $at, $a0\n"
1934 "swc1 $f0, 7($at)\n"
1935 "swc1 $f1, 11($at)\n"
1936 "lui $at, 0x1\n"
1937 "ori $at, $at, 0x7FE8\n"
1938 "addu $at, $at, $a0\n"
1939 "swc1 $f0, 1($at)\n"
1940 "swc1 $f1, 5($at)\n"
1941 "lui $at, 0x1\n"
1942 "ori $at, $at, 0x7FF0\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001943 "addu $at, $at, $a0\n"
1944 "sdc1 $f0, 0($at)\n"
1945 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001946 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001947 "addu $at, $at, $a0\n"
1948 "sdc1 $f0, 0($at)\n";
1949 DriverStr(expected, "StoreDToOffset");
1950}
1951
1952TEST_F(AssemblerMIPSTest, B) {
1953 mips::MipsLabel label1, label2;
1954 __ B(&label1);
1955 constexpr size_t kAdduCount1 = 63;
1956 for (size_t i = 0; i != kAdduCount1; ++i) {
1957 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1958 }
1959 __ Bind(&label1);
1960 __ B(&label2);
1961 constexpr size_t kAdduCount2 = 64;
1962 for (size_t i = 0; i != kAdduCount2; ++i) {
1963 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1964 }
1965 __ Bind(&label2);
1966 __ B(&label1);
1967
1968 std::string expected =
1969 ".set noreorder\n"
1970 "b 1f\n"
1971 "nop\n" +
1972 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
1973 "1:\n"
1974 "b 2f\n"
1975 "nop\n" +
1976 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
1977 "2:\n"
1978 "b 1b\n"
1979 "nop\n";
1980 DriverStr(expected, "B");
1981}
1982
1983TEST_F(AssemblerMIPSTest, Beq) {
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08001984 BranchCondTwoRegsHelper(&mips::MipsAssembler::Beq, "Beq");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001985}
1986
1987TEST_F(AssemblerMIPSTest, Bne) {
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08001988 BranchCondTwoRegsHelper(&mips::MipsAssembler::Bne, "Bne");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001989}
1990
1991TEST_F(AssemblerMIPSTest, Beqz) {
1992 mips::MipsLabel label;
1993 __ Beqz(mips::A0, &label);
1994 constexpr size_t kAdduCount1 = 63;
1995 for (size_t i = 0; i != kAdduCount1; ++i) {
1996 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
1997 }
1998 __ Bind(&label);
1999 constexpr size_t kAdduCount2 = 64;
2000 for (size_t i = 0; i != kAdduCount2; ++i) {
2001 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2002 }
2003 __ Beqz(mips::A1, &label);
2004
2005 std::string expected =
2006 ".set noreorder\n"
2007 "beq $zero, $a0, 1f\n"
2008 "nop\n" +
2009 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
2010 "1:\n" +
2011 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
2012 "beq $zero, $a1, 1b\n"
2013 "nop\n";
2014 DriverStr(expected, "Beqz");
2015}
2016
2017TEST_F(AssemblerMIPSTest, Bnez) {
2018 mips::MipsLabel label;
2019 __ Bnez(mips::A0, &label);
2020 constexpr size_t kAdduCount1 = 63;
2021 for (size_t i = 0; i != kAdduCount1; ++i) {
2022 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2023 }
2024 __ Bind(&label);
2025 constexpr size_t kAdduCount2 = 64;
2026 for (size_t i = 0; i != kAdduCount2; ++i) {
2027 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2028 }
2029 __ Bnez(mips::A1, &label);
2030
2031 std::string expected =
2032 ".set noreorder\n"
2033 "bne $zero, $a0, 1f\n"
2034 "nop\n" +
2035 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
2036 "1:\n" +
2037 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
2038 "bne $zero, $a1, 1b\n"
2039 "nop\n";
2040 DriverStr(expected, "Bnez");
2041}
2042
2043TEST_F(AssemblerMIPSTest, Bltz) {
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002044 BranchCondOneRegHelper(&mips::MipsAssembler::Bltz, "Bltz");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002045}
2046
2047TEST_F(AssemblerMIPSTest, Bgez) {
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002048 BranchCondOneRegHelper(&mips::MipsAssembler::Bgez, "Bgez");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002049}
2050
2051TEST_F(AssemblerMIPSTest, Blez) {
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002052 BranchCondOneRegHelper(&mips::MipsAssembler::Blez, "Blez");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002053}
2054
2055TEST_F(AssemblerMIPSTest, Bgtz) {
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002056 BranchCondOneRegHelper(&mips::MipsAssembler::Bgtz, "Bgtz");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002057}
2058
2059TEST_F(AssemblerMIPSTest, Blt) {
2060 mips::MipsLabel label;
2061 __ Blt(mips::A0, mips::A1, &label);
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(&label);
2067 constexpr size_t kAdduCount2 = 64;
2068 for (size_t i = 0; i != kAdduCount2; ++i) {
2069 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2070 }
2071 __ Blt(mips::A2, mips::A3, &label);
2072
2073 std::string expected =
2074 ".set noreorder\n"
2075 "slt $at, $a0, $a1\n"
2076 "bne $zero, $at, 1f\n"
2077 "nop\n" +
2078 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
2079 "1:\n" +
2080 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
2081 "slt $at, $a2, $a3\n"
2082 "bne $zero, $at, 1b\n"
2083 "nop\n";
2084 DriverStr(expected, "Blt");
2085}
2086
2087TEST_F(AssemblerMIPSTest, Bge) {
2088 mips::MipsLabel label;
2089 __ Bge(mips::A0, mips::A1, &label);
2090 constexpr size_t kAdduCount1 = 63;
2091 for (size_t i = 0; i != kAdduCount1; ++i) {
2092 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2093 }
2094 __ Bind(&label);
2095 constexpr size_t kAdduCount2 = 64;
2096 for (size_t i = 0; i != kAdduCount2; ++i) {
2097 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2098 }
2099 __ Bge(mips::A2, mips::A3, &label);
2100
2101 std::string expected =
2102 ".set noreorder\n"
2103 "slt $at, $a0, $a1\n"
2104 "beq $zero, $at, 1f\n"
2105 "nop\n" +
2106 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
2107 "1:\n" +
2108 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
2109 "slt $at, $a2, $a3\n"
2110 "beq $zero, $at, 1b\n"
2111 "nop\n";
2112 DriverStr(expected, "Bge");
2113}
2114
2115TEST_F(AssemblerMIPSTest, Bltu) {
2116 mips::MipsLabel label;
2117 __ Bltu(mips::A0, mips::A1, &label);
2118 constexpr size_t kAdduCount1 = 63;
2119 for (size_t i = 0; i != kAdduCount1; ++i) {
2120 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2121 }
2122 __ Bind(&label);
2123 constexpr size_t kAdduCount2 = 64;
2124 for (size_t i = 0; i != kAdduCount2; ++i) {
2125 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2126 }
2127 __ Bltu(mips::A2, mips::A3, &label);
2128
2129 std::string expected =
2130 ".set noreorder\n"
2131 "sltu $at, $a0, $a1\n"
2132 "bne $zero, $at, 1f\n"
2133 "nop\n" +
2134 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
2135 "1:\n" +
2136 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
2137 "sltu $at, $a2, $a3\n"
2138 "bne $zero, $at, 1b\n"
2139 "nop\n";
2140 DriverStr(expected, "Bltu");
2141}
2142
2143TEST_F(AssemblerMIPSTest, Bgeu) {
2144 mips::MipsLabel label;
2145 __ Bgeu(mips::A0, mips::A1, &label);
2146 constexpr size_t kAdduCount1 = 63;
2147 for (size_t i = 0; i != kAdduCount1; ++i) {
2148 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2149 }
2150 __ Bind(&label);
2151 constexpr size_t kAdduCount2 = 64;
2152 for (size_t i = 0; i != kAdduCount2; ++i) {
2153 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2154 }
2155 __ Bgeu(mips::A2, mips::A3, &label);
2156
2157 std::string expected =
2158 ".set noreorder\n"
2159 "sltu $at, $a0, $a1\n"
2160 "beq $zero, $at, 1f\n"
2161 "nop\n" +
2162 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
2163 "1:\n" +
2164 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
2165 "sltu $at, $a2, $a3\n"
2166 "beq $zero, $at, 1b\n"
2167 "nop\n";
2168 DriverStr(expected, "Bgeu");
2169}
2170
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002171TEST_F(AssemblerMIPSTest, Bc1f) {
2172 mips::MipsLabel label;
2173 __ Bc1f(0, &label);
2174 constexpr size_t kAdduCount1 = 63;
2175 for (size_t i = 0; i != kAdduCount1; ++i) {
2176 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2177 }
2178 __ Bind(&label);
2179 constexpr size_t kAdduCount2 = 64;
2180 for (size_t i = 0; i != kAdduCount2; ++i) {
2181 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2182 }
2183 __ Bc1f(7, &label);
2184
2185 std::string expected =
2186 ".set noreorder\n"
2187 "bc1f $fcc0, 1f\n"
2188 "nop\n" +
2189 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
2190 "1:\n" +
2191 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
2192 "bc1f $fcc7, 1b\n"
2193 "nop\n";
2194 DriverStr(expected, "Bc1f");
2195}
2196
2197TEST_F(AssemblerMIPSTest, Bc1t) {
2198 mips::MipsLabel label;
2199 __ Bc1t(0, &label);
2200 constexpr size_t kAdduCount1 = 63;
2201 for (size_t i = 0; i != kAdduCount1; ++i) {
2202 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2203 }
2204 __ Bind(&label);
2205 constexpr size_t kAdduCount2 = 64;
2206 for (size_t i = 0; i != kAdduCount2; ++i) {
2207 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2208 }
2209 __ Bc1t(7, &label);
2210
2211 std::string expected =
2212 ".set noreorder\n"
2213 "bc1t $fcc0, 1f\n"
2214 "nop\n" +
2215 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
2216 "1:\n" +
2217 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
2218 "bc1t $fcc7, 1b\n"
2219 "nop\n";
2220 DriverStr(expected, "Bc1t");
2221}
2222
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002223#undef __
2224
2225} // namespace art