blob: 680c347fef91b63760065e1c41c48abcf50547db [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 Frunze0cab6562017-07-25 15:19:36 -0700189 void BranchHelper(void (mips::MipsAssembler::*f)(mips::MipsLabel*,
190 bool),
191 const std::string& instr_name,
192 bool is_bare = false) {
193 __ SetReorder(false);
194 mips::MipsLabel label1, label2;
195 (Base::GetAssembler()->*f)(&label1, is_bare);
196 constexpr size_t kAdduCount1 = 63;
197 for (size_t i = 0; i != kAdduCount1; ++i) {
198 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
199 }
200 __ Bind(&label1);
201 (Base::GetAssembler()->*f)(&label2, is_bare);
202 constexpr size_t kAdduCount2 = 64;
203 for (size_t i = 0; i != kAdduCount2; ++i) {
204 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
205 }
206 __ Bind(&label2);
207 (Base::GetAssembler()->*f)(&label1, is_bare);
208 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
209
210 std::string expected =
211 ".set noreorder\n" +
212 instr_name + " 1f\n" +
213 (is_bare ? "" : "nop\n") +
214 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
215 "1:\n" +
216 instr_name + " 2f\n" +
217 (is_bare ? "" : "nop\n") +
218 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
219 "2:\n" +
220 instr_name + " 1b\n" +
221 (is_bare ? "" : "nop\n") +
222 "addu $zero, $zero, $zero\n";
223 DriverStr(expected, instr_name);
224 }
225
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -0800226 void BranchCondOneRegHelper(void (mips::MipsAssembler::*f)(mips::Register,
Alexey Frunze0cab6562017-07-25 15:19:36 -0700227 mips::MipsLabel*,
228 bool),
229 const std::string& instr_name,
230 bool is_bare = false) {
231 __ SetReorder(false);
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -0800232 mips::MipsLabel label;
Alexey Frunze0cab6562017-07-25 15:19:36 -0700233 (Base::GetAssembler()->*f)(mips::A0, &label, is_bare);
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -0800234 constexpr size_t kAdduCount1 = 63;
235 for (size_t i = 0; i != kAdduCount1; ++i) {
236 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
237 }
238 __ Bind(&label);
239 constexpr size_t kAdduCount2 = 64;
240 for (size_t i = 0; i != kAdduCount2; ++i) {
241 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
242 }
Alexey Frunze0cab6562017-07-25 15:19:36 -0700243 (Base::GetAssembler()->*f)(mips::A1, &label, is_bare);
244 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -0800245
246 std::string expected =
247 ".set noreorder\n" +
Alexey Frunze0cab6562017-07-25 15:19:36 -0700248 instr_name + " $a0, 1f\n" +
249 (is_bare ? "" : "nop\n") +
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -0800250 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
251 "1:\n" +
252 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
Alexey Frunze0cab6562017-07-25 15:19:36 -0700253 instr_name + " $a1, 1b\n" +
254 (is_bare ? "" : "nop\n") +
255 "addu $zero, $zero, $zero\n";
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -0800256 DriverStr(expected, instr_name);
257 }
258
259 void BranchCondTwoRegsHelper(void (mips::MipsAssembler::*f)(mips::Register,
260 mips::Register,
Alexey Frunze0cab6562017-07-25 15:19:36 -0700261 mips::MipsLabel*,
262 bool),
263 const std::string& instr_name,
264 bool is_bare = false) {
265 __ SetReorder(false);
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -0800266 mips::MipsLabel label;
Alexey Frunze0cab6562017-07-25 15:19:36 -0700267 (Base::GetAssembler()->*f)(mips::A0, mips::A1, &label, is_bare);
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -0800268 constexpr size_t kAdduCount1 = 63;
269 for (size_t i = 0; i != kAdduCount1; ++i) {
270 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
271 }
272 __ Bind(&label);
273 constexpr size_t kAdduCount2 = 64;
274 for (size_t i = 0; i != kAdduCount2; ++i) {
275 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
276 }
Alexey Frunze0cab6562017-07-25 15:19:36 -0700277 (Base::GetAssembler()->*f)(mips::A2, mips::A3, &label, is_bare);
278 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -0800279
280 std::string expected =
281 ".set noreorder\n" +
Alexey Frunze0cab6562017-07-25 15:19:36 -0700282 instr_name + " $a0, $a1, 1f\n" +
283 (is_bare ? "" : "nop\n") +
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -0800284 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
285 "1:\n" +
286 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
Alexey Frunze0cab6562017-07-25 15:19:36 -0700287 instr_name + " $a2, $a3, 1b\n" +
288 (is_bare ? "" : "nop\n") +
289 "addu $zero, $zero, $zero\n";
290 DriverStr(expected, instr_name);
291 }
292
293 void BranchFpuCondCodeHelper(void (mips::MipsAssembler::*f)(int,
294 mips::MipsLabel*,
295 bool),
296 const std::string& instr_name,
297 bool is_bare = false) {
298 __ SetReorder(false);
299 mips::MipsLabel label;
300 (Base::GetAssembler()->*f)(0, &label, is_bare);
301 constexpr size_t kAdduCount1 = 63;
302 for (size_t i = 0; i != kAdduCount1; ++i) {
303 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
304 }
305 __ Bind(&label);
306 constexpr size_t kAdduCount2 = 64;
307 for (size_t i = 0; i != kAdduCount2; ++i) {
308 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
309 }
310 (Base::GetAssembler()->*f)(7, &label, is_bare);
311 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
312
313 std::string expected =
314 ".set noreorder\n" +
315 instr_name + " $fcc0, 1f\n" +
316 (is_bare ? "" : "nop\n") +
317 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
318 "1:\n" +
319 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
320 instr_name + " $fcc7, 1b\n" +
321 (is_bare ? "" : "nop\n") +
322 "addu $zero, $zero, $zero\n";
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -0800323 DriverStr(expected, instr_name);
324 }
325
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200326 private:
327 std::vector<mips::Register*> registers_;
328 std::map<mips::Register, std::string, MIPSCpuRegisterCompare> secondary_register_names_;
329
330 std::vector<mips::FRegister*> fp_registers_;
331};
332
333
334TEST_F(AssemblerMIPSTest, Toolchain) {
335 EXPECT_TRUE(CheckTools());
336}
337
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200338TEST_F(AssemblerMIPSTest, Addu) {
339 DriverStr(RepeatRRR(&mips::MipsAssembler::Addu, "addu ${reg1}, ${reg2}, ${reg3}"), "Addu");
340}
341
342TEST_F(AssemblerMIPSTest, Addiu) {
343 DriverStr(RepeatRRIb(&mips::MipsAssembler::Addiu, -16, "addiu ${reg1}, ${reg2}, {imm}"), "Addiu");
344}
345
346TEST_F(AssemblerMIPSTest, Subu) {
347 DriverStr(RepeatRRR(&mips::MipsAssembler::Subu, "subu ${reg1}, ${reg2}, ${reg3}"), "Subu");
348}
349
350TEST_F(AssemblerMIPSTest, MultR2) {
351 DriverStr(RepeatRR(&mips::MipsAssembler::MultR2, "mult ${reg1}, ${reg2}"), "MultR2");
352}
353
354TEST_F(AssemblerMIPSTest, MultuR2) {
355 DriverStr(RepeatRR(&mips::MipsAssembler::MultuR2, "multu ${reg1}, ${reg2}"), "MultuR2");
356}
357
358TEST_F(AssemblerMIPSTest, DivR2Basic) {
359 DriverStr(RepeatRR(&mips::MipsAssembler::DivR2, "div $zero, ${reg1}, ${reg2}"), "DivR2Basic");
360}
361
362TEST_F(AssemblerMIPSTest, DivuR2Basic) {
363 DriverStr(RepeatRR(&mips::MipsAssembler::DivuR2, "divu $zero, ${reg1}, ${reg2}"), "DivuR2Basic");
364}
365
366TEST_F(AssemblerMIPSTest, MulR2) {
367 DriverStr(RepeatRRR(&mips::MipsAssembler::MulR2, "mul ${reg1}, ${reg2}, ${reg3}"), "MulR2");
368}
369
370TEST_F(AssemblerMIPSTest, DivR2) {
371 DriverStr(RepeatRRR(&mips::MipsAssembler::DivR2, "div $zero, ${reg2}, ${reg3}\nmflo ${reg1}"),
372 "DivR2");
373}
374
375TEST_F(AssemblerMIPSTest, ModR2) {
376 DriverStr(RepeatRRR(&mips::MipsAssembler::ModR2, "div $zero, ${reg2}, ${reg3}\nmfhi ${reg1}"),
377 "ModR2");
378}
379
380TEST_F(AssemblerMIPSTest, DivuR2) {
381 DriverStr(RepeatRRR(&mips::MipsAssembler::DivuR2, "divu $zero, ${reg2}, ${reg3}\nmflo ${reg1}"),
382 "DivuR2");
383}
384
385TEST_F(AssemblerMIPSTest, ModuR2) {
386 DriverStr(RepeatRRR(&mips::MipsAssembler::ModuR2, "divu $zero, ${reg2}, ${reg3}\nmfhi ${reg1}"),
387 "ModuR2");
388}
389
390TEST_F(AssemblerMIPSTest, And) {
391 DriverStr(RepeatRRR(&mips::MipsAssembler::And, "and ${reg1}, ${reg2}, ${reg3}"), "And");
392}
393
394TEST_F(AssemblerMIPSTest, Andi) {
395 DriverStr(RepeatRRIb(&mips::MipsAssembler::Andi, 16, "andi ${reg1}, ${reg2}, {imm}"), "Andi");
396}
397
398TEST_F(AssemblerMIPSTest, Or) {
399 DriverStr(RepeatRRR(&mips::MipsAssembler::Or, "or ${reg1}, ${reg2}, ${reg3}"), "Or");
400}
401
402TEST_F(AssemblerMIPSTest, Ori) {
403 DriverStr(RepeatRRIb(&mips::MipsAssembler::Ori, 16, "ori ${reg1}, ${reg2}, {imm}"), "Ori");
404}
405
406TEST_F(AssemblerMIPSTest, Xor) {
407 DriverStr(RepeatRRR(&mips::MipsAssembler::Xor, "xor ${reg1}, ${reg2}, ${reg3}"), "Xor");
408}
409
410TEST_F(AssemblerMIPSTest, Xori) {
411 DriverStr(RepeatRRIb(&mips::MipsAssembler::Xori, 16, "xori ${reg1}, ${reg2}, {imm}"), "Xori");
412}
413
414TEST_F(AssemblerMIPSTest, Nor) {
415 DriverStr(RepeatRRR(&mips::MipsAssembler::Nor, "nor ${reg1}, ${reg2}, ${reg3}"), "Nor");
416}
417
Chris Larsen3acee732015-11-18 13:31:08 -0800418//////////
419// MISC //
420//////////
421
422TEST_F(AssemblerMIPSTest, Movz) {
423 DriverStr(RepeatRRR(&mips::MipsAssembler::Movz, "movz ${reg1}, ${reg2}, ${reg3}"), "Movz");
424}
425
426TEST_F(AssemblerMIPSTest, Movn) {
427 DriverStr(RepeatRRR(&mips::MipsAssembler::Movn, "movn ${reg1}, ${reg2}, ${reg3}"), "Movn");
428}
429
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200430TEST_F(AssemblerMIPSTest, Seb) {
431 DriverStr(RepeatRR(&mips::MipsAssembler::Seb, "seb ${reg1}, ${reg2}"), "Seb");
432}
433
434TEST_F(AssemblerMIPSTest, Seh) {
435 DriverStr(RepeatRR(&mips::MipsAssembler::Seh, "seh ${reg1}, ${reg2}"), "Seh");
436}
437
438TEST_F(AssemblerMIPSTest, Sll) {
439 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sll, 5, "sll ${reg1}, ${reg2}, {imm}"), "Sll");
440}
441
442TEST_F(AssemblerMIPSTest, Srl) {
443 DriverStr(RepeatRRIb(&mips::MipsAssembler::Srl, 5, "srl ${reg1}, ${reg2}, {imm}"), "Srl");
444}
445
446TEST_F(AssemblerMIPSTest, Sra) {
447 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sra, 5, "sra ${reg1}, ${reg2}, {imm}"), "Sra");
448}
449
450TEST_F(AssemblerMIPSTest, Sllv) {
451 DriverStr(RepeatRRR(&mips::MipsAssembler::Sllv, "sllv ${reg1}, ${reg2}, ${reg3}"), "Sllv");
452}
453
454TEST_F(AssemblerMIPSTest, Srlv) {
455 DriverStr(RepeatRRR(&mips::MipsAssembler::Srlv, "srlv ${reg1}, ${reg2}, ${reg3}"), "Srlv");
456}
457
Chris Larsen3acee732015-11-18 13:31:08 -0800458TEST_F(AssemblerMIPSTest, Rotrv) {
459 DriverStr(RepeatRRR(&mips::MipsAssembler::Rotrv, "rotrv ${reg1}, ${reg2}, ${reg3}"), "rotrv");
460}
461
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200462TEST_F(AssemblerMIPSTest, Srav) {
463 DriverStr(RepeatRRR(&mips::MipsAssembler::Srav, "srav ${reg1}, ${reg2}, ${reg3}"), "Srav");
464}
465
Alexey Frunze5c7aed32015-11-25 19:41:54 -0800466TEST_F(AssemblerMIPSTest, Ins) {
467 std::vector<mips::Register*> regs = GetRegisters();
468 WarnOnCombinations(regs.size() * regs.size() * 33 * 16);
469 std::string expected;
470 for (mips::Register* reg1 : regs) {
471 for (mips::Register* reg2 : regs) {
472 for (int32_t pos = 0; pos < 32; pos++) {
473 for (int32_t size = 1; pos + size <= 32; size++) {
474 __ Ins(*reg1, *reg2, pos, size);
475 std::ostringstream instr;
476 instr << "ins $" << *reg1 << ", $" << *reg2 << ", " << pos << ", " << size << "\n";
477 expected += instr.str();
478 }
479 }
480 }
481 }
482 DriverStr(expected, "Ins");
483}
484
485TEST_F(AssemblerMIPSTest, Ext) {
486 std::vector<mips::Register*> regs = GetRegisters();
487 WarnOnCombinations(regs.size() * regs.size() * 33 * 16);
488 std::string expected;
489 for (mips::Register* reg1 : regs) {
490 for (mips::Register* reg2 : regs) {
491 for (int32_t pos = 0; pos < 32; pos++) {
492 for (int32_t size = 1; pos + size <= 32; size++) {
493 __ Ext(*reg1, *reg2, pos, size);
494 std::ostringstream instr;
495 instr << "ext $" << *reg1 << ", $" << *reg2 << ", " << pos << ", " << size << "\n";
496 expected += instr.str();
497 }
498 }
499 }
500 }
501 DriverStr(expected, "Ext");
502}
503
Chris Larsen3acee732015-11-18 13:31:08 -0800504TEST_F(AssemblerMIPSTest, ClzR2) {
505 DriverStr(RepeatRR(&mips::MipsAssembler::ClzR2, "clz ${reg1}, ${reg2}"), "clzR2");
506}
507
508TEST_F(AssemblerMIPSTest, CloR2) {
509 DriverStr(RepeatRR(&mips::MipsAssembler::CloR2, "clo ${reg1}, ${reg2}"), "cloR2");
510}
511
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200512TEST_F(AssemblerMIPSTest, Lb) {
513 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lb, -16, "lb ${reg1}, {imm}(${reg2})"), "Lb");
514}
515
516TEST_F(AssemblerMIPSTest, Lh) {
517 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lh, -16, "lh ${reg1}, {imm}(${reg2})"), "Lh");
518}
519
Chris Larsen3acee732015-11-18 13:31:08 -0800520TEST_F(AssemblerMIPSTest, Lwl) {
521 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lwl, -16, "lwl ${reg1}, {imm}(${reg2})"), "Lwl");
522}
523
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200524TEST_F(AssemblerMIPSTest, Lw) {
525 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lw, -16, "lw ${reg1}, {imm}(${reg2})"), "Lw");
526}
527
Chris Larsen3acee732015-11-18 13:31:08 -0800528TEST_F(AssemblerMIPSTest, Lwr) {
529 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lwr, -16, "lwr ${reg1}, {imm}(${reg2})"), "Lwr");
530}
531
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200532TEST_F(AssemblerMIPSTest, Lbu) {
533 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lbu, -16, "lbu ${reg1}, {imm}(${reg2})"), "Lbu");
534}
535
536TEST_F(AssemblerMIPSTest, Lhu) {
537 DriverStr(RepeatRRIb(&mips::MipsAssembler::Lhu, -16, "lhu ${reg1}, {imm}(${reg2})"), "Lhu");
538}
539
540TEST_F(AssemblerMIPSTest, Lui) {
541 DriverStr(RepeatRIb(&mips::MipsAssembler::Lui, 16, "lui ${reg}, {imm}"), "Lui");
542}
543
544TEST_F(AssemblerMIPSTest, Mfhi) {
545 DriverStr(RepeatR(&mips::MipsAssembler::Mfhi, "mfhi ${reg}"), "Mfhi");
546}
547
548TEST_F(AssemblerMIPSTest, Mflo) {
549 DriverStr(RepeatR(&mips::MipsAssembler::Mflo, "mflo ${reg}"), "Mflo");
550}
551
552TEST_F(AssemblerMIPSTest, Sb) {
553 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sb, -16, "sb ${reg1}, {imm}(${reg2})"), "Sb");
554}
555
556TEST_F(AssemblerMIPSTest, Sh) {
557 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sh, -16, "sh ${reg1}, {imm}(${reg2})"), "Sh");
558}
559
Chris Larsen3acee732015-11-18 13:31:08 -0800560TEST_F(AssemblerMIPSTest, Swl) {
561 DriverStr(RepeatRRIb(&mips::MipsAssembler::Swl, -16, "swl ${reg1}, {imm}(${reg2})"), "Swl");
562}
563
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200564TEST_F(AssemblerMIPSTest, Sw) {
565 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sw, -16, "sw ${reg1}, {imm}(${reg2})"), "Sw");
566}
567
Chris Larsen3acee732015-11-18 13:31:08 -0800568TEST_F(AssemblerMIPSTest, Swr) {
569 DriverStr(RepeatRRIb(&mips::MipsAssembler::Swr, -16, "swr ${reg1}, {imm}(${reg2})"), "Swr");
570}
571
Alexey Frunze51aff3a2016-03-17 17:21:45 -0700572TEST_F(AssemblerMIPSTest, LlR2) {
573 DriverStr(RepeatRRIb(&mips::MipsAssembler::LlR2, -16, "ll ${reg1}, {imm}(${reg2})"), "LlR2");
574}
575
576TEST_F(AssemblerMIPSTest, ScR2) {
577 DriverStr(RepeatRRIb(&mips::MipsAssembler::ScR2, -16, "sc ${reg1}, {imm}(${reg2})"), "ScR2");
578}
579
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200580TEST_F(AssemblerMIPSTest, Slt) {
581 DriverStr(RepeatRRR(&mips::MipsAssembler::Slt, "slt ${reg1}, ${reg2}, ${reg3}"), "Slt");
582}
583
584TEST_F(AssemblerMIPSTest, Sltu) {
585 DriverStr(RepeatRRR(&mips::MipsAssembler::Sltu, "sltu ${reg1}, ${reg2}, ${reg3}"), "Sltu");
586}
587
588TEST_F(AssemblerMIPSTest, Slti) {
589 DriverStr(RepeatRRIb(&mips::MipsAssembler::Slti, -16, "slti ${reg1}, ${reg2}, {imm}"), "Slti");
590}
591
592TEST_F(AssemblerMIPSTest, Sltiu) {
593 DriverStr(RepeatRRIb(&mips::MipsAssembler::Sltiu, -16, "sltiu ${reg1}, ${reg2}, {imm}"), "Sltiu");
594}
595
596TEST_F(AssemblerMIPSTest, AddS) {
597 DriverStr(RepeatFFF(&mips::MipsAssembler::AddS, "add.s ${reg1}, ${reg2}, ${reg3}"), "AddS");
598}
599
600TEST_F(AssemblerMIPSTest, AddD) {
601 DriverStr(RepeatFFF(&mips::MipsAssembler::AddD, "add.d ${reg1}, ${reg2}, ${reg3}"), "AddD");
602}
603
604TEST_F(AssemblerMIPSTest, SubS) {
605 DriverStr(RepeatFFF(&mips::MipsAssembler::SubS, "sub.s ${reg1}, ${reg2}, ${reg3}"), "SubS");
606}
607
608TEST_F(AssemblerMIPSTest, SubD) {
609 DriverStr(RepeatFFF(&mips::MipsAssembler::SubD, "sub.d ${reg1}, ${reg2}, ${reg3}"), "SubD");
610}
611
612TEST_F(AssemblerMIPSTest, MulS) {
613 DriverStr(RepeatFFF(&mips::MipsAssembler::MulS, "mul.s ${reg1}, ${reg2}, ${reg3}"), "MulS");
614}
615
616TEST_F(AssemblerMIPSTest, MulD) {
617 DriverStr(RepeatFFF(&mips::MipsAssembler::MulD, "mul.d ${reg1}, ${reg2}, ${reg3}"), "MulD");
618}
619
620TEST_F(AssemblerMIPSTest, DivS) {
621 DriverStr(RepeatFFF(&mips::MipsAssembler::DivS, "div.s ${reg1}, ${reg2}, ${reg3}"), "DivS");
622}
623
624TEST_F(AssemblerMIPSTest, DivD) {
625 DriverStr(RepeatFFF(&mips::MipsAssembler::DivD, "div.d ${reg1}, ${reg2}, ${reg3}"), "DivD");
626}
627
628TEST_F(AssemblerMIPSTest, MovS) {
629 DriverStr(RepeatFF(&mips::MipsAssembler::MovS, "mov.s ${reg1}, ${reg2}"), "MovS");
630}
631
632TEST_F(AssemblerMIPSTest, MovD) {
633 DriverStr(RepeatFF(&mips::MipsAssembler::MovD, "mov.d ${reg1}, ${reg2}"), "MovD");
634}
635
636TEST_F(AssemblerMIPSTest, NegS) {
637 DriverStr(RepeatFF(&mips::MipsAssembler::NegS, "neg.s ${reg1}, ${reg2}"), "NegS");
638}
639
640TEST_F(AssemblerMIPSTest, NegD) {
641 DriverStr(RepeatFF(&mips::MipsAssembler::NegD, "neg.d ${reg1}, ${reg2}"), "NegD");
642}
643
Chris Larsenf09d5322016-04-22 12:06:34 -0700644TEST_F(AssemblerMIPSTest, FloorWS) {
645 DriverStr(RepeatFF(&mips::MipsAssembler::FloorWS, "floor.w.s ${reg1}, ${reg2}"), "floor.w.s");
646}
647
648TEST_F(AssemblerMIPSTest, FloorWD) {
649 DriverStr(RepeatFF(&mips::MipsAssembler::FloorWD, "floor.w.d ${reg1}, ${reg2}"), "floor.w.d");
650}
651
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -0800652TEST_F(AssemblerMIPSTest, CunS) {
653 DriverStr(RepeatIbFF(&mips::MipsAssembler::CunS, 3, "c.un.s $fcc{imm}, ${reg1}, ${reg2}"),
654 "CunS");
655}
656
657TEST_F(AssemblerMIPSTest, CeqS) {
658 DriverStr(RepeatIbFF(&mips::MipsAssembler::CeqS, 3, "c.eq.s $fcc{imm}, ${reg1}, ${reg2}"),
659 "CeqS");
660}
661
662TEST_F(AssemblerMIPSTest, CueqS) {
663 DriverStr(RepeatIbFF(&mips::MipsAssembler::CueqS, 3, "c.ueq.s $fcc{imm}, ${reg1}, ${reg2}"),
664 "CueqS");
665}
666
667TEST_F(AssemblerMIPSTest, ColtS) {
668 DriverStr(RepeatIbFF(&mips::MipsAssembler::ColtS, 3, "c.olt.s $fcc{imm}, ${reg1}, ${reg2}"),
669 "ColtS");
670}
671
672TEST_F(AssemblerMIPSTest, CultS) {
673 DriverStr(RepeatIbFF(&mips::MipsAssembler::CultS, 3, "c.ult.s $fcc{imm}, ${reg1}, ${reg2}"),
674 "CultS");
675}
676
677TEST_F(AssemblerMIPSTest, ColeS) {
678 DriverStr(RepeatIbFF(&mips::MipsAssembler::ColeS, 3, "c.ole.s $fcc{imm}, ${reg1}, ${reg2}"),
679 "ColeS");
680}
681
682TEST_F(AssemblerMIPSTest, CuleS) {
683 DriverStr(RepeatIbFF(&mips::MipsAssembler::CuleS, 3, "c.ule.s $fcc{imm}, ${reg1}, ${reg2}"),
684 "CuleS");
685}
686
687TEST_F(AssemblerMIPSTest, CunD) {
688 DriverStr(RepeatIbFF(&mips::MipsAssembler::CunD, 3, "c.un.d $fcc{imm}, ${reg1}, ${reg2}"),
689 "CunD");
690}
691
692TEST_F(AssemblerMIPSTest, CeqD) {
693 DriverStr(RepeatIbFF(&mips::MipsAssembler::CeqD, 3, "c.eq.d $fcc{imm}, ${reg1}, ${reg2}"),
694 "CeqD");
695}
696
697TEST_F(AssemblerMIPSTest, CueqD) {
698 DriverStr(RepeatIbFF(&mips::MipsAssembler::CueqD, 3, "c.ueq.d $fcc{imm}, ${reg1}, ${reg2}"),
699 "CueqD");
700}
701
702TEST_F(AssemblerMIPSTest, ColtD) {
703 DriverStr(RepeatIbFF(&mips::MipsAssembler::ColtD, 3, "c.olt.d $fcc{imm}, ${reg1}, ${reg2}"),
704 "ColtD");
705}
706
707TEST_F(AssemblerMIPSTest, CultD) {
708 DriverStr(RepeatIbFF(&mips::MipsAssembler::CultD, 3, "c.ult.d $fcc{imm}, ${reg1}, ${reg2}"),
709 "CultD");
710}
711
712TEST_F(AssemblerMIPSTest, ColeD) {
713 DriverStr(RepeatIbFF(&mips::MipsAssembler::ColeD, 3, "c.ole.d $fcc{imm}, ${reg1}, ${reg2}"),
714 "ColeD");
715}
716
717TEST_F(AssemblerMIPSTest, CuleD) {
718 DriverStr(RepeatIbFF(&mips::MipsAssembler::CuleD, 3, "c.ule.d $fcc{imm}, ${reg1}, ${reg2}"),
719 "CuleD");
720}
721
722TEST_F(AssemblerMIPSTest, Movf) {
723 DriverStr(RepeatRRIb(&mips::MipsAssembler::Movf, 3, "movf ${reg1}, ${reg2}, $fcc{imm}"), "Movf");
724}
725
726TEST_F(AssemblerMIPSTest, Movt) {
727 DriverStr(RepeatRRIb(&mips::MipsAssembler::Movt, 3, "movt ${reg1}, ${reg2}, $fcc{imm}"), "Movt");
728}
729
Alexey Frunzea8aaf5a2016-06-27 14:48:20 -0700730TEST_F(AssemblerMIPSTest, MovfS) {
731 DriverStr(RepeatFFIb(&mips::MipsAssembler::MovfS, 3, "movf.s ${reg1}, ${reg2}, $fcc{imm}"),
732 "MovfS");
733}
734
735TEST_F(AssemblerMIPSTest, MovfD) {
736 DriverStr(RepeatFFIb(&mips::MipsAssembler::MovfD, 3, "movf.d ${reg1}, ${reg2}, $fcc{imm}"),
737 "MovfD");
738}
739
740TEST_F(AssemblerMIPSTest, MovtS) {
741 DriverStr(RepeatFFIb(&mips::MipsAssembler::MovtS, 3, "movt.s ${reg1}, ${reg2}, $fcc{imm}"),
742 "MovtS");
743}
744
745TEST_F(AssemblerMIPSTest, MovtD) {
746 DriverStr(RepeatFFIb(&mips::MipsAssembler::MovtD, 3, "movt.d ${reg1}, ${reg2}, $fcc{imm}"),
747 "MovtD");
748}
749
Alexey Frunze674b9ee2016-09-20 14:54:15 -0700750TEST_F(AssemblerMIPSTest, MovzS) {
751 DriverStr(RepeatFFR(&mips::MipsAssembler::MovzS, "movz.s ${reg1}, ${reg2}, ${reg3}"), "MovzS");
752}
753
754TEST_F(AssemblerMIPSTest, MovzD) {
755 DriverStr(RepeatFFR(&mips::MipsAssembler::MovzD, "movz.d ${reg1}, ${reg2}, ${reg3}"), "MovzD");
756}
757
758TEST_F(AssemblerMIPSTest, MovnS) {
759 DriverStr(RepeatFFR(&mips::MipsAssembler::MovnS, "movn.s ${reg1}, ${reg2}, ${reg3}"), "MovnS");
760}
761
762TEST_F(AssemblerMIPSTest, MovnD) {
763 DriverStr(RepeatFFR(&mips::MipsAssembler::MovnD, "movn.d ${reg1}, ${reg2}, ${reg3}"), "MovnD");
764}
765
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200766TEST_F(AssemblerMIPSTest, CvtSW) {
767 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtsw, "cvt.s.w ${reg1}, ${reg2}"), "CvtSW");
768}
769
770TEST_F(AssemblerMIPSTest, CvtDW) {
771 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtdw, "cvt.d.w ${reg1}, ${reg2}"), "CvtDW");
772}
773
Alexey Frunzebaf60b72015-12-22 15:15:03 -0800774TEST_F(AssemblerMIPSTest, CvtSL) {
775 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtsl, "cvt.s.l ${reg1}, ${reg2}"), "CvtSL");
776}
777
778TEST_F(AssemblerMIPSTest, CvtDL) {
779 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtdl, "cvt.d.l ${reg1}, ${reg2}"), "CvtDL");
780}
781
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200782TEST_F(AssemblerMIPSTest, CvtSD) {
783 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtsd, "cvt.s.d ${reg1}, ${reg2}"), "CvtSD");
784}
785
786TEST_F(AssemblerMIPSTest, CvtDS) {
787 DriverStr(RepeatFF(&mips::MipsAssembler::Cvtds, "cvt.d.s ${reg1}, ${reg2}"), "CvtDS");
788}
789
Alexey Frunzebaf60b72015-12-22 15:15:03 -0800790TEST_F(AssemblerMIPSTest, TruncWS) {
791 DriverStr(RepeatFF(&mips::MipsAssembler::TruncWS, "trunc.w.s ${reg1}, ${reg2}"), "TruncWS");
792}
793
794TEST_F(AssemblerMIPSTest, TruncWD) {
795 DriverStr(RepeatFF(&mips::MipsAssembler::TruncWD, "trunc.w.d ${reg1}, ${reg2}"), "TruncWD");
796}
797
798TEST_F(AssemblerMIPSTest, TruncLS) {
799 DriverStr(RepeatFF(&mips::MipsAssembler::TruncLS, "trunc.l.s ${reg1}, ${reg2}"), "TruncLS");
800}
801
802TEST_F(AssemblerMIPSTest, TruncLD) {
803 DriverStr(RepeatFF(&mips::MipsAssembler::TruncLD, "trunc.l.d ${reg1}, ${reg2}"), "TruncLD");
804}
805
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200806TEST_F(AssemblerMIPSTest, Mfc1) {
807 DriverStr(RepeatRF(&mips::MipsAssembler::Mfc1, "mfc1 ${reg1}, ${reg2}"), "Mfc1");
808}
809
810TEST_F(AssemblerMIPSTest, Mtc1) {
811 DriverStr(RepeatRF(&mips::MipsAssembler::Mtc1, "mtc1 ${reg1}, ${reg2}"), "Mtc1");
812}
813
814TEST_F(AssemblerMIPSTest, Mfhc1) {
815 DriverStr(RepeatRF(&mips::MipsAssembler::Mfhc1, "mfhc1 ${reg1}, ${reg2}"), "Mfhc1");
816}
817
818TEST_F(AssemblerMIPSTest, Mthc1) {
819 DriverStr(RepeatRF(&mips::MipsAssembler::Mthc1, "mthc1 ${reg1}, ${reg2}"), "Mthc1");
820}
821
822TEST_F(AssemblerMIPSTest, Lwc1) {
823 DriverStr(RepeatFRIb(&mips::MipsAssembler::Lwc1, -16, "lwc1 ${reg1}, {imm}(${reg2})"), "Lwc1");
824}
825
826TEST_F(AssemblerMIPSTest, Ldc1) {
827 DriverStr(RepeatFRIb(&mips::MipsAssembler::Ldc1, -16, "ldc1 ${reg1}, {imm}(${reg2})"), "Ldc1");
828}
829
830TEST_F(AssemblerMIPSTest, Swc1) {
831 DriverStr(RepeatFRIb(&mips::MipsAssembler::Swc1, -16, "swc1 ${reg1}, {imm}(${reg2})"), "Swc1");
832}
833
834TEST_F(AssemblerMIPSTest, Sdc1) {
835 DriverStr(RepeatFRIb(&mips::MipsAssembler::Sdc1, -16, "sdc1 ${reg1}, {imm}(${reg2})"), "Sdc1");
836}
837
838TEST_F(AssemblerMIPSTest, Move) {
839 DriverStr(RepeatRR(&mips::MipsAssembler::Move, "or ${reg1}, ${reg2}, $zero"), "Move");
840}
841
842TEST_F(AssemblerMIPSTest, Clear) {
843 DriverStr(RepeatR(&mips::MipsAssembler::Clear, "or ${reg}, $zero, $zero"), "Clear");
844}
845
846TEST_F(AssemblerMIPSTest, Not) {
847 DriverStr(RepeatRR(&mips::MipsAssembler::Not, "nor ${reg1}, ${reg2}, $zero"), "Not");
848}
849
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700850TEST_F(AssemblerMIPSTest, Addiu32) {
851 __ Addiu32(mips::A1, mips::A2, -0x8000);
852 __ Addiu32(mips::A1, mips::A2, +0);
853 __ Addiu32(mips::A1, mips::A2, +0x7FFF);
854 __ Addiu32(mips::A1, mips::A2, -0x10000);
855 __ Addiu32(mips::A1, mips::A2, -0x8001);
856 __ Addiu32(mips::A1, mips::A2, +0x8000);
857 __ Addiu32(mips::A1, mips::A2, +0xFFFE);
858 __ Addiu32(mips::A1, mips::A2, -0x10001);
859 __ Addiu32(mips::A1, mips::A2, +0xFFFF);
860 __ Addiu32(mips::A1, mips::A2, +0x10000);
861 __ Addiu32(mips::A1, mips::A2, +0x10001);
862 __ Addiu32(mips::A1, mips::A2, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200863
864 const char* expected =
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700865 "addiu $a1, $a2, -0x8000\n"
866 "addiu $a1, $a2, 0\n"
867 "addiu $a1, $a2, 0x7FFF\n"
868 "addiu $at, $a2, -0x8000\n"
869 "addiu $a1, $at, -0x8000\n"
870 "addiu $at, $a2, -0x8000\n"
871 "addiu $a1, $at, -1\n"
872 "addiu $at, $a2, 0x7FFF\n"
873 "addiu $a1, $at, 1\n"
874 "addiu $at, $a2, 0x7FFF\n"
875 "addiu $a1, $at, 0x7FFF\n"
876 "lui $at, 0xFFFE\n"
877 "ori $at, $at, 0xFFFF\n"
878 "addu $a1, $a2, $at\n"
879 "ori $at, $zero, 0xFFFF\n"
880 "addu $a1, $a2, $at\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200881 "lui $at, 1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700882 "addu $a1, $a2, $at\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200883 "lui $at, 1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700884 "ori $at, $at, 1\n"
885 "addu $a1, $a2, $at\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200886 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700887 "ori $at, $at, 0x5678\n"
888 "addu $a1, $a2, $at\n";
889 DriverStr(expected, "Addiu32");
890}
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +0200891
Alexey Frunzecad3a4c2016-06-07 23:40:37 -0700892TEST_F(AssemblerMIPSTest, LoadFromOffset) {
893 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x8000);
894 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0);
895 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x7FF8);
896 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x7FFB);
897 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x7FFC);
898 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x7FFF);
899 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0xFFF0);
900 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x8008);
901 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x8001);
902 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x8000);
903 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0xFFF0);
904 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x17FE8);
905 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x0FFF8);
906 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x0FFF1);
907 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x0FFF1);
908 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x0FFF8);
909 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x17FE8);
910 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x17FF0);
911 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, -0x17FE9);
912 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x17FE9);
913 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x17FF0);
914 __ LoadFromOffset(mips::kLoadSignedByte, mips::A3, mips::A1, +0x12345678);
915
916 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x8000);
917 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0);
918 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x7FF8);
919 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x7FFB);
920 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x7FFC);
921 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x7FFF);
922 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0xFFF0);
923 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x8008);
924 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x8001);
925 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x8000);
926 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0xFFF0);
927 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x17FE8);
928 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x0FFF8);
929 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x0FFF1);
930 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x0FFF1);
931 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x0FFF8);
932 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x17FE8);
933 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x17FF0);
934 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, -0x17FE9);
935 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x17FE9);
936 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x17FF0);
937 __ LoadFromOffset(mips::kLoadUnsignedByte, mips::A3, mips::A1, +0x12345678);
938
939 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x8000);
940 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0);
941 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x7FF8);
942 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x7FFB);
943 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x7FFC);
944 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x7FFF);
945 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0xFFF0);
946 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x8008);
947 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x8001);
948 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x8000);
949 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0xFFF0);
950 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x17FE8);
951 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x0FFF8);
952 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x0FFF1);
953 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x0FFF1);
954 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x0FFF8);
955 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x17FE8);
956 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x17FF0);
957 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, -0x17FE9);
958 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x17FE9);
959 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x17FF0);
960 __ LoadFromOffset(mips::kLoadSignedHalfword, mips::A3, mips::A1, +0x12345678);
961
962 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x8000);
963 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0);
964 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x7FF8);
965 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x7FFB);
966 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x7FFC);
967 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x7FFF);
968 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0xFFF0);
969 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x8008);
970 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x8001);
971 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x8000);
972 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0xFFF0);
973 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x17FE8);
974 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x0FFF8);
975 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x0FFF1);
976 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x0FFF1);
977 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x0FFF8);
978 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x17FE8);
979 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x17FF0);
980 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, -0x17FE9);
981 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x17FE9);
982 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x17FF0);
983 __ LoadFromOffset(mips::kLoadUnsignedHalfword, mips::A3, mips::A1, +0x12345678);
984
985 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x8000);
986 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0);
987 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x7FF8);
988 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x7FFB);
989 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x7FFC);
990 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x7FFF);
991 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0xFFF0);
992 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x8008);
993 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x8001);
994 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x8000);
995 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0xFFF0);
996 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x17FE8);
997 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x0FFF8);
998 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x0FFF1);
999 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x0FFF1);
1000 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x0FFF8);
1001 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x17FE8);
1002 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x17FF0);
1003 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, -0x17FE9);
1004 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x17FE9);
1005 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x17FF0);
1006 __ LoadFromOffset(mips::kLoadWord, mips::A3, mips::A1, +0x12345678);
1007
1008 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x8000);
1009 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0);
1010 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x7FF8);
1011 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x7FFB);
1012 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x7FFC);
1013 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x7FFF);
1014 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0xFFF0);
1015 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x8008);
1016 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x8001);
1017 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x8000);
1018 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0xFFF0);
1019 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x17FE8);
1020 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x0FFF8);
1021 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x0FFF1);
1022 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x0FFF1);
1023 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x0FFF8);
1024 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x17FE8);
1025 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x17FF0);
1026 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, -0x17FE9);
1027 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x17FE9);
1028 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x17FF0);
1029 __ LoadFromOffset(mips::kLoadDoubleword, mips::A0, mips::A2, +0x12345678);
1030
1031 const char* expected =
1032 "lb $a3, -0x8000($a1)\n"
1033 "lb $a3, 0($a1)\n"
1034 "lb $a3, 0x7FF8($a1)\n"
1035 "lb $a3, 0x7FFB($a1)\n"
1036 "lb $a3, 0x7FFC($a1)\n"
1037 "lb $a3, 0x7FFF($a1)\n"
1038 "addiu $at, $a1, -0x7FF8\n"
1039 "lb $a3, -0x7FF8($at)\n"
1040 "addiu $at, $a1, -0x7FF8\n"
1041 "lb $a3, -0x10($at)\n"
1042 "addiu $at, $a1, -0x7FF8\n"
1043 "lb $a3, -9($at)\n"
1044 "addiu $at, $a1, 0x7FF8\n"
1045 "lb $a3, 8($at)\n"
1046 "addiu $at, $a1, 0x7FF8\n"
1047 "lb $a3, 0x7FF8($at)\n"
1048 "addiu $at, $a1, -0x7FF8\n"
1049 "addiu $at, $at, -0x7FF8\n"
1050 "lb $a3, -0x7FF8($at)\n"
1051 "addiu $at, $a1, -0x7FF8\n"
1052 "addiu $at, $at, -0x7FF8\n"
1053 "lb $a3, -8($at)\n"
1054 "addiu $at, $a1, -0x7FF8\n"
1055 "addiu $at, $at, -0x7FF8\n"
1056 "lb $a3, -1($at)\n"
1057 "addiu $at, $a1, 0x7FF8\n"
1058 "addiu $at, $at, 0x7FF8\n"
1059 "lb $a3, 1($at)\n"
1060 "addiu $at, $a1, 0x7FF8\n"
1061 "addiu $at, $at, 0x7FF8\n"
1062 "lb $a3, 8($at)\n"
1063 "addiu $at, $a1, 0x7FF8\n"
1064 "addiu $at, $at, 0x7FF8\n"
1065 "lb $a3, 0x7FF8($at)\n"
1066 "lui $at, 0xFFFE\n"
1067 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001068 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001069 "lb $a3, 0($at)\n"
1070 "lui $at, 0xFFFE\n"
1071 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001072 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001073 "lb $a3, 7($at)\n"
1074 "lui $at, 0x1\n"
1075 "ori $at, $at, 0x7FE8\n"
1076 "addu $at, $at, $a1\n"
1077 "lb $a3, 1($at)\n"
1078 "lui $at, 0x1\n"
1079 "ori $at, $at, 0x7FF0\n"
1080 "addu $at, $at, $a1\n"
1081 "lb $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001082 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001083 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001084 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001085 "lb $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001086
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001087 "lbu $a3, -0x8000($a1)\n"
1088 "lbu $a3, 0($a1)\n"
1089 "lbu $a3, 0x7FF8($a1)\n"
1090 "lbu $a3, 0x7FFB($a1)\n"
1091 "lbu $a3, 0x7FFC($a1)\n"
1092 "lbu $a3, 0x7FFF($a1)\n"
1093 "addiu $at, $a1, -0x7FF8\n"
1094 "lbu $a3, -0x7FF8($at)\n"
1095 "addiu $at, $a1, -0x7FF8\n"
1096 "lbu $a3, -0x10($at)\n"
1097 "addiu $at, $a1, -0x7FF8\n"
1098 "lbu $a3, -9($at)\n"
1099 "addiu $at, $a1, 0x7FF8\n"
1100 "lbu $a3, 8($at)\n"
1101 "addiu $at, $a1, 0x7FF8\n"
1102 "lbu $a3, 0x7FF8($at)\n"
1103 "addiu $at, $a1, -0x7FF8\n"
1104 "addiu $at, $at, -0x7FF8\n"
1105 "lbu $a3, -0x7FF8($at)\n"
1106 "addiu $at, $a1, -0x7FF8\n"
1107 "addiu $at, $at, -0x7FF8\n"
1108 "lbu $a3, -8($at)\n"
1109 "addiu $at, $a1, -0x7FF8\n"
1110 "addiu $at, $at, -0x7FF8\n"
1111 "lbu $a3, -1($at)\n"
1112 "addiu $at, $a1, 0x7FF8\n"
1113 "addiu $at, $at, 0x7FF8\n"
1114 "lbu $a3, 1($at)\n"
1115 "addiu $at, $a1, 0x7FF8\n"
1116 "addiu $at, $at, 0x7FF8\n"
1117 "lbu $a3, 8($at)\n"
1118 "addiu $at, $a1, 0x7FF8\n"
1119 "addiu $at, $at, 0x7FF8\n"
1120 "lbu $a3, 0x7FF8($at)\n"
1121 "lui $at, 0xFFFE\n"
1122 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001123 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001124 "lbu $a3, 0($at)\n"
1125 "lui $at, 0xFFFE\n"
1126 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001127 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001128 "lbu $a3, 7($at)\n"
1129 "lui $at, 0x1\n"
1130 "ori $at, $at, 0x7FE8\n"
1131 "addu $at, $at, $a1\n"
1132 "lbu $a3, 1($at)\n"
1133 "lui $at, 0x1\n"
1134 "ori $at, $at, 0x7FF0\n"
1135 "addu $at, $at, $a1\n"
1136 "lbu $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001137 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001138 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001139 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001140 "lbu $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001141
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001142 "lh $a3, -0x8000($a1)\n"
1143 "lh $a3, 0($a1)\n"
1144 "lh $a3, 0x7FF8($a1)\n"
1145 "lh $a3, 0x7FFB($a1)\n"
1146 "lh $a3, 0x7FFC($a1)\n"
1147 "lh $a3, 0x7FFF($a1)\n"
1148 "addiu $at, $a1, -0x7FF8\n"
1149 "lh $a3, -0x7FF8($at)\n"
1150 "addiu $at, $a1, -0x7FF8\n"
1151 "lh $a3, -0x10($at)\n"
1152 "addiu $at, $a1, -0x7FF8\n"
1153 "lh $a3, -9($at)\n"
1154 "addiu $at, $a1, 0x7FF8\n"
1155 "lh $a3, 8($at)\n"
1156 "addiu $at, $a1, 0x7FF8\n"
1157 "lh $a3, 0x7FF8($at)\n"
1158 "addiu $at, $a1, -0x7FF8\n"
1159 "addiu $at, $at, -0x7FF8\n"
1160 "lh $a3, -0x7FF8($at)\n"
1161 "addiu $at, $a1, -0x7FF8\n"
1162 "addiu $at, $at, -0x7FF8\n"
1163 "lh $a3, -8($at)\n"
1164 "addiu $at, $a1, -0x7FF8\n"
1165 "addiu $at, $at, -0x7FF8\n"
1166 "lh $a3, -1($at)\n"
1167 "addiu $at, $a1, 0x7FF8\n"
1168 "addiu $at, $at, 0x7FF8\n"
1169 "lh $a3, 1($at)\n"
1170 "addiu $at, $a1, 0x7FF8\n"
1171 "addiu $at, $at, 0x7FF8\n"
1172 "lh $a3, 8($at)\n"
1173 "addiu $at, $a1, 0x7FF8\n"
1174 "addiu $at, $at, 0x7FF8\n"
1175 "lh $a3, 0x7FF8($at)\n"
1176 "lui $at, 0xFFFE\n"
1177 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001178 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001179 "lh $a3, 0($at)\n"
1180 "lui $at, 0xFFFE\n"
1181 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001182 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001183 "lh $a3, 7($at)\n"
1184 "lui $at, 0x1\n"
1185 "ori $at, $at, 0x7FE8\n"
1186 "addu $at, $at, $a1\n"
1187 "lh $a3, 1($at)\n"
1188 "lui $at, 0x1\n"
1189 "ori $at, $at, 0x7FF0\n"
1190 "addu $at, $at, $a1\n"
1191 "lh $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001192 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001193 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001194 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001195 "lh $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001196
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001197 "lhu $a3, -0x8000($a1)\n"
1198 "lhu $a3, 0($a1)\n"
1199 "lhu $a3, 0x7FF8($a1)\n"
1200 "lhu $a3, 0x7FFB($a1)\n"
1201 "lhu $a3, 0x7FFC($a1)\n"
1202 "lhu $a3, 0x7FFF($a1)\n"
1203 "addiu $at, $a1, -0x7FF8\n"
1204 "lhu $a3, -0x7FF8($at)\n"
1205 "addiu $at, $a1, -0x7FF8\n"
1206 "lhu $a3, -0x10($at)\n"
1207 "addiu $at, $a1, -0x7FF8\n"
1208 "lhu $a3, -9($at)\n"
1209 "addiu $at, $a1, 0x7FF8\n"
1210 "lhu $a3, 8($at)\n"
1211 "addiu $at, $a1, 0x7FF8\n"
1212 "lhu $a3, 0x7FF8($at)\n"
1213 "addiu $at, $a1, -0x7FF8\n"
1214 "addiu $at, $at, -0x7FF8\n"
1215 "lhu $a3, -0x7FF8($at)\n"
1216 "addiu $at, $a1, -0x7FF8\n"
1217 "addiu $at, $at, -0x7FF8\n"
1218 "lhu $a3, -8($at)\n"
1219 "addiu $at, $a1, -0x7FF8\n"
1220 "addiu $at, $at, -0x7FF8\n"
1221 "lhu $a3, -1($at)\n"
1222 "addiu $at, $a1, 0x7FF8\n"
1223 "addiu $at, $at, 0x7FF8\n"
1224 "lhu $a3, 1($at)\n"
1225 "addiu $at, $a1, 0x7FF8\n"
1226 "addiu $at, $at, 0x7FF8\n"
1227 "lhu $a3, 8($at)\n"
1228 "addiu $at, $a1, 0x7FF8\n"
1229 "addiu $at, $at, 0x7FF8\n"
1230 "lhu $a3, 0x7FF8($at)\n"
1231 "lui $at, 0xFFFE\n"
1232 "ori $at, $at, 0x8010\n"
1233 "addu $at, $at, $a1\n"
1234 "lhu $a3, 0($at)\n"
1235 "lui $at, 0xFFFE\n"
1236 "ori $at, $at, 0x8010\n"
1237 "addu $at, $at, $a1\n"
1238 "lhu $a3, 7($at)\n"
1239 "lui $at, 0x1\n"
1240 "ori $at, $at, 0x7FE8\n"
1241 "addu $at, $at, $a1\n"
1242 "lhu $a3, 1($at)\n"
1243 "lui $at, 0x1\n"
1244 "ori $at, $at, 0x7FF0\n"
1245 "addu $at, $at, $a1\n"
1246 "lhu $a3, 0($at)\n"
1247 "lui $at, 0x1234\n"
1248 "ori $at, $at, 0x5678\n"
1249 "addu $at, $at, $a1\n"
1250 "lhu $a3, 0($at)\n"
1251
1252 "lw $a3, -0x8000($a1)\n"
1253 "lw $a3, 0($a1)\n"
1254 "lw $a3, 0x7FF8($a1)\n"
1255 "lw $a3, 0x7FFB($a1)\n"
1256 "lw $a3, 0x7FFC($a1)\n"
1257 "lw $a3, 0x7FFF($a1)\n"
1258 "addiu $at, $a1, -0x7FF8\n"
1259 "lw $a3, -0x7FF8($at)\n"
1260 "addiu $at, $a1, -0x7FF8\n"
1261 "lw $a3, -0x10($at)\n"
1262 "addiu $at, $a1, -0x7FF8\n"
1263 "lw $a3, -9($at)\n"
1264 "addiu $at, $a1, 0x7FF8\n"
1265 "lw $a3, 8($at)\n"
1266 "addiu $at, $a1, 0x7FF8\n"
1267 "lw $a3, 0x7FF8($at)\n"
1268 "addiu $at, $a1, -0x7FF8\n"
1269 "addiu $at, $at, -0x7FF8\n"
1270 "lw $a3, -0x7FF8($at)\n"
1271 "addiu $at, $a1, -0x7FF8\n"
1272 "addiu $at, $at, -0x7FF8\n"
1273 "lw $a3, -8($at)\n"
1274 "addiu $at, $a1, -0x7FF8\n"
1275 "addiu $at, $at, -0x7FF8\n"
1276 "lw $a3, -1($at)\n"
1277 "addiu $at, $a1, 0x7FF8\n"
1278 "addiu $at, $at, 0x7FF8\n"
1279 "lw $a3, 1($at)\n"
1280 "addiu $at, $a1, 0x7FF8\n"
1281 "addiu $at, $at, 0x7FF8\n"
1282 "lw $a3, 8($at)\n"
1283 "addiu $at, $a1, 0x7FF8\n"
1284 "addiu $at, $at, 0x7FF8\n"
1285 "lw $a3, 0x7FF8($at)\n"
1286 "lui $at, 0xFFFE\n"
1287 "ori $at, $at, 0x8010\n"
1288 "addu $at, $at, $a1\n"
1289 "lw $a3, 0($at)\n"
1290 "lui $at, 0xFFFE\n"
1291 "ori $at, $at, 0x8010\n"
1292 "addu $at, $at, $a1\n"
1293 "lw $a3, 7($at)\n"
1294 "lui $at, 0x1\n"
1295 "ori $at, $at, 0x7FE8\n"
1296 "addu $at, $at, $a1\n"
1297 "lw $a3, 1($at)\n"
1298 "lui $at, 0x1\n"
1299 "ori $at, $at, 0x7FF0\n"
1300 "addu $at, $at, $a1\n"
1301 "lw $a3, 0($at)\n"
1302 "lui $at, 0x1234\n"
1303 "ori $at, $at, 0x5678\n"
1304 "addu $at, $at, $a1\n"
1305 "lw $a3, 0($at)\n"
1306
1307 "lw $a0, -0x8000($a2)\n"
1308 "lw $a1, -0x7FFC($a2)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001309 "lw $a0, 0($a2)\n"
1310 "lw $a1, 4($a2)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001311 "lw $a0, 0x7FF8($a2)\n"
1312 "lw $a1, 0x7FFC($a2)\n"
1313 "lw $a0, 0x7FFB($a2)\n"
1314 "lw $a1, 0x7FFF($a2)\n"
1315 "addiu $at, $a2, 0x7FF8\n"
1316 "lw $a0, 4($at)\n"
1317 "lw $a1, 8($at)\n"
1318 "addiu $at, $a2, 0x7FF8\n"
1319 "lw $a0, 7($at)\n"
1320 "lw $a1, 11($at)\n"
1321 "addiu $at, $a2, -0x7FF8\n"
1322 "lw $a0, -0x7FF8($at)\n"
1323 "lw $a1, -0x7FF4($at)\n"
1324 "addiu $at, $a2, -0x7FF8\n"
1325 "lw $a0, -0x10($at)\n"
1326 "lw $a1, -0xC($at)\n"
1327 "addiu $at, $a2, -0x7FF8\n"
1328 "lw $a0, -9($at)\n"
1329 "lw $a1, -5($at)\n"
1330 "addiu $at, $a2, 0x7FF8\n"
1331 "lw $a0, 8($at)\n"
1332 "lw $a1, 12($at)\n"
1333 "addiu $at, $a2, 0x7FF8\n"
1334 "lw $a0, 0x7FF8($at)\n"
1335 "lw $a1, 0x7FFC($at)\n"
1336 "addiu $at, $a2, -0x7FF8\n"
1337 "addiu $at, $at, -0x7FF8\n"
1338 "lw $a0, -0x7FF8($at)\n"
1339 "lw $a1, -0x7FF4($at)\n"
1340 "addiu $at, $a2, -0x7FF8\n"
1341 "addiu $at, $at, -0x7FF8\n"
1342 "lw $a0, -8($at)\n"
1343 "lw $a1, -4($at)\n"
1344 "addiu $at, $a2, -0x7FF8\n"
1345 "addiu $at, $at, -0x7FF8\n"
1346 "lw $a0, -1($at)\n"
1347 "lw $a1, 3($at)\n"
1348 "addiu $at, $a2, 0x7FF8\n"
1349 "addiu $at, $at, 0x7FF8\n"
1350 "lw $a0, 1($at)\n"
1351 "lw $a1, 5($at)\n"
1352 "addiu $at, $a2, 0x7FF8\n"
1353 "addiu $at, $at, 0x7FF8\n"
1354 "lw $a0, 8($at)\n"
1355 "lw $a1, 12($at)\n"
1356 "addiu $at, $a2, 0x7FF8\n"
1357 "addiu $at, $at, 0x7FF8\n"
1358 "lw $a0, 0x7FF8($at)\n"
1359 "lw $a1, 0x7FFC($at)\n"
1360 "lui $at, 0xFFFE\n"
1361 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001362 "addu $at, $at, $a2\n"
1363 "lw $a0, 0($at)\n"
1364 "lw $a1, 4($at)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001365 "lui $at, 0xFFFE\n"
1366 "ori $at, $at, 0x8010\n"
1367 "addu $at, $at, $a2\n"
1368 "lw $a0, 7($at)\n"
1369 "lw $a1, 11($at)\n"
1370 "lui $at, 0x1\n"
1371 "ori $at, $at, 0x7FE8\n"
1372 "addu $at, $at, $a2\n"
1373 "lw $a0, 1($at)\n"
1374 "lw $a1, 5($at)\n"
1375 "lui $at, 0x1\n"
1376 "ori $at, $at, 0x7FF0\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001377 "addu $at, $at, $a2\n"
1378 "lw $a0, 0($at)\n"
1379 "lw $a1, 4($at)\n"
1380 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001381 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001382 "addu $at, $at, $a2\n"
1383 "lw $a0, 0($at)\n"
1384 "lw $a1, 4($at)\n";
1385 DriverStr(expected, "LoadFromOffset");
1386}
1387
1388TEST_F(AssemblerMIPSTest, LoadSFromOffset) {
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001389 __ LoadSFromOffset(mips::F2, mips::A0, -0x8000);
1390 __ LoadSFromOffset(mips::F2, mips::A0, +0);
1391 __ LoadSFromOffset(mips::F2, mips::A0, +0x7FF8);
1392 __ LoadSFromOffset(mips::F2, mips::A0, +0x7FFB);
1393 __ LoadSFromOffset(mips::F2, mips::A0, +0x7FFC);
1394 __ LoadSFromOffset(mips::F2, mips::A0, +0x7FFF);
1395 __ LoadSFromOffset(mips::F2, mips::A0, -0xFFF0);
1396 __ LoadSFromOffset(mips::F2, mips::A0, -0x8008);
1397 __ LoadSFromOffset(mips::F2, mips::A0, -0x8001);
1398 __ LoadSFromOffset(mips::F2, mips::A0, +0x8000);
1399 __ LoadSFromOffset(mips::F2, mips::A0, +0xFFF0);
1400 __ LoadSFromOffset(mips::F2, mips::A0, -0x17FE8);
1401 __ LoadSFromOffset(mips::F2, mips::A0, -0x0FFF8);
1402 __ LoadSFromOffset(mips::F2, mips::A0, -0x0FFF1);
1403 __ LoadSFromOffset(mips::F2, mips::A0, +0x0FFF1);
1404 __ LoadSFromOffset(mips::F2, mips::A0, +0x0FFF8);
1405 __ LoadSFromOffset(mips::F2, mips::A0, +0x17FE8);
1406 __ LoadSFromOffset(mips::F2, mips::A0, -0x17FF0);
1407 __ LoadSFromOffset(mips::F2, mips::A0, -0x17FE9);
1408 __ LoadSFromOffset(mips::F2, mips::A0, +0x17FE9);
1409 __ LoadSFromOffset(mips::F2, mips::A0, +0x17FF0);
1410 __ LoadSFromOffset(mips::F2, mips::A0, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001411
1412 const char* expected =
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001413 "lwc1 $f2, -0x8000($a0)\n"
1414 "lwc1 $f2, 0($a0)\n"
1415 "lwc1 $f2, 0x7FF8($a0)\n"
1416 "lwc1 $f2, 0x7FFB($a0)\n"
1417 "lwc1 $f2, 0x7FFC($a0)\n"
1418 "lwc1 $f2, 0x7FFF($a0)\n"
1419 "addiu $at, $a0, -0x7FF8\n"
1420 "lwc1 $f2, -0x7FF8($at)\n"
1421 "addiu $at, $a0, -0x7FF8\n"
1422 "lwc1 $f2, -0x10($at)\n"
1423 "addiu $at, $a0, -0x7FF8\n"
1424 "lwc1 $f2, -9($at)\n"
1425 "addiu $at, $a0, 0x7FF8\n"
1426 "lwc1 $f2, 8($at)\n"
1427 "addiu $at, $a0, 0x7FF8\n"
1428 "lwc1 $f2, 0x7FF8($at)\n"
1429 "addiu $at, $a0, -0x7FF8\n"
1430 "addiu $at, $at, -0x7FF8\n"
1431 "lwc1 $f2, -0x7FF8($at)\n"
1432 "addiu $at, $a0, -0x7FF8\n"
1433 "addiu $at, $at, -0x7FF8\n"
1434 "lwc1 $f2, -8($at)\n"
1435 "addiu $at, $a0, -0x7FF8\n"
1436 "addiu $at, $at, -0x7FF8\n"
1437 "lwc1 $f2, -1($at)\n"
1438 "addiu $at, $a0, 0x7FF8\n"
1439 "addiu $at, $at, 0x7FF8\n"
1440 "lwc1 $f2, 1($at)\n"
1441 "addiu $at, $a0, 0x7FF8\n"
1442 "addiu $at, $at, 0x7FF8\n"
1443 "lwc1 $f2, 8($at)\n"
1444 "addiu $at, $a0, 0x7FF8\n"
1445 "addiu $at, $at, 0x7FF8\n"
1446 "lwc1 $f2, 0x7FF8($at)\n"
1447 "lui $at, 0xFFFE\n"
1448 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001449 "addu $at, $at, $a0\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001450 "lwc1 $f2, 0($at)\n"
1451 "lui $at, 0xFFFE\n"
1452 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001453 "addu $at, $at, $a0\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001454 "lwc1 $f2, 7($at)\n"
1455 "lui $at, 0x1\n"
1456 "ori $at, $at, 0x7FE8\n"
1457 "addu $at, $at, $a0\n"
1458 "lwc1 $f2, 1($at)\n"
1459 "lui $at, 0x1\n"
1460 "ori $at, $at, 0x7FF0\n"
1461 "addu $at, $at, $a0\n"
1462 "lwc1 $f2, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001463 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001464 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001465 "addu $at, $at, $a0\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001466 "lwc1 $f2, 0($at)\n";
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001467 DriverStr(expected, "LoadSFromOffset");
1468}
1469
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001470TEST_F(AssemblerMIPSTest, LoadDFromOffset) {
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001471 __ LoadDFromOffset(mips::F0, mips::A0, -0x8000);
1472 __ LoadDFromOffset(mips::F0, mips::A0, +0);
1473 __ LoadDFromOffset(mips::F0, mips::A0, +0x7FF8);
1474 __ LoadDFromOffset(mips::F0, mips::A0, +0x7FFB);
1475 __ LoadDFromOffset(mips::F0, mips::A0, +0x7FFC);
1476 __ LoadDFromOffset(mips::F0, mips::A0, +0x7FFF);
1477 __ LoadDFromOffset(mips::F0, mips::A0, -0xFFF0);
1478 __ LoadDFromOffset(mips::F0, mips::A0, -0x8008);
1479 __ LoadDFromOffset(mips::F0, mips::A0, -0x8001);
1480 __ LoadDFromOffset(mips::F0, mips::A0, +0x8000);
1481 __ LoadDFromOffset(mips::F0, mips::A0, +0xFFF0);
1482 __ LoadDFromOffset(mips::F0, mips::A0, -0x17FE8);
1483 __ LoadDFromOffset(mips::F0, mips::A0, -0x0FFF8);
1484 __ LoadDFromOffset(mips::F0, mips::A0, -0x0FFF1);
1485 __ LoadDFromOffset(mips::F0, mips::A0, +0x0FFF1);
1486 __ LoadDFromOffset(mips::F0, mips::A0, +0x0FFF8);
1487 __ LoadDFromOffset(mips::F0, mips::A0, +0x17FE8);
1488 __ LoadDFromOffset(mips::F0, mips::A0, -0x17FF0);
1489 __ LoadDFromOffset(mips::F0, mips::A0, -0x17FE9);
1490 __ LoadDFromOffset(mips::F0, mips::A0, +0x17FE9);
1491 __ LoadDFromOffset(mips::F0, mips::A0, +0x17FF0);
1492 __ LoadDFromOffset(mips::F0, mips::A0, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001493
1494 const char* expected =
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001495 "ldc1 $f0, -0x8000($a0)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001496 "ldc1 $f0, 0($a0)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001497 "ldc1 $f0, 0x7FF8($a0)\n"
1498 "lwc1 $f0, 0x7FFB($a0)\n"
1499 "lwc1 $f1, 0x7FFF($a0)\n"
1500 "addiu $at, $a0, 0x7FF8\n"
1501 "lwc1 $f0, 4($at)\n"
1502 "lwc1 $f1, 8($at)\n"
1503 "addiu $at, $a0, 0x7FF8\n"
1504 "lwc1 $f0, 7($at)\n"
1505 "lwc1 $f1, 11($at)\n"
1506 "addiu $at, $a0, -0x7FF8\n"
1507 "ldc1 $f0, -0x7FF8($at)\n"
1508 "addiu $at, $a0, -0x7FF8\n"
1509 "ldc1 $f0, -0x10($at)\n"
1510 "addiu $at, $a0, -0x7FF8\n"
1511 "lwc1 $f0, -9($at)\n"
1512 "lwc1 $f1, -5($at)\n"
1513 "addiu $at, $a0, 0x7FF8\n"
1514 "ldc1 $f0, 8($at)\n"
1515 "addiu $at, $a0, 0x7FF8\n"
1516 "ldc1 $f0, 0x7FF8($at)\n"
1517 "addiu $at, $a0, -0x7FF8\n"
1518 "addiu $at, $at, -0x7FF8\n"
1519 "ldc1 $f0, -0x7FF8($at)\n"
1520 "addiu $at, $a0, -0x7FF8\n"
1521 "addiu $at, $at, -0x7FF8\n"
1522 "ldc1 $f0, -8($at)\n"
1523 "addiu $at, $a0, -0x7FF8\n"
1524 "addiu $at, $at, -0x7FF8\n"
1525 "lwc1 $f0, -1($at)\n"
1526 "lwc1 $f1, 3($at)\n"
1527 "addiu $at, $a0, 0x7FF8\n"
1528 "addiu $at, $at, 0x7FF8\n"
1529 "lwc1 $f0, 1($at)\n"
1530 "lwc1 $f1, 5($at)\n"
1531 "addiu $at, $a0, 0x7FF8\n"
1532 "addiu $at, $at, 0x7FF8\n"
1533 "ldc1 $f0, 8($at)\n"
1534 "addiu $at, $a0, 0x7FF8\n"
1535 "addiu $at, $at, 0x7FF8\n"
1536 "ldc1 $f0, 0x7FF8($at)\n"
1537 "lui $at, 0xFFFE\n"
1538 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001539 "addu $at, $at, $a0\n"
1540 "ldc1 $f0, 0($at)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001541 "lui $at, 0xFFFE\n"
1542 "ori $at, $at, 0x8010\n"
1543 "addu $at, $at, $a0\n"
1544 "lwc1 $f0, 7($at)\n"
1545 "lwc1 $f1, 11($at)\n"
1546 "lui $at, 0x1\n"
1547 "ori $at, $at, 0x7FE8\n"
1548 "addu $at, $at, $a0\n"
1549 "lwc1 $f0, 1($at)\n"
1550 "lwc1 $f1, 5($at)\n"
1551 "lui $at, 0x1\n"
1552 "ori $at, $at, 0x7FF0\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001553 "addu $at, $at, $a0\n"
1554 "ldc1 $f0, 0($at)\n"
1555 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001556 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001557 "addu $at, $at, $a0\n"
1558 "ldc1 $f0, 0($at)\n";
1559 DriverStr(expected, "LoadDFromOffset");
1560}
1561
1562TEST_F(AssemblerMIPSTest, StoreToOffset) {
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001563 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x8000);
1564 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0);
1565 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x7FF8);
1566 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x7FFB);
1567 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x7FFC);
1568 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x7FFF);
1569 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0xFFF0);
1570 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x8008);
1571 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x8001);
1572 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x8000);
1573 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0xFFF0);
1574 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x17FE8);
1575 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x0FFF8);
1576 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x0FFF1);
1577 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x0FFF1);
1578 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x0FFF8);
1579 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x17FE8);
1580 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x17FF0);
1581 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, -0x17FE9);
1582 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x17FE9);
1583 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x17FF0);
1584 __ StoreToOffset(mips::kStoreByte, mips::A3, mips::A1, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001585
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001586 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x8000);
1587 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0);
1588 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x7FF8);
1589 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x7FFB);
1590 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x7FFC);
1591 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x7FFF);
1592 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0xFFF0);
1593 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x8008);
1594 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x8001);
1595 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x8000);
1596 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0xFFF0);
1597 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x17FE8);
1598 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x0FFF8);
1599 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x0FFF1);
1600 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x0FFF1);
1601 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x0FFF8);
1602 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x17FE8);
1603 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x17FF0);
1604 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, -0x17FE9);
1605 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x17FE9);
1606 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x17FF0);
1607 __ StoreToOffset(mips::kStoreHalfword, mips::A3, mips::A1, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001608
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001609 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x8000);
1610 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0);
1611 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x7FF8);
1612 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x7FFB);
1613 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x7FFC);
1614 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x7FFF);
1615 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0xFFF0);
1616 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x8008);
1617 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x8001);
1618 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x8000);
1619 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0xFFF0);
1620 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x17FE8);
1621 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x0FFF8);
1622 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x0FFF1);
1623 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x0FFF1);
1624 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x0FFF8);
1625 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x17FE8);
1626 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x17FF0);
1627 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, -0x17FE9);
1628 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x17FE9);
1629 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x17FF0);
1630 __ StoreToOffset(mips::kStoreWord, mips::A3, mips::A1, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001631
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001632 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x8000);
1633 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0);
1634 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x7FF8);
1635 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x7FFB);
1636 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x7FFC);
1637 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x7FFF);
1638 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0xFFF0);
1639 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x8008);
1640 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x8001);
1641 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x8000);
1642 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0xFFF0);
1643 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x17FE8);
1644 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x0FFF8);
1645 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x0FFF1);
1646 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x0FFF1);
1647 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x0FFF8);
1648 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x17FE8);
1649 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x17FF0);
1650 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, -0x17FE9);
1651 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x17FE9);
1652 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x17FF0);
1653 __ StoreToOffset(mips::kStoreDoubleword, mips::A0, mips::A2, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001654
1655 const char* expected =
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001656 "sb $a3, -0x8000($a1)\n"
1657 "sb $a3, 0($a1)\n"
1658 "sb $a3, 0x7FF8($a1)\n"
1659 "sb $a3, 0x7FFB($a1)\n"
1660 "sb $a3, 0x7FFC($a1)\n"
1661 "sb $a3, 0x7FFF($a1)\n"
1662 "addiu $at, $a1, -0x7FF8\n"
1663 "sb $a3, -0x7FF8($at)\n"
1664 "addiu $at, $a1, -0x7FF8\n"
1665 "sb $a3, -0x10($at)\n"
1666 "addiu $at, $a1, -0x7FF8\n"
1667 "sb $a3, -9($at)\n"
1668 "addiu $at, $a1, 0x7FF8\n"
1669 "sb $a3, 8($at)\n"
1670 "addiu $at, $a1, 0x7FF8\n"
1671 "sb $a3, 0x7FF8($at)\n"
1672 "addiu $at, $a1, -0x7FF8\n"
1673 "addiu $at, $at, -0x7FF8\n"
1674 "sb $a3, -0x7FF8($at)\n"
1675 "addiu $at, $a1, -0x7FF8\n"
1676 "addiu $at, $at, -0x7FF8\n"
1677 "sb $a3, -8($at)\n"
1678 "addiu $at, $a1, -0x7FF8\n"
1679 "addiu $at, $at, -0x7FF8\n"
1680 "sb $a3, -1($at)\n"
1681 "addiu $at, $a1, 0x7FF8\n"
1682 "addiu $at, $at, 0x7FF8\n"
1683 "sb $a3, 1($at)\n"
1684 "addiu $at, $a1, 0x7FF8\n"
1685 "addiu $at, $at, 0x7FF8\n"
1686 "sb $a3, 8($at)\n"
1687 "addiu $at, $a1, 0x7FF8\n"
1688 "addiu $at, $at, 0x7FF8\n"
1689 "sb $a3, 0x7FF8($at)\n"
1690 "lui $at, 0xFFFE\n"
1691 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001692 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001693 "sb $a3, 0($at)\n"
1694 "lui $at, 0xFFFE\n"
1695 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001696 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001697 "sb $a3, 7($at)\n"
1698 "lui $at, 0x1\n"
1699 "ori $at, $at, 0x7FE8\n"
1700 "addu $at, $at, $a1\n"
1701 "sb $a3, 1($at)\n"
1702 "lui $at, 0x1\n"
1703 "ori $at, $at, 0x7FF0\n"
1704 "addu $at, $at, $a1\n"
1705 "sb $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001706 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001707 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001708 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001709 "sb $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001710
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001711 "sh $a3, -0x8000($a1)\n"
1712 "sh $a3, 0($a1)\n"
1713 "sh $a3, 0x7FF8($a1)\n"
1714 "sh $a3, 0x7FFB($a1)\n"
1715 "sh $a3, 0x7FFC($a1)\n"
1716 "sh $a3, 0x7FFF($a1)\n"
1717 "addiu $at, $a1, -0x7FF8\n"
1718 "sh $a3, -0x7FF8($at)\n"
1719 "addiu $at, $a1, -0x7FF8\n"
1720 "sh $a3, -0x10($at)\n"
1721 "addiu $at, $a1, -0x7FF8\n"
1722 "sh $a3, -9($at)\n"
1723 "addiu $at, $a1, 0x7FF8\n"
1724 "sh $a3, 8($at)\n"
1725 "addiu $at, $a1, 0x7FF8\n"
1726 "sh $a3, 0x7FF8($at)\n"
1727 "addiu $at, $a1, -0x7FF8\n"
1728 "addiu $at, $at, -0x7FF8\n"
1729 "sh $a3, -0x7FF8($at)\n"
1730 "addiu $at, $a1, -0x7FF8\n"
1731 "addiu $at, $at, -0x7FF8\n"
1732 "sh $a3, -8($at)\n"
1733 "addiu $at, $a1, -0x7FF8\n"
1734 "addiu $at, $at, -0x7FF8\n"
1735 "sh $a3, -1($at)\n"
1736 "addiu $at, $a1, 0x7FF8\n"
1737 "addiu $at, $at, 0x7FF8\n"
1738 "sh $a3, 1($at)\n"
1739 "addiu $at, $a1, 0x7FF8\n"
1740 "addiu $at, $at, 0x7FF8\n"
1741 "sh $a3, 8($at)\n"
1742 "addiu $at, $a1, 0x7FF8\n"
1743 "addiu $at, $at, 0x7FF8\n"
1744 "sh $a3, 0x7FF8($at)\n"
1745 "lui $at, 0xFFFE\n"
1746 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001747 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001748 "sh $a3, 0($at)\n"
1749 "lui $at, 0xFFFE\n"
1750 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001751 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001752 "sh $a3, 7($at)\n"
1753 "lui $at, 0x1\n"
1754 "ori $at, $at, 0x7FE8\n"
1755 "addu $at, $at, $a1\n"
1756 "sh $a3, 1($at)\n"
1757 "lui $at, 0x1\n"
1758 "ori $at, $at, 0x7FF0\n"
1759 "addu $at, $at, $a1\n"
1760 "sh $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001761 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001762 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001763 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001764 "sh $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001765
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001766 "sw $a3, -0x8000($a1)\n"
1767 "sw $a3, 0($a1)\n"
1768 "sw $a3, 0x7FF8($a1)\n"
1769 "sw $a3, 0x7FFB($a1)\n"
1770 "sw $a3, 0x7FFC($a1)\n"
1771 "sw $a3, 0x7FFF($a1)\n"
1772 "addiu $at, $a1, -0x7FF8\n"
1773 "sw $a3, -0x7FF8($at)\n"
1774 "addiu $at, $a1, -0x7FF8\n"
1775 "sw $a3, -0x10($at)\n"
1776 "addiu $at, $a1, -0x7FF8\n"
1777 "sw $a3, -9($at)\n"
1778 "addiu $at, $a1, 0x7FF8\n"
1779 "sw $a3, 8($at)\n"
1780 "addiu $at, $a1, 0x7FF8\n"
1781 "sw $a3, 0x7FF8($at)\n"
1782 "addiu $at, $a1, -0x7FF8\n"
1783 "addiu $at, $at, -0x7FF8\n"
1784 "sw $a3, -0x7FF8($at)\n"
1785 "addiu $at, $a1, -0x7FF8\n"
1786 "addiu $at, $at, -0x7FF8\n"
1787 "sw $a3, -8($at)\n"
1788 "addiu $at, $a1, -0x7FF8\n"
1789 "addiu $at, $at, -0x7FF8\n"
1790 "sw $a3, -1($at)\n"
1791 "addiu $at, $a1, 0x7FF8\n"
1792 "addiu $at, $at, 0x7FF8\n"
1793 "sw $a3, 1($at)\n"
1794 "addiu $at, $a1, 0x7FF8\n"
1795 "addiu $at, $at, 0x7FF8\n"
1796 "sw $a3, 8($at)\n"
1797 "addiu $at, $a1, 0x7FF8\n"
1798 "addiu $at, $at, 0x7FF8\n"
1799 "sw $a3, 0x7FF8($at)\n"
1800 "lui $at, 0xFFFE\n"
1801 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001802 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001803 "sw $a3, 0($at)\n"
1804 "lui $at, 0xFFFE\n"
1805 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001806 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001807 "sw $a3, 7($at)\n"
1808 "lui $at, 0x1\n"
1809 "ori $at, $at, 0x7FE8\n"
1810 "addu $at, $at, $a1\n"
1811 "sw $a3, 1($at)\n"
1812 "lui $at, 0x1\n"
1813 "ori $at, $at, 0x7FF0\n"
1814 "addu $at, $at, $a1\n"
1815 "sw $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001816 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001817 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001818 "addu $at, $at, $a1\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001819 "sw $a3, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001820
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001821 "sw $a0, -0x8000($a2)\n"
1822 "sw $a1, -0x7FFC($a2)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001823 "sw $a0, 0($a2)\n"
1824 "sw $a1, 4($a2)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001825 "sw $a0, 0x7FF8($a2)\n"
1826 "sw $a1, 0x7FFC($a2)\n"
1827 "sw $a0, 0x7FFB($a2)\n"
1828 "sw $a1, 0x7FFF($a2)\n"
1829 "addiu $at, $a2, 0x7FF8\n"
1830 "sw $a0, 4($at)\n"
1831 "sw $a1, 8($at)\n"
1832 "addiu $at, $a2, 0x7FF8\n"
1833 "sw $a0, 7($at)\n"
1834 "sw $a1, 11($at)\n"
1835 "addiu $at, $a2, -0x7FF8\n"
1836 "sw $a0, -0x7FF8($at)\n"
1837 "sw $a1, -0x7FF4($at)\n"
1838 "addiu $at, $a2, -0x7FF8\n"
1839 "sw $a0, -0x10($at)\n"
1840 "sw $a1, -0xC($at)\n"
1841 "addiu $at, $a2, -0x7FF8\n"
1842 "sw $a0, -9($at)\n"
1843 "sw $a1, -5($at)\n"
1844 "addiu $at, $a2, 0x7FF8\n"
1845 "sw $a0, 8($at)\n"
1846 "sw $a1, 12($at)\n"
1847 "addiu $at, $a2, 0x7FF8\n"
1848 "sw $a0, 0x7FF8($at)\n"
1849 "sw $a1, 0x7FFC($at)\n"
1850 "addiu $at, $a2, -0x7FF8\n"
1851 "addiu $at, $at, -0x7FF8\n"
1852 "sw $a0, -0x7FF8($at)\n"
1853 "sw $a1, -0x7FF4($at)\n"
1854 "addiu $at, $a2, -0x7FF8\n"
1855 "addiu $at, $at, -0x7FF8\n"
1856 "sw $a0, -8($at)\n"
1857 "sw $a1, -4($at)\n"
1858 "addiu $at, $a2, -0x7FF8\n"
1859 "addiu $at, $at, -0x7FF8\n"
1860 "sw $a0, -1($at)\n"
1861 "sw $a1, 3($at)\n"
1862 "addiu $at, $a2, 0x7FF8\n"
1863 "addiu $at, $at, 0x7FF8\n"
1864 "sw $a0, 1($at)\n"
1865 "sw $a1, 5($at)\n"
1866 "addiu $at, $a2, 0x7FF8\n"
1867 "addiu $at, $at, 0x7FF8\n"
1868 "sw $a0, 8($at)\n"
1869 "sw $a1, 12($at)\n"
1870 "addiu $at, $a2, 0x7FF8\n"
1871 "addiu $at, $at, 0x7FF8\n"
1872 "sw $a0, 0x7FF8($at)\n"
1873 "sw $a1, 0x7FFC($at)\n"
1874 "lui $at, 0xFFFE\n"
1875 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001876 "addu $at, $at, $a2\n"
1877 "sw $a0, 0($at)\n"
1878 "sw $a1, 4($at)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001879 "lui $at, 0xFFFE\n"
1880 "ori $at, $at, 0x8010\n"
1881 "addu $at, $at, $a2\n"
1882 "sw $a0, 7($at)\n"
1883 "sw $a1, 11($at)\n"
1884 "lui $at, 0x1\n"
1885 "ori $at, $at, 0x7FE8\n"
1886 "addu $at, $at, $a2\n"
1887 "sw $a0, 1($at)\n"
1888 "sw $a1, 5($at)\n"
1889 "lui $at, 0x1\n"
1890 "ori $at, $at, 0x7FF0\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001891 "addu $at, $at, $a2\n"
1892 "sw $a0, 0($at)\n"
1893 "sw $a1, 4($at)\n"
1894 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001895 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001896 "addu $at, $at, $a2\n"
1897 "sw $a0, 0($at)\n"
1898 "sw $a1, 4($at)\n";
1899 DriverStr(expected, "StoreToOffset");
1900}
1901
1902TEST_F(AssemblerMIPSTest, StoreSToOffset) {
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001903 __ StoreSToOffset(mips::F2, mips::A0, -0x8000);
1904 __ StoreSToOffset(mips::F2, mips::A0, +0);
1905 __ StoreSToOffset(mips::F2, mips::A0, +0x7FF8);
1906 __ StoreSToOffset(mips::F2, mips::A0, +0x7FFB);
1907 __ StoreSToOffset(mips::F2, mips::A0, +0x7FFC);
1908 __ StoreSToOffset(mips::F2, mips::A0, +0x7FFF);
1909 __ StoreSToOffset(mips::F2, mips::A0, -0xFFF0);
1910 __ StoreSToOffset(mips::F2, mips::A0, -0x8008);
1911 __ StoreSToOffset(mips::F2, mips::A0, -0x8001);
1912 __ StoreSToOffset(mips::F2, mips::A0, +0x8000);
1913 __ StoreSToOffset(mips::F2, mips::A0, +0xFFF0);
1914 __ StoreSToOffset(mips::F2, mips::A0, -0x17FE8);
1915 __ StoreSToOffset(mips::F2, mips::A0, -0x0FFF8);
1916 __ StoreSToOffset(mips::F2, mips::A0, -0x0FFF1);
1917 __ StoreSToOffset(mips::F2, mips::A0, +0x0FFF1);
1918 __ StoreSToOffset(mips::F2, mips::A0, +0x0FFF8);
1919 __ StoreSToOffset(mips::F2, mips::A0, +0x17FE8);
1920 __ StoreSToOffset(mips::F2, mips::A0, -0x17FF0);
1921 __ StoreSToOffset(mips::F2, mips::A0, -0x17FE9);
1922 __ StoreSToOffset(mips::F2, mips::A0, +0x17FE9);
1923 __ StoreSToOffset(mips::F2, mips::A0, +0x17FF0);
1924 __ StoreSToOffset(mips::F2, mips::A0, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001925
1926 const char* expected =
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001927 "swc1 $f2, -0x8000($a0)\n"
1928 "swc1 $f2, 0($a0)\n"
1929 "swc1 $f2, 0x7FF8($a0)\n"
1930 "swc1 $f2, 0x7FFB($a0)\n"
1931 "swc1 $f2, 0x7FFC($a0)\n"
1932 "swc1 $f2, 0x7FFF($a0)\n"
1933 "addiu $at, $a0, -0x7FF8\n"
1934 "swc1 $f2, -0x7FF8($at)\n"
1935 "addiu $at, $a0, -0x7FF8\n"
1936 "swc1 $f2, -0x10($at)\n"
1937 "addiu $at, $a0, -0x7FF8\n"
1938 "swc1 $f2, -9($at)\n"
1939 "addiu $at, $a0, 0x7FF8\n"
1940 "swc1 $f2, 8($at)\n"
1941 "addiu $at, $a0, 0x7FF8\n"
1942 "swc1 $f2, 0x7FF8($at)\n"
1943 "addiu $at, $a0, -0x7FF8\n"
1944 "addiu $at, $at, -0x7FF8\n"
1945 "swc1 $f2, -0x7FF8($at)\n"
1946 "addiu $at, $a0, -0x7FF8\n"
1947 "addiu $at, $at, -0x7FF8\n"
1948 "swc1 $f2, -8($at)\n"
1949 "addiu $at, $a0, -0x7FF8\n"
1950 "addiu $at, $at, -0x7FF8\n"
1951 "swc1 $f2, -1($at)\n"
1952 "addiu $at, $a0, 0x7FF8\n"
1953 "addiu $at, $at, 0x7FF8\n"
1954 "swc1 $f2, 1($at)\n"
1955 "addiu $at, $a0, 0x7FF8\n"
1956 "addiu $at, $at, 0x7FF8\n"
1957 "swc1 $f2, 8($at)\n"
1958 "addiu $at, $a0, 0x7FF8\n"
1959 "addiu $at, $at, 0x7FF8\n"
1960 "swc1 $f2, 0x7FF8($at)\n"
1961 "lui $at, 0xFFFE\n"
1962 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001963 "addu $at, $at, $a0\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001964 "swc1 $f2, 0($at)\n"
1965 "lui $at, 0xFFFE\n"
1966 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001967 "addu $at, $at, $a0\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001968 "swc1 $f2, 7($at)\n"
1969 "lui $at, 0x1\n"
1970 "ori $at, $at, 0x7FE8\n"
1971 "addu $at, $at, $a0\n"
1972 "swc1 $f2, 1($at)\n"
1973 "lui $at, 0x1\n"
1974 "ori $at, $at, 0x7FF0\n"
1975 "addu $at, $at, $a0\n"
1976 "swc1 $f2, 0($at)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001977 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001978 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001979 "addu $at, $at, $a0\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001980 "swc1 $f2, 0($at)\n";
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02001981 DriverStr(expected, "StoreSToOffset");
1982}
1983
1984TEST_F(AssemblerMIPSTest, StoreDToOffset) {
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07001985 __ StoreDToOffset(mips::F0, mips::A0, -0x8000);
1986 __ StoreDToOffset(mips::F0, mips::A0, +0);
1987 __ StoreDToOffset(mips::F0, mips::A0, +0x7FF8);
1988 __ StoreDToOffset(mips::F0, mips::A0, +0x7FFB);
1989 __ StoreDToOffset(mips::F0, mips::A0, +0x7FFC);
1990 __ StoreDToOffset(mips::F0, mips::A0, +0x7FFF);
1991 __ StoreDToOffset(mips::F0, mips::A0, -0xFFF0);
1992 __ StoreDToOffset(mips::F0, mips::A0, -0x8008);
1993 __ StoreDToOffset(mips::F0, mips::A0, -0x8001);
1994 __ StoreDToOffset(mips::F0, mips::A0, +0x8000);
1995 __ StoreDToOffset(mips::F0, mips::A0, +0xFFF0);
1996 __ StoreDToOffset(mips::F0, mips::A0, -0x17FE8);
1997 __ StoreDToOffset(mips::F0, mips::A0, -0x0FFF8);
1998 __ StoreDToOffset(mips::F0, mips::A0, -0x0FFF1);
1999 __ StoreDToOffset(mips::F0, mips::A0, +0x0FFF1);
2000 __ StoreDToOffset(mips::F0, mips::A0, +0x0FFF8);
2001 __ StoreDToOffset(mips::F0, mips::A0, +0x17FE8);
2002 __ StoreDToOffset(mips::F0, mips::A0, -0x17FF0);
2003 __ StoreDToOffset(mips::F0, mips::A0, -0x17FE9);
2004 __ StoreDToOffset(mips::F0, mips::A0, +0x17FE9);
2005 __ StoreDToOffset(mips::F0, mips::A0, +0x17FF0);
2006 __ StoreDToOffset(mips::F0, mips::A0, +0x12345678);
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002007
2008 const char* expected =
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07002009 "sdc1 $f0, -0x8000($a0)\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002010 "sdc1 $f0, 0($a0)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07002011 "sdc1 $f0, 0x7FF8($a0)\n"
2012 "swc1 $f0, 0x7FFB($a0)\n"
2013 "swc1 $f1, 0x7FFF($a0)\n"
2014 "addiu $at, $a0, 0x7FF8\n"
2015 "swc1 $f0, 4($at)\n"
2016 "swc1 $f1, 8($at)\n"
2017 "addiu $at, $a0, 0x7FF8\n"
2018 "swc1 $f0, 7($at)\n"
2019 "swc1 $f1, 11($at)\n"
2020 "addiu $at, $a0, -0x7FF8\n"
2021 "sdc1 $f0, -0x7FF8($at)\n"
2022 "addiu $at, $a0, -0x7FF8\n"
2023 "sdc1 $f0, -0x10($at)\n"
2024 "addiu $at, $a0, -0x7FF8\n"
2025 "swc1 $f0, -9($at)\n"
2026 "swc1 $f1, -5($at)\n"
2027 "addiu $at, $a0, 0x7FF8\n"
2028 "sdc1 $f0, 8($at)\n"
2029 "addiu $at, $a0, 0x7FF8\n"
2030 "sdc1 $f0, 0x7FF8($at)\n"
2031 "addiu $at, $a0, -0x7FF8\n"
2032 "addiu $at, $at, -0x7FF8\n"
2033 "sdc1 $f0, -0x7FF8($at)\n"
2034 "addiu $at, $a0, -0x7FF8\n"
2035 "addiu $at, $at, -0x7FF8\n"
2036 "sdc1 $f0, -8($at)\n"
2037 "addiu $at, $a0, -0x7FF8\n"
2038 "addiu $at, $at, -0x7FF8\n"
2039 "swc1 $f0, -1($at)\n"
2040 "swc1 $f1, 3($at)\n"
2041 "addiu $at, $a0, 0x7FF8\n"
2042 "addiu $at, $at, 0x7FF8\n"
2043 "swc1 $f0, 1($at)\n"
2044 "swc1 $f1, 5($at)\n"
2045 "addiu $at, $a0, 0x7FF8\n"
2046 "addiu $at, $at, 0x7FF8\n"
2047 "sdc1 $f0, 8($at)\n"
2048 "addiu $at, $a0, 0x7FF8\n"
2049 "addiu $at, $at, 0x7FF8\n"
2050 "sdc1 $f0, 0x7FF8($at)\n"
2051 "lui $at, 0xFFFE\n"
2052 "ori $at, $at, 0x8010\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002053 "addu $at, $at, $a0\n"
2054 "sdc1 $f0, 0($at)\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07002055 "lui $at, 0xFFFE\n"
2056 "ori $at, $at, 0x8010\n"
2057 "addu $at, $at, $a0\n"
2058 "swc1 $f0, 7($at)\n"
2059 "swc1 $f1, 11($at)\n"
2060 "lui $at, 0x1\n"
2061 "ori $at, $at, 0x7FE8\n"
2062 "addu $at, $at, $a0\n"
2063 "swc1 $f0, 1($at)\n"
2064 "swc1 $f1, 5($at)\n"
2065 "lui $at, 0x1\n"
2066 "ori $at, $at, 0x7FF0\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002067 "addu $at, $at, $a0\n"
2068 "sdc1 $f0, 0($at)\n"
2069 "lui $at, 0x1234\n"
Alexey Frunzecad3a4c2016-06-07 23:40:37 -07002070 "ori $at, $at, 0x5678\n"
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002071 "addu $at, $at, $a0\n"
2072 "sdc1 $f0, 0($at)\n";
2073 DriverStr(expected, "StoreDToOffset");
2074}
2075
Alexey Frunzef58b2482016-09-02 22:14:06 -07002076TEST_F(AssemblerMIPSTest, StoreConstToOffset) {
2077 __ StoreConstToOffset(mips::kStoreByte, 0xFF, mips::A1, +0, mips::T8);
2078 __ StoreConstToOffset(mips::kStoreHalfword, 0xFFFF, mips::A1, +0, mips::T8);
2079 __ StoreConstToOffset(mips::kStoreWord, 0x12345678, mips::A1, +0, mips::T8);
2080 __ StoreConstToOffset(mips::kStoreDoubleword, 0x123456789ABCDEF0, mips::A1, +0, mips::T8);
2081
2082 __ StoreConstToOffset(mips::kStoreByte, 0, mips::A1, +0, mips::T8);
2083 __ StoreConstToOffset(mips::kStoreHalfword, 0, mips::A1, +0, mips::T8);
2084 __ StoreConstToOffset(mips::kStoreWord, 0, mips::A1, +0, mips::T8);
2085 __ StoreConstToOffset(mips::kStoreDoubleword, 0, mips::A1, +0, mips::T8);
2086
2087 __ StoreConstToOffset(mips::kStoreDoubleword, 0x1234567812345678, mips::A1, +0, mips::T8);
2088 __ StoreConstToOffset(mips::kStoreDoubleword, 0x1234567800000000, mips::A1, +0, mips::T8);
2089 __ StoreConstToOffset(mips::kStoreDoubleword, 0x0000000012345678, mips::A1, +0, mips::T8);
2090
2091 __ StoreConstToOffset(mips::kStoreWord, 0, mips::T8, +0, mips::T8);
2092 __ StoreConstToOffset(mips::kStoreWord, 0x12345678, mips::T8, +0, mips::T8);
2093
2094 __ StoreConstToOffset(mips::kStoreWord, 0, mips::A1, -0xFFF0, mips::T8);
2095 __ StoreConstToOffset(mips::kStoreWord, 0x12345678, mips::A1, +0xFFF0, mips::T8);
2096
2097 __ StoreConstToOffset(mips::kStoreWord, 0, mips::T8, -0xFFF0, mips::T8);
2098 __ StoreConstToOffset(mips::kStoreWord, 0x12345678, mips::T8, +0xFFF0, mips::T8);
2099
2100 const char* expected =
2101 "ori $t8, $zero, 0xFF\n"
2102 "sb $t8, 0($a1)\n"
2103 "ori $t8, $zero, 0xFFFF\n"
2104 "sh $t8, 0($a1)\n"
2105 "lui $t8, 0x1234\n"
2106 "ori $t8, $t8, 0x5678\n"
2107 "sw $t8, 0($a1)\n"
2108 "lui $t8, 0x9ABC\n"
2109 "ori $t8, $t8, 0xDEF0\n"
2110 "sw $t8, 0($a1)\n"
2111 "lui $t8, 0x1234\n"
2112 "ori $t8, $t8, 0x5678\n"
2113 "sw $t8, 4($a1)\n"
2114
2115 "sb $zero, 0($a1)\n"
2116 "sh $zero, 0($a1)\n"
2117 "sw $zero, 0($a1)\n"
2118 "sw $zero, 0($a1)\n"
2119 "sw $zero, 4($a1)\n"
2120
2121 "lui $t8, 0x1234\n"
2122 "ori $t8, $t8, 0x5678\n"
2123 "sw $t8, 0($a1)\n"
2124 "sw $t8, 4($a1)\n"
2125 "sw $zero, 0($a1)\n"
2126 "lui $t8, 0x1234\n"
2127 "ori $t8, $t8, 0x5678\n"
2128 "sw $t8, 4($a1)\n"
2129 "lui $t8, 0x1234\n"
2130 "ori $t8, $t8, 0x5678\n"
2131 "sw $t8, 0($a1)\n"
2132 "sw $zero, 4($a1)\n"
2133
2134 "sw $zero, 0($t8)\n"
2135 "lui $at, 0x1234\n"
2136 "ori $at, $at, 0x5678\n"
2137 "sw $at, 0($t8)\n"
2138
2139 "addiu $at, $a1, -0x7FF8\n"
2140 "sw $zero, -0x7FF8($at)\n"
2141 "addiu $at, $a1, 0x7FF8\n"
2142 "lui $t8, 0x1234\n"
2143 "ori $t8, $t8, 0x5678\n"
2144 "sw $t8, 0x7FF8($at)\n"
2145
2146 "addiu $at, $t8, -0x7FF8\n"
2147 "sw $zero, -0x7FF8($at)\n"
2148 "addiu $at, $t8, 0x7FF8\n"
2149 "lui $t8, 0x1234\n"
2150 "ori $t8, $t8, 0x5678\n"
2151 "sw $t8, 0x7FF8($at)\n";
2152 DriverStr(expected, "StoreConstToOffset");
2153}
2154
Alexey Frunze0cab6562017-07-25 15:19:36 -07002155//////////////
2156// BRANCHES //
2157//////////////
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002158
Alexey Frunze0cab6562017-07-25 15:19:36 -07002159TEST_F(AssemblerMIPSTest, B) {
2160 BranchHelper(&mips::MipsAssembler::B, "B");
2161}
2162
2163TEST_F(AssemblerMIPSTest, Bal) {
2164 BranchHelper(&mips::MipsAssembler::Bal, "Bal");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002165}
2166
2167TEST_F(AssemblerMIPSTest, Beq) {
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002168 BranchCondTwoRegsHelper(&mips::MipsAssembler::Beq, "Beq");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002169}
2170
2171TEST_F(AssemblerMIPSTest, Bne) {
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002172 BranchCondTwoRegsHelper(&mips::MipsAssembler::Bne, "Bne");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002173}
2174
2175TEST_F(AssemblerMIPSTest, Beqz) {
Alexey Frunze0cab6562017-07-25 15:19:36 -07002176 BranchCondOneRegHelper(&mips::MipsAssembler::Beqz, "Beqz");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002177}
2178
2179TEST_F(AssemblerMIPSTest, Bnez) {
Alexey Frunze0cab6562017-07-25 15:19:36 -07002180 BranchCondOneRegHelper(&mips::MipsAssembler::Bnez, "Bnez");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002181}
2182
2183TEST_F(AssemblerMIPSTest, Bltz) {
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002184 BranchCondOneRegHelper(&mips::MipsAssembler::Bltz, "Bltz");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002185}
2186
2187TEST_F(AssemblerMIPSTest, Bgez) {
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002188 BranchCondOneRegHelper(&mips::MipsAssembler::Bgez, "Bgez");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002189}
2190
2191TEST_F(AssemblerMIPSTest, Blez) {
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002192 BranchCondOneRegHelper(&mips::MipsAssembler::Blez, "Blez");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002193}
2194
2195TEST_F(AssemblerMIPSTest, Bgtz) {
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002196 BranchCondOneRegHelper(&mips::MipsAssembler::Bgtz, "Bgtz");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002197}
2198
2199TEST_F(AssemblerMIPSTest, Blt) {
Alexey Frunze0cab6562017-07-25 15:19:36 -07002200 BranchCondTwoRegsHelper(&mips::MipsAssembler::Blt, "Blt");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002201}
2202
2203TEST_F(AssemblerMIPSTest, Bge) {
Alexey Frunze0cab6562017-07-25 15:19:36 -07002204 BranchCondTwoRegsHelper(&mips::MipsAssembler::Bge, "Bge");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002205}
2206
2207TEST_F(AssemblerMIPSTest, Bltu) {
Alexey Frunze0cab6562017-07-25 15:19:36 -07002208 BranchCondTwoRegsHelper(&mips::MipsAssembler::Bltu, "Bltu");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002209}
2210
2211TEST_F(AssemblerMIPSTest, Bgeu) {
Alexey Frunze0cab6562017-07-25 15:19:36 -07002212 BranchCondTwoRegsHelper(&mips::MipsAssembler::Bgeu, "Bgeu");
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002213}
2214
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002215TEST_F(AssemblerMIPSTest, Bc1f) {
Alexey Frunze0cab6562017-07-25 15:19:36 -07002216 BranchFpuCondCodeHelper(&mips::MipsAssembler::Bc1f, "Bc1f");
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002217}
2218
2219TEST_F(AssemblerMIPSTest, Bc1t) {
Alexey Frunze0cab6562017-07-25 15:19:36 -07002220 BranchFpuCondCodeHelper(&mips::MipsAssembler::Bc1t, "Bc1t");
Alexey Frunzecd7b0ee2015-12-03 16:46:38 -08002221}
2222
Alexey Frunze0cab6562017-07-25 15:19:36 -07002223TEST_F(AssemblerMIPSTest, BareB) {
2224 BranchHelper(&mips::MipsAssembler::B, "B", /* is_bare */ true);
Chris Larsen3add9cb2016-04-14 14:01:33 -07002225}
2226
Alexey Frunze0cab6562017-07-25 15:19:36 -07002227TEST_F(AssemblerMIPSTest, BareBal) {
2228 BranchHelper(&mips::MipsAssembler::Bal, "Bal", /* is_bare */ true);
Alexey Frunze96b66822016-09-10 02:32:44 -07002229}
2230
Alexey Frunze0cab6562017-07-25 15:19:36 -07002231TEST_F(AssemblerMIPSTest, BareBeq) {
2232 BranchCondTwoRegsHelper(&mips::MipsAssembler::Beq, "Beq", /* is_bare */ true);
Alexey Frunze96b66822016-09-10 02:32:44 -07002233}
2234
Alexey Frunze0cab6562017-07-25 15:19:36 -07002235TEST_F(AssemblerMIPSTest, BareBne) {
2236 BranchCondTwoRegsHelper(&mips::MipsAssembler::Bne, "Bne", /* is_bare */ true);
Alexey Frunzee3fb2452016-05-10 16:08:05 -07002237}
2238
Alexey Frunze0cab6562017-07-25 15:19:36 -07002239TEST_F(AssemblerMIPSTest, BareBeqz) {
2240 BranchCondOneRegHelper(&mips::MipsAssembler::Beqz, "Beqz", /* is_bare */ true);
2241}
Alexey Frunzee3fb2452016-05-10 16:08:05 -07002242
Alexey Frunze0cab6562017-07-25 15:19:36 -07002243TEST_F(AssemblerMIPSTest, BareBnez) {
2244 BranchCondOneRegHelper(&mips::MipsAssembler::Bnez, "Bnez", /* is_bare */ true);
2245}
2246
2247TEST_F(AssemblerMIPSTest, BareBltz) {
2248 BranchCondOneRegHelper(&mips::MipsAssembler::Bltz, "Bltz", /* is_bare */ true);
2249}
2250
2251TEST_F(AssemblerMIPSTest, BareBgez) {
2252 BranchCondOneRegHelper(&mips::MipsAssembler::Bgez, "Bgez", /* is_bare */ true);
2253}
2254
2255TEST_F(AssemblerMIPSTest, BareBlez) {
2256 BranchCondOneRegHelper(&mips::MipsAssembler::Blez, "Blez", /* is_bare */ true);
2257}
2258
2259TEST_F(AssemblerMIPSTest, BareBgtz) {
2260 BranchCondOneRegHelper(&mips::MipsAssembler::Bgtz, "Bgtz", /* is_bare */ true);
2261}
2262
2263TEST_F(AssemblerMIPSTest, BareBlt) {
2264 BranchCondTwoRegsHelper(&mips::MipsAssembler::Blt, "Blt", /* is_bare */ true);
2265}
2266
2267TEST_F(AssemblerMIPSTest, BareBge) {
2268 BranchCondTwoRegsHelper(&mips::MipsAssembler::Bge, "Bge", /* is_bare */ true);
2269}
2270
2271TEST_F(AssemblerMIPSTest, BareBltu) {
2272 BranchCondTwoRegsHelper(&mips::MipsAssembler::Bltu, "Bltu", /* is_bare */ true);
2273}
2274
2275TEST_F(AssemblerMIPSTest, BareBgeu) {
2276 BranchCondTwoRegsHelper(&mips::MipsAssembler::Bgeu, "Bgeu", /* is_bare */ true);
2277}
2278
2279TEST_F(AssemblerMIPSTest, BareBc1f) {
2280 BranchFpuCondCodeHelper(&mips::MipsAssembler::Bc1f, "Bc1f", /* is_bare */ true);
2281}
2282
2283TEST_F(AssemblerMIPSTest, BareBc1t) {
2284 BranchFpuCondCodeHelper(&mips::MipsAssembler::Bc1t, "Bc1t", /* is_bare */ true);
Alexey Frunzee3fb2452016-05-10 16:08:05 -07002285}
2286
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002287TEST_F(AssemblerMIPSTest, ImpossibleReordering) {
2288 mips::MipsLabel label1, label2;
2289 __ SetReorder(true);
2290
2291 __ B(&label1); // No preceding or target instruction for the delay slot.
2292
2293 __ Addu(mips::T0, mips::T1, mips::T2);
2294 __ Bind(&label1);
2295 __ B(&label1); // The preceding label prevents moving Addu into the delay slot.
2296 __ B(&label1); // No preceding or target instruction for the delay slot.
2297
2298 __ Addu(mips::T0, mips::T1, mips::T2);
2299 __ Beqz(mips::T0, &label1); // T0 dependency.
2300
2301 __ Or(mips::T1, mips::T2, mips::T3);
2302 __ Bne(mips::T2, mips::T1, &label1); // T1 dependency.
2303
2304 __ And(mips::T0, mips::T1, mips::T2);
2305 __ Blt(mips::T1, mips::T0, &label1); // T0 dependency.
2306
2307 __ Xor(mips::AT, mips::T0, mips::T1);
2308 __ Bge(mips::T1, mips::T0, &label1); // AT dependency.
2309
2310 __ Subu(mips::T0, mips::T1, mips::AT);
2311 __ Bltu(mips::T1, mips::T0, &label1); // AT dependency.
2312
2313 __ ColtS(1, mips::F2, mips::F4);
2314 __ Bc1t(1, &label1); // cc1 dependency.
2315
2316 __ Move(mips::T0, mips::RA);
2317 __ Bal(&label1); // RA dependency.
2318
2319 __ Lw(mips::RA, mips::T0, 0);
2320 __ Bal(&label1); // RA dependency.
2321
2322 __ LlR2(mips::T9, mips::T0, 0);
2323 __ Jalr(mips::T9); // T9 dependency.
2324
2325 __ Sw(mips::RA, mips::T0, 0);
2326 __ Jalr(mips::T9); // RA dependency.
2327
2328 __ Lw(mips::T1, mips::T0, 0);
2329 __ Jalr(mips::T1, mips::T9); // T1 dependency.
2330
2331 __ ScR2(mips::T9, mips::T0, 0);
2332 __ Jr(mips::T9); // T9 dependency.
2333
2334 __ Bind(&label2);
2335
2336 __ Bnez(mips::T0, &label2); // No preceding instruction for the delay slot.
2337
2338 __ Bgeu(mips::T1, mips::T0, &label2); // No preceding instruction for the delay slot.
2339
2340 __ Bc1f(2, &label2); // No preceding instruction for the delay slot.
2341
2342 __ Bal(&label2); // No preceding instruction for the delay slot.
2343
2344 __ Jalr(mips::T9); // No preceding instruction for the delay slot.
2345
2346 __ Addu(mips::T0, mips::T1, mips::T2);
2347 __ CodePosition(); // Drops the delay slot candidate (the last instruction).
2348 __ Beq(mips::T1, mips::T2, &label2); // No preceding or target instruction for the delay slot.
2349
2350 std::string expected =
2351 ".set noreorder\n"
2352 "b 1f\n"
2353 "nop\n"
2354
2355 "addu $t0, $t1, $t2\n"
2356 "1:\n"
2357 "b 1b\n"
2358 "nop\n"
2359 "b 1b\n"
2360 "nop\n"
2361
2362 "addu $t0, $t1, $t2\n"
Alexey Frunze0cab6562017-07-25 15:19:36 -07002363 "beqz $t0, 1b\n"
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002364 "nop\n"
2365
2366 "or $t1, $t2, $t3\n"
2367 "bne $t2, $t1, 1b\n"
2368 "nop\n"
2369
2370 "and $t0, $t1, $t2\n"
2371 "slt $at, $t1, $t0\n"
Alexey Frunze0cab6562017-07-25 15:19:36 -07002372 "bnez $at, 1b\n"
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002373 "nop\n"
2374
2375 "xor $at, $t0, $t1\n"
2376 "slt $at, $t1, $t0\n"
Alexey Frunze0cab6562017-07-25 15:19:36 -07002377 "beqz $at, 1b\n"
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002378 "nop\n"
2379
2380 "subu $t0, $t1, $at\n"
2381 "sltu $at, $t1, $t0\n"
Alexey Frunze0cab6562017-07-25 15:19:36 -07002382 "bnez $at, 1b\n"
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002383 "nop\n"
2384
2385 "c.olt.s $fcc1, $f2, $f4\n"
2386 "bc1t $fcc1, 1b\n"
2387 "nop\n"
2388
2389 "or $t0, $ra, $zero\n"
2390 "bal 1b\n"
2391 "nop\n"
2392
2393 "lw $ra, 0($t0)\n"
2394 "bal 1b\n"
2395 "nop\n"
2396
2397 "ll $t9, 0($t0)\n"
2398 "jalr $t9\n"
2399 "nop\n"
2400
2401 "sw $ra, 0($t0)\n"
2402 "jalr $t9\n"
2403 "nop\n"
2404
2405 "lw $t1, 0($t0)\n"
2406 "jalr $t1, $t9\n"
2407 "nop\n"
2408
2409 "sc $t9, 0($t0)\n"
2410 "jalr $zero, $t9\n"
2411 "nop\n"
2412
2413 "2:\n"
2414
Alexey Frunze0cab6562017-07-25 15:19:36 -07002415 "bnez $t0, 2b\n"
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002416 "nop\n"
2417
2418 "sltu $at, $t1, $t0\n"
Alexey Frunze0cab6562017-07-25 15:19:36 -07002419 "beqz $at, 2b\n"
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002420 "nop\n"
2421
2422 "bc1f $fcc2, 2b\n"
2423 "nop\n"
2424
2425 "bal 2b\n"
2426 "nop\n"
2427
2428 "jalr $t9\n"
2429 "nop\n"
2430
2431 "addu $t0, $t1, $t2\n"
2432 "beq $t1, $t2, 2b\n"
2433 "nop\n";
2434 DriverStr(expected, "ImpossibleReordering");
2435}
2436
2437TEST_F(AssemblerMIPSTest, Reordering) {
2438 mips::MipsLabel label1, label2;
2439 __ SetReorder(true);
2440
2441 __ Bind(&label1);
2442 __ Bind(&label2);
2443
2444 __ Addu(mips::T0, mips::T1, mips::T2);
2445 __ Beqz(mips::T1, &label1);
2446
2447 __ Or(mips::T1, mips::T2, mips::T3);
2448 __ Bne(mips::T2, mips::T3, &label1);
2449
2450 __ And(mips::T0, mips::T1, mips::T2);
2451 __ Blt(mips::T1, mips::T2, &label1);
2452
2453 __ Xor(mips::T2, mips::T0, mips::T1);
2454 __ Bge(mips::T1, mips::T0, &label1);
2455
2456 __ Subu(mips::T2, mips::T1, mips::T0);
2457 __ Bltu(mips::T1, mips::T0, &label1);
2458
2459 __ ColtS(0, mips::F2, mips::F4);
2460 __ Bc1t(1, &label1);
2461
2462 __ Move(mips::T0, mips::T1);
2463 __ Bal(&label1);
2464
2465 __ LlR2(mips::T1, mips::T0, 0);
2466 __ Jalr(mips::T9);
2467
2468 __ ScR2(mips::T1, mips::T0, 0);
2469 __ Jr(mips::T9);
2470
2471 std::string expected =
2472 ".set noreorder\n"
2473 "1:\n"
2474
Alexey Frunze0cab6562017-07-25 15:19:36 -07002475 "beqz $t1, 1b\n"
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002476 "addu $t0, $t1, $t2\n"
2477
2478 "bne $t2, $t3, 1b\n"
2479 "or $t1, $t2, $t3\n"
2480
2481 "slt $at, $t1, $t2\n"
Alexey Frunze0cab6562017-07-25 15:19:36 -07002482 "bnez $at, 1b\n"
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002483 "and $t0, $t1, $t2\n"
2484
2485 "slt $at, $t1, $t0\n"
Alexey Frunze0cab6562017-07-25 15:19:36 -07002486 "beqz $at, 1b\n"
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002487 "xor $t2, $t0, $t1\n"
2488
2489 "sltu $at, $t1, $t0\n"
Alexey Frunze0cab6562017-07-25 15:19:36 -07002490 "bnez $at, 1b\n"
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002491 "subu $t2, $t1, $t0\n"
2492
2493 "bc1t $fcc1, 1b\n"
2494 "c.olt.s $fcc0, $f2, $f4\n"
2495
2496 "bal 1b\n"
2497 "or $t0, $t1, $zero\n"
2498
2499 "jalr $t9\n"
2500 "ll $t1, 0($t0)\n"
2501
2502 "jalr $zero, $t9\n"
2503 "sc $t1, 0($t0)\n";
2504 DriverStr(expected, "Reordering");
2505}
2506
2507TEST_F(AssemblerMIPSTest, AbsorbTargetInstruction) {
2508 mips::MipsLabel label1, label2, label3, label4, label5, label6;
Alexey Frunzea663d9d2017-07-31 18:43:18 -07002509 mips::MipsLabel label7, label8, label9, label10, label11, label12, label13;
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002510 __ SetReorder(true);
2511
2512 __ B(&label1);
2513 __ Bind(&label1);
2514 __ Addu(mips::T0, mips::T1, mips::T2);
2515
2516 __ Bind(&label2);
2517 __ Xor(mips::T0, mips::T1, mips::T2);
2518 __ Addu(mips::T0, mips::T1, mips::T2);
2519 __ Bind(&label3); // Prevents reordering ADDU above with B below.
2520 __ B(&label2);
2521
2522 __ B(&label4);
2523 __ Bind(&label4);
2524 __ Addu(mips::T0, mips::T1, mips::T2);
2525 __ CodePosition(); // Prevents absorbing ADDU above.
2526
2527 __ B(&label5);
2528 __ Bind(&label5);
2529 __ Addu(mips::T0, mips::T1, mips::T2);
2530 __ Bind(&label6);
2531 __ CodePosition(); // Even across Bind(), CodePosition() prevents absorbing the ADDU above.
2532
Alexey Frunzea663d9d2017-07-31 18:43:18 -07002533 __ Nop();
2534 __ B(&label7);
2535 __ Bind(&label7);
2536 __ Lw(mips::V0, mips::A0, 0x5678); // Possibly patchable instruction, not absorbed.
2537
2538 __ Nop();
2539 __ B(&label8);
2540 __ Bind(&label8);
2541 __ Sw(mips::V0, mips::A0, 0x5678); // Possibly patchable instruction, not absorbed.
2542
2543 __ Nop();
2544 __ B(&label9);
2545 __ Bind(&label9);
2546 __ Addiu(mips::V0, mips::A0, 0x5678); // Possibly patchable instruction, not absorbed.
2547
2548 __ Nop();
2549 __ B(&label10);
2550 __ Bind(&label10);
2551 __ Lw(mips::V0, mips::A0, 0x5680); // Immediate isn't 0x5678, absorbed.
2552
2553 __ Nop();
2554 __ B(&label11);
2555 __ Bind(&label11);
2556 __ Sw(mips::V0, mips::A0, 0x5680); // Immediate isn't 0x5678, absorbed.
2557
2558 __ Nop();
2559 __ B(&label12);
2560 __ Bind(&label12);
2561 __ Addiu(mips::V0, mips::A0, 0x5680); // Immediate isn't 0x5678, absorbed.
2562
2563 __ Nop();
2564 __ B(&label13);
2565 __ Bind(&label13);
2566 __ Andi(mips::V0, mips::A0, 0x5678); // Not one of patchable instructions, absorbed.
2567
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002568 std::string expected =
2569 ".set noreorder\n"
2570 "b 1f\n"
2571 "addu $t0, $t1, $t2\n"
2572 "addu $t0, $t1, $t2\n"
2573 "1:\n"
2574
2575 "xor $t0, $t1, $t2\n"
2576 "2:\n"
2577 "addu $t0, $t1, $t2\n"
2578 "b 2b\n"
2579 "xor $t0, $t1, $t2\n"
2580
2581 "b 4f\n"
2582 "nop\n"
2583 "4:\n"
2584 "addu $t0, $t1, $t2\n"
2585
2586 "b 5f\n"
2587 "nop\n"
2588 "5:\n"
Alexey Frunzea663d9d2017-07-31 18:43:18 -07002589 "addu $t0, $t1, $t2\n"
2590
2591 "nop\n"
2592 "b 7f\n"
2593 "nop\n"
2594 "7:\n"
2595 "lw $v0, 0x5678($a0)\n"
2596
2597 "nop\n"
2598 "b 8f\n"
2599 "nop\n"
2600 "8:\n"
2601 "sw $v0, 0x5678($a0)\n"
2602
2603 "nop\n"
2604 "b 9f\n"
2605 "nop\n"
2606 "9:\n"
2607 "addiu $v0, $a0, 0x5678\n"
2608
2609 "nop\n"
2610 "b 10f\n"
2611 "lw $v0, 0x5680($a0)\n"
2612 "lw $v0, 0x5680($a0)\n"
2613 "10:\n"
2614
2615 "nop\n"
2616 "b 11f\n"
2617 "sw $v0, 0x5680($a0)\n"
2618 "sw $v0, 0x5680($a0)\n"
2619 "11:\n"
2620
2621 "nop\n"
2622 "b 12f\n"
2623 "addiu $v0, $a0, 0x5680\n"
2624 "addiu $v0, $a0, 0x5680\n"
2625 "12:\n"
2626
2627 "nop\n"
2628 "b 13f\n"
2629 "andi $v0, $a0, 0x5678\n"
2630 "andi $v0, $a0, 0x5678\n"
2631 "13:\n";
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002632 DriverStr(expected, "AbsorbTargetInstruction");
2633}
2634
2635TEST_F(AssemblerMIPSTest, SetReorder) {
2636 mips::MipsLabel label1, label2, label3, label4, label5, label6;
2637
2638 __ SetReorder(true);
2639 __ Bind(&label1);
2640 __ Addu(mips::T0, mips::T1, mips::T2);
2641 __ B(&label1);
2642 __ B(&label5);
2643 __ B(&label6);
2644
2645 __ SetReorder(false);
2646 __ Bind(&label2);
2647 __ Addu(mips::T0, mips::T1, mips::T2);
2648 __ B(&label2);
2649 __ B(&label5);
2650 __ B(&label6);
2651
2652 __ SetReorder(true);
2653 __ Bind(&label3);
2654 __ Addu(mips::T0, mips::T1, mips::T2);
2655 __ B(&label3);
2656 __ B(&label5);
2657 __ B(&label6);
2658
2659 __ SetReorder(false);
2660 __ Bind(&label4);
2661 __ Addu(mips::T0, mips::T1, mips::T2);
2662 __ B(&label4);
2663 __ B(&label5);
2664 __ B(&label6);
2665
2666 __ SetReorder(true);
2667 __ Bind(&label5);
2668 __ Subu(mips::T0, mips::T1, mips::T2);
2669
2670 __ SetReorder(false);
2671 __ Bind(&label6);
2672 __ Xor(mips::T0, mips::T1, mips::T2);
2673
2674 std::string expected =
2675 ".set noreorder\n"
2676 "1:\n"
2677 "b 1b\n"
2678 "addu $t0, $t1, $t2\n"
2679 "b 55f\n"
2680 "subu $t0, $t1, $t2\n"
2681 "b 6f\n"
2682 "nop\n"
2683
2684 "2:\n"
2685 "addu $t0, $t1, $t2\n"
2686 "b 2b\n"
2687 "nop\n"
2688 "b 5f\n"
2689 "nop\n"
2690 "b 6f\n"
2691 "nop\n"
2692
2693 "3:\n"
2694 "b 3b\n"
2695 "addu $t0, $t1, $t2\n"
2696 "b 55f\n"
2697 "subu $t0, $t1, $t2\n"
2698 "b 6f\n"
2699 "nop\n"
2700
2701 "4:\n"
2702 "addu $t0, $t1, $t2\n"
2703 "b 4b\n"
2704 "nop\n"
2705 "b 5f\n"
2706 "nop\n"
2707 "b 6f\n"
2708 "nop\n"
2709
2710 "5:\n"
2711 "subu $t0, $t1, $t2\n"
2712 "55:\n"
2713 "6:\n"
2714 "xor $t0, $t1, $t2\n";
2715 DriverStr(expected, "SetReorder");
2716}
2717
Alexey Frunzea663d9d2017-07-31 18:43:18 -07002718TEST_F(AssemblerMIPSTest, ReorderPatchedInstruction) {
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002719 __ SetReorder(true);
Alexey Frunzea663d9d2017-07-31 18:43:18 -07002720 mips::MipsLabel label1, label2;
2721 mips::MipsLabel patcher_label1, patcher_label2, patcher_label3, patcher_label4, patcher_label5;
2722 __ Lw(mips::V0, mips::A0, 0x5678, &patcher_label1);
2723 __ Beq(mips::A0, mips::A1, &label1);
2724 constexpr uint32_t kAdduCount1 = 63;
2725 for (size_t i = 0; i != kAdduCount1; ++i) {
2726 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2727 }
2728 __ Bind(&label1);
2729 __ Sw(mips::V0, mips::A0, 0x5678, &patcher_label2);
2730 __ Bltz(mips::V1, &label2);
2731 constexpr uint32_t kAdduCount2 = 64;
2732 for (size_t i = 0; i != kAdduCount2; ++i) {
2733 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2734 }
2735 __ Bind(&label2);
2736 __ Addiu(mips::V0, mips::A0, 0x5678, &patcher_label3);
2737 __ B(&label1);
2738 __ Lw(mips::V0, mips::A0, 0x5678, &patcher_label4);
2739 __ Jalr(mips::T9);
2740 __ Sw(mips::V0, mips::A0, 0x5678, &patcher_label5);
2741 __ Blt(mips::V0, mips::V1, &label2);
2742 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2743
2744 std::string expected =
2745 ".set noreorder\n"
2746 "beq $a0, $a1, 1f\n"
2747 "lw $v0, 0x5678($a0)\n" +
2748 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
2749 "1:\n"
2750 "bltz $v1, 2f\n"
2751 "sw $v0, 0x5678($a0)\n" +
2752 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
2753 "2:\n"
2754 "b 1b\n"
2755 "addiu $v0, $a0, 0x5678\n"
2756 "jalr $t9\n"
2757 "lw $v0, 0x5678($a0)\n"
2758 "slt $at, $v0, $v1\n"
2759 "bnez $at, 2b\n"
2760 "sw $v0, 0x5678($a0)\n"
2761 "addu $zero, $zero, $zero\n";
2762 DriverStr(expected, "ReorderPatchedInstruction");
2763 EXPECT_EQ(__ GetLabelLocation(&patcher_label1), 1 * 4u);
2764 EXPECT_EQ(__ GetLabelLocation(&patcher_label2), (kAdduCount1 + 3) * 4u);
2765 EXPECT_EQ(__ GetLabelLocation(&patcher_label3), (kAdduCount1 + kAdduCount2 + 5) * 4u);
2766 EXPECT_EQ(__ GetLabelLocation(&patcher_label4), (kAdduCount1 + kAdduCount2 + 7) * 4u);
2767 EXPECT_EQ(__ GetLabelLocation(&patcher_label5), (kAdduCount1 + kAdduCount2 + 10) * 4u);
2768}
2769
2770TEST_F(AssemblerMIPSTest, LongBranchReorder) {
2771 mips::MipsLabel label, patcher_label1, patcher_label2;
2772 __ SetReorder(true);
2773 __ Addiu(mips::T0, mips::T1, 0x5678, &patcher_label1);
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002774 __ B(&label);
2775 constexpr uint32_t kAdduCount1 = (1u << 15) + 1;
2776 for (size_t i = 0; i != kAdduCount1; ++i) {
2777 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2778 }
2779 __ Bind(&label);
2780 constexpr uint32_t kAdduCount2 = (1u << 15) + 1;
2781 for (size_t i = 0; i != kAdduCount2; ++i) {
2782 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2783 }
Alexey Frunzea663d9d2017-07-31 18:43:18 -07002784 __ Addiu(mips::T0, mips::T1, 0x5678, &patcher_label2);
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002785 __ B(&label);
2786
2787 // Account for 5 extra instructions: ori, addu, lw, jalr, addiu.
2788 uint32_t offset_forward = (kAdduCount1 + 5) * sizeof(uint32_t);
2789 // Account for 5 extra instructions: subu, addiu, sw, nal, lui.
Andreas Gampe69489fa2017-06-08 18:03:25 -07002790 uint32_t offset_back = static_cast<uint32_t>(-(kAdduCount1 + 5) * sizeof(uint32_t));
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002791
2792 std::ostringstream oss;
2793 oss <<
2794 ".set noreorder\n"
Alexey Frunzea663d9d2017-07-31 18:43:18 -07002795 "addiu $t0, $t1, 0x5678\n"
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002796 "addiu $sp, $sp, -4\n"
2797 "sw $ra, 0($sp)\n"
2798 "bltzal $zero, .+4\n"
2799 "lui $at, 0x" << std::hex << High16Bits(offset_forward) << "\n"
2800 "ori $at, $at, 0x" << std::hex << Low16Bits(offset_forward) << "\n"
2801 "addu $at, $at, $ra\n"
2802 "lw $ra, 0($sp)\n"
2803 "jalr $zero, $at\n"
2804 "addiu $sp, $sp, 4\n" <<
2805 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") <<
2806 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") <<
Alexey Frunzea663d9d2017-07-31 18:43:18 -07002807 "addiu $t0, $t1, 0x5678\n"
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002808 "addiu $sp, $sp, -4\n"
2809 "sw $ra, 0($sp)\n"
2810 "bltzal $zero, .+4\n"
2811 "lui $at, 0x" << std::hex << High16Bits(offset_back) << "\n"
2812 "ori $at, $at, 0x" << std::hex << Low16Bits(offset_back) << "\n"
2813 "addu $at, $at, $ra\n"
2814 "lw $ra, 0($sp)\n"
2815 "jalr $zero, $at\n"
2816 "addiu $sp, $sp, 4\n";
2817 std::string expected = oss.str();
2818 DriverStr(expected, "LongBranchReorder");
Alexey Frunzea663d9d2017-07-31 18:43:18 -07002819 EXPECT_EQ(__ GetLabelLocation(&patcher_label1), 0 * 4u);
2820 EXPECT_EQ(__ GetLabelLocation(&patcher_label2), (kAdduCount1 + kAdduCount2 + 10) * 4u);
Alexey Frunze57eb0f52016-07-29 22:04:46 -07002821}
2822
Alexey Frunze0cab6562017-07-25 15:19:36 -07002823///////////////////////
2824// Loading Constants //
2825///////////////////////
2826
2827TEST_F(AssemblerMIPSTest, LoadConst32) {
2828 // IsUint<16>(value)
2829 __ LoadConst32(mips::V0, 0);
2830 __ LoadConst32(mips::V0, 65535);
2831 // IsInt<16>(value)
2832 __ LoadConst32(mips::V0, -1);
2833 __ LoadConst32(mips::V0, -32768);
2834 // Everything else
2835 __ LoadConst32(mips::V0, 65536);
2836 __ LoadConst32(mips::V0, 65537);
2837 __ LoadConst32(mips::V0, 2147483647);
2838 __ LoadConst32(mips::V0, -32769);
2839 __ LoadConst32(mips::V0, -65536);
2840 __ LoadConst32(mips::V0, -65537);
2841 __ LoadConst32(mips::V0, -2147483647);
2842 __ LoadConst32(mips::V0, -2147483648);
2843
2844 const char* expected =
2845 // IsUint<16>(value)
2846 "ori $v0, $zero, 0\n" // __ LoadConst32(mips::V0, 0);
2847 "ori $v0, $zero, 65535\n" // __ LoadConst32(mips::V0, 65535);
2848 // IsInt<16>(value)
2849 "addiu $v0, $zero, -1\n" // __ LoadConst32(mips::V0, -1);
2850 "addiu $v0, $zero, -32768\n" // __ LoadConst32(mips::V0, -32768);
2851 // Everything else
2852 "lui $v0, 1\n" // __ LoadConst32(mips::V0, 65536);
2853 "lui $v0, 1\n" // __ LoadConst32(mips::V0, 65537);
2854 "ori $v0, 1\n" // "
2855 "lui $v0, 32767\n" // __ LoadConst32(mips::V0, 2147483647);
2856 "ori $v0, 65535\n" // "
2857 "lui $v0, 65535\n" // __ LoadConst32(mips::V0, -32769);
2858 "ori $v0, 32767\n" // "
2859 "lui $v0, 65535\n" // __ LoadConst32(mips::V0, -65536);
2860 "lui $v0, 65534\n" // __ LoadConst32(mips::V0, -65537);
2861 "ori $v0, 65535\n" // "
2862 "lui $v0, 32768\n" // __ LoadConst32(mips::V0, -2147483647);
2863 "ori $v0, 1\n" // "
2864 "lui $v0, 32768\n"; // __ LoadConst32(mips::V0, -2147483648);
2865 DriverStr(expected, "LoadConst32");
2866}
2867
2868TEST_F(AssemblerMIPSTest, LoadFarthestNearLabelAddress) {
2869 mips::MipsLabel label;
2870 __ BindPcRelBaseLabel();
2871 __ LoadLabelAddress(mips::V0, mips::V1, &label);
2872 constexpr size_t kAddiuCount = 0x1FDE;
2873 for (size_t i = 0; i != kAddiuCount; ++i) {
2874 __ Addiu(mips::A0, mips::A1, 0);
2875 }
2876 __ Bind(&label);
2877
2878 std::string expected =
2879 "1:\n"
2880 "addiu $v0, $v1, %lo(2f - 1b)\n" +
2881 RepeatInsn(kAddiuCount, "addiu $a0, $a1, %hi(2f - 1b)\n") +
2882 "2:\n";
2883 DriverStr(expected, "LoadFarthestNearLabelAddress");
2884}
2885
2886TEST_F(AssemblerMIPSTest, LoadNearestFarLabelAddress) {
2887 mips::MipsLabel label;
2888 __ BindPcRelBaseLabel();
2889 __ LoadLabelAddress(mips::V0, mips::V1, &label);
2890 constexpr size_t kAdduCount = 0x1FDF;
2891 for (size_t i = 0; i != kAdduCount; ++i) {
2892 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2893 }
2894 __ Bind(&label);
2895
2896 std::string expected =
2897 "1:\n"
2898 "lui $at, %hi(2f - 1b)\n"
2899 "ori $at, $at, %lo(2f - 1b)\n"
2900 "addu $v0, $at, $v1\n" +
2901 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2902 "2:\n";
2903 DriverStr(expected, "LoadNearestFarLabelAddress");
2904}
2905
2906TEST_F(AssemblerMIPSTest, LoadFarthestNearLiteral) {
2907 mips::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
2908 __ BindPcRelBaseLabel();
2909 __ LoadLiteral(mips::V0, mips::V1, literal);
2910 constexpr size_t kAddiuCount = 0x1FDE;
2911 for (size_t i = 0; i != kAddiuCount; ++i) {
2912 __ Addiu(mips::A0, mips::A1, 0);
2913 }
2914
2915 std::string expected =
2916 "1:\n"
2917 "lw $v0, %lo(2f - 1b)($v1)\n" +
2918 RepeatInsn(kAddiuCount, "addiu $a0, $a1, %hi(2f - 1b)\n") +
2919 "2:\n"
2920 ".word 0x12345678\n";
2921 DriverStr(expected, "LoadFarthestNearLiteral");
2922}
2923
2924TEST_F(AssemblerMIPSTest, LoadNearestFarLiteral) {
2925 mips::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
2926 __ BindPcRelBaseLabel();
2927 __ LoadLiteral(mips::V0, mips::V1, literal);
2928 constexpr size_t kAdduCount = 0x1FDF;
2929 for (size_t i = 0; i != kAdduCount; ++i) {
2930 __ Addu(mips::ZERO, mips::ZERO, mips::ZERO);
2931 }
2932
2933 std::string expected =
2934 "1:\n"
2935 "lui $at, %hi(2f - 1b)\n"
2936 "addu $at, $at, $v1\n"
2937 "lw $v0, %lo(2f - 1b)($at)\n" +
2938 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2939 "2:\n"
2940 ".word 0x12345678\n";
2941 DriverStr(expected, "LoadNearestFarLiteral");
2942}
2943
Goran Jakovljevic8c434dc2015-08-26 14:39:44 +02002944#undef __
2945
2946} // namespace art