blob: b0e1d91c3f8033f375d96f22eb9506eb01102ed6 [file] [log] [blame]
Chris Larsendbce0d72015-09-17 13:34:00 -07001/*
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_mips64.h"
18
19#include <inttypes.h>
20#include <map>
21#include <random>
22
23#include "base/bit_utils.h"
24#include "base/stl_util.h"
25#include "utils/assembler_test.h"
26
Alexey Frunzea0e87b02015-09-24 22:57:20 -070027#define __ GetAssembler()->
28
Chris Larsendbce0d72015-09-17 13:34:00 -070029namespace art {
30
31struct MIPS64CpuRegisterCompare {
32 bool operator()(const mips64::GpuRegister& a, const mips64::GpuRegister& b) const {
33 return a < b;
34 }
35};
36
37class AssemblerMIPS64Test : public AssemblerTest<mips64::Mips64Assembler,
Aart Bikcaa31e72017-09-14 17:08:50 -070038 mips64::Mips64Label,
Chris Larsendbce0d72015-09-17 13:34:00 -070039 mips64::GpuRegister,
40 mips64::FpuRegister,
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +000041 uint32_t,
42 mips64::VectorRegister> {
Chris Larsendbce0d72015-09-17 13:34:00 -070043 public:
44 typedef AssemblerTest<mips64::Mips64Assembler,
Aart Bikcaa31e72017-09-14 17:08:50 -070045 mips64::Mips64Label,
Chris Larsendbce0d72015-09-17 13:34:00 -070046 mips64::GpuRegister,
47 mips64::FpuRegister,
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +000048 uint32_t,
49 mips64::VectorRegister> Base;
Chris Larsendbce0d72015-09-17 13:34:00 -070050
Goran Jakovljevic27af9372017-03-15 15:31:34 +010051 AssemblerMIPS64Test()
52 : instruction_set_features_(Mips64InstructionSetFeatures::FromVariant("default", nullptr)) {}
53
Chris Larsendbce0d72015-09-17 13:34:00 -070054 protected:
55 // Get the typically used name for this architecture, e.g., aarch64, x86-64, ...
56 std::string GetArchitectureString() OVERRIDE {
57 return "mips64";
58 }
59
Alexey Frunzea0e87b02015-09-24 22:57:20 -070060 std::string GetAssemblerCmdName() OVERRIDE {
61 // We assemble and link for MIPS64R6. See GetAssemblerParameters() for details.
62 return "gcc";
63 }
64
Chris Larsendbce0d72015-09-17 13:34:00 -070065 std::string GetAssemblerParameters() OVERRIDE {
Alexey Frunzea0e87b02015-09-24 22:57:20 -070066 // We assemble and link for MIPS64R6. The reason is that object files produced for MIPS64R6
67 // (and MIPS32R6) with the GNU assembler don't have correct final offsets in PC-relative
68 // branches in the .text section and so they require a relocation pass (there's a relocation
69 // section, .rela.text, that has the needed info to fix up the branches).
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +000070 return " -march=mips64r6 -mmsa -Wa,--no-warn -Wl,-Ttext=0 -Wl,-e0 -nostdlib";
Alexey Frunzea0e87b02015-09-24 22:57:20 -070071 }
72
73 void Pad(std::vector<uint8_t>& data) OVERRIDE {
74 // The GNU linker unconditionally pads the code segment with NOPs to a size that is a multiple
75 // of 16 and there doesn't appear to be a way to suppress this padding. Our assembler doesn't
76 // pad, so, in order for two assembler outputs to match, we need to match the padding as well.
77 // NOP is encoded as four zero bytes on MIPS.
78 size_t pad_size = RoundUp(data.size(), 16u) - data.size();
79 data.insert(data.end(), pad_size, 0);
Chris Larsendbce0d72015-09-17 13:34:00 -070080 }
81
82 std::string GetDisassembleParameters() OVERRIDE {
83 return " -D -bbinary -mmips:isa64r6";
84 }
85
Vladimir Markoe764d2e2017-10-05 14:35:55 +010086 mips64::Mips64Assembler* CreateAssembler(ArenaAllocator* allocator) OVERRIDE {
87 return new (allocator) mips64::Mips64Assembler(allocator, instruction_set_features_.get());
Goran Jakovljevic27af9372017-03-15 15:31:34 +010088 }
89
Chris Larsendbce0d72015-09-17 13:34:00 -070090 void SetUpHelpers() OVERRIDE {
91 if (registers_.size() == 0) {
92 registers_.push_back(new mips64::GpuRegister(mips64::ZERO));
93 registers_.push_back(new mips64::GpuRegister(mips64::AT));
94 registers_.push_back(new mips64::GpuRegister(mips64::V0));
95 registers_.push_back(new mips64::GpuRegister(mips64::V1));
96 registers_.push_back(new mips64::GpuRegister(mips64::A0));
97 registers_.push_back(new mips64::GpuRegister(mips64::A1));
98 registers_.push_back(new mips64::GpuRegister(mips64::A2));
99 registers_.push_back(new mips64::GpuRegister(mips64::A3));
100 registers_.push_back(new mips64::GpuRegister(mips64::A4));
101 registers_.push_back(new mips64::GpuRegister(mips64::A5));
102 registers_.push_back(new mips64::GpuRegister(mips64::A6));
103 registers_.push_back(new mips64::GpuRegister(mips64::A7));
104 registers_.push_back(new mips64::GpuRegister(mips64::T0));
105 registers_.push_back(new mips64::GpuRegister(mips64::T1));
106 registers_.push_back(new mips64::GpuRegister(mips64::T2));
107 registers_.push_back(new mips64::GpuRegister(mips64::T3));
108 registers_.push_back(new mips64::GpuRegister(mips64::S0));
109 registers_.push_back(new mips64::GpuRegister(mips64::S1));
110 registers_.push_back(new mips64::GpuRegister(mips64::S2));
111 registers_.push_back(new mips64::GpuRegister(mips64::S3));
112 registers_.push_back(new mips64::GpuRegister(mips64::S4));
113 registers_.push_back(new mips64::GpuRegister(mips64::S5));
114 registers_.push_back(new mips64::GpuRegister(mips64::S6));
115 registers_.push_back(new mips64::GpuRegister(mips64::S7));
116 registers_.push_back(new mips64::GpuRegister(mips64::T8));
117 registers_.push_back(new mips64::GpuRegister(mips64::T9));
118 registers_.push_back(new mips64::GpuRegister(mips64::K0));
119 registers_.push_back(new mips64::GpuRegister(mips64::K1));
120 registers_.push_back(new mips64::GpuRegister(mips64::GP));
121 registers_.push_back(new mips64::GpuRegister(mips64::SP));
122 registers_.push_back(new mips64::GpuRegister(mips64::S8));
123 registers_.push_back(new mips64::GpuRegister(mips64::RA));
124
125 secondary_register_names_.emplace(mips64::GpuRegister(mips64::ZERO), "zero");
126 secondary_register_names_.emplace(mips64::GpuRegister(mips64::AT), "at");
127 secondary_register_names_.emplace(mips64::GpuRegister(mips64::V0), "v0");
128 secondary_register_names_.emplace(mips64::GpuRegister(mips64::V1), "v1");
129 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A0), "a0");
130 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A1), "a1");
131 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A2), "a2");
132 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A3), "a3");
133 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A4), "a4");
134 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A5), "a5");
135 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A6), "a6");
136 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A7), "a7");
137 secondary_register_names_.emplace(mips64::GpuRegister(mips64::T0), "t0");
138 secondary_register_names_.emplace(mips64::GpuRegister(mips64::T1), "t1");
139 secondary_register_names_.emplace(mips64::GpuRegister(mips64::T2), "t2");
140 secondary_register_names_.emplace(mips64::GpuRegister(mips64::T3), "t3");
141 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S0), "s0");
142 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S1), "s1");
143 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S2), "s2");
144 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S3), "s3");
145 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S4), "s4");
146 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S5), "s5");
147 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S6), "s6");
148 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S7), "s7");
149 secondary_register_names_.emplace(mips64::GpuRegister(mips64::T8), "t8");
150 secondary_register_names_.emplace(mips64::GpuRegister(mips64::T9), "t9");
151 secondary_register_names_.emplace(mips64::GpuRegister(mips64::K0), "k0");
152 secondary_register_names_.emplace(mips64::GpuRegister(mips64::K1), "k1");
153 secondary_register_names_.emplace(mips64::GpuRegister(mips64::GP), "gp");
154 secondary_register_names_.emplace(mips64::GpuRegister(mips64::SP), "sp");
155 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S8), "s8");
156 secondary_register_names_.emplace(mips64::GpuRegister(mips64::RA), "ra");
157
158 fp_registers_.push_back(new mips64::FpuRegister(mips64::F0));
159 fp_registers_.push_back(new mips64::FpuRegister(mips64::F1));
160 fp_registers_.push_back(new mips64::FpuRegister(mips64::F2));
161 fp_registers_.push_back(new mips64::FpuRegister(mips64::F3));
162 fp_registers_.push_back(new mips64::FpuRegister(mips64::F4));
163 fp_registers_.push_back(new mips64::FpuRegister(mips64::F5));
164 fp_registers_.push_back(new mips64::FpuRegister(mips64::F6));
165 fp_registers_.push_back(new mips64::FpuRegister(mips64::F7));
166 fp_registers_.push_back(new mips64::FpuRegister(mips64::F8));
167 fp_registers_.push_back(new mips64::FpuRegister(mips64::F9));
168 fp_registers_.push_back(new mips64::FpuRegister(mips64::F10));
169 fp_registers_.push_back(new mips64::FpuRegister(mips64::F11));
170 fp_registers_.push_back(new mips64::FpuRegister(mips64::F12));
171 fp_registers_.push_back(new mips64::FpuRegister(mips64::F13));
172 fp_registers_.push_back(new mips64::FpuRegister(mips64::F14));
173 fp_registers_.push_back(new mips64::FpuRegister(mips64::F15));
174 fp_registers_.push_back(new mips64::FpuRegister(mips64::F16));
175 fp_registers_.push_back(new mips64::FpuRegister(mips64::F17));
176 fp_registers_.push_back(new mips64::FpuRegister(mips64::F18));
177 fp_registers_.push_back(new mips64::FpuRegister(mips64::F19));
178 fp_registers_.push_back(new mips64::FpuRegister(mips64::F20));
179 fp_registers_.push_back(new mips64::FpuRegister(mips64::F21));
180 fp_registers_.push_back(new mips64::FpuRegister(mips64::F22));
181 fp_registers_.push_back(new mips64::FpuRegister(mips64::F23));
182 fp_registers_.push_back(new mips64::FpuRegister(mips64::F24));
183 fp_registers_.push_back(new mips64::FpuRegister(mips64::F25));
184 fp_registers_.push_back(new mips64::FpuRegister(mips64::F26));
185 fp_registers_.push_back(new mips64::FpuRegister(mips64::F27));
186 fp_registers_.push_back(new mips64::FpuRegister(mips64::F28));
187 fp_registers_.push_back(new mips64::FpuRegister(mips64::F29));
188 fp_registers_.push_back(new mips64::FpuRegister(mips64::F30));
189 fp_registers_.push_back(new mips64::FpuRegister(mips64::F31));
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +0000190
191 vec_registers_.push_back(new mips64::VectorRegister(mips64::W0));
192 vec_registers_.push_back(new mips64::VectorRegister(mips64::W1));
193 vec_registers_.push_back(new mips64::VectorRegister(mips64::W2));
194 vec_registers_.push_back(new mips64::VectorRegister(mips64::W3));
195 vec_registers_.push_back(new mips64::VectorRegister(mips64::W4));
196 vec_registers_.push_back(new mips64::VectorRegister(mips64::W5));
197 vec_registers_.push_back(new mips64::VectorRegister(mips64::W6));
198 vec_registers_.push_back(new mips64::VectorRegister(mips64::W7));
199 vec_registers_.push_back(new mips64::VectorRegister(mips64::W8));
200 vec_registers_.push_back(new mips64::VectorRegister(mips64::W9));
201 vec_registers_.push_back(new mips64::VectorRegister(mips64::W10));
202 vec_registers_.push_back(new mips64::VectorRegister(mips64::W11));
203 vec_registers_.push_back(new mips64::VectorRegister(mips64::W12));
204 vec_registers_.push_back(new mips64::VectorRegister(mips64::W13));
205 vec_registers_.push_back(new mips64::VectorRegister(mips64::W14));
206 vec_registers_.push_back(new mips64::VectorRegister(mips64::W15));
207 vec_registers_.push_back(new mips64::VectorRegister(mips64::W16));
208 vec_registers_.push_back(new mips64::VectorRegister(mips64::W17));
209 vec_registers_.push_back(new mips64::VectorRegister(mips64::W18));
210 vec_registers_.push_back(new mips64::VectorRegister(mips64::W19));
211 vec_registers_.push_back(new mips64::VectorRegister(mips64::W20));
212 vec_registers_.push_back(new mips64::VectorRegister(mips64::W21));
213 vec_registers_.push_back(new mips64::VectorRegister(mips64::W22));
214 vec_registers_.push_back(new mips64::VectorRegister(mips64::W23));
215 vec_registers_.push_back(new mips64::VectorRegister(mips64::W24));
216 vec_registers_.push_back(new mips64::VectorRegister(mips64::W25));
217 vec_registers_.push_back(new mips64::VectorRegister(mips64::W26));
218 vec_registers_.push_back(new mips64::VectorRegister(mips64::W27));
219 vec_registers_.push_back(new mips64::VectorRegister(mips64::W28));
220 vec_registers_.push_back(new mips64::VectorRegister(mips64::W29));
221 vec_registers_.push_back(new mips64::VectorRegister(mips64::W30));
222 vec_registers_.push_back(new mips64::VectorRegister(mips64::W31));
Chris Larsendbce0d72015-09-17 13:34:00 -0700223 }
224 }
225
226 void TearDown() OVERRIDE {
227 AssemblerTest::TearDown();
228 STLDeleteElements(&registers_);
229 STLDeleteElements(&fp_registers_);
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +0000230 STLDeleteElements(&vec_registers_);
Chris Larsendbce0d72015-09-17 13:34:00 -0700231 }
232
Aart Bikcaa31e72017-09-14 17:08:50 -0700233 std::vector<mips64::Mips64Label> GetAddresses() {
234 UNIMPLEMENTED(FATAL) << "Feature not implemented yet";
235 UNREACHABLE();
236 }
237
Chris Larsendbce0d72015-09-17 13:34:00 -0700238 std::vector<mips64::GpuRegister*> GetRegisters() OVERRIDE {
239 return registers_;
240 }
241
242 std::vector<mips64::FpuRegister*> GetFPRegisters() OVERRIDE {
243 return fp_registers_;
244 }
245
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +0000246 std::vector<mips64::VectorRegister*> GetVectorRegisters() OVERRIDE {
247 return vec_registers_;
248 }
249
Chris Larsendbce0d72015-09-17 13:34:00 -0700250 uint32_t CreateImmediate(int64_t imm_value) OVERRIDE {
251 return imm_value;
252 }
253
254 std::string GetSecondaryRegisterName(const mips64::GpuRegister& reg) OVERRIDE {
255 CHECK(secondary_register_names_.find(reg) != secondary_register_names_.end());
256 return secondary_register_names_[reg];
257 }
258
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700259 std::string RepeatInsn(size_t count, const std::string& insn) {
260 std::string result;
261 for (; count != 0u; --count) {
262 result += insn;
263 }
264 return result;
265 }
266
Alexey Frunze0cab6562017-07-25 15:19:36 -0700267 void BranchHelper(void (mips64::Mips64Assembler::*f)(mips64::Mips64Label*,
268 bool),
269 const std::string& instr_name,
270 bool is_bare = false) {
271 mips64::Mips64Label label1, label2;
272 (Base::GetAssembler()->*f)(&label1, is_bare);
273 constexpr size_t kAdduCount1 = 63;
274 for (size_t i = 0; i != kAdduCount1; ++i) {
275 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
276 }
277 __ Bind(&label1);
278 (Base::GetAssembler()->*f)(&label2, is_bare);
279 constexpr size_t kAdduCount2 = 64;
280 for (size_t i = 0; i != kAdduCount2; ++i) {
281 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
282 }
283 __ Bind(&label2);
284 (Base::GetAssembler()->*f)(&label1, is_bare);
285 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
286
287 std::string expected =
288 ".set noreorder\n" +
289 instr_name + " 1f\n" +
290 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
291 "1:\n" +
292 instr_name + " 2f\n" +
293 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
294 "2:\n" +
295 instr_name + " 1b\n" +
296 "addu $zero, $zero, $zero\n";
297 DriverStr(expected, instr_name);
298 }
299
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700300 void BranchCondOneRegHelper(void (mips64::Mips64Assembler::*f)(mips64::GpuRegister,
Alexey Frunze0cab6562017-07-25 15:19:36 -0700301 mips64::Mips64Label*,
302 bool),
303 const std::string& instr_name,
304 bool is_bare = false) {
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700305 mips64::Mips64Label label;
Alexey Frunze0cab6562017-07-25 15:19:36 -0700306 (Base::GetAssembler()->*f)(mips64::A0, &label, is_bare);
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700307 constexpr size_t kAdduCount1 = 63;
308 for (size_t i = 0; i != kAdduCount1; ++i) {
309 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
310 }
311 __ Bind(&label);
312 constexpr size_t kAdduCount2 = 64;
313 for (size_t i = 0; i != kAdduCount2; ++i) {
314 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
315 }
Alexey Frunze0cab6562017-07-25 15:19:36 -0700316 (Base::GetAssembler()->*f)(mips64::A1, &label, is_bare);
317 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700318
319 std::string expected =
320 ".set noreorder\n" +
Alexey Frunze0cab6562017-07-25 15:19:36 -0700321 instr_name + " $a0, 1f\n" +
322 (is_bare ? "" : "nop\n") +
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700323 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
324 "1:\n" +
325 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
Alexey Frunze0cab6562017-07-25 15:19:36 -0700326 instr_name + " $a1, 1b\n" +
327 (is_bare ? "" : "nop\n") +
328 "addu $zero, $zero, $zero\n";
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700329 DriverStr(expected, instr_name);
330 }
331
332 void BranchCondTwoRegsHelper(void (mips64::Mips64Assembler::*f)(mips64::GpuRegister,
333 mips64::GpuRegister,
Alexey Frunze0cab6562017-07-25 15:19:36 -0700334 mips64::Mips64Label*,
335 bool),
336 const std::string& instr_name,
337 bool is_bare = false) {
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700338 mips64::Mips64Label label;
Alexey Frunze0cab6562017-07-25 15:19:36 -0700339 (Base::GetAssembler()->*f)(mips64::A0, mips64::A1, &label, is_bare);
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700340 constexpr size_t kAdduCount1 = 63;
341 for (size_t i = 0; i != kAdduCount1; ++i) {
342 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
343 }
344 __ Bind(&label);
345 constexpr size_t kAdduCount2 = 64;
346 for (size_t i = 0; i != kAdduCount2; ++i) {
347 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
348 }
Alexey Frunze0cab6562017-07-25 15:19:36 -0700349 (Base::GetAssembler()->*f)(mips64::A2, mips64::A3, &label, is_bare);
350 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700351
352 std::string expected =
353 ".set noreorder\n" +
Alexey Frunze0cab6562017-07-25 15:19:36 -0700354 instr_name + " $a0, $a1, 1f\n" +
355 (is_bare ? "" : "nop\n") +
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700356 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
357 "1:\n" +
358 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
Alexey Frunze0cab6562017-07-25 15:19:36 -0700359 instr_name + " $a2, $a3, 1b\n" +
360 (is_bare ? "" : "nop\n") +
361 "addu $zero, $zero, $zero\n";
362 DriverStr(expected, instr_name);
363 }
364
365 void BranchFpuCondHelper(void (mips64::Mips64Assembler::*f)(mips64::FpuRegister,
366 mips64::Mips64Label*,
367 bool),
368 const std::string& instr_name,
369 bool is_bare = false) {
370 mips64::Mips64Label label;
371 (Base::GetAssembler()->*f)(mips64::F0, &label, is_bare);
372 constexpr size_t kAdduCount1 = 63;
373 for (size_t i = 0; i != kAdduCount1; ++i) {
374 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
375 }
376 __ Bind(&label);
377 constexpr size_t kAdduCount2 = 64;
378 for (size_t i = 0; i != kAdduCount2; ++i) {
379 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
380 }
381 (Base::GetAssembler()->*f)(mips64::F31, &label, is_bare);
382 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
383
384 std::string expected =
385 ".set noreorder\n" +
386 instr_name + " $f0, 1f\n" +
387 (is_bare ? "" : "nop\n") +
388 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
389 "1:\n" +
390 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
391 instr_name + " $f31, 1b\n" +
392 (is_bare ? "" : "nop\n") +
393 "addu $zero, $zero, $zero\n";
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700394 DriverStr(expected, instr_name);
395 }
396
Chris Larsendbce0d72015-09-17 13:34:00 -0700397 private:
398 std::vector<mips64::GpuRegister*> registers_;
399 std::map<mips64::GpuRegister, std::string, MIPS64CpuRegisterCompare> secondary_register_names_;
400
401 std::vector<mips64::FpuRegister*> fp_registers_;
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +0000402 std::vector<mips64::VectorRegister*> vec_registers_;
Chris Larsendbce0d72015-09-17 13:34:00 -0700403
Goran Jakovljevic27af9372017-03-15 15:31:34 +0100404 std::unique_ptr<const Mips64InstructionSetFeatures> instruction_set_features_;
405};
Chris Larsendbce0d72015-09-17 13:34:00 -0700406
407TEST_F(AssemblerMIPS64Test, Toolchain) {
408 EXPECT_TRUE(CheckTools());
409}
410
Chris Larsendbce0d72015-09-17 13:34:00 -0700411///////////////////
412// FP Operations //
413///////////////////
414
Goran Jakovljevic95f27142017-01-20 11:11:11 +0100415TEST_F(AssemblerMIPS64Test, AddS) {
416 DriverStr(RepeatFFF(&mips64::Mips64Assembler::AddS, "add.s ${reg1}, ${reg2}, ${reg3}"), "add.s");
417}
418
419TEST_F(AssemblerMIPS64Test, AddD) {
420 DriverStr(RepeatFFF(&mips64::Mips64Assembler::AddD, "add.d ${reg1}, ${reg2}, ${reg3}"), "add.d");
421}
422
423TEST_F(AssemblerMIPS64Test, SubS) {
424 DriverStr(RepeatFFF(&mips64::Mips64Assembler::SubS, "sub.s ${reg1}, ${reg2}, ${reg3}"), "sub.s");
425}
426
427TEST_F(AssemblerMIPS64Test, SubD) {
428 DriverStr(RepeatFFF(&mips64::Mips64Assembler::SubD, "sub.d ${reg1}, ${reg2}, ${reg3}"), "sub.d");
429}
430
431TEST_F(AssemblerMIPS64Test, MulS) {
432 DriverStr(RepeatFFF(&mips64::Mips64Assembler::MulS, "mul.s ${reg1}, ${reg2}, ${reg3}"), "mul.s");
433}
434
435TEST_F(AssemblerMIPS64Test, MulD) {
436 DriverStr(RepeatFFF(&mips64::Mips64Assembler::MulD, "mul.d ${reg1}, ${reg2}, ${reg3}"), "mul.d");
437}
438
439TEST_F(AssemblerMIPS64Test, DivS) {
440 DriverStr(RepeatFFF(&mips64::Mips64Assembler::DivS, "div.s ${reg1}, ${reg2}, ${reg3}"), "div.s");
441}
442
443TEST_F(AssemblerMIPS64Test, DivD) {
444 DriverStr(RepeatFFF(&mips64::Mips64Assembler::DivD, "div.d ${reg1}, ${reg2}, ${reg3}"), "div.d");
445}
446
Chris Larsendbce0d72015-09-17 13:34:00 -0700447TEST_F(AssemblerMIPS64Test, SqrtS) {
448 DriverStr(RepeatFF(&mips64::Mips64Assembler::SqrtS, "sqrt.s ${reg1}, ${reg2}"), "sqrt.s");
449}
450
451TEST_F(AssemblerMIPS64Test, SqrtD) {
452 DriverStr(RepeatFF(&mips64::Mips64Assembler::SqrtD, "sqrt.d ${reg1}, ${reg2}"), "sqrt.d");
453}
454
455TEST_F(AssemblerMIPS64Test, AbsS) {
456 DriverStr(RepeatFF(&mips64::Mips64Assembler::AbsS, "abs.s ${reg1}, ${reg2}"), "abs.s");
457}
458
459TEST_F(AssemblerMIPS64Test, AbsD) {
460 DriverStr(RepeatFF(&mips64::Mips64Assembler::AbsD, "abs.d ${reg1}, ${reg2}"), "abs.d");
461}
462
Chris Larsen51417632015-10-02 13:24:25 -0700463TEST_F(AssemblerMIPS64Test, MovS) {
464 DriverStr(RepeatFF(&mips64::Mips64Assembler::MovS, "mov.s ${reg1}, ${reg2}"), "mov.s");
465}
466
467TEST_F(AssemblerMIPS64Test, MovD) {
468 DriverStr(RepeatFF(&mips64::Mips64Assembler::MovD, "mov.d ${reg1}, ${reg2}"), "mov.d");
469}
470
471TEST_F(AssemblerMIPS64Test, NegS) {
472 DriverStr(RepeatFF(&mips64::Mips64Assembler::NegS, "neg.s ${reg1}, ${reg2}"), "neg.s");
473}
474
475TEST_F(AssemblerMIPS64Test, NegD) {
476 DriverStr(RepeatFF(&mips64::Mips64Assembler::NegD, "neg.d ${reg1}, ${reg2}"), "neg.d");
477}
478
Chris Larsendbce0d72015-09-17 13:34:00 -0700479TEST_F(AssemblerMIPS64Test, RoundLS) {
480 DriverStr(RepeatFF(&mips64::Mips64Assembler::RoundLS, "round.l.s ${reg1}, ${reg2}"), "round.l.s");
481}
482
483TEST_F(AssemblerMIPS64Test, RoundLD) {
484 DriverStr(RepeatFF(&mips64::Mips64Assembler::RoundLD, "round.l.d ${reg1}, ${reg2}"), "round.l.d");
485}
486
487TEST_F(AssemblerMIPS64Test, RoundWS) {
488 DriverStr(RepeatFF(&mips64::Mips64Assembler::RoundWS, "round.w.s ${reg1}, ${reg2}"), "round.w.s");
489}
490
491TEST_F(AssemblerMIPS64Test, RoundWD) {
492 DriverStr(RepeatFF(&mips64::Mips64Assembler::RoundWD, "round.w.d ${reg1}, ${reg2}"), "round.w.d");
493}
494
495TEST_F(AssemblerMIPS64Test, CeilLS) {
496 DriverStr(RepeatFF(&mips64::Mips64Assembler::CeilLS, "ceil.l.s ${reg1}, ${reg2}"), "ceil.l.s");
497}
498
499TEST_F(AssemblerMIPS64Test, CeilLD) {
500 DriverStr(RepeatFF(&mips64::Mips64Assembler::CeilLD, "ceil.l.d ${reg1}, ${reg2}"), "ceil.l.d");
501}
502
503TEST_F(AssemblerMIPS64Test, CeilWS) {
504 DriverStr(RepeatFF(&mips64::Mips64Assembler::CeilWS, "ceil.w.s ${reg1}, ${reg2}"), "ceil.w.s");
505}
506
507TEST_F(AssemblerMIPS64Test, CeilWD) {
508 DriverStr(RepeatFF(&mips64::Mips64Assembler::CeilWD, "ceil.w.d ${reg1}, ${reg2}"), "ceil.w.d");
509}
510
511TEST_F(AssemblerMIPS64Test, FloorLS) {
512 DriverStr(RepeatFF(&mips64::Mips64Assembler::FloorLS, "floor.l.s ${reg1}, ${reg2}"), "floor.l.s");
513}
514
515TEST_F(AssemblerMIPS64Test, FloorLD) {
516 DriverStr(RepeatFF(&mips64::Mips64Assembler::FloorLD, "floor.l.d ${reg1}, ${reg2}"), "floor.l.d");
517}
518
519TEST_F(AssemblerMIPS64Test, FloorWS) {
520 DriverStr(RepeatFF(&mips64::Mips64Assembler::FloorWS, "floor.w.s ${reg1}, ${reg2}"), "floor.w.s");
521}
522
523TEST_F(AssemblerMIPS64Test, FloorWD) {
524 DriverStr(RepeatFF(&mips64::Mips64Assembler::FloorWD, "floor.w.d ${reg1}, ${reg2}"), "floor.w.d");
525}
526
527TEST_F(AssemblerMIPS64Test, SelS) {
528 DriverStr(RepeatFFF(&mips64::Mips64Assembler::SelS, "sel.s ${reg1}, ${reg2}, ${reg3}"), "sel.s");
529}
530
531TEST_F(AssemblerMIPS64Test, SelD) {
532 DriverStr(RepeatFFF(&mips64::Mips64Assembler::SelD, "sel.d ${reg1}, ${reg2}, ${reg3}"), "sel.d");
533}
534
Goran Jakovljevic2dec9272017-08-02 11:41:26 +0200535TEST_F(AssemblerMIPS64Test, SeleqzS) {
536 DriverStr(RepeatFFF(&mips64::Mips64Assembler::SeleqzS, "seleqz.s ${reg1}, ${reg2}, ${reg3}"),
537 "seleqz.s");
538}
539
540TEST_F(AssemblerMIPS64Test, SeleqzD) {
541 DriverStr(RepeatFFF(&mips64::Mips64Assembler::SeleqzD, "seleqz.d ${reg1}, ${reg2}, ${reg3}"),
542 "seleqz.d");
543}
544
545TEST_F(AssemblerMIPS64Test, SelnezS) {
546 DriverStr(RepeatFFF(&mips64::Mips64Assembler::SelnezS, "selnez.s ${reg1}, ${reg2}, ${reg3}"),
547 "selnez.s");
548}
549
550TEST_F(AssemblerMIPS64Test, SelnezD) {
551 DriverStr(RepeatFFF(&mips64::Mips64Assembler::SelnezD, "selnez.d ${reg1}, ${reg2}, ${reg3}"),
552 "selnez.d");
553}
554
Chris Larsendbce0d72015-09-17 13:34:00 -0700555TEST_F(AssemblerMIPS64Test, RintS) {
556 DriverStr(RepeatFF(&mips64::Mips64Assembler::RintS, "rint.s ${reg1}, ${reg2}"), "rint.s");
557}
558
559TEST_F(AssemblerMIPS64Test, RintD) {
560 DriverStr(RepeatFF(&mips64::Mips64Assembler::RintD, "rint.d ${reg1}, ${reg2}"), "rint.d");
561}
562
563TEST_F(AssemblerMIPS64Test, ClassS) {
564 DriverStr(RepeatFF(&mips64::Mips64Assembler::ClassS, "class.s ${reg1}, ${reg2}"), "class.s");
565}
566
567TEST_F(AssemblerMIPS64Test, ClassD) {
568 DriverStr(RepeatFF(&mips64::Mips64Assembler::ClassD, "class.d ${reg1}, ${reg2}"), "class.d");
569}
570
571TEST_F(AssemblerMIPS64Test, MinS) {
572 DriverStr(RepeatFFF(&mips64::Mips64Assembler::MinS, "min.s ${reg1}, ${reg2}, ${reg3}"), "min.s");
573}
574
575TEST_F(AssemblerMIPS64Test, MinD) {
576 DriverStr(RepeatFFF(&mips64::Mips64Assembler::MinD, "min.d ${reg1}, ${reg2}, ${reg3}"), "min.d");
577}
578
579TEST_F(AssemblerMIPS64Test, MaxS) {
580 DriverStr(RepeatFFF(&mips64::Mips64Assembler::MaxS, "max.s ${reg1}, ${reg2}, ${reg3}"), "max.s");
581}
582
583TEST_F(AssemblerMIPS64Test, MaxD) {
584 DriverStr(RepeatFFF(&mips64::Mips64Assembler::MaxD, "max.d ${reg1}, ${reg2}, ${reg3}"), "max.d");
585}
586
Alexey Frunze299a9392015-12-08 16:08:02 -0800587TEST_F(AssemblerMIPS64Test, CmpUnS) {
588 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUnS, "cmp.un.s ${reg1}, ${reg2}, ${reg3}"),
589 "cmp.un.s");
590}
591
592TEST_F(AssemblerMIPS64Test, CmpEqS) {
593 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpEqS, "cmp.eq.s ${reg1}, ${reg2}, ${reg3}"),
594 "cmp.eq.s");
595}
596
597TEST_F(AssemblerMIPS64Test, CmpUeqS) {
598 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUeqS, "cmp.ueq.s ${reg1}, ${reg2}, ${reg3}"),
599 "cmp.ueq.s");
600}
601
602TEST_F(AssemblerMIPS64Test, CmpLtS) {
603 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpLtS, "cmp.lt.s ${reg1}, ${reg2}, ${reg3}"),
604 "cmp.lt.s");
605}
606
607TEST_F(AssemblerMIPS64Test, CmpUltS) {
608 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUltS, "cmp.ult.s ${reg1}, ${reg2}, ${reg3}"),
609 "cmp.ult.s");
610}
611
612TEST_F(AssemblerMIPS64Test, CmpLeS) {
613 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpLeS, "cmp.le.s ${reg1}, ${reg2}, ${reg3}"),
614 "cmp.le.s");
615}
616
617TEST_F(AssemblerMIPS64Test, CmpUleS) {
618 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUleS, "cmp.ule.s ${reg1}, ${reg2}, ${reg3}"),
619 "cmp.ule.s");
620}
621
622TEST_F(AssemblerMIPS64Test, CmpOrS) {
623 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpOrS, "cmp.or.s ${reg1}, ${reg2}, ${reg3}"),
624 "cmp.or.s");
625}
626
627TEST_F(AssemblerMIPS64Test, CmpUneS) {
628 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUneS, "cmp.une.s ${reg1}, ${reg2}, ${reg3}"),
629 "cmp.une.s");
630}
631
632TEST_F(AssemblerMIPS64Test, CmpNeS) {
633 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpNeS, "cmp.ne.s ${reg1}, ${reg2}, ${reg3}"),
634 "cmp.ne.s");
635}
636
637TEST_F(AssemblerMIPS64Test, CmpUnD) {
638 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUnD, "cmp.un.d ${reg1}, ${reg2}, ${reg3}"),
639 "cmp.un.d");
640}
641
642TEST_F(AssemblerMIPS64Test, CmpEqD) {
643 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpEqD, "cmp.eq.d ${reg1}, ${reg2}, ${reg3}"),
644 "cmp.eq.d");
645}
646
647TEST_F(AssemblerMIPS64Test, CmpUeqD) {
648 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUeqD, "cmp.ueq.d ${reg1}, ${reg2}, ${reg3}"),
649 "cmp.ueq.d");
650}
651
652TEST_F(AssemblerMIPS64Test, CmpLtD) {
653 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpLtD, "cmp.lt.d ${reg1}, ${reg2}, ${reg3}"),
654 "cmp.lt.d");
655}
656
657TEST_F(AssemblerMIPS64Test, CmpUltD) {
658 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUltD, "cmp.ult.d ${reg1}, ${reg2}, ${reg3}"),
659 "cmp.ult.d");
660}
661
662TEST_F(AssemblerMIPS64Test, CmpLeD) {
663 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpLeD, "cmp.le.d ${reg1}, ${reg2}, ${reg3}"),
664 "cmp.le.d");
665}
666
667TEST_F(AssemblerMIPS64Test, CmpUleD) {
668 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUleD, "cmp.ule.d ${reg1}, ${reg2}, ${reg3}"),
669 "cmp.ule.d");
670}
671
672TEST_F(AssemblerMIPS64Test, CmpOrD) {
673 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpOrD, "cmp.or.d ${reg1}, ${reg2}, ${reg3}"),
674 "cmp.or.d");
675}
676
677TEST_F(AssemblerMIPS64Test, CmpUneD) {
678 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUneD, "cmp.une.d ${reg1}, ${reg2}, ${reg3}"),
679 "cmp.une.d");
680}
681
682TEST_F(AssemblerMIPS64Test, CmpNeD) {
683 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpNeD, "cmp.ne.d ${reg1}, ${reg2}, ${reg3}"),
684 "cmp.ne.d");
685}
686
Chris Larsendbce0d72015-09-17 13:34:00 -0700687TEST_F(AssemblerMIPS64Test, CvtDL) {
688 DriverStr(RepeatFF(&mips64::Mips64Assembler::Cvtdl, "cvt.d.l ${reg1}, ${reg2}"), "cvt.d.l");
689}
690
Chris Larsen51417632015-10-02 13:24:25 -0700691TEST_F(AssemblerMIPS64Test, CvtDS) {
692 DriverStr(RepeatFF(&mips64::Mips64Assembler::Cvtds, "cvt.d.s ${reg1}, ${reg2}"), "cvt.d.s");
693}
694
695TEST_F(AssemblerMIPS64Test, CvtDW) {
696 DriverStr(RepeatFF(&mips64::Mips64Assembler::Cvtdw, "cvt.d.w ${reg1}, ${reg2}"), "cvt.d.w");
697}
698
699TEST_F(AssemblerMIPS64Test, CvtSL) {
700 DriverStr(RepeatFF(&mips64::Mips64Assembler::Cvtsl, "cvt.s.l ${reg1}, ${reg2}"), "cvt.s.l");
701}
702
703TEST_F(AssemblerMIPS64Test, CvtSD) {
704 DriverStr(RepeatFF(&mips64::Mips64Assembler::Cvtsd, "cvt.s.d ${reg1}, ${reg2}"), "cvt.s.d");
705}
706
707TEST_F(AssemblerMIPS64Test, CvtSW) {
708 DriverStr(RepeatFF(&mips64::Mips64Assembler::Cvtsw, "cvt.s.w ${reg1}, ${reg2}"), "cvt.s.w");
709}
710
Alexey Frunzebaf60b72015-12-22 15:15:03 -0800711TEST_F(AssemblerMIPS64Test, TruncWS) {
712 DriverStr(RepeatFF(&mips64::Mips64Assembler::TruncWS, "trunc.w.s ${reg1}, ${reg2}"), "trunc.w.s");
713}
714
715TEST_F(AssemblerMIPS64Test, TruncWD) {
716 DriverStr(RepeatFF(&mips64::Mips64Assembler::TruncWD, "trunc.w.d ${reg1}, ${reg2}"), "trunc.w.d");
717}
718
719TEST_F(AssemblerMIPS64Test, TruncLS) {
720 DriverStr(RepeatFF(&mips64::Mips64Assembler::TruncLS, "trunc.l.s ${reg1}, ${reg2}"), "trunc.l.s");
721}
722
723TEST_F(AssemblerMIPS64Test, TruncLD) {
724 DriverStr(RepeatFF(&mips64::Mips64Assembler::TruncLD, "trunc.l.d ${reg1}, ${reg2}"), "trunc.l.d");
725}
726
Lazar Trsicd9672662015-09-03 17:33:01 +0200727TEST_F(AssemblerMIPS64Test, Mfc1) {
728 DriverStr(RepeatRF(&mips64::Mips64Assembler::Mfc1, "mfc1 ${reg1}, ${reg2}"), "Mfc1");
729}
730
731TEST_F(AssemblerMIPS64Test, Mfhc1) {
732 DriverStr(RepeatRF(&mips64::Mips64Assembler::Mfhc1, "mfhc1 ${reg1}, ${reg2}"), "Mfhc1");
733}
734
735TEST_F(AssemblerMIPS64Test, Mtc1) {
736 DriverStr(RepeatRF(&mips64::Mips64Assembler::Mtc1, "mtc1 ${reg1}, ${reg2}"), "Mtc1");
737}
738
739TEST_F(AssemblerMIPS64Test, Mthc1) {
740 DriverStr(RepeatRF(&mips64::Mips64Assembler::Mthc1, "mthc1 ${reg1}, ${reg2}"), "Mthc1");
741}
742
743TEST_F(AssemblerMIPS64Test, Dmfc1) {
744 DriverStr(RepeatRF(&mips64::Mips64Assembler::Dmfc1, "dmfc1 ${reg1}, ${reg2}"), "Dmfc1");
745}
746
747TEST_F(AssemblerMIPS64Test, Dmtc1) {
748 DriverStr(RepeatRF(&mips64::Mips64Assembler::Dmtc1, "dmtc1 ${reg1}, ${reg2}"), "Dmtc1");
749}
750
Goran Jakovljevic95f27142017-01-20 11:11:11 +0100751TEST_F(AssemblerMIPS64Test, Lwc1) {
752 DriverStr(RepeatFRIb(&mips64::Mips64Assembler::Lwc1, -16, "lwc1 ${reg1}, {imm}(${reg2})"),
753 "lwc1");
754}
755
756TEST_F(AssemblerMIPS64Test, Ldc1) {
757 DriverStr(RepeatFRIb(&mips64::Mips64Assembler::Ldc1, -16, "ldc1 ${reg1}, {imm}(${reg2})"),
758 "ldc1");
759}
760
761TEST_F(AssemblerMIPS64Test, Swc1) {
762 DriverStr(RepeatFRIb(&mips64::Mips64Assembler::Swc1, -16, "swc1 ${reg1}, {imm}(${reg2})"),
763 "swc1");
764}
765
766TEST_F(AssemblerMIPS64Test, Sdc1) {
767 DriverStr(RepeatFRIb(&mips64::Mips64Assembler::Sdc1, -16, "sdc1 ${reg1}, {imm}(${reg2})"),
768 "sdc1");
769}
770
Alexey Frunze0cab6562017-07-25 15:19:36 -0700771//////////////
772// BRANCHES //
773//////////////
Chris Larsen51417632015-10-02 13:24:25 -0700774
775TEST_F(AssemblerMIPS64Test, Jalr) {
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700776 DriverStr(".set noreorder\n" +
777 RepeatRRNoDupes(&mips64::Mips64Assembler::Jalr, "jalr ${reg1}, ${reg2}"), "jalr");
778}
779
Alexey Frunze0cab6562017-07-25 15:19:36 -0700780TEST_F(AssemblerMIPS64Test, Bc) {
781 BranchHelper(&mips64::Mips64Assembler::Bc, "Bc");
782}
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700783
Alexey Frunze0cab6562017-07-25 15:19:36 -0700784TEST_F(AssemblerMIPS64Test, Balc) {
785 BranchHelper(&mips64::Mips64Assembler::Balc, "Balc");
786}
787
788TEST_F(AssemblerMIPS64Test, Beqzc) {
789 BranchCondOneRegHelper(&mips64::Mips64Assembler::Beqzc, "Beqzc");
790}
791
792TEST_F(AssemblerMIPS64Test, Bnezc) {
793 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bnezc, "Bnezc");
794}
795
796TEST_F(AssemblerMIPS64Test, Bltzc) {
797 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bltzc, "Bltzc");
798}
799
800TEST_F(AssemblerMIPS64Test, Bgezc) {
801 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bgezc, "Bgezc");
802}
803
804TEST_F(AssemblerMIPS64Test, Blezc) {
805 BranchCondOneRegHelper(&mips64::Mips64Assembler::Blezc, "Blezc");
806}
807
808TEST_F(AssemblerMIPS64Test, Bgtzc) {
809 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bgtzc, "Bgtzc");
810}
811
812TEST_F(AssemblerMIPS64Test, Beqc) {
813 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Beqc, "Beqc");
814}
815
816TEST_F(AssemblerMIPS64Test, Bnec) {
817 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bnec, "Bnec");
818}
819
820TEST_F(AssemblerMIPS64Test, Bltc) {
821 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bltc, "Bltc");
822}
823
824TEST_F(AssemblerMIPS64Test, Bgec) {
825 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bgec, "Bgec");
826}
827
828TEST_F(AssemblerMIPS64Test, Bltuc) {
829 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bltuc, "Bltuc");
830}
831
832TEST_F(AssemblerMIPS64Test, Bgeuc) {
833 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bgeuc, "Bgeuc");
834}
835
836TEST_F(AssemblerMIPS64Test, Bc1eqz) {
837 BranchFpuCondHelper(&mips64::Mips64Assembler::Bc1eqz, "Bc1eqz");
838}
839
840TEST_F(AssemblerMIPS64Test, Bc1nez) {
841 BranchFpuCondHelper(&mips64::Mips64Assembler::Bc1nez, "Bc1nez");
842}
843
844TEST_F(AssemblerMIPS64Test, BareBc) {
845 BranchHelper(&mips64::Mips64Assembler::Bc, "Bc", /* is_bare */ true);
846}
847
848TEST_F(AssemblerMIPS64Test, BareBalc) {
849 BranchHelper(&mips64::Mips64Assembler::Balc, "Balc", /* is_bare */ true);
850}
851
852TEST_F(AssemblerMIPS64Test, BareBeqzc) {
853 BranchCondOneRegHelper(&mips64::Mips64Assembler::Beqzc, "Beqzc", /* is_bare */ true);
854}
855
856TEST_F(AssemblerMIPS64Test, BareBnezc) {
857 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bnezc, "Bnezc", /* is_bare */ true);
858}
859
860TEST_F(AssemblerMIPS64Test, BareBltzc) {
861 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bltzc, "Bltzc", /* is_bare */ true);
862}
863
864TEST_F(AssemblerMIPS64Test, BareBgezc) {
865 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bgezc, "Bgezc", /* is_bare */ true);
866}
867
868TEST_F(AssemblerMIPS64Test, BareBlezc) {
869 BranchCondOneRegHelper(&mips64::Mips64Assembler::Blezc, "Blezc", /* is_bare */ true);
870}
871
872TEST_F(AssemblerMIPS64Test, BareBgtzc) {
873 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bgtzc, "Bgtzc", /* is_bare */ true);
874}
875
876TEST_F(AssemblerMIPS64Test, BareBeqc) {
877 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Beqc, "Beqc", /* is_bare */ true);
878}
879
880TEST_F(AssemblerMIPS64Test, BareBnec) {
881 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bnec, "Bnec", /* is_bare */ true);
882}
883
884TEST_F(AssemblerMIPS64Test, BareBltc) {
885 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bltc, "Bltc", /* is_bare */ true);
886}
887
888TEST_F(AssemblerMIPS64Test, BareBgec) {
889 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bgec, "Bgec", /* is_bare */ true);
890}
891
892TEST_F(AssemblerMIPS64Test, BareBltuc) {
893 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bltuc, "Bltuc", /* is_bare */ true);
894}
895
896TEST_F(AssemblerMIPS64Test, BareBgeuc) {
897 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bgeuc, "Bgeuc", /* is_bare */ true);
898}
899
900TEST_F(AssemblerMIPS64Test, BareBc1eqz) {
901 BranchFpuCondHelper(&mips64::Mips64Assembler::Bc1eqz, "Bc1eqz", /* is_bare */ true);
902}
903
904TEST_F(AssemblerMIPS64Test, BareBc1nez) {
905 BranchFpuCondHelper(&mips64::Mips64Assembler::Bc1nez, "Bc1nez", /* is_bare */ true);
906}
907
908TEST_F(AssemblerMIPS64Test, BareBeqz) {
909 BranchCondOneRegHelper(&mips64::Mips64Assembler::Beqz, "Beqz", /* is_bare */ true);
910}
911
912TEST_F(AssemblerMIPS64Test, BareBnez) {
913 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bnez, "Bnez", /* is_bare */ true);
914}
915
916TEST_F(AssemblerMIPS64Test, BareBltz) {
917 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bltz, "Bltz", /* is_bare */ true);
918}
919
920TEST_F(AssemblerMIPS64Test, BareBgez) {
921 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bgez, "Bgez", /* is_bare */ true);
922}
923
924TEST_F(AssemblerMIPS64Test, BareBlez) {
925 BranchCondOneRegHelper(&mips64::Mips64Assembler::Blez, "Blez", /* is_bare */ true);
926}
927
928TEST_F(AssemblerMIPS64Test, BareBgtz) {
929 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bgtz, "Bgtz", /* is_bare */ true);
930}
931
932TEST_F(AssemblerMIPS64Test, BareBeq) {
933 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Beq, "Beq", /* is_bare */ true);
934}
935
936TEST_F(AssemblerMIPS64Test, BareBne) {
937 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bne, "Bne", /* is_bare */ true);
938}
939
940TEST_F(AssemblerMIPS64Test, LongBeqc) {
941 mips64::Mips64Label label;
942 __ Beqc(mips64::A0, mips64::A1, &label);
943 constexpr uint32_t kAdduCount1 = (1u << 15) + 1;
944 for (uint32_t i = 0; i != kAdduCount1; ++i) {
945 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
946 }
947 __ Bind(&label);
948 constexpr uint32_t kAdduCount2 = (1u << 15) + 1;
949 for (uint32_t i = 0; i != kAdduCount2; ++i) {
950 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
951 }
952 __ Beqc(mips64::A2, mips64::A3, &label);
953
954 uint32_t offset_forward = 2 + kAdduCount1; // 2: account for auipc and jic.
955 offset_forward <<= 2;
956 offset_forward += (offset_forward & 0x8000) << 1; // Account for sign extension in jic.
957
958 uint32_t offset_back = -(kAdduCount2 + 1); // 1: account for bnec.
959 offset_back <<= 2;
960 offset_back += (offset_back & 0x8000) << 1; // Account for sign extension in jic.
961
962 std::ostringstream oss;
963 oss <<
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700964 ".set noreorder\n"
Alexey Frunze0cab6562017-07-25 15:19:36 -0700965 "bnec $a0, $a1, 1f\n"
966 "auipc $at, 0x" << std::hex << High16Bits(offset_forward) << "\n"
967 "jic $at, 0x" << std::hex << Low16Bits(offset_forward) << "\n"
968 "1:\n" <<
969 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") <<
970 "2:\n" <<
971 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") <<
972 "bnec $a2, $a3, 3f\n"
973 "auipc $at, 0x" << std::hex << High16Bits(offset_back) << "\n"
974 "jic $at, 0x" << std::hex << Low16Bits(offset_back) << "\n"
975 "3:\n";
976 std::string expected = oss.str();
977 DriverStr(expected, "LongBeqc");
978}
979
980TEST_F(AssemblerMIPS64Test, LongBeqzc) {
981 constexpr uint32_t kNopCount1 = (1u << 20) + 1;
982 constexpr uint32_t kNopCount2 = (1u << 20) + 1;
983 constexpr uint32_t kRequiredCapacity = (kNopCount1 + kNopCount2 + 6u) * 4u;
984 ASSERT_LT(__ GetBuffer()->Capacity(), kRequiredCapacity);
985 __ GetBuffer()->ExtendCapacity(kRequiredCapacity);
986 mips64::Mips64Label label;
987 __ Beqzc(mips64::A0, &label);
988 for (uint32_t i = 0; i != kNopCount1; ++i) {
989 __ Nop();
990 }
991 __ Bind(&label);
992 for (uint32_t i = 0; i != kNopCount2; ++i) {
993 __ Nop();
994 }
995 __ Beqzc(mips64::A2, &label);
996
997 uint32_t offset_forward = 2 + kNopCount1; // 2: account for auipc and jic.
998 offset_forward <<= 2;
999 offset_forward += (offset_forward & 0x8000) << 1; // Account for sign extension in jic.
1000
1001 uint32_t offset_back = -(kNopCount2 + 1); // 1: account for bnezc.
1002 offset_back <<= 2;
1003 offset_back += (offset_back & 0x8000) << 1; // Account for sign extension in jic.
1004
1005 // Note, we're using the ".fill" directive to tell the assembler to generate many NOPs
1006 // instead of generating them ourselves in the source code. This saves test time.
1007 std::ostringstream oss;
1008 oss <<
1009 ".set noreorder\n"
1010 "bnezc $a0, 1f\n"
1011 "auipc $at, 0x" << std::hex << High16Bits(offset_forward) << "\n"
1012 "jic $at, 0x" << std::hex << Low16Bits(offset_forward) << "\n"
1013 "1:\n" <<
1014 ".fill 0x" << std::hex << kNopCount1 << " , 4, 0\n"
1015 "2:\n" <<
1016 ".fill 0x" << std::hex << kNopCount2 << " , 4, 0\n"
1017 "bnezc $a2, 3f\n"
1018 "auipc $at, 0x" << std::hex << High16Bits(offset_back) << "\n"
1019 "jic $at, 0x" << std::hex << Low16Bits(offset_back) << "\n"
1020 "3:\n";
1021 std::string expected = oss.str();
1022 DriverStr(expected, "LongBeqzc");
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001023}
1024
Alexey Frunze19f6c692016-11-30 19:19:55 -08001025TEST_F(AssemblerMIPS64Test, LongBalc) {
Vladimir Marko36073942016-12-14 14:18:22 +00001026 constexpr uint32_t kNopCount1 = (1u << 25) + 1;
1027 constexpr uint32_t kNopCount2 = (1u << 25) + 1;
1028 constexpr uint32_t kRequiredCapacity = (kNopCount1 + kNopCount2 + 6u) * 4u;
1029 ASSERT_LT(__ GetBuffer()->Capacity(), kRequiredCapacity);
1030 __ GetBuffer()->ExtendCapacity(kRequiredCapacity);
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001031 mips64::Mips64Label label1, label2;
Alexey Frunze19f6c692016-11-30 19:19:55 -08001032 __ Balc(&label1);
Alexey Frunze19f6c692016-11-30 19:19:55 -08001033 for (uint32_t i = 0; i != kNopCount1; ++i) {
1034 __ Nop();
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001035 }
1036 __ Bind(&label1);
Alexey Frunze19f6c692016-11-30 19:19:55 -08001037 __ Balc(&label2);
Alexey Frunze19f6c692016-11-30 19:19:55 -08001038 for (uint32_t i = 0; i != kNopCount2; ++i) {
1039 __ Nop();
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001040 }
1041 __ Bind(&label2);
Alexey Frunze19f6c692016-11-30 19:19:55 -08001042 __ Balc(&label1);
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001043
Alexey Frunze19f6c692016-11-30 19:19:55 -08001044 uint32_t offset_forward1 = 2 + kNopCount1; // 2: account for auipc and jialc.
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001045 offset_forward1 <<= 2;
Alexey Frunze19f6c692016-11-30 19:19:55 -08001046 offset_forward1 += (offset_forward1 & 0x8000) << 1; // Account for sign extension in jialc.
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001047
Alexey Frunze19f6c692016-11-30 19:19:55 -08001048 uint32_t offset_forward2 = 2 + kNopCount2; // 2: account for auipc and jialc.
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001049 offset_forward2 <<= 2;
Alexey Frunze19f6c692016-11-30 19:19:55 -08001050 offset_forward2 += (offset_forward2 & 0x8000) << 1; // Account for sign extension in jialc.
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001051
Alexey Frunze19f6c692016-11-30 19:19:55 -08001052 uint32_t offset_back = -(2 + kNopCount2); // 2: account for auipc and jialc.
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001053 offset_back <<= 2;
Alexey Frunze19f6c692016-11-30 19:19:55 -08001054 offset_back += (offset_back & 0x8000) << 1; // Account for sign extension in jialc.
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001055
Alexey Frunze19f6c692016-11-30 19:19:55 -08001056 // Note, we're using the ".fill" directive to tell the assembler to generate many NOPs
1057 // instead of generating them ourselves in the source code. This saves a few minutes
1058 // of test time.
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001059 std::ostringstream oss;
1060 oss <<
1061 ".set noreorder\n"
Alexey Frunze19f6c692016-11-30 19:19:55 -08001062 "auipc $at, 0x" << std::hex << High16Bits(offset_forward1) << "\n"
1063 "jialc $at, 0x" << std::hex << Low16Bits(offset_forward1) << "\n"
1064 ".fill 0x" << std::hex << kNopCount1 << " , 4, 0\n"
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001065 "1:\n"
Alexey Frunze19f6c692016-11-30 19:19:55 -08001066 "auipc $at, 0x" << std::hex << High16Bits(offset_forward2) << "\n"
1067 "jialc $at, 0x" << std::hex << Low16Bits(offset_forward2) << "\n"
1068 ".fill 0x" << std::hex << kNopCount2 << " , 4, 0\n"
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001069 "2:\n"
Alexey Frunze19f6c692016-11-30 19:19:55 -08001070 "auipc $at, 0x" << std::hex << High16Bits(offset_back) << "\n"
1071 "jialc $at, 0x" << std::hex << Low16Bits(offset_back) << "\n";
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001072 std::string expected = oss.str();
Alexey Frunze19f6c692016-11-30 19:19:55 -08001073 DriverStr(expected, "LongBalc");
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001074}
1075
Chris Larsendbce0d72015-09-17 13:34:00 -07001076//////////
1077// MISC //
1078//////////
1079
Alexey Frunze19f6c692016-11-30 19:19:55 -08001080TEST_F(AssemblerMIPS64Test, Lwpc) {
1081 // Lwpc() takes an unsigned 19-bit immediate, while the GNU assembler needs a signed offset,
1082 // hence the sign extension from bit 18 with `imm - ((imm & 0x40000) << 1)`.
1083 // The GNU assembler also wants the offset to be a multiple of 4, which it will shift right
1084 // by 2 positions when encoding, hence `<< 2` to compensate for that shift.
1085 // We capture the value of the immediate with `.set imm, {imm}` because the value is needed
1086 // twice for the sign extension, but `{imm}` is substituted only once.
1087 const char* code = ".set imm, {imm}\nlw ${reg}, ((imm - ((imm & 0x40000) << 1)) << 2)($pc)";
1088 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Lwpc, 19, code), "Lwpc");
1089}
1090
1091TEST_F(AssemblerMIPS64Test, Lwupc) {
1092 // The comment for the Lwpc test applies here as well.
1093 const char* code = ".set imm, {imm}\nlwu ${reg}, ((imm - ((imm & 0x40000) << 1)) << 2)($pc)";
1094 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Lwupc, 19, code), "Lwupc");
1095}
1096
1097TEST_F(AssemblerMIPS64Test, Ldpc) {
1098 // The comment for the Lwpc test applies here as well.
1099 const char* code = ".set imm, {imm}\nld ${reg}, ((imm - ((imm & 0x20000) << 1)) << 3)($pc)";
1100 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Ldpc, 18, code), "Ldpc");
1101}
1102
Goran Jakovljevic95f27142017-01-20 11:11:11 +01001103TEST_F(AssemblerMIPS64Test, Auipc) {
1104 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Auipc, 16, "auipc ${reg}, {imm}"), "Auipc");
1105}
1106
1107TEST_F(AssemblerMIPS64Test, Addiupc) {
1108 // The comment from the Lwpc() test applies to this Addiupc() test as well.
1109 const char* code = ".set imm, {imm}\naddiupc ${reg}, (imm - ((imm & 0x40000) << 1)) << 2";
1110 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Addiupc, 19, code), "Addiupc");
1111}
1112
Goran Jakovljevic95f27142017-01-20 11:11:11 +01001113TEST_F(AssemblerMIPS64Test, Addu) {
1114 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Addu, "addu ${reg1}, ${reg2}, ${reg3}"), "addu");
1115}
1116
1117TEST_F(AssemblerMIPS64Test, Addiu) {
1118 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Addiu, -16, "addiu ${reg1}, ${reg2}, {imm}"),
1119 "addiu");
1120}
1121
1122TEST_F(AssemblerMIPS64Test, Daddu) {
1123 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Daddu, "daddu ${reg1}, ${reg2}, ${reg3}"), "daddu");
1124}
1125
1126TEST_F(AssemblerMIPS64Test, Daddiu) {
1127 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Daddiu, -16, "daddiu ${reg1}, ${reg2}, {imm}"),
1128 "daddiu");
1129}
1130
1131TEST_F(AssemblerMIPS64Test, Subu) {
1132 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Subu, "subu ${reg1}, ${reg2}, ${reg3}"), "subu");
1133}
1134
1135TEST_F(AssemblerMIPS64Test, Dsubu) {
1136 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dsubu, "dsubu ${reg1}, ${reg2}, ${reg3}"), "dsubu");
1137}
1138
1139TEST_F(AssemblerMIPS64Test, MulR6) {
1140 DriverStr(RepeatRRR(&mips64::Mips64Assembler::MulR6, "mul ${reg1}, ${reg2}, ${reg3}"), "mulR6");
1141}
1142
1143TEST_F(AssemblerMIPS64Test, DivR6) {
1144 DriverStr(RepeatRRR(&mips64::Mips64Assembler::DivR6, "div ${reg1}, ${reg2}, ${reg3}"), "divR6");
1145}
1146
1147TEST_F(AssemblerMIPS64Test, ModR6) {
1148 DriverStr(RepeatRRR(&mips64::Mips64Assembler::ModR6, "mod ${reg1}, ${reg2}, ${reg3}"), "modR6");
1149}
1150
1151TEST_F(AssemblerMIPS64Test, DivuR6) {
1152 DriverStr(RepeatRRR(&mips64::Mips64Assembler::DivuR6, "divu ${reg1}, ${reg2}, ${reg3}"),
1153 "divuR6");
1154}
1155
1156TEST_F(AssemblerMIPS64Test, ModuR6) {
1157 DriverStr(RepeatRRR(&mips64::Mips64Assembler::ModuR6, "modu ${reg1}, ${reg2}, ${reg3}"),
1158 "moduR6");
1159}
1160
1161TEST_F(AssemblerMIPS64Test, Dmul) {
1162 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dmul, "dmul ${reg1}, ${reg2}, ${reg3}"), "dmul");
1163}
1164
1165TEST_F(AssemblerMIPS64Test, Ddiv) {
1166 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Ddiv, "ddiv ${reg1}, ${reg2}, ${reg3}"), "ddiv");
1167}
1168
1169TEST_F(AssemblerMIPS64Test, Dmod) {
1170 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dmod, "dmod ${reg1}, ${reg2}, ${reg3}"), "dmod");
1171}
1172
1173TEST_F(AssemblerMIPS64Test, Ddivu) {
1174 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Ddivu, "ddivu ${reg1}, ${reg2}, ${reg3}"), "ddivu");
1175}
1176
1177TEST_F(AssemblerMIPS64Test, Dmodu) {
1178 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dmodu, "dmodu ${reg1}, ${reg2}, ${reg3}"), "dmodu");
1179}
1180
1181TEST_F(AssemblerMIPS64Test, And) {
1182 DriverStr(RepeatRRR(&mips64::Mips64Assembler::And, "and ${reg1}, ${reg2}, ${reg3}"), "and");
1183}
1184
1185TEST_F(AssemblerMIPS64Test, Andi) {
1186 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Andi, 16, "andi ${reg1}, ${reg2}, {imm}"), "andi");
1187}
1188
1189TEST_F(AssemblerMIPS64Test, Or) {
1190 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Or, "or ${reg1}, ${reg2}, ${reg3}"), "or");
1191}
1192
1193TEST_F(AssemblerMIPS64Test, Ori) {
1194 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Ori, 16, "ori ${reg1}, ${reg2}, {imm}"), "ori");
1195}
1196
1197TEST_F(AssemblerMIPS64Test, Xor) {
1198 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Xor, "xor ${reg1}, ${reg2}, ${reg3}"), "xor");
1199}
1200
1201TEST_F(AssemblerMIPS64Test, Xori) {
1202 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Xori, 16, "xori ${reg1}, ${reg2}, {imm}"), "xori");
1203}
1204
1205TEST_F(AssemblerMIPS64Test, Nor) {
1206 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Nor, "nor ${reg1}, ${reg2}, ${reg3}"), "nor");
1207}
1208
1209TEST_F(AssemblerMIPS64Test, Lb) {
1210 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lb, -16, "lb ${reg1}, {imm}(${reg2})"), "lb");
1211}
1212
1213TEST_F(AssemblerMIPS64Test, Lh) {
1214 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lh, -16, "lh ${reg1}, {imm}(${reg2})"), "lh");
1215}
1216
1217TEST_F(AssemblerMIPS64Test, Lw) {
1218 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lw, -16, "lw ${reg1}, {imm}(${reg2})"), "lw");
1219}
1220
1221TEST_F(AssemblerMIPS64Test, Ld) {
1222 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Ld, -16, "ld ${reg1}, {imm}(${reg2})"), "ld");
1223}
1224
1225TEST_F(AssemblerMIPS64Test, Lbu) {
1226 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lbu, -16, "lbu ${reg1}, {imm}(${reg2})"), "lbu");
1227}
1228
1229TEST_F(AssemblerMIPS64Test, Lhu) {
1230 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lhu, -16, "lhu ${reg1}, {imm}(${reg2})"), "lhu");
1231}
1232
1233TEST_F(AssemblerMIPS64Test, Lwu) {
1234 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lwu, -16, "lwu ${reg1}, {imm}(${reg2})"), "lwu");
1235}
1236
1237TEST_F(AssemblerMIPS64Test, Lui) {
1238 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Lui, 16, "lui ${reg}, {imm}"), "lui");
1239}
1240
Alexey Frunzec061de12017-02-14 13:27:23 -08001241TEST_F(AssemblerMIPS64Test, Daui) {
1242 std::vector<mips64::GpuRegister*> reg1_registers = GetRegisters();
1243 std::vector<mips64::GpuRegister*> reg2_registers = GetRegisters();
1244 reg2_registers.erase(reg2_registers.begin()); // reg2 can't be ZERO, remove it.
1245 std::vector<int64_t> imms = CreateImmediateValuesBits(/* imm_bits */ 16, /* as_uint */ true);
1246 WarnOnCombinations(reg1_registers.size() * reg2_registers.size() * imms.size());
1247 std::ostringstream expected;
1248 for (mips64::GpuRegister* reg1 : reg1_registers) {
1249 for (mips64::GpuRegister* reg2 : reg2_registers) {
1250 for (int64_t imm : imms) {
1251 __ Daui(*reg1, *reg2, imm);
1252 expected << "daui $" << *reg1 << ", $" << *reg2 << ", " << imm << "\n";
1253 }
1254 }
1255 }
1256 DriverStr(expected.str(), "daui");
1257}
1258
Goran Jakovljevic95f27142017-01-20 11:11:11 +01001259TEST_F(AssemblerMIPS64Test, Dahi) {
1260 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Dahi, 16, "dahi ${reg}, ${reg}, {imm}"), "dahi");
1261}
1262
1263TEST_F(AssemblerMIPS64Test, Dati) {
1264 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Dati, 16, "dati ${reg}, ${reg}, {imm}"), "dati");
1265}
1266
1267TEST_F(AssemblerMIPS64Test, Sb) {
1268 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sb, -16, "sb ${reg1}, {imm}(${reg2})"), "sb");
1269}
1270
1271TEST_F(AssemblerMIPS64Test, Sh) {
1272 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sh, -16, "sh ${reg1}, {imm}(${reg2})"), "sh");
1273}
1274
1275TEST_F(AssemblerMIPS64Test, Sw) {
1276 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sw, -16, "sw ${reg1}, {imm}(${reg2})"), "sw");
1277}
1278
1279TEST_F(AssemblerMIPS64Test, Sd) {
1280 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sd, -16, "sd ${reg1}, {imm}(${reg2})"), "sd");
1281}
1282
1283TEST_F(AssemblerMIPS64Test, Slt) {
1284 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Slt, "slt ${reg1}, ${reg2}, ${reg3}"), "slt");
1285}
1286
1287TEST_F(AssemblerMIPS64Test, Sltu) {
1288 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Sltu, "sltu ${reg1}, ${reg2}, ${reg3}"), "sltu");
1289}
1290
1291TEST_F(AssemblerMIPS64Test, Slti) {
1292 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Slti, -16, "slti ${reg1}, ${reg2}, {imm}"),
1293 "slti");
1294}
1295
1296TEST_F(AssemblerMIPS64Test, Sltiu) {
1297 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sltiu, -16, "sltiu ${reg1}, ${reg2}, {imm}"),
1298 "sltiu");
1299}
1300
1301TEST_F(AssemblerMIPS64Test, Move) {
1302 DriverStr(RepeatRR(&mips64::Mips64Assembler::Move, "or ${reg1}, ${reg2}, $zero"), "move");
1303}
1304
1305TEST_F(AssemblerMIPS64Test, Clear) {
1306 DriverStr(RepeatR(&mips64::Mips64Assembler::Clear, "or ${reg}, $zero, $zero"), "clear");
1307}
1308
1309TEST_F(AssemblerMIPS64Test, Not) {
1310 DriverStr(RepeatRR(&mips64::Mips64Assembler::Not, "nor ${reg1}, ${reg2}, $zero"), "not");
1311}
1312
Chris Larsendbce0d72015-09-17 13:34:00 -07001313TEST_F(AssemblerMIPS64Test, Bitswap) {
1314 DriverStr(RepeatRR(&mips64::Mips64Assembler::Bitswap, "bitswap ${reg1}, ${reg2}"), "bitswap");
1315}
1316
1317TEST_F(AssemblerMIPS64Test, Dbitswap) {
1318 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dbitswap, "dbitswap ${reg1}, ${reg2}"), "dbitswap");
1319}
1320
Chris Larsen51417632015-10-02 13:24:25 -07001321TEST_F(AssemblerMIPS64Test, Seb) {
1322 DriverStr(RepeatRR(&mips64::Mips64Assembler::Seb, "seb ${reg1}, ${reg2}"), "seb");
1323}
1324
1325TEST_F(AssemblerMIPS64Test, Seh) {
1326 DriverStr(RepeatRR(&mips64::Mips64Assembler::Seh, "seh ${reg1}, ${reg2}"), "seh");
1327}
1328
Chris Larsendbce0d72015-09-17 13:34:00 -07001329TEST_F(AssemblerMIPS64Test, Dsbh) {
1330 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dsbh, "dsbh ${reg1}, ${reg2}"), "dsbh");
1331}
1332
1333TEST_F(AssemblerMIPS64Test, Dshd) {
1334 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dshd, "dshd ${reg1}, ${reg2}"), "dshd");
1335}
1336
Lazar Trsicd9672662015-09-03 17:33:01 +02001337TEST_F(AssemblerMIPS64Test, Dext) {
1338 std::vector<mips64::GpuRegister*> reg1_registers = GetRegisters();
1339 std::vector<mips64::GpuRegister*> reg2_registers = GetRegisters();
1340 WarnOnCombinations(reg1_registers.size() * reg2_registers.size() * 33 * 16);
1341 std::ostringstream expected;
1342 for (mips64::GpuRegister* reg1 : reg1_registers) {
1343 for (mips64::GpuRegister* reg2 : reg2_registers) {
1344 for (int32_t pos = 0; pos < 32; pos++) {
1345 for (int32_t size = 1; size <= 32; size++) {
1346 __ Dext(*reg1, *reg2, pos, size);
1347 expected << "dext $" << *reg1 << ", $" << *reg2 << ", " << pos << ", " << size << "\n";
1348 }
1349 }
1350 }
1351 }
1352
1353 DriverStr(expected.str(), "Dext");
1354}
1355
Lena Djokica556e6b2017-12-13 12:09:42 +01001356TEST_F(AssemblerMIPS64Test, Ins) {
1357 std::vector<mips64::GpuRegister*> regs = GetRegisters();
1358 WarnOnCombinations(regs.size() * regs.size() * 33 * 16);
1359 std::string expected;
1360 for (mips64::GpuRegister* reg1 : regs) {
1361 for (mips64::GpuRegister* reg2 : regs) {
1362 for (int32_t pos = 0; pos < 32; pos++) {
1363 for (int32_t size = 1; pos + size <= 32; size++) {
1364 __ Ins(*reg1, *reg2, pos, size);
1365 std::ostringstream instr;
1366 instr << "ins $" << *reg1 << ", $" << *reg2 << ", " << pos << ", " << size << "\n";
1367 expected += instr.str();
1368 }
1369 }
1370 }
1371 }
1372 DriverStr(expected, "Ins");
1373}
1374
1375TEST_F(AssemblerMIPS64Test, DblIns) {
Lazar Trsicd9672662015-09-03 17:33:01 +02001376 std::vector<mips64::GpuRegister*> reg1_registers = GetRegisters();
1377 std::vector<mips64::GpuRegister*> reg2_registers = GetRegisters();
Lena Djokica556e6b2017-12-13 12:09:42 +01001378 WarnOnCombinations(reg1_registers.size() * reg2_registers.size() * 65 * 32);
Lazar Trsicd9672662015-09-03 17:33:01 +02001379 std::ostringstream expected;
1380 for (mips64::GpuRegister* reg1 : reg1_registers) {
1381 for (mips64::GpuRegister* reg2 : reg2_registers) {
Lena Djokica556e6b2017-12-13 12:09:42 +01001382 for (int32_t pos = 0; pos < 64; pos++) {
Lazar Trsicd9672662015-09-03 17:33:01 +02001383 for (int32_t size = 1; pos + size <= 64; size++) {
Lena Djokica556e6b2017-12-13 12:09:42 +01001384 __ DblIns(*reg1, *reg2, pos, size);
1385 expected << "dins $" << *reg1 << ", $" << *reg2 << ", " << pos << ", " << size << "\n";
Lazar Trsicd9672662015-09-03 17:33:01 +02001386 }
1387 }
1388 }
1389 }
1390
Lena Djokica556e6b2017-12-13 12:09:42 +01001391 DriverStr(expected.str(), "DblIns");
Lazar Trsicd9672662015-09-03 17:33:01 +02001392}
1393
Chris Larsene3660592016-11-09 11:13:42 -08001394TEST_F(AssemblerMIPS64Test, Lsa) {
1395 DriverStr(RepeatRRRIb(&mips64::Mips64Assembler::Lsa,
1396 2,
1397 "lsa ${reg1}, ${reg2}, ${reg3}, {imm}",
1398 1),
1399 "lsa");
1400}
1401
1402TEST_F(AssemblerMIPS64Test, Dlsa) {
1403 DriverStr(RepeatRRRIb(&mips64::Mips64Assembler::Dlsa,
1404 2,
1405 "dlsa ${reg1}, ${reg2}, ${reg3}, {imm}",
1406 1),
1407 "dlsa");
1408}
1409
Chris Larsendbce0d72015-09-17 13:34:00 -07001410TEST_F(AssemblerMIPS64Test, Wsbh) {
1411 DriverStr(RepeatRR(&mips64::Mips64Assembler::Wsbh, "wsbh ${reg1}, ${reg2}"), "wsbh");
1412}
1413
Chris Larsen51417632015-10-02 13:24:25 -07001414TEST_F(AssemblerMIPS64Test, Sll) {
1415 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sll, 5, "sll ${reg1}, ${reg2}, {imm}"), "sll");
1416}
1417
1418TEST_F(AssemblerMIPS64Test, Srl) {
1419 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Srl, 5, "srl ${reg1}, ${reg2}, {imm}"), "srl");
1420}
1421
Chris Larsen98a73e12015-10-19 14:17:16 -07001422TEST_F(AssemblerMIPS64Test, Rotr) {
1423 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Rotr, 5, "rotr ${reg1}, ${reg2}, {imm}"), "rotr");
1424}
1425
Chris Larsen51417632015-10-02 13:24:25 -07001426TEST_F(AssemblerMIPS64Test, Sra) {
1427 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sra, 5, "sra ${reg1}, ${reg2}, {imm}"), "sra");
1428}
1429
Chris Larsen98a73e12015-10-19 14:17:16 -07001430TEST_F(AssemblerMIPS64Test, Sllv) {
1431 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Sllv, "sllv ${reg1}, ${reg2}, ${reg3}"), "sllv");
1432}
1433
1434TEST_F(AssemblerMIPS64Test, Srlv) {
1435 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Srlv, "srlv ${reg1}, ${reg2}, ${reg3}"), "srlv");
1436}
1437
1438TEST_F(AssemblerMIPS64Test, Rotrv) {
1439 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Rotrv, "rotrv ${reg1}, ${reg2}, ${reg3}"), "rotrv");
1440}
1441
1442TEST_F(AssemblerMIPS64Test, Srav) {
1443 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Srav, "srav ${reg1}, ${reg2}, ${reg3}"), "srav");
1444}
1445
Chris Larsen51417632015-10-02 13:24:25 -07001446TEST_F(AssemblerMIPS64Test, Dsll) {
1447 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsll, 5, "dsll ${reg1}, ${reg2}, {imm}"), "dsll");
1448}
1449
1450TEST_F(AssemblerMIPS64Test, Dsrl) {
1451 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsrl, 5, "dsrl ${reg1}, ${reg2}, {imm}"), "dsrl");
1452}
1453
Chris Larsen98a73e12015-10-19 14:17:16 -07001454TEST_F(AssemblerMIPS64Test, Drotr) {
1455 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Drotr, 5, "drotr ${reg1}, ${reg2}, {imm}"),
1456 "drotr");
1457}
1458
Chris Larsen51417632015-10-02 13:24:25 -07001459TEST_F(AssemblerMIPS64Test, Dsra) {
1460 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsra, 5, "dsra ${reg1}, ${reg2}, {imm}"), "dsra");
1461}
1462
1463TEST_F(AssemblerMIPS64Test, Dsll32) {
Chris Larsen98a73e12015-10-19 14:17:16 -07001464 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsll32, 5, "dsll32 ${reg1}, ${reg2}, {imm}"),
1465 "dsll32");
Chris Larsen51417632015-10-02 13:24:25 -07001466}
1467
1468TEST_F(AssemblerMIPS64Test, Dsrl32) {
Chris Larsen98a73e12015-10-19 14:17:16 -07001469 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsrl32, 5, "dsrl32 ${reg1}, ${reg2}, {imm}"),
1470 "dsrl32");
1471}
1472
1473TEST_F(AssemblerMIPS64Test, Drotr32) {
1474 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Drotr32, 5, "drotr32 ${reg1}, ${reg2}, {imm}"),
1475 "drotr32");
Chris Larsen51417632015-10-02 13:24:25 -07001476}
1477
1478TEST_F(AssemblerMIPS64Test, Dsra32) {
Chris Larsen98a73e12015-10-19 14:17:16 -07001479 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsra32, 5, "dsra32 ${reg1}, ${reg2}, {imm}"),
1480 "dsra32");
Chris Larsen51417632015-10-02 13:24:25 -07001481}
1482
Goran Jakovljevic95f27142017-01-20 11:11:11 +01001483TEST_F(AssemblerMIPS64Test, Dsllv) {
1484 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dsllv, "dsllv ${reg1}, ${reg2}, ${reg3}"), "dsllv");
1485}
1486
1487TEST_F(AssemblerMIPS64Test, Dsrlv) {
1488 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dsrlv, "dsrlv ${reg1}, ${reg2}, ${reg3}"), "dsrlv");
1489}
1490
1491TEST_F(AssemblerMIPS64Test, Dsrav) {
1492 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dsrav, "dsrav ${reg1}, ${reg2}, ${reg3}"), "dsrav");
1493}
1494
Chris Larsendbce0d72015-09-17 13:34:00 -07001495TEST_F(AssemblerMIPS64Test, Sc) {
1496 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sc, -9, "sc ${reg1}, {imm}(${reg2})"), "sc");
1497}
1498
1499TEST_F(AssemblerMIPS64Test, Scd) {
1500 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Scd, -9, "scd ${reg1}, {imm}(${reg2})"), "scd");
1501}
1502
1503TEST_F(AssemblerMIPS64Test, Ll) {
1504 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Ll, -9, "ll ${reg1}, {imm}(${reg2})"), "ll");
1505}
1506
1507TEST_F(AssemblerMIPS64Test, Lld) {
1508 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lld, -9, "lld ${reg1}, {imm}(${reg2})"), "lld");
1509}
1510
Chris Larsendbce0d72015-09-17 13:34:00 -07001511TEST_F(AssemblerMIPS64Test, Seleqz) {
1512 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Seleqz, "seleqz ${reg1}, ${reg2}, ${reg3}"),
1513 "seleqz");
1514}
1515
1516TEST_F(AssemblerMIPS64Test, Selnez) {
1517 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Selnez, "selnez ${reg1}, ${reg2}, ${reg3}"),
1518 "selnez");
1519}
1520
1521TEST_F(AssemblerMIPS64Test, Clz) {
1522 DriverStr(RepeatRR(&mips64::Mips64Assembler::Clz, "clz ${reg1}, ${reg2}"), "clz");
1523}
1524
1525TEST_F(AssemblerMIPS64Test, Clo) {
1526 DriverStr(RepeatRR(&mips64::Mips64Assembler::Clo, "clo ${reg1}, ${reg2}"), "clo");
1527}
1528
1529TEST_F(AssemblerMIPS64Test, Dclz) {
1530 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dclz, "dclz ${reg1}, ${reg2}"), "dclz");
1531}
1532
1533TEST_F(AssemblerMIPS64Test, Dclo) {
1534 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dclo, "dclo ${reg1}, ${reg2}"), "dclo");
1535}
1536
Lazar Trsicd9672662015-09-03 17:33:01 +02001537TEST_F(AssemblerMIPS64Test, LoadFromOffset) {
1538 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A0, 0);
1539 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0);
1540 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 1);
1541 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 256);
1542 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 1000);
1543 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x7FFF);
1544 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x8000);
1545 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x8001);
1546 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x10000);
1547 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x12345678);
1548 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, -256);
1549 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, -32768);
1550 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001551 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x7FFFFFFE);
1552 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x7FFFFFFF);
1553 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x80000000);
1554 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x80000001);
Lazar Trsicd9672662015-09-03 17:33:01 +02001555
1556 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A0, 0);
1557 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0);
1558 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 1);
1559 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 256);
1560 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 1000);
1561 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x7FFF);
1562 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x8000);
1563 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x8001);
1564 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x10000);
1565 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x12345678);
1566 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, -256);
1567 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, -32768);
1568 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001569 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x7FFFFFFE);
1570 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x7FFFFFFF);
1571 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x80000000);
1572 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x80000001);
Lazar Trsicd9672662015-09-03 17:33:01 +02001573
1574 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A0, 0);
1575 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0);
1576 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 2);
1577 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 256);
1578 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 1000);
1579 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x7FFE);
1580 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x8000);
1581 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x8002);
1582 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x10000);
1583 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x12345678);
1584 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, -256);
1585 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, -32768);
1586 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001587 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x7FFFFFFC);
1588 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x7FFFFFFE);
1589 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x80000000);
1590 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x80000002);
Lazar Trsicd9672662015-09-03 17:33:01 +02001591
1592 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A0, 0);
1593 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0);
1594 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 2);
1595 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 256);
1596 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 1000);
1597 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x7FFE);
1598 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x8000);
1599 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x8002);
1600 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x10000);
1601 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x12345678);
1602 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, -256);
1603 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, -32768);
1604 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001605 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x7FFFFFFC);
1606 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x7FFFFFFE);
1607 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x80000000);
1608 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x80000002);
Lazar Trsicd9672662015-09-03 17:33:01 +02001609
1610 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A0, 0);
1611 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0);
1612 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 4);
1613 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 256);
1614 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 1000);
1615 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x7FFC);
1616 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x8000);
1617 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x8004);
1618 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x10000);
1619 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x12345678);
1620 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, -256);
1621 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, -32768);
1622 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001623 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x7FFFFFF8);
1624 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x7FFFFFFC);
1625 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x80000000);
1626 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x80000004);
Lazar Trsicd9672662015-09-03 17:33:01 +02001627
1628 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A0, 0);
1629 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0);
1630 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 4);
1631 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 256);
1632 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 1000);
1633 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x7FFC);
1634 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x8000);
1635 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x8004);
1636 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x10000);
1637 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x12345678);
1638 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, -256);
1639 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, -32768);
1640 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001641 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x7FFFFFF8);
1642 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x7FFFFFFC);
1643 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x80000000);
1644 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x80000004);
Lazar Trsicd9672662015-09-03 17:33:01 +02001645
1646 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A0, 0);
1647 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0);
1648 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 4);
1649 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 256);
1650 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 1000);
1651 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x7FFC);
1652 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x8000);
1653 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x8004);
1654 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x10000);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001655 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x27FFC);
Lazar Trsicd9672662015-09-03 17:33:01 +02001656 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x12345678);
1657 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, -256);
1658 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, -32768);
1659 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001660 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x7FFFFFF8);
1661 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x7FFFFFFC);
1662 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x80000000);
1663 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x80000004);
Lazar Trsicd9672662015-09-03 17:33:01 +02001664
1665 const char* expected =
1666 "lb $a0, 0($a0)\n"
1667 "lb $a0, 0($a1)\n"
1668 "lb $a0, 1($a1)\n"
1669 "lb $a0, 256($a1)\n"
1670 "lb $a0, 1000($a1)\n"
1671 "lb $a0, 0x7FFF($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001672 "daddiu $at, $a1, 0x7FF8\n"
1673 "lb $a0, 8($at)\n"
1674 "daddiu $at, $a1, 32760\n"
1675 "lb $a0, 9($at)\n"
1676 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001677 "lb $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001678 "daui $at, $a1, 0x1234\n"
1679 "lb $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001680 "lb $a0, -256($a1)\n"
1681 "lb $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001682 "daui $at, $a1, 0xABCE\n"
1683 "lb $a0, -4352($at)\n"
1684 "daui $at, $a1, 32768\n"
1685 "dahi $at, $at, 1\n"
1686 "lb $a0, -2($at)\n"
1687 "daui $at, $a1, 32768\n"
1688 "dahi $at, $at, 1\n"
1689 "lb $a0, -1($at)\n"
1690 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001691 "lb $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001692 "daui $at, $a1, 32768\n"
1693 "lb $a0, 1($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001694
1695 "lbu $a0, 0($a0)\n"
1696 "lbu $a0, 0($a1)\n"
1697 "lbu $a0, 1($a1)\n"
1698 "lbu $a0, 256($a1)\n"
1699 "lbu $a0, 1000($a1)\n"
1700 "lbu $a0, 0x7FFF($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001701 "daddiu $at, $a1, 0x7FF8\n"
1702 "lbu $a0, 8($at)\n"
1703 "daddiu $at, $a1, 32760\n"
1704 "lbu $a0, 9($at)\n"
1705 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001706 "lbu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001707 "daui $at, $a1, 0x1234\n"
1708 "lbu $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001709 "lbu $a0, -256($a1)\n"
1710 "lbu $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001711 "daui $at, $a1, 0xABCE\n"
1712 "lbu $a0, -4352($at)\n"
1713 "daui $at, $a1, 32768\n"
1714 "dahi $at, $at, 1\n"
1715 "lbu $a0, -2($at)\n"
1716 "daui $at, $a1, 32768\n"
1717 "dahi $at, $at, 1\n"
1718 "lbu $a0, -1($at)\n"
1719 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001720 "lbu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001721 "daui $at, $a1, 32768\n"
1722 "lbu $a0, 1($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001723
1724 "lh $a0, 0($a0)\n"
1725 "lh $a0, 0($a1)\n"
1726 "lh $a0, 2($a1)\n"
1727 "lh $a0, 256($a1)\n"
1728 "lh $a0, 1000($a1)\n"
1729 "lh $a0, 0x7FFE($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001730 "daddiu $at, $a1, 0x7FF8\n"
1731 "lh $a0, 8($at)\n"
1732 "daddiu $at, $a1, 32760\n"
1733 "lh $a0, 10($at)\n"
1734 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001735 "lh $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001736 "daui $at, $a1, 0x1234\n"
1737 "lh $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001738 "lh $a0, -256($a1)\n"
1739 "lh $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001740 "daui $at, $a1, 0xABCE\n"
1741 "lh $a0, -4352($at)\n"
1742 "daui $at, $a1, 32768\n"
1743 "dahi $at, $at, 1\n"
1744 "lh $a0, -4($at)\n"
1745 "daui $at, $a1, 32768\n"
1746 "dahi $at, $at, 1\n"
1747 "lh $a0, -2($at)\n"
1748 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001749 "lh $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001750 "daui $at, $a1, 32768\n"
1751 "lh $a0, 2($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001752
1753 "lhu $a0, 0($a0)\n"
1754 "lhu $a0, 0($a1)\n"
1755 "lhu $a0, 2($a1)\n"
1756 "lhu $a0, 256($a1)\n"
1757 "lhu $a0, 1000($a1)\n"
1758 "lhu $a0, 0x7FFE($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001759 "daddiu $at, $a1, 0x7FF8\n"
1760 "lhu $a0, 8($at)\n"
1761 "daddiu $at, $a1, 32760\n"
1762 "lhu $a0, 10($at)\n"
1763 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001764 "lhu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001765 "daui $at, $a1, 0x1234\n"
1766 "lhu $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001767 "lhu $a0, -256($a1)\n"
1768 "lhu $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001769 "daui $at, $a1, 0xABCE\n"
1770 "lhu $a0, -4352($at)\n"
1771 "daui $at, $a1, 32768\n"
1772 "dahi $at, $at, 1\n"
1773 "lhu $a0, -4($at)\n"
1774 "daui $at, $a1, 32768\n"
1775 "dahi $at, $at, 1\n"
1776 "lhu $a0, -2($at)\n"
1777 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001778 "lhu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001779 "daui $at, $a1, 32768\n"
1780 "lhu $a0, 2($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001781
1782 "lw $a0, 0($a0)\n"
1783 "lw $a0, 0($a1)\n"
1784 "lw $a0, 4($a1)\n"
1785 "lw $a0, 256($a1)\n"
1786 "lw $a0, 1000($a1)\n"
1787 "lw $a0, 0x7FFC($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001788 "daddiu $at, $a1, 0x7FF8\n"
1789 "lw $a0, 8($at)\n"
1790 "daddiu $at, $a1, 32760\n"
1791 "lw $a0, 12($at)\n"
1792 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001793 "lw $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001794 "daui $at, $a1, 0x1234\n"
1795 "lw $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001796 "lw $a0, -256($a1)\n"
1797 "lw $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001798 "daui $at, $a1, 0xABCE\n"
1799 "lw $a0, -4352($at)\n"
1800 "daui $at, $a1, 32768\n"
1801 "dahi $at, $at, 1\n"
1802 "lw $a0, -8($at)\n"
1803 "daui $at, $a1, 32768\n"
1804 "dahi $at, $at, 1\n"
1805 "lw $a0, -4($at)\n"
1806 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001807 "lw $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001808 "daui $at, $a1, 32768\n"
1809 "lw $a0, 4($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001810
1811 "lwu $a0, 0($a0)\n"
1812 "lwu $a0, 0($a1)\n"
1813 "lwu $a0, 4($a1)\n"
1814 "lwu $a0, 256($a1)\n"
1815 "lwu $a0, 1000($a1)\n"
1816 "lwu $a0, 0x7FFC($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001817 "daddiu $at, $a1, 0x7FF8\n"
1818 "lwu $a0, 8($at)\n"
1819 "daddiu $at, $a1, 32760\n"
1820 "lwu $a0, 12($at)\n"
1821 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001822 "lwu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001823 "daui $at, $a1, 0x1234\n"
1824 "lwu $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001825 "lwu $a0, -256($a1)\n"
1826 "lwu $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001827 "daui $at, $a1, 0xABCE\n"
1828 "lwu $a0, -4352($at)\n"
1829 "daui $at, $a1, 32768\n"
1830 "dahi $at, $at, 1\n"
1831 "lwu $a0, -8($at)\n"
1832 "daui $at, $a1, 32768\n"
1833 "dahi $at, $at, 1\n"
1834 "lwu $a0, -4($at)\n"
1835 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001836 "lwu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001837 "daui $at, $a1, 32768\n"
1838 "lwu $a0, 4($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001839
1840 "ld $a0, 0($a0)\n"
1841 "ld $a0, 0($a1)\n"
1842 "lwu $a0, 4($a1)\n"
1843 "lwu $t3, 8($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001844 "dinsu $a0, $t3, 32, 32\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001845 "ld $a0, 256($a1)\n"
1846 "ld $a0, 1000($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001847 "daddiu $at, $a1, 32760\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001848 "lwu $a0, 4($at)\n"
1849 "lwu $t3, 8($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001850 "dinsu $a0, $t3, 32, 32\n"
1851 "daddiu $at, $a1, 32760\n"
1852 "ld $a0, 8($at)\n"
1853 "daddiu $at, $a1, 32760\n"
1854 "lwu $a0, 12($at)\n"
1855 "lwu $t3, 16($at)\n"
1856 "dinsu $a0, $t3, 32, 32\n"
1857 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001858 "ld $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001859 "daui $at, $a1, 2\n"
1860 "daddiu $at, $at, 8\n"
1861 "lwu $a0, 0x7ff4($at)\n"
1862 "lwu $t3, 0x7ff8($at)\n"
1863 "dinsu $a0, $t3, 32, 32\n"
1864 "daui $at, $a1, 0x1234\n"
1865 "ld $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001866 "ld $a0, -256($a1)\n"
1867 "ld $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001868 "daui $at, $a1, 0xABCE\n"
1869 "ld $a0, -4352($at)\n"
1870 "daui $at, $a1, 32768\n"
1871 "dahi $at, $at, 1\n"
1872 "ld $a0, -8($at)\n"
1873 "daui $at, $a1, 32768\n"
1874 "dahi $at, $at, 1\n"
1875 "lwu $a0, -4($at)\n"
1876 "lwu $t3, 0($at)\n"
1877 "dinsu $a0, $t3, 32, 32\n"
1878 "daui $at, $a1, 32768\n"
1879 "ld $a0, 0($at)\n"
1880 "daui $at, $a1, 32768\n"
1881 "lwu $a0, 4($at)\n"
1882 "lwu $t3, 8($at)\n"
1883 "dinsu $a0, $t3, 32, 32\n";
Lazar Trsicd9672662015-09-03 17:33:01 +02001884 DriverStr(expected, "LoadFromOffset");
1885}
1886
1887TEST_F(AssemblerMIPS64Test, LoadFpuFromOffset) {
1888 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0);
1889 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 4);
1890 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 256);
1891 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x7FFC);
1892 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x8000);
1893 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x8004);
1894 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x10000);
1895 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x12345678);
1896 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, -256);
1897 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, -32768);
1898 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0xABCDEF00);
1899
1900 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0);
1901 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 4);
1902 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 256);
1903 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x7FFC);
1904 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x8000);
1905 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x8004);
1906 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x10000);
1907 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x12345678);
1908 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, -256);
1909 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, -32768);
1910 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0xABCDEF00);
1911
Goran Jakovljevicd8b6a532017-04-20 11:42:30 +02001912 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0);
1913 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 1);
1914 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 2);
1915 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4);
1916 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 8);
1917 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 511);
1918 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 512);
1919 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 513);
1920 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 514);
1921 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 516);
1922 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 1022);
1923 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 1024);
1924 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 1025);
1925 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 1026);
1926 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 1028);
1927 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 2044);
1928 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 2048);
1929 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 2049);
1930 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 2050);
1931 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 2052);
1932 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4088);
1933 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4096);
1934 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4097);
1935 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4098);
1936 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4100);
1937 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4104);
1938 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0x7FFC);
1939 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0x8000);
1940 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0x10000);
1941 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0x12345678);
1942 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0x12350078);
1943 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -256);
1944 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -511);
1945 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -513);
1946 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -1022);
1947 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -1026);
1948 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -2044);
1949 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -2052);
1950 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -4096);
1951 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -4104);
1952 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -32768);
1953 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0xABCDEF00);
1954 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0x7FFFABCD);
1955
Lazar Trsicd9672662015-09-03 17:33:01 +02001956 const char* expected =
1957 "lwc1 $f0, 0($a0)\n"
1958 "lwc1 $f0, 4($a0)\n"
1959 "lwc1 $f0, 256($a0)\n"
1960 "lwc1 $f0, 0x7FFC($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001961 "daddiu $at, $a0, 32760 # 0x7FF8\n"
1962 "lwc1 $f0, 8($at)\n"
1963 "daddiu $at, $a0, 32760 # 0x7FF8\n"
1964 "lwc1 $f0, 12($at)\n"
1965 "daui $at, $a0, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001966 "lwc1 $f0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001967 "daui $at, $a0, 4660 # 0x1234\n"
1968 "lwc1 $f0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001969 "lwc1 $f0, -256($a0)\n"
1970 "lwc1 $f0, -32768($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001971 "daui $at, $a0, 0xABCE\n"
1972 "lwc1 $f0, -0x1100($at) # 0xEF00\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001973
1974 "ldc1 $f0, 0($a0)\n"
1975 "lwc1 $f0, 4($a0)\n"
1976 "lw $t3, 8($a0)\n"
1977 "mthc1 $t3, $f0\n"
1978 "ldc1 $f0, 256($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001979 "daddiu $at, $a0, 32760 # 0x7FF8\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001980 "lwc1 $f0, 4($at)\n"
1981 "lw $t3, 8($at)\n"
1982 "mthc1 $t3, $f0\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001983 "daddiu $at, $a0, 32760 # 0x7FF8\n"
1984 "ldc1 $f0, 8($at)\n"
1985 "daddiu $at, $a0, 32760 # 0x7FF8\n"
1986 "lwc1 $f0, 12($at)\n"
1987 "lw $t3, 16($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001988 "mthc1 $t3, $f0\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001989 "daui $at, $a0, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001990 "ldc1 $f0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001991 "daui $at, $a0, 4660 # 0x1234\n"
1992 "ldc1 $f0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001993 "ldc1 $f0, -256($a0)\n"
1994 "ldc1 $f0, -32768($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001995 "daui $at, $a0, 0xABCE\n"
Goran Jakovljevicd8b6a532017-04-20 11:42:30 +02001996 "ldc1 $f0, -0x1100($at) # 0xEF00\n"
1997
1998 "ld.d $w0, 0($a0)\n"
1999 "ld.b $w0, 1($a0)\n"
2000 "ld.h $w0, 2($a0)\n"
2001 "ld.w $w0, 4($a0)\n"
2002 "ld.d $w0, 8($a0)\n"
2003 "ld.b $w0, 511($a0)\n"
2004 "ld.d $w0, 512($a0)\n"
2005 "daddiu $at, $a0, 513\n"
2006 "ld.b $w0, 0($at)\n"
2007 "ld.h $w0, 514($a0)\n"
2008 "ld.w $w0, 516($a0)\n"
2009 "ld.h $w0, 1022($a0)\n"
2010 "ld.d $w0, 1024($a0)\n"
2011 "daddiu $at, $a0, 1025\n"
2012 "ld.b $w0, 0($at)\n"
2013 "daddiu $at, $a0, 1026\n"
2014 "ld.h $w0, 0($at)\n"
2015 "ld.w $w0, 1028($a0)\n"
2016 "ld.w $w0, 2044($a0)\n"
2017 "ld.d $w0, 2048($a0)\n"
2018 "daddiu $at, $a0, 2049\n"
2019 "ld.b $w0, 0($at)\n"
2020 "daddiu $at, $a0, 2050\n"
2021 "ld.h $w0, 0($at)\n"
2022 "daddiu $at, $a0, 2052\n"
2023 "ld.w $w0, 0($at)\n"
2024 "ld.d $w0, 4088($a0)\n"
2025 "daddiu $at, $a0, 4096\n"
2026 "ld.d $w0, 0($at)\n"
2027 "daddiu $at, $a0, 4097\n"
2028 "ld.b $w0, 0($at)\n"
2029 "daddiu $at, $a0, 4098\n"
2030 "ld.h $w0, 0($at)\n"
2031 "daddiu $at, $a0, 4100\n"
2032 "ld.w $w0, 0($at)\n"
2033 "daddiu $at, $a0, 4104\n"
2034 "ld.d $w0, 0($at)\n"
2035 "daddiu $at, $a0, 0x7FFC\n"
2036 "ld.w $w0, 0($at)\n"
2037 "daddiu $at, $a0, 0x7FF8\n"
2038 "ld.d $w0, 8($at)\n"
2039 "daui $at, $a0, 0x1\n"
2040 "ld.d $w0, 0($at)\n"
2041 "daui $at, $a0, 0x1234\n"
2042 "daddiu $at, $at, 0x6000\n"
2043 "ld.d $w0, -2440($at) # 0xF678\n"
2044 "daui $at, $a0, 0x1235\n"
2045 "ld.d $w0, 0x78($at)\n"
2046 "ld.d $w0, -256($a0)\n"
2047 "ld.b $w0, -511($a0)\n"
2048 "daddiu $at, $a0, -513\n"
2049 "ld.b $w0, 0($at)\n"
2050 "ld.h $w0, -1022($a0)\n"
2051 "daddiu $at, $a0, -1026\n"
2052 "ld.h $w0, 0($at)\n"
2053 "ld.w $w0, -2044($a0)\n"
2054 "daddiu $at, $a0, -2052\n"
2055 "ld.w $w0, 0($at)\n"
2056 "ld.d $w0, -4096($a0)\n"
2057 "daddiu $at, $a0, -4104\n"
2058 "ld.d $w0, 0($at)\n"
2059 "daddiu $at, $a0, -32768\n"
2060 "ld.d $w0, 0($at)\n"
2061 "daui $at, $a0, 0xABCE\n"
2062 "daddiu $at, $at, -8192 # 0xE000\n"
2063 "ld.d $w0, 0xF00($at)\n"
2064 "daui $at, $a0, 0x8000\n"
2065 "dahi $at, $at, 1\n"
2066 "daddiu $at, $at, -21504 # 0xAC00\n"
2067 "ld.b $w0, -51($at) # 0xFFCD\n";
Lazar Trsicd9672662015-09-03 17:33:01 +02002068 DriverStr(expected, "LoadFpuFromOffset");
2069}
2070
2071TEST_F(AssemblerMIPS64Test, StoreToOffset) {
2072 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A0, 0);
2073 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0);
2074 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 1);
2075 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 256);
2076 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 1000);
2077 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x7FFF);
2078 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x8000);
2079 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x8001);
2080 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x10000);
2081 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x12345678);
2082 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, -256);
2083 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, -32768);
2084 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0xABCDEF00);
2085
2086 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A0, 0);
2087 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0);
2088 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 2);
2089 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 256);
2090 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 1000);
2091 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x7FFE);
2092 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x8000);
2093 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x8002);
2094 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x10000);
2095 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x12345678);
2096 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, -256);
2097 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, -32768);
2098 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0xABCDEF00);
2099
2100 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A0, 0);
2101 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0);
2102 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 4);
2103 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 256);
2104 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 1000);
2105 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x7FFC);
2106 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x8000);
2107 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x8004);
2108 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x10000);
2109 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x12345678);
2110 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, -256);
2111 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, -32768);
2112 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0xABCDEF00);
2113
2114 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A0, 0);
2115 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0);
2116 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 4);
2117 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 256);
2118 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 1000);
2119 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x7FFC);
2120 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x8000);
2121 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x8004);
2122 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x10000);
2123 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x12345678);
2124 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, -256);
2125 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, -32768);
2126 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002127 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x7FFFFFF8);
2128 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x7FFFFFFC);
2129 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x80000000);
2130 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x80000004);
Lazar Trsicd9672662015-09-03 17:33:01 +02002131
2132 const char* expected =
2133 "sb $a0, 0($a0)\n"
2134 "sb $a0, 0($a1)\n"
2135 "sb $a0, 1($a1)\n"
2136 "sb $a0, 256($a1)\n"
2137 "sb $a0, 1000($a1)\n"
2138 "sb $a0, 0x7FFF($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002139 "daddiu $at, $a1, 0x7FF8\n"
2140 "sb $a0, 8($at)\n"
2141 "daddiu $at, $a1, 0x7FF8\n"
2142 "sb $a0, 9($at)\n"
2143 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002144 "sb $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002145 "daui $at, $a1, 4660 # 0x1234\n"
2146 "sb $a0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002147 "sb $a0, -256($a1)\n"
2148 "sb $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002149 "daui $at, $a1, 43982 # 0xABCE\n"
2150 "sb $a0, -4352($at) # 0xEF00\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002151
2152 "sh $a0, 0($a0)\n"
2153 "sh $a0, 0($a1)\n"
2154 "sh $a0, 2($a1)\n"
2155 "sh $a0, 256($a1)\n"
2156 "sh $a0, 1000($a1)\n"
2157 "sh $a0, 0x7FFE($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002158 "daddiu $at, $a1, 0x7FF8\n"
2159 "sh $a0, 8($at)\n"
2160 "daddiu $at, $a1, 0x7FF8\n"
2161 "sh $a0, 10($at)\n"
2162 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002163 "sh $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002164 "daui $at, $a1, 4660 # 0x1234\n"
2165 "sh $a0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002166 "sh $a0, -256($a1)\n"
2167 "sh $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002168 "daui $at, $a1, 43982 # 0xABCE\n"
2169 "sh $a0, -4352($at) # 0xEF00\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002170
2171 "sw $a0, 0($a0)\n"
2172 "sw $a0, 0($a1)\n"
2173 "sw $a0, 4($a1)\n"
2174 "sw $a0, 256($a1)\n"
2175 "sw $a0, 1000($a1)\n"
2176 "sw $a0, 0x7FFC($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002177 "daddiu $at, $a1, 0x7FF8\n"
2178 "sw $a0, 8($at)\n"
2179 "daddiu $at, $a1, 0x7FF8\n"
2180 "sw $a0, 12($at)\n"
2181 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002182 "sw $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002183 "daui $at, $a1, 4660 # 0x1234\n"
2184 "sw $a0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002185 "sw $a0, -256($a1)\n"
2186 "sw $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002187 "daui $at, $a1, 43982 # 0xABCE\n"
2188 "sw $a0, -4352($at) # 0xEF00\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002189
2190 "sd $a0, 0($a0)\n"
2191 "sd $a0, 0($a1)\n"
2192 "sw $a0, 4($a1)\n"
2193 "dsrl32 $t3, $a0, 0\n"
2194 "sw $t3, 8($a1)\n"
2195 "sd $a0, 256($a1)\n"
2196 "sd $a0, 1000($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002197 "daddiu $at, $a1, 0x7FF8\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002198 "sw $a0, 4($at)\n"
2199 "dsrl32 $t3, $a0, 0\n"
2200 "sw $t3, 8($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002201 "daddiu $at, $a1, 32760 # 0x7FF8\n"
2202 "sd $a0, 8($at)\n"
2203 "daddiu $at, $a1, 32760 # 0x7FF8\n"
2204 "sw $a0, 12($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002205 "dsrl32 $t3, $a0, 0\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002206 "sw $t3, 16($at)\n"
2207 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002208 "sd $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002209 "daui $at, $a1, 4660 # 0x1234\n"
2210 "sd $a0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002211 "sd $a0, -256($a1)\n"
2212 "sd $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002213 "daui $at, $a1, 0xABCE\n"
2214 "sd $a0, -0x1100($at)\n"
2215 "daui $at, $a1, 0x8000\n"
2216 "dahi $at, $at, 1\n"
2217 "sd $a0, -8($at)\n"
2218 "daui $at, $a1, 0x8000\n"
2219 "dahi $at, $at, 1\n"
2220 "sw $a0, -4($at) # 0xFFFC\n"
2221 "dsrl32 $t3, $a0, 0\n"
2222 "sw $t3, 0($at) # 0x0\n"
2223 "daui $at, $a1, 0x8000\n"
2224 "sd $a0, 0($at) # 0x0\n"
2225 "daui $at, $a1, 0x8000\n"
2226 "sw $a0, 4($at) # 0x4\n"
2227 "dsrl32 $t3, $a0, 0\n"
2228 "sw $t3, 8($at) # 0x8\n";
Lazar Trsicd9672662015-09-03 17:33:01 +02002229 DriverStr(expected, "StoreToOffset");
2230}
2231
2232TEST_F(AssemblerMIPS64Test, StoreFpuToOffset) {
2233 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0);
2234 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 4);
2235 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 256);
2236 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x7FFC);
2237 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x8000);
2238 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x8004);
2239 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x10000);
2240 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x12345678);
2241 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, -256);
2242 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, -32768);
2243 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0xABCDEF00);
2244
2245 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0);
2246 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 4);
2247 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 256);
2248 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x7FFC);
2249 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x8000);
2250 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x8004);
2251 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x10000);
2252 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x12345678);
2253 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, -256);
2254 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, -32768);
2255 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0xABCDEF00);
2256
Goran Jakovljevicd8b6a532017-04-20 11:42:30 +02002257 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0);
2258 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 1);
2259 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 2);
2260 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4);
2261 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 8);
2262 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 511);
2263 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 512);
2264 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 513);
2265 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 514);
2266 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 516);
2267 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 1022);
2268 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 1024);
2269 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 1025);
2270 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 1026);
2271 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 1028);
2272 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 2044);
2273 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 2048);
2274 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 2049);
2275 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 2050);
2276 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 2052);
2277 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4088);
2278 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4096);
2279 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4097);
2280 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4098);
2281 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4100);
2282 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4104);
2283 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0x7FFC);
2284 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0x8000);
2285 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0x10000);
2286 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0x12345678);
2287 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0x12350078);
2288 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -256);
2289 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -511);
2290 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -513);
2291 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -1022);
2292 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -1026);
2293 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -2044);
2294 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -2052);
2295 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -4096);
2296 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -4104);
2297 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -32768);
2298 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0xABCDEF00);
2299 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0x7FFFABCD);
2300
Lazar Trsicd9672662015-09-03 17:33:01 +02002301 const char* expected =
2302 "swc1 $f0, 0($a0)\n"
2303 "swc1 $f0, 4($a0)\n"
2304 "swc1 $f0, 256($a0)\n"
2305 "swc1 $f0, 0x7FFC($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002306 "daddiu $at, $a0, 32760 # 0x7FF8\n"
2307 "swc1 $f0, 8($at)\n"
2308 "daddiu $at, $a0, 32760 # 0x7FF8\n"
2309 "swc1 $f0, 12($at)\n"
2310 "daui $at, $a0, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002311 "swc1 $f0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002312 "daui $at, $a0, 4660 # 0x1234\n"
2313 "swc1 $f0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002314 "swc1 $f0, -256($a0)\n"
2315 "swc1 $f0, -32768($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002316 "daui $at, $a0, 0xABCE\n"
2317 "swc1 $f0, -0x1100($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002318
2319 "sdc1 $f0, 0($a0)\n"
2320 "mfhc1 $t3, $f0\n"
2321 "swc1 $f0, 4($a0)\n"
2322 "sw $t3, 8($a0)\n"
2323 "sdc1 $f0, 256($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002324 "daddiu $at, $a0, 32760 # 0x7FF8\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002325 "mfhc1 $t3, $f0\n"
2326 "swc1 $f0, 4($at)\n"
2327 "sw $t3, 8($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002328 "daddiu $at, $a0, 32760 # 0x7FF8\n"
2329 "sdc1 $f0, 8($at)\n"
2330 "daddiu $at, $a0, 32760 # 0x7FF8\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002331 "mfhc1 $t3, $f0\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002332 "swc1 $f0, 12($at)\n"
2333 "sw $t3, 16($at)\n"
2334 "daui $at, $a0, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002335 "sdc1 $f0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002336 "daui $at, $a0, 4660 # 0x1234\n"
2337 "sdc1 $f0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002338 "sdc1 $f0, -256($a0)\n"
2339 "sdc1 $f0, -32768($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002340 "daui $at, $a0, 0xABCE\n"
Goran Jakovljevicd8b6a532017-04-20 11:42:30 +02002341 "sdc1 $f0, -0x1100($at)\n"
2342
2343 "st.d $w0, 0($a0)\n"
2344 "st.b $w0, 1($a0)\n"
2345 "st.h $w0, 2($a0)\n"
2346 "st.w $w0, 4($a0)\n"
2347 "st.d $w0, 8($a0)\n"
2348 "st.b $w0, 511($a0)\n"
2349 "st.d $w0, 512($a0)\n"
2350 "daddiu $at, $a0, 513\n"
2351 "st.b $w0, 0($at)\n"
2352 "st.h $w0, 514($a0)\n"
2353 "st.w $w0, 516($a0)\n"
2354 "st.h $w0, 1022($a0)\n"
2355 "st.d $w0, 1024($a0)\n"
2356 "daddiu $at, $a0, 1025\n"
2357 "st.b $w0, 0($at)\n"
2358 "daddiu $at, $a0, 1026\n"
2359 "st.h $w0, 0($at)\n"
2360 "st.w $w0, 1028($a0)\n"
2361 "st.w $w0, 2044($a0)\n"
2362 "st.d $w0, 2048($a0)\n"
2363 "daddiu $at, $a0, 2049\n"
2364 "st.b $w0, 0($at)\n"
2365 "daddiu $at, $a0, 2050\n"
2366 "st.h $w0, 0($at)\n"
2367 "daddiu $at, $a0, 2052\n"
2368 "st.w $w0, 0($at)\n"
2369 "st.d $w0, 4088($a0)\n"
2370 "daddiu $at, $a0, 4096\n"
2371 "st.d $w0, 0($at)\n"
2372 "daddiu $at, $a0, 4097\n"
2373 "st.b $w0, 0($at)\n"
2374 "daddiu $at, $a0, 4098\n"
2375 "st.h $w0, 0($at)\n"
2376 "daddiu $at, $a0, 4100\n"
2377 "st.w $w0, 0($at)\n"
2378 "daddiu $at, $a0, 4104\n"
2379 "st.d $w0, 0($at)\n"
2380 "daddiu $at, $a0, 0x7FFC\n"
2381 "st.w $w0, 0($at)\n"
2382 "daddiu $at, $a0, 0x7FF8\n"
2383 "st.d $w0, 8($at)\n"
2384 "daui $at, $a0, 0x1\n"
2385 "st.d $w0, 0($at)\n"
2386 "daui $at, $a0, 0x1234\n"
2387 "daddiu $at, $at, 0x6000\n"
2388 "st.d $w0, -2440($at) # 0xF678\n"
2389 "daui $at, $a0, 0x1235\n"
2390 "st.d $w0, 0x78($at)\n"
2391 "st.d $w0, -256($a0)\n"
2392 "st.b $w0, -511($a0)\n"
2393 "daddiu $at, $a0, -513\n"
2394 "st.b $w0, 0($at)\n"
2395 "st.h $w0, -1022($a0)\n"
2396 "daddiu $at, $a0, -1026\n"
2397 "st.h $w0, 0($at)\n"
2398 "st.w $w0, -2044($a0)\n"
2399 "daddiu $at, $a0, -2052\n"
2400 "st.w $w0, 0($at)\n"
2401 "st.d $w0, -4096($a0)\n"
2402 "daddiu $at, $a0, -4104\n"
2403 "st.d $w0, 0($at)\n"
2404 "daddiu $at, $a0, -32768\n"
2405 "st.d $w0, 0($at)\n"
2406 "daui $at, $a0, 0xABCE\n"
2407 "daddiu $at, $at, -8192 # 0xE000\n"
2408 "st.d $w0, 0xF00($at)\n"
2409 "daui $at, $a0, 0x8000\n"
2410 "dahi $at, $at, 1\n"
2411 "daddiu $at, $at, -21504 # 0xAC00\n"
2412 "st.b $w0, -51($at) # 0xFFCD\n";
Lazar Trsicd9672662015-09-03 17:33:01 +02002413 DriverStr(expected, "StoreFpuToOffset");
2414}
2415
Tijana Jakovljevicba89c342017-03-10 13:36:08 +01002416TEST_F(AssemblerMIPS64Test, StoreConstToOffset) {
2417 __ StoreConstToOffset(mips64::kStoreByte, 0xFF, mips64::A1, +0, mips64::T8);
2418 __ StoreConstToOffset(mips64::kStoreHalfword, 0xFFFF, mips64::A1, +0, mips64::T8);
2419 __ StoreConstToOffset(mips64::kStoreWord, 0x12345678, mips64::A1, +0, mips64::T8);
2420 __ StoreConstToOffset(mips64::kStoreDoubleword, 0x123456789ABCDEF0, mips64::A1, +0, mips64::T8);
2421
2422 __ StoreConstToOffset(mips64::kStoreByte, 0, mips64::A1, +0, mips64::T8);
2423 __ StoreConstToOffset(mips64::kStoreHalfword, 0, mips64::A1, +0, mips64::T8);
2424 __ StoreConstToOffset(mips64::kStoreWord, 0, mips64::A1, +0, mips64::T8);
2425 __ StoreConstToOffset(mips64::kStoreDoubleword, 0, mips64::A1, +0, mips64::T8);
2426
2427 __ StoreConstToOffset(mips64::kStoreDoubleword, 0x1234567812345678, mips64::A1, +0, mips64::T8);
2428 __ StoreConstToOffset(mips64::kStoreDoubleword, 0x1234567800000000, mips64::A1, +0, mips64::T8);
2429 __ StoreConstToOffset(mips64::kStoreDoubleword, 0x0000000012345678, mips64::A1, +0, mips64::T8);
2430
2431 __ StoreConstToOffset(mips64::kStoreWord, 0, mips64::T8, +0, mips64::T8);
2432 __ StoreConstToOffset(mips64::kStoreWord, 0x12345678, mips64::T8, +0, mips64::T8);
2433
2434 __ StoreConstToOffset(mips64::kStoreWord, 0, mips64::A1, -0xFFF0, mips64::T8);
2435 __ StoreConstToOffset(mips64::kStoreWord, 0x12345678, mips64::A1, +0xFFF0, mips64::T8);
2436
2437 __ StoreConstToOffset(mips64::kStoreWord, 0, mips64::T8, -0xFFF0, mips64::T8);
2438 __ StoreConstToOffset(mips64::kStoreWord, 0x12345678, mips64::T8, +0xFFF0, mips64::T8);
2439
2440 const char* expected =
2441 "ori $t8, $zero, 0xFF\n"
2442 "sb $t8, 0($a1)\n"
2443 "ori $t8, $zero, 0xFFFF\n"
2444 "sh $t8, 0($a1)\n"
2445 "lui $t8, 0x1234\n"
2446 "ori $t8, $t8,0x5678\n"
2447 "sw $t8, 0($a1)\n"
2448 "lui $t8, 0x9abc\n"
2449 "ori $t8, $t8,0xdef0\n"
2450 "dahi $t8, $t8, 0x5679\n"
2451 "dati $t8, $t8, 0x1234\n"
2452 "sd $t8, 0($a1)\n"
2453 "sb $zero, 0($a1)\n"
2454 "sh $zero, 0($a1)\n"
2455 "sw $zero, 0($a1)\n"
2456 "sd $zero, 0($a1)\n"
2457 "lui $t8, 0x1234\n"
2458 "ori $t8, $t8,0x5678\n"
2459 "dins $t8, $t8, 0x20, 0x20\n"
2460 "sd $t8, 0($a1)\n"
2461 "lui $t8, 0x246\n"
2462 "ori $t8, $t8, 0x8acf\n"
2463 "dsll32 $t8, $t8, 0x3\n"
2464 "sd $t8, 0($a1)\n"
2465 "lui $t8, 0x1234\n"
2466 "ori $t8, $t8, 0x5678\n"
2467 "sd $t8, 0($a1)\n"
2468 "sw $zero, 0($t8)\n"
2469 "lui $at,0x1234\n"
2470 "ori $at, $at, 0x5678\n"
2471 "sw $at, 0($t8)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002472 "daddiu $at, $a1, -32760 # 0x8008\n"
2473 "sw $zero, -32760($at) # 0x8008\n"
2474 "daddiu $at, $a1, 32760 # 0x7FF8\n"
2475 "lui $t8, 4660 # 0x1234\n"
2476 "ori $t8, $t8, 22136 # 0x5678\n"
2477 "sw $t8, 32760($at) # 0x7FF8\n"
2478 "daddiu $at, $t8, -32760 # 0x8008\n"
2479 "sw $zero, -32760($at) # 0x8008\n"
2480 "daddiu $at, $t8, 32760 # 0x7FF8\n"
2481 "lui $t8, 4660 # 0x1234\n"
2482 "ori $t8, $t8, 22136 # 0x5678\n"
2483 "sw $t8, 32760($at) # 0x7FF8\n";
Tijana Jakovljevicba89c342017-03-10 13:36:08 +01002484 DriverStr(expected, "StoreConstToOffset");
2485}
Alexey Frunze0960ac52016-12-20 17:24:59 -08002486//////////////////////////////
2487// Loading/adding Constants //
2488//////////////////////////////
Chris Larsenc733dca2016-05-13 16:11:47 -07002489
2490TEST_F(AssemblerMIPS64Test, LoadConst32) {
2491 // IsUint<16>(value)
2492 __ LoadConst32(mips64::V0, 0);
2493 __ LoadConst32(mips64::V0, 65535);
2494 // IsInt<16>(value)
2495 __ LoadConst32(mips64::V0, -1);
2496 __ LoadConst32(mips64::V0, -32768);
2497 // Everything else
2498 __ LoadConst32(mips64::V0, 65536);
2499 __ LoadConst32(mips64::V0, 65537);
2500 __ LoadConst32(mips64::V0, 2147483647);
2501 __ LoadConst32(mips64::V0, -32769);
2502 __ LoadConst32(mips64::V0, -65536);
2503 __ LoadConst32(mips64::V0, -65537);
2504 __ LoadConst32(mips64::V0, -2147483647);
2505 __ LoadConst32(mips64::V0, -2147483648);
2506
2507 const char* expected =
2508 // IsUint<16>(value)
2509 "ori $v0, $zero, 0\n" // __ LoadConst32(mips64::V0, 0);
2510 "ori $v0, $zero, 65535\n" // __ LoadConst32(mips64::V0, 65535);
2511 // IsInt<16>(value)
2512 "addiu $v0, $zero, -1\n" // __ LoadConst32(mips64::V0, -1);
2513 "addiu $v0, $zero, -32768\n" // __ LoadConst32(mips64::V0, -32768);
2514 // Everything else
2515 "lui $v0, 1\n" // __ LoadConst32(mips64::V0, 65536);
2516 "lui $v0, 1\n" // __ LoadConst32(mips64::V0, 65537);
2517 "ori $v0, 1\n" // "
2518 "lui $v0, 32767\n" // __ LoadConst32(mips64::V0, 2147483647);
2519 "ori $v0, 65535\n" // "
2520 "lui $v0, 65535\n" // __ LoadConst32(mips64::V0, -32769);
2521 "ori $v0, 32767\n" // "
2522 "lui $v0, 65535\n" // __ LoadConst32(mips64::V0, -65536);
2523 "lui $v0, 65534\n" // __ LoadConst32(mips64::V0, -65537);
2524 "ori $v0, 65535\n" // "
2525 "lui $v0, 32768\n" // __ LoadConst32(mips64::V0, -2147483647);
2526 "ori $v0, 1\n" // "
2527 "lui $v0, 32768\n"; // __ LoadConst32(mips64::V0, -2147483648);
2528 DriverStr(expected, "LoadConst32");
2529}
2530
Alexey Frunze0960ac52016-12-20 17:24:59 -08002531TEST_F(AssemblerMIPS64Test, Addiu32) {
2532 __ Addiu32(mips64::A1, mips64::A2, -0x8000);
2533 __ Addiu32(mips64::A1, mips64::A2, +0);
2534 __ Addiu32(mips64::A1, mips64::A2, +0x7FFF);
2535 __ Addiu32(mips64::A1, mips64::A2, -0x8001);
2536 __ Addiu32(mips64::A1, mips64::A2, +0x8000);
2537 __ Addiu32(mips64::A1, mips64::A2, -0x10000);
2538 __ Addiu32(mips64::A1, mips64::A2, +0x10000);
2539 __ Addiu32(mips64::A1, mips64::A2, +0x12345678);
2540
2541 const char* expected =
2542 "addiu $a1, $a2, -0x8000\n"
2543 "addiu $a1, $a2, 0\n"
2544 "addiu $a1, $a2, 0x7FFF\n"
2545 "aui $a1, $a2, 0xFFFF\n"
2546 "addiu $a1, $a1, 0x7FFF\n"
2547 "aui $a1, $a2, 1\n"
2548 "addiu $a1, $a1, -0x8000\n"
2549 "aui $a1, $a2, 0xFFFF\n"
2550 "aui $a1, $a2, 1\n"
2551 "aui $a1, $a2, 0x1234\n"
2552 "addiu $a1, $a1, 0x5678\n";
2553 DriverStr(expected, "Addiu32");
2554}
2555
Chris Larsenc733dca2016-05-13 16:11:47 -07002556static uint64_t SignExtend16To64(uint16_t n) {
2557 return static_cast<int16_t>(n);
2558}
2559
2560// The art::mips64::Mips64Assembler::LoadConst64() method uses a template
2561// to minimize the number of instructions needed to load a 64-bit constant
2562// value into a register. The template calls various methods which emit
2563// MIPS machine instructions. This struct (class) uses the same template
2564// but overrides the definitions of the methods which emit MIPS instructions
2565// to use methods which simulate the operation of the corresponding MIPS
2566// instructions. After invoking LoadConst64() the target register should
2567// contain the same 64-bit value as was input to LoadConst64(). If the
2568// simulated register doesn't contain the correct value then there is probably
2569// an error in the template function.
2570struct LoadConst64Tester {
2571 LoadConst64Tester() {
2572 // Initialize all of the registers for simulation to zero.
2573 for (int r = 0; r < 32; r++) {
2574 regs_[r] = 0;
2575 }
2576 // Clear all of the path flags.
2577 loadconst64_paths_ = art::mips64::kLoadConst64PathZero;
2578 }
2579 void Addiu(mips64::GpuRegister rd, mips64::GpuRegister rs, uint16_t c) {
2580 regs_[rd] = static_cast<int32_t>(regs_[rs] + SignExtend16To64(c));
2581 }
2582 void Daddiu(mips64::GpuRegister rd, mips64::GpuRegister rs, uint16_t c) {
2583 regs_[rd] = regs_[rs] + SignExtend16To64(c);
2584 }
2585 void Dahi(mips64::GpuRegister rd, uint16_t c) {
2586 regs_[rd] += SignExtend16To64(c) << 32;
2587 }
2588 void Dati(mips64::GpuRegister rd, uint16_t c) {
2589 regs_[rd] += SignExtend16To64(c) << 48;
2590 }
2591 void Dinsu(mips64::GpuRegister rt, mips64::GpuRegister rs, int pos, int size) {
2592 CHECK(IsUint<5>(pos - 32)) << pos;
2593 CHECK(IsUint<5>(size - 1)) << size;
2594 CHECK(IsUint<5>(pos + size - 33)) << pos << " + " << size;
2595 uint64_t src_mask = (UINT64_C(1) << size) - 1;
2596 uint64_t dsk_mask = ~(src_mask << pos);
2597
2598 regs_[rt] = (regs_[rt] & dsk_mask) | ((regs_[rs] & src_mask) << pos);
2599 }
2600 void Dsll(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2601 regs_[rd] = regs_[rt] << (shamt & 0x1f);
2602 }
2603 void Dsll32(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2604 regs_[rd] = regs_[rt] << (32 + (shamt & 0x1f));
2605 }
2606 void Dsrl(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2607 regs_[rd] = regs_[rt] >> (shamt & 0x1f);
2608 }
2609 void Dsrl32(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2610 regs_[rd] = regs_[rt] >> (32 + (shamt & 0x1f));
2611 }
2612 void Lui(mips64::GpuRegister rd, uint16_t c) {
2613 regs_[rd] = SignExtend16To64(c) << 16;
2614 }
2615 void Ori(mips64::GpuRegister rd, mips64::GpuRegister rs, uint16_t c) {
2616 regs_[rd] = regs_[rs] | c;
2617 }
2618 void LoadConst32(mips64::GpuRegister rd, int32_t c) {
2619 CHECK_NE(rd, 0);
2620 mips64::TemplateLoadConst32<LoadConst64Tester>(this, rd, c);
2621 CHECK_EQ(regs_[rd], static_cast<uint64_t>(c));
2622 }
2623 void LoadConst64(mips64::GpuRegister rd, int64_t c) {
2624 CHECK_NE(rd, 0);
2625 mips64::TemplateLoadConst64<LoadConst64Tester>(this, rd, c);
2626 CHECK_EQ(regs_[rd], static_cast<uint64_t>(c));
2627 }
2628 uint64_t regs_[32];
2629
2630 // Getter function for loadconst64_paths_.
2631 int GetPathsCovered() {
2632 return loadconst64_paths_;
2633 }
2634
2635 void RecordLoadConst64Path(int value) {
2636 loadconst64_paths_ |= value;
2637 }
2638
2639 private:
2640 // This variable holds a bitmask to tell us which paths were taken
2641 // through the template function which loads 64-bit values.
2642 int loadconst64_paths_;
2643};
2644
2645TEST_F(AssemblerMIPS64Test, LoadConst64) {
2646 const uint16_t imms[] = {
2647 0, 1, 2, 3, 4, 0x33, 0x66, 0x55, 0x99, 0xaa, 0xcc, 0xff, 0x5500, 0x5555,
2648 0x7ffc, 0x7ffd, 0x7ffe, 0x7fff, 0x8000, 0x8001, 0x8002, 0x8003, 0x8004,
2649 0xaaaa, 0xfffc, 0xfffd, 0xfffe, 0xffff
2650 };
2651 unsigned d0, d1, d2, d3;
2652 LoadConst64Tester tester;
2653
2654 union {
2655 int64_t v64;
2656 uint16_t v16[4];
2657 } u;
2658
2659 for (d3 = 0; d3 < sizeof imms / sizeof imms[0]; d3++) {
2660 u.v16[3] = imms[d3];
2661
2662 for (d2 = 0; d2 < sizeof imms / sizeof imms[0]; d2++) {
2663 u.v16[2] = imms[d2];
2664
2665 for (d1 = 0; d1 < sizeof imms / sizeof imms[0]; d1++) {
2666 u.v16[1] = imms[d1];
2667
2668 for (d0 = 0; d0 < sizeof imms / sizeof imms[0]; d0++) {
2669 u.v16[0] = imms[d0];
2670
2671 tester.LoadConst64(mips64::V0, u.v64);
2672 }
2673 }
2674 }
2675 }
2676
2677 // Verify that we tested all paths through the "load 64-bit value"
2678 // function template.
2679 EXPECT_EQ(tester.GetPathsCovered(), art::mips64::kLoadConst64PathAllPaths);
2680}
2681
Alexey Frunze0cab6562017-07-25 15:19:36 -07002682TEST_F(AssemblerMIPS64Test, LoadFarthestNearLabelAddress) {
2683 mips64::Mips64Label label;
2684 __ LoadLabelAddress(mips64::V0, &label);
2685 constexpr uint32_t kAdduCount = 0x3FFDE;
2686 for (uint32_t i = 0; i != kAdduCount; ++i) {
2687 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2688 }
2689 __ Bind(&label);
2690
2691 std::string expected =
2692 "lapc $v0, 1f\n" +
2693 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2694 "1:\n";
2695 DriverStr(expected, "LoadFarthestNearLabelAddress");
2696 EXPECT_EQ(__ GetLabelLocation(&label), (1 + kAdduCount) * 4);
2697}
2698
2699TEST_F(AssemblerMIPS64Test, LoadNearestFarLabelAddress) {
2700 mips64::Mips64Label label;
2701 __ LoadLabelAddress(mips64::V0, &label);
2702 constexpr uint32_t kAdduCount = 0x3FFDF;
2703 for (uint32_t i = 0; i != kAdduCount; ++i) {
2704 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2705 }
2706 __ Bind(&label);
2707
2708 std::string expected =
2709 "1:\n"
2710 "auipc $at, %hi(2f - 1b)\n"
2711 "daddiu $v0, $at, %lo(2f - 1b)\n" +
2712 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2713 "2:\n";
2714 DriverStr(expected, "LoadNearestFarLabelAddress");
2715 EXPECT_EQ(__ GetLabelLocation(&label), (2 + kAdduCount) * 4);
2716}
2717
2718TEST_F(AssemblerMIPS64Test, LoadFarthestNearLiteral) {
2719 mips64::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
2720 __ LoadLiteral(mips64::V0, mips64::kLoadWord, literal);
2721 constexpr uint32_t kAdduCount = 0x3FFDE;
2722 for (uint32_t i = 0; i != kAdduCount; ++i) {
2723 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2724 }
2725
2726 std::string expected =
2727 "lwpc $v0, 1f\n" +
2728 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2729 "1:\n"
2730 ".word 0x12345678\n";
2731 DriverStr(expected, "LoadFarthestNearLiteral");
2732 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (1 + kAdduCount) * 4);
2733}
2734
2735TEST_F(AssemblerMIPS64Test, LoadNearestFarLiteral) {
2736 mips64::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
2737 __ LoadLiteral(mips64::V0, mips64::kLoadWord, literal);
2738 constexpr uint32_t kAdduCount = 0x3FFDF;
2739 for (uint32_t i = 0; i != kAdduCount; ++i) {
2740 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2741 }
2742
2743 std::string expected =
2744 "1:\n"
2745 "auipc $at, %hi(2f - 1b)\n"
2746 "lw $v0, %lo(2f - 1b)($at)\n" +
2747 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2748 "2:\n"
2749 ".word 0x12345678\n";
2750 DriverStr(expected, "LoadNearestFarLiteral");
2751 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (2 + kAdduCount) * 4);
2752}
2753
2754TEST_F(AssemblerMIPS64Test, LoadFarthestNearLiteralUnsigned) {
2755 mips64::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
2756 __ LoadLiteral(mips64::V0, mips64::kLoadUnsignedWord, literal);
2757 constexpr uint32_t kAdduCount = 0x3FFDE;
2758 for (uint32_t i = 0; i != kAdduCount; ++i) {
2759 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2760 }
2761
2762 std::string expected =
2763 "lwupc $v0, 1f\n" +
2764 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2765 "1:\n"
2766 ".word 0x12345678\n";
2767 DriverStr(expected, "LoadFarthestNearLiteralUnsigned");
2768 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (1 + kAdduCount) * 4);
2769}
2770
2771TEST_F(AssemblerMIPS64Test, LoadNearestFarLiteralUnsigned) {
2772 mips64::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
2773 __ LoadLiteral(mips64::V0, mips64::kLoadUnsignedWord, literal);
2774 constexpr uint32_t kAdduCount = 0x3FFDF;
2775 for (uint32_t i = 0; i != kAdduCount; ++i) {
2776 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2777 }
2778
2779 std::string expected =
2780 "1:\n"
2781 "auipc $at, %hi(2f - 1b)\n"
2782 "lwu $v0, %lo(2f - 1b)($at)\n" +
2783 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2784 "2:\n"
2785 ".word 0x12345678\n";
2786 DriverStr(expected, "LoadNearestFarLiteralUnsigned");
2787 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (2 + kAdduCount) * 4);
2788}
2789
2790TEST_F(AssemblerMIPS64Test, LoadFarthestNearLiteralLong) {
2791 mips64::Literal* literal = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
2792 __ LoadLiteral(mips64::V0, mips64::kLoadDoubleword, literal);
2793 constexpr uint32_t kAdduCount = 0x3FFDD;
2794 for (uint32_t i = 0; i != kAdduCount; ++i) {
2795 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2796 }
2797
2798 std::string expected =
2799 "ldpc $v0, 1f\n" +
2800 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2801 "1:\n"
2802 ".dword 0x0123456789ABCDEF\n";
2803 DriverStr(expected, "LoadFarthestNearLiteralLong");
2804 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (1 + kAdduCount) * 4);
2805}
2806
2807TEST_F(AssemblerMIPS64Test, LoadNearestFarLiteralLong) {
2808 mips64::Literal* literal = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
2809 __ LoadLiteral(mips64::V0, mips64::kLoadDoubleword, literal);
2810 constexpr uint32_t kAdduCount = 0x3FFDE;
2811 for (uint32_t i = 0; i != kAdduCount; ++i) {
2812 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2813 }
2814
2815 std::string expected =
2816 "1:\n"
2817 "auipc $at, %hi(2f - 1b)\n"
2818 "ld $v0, %lo(2f - 1b)($at)\n" +
2819 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2820 "2:\n"
2821 ".dword 0x0123456789ABCDEF\n";
2822 DriverStr(expected, "LoadNearestFarLiteralLong");
2823 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (2 + kAdduCount) * 4);
2824}
2825
2826TEST_F(AssemblerMIPS64Test, LongLiteralAlignmentNop) {
2827 mips64::Literal* literal1 = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
2828 mips64::Literal* literal2 = __ NewLiteral<uint64_t>(UINT64_C(0x5555555555555555));
2829 mips64::Literal* literal3 = __ NewLiteral<uint64_t>(UINT64_C(0xAAAAAAAAAAAAAAAA));
2830 __ LoadLiteral(mips64::A1, mips64::kLoadDoubleword, literal1);
2831 __ LoadLiteral(mips64::A2, mips64::kLoadDoubleword, literal2);
2832 __ LoadLiteral(mips64::A3, mips64::kLoadDoubleword, literal3);
2833 __ LoadLabelAddress(mips64::V0, literal1->GetLabel());
2834 __ LoadLabelAddress(mips64::V1, literal2->GetLabel());
2835 // A nop will be inserted here before the 64-bit literals.
2836
2837 std::string expected =
2838 "ldpc $a1, 1f\n"
2839 // The GNU assembler incorrectly requires the ldpc instruction to be located
2840 // at an address that's a multiple of 8. TODO: Remove this workaround if/when
2841 // the assembler is fixed.
2842 // "ldpc $a2, 2f\n"
2843 ".word 0xECD80004\n"
2844 "ldpc $a3, 3f\n"
2845 "lapc $v0, 1f\n"
2846 "lapc $v1, 2f\n"
2847 "nop\n"
2848 "1:\n"
2849 ".dword 0x0123456789ABCDEF\n"
2850 "2:\n"
2851 ".dword 0x5555555555555555\n"
2852 "3:\n"
2853 ".dword 0xAAAAAAAAAAAAAAAA\n";
2854 DriverStr(expected, "LongLiteralAlignmentNop");
2855 EXPECT_EQ(__ GetLabelLocation(literal1->GetLabel()), 6 * 4u);
2856 EXPECT_EQ(__ GetLabelLocation(literal2->GetLabel()), 8 * 4u);
2857 EXPECT_EQ(__ GetLabelLocation(literal3->GetLabel()), 10 * 4u);
2858}
2859
2860TEST_F(AssemblerMIPS64Test, LongLiteralAlignmentNoNop) {
2861 mips64::Literal* literal1 = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
2862 mips64::Literal* literal2 = __ NewLiteral<uint64_t>(UINT64_C(0x5555555555555555));
2863 __ LoadLiteral(mips64::A1, mips64::kLoadDoubleword, literal1);
2864 __ LoadLiteral(mips64::A2, mips64::kLoadDoubleword, literal2);
2865 __ LoadLabelAddress(mips64::V0, literal1->GetLabel());
2866 __ LoadLabelAddress(mips64::V1, literal2->GetLabel());
2867
2868 std::string expected =
2869 "ldpc $a1, 1f\n"
2870 // The GNU assembler incorrectly requires the ldpc instruction to be located
2871 // at an address that's a multiple of 8. TODO: Remove this workaround if/when
2872 // the assembler is fixed.
2873 // "ldpc $a2, 2f\n"
2874 ".word 0xECD80003\n"
2875 "lapc $v0, 1f\n"
2876 "lapc $v1, 2f\n"
2877 "1:\n"
2878 ".dword 0x0123456789ABCDEF\n"
2879 "2:\n"
2880 ".dword 0x5555555555555555\n";
2881 DriverStr(expected, "LongLiteralAlignmentNoNop");
2882 EXPECT_EQ(__ GetLabelLocation(literal1->GetLabel()), 4 * 4u);
2883 EXPECT_EQ(__ GetLabelLocation(literal2->GetLabel()), 6 * 4u);
2884}
2885
2886TEST_F(AssemblerMIPS64Test, FarLongLiteralAlignmentNop) {
2887 mips64::Literal* literal = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
2888 __ LoadLiteral(mips64::V0, mips64::kLoadDoubleword, literal);
2889 __ LoadLabelAddress(mips64::V1, literal->GetLabel());
2890 constexpr uint32_t kAdduCount = 0x3FFDF;
2891 for (uint32_t i = 0; i != kAdduCount; ++i) {
2892 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2893 }
2894 // A nop will be inserted here before the 64-bit literal.
2895
2896 std::string expected =
2897 "1:\n"
2898 "auipc $at, %hi(3f - 1b)\n"
2899 "ld $v0, %lo(3f - 1b)($at)\n"
2900 "2:\n"
2901 "auipc $at, %hi(3f - 2b)\n"
2902 "daddiu $v1, $at, %lo(3f - 2b)\n" +
2903 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2904 "nop\n"
2905 "3:\n"
2906 ".dword 0x0123456789ABCDEF\n";
2907 DriverStr(expected, "FarLongLiteralAlignmentNop");
2908 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (5 + kAdduCount) * 4);
2909}
2910
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +00002911// MSA instructions.
2912
2913TEST_F(AssemblerMIPS64Test, AndV) {
2914 DriverStr(RepeatVVV(&mips64::Mips64Assembler::AndV, "and.v ${reg1}, ${reg2}, ${reg3}"), "and.v");
2915}
2916
2917TEST_F(AssemblerMIPS64Test, OrV) {
2918 DriverStr(RepeatVVV(&mips64::Mips64Assembler::OrV, "or.v ${reg1}, ${reg2}, ${reg3}"), "or.v");
2919}
2920
2921TEST_F(AssemblerMIPS64Test, NorV) {
2922 DriverStr(RepeatVVV(&mips64::Mips64Assembler::NorV, "nor.v ${reg1}, ${reg2}, ${reg3}"), "nor.v");
2923}
2924
2925TEST_F(AssemblerMIPS64Test, XorV) {
2926 DriverStr(RepeatVVV(&mips64::Mips64Assembler::XorV, "xor.v ${reg1}, ${reg2}, ${reg3}"), "xor.v");
2927}
2928
2929TEST_F(AssemblerMIPS64Test, AddvB) {
2930 DriverStr(RepeatVVV(&mips64::Mips64Assembler::AddvB, "addv.b ${reg1}, ${reg2}, ${reg3}"),
2931 "addv.b");
2932}
2933
2934TEST_F(AssemblerMIPS64Test, AddvH) {
2935 DriverStr(RepeatVVV(&mips64::Mips64Assembler::AddvH, "addv.h ${reg1}, ${reg2}, ${reg3}"),
2936 "addv.h");
2937}
2938
2939TEST_F(AssemblerMIPS64Test, AddvW) {
2940 DriverStr(RepeatVVV(&mips64::Mips64Assembler::AddvW, "addv.w ${reg1}, ${reg2}, ${reg3}"),
2941 "addv.w");
2942}
2943
2944TEST_F(AssemblerMIPS64Test, AddvD) {
2945 DriverStr(RepeatVVV(&mips64::Mips64Assembler::AddvD, "addv.d ${reg1}, ${reg2}, ${reg3}"),
2946 "addv.d");
2947}
2948
2949TEST_F(AssemblerMIPS64Test, SubvB) {
2950 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SubvB, "subv.b ${reg1}, ${reg2}, ${reg3}"),
2951 "subv.b");
2952}
2953
2954TEST_F(AssemblerMIPS64Test, SubvH) {
2955 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SubvH, "subv.h ${reg1}, ${reg2}, ${reg3}"),
2956 "subv.h");
2957}
2958
2959TEST_F(AssemblerMIPS64Test, SubvW) {
2960 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SubvW, "subv.w ${reg1}, ${reg2}, ${reg3}"),
2961 "subv.w");
2962}
2963
2964TEST_F(AssemblerMIPS64Test, SubvD) {
2965 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SubvD, "subv.d ${reg1}, ${reg2}, ${reg3}"),
2966 "subv.d");
2967}
2968
Lena Djokic72aba712017-10-30 15:47:20 +01002969TEST_F(AssemblerMIPS64Test, Asub_sB) {
2970 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Asub_sB, "asub_s.b ${reg1}, ${reg2}, ${reg3}"),
2971 "asub_s.b");
2972}
2973
2974TEST_F(AssemblerMIPS64Test, Asub_sH) {
2975 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Asub_sH, "asub_s.h ${reg1}, ${reg2}, ${reg3}"),
2976 "asub_s.h");
2977}
2978
2979TEST_F(AssemblerMIPS64Test, Asub_sW) {
2980 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Asub_sW, "asub_s.w ${reg1}, ${reg2}, ${reg3}"),
2981 "asub_s.w");
2982}
2983
2984TEST_F(AssemblerMIPS64Test, Asub_sD) {
2985 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Asub_sD, "asub_s.d ${reg1}, ${reg2}, ${reg3}"),
2986 "asub_s.d");
2987}
2988
2989TEST_F(AssemblerMIPS64Test, Asub_uB) {
2990 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Asub_uB, "asub_u.b ${reg1}, ${reg2}, ${reg3}"),
2991 "asub_u.b");
2992}
2993
2994TEST_F(AssemblerMIPS64Test, Asub_uH) {
2995 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Asub_uH, "asub_u.h ${reg1}, ${reg2}, ${reg3}"),
2996 "asub_u.h");
2997}
2998
2999TEST_F(AssemblerMIPS64Test, Asub_uW) {
3000 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Asub_uW, "asub_u.w ${reg1}, ${reg2}, ${reg3}"),
3001 "asub_u.w");
3002}
3003
3004TEST_F(AssemblerMIPS64Test, Asub_uD) {
3005 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Asub_uD, "asub_u.d ${reg1}, ${reg2}, ${reg3}"),
3006 "asub_u.d");
3007}
3008
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +00003009TEST_F(AssemblerMIPS64Test, MulvB) {
3010 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MulvB, "mulv.b ${reg1}, ${reg2}, ${reg3}"),
3011 "mulv.b");
3012}
3013
3014TEST_F(AssemblerMIPS64Test, MulvH) {
3015 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MulvH, "mulv.h ${reg1}, ${reg2}, ${reg3}"),
3016 "mulv.h");
3017}
3018
3019TEST_F(AssemblerMIPS64Test, MulvW) {
3020 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MulvW, "mulv.w ${reg1}, ${reg2}, ${reg3}"),
3021 "mulv.w");
3022}
3023
3024TEST_F(AssemblerMIPS64Test, MulvD) {
3025 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MulvD, "mulv.d ${reg1}, ${reg2}, ${reg3}"),
3026 "mulv.d");
3027}
3028
3029TEST_F(AssemblerMIPS64Test, Div_sB) {
3030 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_sB, "div_s.b ${reg1}, ${reg2}, ${reg3}"),
3031 "div_s.b");
3032}
3033
3034TEST_F(AssemblerMIPS64Test, Div_sH) {
3035 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_sH, "div_s.h ${reg1}, ${reg2}, ${reg3}"),
3036 "div_s.h");
3037}
3038
3039TEST_F(AssemblerMIPS64Test, Div_sW) {
3040 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_sW, "div_s.w ${reg1}, ${reg2}, ${reg3}"),
3041 "div_s.w");
3042}
3043
3044TEST_F(AssemblerMIPS64Test, Div_sD) {
3045 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_sD, "div_s.d ${reg1}, ${reg2}, ${reg3}"),
3046 "div_s.d");
3047}
3048
3049TEST_F(AssemblerMIPS64Test, Div_uB) {
3050 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_uB, "div_u.b ${reg1}, ${reg2}, ${reg3}"),
3051 "div_u.b");
3052}
3053
3054TEST_F(AssemblerMIPS64Test, Div_uH) {
3055 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_uH, "div_u.h ${reg1}, ${reg2}, ${reg3}"),
3056 "div_u.h");
3057}
3058
3059TEST_F(AssemblerMIPS64Test, Div_uW) {
3060 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_uW, "div_u.w ${reg1}, ${reg2}, ${reg3}"),
3061 "div_u.w");
3062}
3063
3064TEST_F(AssemblerMIPS64Test, Div_uD) {
3065 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_uD, "div_u.d ${reg1}, ${reg2}, ${reg3}"),
3066 "div_u.d");
3067}
3068
3069TEST_F(AssemblerMIPS64Test, Mod_sB) {
3070 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_sB, "mod_s.b ${reg1}, ${reg2}, ${reg3}"),
3071 "mod_s.b");
3072}
3073
3074TEST_F(AssemblerMIPS64Test, Mod_sH) {
3075 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_sH, "mod_s.h ${reg1}, ${reg2}, ${reg3}"),
3076 "mod_s.h");
3077}
3078
3079TEST_F(AssemblerMIPS64Test, Mod_sW) {
3080 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_sW, "mod_s.w ${reg1}, ${reg2}, ${reg3}"),
3081 "mod_s.w");
3082}
3083
3084TEST_F(AssemblerMIPS64Test, Mod_sD) {
3085 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_sD, "mod_s.d ${reg1}, ${reg2}, ${reg3}"),
3086 "mod_s.d");
3087}
3088
3089TEST_F(AssemblerMIPS64Test, Mod_uB) {
3090 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_uB, "mod_u.b ${reg1}, ${reg2}, ${reg3}"),
3091 "mod_u.b");
3092}
3093
3094TEST_F(AssemblerMIPS64Test, Mod_uH) {
3095 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_uH, "mod_u.h ${reg1}, ${reg2}, ${reg3}"),
3096 "mod_u.h");
3097}
3098
3099TEST_F(AssemblerMIPS64Test, Mod_uW) {
3100 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_uW, "mod_u.w ${reg1}, ${reg2}, ${reg3}"),
3101 "mod_u.w");
3102}
3103
3104TEST_F(AssemblerMIPS64Test, Mod_uD) {
3105 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_uD, "mod_u.d ${reg1}, ${reg2}, ${reg3}"),
3106 "mod_u.d");
3107}
3108
Goran Jakovljevic80248d72017-04-20 11:55:47 +02003109TEST_F(AssemblerMIPS64Test, Add_aB) {
3110 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Add_aB, "add_a.b ${reg1}, ${reg2}, ${reg3}"),
3111 "add_a.b");
3112}
3113
3114TEST_F(AssemblerMIPS64Test, Add_aH) {
3115 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Add_aH, "add_a.h ${reg1}, ${reg2}, ${reg3}"),
3116 "add_a.h");
3117}
3118
3119TEST_F(AssemblerMIPS64Test, Add_aW) {
3120 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Add_aW, "add_a.w ${reg1}, ${reg2}, ${reg3}"),
3121 "add_a.w");
3122}
3123
3124TEST_F(AssemblerMIPS64Test, Add_aD) {
3125 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Add_aD, "add_a.d ${reg1}, ${reg2}, ${reg3}"),
3126 "add_a.d");
3127}
3128
3129TEST_F(AssemblerMIPS64Test, Ave_sB) {
3130 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_sB, "ave_s.b ${reg1}, ${reg2}, ${reg3}"),
3131 "ave_s.b");
3132}
3133
3134TEST_F(AssemblerMIPS64Test, Ave_sH) {
3135 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_sH, "ave_s.h ${reg1}, ${reg2}, ${reg3}"),
3136 "ave_s.h");
3137}
3138
3139TEST_F(AssemblerMIPS64Test, Ave_sW) {
3140 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_sW, "ave_s.w ${reg1}, ${reg2}, ${reg3}"),
3141 "ave_s.w");
3142}
3143
3144TEST_F(AssemblerMIPS64Test, Ave_sD) {
3145 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_sD, "ave_s.d ${reg1}, ${reg2}, ${reg3}"),
3146 "ave_s.d");
3147}
3148
3149TEST_F(AssemblerMIPS64Test, Ave_uB) {
3150 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_uB, "ave_u.b ${reg1}, ${reg2}, ${reg3}"),
3151 "ave_u.b");
3152}
3153
3154TEST_F(AssemblerMIPS64Test, Ave_uH) {
3155 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_uH, "ave_u.h ${reg1}, ${reg2}, ${reg3}"),
3156 "ave_u.h");
3157}
3158
3159TEST_F(AssemblerMIPS64Test, Ave_uW) {
3160 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_uW, "ave_u.w ${reg1}, ${reg2}, ${reg3}"),
3161 "ave_u.w");
3162}
3163
3164TEST_F(AssemblerMIPS64Test, Ave_uD) {
3165 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_uD, "ave_u.d ${reg1}, ${reg2}, ${reg3}"),
3166 "ave_u.d");
3167}
3168
3169TEST_F(AssemblerMIPS64Test, Aver_sB) {
3170 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_sB, "aver_s.b ${reg1}, ${reg2}, ${reg3}"),
3171 "aver_s.b");
3172}
3173
3174TEST_F(AssemblerMIPS64Test, Aver_sH) {
3175 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_sH, "aver_s.h ${reg1}, ${reg2}, ${reg3}"),
3176 "aver_s.h");
3177}
3178
3179TEST_F(AssemblerMIPS64Test, Aver_sW) {
3180 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_sW, "aver_s.w ${reg1}, ${reg2}, ${reg3}"),
3181 "aver_s.w");
3182}
3183
3184TEST_F(AssemblerMIPS64Test, Aver_sD) {
3185 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_sD, "aver_s.d ${reg1}, ${reg2}, ${reg3}"),
3186 "aver_s.d");
3187}
3188
3189TEST_F(AssemblerMIPS64Test, Aver_uB) {
3190 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_uB, "aver_u.b ${reg1}, ${reg2}, ${reg3}"),
3191 "aver_u.b");
3192}
3193
3194TEST_F(AssemblerMIPS64Test, Aver_uH) {
3195 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_uH, "aver_u.h ${reg1}, ${reg2}, ${reg3}"),
3196 "aver_u.h");
3197}
3198
3199TEST_F(AssemblerMIPS64Test, Aver_uW) {
3200 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_uW, "aver_u.w ${reg1}, ${reg2}, ${reg3}"),
3201 "aver_u.w");
3202}
3203
3204TEST_F(AssemblerMIPS64Test, Aver_uD) {
3205 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_uD, "aver_u.d ${reg1}, ${reg2}, ${reg3}"),
3206 "aver_u.d");
3207}
3208
Goran Jakovljevic658263e2017-06-07 09:35:53 +02003209TEST_F(AssemblerMIPS64Test, Max_sB) {
3210 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_sB, "max_s.b ${reg1}, ${reg2}, ${reg3}"),
3211 "max_s.b");
3212}
3213
3214TEST_F(AssemblerMIPS64Test, Max_sH) {
3215 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_sH, "max_s.h ${reg1}, ${reg2}, ${reg3}"),
3216 "max_s.h");
3217}
3218
3219TEST_F(AssemblerMIPS64Test, Max_sW) {
3220 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_sW, "max_s.w ${reg1}, ${reg2}, ${reg3}"),
3221 "max_s.w");
3222}
3223
3224TEST_F(AssemblerMIPS64Test, Max_sD) {
3225 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_sD, "max_s.d ${reg1}, ${reg2}, ${reg3}"),
3226 "max_s.d");
3227}
3228
3229TEST_F(AssemblerMIPS64Test, Max_uB) {
3230 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_uB, "max_u.b ${reg1}, ${reg2}, ${reg3}"),
3231 "max_u.b");
3232}
3233
3234TEST_F(AssemblerMIPS64Test, Max_uH) {
3235 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_uH, "max_u.h ${reg1}, ${reg2}, ${reg3}"),
3236 "max_u.h");
3237}
3238
3239TEST_F(AssemblerMIPS64Test, Max_uW) {
3240 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_uW, "max_u.w ${reg1}, ${reg2}, ${reg3}"),
3241 "max_u.w");
3242}
3243
3244TEST_F(AssemblerMIPS64Test, Max_uD) {
3245 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_uD, "max_u.d ${reg1}, ${reg2}, ${reg3}"),
3246 "max_u.d");
3247}
3248
3249TEST_F(AssemblerMIPS64Test, Min_sB) {
3250 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_sB, "min_s.b ${reg1}, ${reg2}, ${reg3}"),
3251 "min_s.b");
3252}
3253
3254TEST_F(AssemblerMIPS64Test, Min_sH) {
3255 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_sH, "min_s.h ${reg1}, ${reg2}, ${reg3}"),
3256 "min_s.h");
3257}
3258
3259TEST_F(AssemblerMIPS64Test, Min_sW) {
3260 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_sW, "min_s.w ${reg1}, ${reg2}, ${reg3}"),
3261 "min_s.w");
3262}
3263
3264TEST_F(AssemblerMIPS64Test, Min_sD) {
3265 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_sD, "min_s.d ${reg1}, ${reg2}, ${reg3}"),
3266 "min_s.d");
3267}
3268
3269TEST_F(AssemblerMIPS64Test, Min_uB) {
3270 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_uB, "min_u.b ${reg1}, ${reg2}, ${reg3}"),
3271 "min_u.b");
3272}
3273
3274TEST_F(AssemblerMIPS64Test, Min_uH) {
3275 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_uH, "min_u.h ${reg1}, ${reg2}, ${reg3}"),
3276 "min_u.h");
3277}
3278
3279TEST_F(AssemblerMIPS64Test, Min_uW) {
3280 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_uW, "min_u.w ${reg1}, ${reg2}, ${reg3}"),
3281 "min_u.w");
3282}
3283
3284TEST_F(AssemblerMIPS64Test, Min_uD) {
3285 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_uD, "min_u.d ${reg1}, ${reg2}, ${reg3}"),
3286 "min_u.d");
3287}
3288
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +00003289TEST_F(AssemblerMIPS64Test, FaddW) {
3290 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FaddW, "fadd.w ${reg1}, ${reg2}, ${reg3}"),
3291 "fadd.w");
3292}
3293
3294TEST_F(AssemblerMIPS64Test, FaddD) {
3295 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FaddD, "fadd.d ${reg1}, ${reg2}, ${reg3}"),
3296 "fadd.d");
3297}
3298
3299TEST_F(AssemblerMIPS64Test, FsubW) {
3300 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FsubW, "fsub.w ${reg1}, ${reg2}, ${reg3}"),
3301 "fsub.w");
3302}
3303
3304TEST_F(AssemblerMIPS64Test, FsubD) {
3305 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FsubD, "fsub.d ${reg1}, ${reg2}, ${reg3}"),
3306 "fsub.d");
3307}
3308
3309TEST_F(AssemblerMIPS64Test, FmulW) {
3310 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmulW, "fmul.w ${reg1}, ${reg2}, ${reg3}"),
3311 "fmul.w");
3312}
3313
3314TEST_F(AssemblerMIPS64Test, FmulD) {
3315 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmulD, "fmul.d ${reg1}, ${reg2}, ${reg3}"),
3316 "fmul.d");
3317}
3318
3319TEST_F(AssemblerMIPS64Test, FdivW) {
3320 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FdivW, "fdiv.w ${reg1}, ${reg2}, ${reg3}"),
3321 "fdiv.w");
3322}
3323
3324TEST_F(AssemblerMIPS64Test, FdivD) {
3325 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FdivD, "fdiv.d ${reg1}, ${reg2}, ${reg3}"),
3326 "fdiv.d");
3327}
3328
Goran Jakovljevic658263e2017-06-07 09:35:53 +02003329TEST_F(AssemblerMIPS64Test, FmaxW) {
3330 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmaxW, "fmax.w ${reg1}, ${reg2}, ${reg3}"),
3331 "fmax.w");
3332}
3333
3334TEST_F(AssemblerMIPS64Test, FmaxD) {
3335 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmaxD, "fmax.d ${reg1}, ${reg2}, ${reg3}"),
3336 "fmax.d");
3337}
3338
3339TEST_F(AssemblerMIPS64Test, FminW) {
3340 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FminW, "fmin.w ${reg1}, ${reg2}, ${reg3}"),
3341 "fmin.w");
3342}
3343
3344TEST_F(AssemblerMIPS64Test, FminD) {
3345 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FminD, "fmin.d ${reg1}, ${reg2}, ${reg3}"),
3346 "fmin.d");
3347}
3348
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +00003349TEST_F(AssemblerMIPS64Test, Ffint_sW) {
3350 DriverStr(RepeatVV(&mips64::Mips64Assembler::Ffint_sW, "ffint_s.w ${reg1}, ${reg2}"),
3351 "ffint_s.w");
3352}
3353
3354TEST_F(AssemblerMIPS64Test, Ffint_sD) {
3355 DriverStr(RepeatVV(&mips64::Mips64Assembler::Ffint_sD, "ffint_s.d ${reg1}, ${reg2}"),
3356 "ffint_s.d");
3357}
3358
3359TEST_F(AssemblerMIPS64Test, Ftint_sW) {
3360 DriverStr(RepeatVV(&mips64::Mips64Assembler::Ftint_sW, "ftint_s.w ${reg1}, ${reg2}"),
3361 "ftint_s.w");
3362}
3363
3364TEST_F(AssemblerMIPS64Test, Ftint_sD) {
3365 DriverStr(RepeatVV(&mips64::Mips64Assembler::Ftint_sD, "ftint_s.d ${reg1}, ${reg2}"),
3366 "ftint_s.d");
3367}
3368
3369TEST_F(AssemblerMIPS64Test, SllB) {
3370 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SllB, "sll.b ${reg1}, ${reg2}, ${reg3}"), "sll.b");
3371}
3372
3373TEST_F(AssemblerMIPS64Test, SllH) {
3374 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SllH, "sll.h ${reg1}, ${reg2}, ${reg3}"), "sll.h");
3375}
3376
3377TEST_F(AssemblerMIPS64Test, SllW) {
3378 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SllW, "sll.w ${reg1}, ${reg2}, ${reg3}"), "sll.w");
3379}
3380
3381TEST_F(AssemblerMIPS64Test, SllD) {
3382 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SllD, "sll.d ${reg1}, ${reg2}, ${reg3}"), "sll.d");
3383}
3384
3385TEST_F(AssemblerMIPS64Test, SraB) {
3386 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SraB, "sra.b ${reg1}, ${reg2}, ${reg3}"), "sra.b");
3387}
3388
3389TEST_F(AssemblerMIPS64Test, SraH) {
3390 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SraH, "sra.h ${reg1}, ${reg2}, ${reg3}"), "sra.h");
3391}
3392
3393TEST_F(AssemblerMIPS64Test, SraW) {
3394 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SraW, "sra.w ${reg1}, ${reg2}, ${reg3}"), "sra.w");
3395}
3396
3397TEST_F(AssemblerMIPS64Test, SraD) {
3398 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SraD, "sra.d ${reg1}, ${reg2}, ${reg3}"), "sra.d");
3399}
3400
3401TEST_F(AssemblerMIPS64Test, SrlB) {
3402 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SrlB, "srl.b ${reg1}, ${reg2}, ${reg3}"), "srl.b");
3403}
3404
3405TEST_F(AssemblerMIPS64Test, SrlH) {
3406 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SrlH, "srl.h ${reg1}, ${reg2}, ${reg3}"), "srl.h");
3407}
3408
3409TEST_F(AssemblerMIPS64Test, SrlW) {
3410 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SrlW, "srl.w ${reg1}, ${reg2}, ${reg3}"), "srl.w");
3411}
3412
3413TEST_F(AssemblerMIPS64Test, SrlD) {
3414 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SrlD, "srl.d ${reg1}, ${reg2}, ${reg3}"), "srl.d");
3415}
3416
3417TEST_F(AssemblerMIPS64Test, SlliB) {
3418 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SlliB, 3, "slli.b ${reg1}, ${reg2}, {imm}"),
3419 "slli.b");
3420}
3421
3422TEST_F(AssemblerMIPS64Test, SlliH) {
3423 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SlliH, 4, "slli.h ${reg1}, ${reg2}, {imm}"),
3424 "slli.h");
3425}
3426
3427TEST_F(AssemblerMIPS64Test, SlliW) {
3428 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SlliW, 5, "slli.w ${reg1}, ${reg2}, {imm}"),
3429 "slli.w");
3430}
3431
3432TEST_F(AssemblerMIPS64Test, SlliD) {
3433 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SlliD, 6, "slli.d ${reg1}, ${reg2}, {imm}"),
3434 "slli.d");
3435}
3436
3437TEST_F(AssemblerMIPS64Test, MoveV) {
3438 DriverStr(RepeatVV(&mips64::Mips64Assembler::MoveV, "move.v ${reg1}, ${reg2}"), "move.v");
3439}
3440
3441TEST_F(AssemblerMIPS64Test, SplatiB) {
3442 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SplatiB, 4, "splati.b ${reg1}, ${reg2}[{imm}]"),
3443 "splati.b");
3444}
3445
3446TEST_F(AssemblerMIPS64Test, SplatiH) {
3447 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SplatiH, 3, "splati.h ${reg1}, ${reg2}[{imm}]"),
3448 "splati.h");
3449}
3450
3451TEST_F(AssemblerMIPS64Test, SplatiW) {
3452 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SplatiW, 2, "splati.w ${reg1}, ${reg2}[{imm}]"),
3453 "splati.w");
3454}
3455
3456TEST_F(AssemblerMIPS64Test, SplatiD) {
3457 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SplatiD, 1, "splati.d ${reg1}, ${reg2}[{imm}]"),
3458 "splati.d");
3459}
3460
Lena Djokic3309c012017-10-13 14:34:32 +02003461TEST_F(AssemblerMIPS64Test, Copy_sB) {
3462 DriverStr(RepeatRVIb(&mips64::Mips64Assembler::Copy_sB, 4, "copy_s.b ${reg1}, ${reg2}[{imm}]"),
3463 "copy_s.b");
3464}
3465
3466TEST_F(AssemblerMIPS64Test, Copy_sH) {
3467 DriverStr(RepeatRVIb(&mips64::Mips64Assembler::Copy_sH, 3, "copy_s.h ${reg1}, ${reg2}[{imm}]"),
3468 "copy_s.h");
3469}
3470
3471TEST_F(AssemblerMIPS64Test, Copy_sW) {
3472 DriverStr(RepeatRVIb(&mips64::Mips64Assembler::Copy_sW, 2, "copy_s.w ${reg1}, ${reg2}[{imm}]"),
3473 "copy_s.w");
3474}
3475
3476TEST_F(AssemblerMIPS64Test, Copy_sD) {
3477 DriverStr(RepeatRVIb(&mips64::Mips64Assembler::Copy_sD, 1, "copy_s.d ${reg1}, ${reg2}[{imm}]"),
3478 "copy_s.d");
3479}
3480
3481TEST_F(AssemblerMIPS64Test, Copy_uB) {
3482 DriverStr(RepeatRVIb(&mips64::Mips64Assembler::Copy_uB, 4, "copy_u.b ${reg1}, ${reg2}[{imm}]"),
3483 "copy_u.b");
3484}
3485
3486TEST_F(AssemblerMIPS64Test, Copy_uH) {
3487 DriverStr(RepeatRVIb(&mips64::Mips64Assembler::Copy_uH, 3, "copy_u.h ${reg1}, ${reg2}[{imm}]"),
3488 "copy_u.h");
3489}
3490
3491TEST_F(AssemblerMIPS64Test, Copy_uW) {
3492 DriverStr(RepeatRVIb(&mips64::Mips64Assembler::Copy_uW, 2, "copy_u.w ${reg1}, ${reg2}[{imm}]"),
3493 "copy_u.w");
3494}
3495
3496TEST_F(AssemblerMIPS64Test, InsertB) {
3497 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::InsertB, 4, "insert.b ${reg1}[{imm}], ${reg2}"),
3498 "insert.b");
3499}
3500
3501TEST_F(AssemblerMIPS64Test, InsertH) {
3502 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::InsertH, 3, "insert.h ${reg1}[{imm}], ${reg2}"),
3503 "insert.h");
3504}
3505
3506TEST_F(AssemblerMIPS64Test, InsertW) {
3507 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::InsertW, 2, "insert.w ${reg1}[{imm}], ${reg2}"),
3508 "insert.w");
3509}
3510
3511TEST_F(AssemblerMIPS64Test, InsertD) {
3512 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::InsertD, 1, "insert.d ${reg1}[{imm}], ${reg2}"),
3513 "insert.d");
3514}
3515
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +00003516TEST_F(AssemblerMIPS64Test, FillB) {
3517 DriverStr(RepeatVR(&mips64::Mips64Assembler::FillB, "fill.b ${reg1}, ${reg2}"), "fill.b");
3518}
3519
3520TEST_F(AssemblerMIPS64Test, FillH) {
3521 DriverStr(RepeatVR(&mips64::Mips64Assembler::FillH, "fill.h ${reg1}, ${reg2}"), "fill.h");
3522}
3523
3524TEST_F(AssemblerMIPS64Test, FillW) {
3525 DriverStr(RepeatVR(&mips64::Mips64Assembler::FillW, "fill.w ${reg1}, ${reg2}"), "fill.w");
3526}
3527
3528TEST_F(AssemblerMIPS64Test, FillD) {
3529 DriverStr(RepeatVR(&mips64::Mips64Assembler::FillD, "fill.d ${reg1}, ${reg2}"), "fill.d");
3530}
3531
Goran Jakovljevic3f444032017-03-31 14:38:20 +02003532TEST_F(AssemblerMIPS64Test, LdiB) {
3533 DriverStr(RepeatVIb(&mips64::Mips64Assembler::LdiB, -8, "ldi.b ${reg}, {imm}"), "ldi.b");
3534}
3535
3536TEST_F(AssemblerMIPS64Test, LdiH) {
3537 DriverStr(RepeatVIb(&mips64::Mips64Assembler::LdiH, -10, "ldi.h ${reg}, {imm}"), "ldi.h");
3538}
3539
3540TEST_F(AssemblerMIPS64Test, LdiW) {
3541 DriverStr(RepeatVIb(&mips64::Mips64Assembler::LdiW, -10, "ldi.w ${reg}, {imm}"), "ldi.w");
3542}
3543
3544TEST_F(AssemblerMIPS64Test, LdiD) {
3545 DriverStr(RepeatVIb(&mips64::Mips64Assembler::LdiD, -10, "ldi.d ${reg}, {imm}"), "ldi.d");
3546}
3547
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +00003548TEST_F(AssemblerMIPS64Test, LdB) {
3549 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::LdB, -10, "ld.b ${reg1}, {imm}(${reg2})"), "ld.b");
3550}
3551
3552TEST_F(AssemblerMIPS64Test, LdH) {
3553 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::LdH, -10, "ld.h ${reg1}, {imm}(${reg2})", 0, 2),
3554 "ld.h");
3555}
3556
3557TEST_F(AssemblerMIPS64Test, LdW) {
3558 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::LdW, -10, "ld.w ${reg1}, {imm}(${reg2})", 0, 4),
3559 "ld.w");
3560}
3561
3562TEST_F(AssemblerMIPS64Test, LdD) {
3563 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::LdD, -10, "ld.d ${reg1}, {imm}(${reg2})", 0, 8),
3564 "ld.d");
3565}
3566
3567TEST_F(AssemblerMIPS64Test, StB) {
3568 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::StB, -10, "st.b ${reg1}, {imm}(${reg2})"), "st.b");
3569}
3570
3571TEST_F(AssemblerMIPS64Test, StH) {
3572 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::StH, -10, "st.h ${reg1}, {imm}(${reg2})", 0, 2),
3573 "st.h");
3574}
3575
3576TEST_F(AssemblerMIPS64Test, StW) {
3577 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::StW, -10, "st.w ${reg1}, {imm}(${reg2})", 0, 4),
3578 "st.w");
3579}
3580
3581TEST_F(AssemblerMIPS64Test, StD) {
3582 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::StD, -10, "st.d ${reg1}, {imm}(${reg2})", 0, 8),
3583 "st.d");
3584}
3585
Lena Djokic3309c012017-10-13 14:34:32 +02003586TEST_F(AssemblerMIPS64Test, IlvlB) {
3587 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvlB, "ilvl.b ${reg1}, ${reg2}, ${reg3}"),
3588 "ilvl.b");
3589}
3590
3591TEST_F(AssemblerMIPS64Test, IlvlH) {
3592 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvlH, "ilvl.h ${reg1}, ${reg2}, ${reg3}"),
3593 "ilvl.h");
3594}
3595
3596TEST_F(AssemblerMIPS64Test, IlvlW) {
3597 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvlW, "ilvl.w ${reg1}, ${reg2}, ${reg3}"),
3598 "ilvl.w");
3599}
3600
3601TEST_F(AssemblerMIPS64Test, IlvlD) {
3602 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvlD, "ilvl.d ${reg1}, ${reg2}, ${reg3}"),
3603 "ilvl.d");
3604}
3605
Goran Jakovljevic38370112017-05-10 14:30:28 +02003606TEST_F(AssemblerMIPS64Test, IlvrB) {
3607 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvrB, "ilvr.b ${reg1}, ${reg2}, ${reg3}"),
3608 "ilvr.b");
3609}
3610
3611TEST_F(AssemblerMIPS64Test, IlvrH) {
3612 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvrH, "ilvr.h ${reg1}, ${reg2}, ${reg3}"),
3613 "ilvr.h");
3614}
3615
3616TEST_F(AssemblerMIPS64Test, IlvrW) {
3617 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvrW, "ilvr.w ${reg1}, ${reg2}, ${reg3}"),
3618 "ilvr.w");
3619}
3620
3621TEST_F(AssemblerMIPS64Test, IlvrD) {
3622 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvrD, "ilvr.d ${reg1}, ${reg2}, ${reg3}"),
3623 "ilvr.d");
3624}
3625
Lena Djokic3309c012017-10-13 14:34:32 +02003626TEST_F(AssemblerMIPS64Test, IlvevB) {
3627 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvevB, "ilvev.b ${reg1}, ${reg2}, ${reg3}"),
3628 "ilvev.b");
3629}
3630
3631TEST_F(AssemblerMIPS64Test, IlvevH) {
3632 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvevH, "ilvev.h ${reg1}, ${reg2}, ${reg3}"),
3633 "ilvev.h");
3634}
3635
3636TEST_F(AssemblerMIPS64Test, IlvevW) {
3637 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvevW, "ilvev.w ${reg1}, ${reg2}, ${reg3}"),
3638 "ilvev.w");
3639}
3640
3641TEST_F(AssemblerMIPS64Test, IlvevD) {
3642 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvevD, "ilvev.d ${reg1}, ${reg2}, ${reg3}"),
3643 "ilvev.d");
3644}
3645
3646TEST_F(AssemblerMIPS64Test, IlvodB) {
3647 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvodB, "ilvod.b ${reg1}, ${reg2}, ${reg3}"),
3648 "ilvod.b");
3649}
3650
3651TEST_F(AssemblerMIPS64Test, IlvodH) {
3652 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvodH, "ilvod.h ${reg1}, ${reg2}, ${reg3}"),
3653 "ilvod.h");
3654}
3655
3656TEST_F(AssemblerMIPS64Test, IlvodW) {
3657 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvodW, "ilvod.w ${reg1}, ${reg2}, ${reg3}"),
3658 "ilvod.w");
3659}
3660
3661TEST_F(AssemblerMIPS64Test, IlvodD) {
3662 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvodD, "ilvod.d ${reg1}, ${reg2}, ${reg3}"),
3663 "ilvod.d");
3664}
3665
Lena Djokicb3d79e42017-07-25 11:20:52 +02003666TEST_F(AssemblerMIPS64Test, MaddvB) {
3667 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MaddvB, "maddv.b ${reg1}, ${reg2}, ${reg3}"),
3668 "maddv.b");
3669}
3670
3671TEST_F(AssemblerMIPS64Test, MaddvH) {
3672 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MaddvH, "maddv.h ${reg1}, ${reg2}, ${reg3}"),
3673 "maddv.h");
3674}
3675
3676TEST_F(AssemblerMIPS64Test, MaddvW) {
3677 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MaddvW, "maddv.w ${reg1}, ${reg2}, ${reg3}"),
3678 "maddv.w");
3679}
3680
3681TEST_F(AssemblerMIPS64Test, MaddvD) {
3682 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MaddvD, "maddv.d ${reg1}, ${reg2}, ${reg3}"),
3683 "maddv.d");
3684}
3685
Lena Djokic3309c012017-10-13 14:34:32 +02003686TEST_F(AssemblerMIPS64Test, Hadd_sH) {
3687 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Hadd_sH, "hadd_s.h ${reg1}, ${reg2}, ${reg3}"),
3688 "hadd_s.h");
3689}
3690
3691TEST_F(AssemblerMIPS64Test, Hadd_sW) {
3692 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Hadd_sW, "hadd_s.w ${reg1}, ${reg2}, ${reg3}"),
3693 "hadd_s.w");
3694}
3695
3696TEST_F(AssemblerMIPS64Test, Hadd_sD) {
3697 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Hadd_sD, "hadd_s.d ${reg1}, ${reg2}, ${reg3}"),
3698 "hadd_s.d");
3699}
3700
3701TEST_F(AssemblerMIPS64Test, Hadd_uH) {
3702 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Hadd_uH, "hadd_u.h ${reg1}, ${reg2}, ${reg3}"),
3703 "hadd_u.h");
3704}
3705
3706TEST_F(AssemblerMIPS64Test, Hadd_uW) {
3707 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Hadd_uW, "hadd_u.w ${reg1}, ${reg2}, ${reg3}"),
3708 "hadd_u.w");
3709}
3710
3711TEST_F(AssemblerMIPS64Test, Hadd_uD) {
3712 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Hadd_uD, "hadd_u.d ${reg1}, ${reg2}, ${reg3}"),
3713 "hadd_u.d");
3714}
3715
Lena Djokicb3d79e42017-07-25 11:20:52 +02003716TEST_F(AssemblerMIPS64Test, MsubvB) {
3717 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MsubvB, "msubv.b ${reg1}, ${reg2}, ${reg3}"),
3718 "msubv.b");
3719}
3720
3721TEST_F(AssemblerMIPS64Test, MsubvH) {
3722 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MsubvH, "msubv.h ${reg1}, ${reg2}, ${reg3}"),
3723 "msubv.h");
3724}
3725
3726TEST_F(AssemblerMIPS64Test, MsubvW) {
3727 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MsubvW, "msubv.w ${reg1}, ${reg2}, ${reg3}"),
3728 "msubv.w");
3729}
3730
3731TEST_F(AssemblerMIPS64Test, MsubvD) {
3732 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MsubvD, "msubv.d ${reg1}, ${reg2}, ${reg3}"),
3733 "msubv.d");
3734}
3735
3736TEST_F(AssemblerMIPS64Test, FmaddW) {
3737 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmaddW, "fmadd.w ${reg1}, ${reg2}, ${reg3}"),
3738 "fmadd.w");
3739}
3740
3741TEST_F(AssemblerMIPS64Test, FmaddD) {
3742 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmaddD, "fmadd.d ${reg1}, ${reg2}, ${reg3}"),
3743 "fmadd.d");
3744}
3745
3746TEST_F(AssemblerMIPS64Test, FmsubW) {
3747 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmsubW, "fmsub.w ${reg1}, ${reg2}, ${reg3}"),
3748 "fmsub.w");
3749}
3750
3751TEST_F(AssemblerMIPS64Test, FmsubD) {
3752 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmsubD, "fmsub.d ${reg1}, ${reg2}, ${reg3}"),
3753 "fmsub.d");
3754}
3755
Lazar Trsicd9672662015-09-03 17:33:01 +02003756#undef __
3757
Chris Larsendbce0d72015-09-17 13:34:00 -07003758} // namespace art