blob: bf0326de8708d4566f6577da3a6a452dba1d9ffa [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
1356TEST_F(AssemblerMIPS64Test, Dinsu) {
1357 std::vector<mips64::GpuRegister*> reg1_registers = GetRegisters();
1358 std::vector<mips64::GpuRegister*> reg2_registers = GetRegisters();
1359 WarnOnCombinations(reg1_registers.size() * reg2_registers.size() * 33 * 16);
1360 std::ostringstream expected;
1361 for (mips64::GpuRegister* reg1 : reg1_registers) {
1362 for (mips64::GpuRegister* reg2 : reg2_registers) {
1363 for (int32_t pos = 32; pos < 64; pos++) {
1364 for (int32_t size = 1; pos + size <= 64; size++) {
1365 __ Dinsu(*reg1, *reg2, pos, size);
1366 expected << "dinsu $" << *reg1 << ", $" << *reg2 << ", " << pos << ", " << size << "\n";
1367 }
1368 }
1369 }
1370 }
1371
1372 DriverStr(expected.str(), "Dinsu");
1373}
1374
Chris Larsene3660592016-11-09 11:13:42 -08001375TEST_F(AssemblerMIPS64Test, Lsa) {
1376 DriverStr(RepeatRRRIb(&mips64::Mips64Assembler::Lsa,
1377 2,
1378 "lsa ${reg1}, ${reg2}, ${reg3}, {imm}",
1379 1),
1380 "lsa");
1381}
1382
1383TEST_F(AssemblerMIPS64Test, Dlsa) {
1384 DriverStr(RepeatRRRIb(&mips64::Mips64Assembler::Dlsa,
1385 2,
1386 "dlsa ${reg1}, ${reg2}, ${reg3}, {imm}",
1387 1),
1388 "dlsa");
1389}
1390
Chris Larsendbce0d72015-09-17 13:34:00 -07001391TEST_F(AssemblerMIPS64Test, Wsbh) {
1392 DriverStr(RepeatRR(&mips64::Mips64Assembler::Wsbh, "wsbh ${reg1}, ${reg2}"), "wsbh");
1393}
1394
Chris Larsen51417632015-10-02 13:24:25 -07001395TEST_F(AssemblerMIPS64Test, Sll) {
1396 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sll, 5, "sll ${reg1}, ${reg2}, {imm}"), "sll");
1397}
1398
1399TEST_F(AssemblerMIPS64Test, Srl) {
1400 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Srl, 5, "srl ${reg1}, ${reg2}, {imm}"), "srl");
1401}
1402
Chris Larsen98a73e12015-10-19 14:17:16 -07001403TEST_F(AssemblerMIPS64Test, Rotr) {
1404 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Rotr, 5, "rotr ${reg1}, ${reg2}, {imm}"), "rotr");
1405}
1406
Chris Larsen51417632015-10-02 13:24:25 -07001407TEST_F(AssemblerMIPS64Test, Sra) {
1408 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sra, 5, "sra ${reg1}, ${reg2}, {imm}"), "sra");
1409}
1410
Chris Larsen98a73e12015-10-19 14:17:16 -07001411TEST_F(AssemblerMIPS64Test, Sllv) {
1412 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Sllv, "sllv ${reg1}, ${reg2}, ${reg3}"), "sllv");
1413}
1414
1415TEST_F(AssemblerMIPS64Test, Srlv) {
1416 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Srlv, "srlv ${reg1}, ${reg2}, ${reg3}"), "srlv");
1417}
1418
1419TEST_F(AssemblerMIPS64Test, Rotrv) {
1420 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Rotrv, "rotrv ${reg1}, ${reg2}, ${reg3}"), "rotrv");
1421}
1422
1423TEST_F(AssemblerMIPS64Test, Srav) {
1424 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Srav, "srav ${reg1}, ${reg2}, ${reg3}"), "srav");
1425}
1426
Chris Larsen51417632015-10-02 13:24:25 -07001427TEST_F(AssemblerMIPS64Test, Dsll) {
1428 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsll, 5, "dsll ${reg1}, ${reg2}, {imm}"), "dsll");
1429}
1430
1431TEST_F(AssemblerMIPS64Test, Dsrl) {
1432 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsrl, 5, "dsrl ${reg1}, ${reg2}, {imm}"), "dsrl");
1433}
1434
Chris Larsen98a73e12015-10-19 14:17:16 -07001435TEST_F(AssemblerMIPS64Test, Drotr) {
1436 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Drotr, 5, "drotr ${reg1}, ${reg2}, {imm}"),
1437 "drotr");
1438}
1439
Chris Larsen51417632015-10-02 13:24:25 -07001440TEST_F(AssemblerMIPS64Test, Dsra) {
1441 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsra, 5, "dsra ${reg1}, ${reg2}, {imm}"), "dsra");
1442}
1443
1444TEST_F(AssemblerMIPS64Test, Dsll32) {
Chris Larsen98a73e12015-10-19 14:17:16 -07001445 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsll32, 5, "dsll32 ${reg1}, ${reg2}, {imm}"),
1446 "dsll32");
Chris Larsen51417632015-10-02 13:24:25 -07001447}
1448
1449TEST_F(AssemblerMIPS64Test, Dsrl32) {
Chris Larsen98a73e12015-10-19 14:17:16 -07001450 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsrl32, 5, "dsrl32 ${reg1}, ${reg2}, {imm}"),
1451 "dsrl32");
1452}
1453
1454TEST_F(AssemblerMIPS64Test, Drotr32) {
1455 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Drotr32, 5, "drotr32 ${reg1}, ${reg2}, {imm}"),
1456 "drotr32");
Chris Larsen51417632015-10-02 13:24:25 -07001457}
1458
1459TEST_F(AssemblerMIPS64Test, Dsra32) {
Chris Larsen98a73e12015-10-19 14:17:16 -07001460 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsra32, 5, "dsra32 ${reg1}, ${reg2}, {imm}"),
1461 "dsra32");
Chris Larsen51417632015-10-02 13:24:25 -07001462}
1463
Goran Jakovljevic95f27142017-01-20 11:11:11 +01001464TEST_F(AssemblerMIPS64Test, Dsllv) {
1465 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dsllv, "dsllv ${reg1}, ${reg2}, ${reg3}"), "dsllv");
1466}
1467
1468TEST_F(AssemblerMIPS64Test, Dsrlv) {
1469 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dsrlv, "dsrlv ${reg1}, ${reg2}, ${reg3}"), "dsrlv");
1470}
1471
1472TEST_F(AssemblerMIPS64Test, Dsrav) {
1473 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dsrav, "dsrav ${reg1}, ${reg2}, ${reg3}"), "dsrav");
1474}
1475
Chris Larsendbce0d72015-09-17 13:34:00 -07001476TEST_F(AssemblerMIPS64Test, Sc) {
1477 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sc, -9, "sc ${reg1}, {imm}(${reg2})"), "sc");
1478}
1479
1480TEST_F(AssemblerMIPS64Test, Scd) {
1481 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Scd, -9, "scd ${reg1}, {imm}(${reg2})"), "scd");
1482}
1483
1484TEST_F(AssemblerMIPS64Test, Ll) {
1485 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Ll, -9, "ll ${reg1}, {imm}(${reg2})"), "ll");
1486}
1487
1488TEST_F(AssemblerMIPS64Test, Lld) {
1489 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lld, -9, "lld ${reg1}, {imm}(${reg2})"), "lld");
1490}
1491
Chris Larsendbce0d72015-09-17 13:34:00 -07001492TEST_F(AssemblerMIPS64Test, Seleqz) {
1493 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Seleqz, "seleqz ${reg1}, ${reg2}, ${reg3}"),
1494 "seleqz");
1495}
1496
1497TEST_F(AssemblerMIPS64Test, Selnez) {
1498 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Selnez, "selnez ${reg1}, ${reg2}, ${reg3}"),
1499 "selnez");
1500}
1501
1502TEST_F(AssemblerMIPS64Test, Clz) {
1503 DriverStr(RepeatRR(&mips64::Mips64Assembler::Clz, "clz ${reg1}, ${reg2}"), "clz");
1504}
1505
1506TEST_F(AssemblerMIPS64Test, Clo) {
1507 DriverStr(RepeatRR(&mips64::Mips64Assembler::Clo, "clo ${reg1}, ${reg2}"), "clo");
1508}
1509
1510TEST_F(AssemblerMIPS64Test, Dclz) {
1511 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dclz, "dclz ${reg1}, ${reg2}"), "dclz");
1512}
1513
1514TEST_F(AssemblerMIPS64Test, Dclo) {
1515 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dclo, "dclo ${reg1}, ${reg2}"), "dclo");
1516}
1517
Lazar Trsicd9672662015-09-03 17:33:01 +02001518TEST_F(AssemblerMIPS64Test, LoadFromOffset) {
1519 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A0, 0);
1520 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0);
1521 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 1);
1522 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 256);
1523 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 1000);
1524 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x7FFF);
1525 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x8000);
1526 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x8001);
1527 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x10000);
1528 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x12345678);
1529 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, -256);
1530 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, -32768);
1531 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001532 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x7FFFFFFE);
1533 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x7FFFFFFF);
1534 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x80000000);
1535 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x80000001);
Lazar Trsicd9672662015-09-03 17:33:01 +02001536
1537 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A0, 0);
1538 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0);
1539 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 1);
1540 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 256);
1541 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 1000);
1542 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x7FFF);
1543 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x8000);
1544 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x8001);
1545 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x10000);
1546 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x12345678);
1547 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, -256);
1548 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, -32768);
1549 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001550 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x7FFFFFFE);
1551 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x7FFFFFFF);
1552 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x80000000);
1553 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x80000001);
Lazar Trsicd9672662015-09-03 17:33:01 +02001554
1555 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A0, 0);
1556 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0);
1557 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 2);
1558 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 256);
1559 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 1000);
1560 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x7FFE);
1561 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x8000);
1562 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x8002);
1563 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x10000);
1564 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x12345678);
1565 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, -256);
1566 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, -32768);
1567 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001568 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x7FFFFFFC);
1569 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x7FFFFFFE);
1570 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x80000000);
1571 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x80000002);
Lazar Trsicd9672662015-09-03 17:33:01 +02001572
1573 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A0, 0);
1574 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0);
1575 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 2);
1576 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 256);
1577 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 1000);
1578 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x7FFE);
1579 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x8000);
1580 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x8002);
1581 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x10000);
1582 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x12345678);
1583 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, -256);
1584 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, -32768);
1585 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001586 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x7FFFFFFC);
1587 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x7FFFFFFE);
1588 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x80000000);
1589 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x80000002);
Lazar Trsicd9672662015-09-03 17:33:01 +02001590
1591 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A0, 0);
1592 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0);
1593 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 4);
1594 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 256);
1595 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 1000);
1596 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x7FFC);
1597 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x8000);
1598 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x8004);
1599 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x10000);
1600 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x12345678);
1601 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, -256);
1602 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, -32768);
1603 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001604 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x7FFFFFF8);
1605 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x7FFFFFFC);
1606 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x80000000);
1607 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x80000004);
Lazar Trsicd9672662015-09-03 17:33:01 +02001608
1609 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A0, 0);
1610 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0);
1611 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 4);
1612 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 256);
1613 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 1000);
1614 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x7FFC);
1615 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x8000);
1616 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x8004);
1617 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x10000);
1618 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x12345678);
1619 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, -256);
1620 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, -32768);
1621 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001622 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x7FFFFFF8);
1623 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x7FFFFFFC);
1624 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x80000000);
1625 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x80000004);
Lazar Trsicd9672662015-09-03 17:33:01 +02001626
1627 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A0, 0);
1628 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0);
1629 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 4);
1630 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 256);
1631 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 1000);
1632 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x7FFC);
1633 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x8000);
1634 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x8004);
1635 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x10000);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001636 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x27FFC);
Lazar Trsicd9672662015-09-03 17:33:01 +02001637 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x12345678);
1638 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, -256);
1639 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, -32768);
1640 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001641 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x7FFFFFF8);
1642 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x7FFFFFFC);
1643 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x80000000);
1644 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x80000004);
Lazar Trsicd9672662015-09-03 17:33:01 +02001645
1646 const char* expected =
1647 "lb $a0, 0($a0)\n"
1648 "lb $a0, 0($a1)\n"
1649 "lb $a0, 1($a1)\n"
1650 "lb $a0, 256($a1)\n"
1651 "lb $a0, 1000($a1)\n"
1652 "lb $a0, 0x7FFF($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001653 "daddiu $at, $a1, 0x7FF8\n"
1654 "lb $a0, 8($at)\n"
1655 "daddiu $at, $a1, 32760\n"
1656 "lb $a0, 9($at)\n"
1657 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001658 "lb $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001659 "daui $at, $a1, 0x1234\n"
1660 "lb $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001661 "lb $a0, -256($a1)\n"
1662 "lb $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001663 "daui $at, $a1, 0xABCE\n"
1664 "lb $a0, -4352($at)\n"
1665 "daui $at, $a1, 32768\n"
1666 "dahi $at, $at, 1\n"
1667 "lb $a0, -2($at)\n"
1668 "daui $at, $a1, 32768\n"
1669 "dahi $at, $at, 1\n"
1670 "lb $a0, -1($at)\n"
1671 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001672 "lb $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001673 "daui $at, $a1, 32768\n"
1674 "lb $a0, 1($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001675
1676 "lbu $a0, 0($a0)\n"
1677 "lbu $a0, 0($a1)\n"
1678 "lbu $a0, 1($a1)\n"
1679 "lbu $a0, 256($a1)\n"
1680 "lbu $a0, 1000($a1)\n"
1681 "lbu $a0, 0x7FFF($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001682 "daddiu $at, $a1, 0x7FF8\n"
1683 "lbu $a0, 8($at)\n"
1684 "daddiu $at, $a1, 32760\n"
1685 "lbu $a0, 9($at)\n"
1686 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001687 "lbu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001688 "daui $at, $a1, 0x1234\n"
1689 "lbu $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001690 "lbu $a0, -256($a1)\n"
1691 "lbu $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001692 "daui $at, $a1, 0xABCE\n"
1693 "lbu $a0, -4352($at)\n"
1694 "daui $at, $a1, 32768\n"
1695 "dahi $at, $at, 1\n"
1696 "lbu $a0, -2($at)\n"
1697 "daui $at, $a1, 32768\n"
1698 "dahi $at, $at, 1\n"
1699 "lbu $a0, -1($at)\n"
1700 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001701 "lbu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001702 "daui $at, $a1, 32768\n"
1703 "lbu $a0, 1($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001704
1705 "lh $a0, 0($a0)\n"
1706 "lh $a0, 0($a1)\n"
1707 "lh $a0, 2($a1)\n"
1708 "lh $a0, 256($a1)\n"
1709 "lh $a0, 1000($a1)\n"
1710 "lh $a0, 0x7FFE($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001711 "daddiu $at, $a1, 0x7FF8\n"
1712 "lh $a0, 8($at)\n"
1713 "daddiu $at, $a1, 32760\n"
1714 "lh $a0, 10($at)\n"
1715 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001716 "lh $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001717 "daui $at, $a1, 0x1234\n"
1718 "lh $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001719 "lh $a0, -256($a1)\n"
1720 "lh $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001721 "daui $at, $a1, 0xABCE\n"
1722 "lh $a0, -4352($at)\n"
1723 "daui $at, $a1, 32768\n"
1724 "dahi $at, $at, 1\n"
1725 "lh $a0, -4($at)\n"
1726 "daui $at, $a1, 32768\n"
1727 "dahi $at, $at, 1\n"
1728 "lh $a0, -2($at)\n"
1729 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001730 "lh $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001731 "daui $at, $a1, 32768\n"
1732 "lh $a0, 2($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001733
1734 "lhu $a0, 0($a0)\n"
1735 "lhu $a0, 0($a1)\n"
1736 "lhu $a0, 2($a1)\n"
1737 "lhu $a0, 256($a1)\n"
1738 "lhu $a0, 1000($a1)\n"
1739 "lhu $a0, 0x7FFE($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001740 "daddiu $at, $a1, 0x7FF8\n"
1741 "lhu $a0, 8($at)\n"
1742 "daddiu $at, $a1, 32760\n"
1743 "lhu $a0, 10($at)\n"
1744 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001745 "lhu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001746 "daui $at, $a1, 0x1234\n"
1747 "lhu $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001748 "lhu $a0, -256($a1)\n"
1749 "lhu $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001750 "daui $at, $a1, 0xABCE\n"
1751 "lhu $a0, -4352($at)\n"
1752 "daui $at, $a1, 32768\n"
1753 "dahi $at, $at, 1\n"
1754 "lhu $a0, -4($at)\n"
1755 "daui $at, $a1, 32768\n"
1756 "dahi $at, $at, 1\n"
1757 "lhu $a0, -2($at)\n"
1758 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001759 "lhu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001760 "daui $at, $a1, 32768\n"
1761 "lhu $a0, 2($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001762
1763 "lw $a0, 0($a0)\n"
1764 "lw $a0, 0($a1)\n"
1765 "lw $a0, 4($a1)\n"
1766 "lw $a0, 256($a1)\n"
1767 "lw $a0, 1000($a1)\n"
1768 "lw $a0, 0x7FFC($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001769 "daddiu $at, $a1, 0x7FF8\n"
1770 "lw $a0, 8($at)\n"
1771 "daddiu $at, $a1, 32760\n"
1772 "lw $a0, 12($at)\n"
1773 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001774 "lw $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001775 "daui $at, $a1, 0x1234\n"
1776 "lw $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001777 "lw $a0, -256($a1)\n"
1778 "lw $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001779 "daui $at, $a1, 0xABCE\n"
1780 "lw $a0, -4352($at)\n"
1781 "daui $at, $a1, 32768\n"
1782 "dahi $at, $at, 1\n"
1783 "lw $a0, -8($at)\n"
1784 "daui $at, $a1, 32768\n"
1785 "dahi $at, $at, 1\n"
1786 "lw $a0, -4($at)\n"
1787 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001788 "lw $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001789 "daui $at, $a1, 32768\n"
1790 "lw $a0, 4($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001791
1792 "lwu $a0, 0($a0)\n"
1793 "lwu $a0, 0($a1)\n"
1794 "lwu $a0, 4($a1)\n"
1795 "lwu $a0, 256($a1)\n"
1796 "lwu $a0, 1000($a1)\n"
1797 "lwu $a0, 0x7FFC($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001798 "daddiu $at, $a1, 0x7FF8\n"
1799 "lwu $a0, 8($at)\n"
1800 "daddiu $at, $a1, 32760\n"
1801 "lwu $a0, 12($at)\n"
1802 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001803 "lwu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001804 "daui $at, $a1, 0x1234\n"
1805 "lwu $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001806 "lwu $a0, -256($a1)\n"
1807 "lwu $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001808 "daui $at, $a1, 0xABCE\n"
1809 "lwu $a0, -4352($at)\n"
1810 "daui $at, $a1, 32768\n"
1811 "dahi $at, $at, 1\n"
1812 "lwu $a0, -8($at)\n"
1813 "daui $at, $a1, 32768\n"
1814 "dahi $at, $at, 1\n"
1815 "lwu $a0, -4($at)\n"
1816 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001817 "lwu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001818 "daui $at, $a1, 32768\n"
1819 "lwu $a0, 4($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001820
1821 "ld $a0, 0($a0)\n"
1822 "ld $a0, 0($a1)\n"
1823 "lwu $a0, 4($a1)\n"
1824 "lwu $t3, 8($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001825 "dinsu $a0, $t3, 32, 32\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001826 "ld $a0, 256($a1)\n"
1827 "ld $a0, 1000($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001828 "daddiu $at, $a1, 32760\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001829 "lwu $a0, 4($at)\n"
1830 "lwu $t3, 8($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001831 "dinsu $a0, $t3, 32, 32\n"
1832 "daddiu $at, $a1, 32760\n"
1833 "ld $a0, 8($at)\n"
1834 "daddiu $at, $a1, 32760\n"
1835 "lwu $a0, 12($at)\n"
1836 "lwu $t3, 16($at)\n"
1837 "dinsu $a0, $t3, 32, 32\n"
1838 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001839 "ld $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001840 "daui $at, $a1, 2\n"
1841 "daddiu $at, $at, 8\n"
1842 "lwu $a0, 0x7ff4($at)\n"
1843 "lwu $t3, 0x7ff8($at)\n"
1844 "dinsu $a0, $t3, 32, 32\n"
1845 "daui $at, $a1, 0x1234\n"
1846 "ld $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001847 "ld $a0, -256($a1)\n"
1848 "ld $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001849 "daui $at, $a1, 0xABCE\n"
1850 "ld $a0, -4352($at)\n"
1851 "daui $at, $a1, 32768\n"
1852 "dahi $at, $at, 1\n"
1853 "ld $a0, -8($at)\n"
1854 "daui $at, $a1, 32768\n"
1855 "dahi $at, $at, 1\n"
1856 "lwu $a0, -4($at)\n"
1857 "lwu $t3, 0($at)\n"
1858 "dinsu $a0, $t3, 32, 32\n"
1859 "daui $at, $a1, 32768\n"
1860 "ld $a0, 0($at)\n"
1861 "daui $at, $a1, 32768\n"
1862 "lwu $a0, 4($at)\n"
1863 "lwu $t3, 8($at)\n"
1864 "dinsu $a0, $t3, 32, 32\n";
Lazar Trsicd9672662015-09-03 17:33:01 +02001865 DriverStr(expected, "LoadFromOffset");
1866}
1867
1868TEST_F(AssemblerMIPS64Test, LoadFpuFromOffset) {
1869 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0);
1870 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 4);
1871 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 256);
1872 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x7FFC);
1873 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x8000);
1874 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x8004);
1875 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x10000);
1876 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x12345678);
1877 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, -256);
1878 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, -32768);
1879 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0xABCDEF00);
1880
1881 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0);
1882 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 4);
1883 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 256);
1884 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x7FFC);
1885 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x8000);
1886 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x8004);
1887 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x10000);
1888 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x12345678);
1889 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, -256);
1890 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, -32768);
1891 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0xABCDEF00);
1892
Goran Jakovljevicd8b6a532017-04-20 11:42:30 +02001893 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0);
1894 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 1);
1895 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 2);
1896 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4);
1897 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 8);
1898 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 511);
1899 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 512);
1900 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 513);
1901 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 514);
1902 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 516);
1903 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 1022);
1904 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 1024);
1905 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 1025);
1906 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 1026);
1907 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 1028);
1908 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 2044);
1909 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 2048);
1910 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 2049);
1911 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 2050);
1912 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 2052);
1913 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4088);
1914 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4096);
1915 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4097);
1916 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4098);
1917 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4100);
1918 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4104);
1919 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0x7FFC);
1920 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0x8000);
1921 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0x10000);
1922 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0x12345678);
1923 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0x12350078);
1924 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -256);
1925 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -511);
1926 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -513);
1927 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -1022);
1928 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -1026);
1929 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -2044);
1930 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -2052);
1931 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -4096);
1932 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -4104);
1933 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -32768);
1934 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0xABCDEF00);
1935 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0x7FFFABCD);
1936
Lazar Trsicd9672662015-09-03 17:33:01 +02001937 const char* expected =
1938 "lwc1 $f0, 0($a0)\n"
1939 "lwc1 $f0, 4($a0)\n"
1940 "lwc1 $f0, 256($a0)\n"
1941 "lwc1 $f0, 0x7FFC($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001942 "daddiu $at, $a0, 32760 # 0x7FF8\n"
1943 "lwc1 $f0, 8($at)\n"
1944 "daddiu $at, $a0, 32760 # 0x7FF8\n"
1945 "lwc1 $f0, 12($at)\n"
1946 "daui $at, $a0, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001947 "lwc1 $f0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001948 "daui $at, $a0, 4660 # 0x1234\n"
1949 "lwc1 $f0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001950 "lwc1 $f0, -256($a0)\n"
1951 "lwc1 $f0, -32768($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001952 "daui $at, $a0, 0xABCE\n"
1953 "lwc1 $f0, -0x1100($at) # 0xEF00\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001954
1955 "ldc1 $f0, 0($a0)\n"
1956 "lwc1 $f0, 4($a0)\n"
1957 "lw $t3, 8($a0)\n"
1958 "mthc1 $t3, $f0\n"
1959 "ldc1 $f0, 256($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001960 "daddiu $at, $a0, 32760 # 0x7FF8\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001961 "lwc1 $f0, 4($at)\n"
1962 "lw $t3, 8($at)\n"
1963 "mthc1 $t3, $f0\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001964 "daddiu $at, $a0, 32760 # 0x7FF8\n"
1965 "ldc1 $f0, 8($at)\n"
1966 "daddiu $at, $a0, 32760 # 0x7FF8\n"
1967 "lwc1 $f0, 12($at)\n"
1968 "lw $t3, 16($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001969 "mthc1 $t3, $f0\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001970 "daui $at, $a0, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001971 "ldc1 $f0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001972 "daui $at, $a0, 4660 # 0x1234\n"
1973 "ldc1 $f0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001974 "ldc1 $f0, -256($a0)\n"
1975 "ldc1 $f0, -32768($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001976 "daui $at, $a0, 0xABCE\n"
Goran Jakovljevicd8b6a532017-04-20 11:42:30 +02001977 "ldc1 $f0, -0x1100($at) # 0xEF00\n"
1978
1979 "ld.d $w0, 0($a0)\n"
1980 "ld.b $w0, 1($a0)\n"
1981 "ld.h $w0, 2($a0)\n"
1982 "ld.w $w0, 4($a0)\n"
1983 "ld.d $w0, 8($a0)\n"
1984 "ld.b $w0, 511($a0)\n"
1985 "ld.d $w0, 512($a0)\n"
1986 "daddiu $at, $a0, 513\n"
1987 "ld.b $w0, 0($at)\n"
1988 "ld.h $w0, 514($a0)\n"
1989 "ld.w $w0, 516($a0)\n"
1990 "ld.h $w0, 1022($a0)\n"
1991 "ld.d $w0, 1024($a0)\n"
1992 "daddiu $at, $a0, 1025\n"
1993 "ld.b $w0, 0($at)\n"
1994 "daddiu $at, $a0, 1026\n"
1995 "ld.h $w0, 0($at)\n"
1996 "ld.w $w0, 1028($a0)\n"
1997 "ld.w $w0, 2044($a0)\n"
1998 "ld.d $w0, 2048($a0)\n"
1999 "daddiu $at, $a0, 2049\n"
2000 "ld.b $w0, 0($at)\n"
2001 "daddiu $at, $a0, 2050\n"
2002 "ld.h $w0, 0($at)\n"
2003 "daddiu $at, $a0, 2052\n"
2004 "ld.w $w0, 0($at)\n"
2005 "ld.d $w0, 4088($a0)\n"
2006 "daddiu $at, $a0, 4096\n"
2007 "ld.d $w0, 0($at)\n"
2008 "daddiu $at, $a0, 4097\n"
2009 "ld.b $w0, 0($at)\n"
2010 "daddiu $at, $a0, 4098\n"
2011 "ld.h $w0, 0($at)\n"
2012 "daddiu $at, $a0, 4100\n"
2013 "ld.w $w0, 0($at)\n"
2014 "daddiu $at, $a0, 4104\n"
2015 "ld.d $w0, 0($at)\n"
2016 "daddiu $at, $a0, 0x7FFC\n"
2017 "ld.w $w0, 0($at)\n"
2018 "daddiu $at, $a0, 0x7FF8\n"
2019 "ld.d $w0, 8($at)\n"
2020 "daui $at, $a0, 0x1\n"
2021 "ld.d $w0, 0($at)\n"
2022 "daui $at, $a0, 0x1234\n"
2023 "daddiu $at, $at, 0x6000\n"
2024 "ld.d $w0, -2440($at) # 0xF678\n"
2025 "daui $at, $a0, 0x1235\n"
2026 "ld.d $w0, 0x78($at)\n"
2027 "ld.d $w0, -256($a0)\n"
2028 "ld.b $w0, -511($a0)\n"
2029 "daddiu $at, $a0, -513\n"
2030 "ld.b $w0, 0($at)\n"
2031 "ld.h $w0, -1022($a0)\n"
2032 "daddiu $at, $a0, -1026\n"
2033 "ld.h $w0, 0($at)\n"
2034 "ld.w $w0, -2044($a0)\n"
2035 "daddiu $at, $a0, -2052\n"
2036 "ld.w $w0, 0($at)\n"
2037 "ld.d $w0, -4096($a0)\n"
2038 "daddiu $at, $a0, -4104\n"
2039 "ld.d $w0, 0($at)\n"
2040 "daddiu $at, $a0, -32768\n"
2041 "ld.d $w0, 0($at)\n"
2042 "daui $at, $a0, 0xABCE\n"
2043 "daddiu $at, $at, -8192 # 0xE000\n"
2044 "ld.d $w0, 0xF00($at)\n"
2045 "daui $at, $a0, 0x8000\n"
2046 "dahi $at, $at, 1\n"
2047 "daddiu $at, $at, -21504 # 0xAC00\n"
2048 "ld.b $w0, -51($at) # 0xFFCD\n";
Lazar Trsicd9672662015-09-03 17:33:01 +02002049 DriverStr(expected, "LoadFpuFromOffset");
2050}
2051
2052TEST_F(AssemblerMIPS64Test, StoreToOffset) {
2053 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A0, 0);
2054 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0);
2055 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 1);
2056 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 256);
2057 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 1000);
2058 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x7FFF);
2059 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x8000);
2060 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x8001);
2061 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x10000);
2062 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x12345678);
2063 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, -256);
2064 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, -32768);
2065 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0xABCDEF00);
2066
2067 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A0, 0);
2068 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0);
2069 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 2);
2070 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 256);
2071 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 1000);
2072 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x7FFE);
2073 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x8000);
2074 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x8002);
2075 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x10000);
2076 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x12345678);
2077 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, -256);
2078 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, -32768);
2079 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0xABCDEF00);
2080
2081 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A0, 0);
2082 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0);
2083 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 4);
2084 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 256);
2085 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 1000);
2086 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x7FFC);
2087 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x8000);
2088 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x8004);
2089 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x10000);
2090 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x12345678);
2091 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, -256);
2092 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, -32768);
2093 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0xABCDEF00);
2094
2095 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A0, 0);
2096 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0);
2097 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 4);
2098 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 256);
2099 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 1000);
2100 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x7FFC);
2101 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x8000);
2102 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x8004);
2103 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x10000);
2104 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x12345678);
2105 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, -256);
2106 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, -32768);
2107 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002108 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x7FFFFFF8);
2109 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x7FFFFFFC);
2110 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x80000000);
2111 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x80000004);
Lazar Trsicd9672662015-09-03 17:33:01 +02002112
2113 const char* expected =
2114 "sb $a0, 0($a0)\n"
2115 "sb $a0, 0($a1)\n"
2116 "sb $a0, 1($a1)\n"
2117 "sb $a0, 256($a1)\n"
2118 "sb $a0, 1000($a1)\n"
2119 "sb $a0, 0x7FFF($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002120 "daddiu $at, $a1, 0x7FF8\n"
2121 "sb $a0, 8($at)\n"
2122 "daddiu $at, $a1, 0x7FF8\n"
2123 "sb $a0, 9($at)\n"
2124 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002125 "sb $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002126 "daui $at, $a1, 4660 # 0x1234\n"
2127 "sb $a0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002128 "sb $a0, -256($a1)\n"
2129 "sb $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002130 "daui $at, $a1, 43982 # 0xABCE\n"
2131 "sb $a0, -4352($at) # 0xEF00\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002132
2133 "sh $a0, 0($a0)\n"
2134 "sh $a0, 0($a1)\n"
2135 "sh $a0, 2($a1)\n"
2136 "sh $a0, 256($a1)\n"
2137 "sh $a0, 1000($a1)\n"
2138 "sh $a0, 0x7FFE($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002139 "daddiu $at, $a1, 0x7FF8\n"
2140 "sh $a0, 8($at)\n"
2141 "daddiu $at, $a1, 0x7FF8\n"
2142 "sh $a0, 10($at)\n"
2143 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002144 "sh $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002145 "daui $at, $a1, 4660 # 0x1234\n"
2146 "sh $a0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002147 "sh $a0, -256($a1)\n"
2148 "sh $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002149 "daui $at, $a1, 43982 # 0xABCE\n"
2150 "sh $a0, -4352($at) # 0xEF00\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002151
2152 "sw $a0, 0($a0)\n"
2153 "sw $a0, 0($a1)\n"
2154 "sw $a0, 4($a1)\n"
2155 "sw $a0, 256($a1)\n"
2156 "sw $a0, 1000($a1)\n"
2157 "sw $a0, 0x7FFC($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002158 "daddiu $at, $a1, 0x7FF8\n"
2159 "sw $a0, 8($at)\n"
2160 "daddiu $at, $a1, 0x7FF8\n"
2161 "sw $a0, 12($at)\n"
2162 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002163 "sw $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002164 "daui $at, $a1, 4660 # 0x1234\n"
2165 "sw $a0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002166 "sw $a0, -256($a1)\n"
2167 "sw $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002168 "daui $at, $a1, 43982 # 0xABCE\n"
2169 "sw $a0, -4352($at) # 0xEF00\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002170
2171 "sd $a0, 0($a0)\n"
2172 "sd $a0, 0($a1)\n"
2173 "sw $a0, 4($a1)\n"
2174 "dsrl32 $t3, $a0, 0\n"
2175 "sw $t3, 8($a1)\n"
2176 "sd $a0, 256($a1)\n"
2177 "sd $a0, 1000($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002178 "daddiu $at, $a1, 0x7FF8\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002179 "sw $a0, 4($at)\n"
2180 "dsrl32 $t3, $a0, 0\n"
2181 "sw $t3, 8($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002182 "daddiu $at, $a1, 32760 # 0x7FF8\n"
2183 "sd $a0, 8($at)\n"
2184 "daddiu $at, $a1, 32760 # 0x7FF8\n"
2185 "sw $a0, 12($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002186 "dsrl32 $t3, $a0, 0\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002187 "sw $t3, 16($at)\n"
2188 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002189 "sd $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002190 "daui $at, $a1, 4660 # 0x1234\n"
2191 "sd $a0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002192 "sd $a0, -256($a1)\n"
2193 "sd $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002194 "daui $at, $a1, 0xABCE\n"
2195 "sd $a0, -0x1100($at)\n"
2196 "daui $at, $a1, 0x8000\n"
2197 "dahi $at, $at, 1\n"
2198 "sd $a0, -8($at)\n"
2199 "daui $at, $a1, 0x8000\n"
2200 "dahi $at, $at, 1\n"
2201 "sw $a0, -4($at) # 0xFFFC\n"
2202 "dsrl32 $t3, $a0, 0\n"
2203 "sw $t3, 0($at) # 0x0\n"
2204 "daui $at, $a1, 0x8000\n"
2205 "sd $a0, 0($at) # 0x0\n"
2206 "daui $at, $a1, 0x8000\n"
2207 "sw $a0, 4($at) # 0x4\n"
2208 "dsrl32 $t3, $a0, 0\n"
2209 "sw $t3, 8($at) # 0x8\n";
Lazar Trsicd9672662015-09-03 17:33:01 +02002210 DriverStr(expected, "StoreToOffset");
2211}
2212
2213TEST_F(AssemblerMIPS64Test, StoreFpuToOffset) {
2214 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0);
2215 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 4);
2216 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 256);
2217 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x7FFC);
2218 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x8000);
2219 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x8004);
2220 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x10000);
2221 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x12345678);
2222 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, -256);
2223 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, -32768);
2224 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0xABCDEF00);
2225
2226 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0);
2227 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 4);
2228 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 256);
2229 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x7FFC);
2230 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x8000);
2231 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x8004);
2232 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x10000);
2233 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x12345678);
2234 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, -256);
2235 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, -32768);
2236 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0xABCDEF00);
2237
Goran Jakovljevicd8b6a532017-04-20 11:42:30 +02002238 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0);
2239 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 1);
2240 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 2);
2241 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4);
2242 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 8);
2243 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 511);
2244 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 512);
2245 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 513);
2246 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 514);
2247 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 516);
2248 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 1022);
2249 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 1024);
2250 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 1025);
2251 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 1026);
2252 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 1028);
2253 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 2044);
2254 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 2048);
2255 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 2049);
2256 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 2050);
2257 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 2052);
2258 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4088);
2259 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4096);
2260 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4097);
2261 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4098);
2262 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4100);
2263 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4104);
2264 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0x7FFC);
2265 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0x8000);
2266 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0x10000);
2267 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0x12345678);
2268 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0x12350078);
2269 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -256);
2270 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -511);
2271 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -513);
2272 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -1022);
2273 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -1026);
2274 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -2044);
2275 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -2052);
2276 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -4096);
2277 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -4104);
2278 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -32768);
2279 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0xABCDEF00);
2280 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0x7FFFABCD);
2281
Lazar Trsicd9672662015-09-03 17:33:01 +02002282 const char* expected =
2283 "swc1 $f0, 0($a0)\n"
2284 "swc1 $f0, 4($a0)\n"
2285 "swc1 $f0, 256($a0)\n"
2286 "swc1 $f0, 0x7FFC($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002287 "daddiu $at, $a0, 32760 # 0x7FF8\n"
2288 "swc1 $f0, 8($at)\n"
2289 "daddiu $at, $a0, 32760 # 0x7FF8\n"
2290 "swc1 $f0, 12($at)\n"
2291 "daui $at, $a0, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002292 "swc1 $f0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002293 "daui $at, $a0, 4660 # 0x1234\n"
2294 "swc1 $f0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002295 "swc1 $f0, -256($a0)\n"
2296 "swc1 $f0, -32768($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002297 "daui $at, $a0, 0xABCE\n"
2298 "swc1 $f0, -0x1100($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002299
2300 "sdc1 $f0, 0($a0)\n"
2301 "mfhc1 $t3, $f0\n"
2302 "swc1 $f0, 4($a0)\n"
2303 "sw $t3, 8($a0)\n"
2304 "sdc1 $f0, 256($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002305 "daddiu $at, $a0, 32760 # 0x7FF8\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002306 "mfhc1 $t3, $f0\n"
2307 "swc1 $f0, 4($at)\n"
2308 "sw $t3, 8($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002309 "daddiu $at, $a0, 32760 # 0x7FF8\n"
2310 "sdc1 $f0, 8($at)\n"
2311 "daddiu $at, $a0, 32760 # 0x7FF8\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002312 "mfhc1 $t3, $f0\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002313 "swc1 $f0, 12($at)\n"
2314 "sw $t3, 16($at)\n"
2315 "daui $at, $a0, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002316 "sdc1 $f0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002317 "daui $at, $a0, 4660 # 0x1234\n"
2318 "sdc1 $f0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002319 "sdc1 $f0, -256($a0)\n"
2320 "sdc1 $f0, -32768($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002321 "daui $at, $a0, 0xABCE\n"
Goran Jakovljevicd8b6a532017-04-20 11:42:30 +02002322 "sdc1 $f0, -0x1100($at)\n"
2323
2324 "st.d $w0, 0($a0)\n"
2325 "st.b $w0, 1($a0)\n"
2326 "st.h $w0, 2($a0)\n"
2327 "st.w $w0, 4($a0)\n"
2328 "st.d $w0, 8($a0)\n"
2329 "st.b $w0, 511($a0)\n"
2330 "st.d $w0, 512($a0)\n"
2331 "daddiu $at, $a0, 513\n"
2332 "st.b $w0, 0($at)\n"
2333 "st.h $w0, 514($a0)\n"
2334 "st.w $w0, 516($a0)\n"
2335 "st.h $w0, 1022($a0)\n"
2336 "st.d $w0, 1024($a0)\n"
2337 "daddiu $at, $a0, 1025\n"
2338 "st.b $w0, 0($at)\n"
2339 "daddiu $at, $a0, 1026\n"
2340 "st.h $w0, 0($at)\n"
2341 "st.w $w0, 1028($a0)\n"
2342 "st.w $w0, 2044($a0)\n"
2343 "st.d $w0, 2048($a0)\n"
2344 "daddiu $at, $a0, 2049\n"
2345 "st.b $w0, 0($at)\n"
2346 "daddiu $at, $a0, 2050\n"
2347 "st.h $w0, 0($at)\n"
2348 "daddiu $at, $a0, 2052\n"
2349 "st.w $w0, 0($at)\n"
2350 "st.d $w0, 4088($a0)\n"
2351 "daddiu $at, $a0, 4096\n"
2352 "st.d $w0, 0($at)\n"
2353 "daddiu $at, $a0, 4097\n"
2354 "st.b $w0, 0($at)\n"
2355 "daddiu $at, $a0, 4098\n"
2356 "st.h $w0, 0($at)\n"
2357 "daddiu $at, $a0, 4100\n"
2358 "st.w $w0, 0($at)\n"
2359 "daddiu $at, $a0, 4104\n"
2360 "st.d $w0, 0($at)\n"
2361 "daddiu $at, $a0, 0x7FFC\n"
2362 "st.w $w0, 0($at)\n"
2363 "daddiu $at, $a0, 0x7FF8\n"
2364 "st.d $w0, 8($at)\n"
2365 "daui $at, $a0, 0x1\n"
2366 "st.d $w0, 0($at)\n"
2367 "daui $at, $a0, 0x1234\n"
2368 "daddiu $at, $at, 0x6000\n"
2369 "st.d $w0, -2440($at) # 0xF678\n"
2370 "daui $at, $a0, 0x1235\n"
2371 "st.d $w0, 0x78($at)\n"
2372 "st.d $w0, -256($a0)\n"
2373 "st.b $w0, -511($a0)\n"
2374 "daddiu $at, $a0, -513\n"
2375 "st.b $w0, 0($at)\n"
2376 "st.h $w0, -1022($a0)\n"
2377 "daddiu $at, $a0, -1026\n"
2378 "st.h $w0, 0($at)\n"
2379 "st.w $w0, -2044($a0)\n"
2380 "daddiu $at, $a0, -2052\n"
2381 "st.w $w0, 0($at)\n"
2382 "st.d $w0, -4096($a0)\n"
2383 "daddiu $at, $a0, -4104\n"
2384 "st.d $w0, 0($at)\n"
2385 "daddiu $at, $a0, -32768\n"
2386 "st.d $w0, 0($at)\n"
2387 "daui $at, $a0, 0xABCE\n"
2388 "daddiu $at, $at, -8192 # 0xE000\n"
2389 "st.d $w0, 0xF00($at)\n"
2390 "daui $at, $a0, 0x8000\n"
2391 "dahi $at, $at, 1\n"
2392 "daddiu $at, $at, -21504 # 0xAC00\n"
2393 "st.b $w0, -51($at) # 0xFFCD\n";
Lazar Trsicd9672662015-09-03 17:33:01 +02002394 DriverStr(expected, "StoreFpuToOffset");
2395}
2396
Tijana Jakovljevicba89c342017-03-10 13:36:08 +01002397TEST_F(AssemblerMIPS64Test, StoreConstToOffset) {
2398 __ StoreConstToOffset(mips64::kStoreByte, 0xFF, mips64::A1, +0, mips64::T8);
2399 __ StoreConstToOffset(mips64::kStoreHalfword, 0xFFFF, mips64::A1, +0, mips64::T8);
2400 __ StoreConstToOffset(mips64::kStoreWord, 0x12345678, mips64::A1, +0, mips64::T8);
2401 __ StoreConstToOffset(mips64::kStoreDoubleword, 0x123456789ABCDEF0, mips64::A1, +0, mips64::T8);
2402
2403 __ StoreConstToOffset(mips64::kStoreByte, 0, mips64::A1, +0, mips64::T8);
2404 __ StoreConstToOffset(mips64::kStoreHalfword, 0, mips64::A1, +0, mips64::T8);
2405 __ StoreConstToOffset(mips64::kStoreWord, 0, mips64::A1, +0, mips64::T8);
2406 __ StoreConstToOffset(mips64::kStoreDoubleword, 0, mips64::A1, +0, mips64::T8);
2407
2408 __ StoreConstToOffset(mips64::kStoreDoubleword, 0x1234567812345678, mips64::A1, +0, mips64::T8);
2409 __ StoreConstToOffset(mips64::kStoreDoubleword, 0x1234567800000000, mips64::A1, +0, mips64::T8);
2410 __ StoreConstToOffset(mips64::kStoreDoubleword, 0x0000000012345678, mips64::A1, +0, mips64::T8);
2411
2412 __ StoreConstToOffset(mips64::kStoreWord, 0, mips64::T8, +0, mips64::T8);
2413 __ StoreConstToOffset(mips64::kStoreWord, 0x12345678, mips64::T8, +0, mips64::T8);
2414
2415 __ StoreConstToOffset(mips64::kStoreWord, 0, mips64::A1, -0xFFF0, mips64::T8);
2416 __ StoreConstToOffset(mips64::kStoreWord, 0x12345678, mips64::A1, +0xFFF0, mips64::T8);
2417
2418 __ StoreConstToOffset(mips64::kStoreWord, 0, mips64::T8, -0xFFF0, mips64::T8);
2419 __ StoreConstToOffset(mips64::kStoreWord, 0x12345678, mips64::T8, +0xFFF0, mips64::T8);
2420
2421 const char* expected =
2422 "ori $t8, $zero, 0xFF\n"
2423 "sb $t8, 0($a1)\n"
2424 "ori $t8, $zero, 0xFFFF\n"
2425 "sh $t8, 0($a1)\n"
2426 "lui $t8, 0x1234\n"
2427 "ori $t8, $t8,0x5678\n"
2428 "sw $t8, 0($a1)\n"
2429 "lui $t8, 0x9abc\n"
2430 "ori $t8, $t8,0xdef0\n"
2431 "dahi $t8, $t8, 0x5679\n"
2432 "dati $t8, $t8, 0x1234\n"
2433 "sd $t8, 0($a1)\n"
2434 "sb $zero, 0($a1)\n"
2435 "sh $zero, 0($a1)\n"
2436 "sw $zero, 0($a1)\n"
2437 "sd $zero, 0($a1)\n"
2438 "lui $t8, 0x1234\n"
2439 "ori $t8, $t8,0x5678\n"
2440 "dins $t8, $t8, 0x20, 0x20\n"
2441 "sd $t8, 0($a1)\n"
2442 "lui $t8, 0x246\n"
2443 "ori $t8, $t8, 0x8acf\n"
2444 "dsll32 $t8, $t8, 0x3\n"
2445 "sd $t8, 0($a1)\n"
2446 "lui $t8, 0x1234\n"
2447 "ori $t8, $t8, 0x5678\n"
2448 "sd $t8, 0($a1)\n"
2449 "sw $zero, 0($t8)\n"
2450 "lui $at,0x1234\n"
2451 "ori $at, $at, 0x5678\n"
2452 "sw $at, 0($t8)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002453 "daddiu $at, $a1, -32760 # 0x8008\n"
2454 "sw $zero, -32760($at) # 0x8008\n"
2455 "daddiu $at, $a1, 32760 # 0x7FF8\n"
2456 "lui $t8, 4660 # 0x1234\n"
2457 "ori $t8, $t8, 22136 # 0x5678\n"
2458 "sw $t8, 32760($at) # 0x7FF8\n"
2459 "daddiu $at, $t8, -32760 # 0x8008\n"
2460 "sw $zero, -32760($at) # 0x8008\n"
2461 "daddiu $at, $t8, 32760 # 0x7FF8\n"
2462 "lui $t8, 4660 # 0x1234\n"
2463 "ori $t8, $t8, 22136 # 0x5678\n"
2464 "sw $t8, 32760($at) # 0x7FF8\n";
Tijana Jakovljevicba89c342017-03-10 13:36:08 +01002465 DriverStr(expected, "StoreConstToOffset");
2466}
Alexey Frunze0960ac52016-12-20 17:24:59 -08002467//////////////////////////////
2468// Loading/adding Constants //
2469//////////////////////////////
Chris Larsenc733dca2016-05-13 16:11:47 -07002470
2471TEST_F(AssemblerMIPS64Test, LoadConst32) {
2472 // IsUint<16>(value)
2473 __ LoadConst32(mips64::V0, 0);
2474 __ LoadConst32(mips64::V0, 65535);
2475 // IsInt<16>(value)
2476 __ LoadConst32(mips64::V0, -1);
2477 __ LoadConst32(mips64::V0, -32768);
2478 // Everything else
2479 __ LoadConst32(mips64::V0, 65536);
2480 __ LoadConst32(mips64::V0, 65537);
2481 __ LoadConst32(mips64::V0, 2147483647);
2482 __ LoadConst32(mips64::V0, -32769);
2483 __ LoadConst32(mips64::V0, -65536);
2484 __ LoadConst32(mips64::V0, -65537);
2485 __ LoadConst32(mips64::V0, -2147483647);
2486 __ LoadConst32(mips64::V0, -2147483648);
2487
2488 const char* expected =
2489 // IsUint<16>(value)
2490 "ori $v0, $zero, 0\n" // __ LoadConst32(mips64::V0, 0);
2491 "ori $v0, $zero, 65535\n" // __ LoadConst32(mips64::V0, 65535);
2492 // IsInt<16>(value)
2493 "addiu $v0, $zero, -1\n" // __ LoadConst32(mips64::V0, -1);
2494 "addiu $v0, $zero, -32768\n" // __ LoadConst32(mips64::V0, -32768);
2495 // Everything else
2496 "lui $v0, 1\n" // __ LoadConst32(mips64::V0, 65536);
2497 "lui $v0, 1\n" // __ LoadConst32(mips64::V0, 65537);
2498 "ori $v0, 1\n" // "
2499 "lui $v0, 32767\n" // __ LoadConst32(mips64::V0, 2147483647);
2500 "ori $v0, 65535\n" // "
2501 "lui $v0, 65535\n" // __ LoadConst32(mips64::V0, -32769);
2502 "ori $v0, 32767\n" // "
2503 "lui $v0, 65535\n" // __ LoadConst32(mips64::V0, -65536);
2504 "lui $v0, 65534\n" // __ LoadConst32(mips64::V0, -65537);
2505 "ori $v0, 65535\n" // "
2506 "lui $v0, 32768\n" // __ LoadConst32(mips64::V0, -2147483647);
2507 "ori $v0, 1\n" // "
2508 "lui $v0, 32768\n"; // __ LoadConst32(mips64::V0, -2147483648);
2509 DriverStr(expected, "LoadConst32");
2510}
2511
Alexey Frunze0960ac52016-12-20 17:24:59 -08002512TEST_F(AssemblerMIPS64Test, Addiu32) {
2513 __ Addiu32(mips64::A1, mips64::A2, -0x8000);
2514 __ Addiu32(mips64::A1, mips64::A2, +0);
2515 __ Addiu32(mips64::A1, mips64::A2, +0x7FFF);
2516 __ Addiu32(mips64::A1, mips64::A2, -0x8001);
2517 __ Addiu32(mips64::A1, mips64::A2, +0x8000);
2518 __ Addiu32(mips64::A1, mips64::A2, -0x10000);
2519 __ Addiu32(mips64::A1, mips64::A2, +0x10000);
2520 __ Addiu32(mips64::A1, mips64::A2, +0x12345678);
2521
2522 const char* expected =
2523 "addiu $a1, $a2, -0x8000\n"
2524 "addiu $a1, $a2, 0\n"
2525 "addiu $a1, $a2, 0x7FFF\n"
2526 "aui $a1, $a2, 0xFFFF\n"
2527 "addiu $a1, $a1, 0x7FFF\n"
2528 "aui $a1, $a2, 1\n"
2529 "addiu $a1, $a1, -0x8000\n"
2530 "aui $a1, $a2, 0xFFFF\n"
2531 "aui $a1, $a2, 1\n"
2532 "aui $a1, $a2, 0x1234\n"
2533 "addiu $a1, $a1, 0x5678\n";
2534 DriverStr(expected, "Addiu32");
2535}
2536
Chris Larsenc733dca2016-05-13 16:11:47 -07002537static uint64_t SignExtend16To64(uint16_t n) {
2538 return static_cast<int16_t>(n);
2539}
2540
2541// The art::mips64::Mips64Assembler::LoadConst64() method uses a template
2542// to minimize the number of instructions needed to load a 64-bit constant
2543// value into a register. The template calls various methods which emit
2544// MIPS machine instructions. This struct (class) uses the same template
2545// but overrides the definitions of the methods which emit MIPS instructions
2546// to use methods which simulate the operation of the corresponding MIPS
2547// instructions. After invoking LoadConst64() the target register should
2548// contain the same 64-bit value as was input to LoadConst64(). If the
2549// simulated register doesn't contain the correct value then there is probably
2550// an error in the template function.
2551struct LoadConst64Tester {
2552 LoadConst64Tester() {
2553 // Initialize all of the registers for simulation to zero.
2554 for (int r = 0; r < 32; r++) {
2555 regs_[r] = 0;
2556 }
2557 // Clear all of the path flags.
2558 loadconst64_paths_ = art::mips64::kLoadConst64PathZero;
2559 }
2560 void Addiu(mips64::GpuRegister rd, mips64::GpuRegister rs, uint16_t c) {
2561 regs_[rd] = static_cast<int32_t>(regs_[rs] + SignExtend16To64(c));
2562 }
2563 void Daddiu(mips64::GpuRegister rd, mips64::GpuRegister rs, uint16_t c) {
2564 regs_[rd] = regs_[rs] + SignExtend16To64(c);
2565 }
2566 void Dahi(mips64::GpuRegister rd, uint16_t c) {
2567 regs_[rd] += SignExtend16To64(c) << 32;
2568 }
2569 void Dati(mips64::GpuRegister rd, uint16_t c) {
2570 regs_[rd] += SignExtend16To64(c) << 48;
2571 }
2572 void Dinsu(mips64::GpuRegister rt, mips64::GpuRegister rs, int pos, int size) {
2573 CHECK(IsUint<5>(pos - 32)) << pos;
2574 CHECK(IsUint<5>(size - 1)) << size;
2575 CHECK(IsUint<5>(pos + size - 33)) << pos << " + " << size;
2576 uint64_t src_mask = (UINT64_C(1) << size) - 1;
2577 uint64_t dsk_mask = ~(src_mask << pos);
2578
2579 regs_[rt] = (regs_[rt] & dsk_mask) | ((regs_[rs] & src_mask) << pos);
2580 }
2581 void Dsll(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2582 regs_[rd] = regs_[rt] << (shamt & 0x1f);
2583 }
2584 void Dsll32(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2585 regs_[rd] = regs_[rt] << (32 + (shamt & 0x1f));
2586 }
2587 void Dsrl(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2588 regs_[rd] = regs_[rt] >> (shamt & 0x1f);
2589 }
2590 void Dsrl32(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2591 regs_[rd] = regs_[rt] >> (32 + (shamt & 0x1f));
2592 }
2593 void Lui(mips64::GpuRegister rd, uint16_t c) {
2594 regs_[rd] = SignExtend16To64(c) << 16;
2595 }
2596 void Ori(mips64::GpuRegister rd, mips64::GpuRegister rs, uint16_t c) {
2597 regs_[rd] = regs_[rs] | c;
2598 }
2599 void LoadConst32(mips64::GpuRegister rd, int32_t c) {
2600 CHECK_NE(rd, 0);
2601 mips64::TemplateLoadConst32<LoadConst64Tester>(this, rd, c);
2602 CHECK_EQ(regs_[rd], static_cast<uint64_t>(c));
2603 }
2604 void LoadConst64(mips64::GpuRegister rd, int64_t c) {
2605 CHECK_NE(rd, 0);
2606 mips64::TemplateLoadConst64<LoadConst64Tester>(this, rd, c);
2607 CHECK_EQ(regs_[rd], static_cast<uint64_t>(c));
2608 }
2609 uint64_t regs_[32];
2610
2611 // Getter function for loadconst64_paths_.
2612 int GetPathsCovered() {
2613 return loadconst64_paths_;
2614 }
2615
2616 void RecordLoadConst64Path(int value) {
2617 loadconst64_paths_ |= value;
2618 }
2619
2620 private:
2621 // This variable holds a bitmask to tell us which paths were taken
2622 // through the template function which loads 64-bit values.
2623 int loadconst64_paths_;
2624};
2625
2626TEST_F(AssemblerMIPS64Test, LoadConst64) {
2627 const uint16_t imms[] = {
2628 0, 1, 2, 3, 4, 0x33, 0x66, 0x55, 0x99, 0xaa, 0xcc, 0xff, 0x5500, 0x5555,
2629 0x7ffc, 0x7ffd, 0x7ffe, 0x7fff, 0x8000, 0x8001, 0x8002, 0x8003, 0x8004,
2630 0xaaaa, 0xfffc, 0xfffd, 0xfffe, 0xffff
2631 };
2632 unsigned d0, d1, d2, d3;
2633 LoadConst64Tester tester;
2634
2635 union {
2636 int64_t v64;
2637 uint16_t v16[4];
2638 } u;
2639
2640 for (d3 = 0; d3 < sizeof imms / sizeof imms[0]; d3++) {
2641 u.v16[3] = imms[d3];
2642
2643 for (d2 = 0; d2 < sizeof imms / sizeof imms[0]; d2++) {
2644 u.v16[2] = imms[d2];
2645
2646 for (d1 = 0; d1 < sizeof imms / sizeof imms[0]; d1++) {
2647 u.v16[1] = imms[d1];
2648
2649 for (d0 = 0; d0 < sizeof imms / sizeof imms[0]; d0++) {
2650 u.v16[0] = imms[d0];
2651
2652 tester.LoadConst64(mips64::V0, u.v64);
2653 }
2654 }
2655 }
2656 }
2657
2658 // Verify that we tested all paths through the "load 64-bit value"
2659 // function template.
2660 EXPECT_EQ(tester.GetPathsCovered(), art::mips64::kLoadConst64PathAllPaths);
2661}
2662
Alexey Frunze0cab6562017-07-25 15:19:36 -07002663TEST_F(AssemblerMIPS64Test, LoadFarthestNearLabelAddress) {
2664 mips64::Mips64Label label;
2665 __ LoadLabelAddress(mips64::V0, &label);
2666 constexpr uint32_t kAdduCount = 0x3FFDE;
2667 for (uint32_t i = 0; i != kAdduCount; ++i) {
2668 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2669 }
2670 __ Bind(&label);
2671
2672 std::string expected =
2673 "lapc $v0, 1f\n" +
2674 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2675 "1:\n";
2676 DriverStr(expected, "LoadFarthestNearLabelAddress");
2677 EXPECT_EQ(__ GetLabelLocation(&label), (1 + kAdduCount) * 4);
2678}
2679
2680TEST_F(AssemblerMIPS64Test, LoadNearestFarLabelAddress) {
2681 mips64::Mips64Label label;
2682 __ LoadLabelAddress(mips64::V0, &label);
2683 constexpr uint32_t kAdduCount = 0x3FFDF;
2684 for (uint32_t i = 0; i != kAdduCount; ++i) {
2685 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2686 }
2687 __ Bind(&label);
2688
2689 std::string expected =
2690 "1:\n"
2691 "auipc $at, %hi(2f - 1b)\n"
2692 "daddiu $v0, $at, %lo(2f - 1b)\n" +
2693 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2694 "2:\n";
2695 DriverStr(expected, "LoadNearestFarLabelAddress");
2696 EXPECT_EQ(__ GetLabelLocation(&label), (2 + kAdduCount) * 4);
2697}
2698
2699TEST_F(AssemblerMIPS64Test, LoadFarthestNearLiteral) {
2700 mips64::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
2701 __ LoadLiteral(mips64::V0, mips64::kLoadWord, literal);
2702 constexpr uint32_t kAdduCount = 0x3FFDE;
2703 for (uint32_t i = 0; i != kAdduCount; ++i) {
2704 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2705 }
2706
2707 std::string expected =
2708 "lwpc $v0, 1f\n" +
2709 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2710 "1:\n"
2711 ".word 0x12345678\n";
2712 DriverStr(expected, "LoadFarthestNearLiteral");
2713 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (1 + kAdduCount) * 4);
2714}
2715
2716TEST_F(AssemblerMIPS64Test, LoadNearestFarLiteral) {
2717 mips64::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
2718 __ LoadLiteral(mips64::V0, mips64::kLoadWord, literal);
2719 constexpr uint32_t kAdduCount = 0x3FFDF;
2720 for (uint32_t i = 0; i != kAdduCount; ++i) {
2721 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2722 }
2723
2724 std::string expected =
2725 "1:\n"
2726 "auipc $at, %hi(2f - 1b)\n"
2727 "lw $v0, %lo(2f - 1b)($at)\n" +
2728 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2729 "2:\n"
2730 ".word 0x12345678\n";
2731 DriverStr(expected, "LoadNearestFarLiteral");
2732 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (2 + kAdduCount) * 4);
2733}
2734
2735TEST_F(AssemblerMIPS64Test, LoadFarthestNearLiteralUnsigned) {
2736 mips64::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
2737 __ LoadLiteral(mips64::V0, mips64::kLoadUnsignedWord, literal);
2738 constexpr uint32_t kAdduCount = 0x3FFDE;
2739 for (uint32_t i = 0; i != kAdduCount; ++i) {
2740 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2741 }
2742
2743 std::string expected =
2744 "lwupc $v0, 1f\n" +
2745 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2746 "1:\n"
2747 ".word 0x12345678\n";
2748 DriverStr(expected, "LoadFarthestNearLiteralUnsigned");
2749 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (1 + kAdduCount) * 4);
2750}
2751
2752TEST_F(AssemblerMIPS64Test, LoadNearestFarLiteralUnsigned) {
2753 mips64::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
2754 __ LoadLiteral(mips64::V0, mips64::kLoadUnsignedWord, literal);
2755 constexpr uint32_t kAdduCount = 0x3FFDF;
2756 for (uint32_t i = 0; i != kAdduCount; ++i) {
2757 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2758 }
2759
2760 std::string expected =
2761 "1:\n"
2762 "auipc $at, %hi(2f - 1b)\n"
2763 "lwu $v0, %lo(2f - 1b)($at)\n" +
2764 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2765 "2:\n"
2766 ".word 0x12345678\n";
2767 DriverStr(expected, "LoadNearestFarLiteralUnsigned");
2768 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (2 + kAdduCount) * 4);
2769}
2770
2771TEST_F(AssemblerMIPS64Test, LoadFarthestNearLiteralLong) {
2772 mips64::Literal* literal = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
2773 __ LoadLiteral(mips64::V0, mips64::kLoadDoubleword, literal);
2774 constexpr uint32_t kAdduCount = 0x3FFDD;
2775 for (uint32_t i = 0; i != kAdduCount; ++i) {
2776 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2777 }
2778
2779 std::string expected =
2780 "ldpc $v0, 1f\n" +
2781 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2782 "1:\n"
2783 ".dword 0x0123456789ABCDEF\n";
2784 DriverStr(expected, "LoadFarthestNearLiteralLong");
2785 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (1 + kAdduCount) * 4);
2786}
2787
2788TEST_F(AssemblerMIPS64Test, LoadNearestFarLiteralLong) {
2789 mips64::Literal* literal = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
2790 __ LoadLiteral(mips64::V0, mips64::kLoadDoubleword, literal);
2791 constexpr uint32_t kAdduCount = 0x3FFDE;
2792 for (uint32_t i = 0; i != kAdduCount; ++i) {
2793 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2794 }
2795
2796 std::string expected =
2797 "1:\n"
2798 "auipc $at, %hi(2f - 1b)\n"
2799 "ld $v0, %lo(2f - 1b)($at)\n" +
2800 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2801 "2:\n"
2802 ".dword 0x0123456789ABCDEF\n";
2803 DriverStr(expected, "LoadNearestFarLiteralLong");
2804 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (2 + kAdduCount) * 4);
2805}
2806
2807TEST_F(AssemblerMIPS64Test, LongLiteralAlignmentNop) {
2808 mips64::Literal* literal1 = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
2809 mips64::Literal* literal2 = __ NewLiteral<uint64_t>(UINT64_C(0x5555555555555555));
2810 mips64::Literal* literal3 = __ NewLiteral<uint64_t>(UINT64_C(0xAAAAAAAAAAAAAAAA));
2811 __ LoadLiteral(mips64::A1, mips64::kLoadDoubleword, literal1);
2812 __ LoadLiteral(mips64::A2, mips64::kLoadDoubleword, literal2);
2813 __ LoadLiteral(mips64::A3, mips64::kLoadDoubleword, literal3);
2814 __ LoadLabelAddress(mips64::V0, literal1->GetLabel());
2815 __ LoadLabelAddress(mips64::V1, literal2->GetLabel());
2816 // A nop will be inserted here before the 64-bit literals.
2817
2818 std::string expected =
2819 "ldpc $a1, 1f\n"
2820 // The GNU assembler incorrectly requires the ldpc instruction to be located
2821 // at an address that's a multiple of 8. TODO: Remove this workaround if/when
2822 // the assembler is fixed.
2823 // "ldpc $a2, 2f\n"
2824 ".word 0xECD80004\n"
2825 "ldpc $a3, 3f\n"
2826 "lapc $v0, 1f\n"
2827 "lapc $v1, 2f\n"
2828 "nop\n"
2829 "1:\n"
2830 ".dword 0x0123456789ABCDEF\n"
2831 "2:\n"
2832 ".dword 0x5555555555555555\n"
2833 "3:\n"
2834 ".dword 0xAAAAAAAAAAAAAAAA\n";
2835 DriverStr(expected, "LongLiteralAlignmentNop");
2836 EXPECT_EQ(__ GetLabelLocation(literal1->GetLabel()), 6 * 4u);
2837 EXPECT_EQ(__ GetLabelLocation(literal2->GetLabel()), 8 * 4u);
2838 EXPECT_EQ(__ GetLabelLocation(literal3->GetLabel()), 10 * 4u);
2839}
2840
2841TEST_F(AssemblerMIPS64Test, LongLiteralAlignmentNoNop) {
2842 mips64::Literal* literal1 = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
2843 mips64::Literal* literal2 = __ NewLiteral<uint64_t>(UINT64_C(0x5555555555555555));
2844 __ LoadLiteral(mips64::A1, mips64::kLoadDoubleword, literal1);
2845 __ LoadLiteral(mips64::A2, mips64::kLoadDoubleword, literal2);
2846 __ LoadLabelAddress(mips64::V0, literal1->GetLabel());
2847 __ LoadLabelAddress(mips64::V1, literal2->GetLabel());
2848
2849 std::string expected =
2850 "ldpc $a1, 1f\n"
2851 // The GNU assembler incorrectly requires the ldpc instruction to be located
2852 // at an address that's a multiple of 8. TODO: Remove this workaround if/when
2853 // the assembler is fixed.
2854 // "ldpc $a2, 2f\n"
2855 ".word 0xECD80003\n"
2856 "lapc $v0, 1f\n"
2857 "lapc $v1, 2f\n"
2858 "1:\n"
2859 ".dword 0x0123456789ABCDEF\n"
2860 "2:\n"
2861 ".dword 0x5555555555555555\n";
2862 DriverStr(expected, "LongLiteralAlignmentNoNop");
2863 EXPECT_EQ(__ GetLabelLocation(literal1->GetLabel()), 4 * 4u);
2864 EXPECT_EQ(__ GetLabelLocation(literal2->GetLabel()), 6 * 4u);
2865}
2866
2867TEST_F(AssemblerMIPS64Test, FarLongLiteralAlignmentNop) {
2868 mips64::Literal* literal = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
2869 __ LoadLiteral(mips64::V0, mips64::kLoadDoubleword, literal);
2870 __ LoadLabelAddress(mips64::V1, literal->GetLabel());
2871 constexpr uint32_t kAdduCount = 0x3FFDF;
2872 for (uint32_t i = 0; i != kAdduCount; ++i) {
2873 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2874 }
2875 // A nop will be inserted here before the 64-bit literal.
2876
2877 std::string expected =
2878 "1:\n"
2879 "auipc $at, %hi(3f - 1b)\n"
2880 "ld $v0, %lo(3f - 1b)($at)\n"
2881 "2:\n"
2882 "auipc $at, %hi(3f - 2b)\n"
2883 "daddiu $v1, $at, %lo(3f - 2b)\n" +
2884 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2885 "nop\n"
2886 "3:\n"
2887 ".dword 0x0123456789ABCDEF\n";
2888 DriverStr(expected, "FarLongLiteralAlignmentNop");
2889 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (5 + kAdduCount) * 4);
2890}
2891
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +00002892// MSA instructions.
2893
2894TEST_F(AssemblerMIPS64Test, AndV) {
2895 DriverStr(RepeatVVV(&mips64::Mips64Assembler::AndV, "and.v ${reg1}, ${reg2}, ${reg3}"), "and.v");
2896}
2897
2898TEST_F(AssemblerMIPS64Test, OrV) {
2899 DriverStr(RepeatVVV(&mips64::Mips64Assembler::OrV, "or.v ${reg1}, ${reg2}, ${reg3}"), "or.v");
2900}
2901
2902TEST_F(AssemblerMIPS64Test, NorV) {
2903 DriverStr(RepeatVVV(&mips64::Mips64Assembler::NorV, "nor.v ${reg1}, ${reg2}, ${reg3}"), "nor.v");
2904}
2905
2906TEST_F(AssemblerMIPS64Test, XorV) {
2907 DriverStr(RepeatVVV(&mips64::Mips64Assembler::XorV, "xor.v ${reg1}, ${reg2}, ${reg3}"), "xor.v");
2908}
2909
2910TEST_F(AssemblerMIPS64Test, AddvB) {
2911 DriverStr(RepeatVVV(&mips64::Mips64Assembler::AddvB, "addv.b ${reg1}, ${reg2}, ${reg3}"),
2912 "addv.b");
2913}
2914
2915TEST_F(AssemblerMIPS64Test, AddvH) {
2916 DriverStr(RepeatVVV(&mips64::Mips64Assembler::AddvH, "addv.h ${reg1}, ${reg2}, ${reg3}"),
2917 "addv.h");
2918}
2919
2920TEST_F(AssemblerMIPS64Test, AddvW) {
2921 DriverStr(RepeatVVV(&mips64::Mips64Assembler::AddvW, "addv.w ${reg1}, ${reg2}, ${reg3}"),
2922 "addv.w");
2923}
2924
2925TEST_F(AssemblerMIPS64Test, AddvD) {
2926 DriverStr(RepeatVVV(&mips64::Mips64Assembler::AddvD, "addv.d ${reg1}, ${reg2}, ${reg3}"),
2927 "addv.d");
2928}
2929
2930TEST_F(AssemblerMIPS64Test, SubvB) {
2931 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SubvB, "subv.b ${reg1}, ${reg2}, ${reg3}"),
2932 "subv.b");
2933}
2934
2935TEST_F(AssemblerMIPS64Test, SubvH) {
2936 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SubvH, "subv.h ${reg1}, ${reg2}, ${reg3}"),
2937 "subv.h");
2938}
2939
2940TEST_F(AssemblerMIPS64Test, SubvW) {
2941 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SubvW, "subv.w ${reg1}, ${reg2}, ${reg3}"),
2942 "subv.w");
2943}
2944
2945TEST_F(AssemblerMIPS64Test, SubvD) {
2946 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SubvD, "subv.d ${reg1}, ${reg2}, ${reg3}"),
2947 "subv.d");
2948}
2949
2950TEST_F(AssemblerMIPS64Test, MulvB) {
2951 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MulvB, "mulv.b ${reg1}, ${reg2}, ${reg3}"),
2952 "mulv.b");
2953}
2954
2955TEST_F(AssemblerMIPS64Test, MulvH) {
2956 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MulvH, "mulv.h ${reg1}, ${reg2}, ${reg3}"),
2957 "mulv.h");
2958}
2959
2960TEST_F(AssemblerMIPS64Test, MulvW) {
2961 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MulvW, "mulv.w ${reg1}, ${reg2}, ${reg3}"),
2962 "mulv.w");
2963}
2964
2965TEST_F(AssemblerMIPS64Test, MulvD) {
2966 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MulvD, "mulv.d ${reg1}, ${reg2}, ${reg3}"),
2967 "mulv.d");
2968}
2969
2970TEST_F(AssemblerMIPS64Test, Div_sB) {
2971 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_sB, "div_s.b ${reg1}, ${reg2}, ${reg3}"),
2972 "div_s.b");
2973}
2974
2975TEST_F(AssemblerMIPS64Test, Div_sH) {
2976 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_sH, "div_s.h ${reg1}, ${reg2}, ${reg3}"),
2977 "div_s.h");
2978}
2979
2980TEST_F(AssemblerMIPS64Test, Div_sW) {
2981 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_sW, "div_s.w ${reg1}, ${reg2}, ${reg3}"),
2982 "div_s.w");
2983}
2984
2985TEST_F(AssemblerMIPS64Test, Div_sD) {
2986 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_sD, "div_s.d ${reg1}, ${reg2}, ${reg3}"),
2987 "div_s.d");
2988}
2989
2990TEST_F(AssemblerMIPS64Test, Div_uB) {
2991 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_uB, "div_u.b ${reg1}, ${reg2}, ${reg3}"),
2992 "div_u.b");
2993}
2994
2995TEST_F(AssemblerMIPS64Test, Div_uH) {
2996 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_uH, "div_u.h ${reg1}, ${reg2}, ${reg3}"),
2997 "div_u.h");
2998}
2999
3000TEST_F(AssemblerMIPS64Test, Div_uW) {
3001 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_uW, "div_u.w ${reg1}, ${reg2}, ${reg3}"),
3002 "div_u.w");
3003}
3004
3005TEST_F(AssemblerMIPS64Test, Div_uD) {
3006 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_uD, "div_u.d ${reg1}, ${reg2}, ${reg3}"),
3007 "div_u.d");
3008}
3009
3010TEST_F(AssemblerMIPS64Test, Mod_sB) {
3011 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_sB, "mod_s.b ${reg1}, ${reg2}, ${reg3}"),
3012 "mod_s.b");
3013}
3014
3015TEST_F(AssemblerMIPS64Test, Mod_sH) {
3016 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_sH, "mod_s.h ${reg1}, ${reg2}, ${reg3}"),
3017 "mod_s.h");
3018}
3019
3020TEST_F(AssemblerMIPS64Test, Mod_sW) {
3021 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_sW, "mod_s.w ${reg1}, ${reg2}, ${reg3}"),
3022 "mod_s.w");
3023}
3024
3025TEST_F(AssemblerMIPS64Test, Mod_sD) {
3026 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_sD, "mod_s.d ${reg1}, ${reg2}, ${reg3}"),
3027 "mod_s.d");
3028}
3029
3030TEST_F(AssemblerMIPS64Test, Mod_uB) {
3031 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_uB, "mod_u.b ${reg1}, ${reg2}, ${reg3}"),
3032 "mod_u.b");
3033}
3034
3035TEST_F(AssemblerMIPS64Test, Mod_uH) {
3036 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_uH, "mod_u.h ${reg1}, ${reg2}, ${reg3}"),
3037 "mod_u.h");
3038}
3039
3040TEST_F(AssemblerMIPS64Test, Mod_uW) {
3041 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_uW, "mod_u.w ${reg1}, ${reg2}, ${reg3}"),
3042 "mod_u.w");
3043}
3044
3045TEST_F(AssemblerMIPS64Test, Mod_uD) {
3046 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_uD, "mod_u.d ${reg1}, ${reg2}, ${reg3}"),
3047 "mod_u.d");
3048}
3049
Goran Jakovljevic80248d72017-04-20 11:55:47 +02003050TEST_F(AssemblerMIPS64Test, Add_aB) {
3051 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Add_aB, "add_a.b ${reg1}, ${reg2}, ${reg3}"),
3052 "add_a.b");
3053}
3054
3055TEST_F(AssemblerMIPS64Test, Add_aH) {
3056 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Add_aH, "add_a.h ${reg1}, ${reg2}, ${reg3}"),
3057 "add_a.h");
3058}
3059
3060TEST_F(AssemblerMIPS64Test, Add_aW) {
3061 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Add_aW, "add_a.w ${reg1}, ${reg2}, ${reg3}"),
3062 "add_a.w");
3063}
3064
3065TEST_F(AssemblerMIPS64Test, Add_aD) {
3066 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Add_aD, "add_a.d ${reg1}, ${reg2}, ${reg3}"),
3067 "add_a.d");
3068}
3069
3070TEST_F(AssemblerMIPS64Test, Ave_sB) {
3071 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_sB, "ave_s.b ${reg1}, ${reg2}, ${reg3}"),
3072 "ave_s.b");
3073}
3074
3075TEST_F(AssemblerMIPS64Test, Ave_sH) {
3076 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_sH, "ave_s.h ${reg1}, ${reg2}, ${reg3}"),
3077 "ave_s.h");
3078}
3079
3080TEST_F(AssemblerMIPS64Test, Ave_sW) {
3081 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_sW, "ave_s.w ${reg1}, ${reg2}, ${reg3}"),
3082 "ave_s.w");
3083}
3084
3085TEST_F(AssemblerMIPS64Test, Ave_sD) {
3086 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_sD, "ave_s.d ${reg1}, ${reg2}, ${reg3}"),
3087 "ave_s.d");
3088}
3089
3090TEST_F(AssemblerMIPS64Test, Ave_uB) {
3091 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_uB, "ave_u.b ${reg1}, ${reg2}, ${reg3}"),
3092 "ave_u.b");
3093}
3094
3095TEST_F(AssemblerMIPS64Test, Ave_uH) {
3096 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_uH, "ave_u.h ${reg1}, ${reg2}, ${reg3}"),
3097 "ave_u.h");
3098}
3099
3100TEST_F(AssemblerMIPS64Test, Ave_uW) {
3101 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_uW, "ave_u.w ${reg1}, ${reg2}, ${reg3}"),
3102 "ave_u.w");
3103}
3104
3105TEST_F(AssemblerMIPS64Test, Ave_uD) {
3106 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_uD, "ave_u.d ${reg1}, ${reg2}, ${reg3}"),
3107 "ave_u.d");
3108}
3109
3110TEST_F(AssemblerMIPS64Test, Aver_sB) {
3111 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_sB, "aver_s.b ${reg1}, ${reg2}, ${reg3}"),
3112 "aver_s.b");
3113}
3114
3115TEST_F(AssemblerMIPS64Test, Aver_sH) {
3116 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_sH, "aver_s.h ${reg1}, ${reg2}, ${reg3}"),
3117 "aver_s.h");
3118}
3119
3120TEST_F(AssemblerMIPS64Test, Aver_sW) {
3121 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_sW, "aver_s.w ${reg1}, ${reg2}, ${reg3}"),
3122 "aver_s.w");
3123}
3124
3125TEST_F(AssemblerMIPS64Test, Aver_sD) {
3126 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_sD, "aver_s.d ${reg1}, ${reg2}, ${reg3}"),
3127 "aver_s.d");
3128}
3129
3130TEST_F(AssemblerMIPS64Test, Aver_uB) {
3131 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_uB, "aver_u.b ${reg1}, ${reg2}, ${reg3}"),
3132 "aver_u.b");
3133}
3134
3135TEST_F(AssemblerMIPS64Test, Aver_uH) {
3136 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_uH, "aver_u.h ${reg1}, ${reg2}, ${reg3}"),
3137 "aver_u.h");
3138}
3139
3140TEST_F(AssemblerMIPS64Test, Aver_uW) {
3141 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_uW, "aver_u.w ${reg1}, ${reg2}, ${reg3}"),
3142 "aver_u.w");
3143}
3144
3145TEST_F(AssemblerMIPS64Test, Aver_uD) {
3146 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_uD, "aver_u.d ${reg1}, ${reg2}, ${reg3}"),
3147 "aver_u.d");
3148}
3149
Goran Jakovljevic658263e2017-06-07 09:35:53 +02003150TEST_F(AssemblerMIPS64Test, Max_sB) {
3151 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_sB, "max_s.b ${reg1}, ${reg2}, ${reg3}"),
3152 "max_s.b");
3153}
3154
3155TEST_F(AssemblerMIPS64Test, Max_sH) {
3156 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_sH, "max_s.h ${reg1}, ${reg2}, ${reg3}"),
3157 "max_s.h");
3158}
3159
3160TEST_F(AssemblerMIPS64Test, Max_sW) {
3161 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_sW, "max_s.w ${reg1}, ${reg2}, ${reg3}"),
3162 "max_s.w");
3163}
3164
3165TEST_F(AssemblerMIPS64Test, Max_sD) {
3166 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_sD, "max_s.d ${reg1}, ${reg2}, ${reg3}"),
3167 "max_s.d");
3168}
3169
3170TEST_F(AssemblerMIPS64Test, Max_uB) {
3171 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_uB, "max_u.b ${reg1}, ${reg2}, ${reg3}"),
3172 "max_u.b");
3173}
3174
3175TEST_F(AssemblerMIPS64Test, Max_uH) {
3176 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_uH, "max_u.h ${reg1}, ${reg2}, ${reg3}"),
3177 "max_u.h");
3178}
3179
3180TEST_F(AssemblerMIPS64Test, Max_uW) {
3181 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_uW, "max_u.w ${reg1}, ${reg2}, ${reg3}"),
3182 "max_u.w");
3183}
3184
3185TEST_F(AssemblerMIPS64Test, Max_uD) {
3186 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_uD, "max_u.d ${reg1}, ${reg2}, ${reg3}"),
3187 "max_u.d");
3188}
3189
3190TEST_F(AssemblerMIPS64Test, Min_sB) {
3191 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_sB, "min_s.b ${reg1}, ${reg2}, ${reg3}"),
3192 "min_s.b");
3193}
3194
3195TEST_F(AssemblerMIPS64Test, Min_sH) {
3196 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_sH, "min_s.h ${reg1}, ${reg2}, ${reg3}"),
3197 "min_s.h");
3198}
3199
3200TEST_F(AssemblerMIPS64Test, Min_sW) {
3201 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_sW, "min_s.w ${reg1}, ${reg2}, ${reg3}"),
3202 "min_s.w");
3203}
3204
3205TEST_F(AssemblerMIPS64Test, Min_sD) {
3206 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_sD, "min_s.d ${reg1}, ${reg2}, ${reg3}"),
3207 "min_s.d");
3208}
3209
3210TEST_F(AssemblerMIPS64Test, Min_uB) {
3211 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_uB, "min_u.b ${reg1}, ${reg2}, ${reg3}"),
3212 "min_u.b");
3213}
3214
3215TEST_F(AssemblerMIPS64Test, Min_uH) {
3216 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_uH, "min_u.h ${reg1}, ${reg2}, ${reg3}"),
3217 "min_u.h");
3218}
3219
3220TEST_F(AssemblerMIPS64Test, Min_uW) {
3221 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_uW, "min_u.w ${reg1}, ${reg2}, ${reg3}"),
3222 "min_u.w");
3223}
3224
3225TEST_F(AssemblerMIPS64Test, Min_uD) {
3226 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_uD, "min_u.d ${reg1}, ${reg2}, ${reg3}"),
3227 "min_u.d");
3228}
3229
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +00003230TEST_F(AssemblerMIPS64Test, FaddW) {
3231 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FaddW, "fadd.w ${reg1}, ${reg2}, ${reg3}"),
3232 "fadd.w");
3233}
3234
3235TEST_F(AssemblerMIPS64Test, FaddD) {
3236 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FaddD, "fadd.d ${reg1}, ${reg2}, ${reg3}"),
3237 "fadd.d");
3238}
3239
3240TEST_F(AssemblerMIPS64Test, FsubW) {
3241 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FsubW, "fsub.w ${reg1}, ${reg2}, ${reg3}"),
3242 "fsub.w");
3243}
3244
3245TEST_F(AssemblerMIPS64Test, FsubD) {
3246 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FsubD, "fsub.d ${reg1}, ${reg2}, ${reg3}"),
3247 "fsub.d");
3248}
3249
3250TEST_F(AssemblerMIPS64Test, FmulW) {
3251 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmulW, "fmul.w ${reg1}, ${reg2}, ${reg3}"),
3252 "fmul.w");
3253}
3254
3255TEST_F(AssemblerMIPS64Test, FmulD) {
3256 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmulD, "fmul.d ${reg1}, ${reg2}, ${reg3}"),
3257 "fmul.d");
3258}
3259
3260TEST_F(AssemblerMIPS64Test, FdivW) {
3261 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FdivW, "fdiv.w ${reg1}, ${reg2}, ${reg3}"),
3262 "fdiv.w");
3263}
3264
3265TEST_F(AssemblerMIPS64Test, FdivD) {
3266 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FdivD, "fdiv.d ${reg1}, ${reg2}, ${reg3}"),
3267 "fdiv.d");
3268}
3269
Goran Jakovljevic658263e2017-06-07 09:35:53 +02003270TEST_F(AssemblerMIPS64Test, FmaxW) {
3271 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmaxW, "fmax.w ${reg1}, ${reg2}, ${reg3}"),
3272 "fmax.w");
3273}
3274
3275TEST_F(AssemblerMIPS64Test, FmaxD) {
3276 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmaxD, "fmax.d ${reg1}, ${reg2}, ${reg3}"),
3277 "fmax.d");
3278}
3279
3280TEST_F(AssemblerMIPS64Test, FminW) {
3281 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FminW, "fmin.w ${reg1}, ${reg2}, ${reg3}"),
3282 "fmin.w");
3283}
3284
3285TEST_F(AssemblerMIPS64Test, FminD) {
3286 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FminD, "fmin.d ${reg1}, ${reg2}, ${reg3}"),
3287 "fmin.d");
3288}
3289
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +00003290TEST_F(AssemblerMIPS64Test, Ffint_sW) {
3291 DriverStr(RepeatVV(&mips64::Mips64Assembler::Ffint_sW, "ffint_s.w ${reg1}, ${reg2}"),
3292 "ffint_s.w");
3293}
3294
3295TEST_F(AssemblerMIPS64Test, Ffint_sD) {
3296 DriverStr(RepeatVV(&mips64::Mips64Assembler::Ffint_sD, "ffint_s.d ${reg1}, ${reg2}"),
3297 "ffint_s.d");
3298}
3299
3300TEST_F(AssemblerMIPS64Test, Ftint_sW) {
3301 DriverStr(RepeatVV(&mips64::Mips64Assembler::Ftint_sW, "ftint_s.w ${reg1}, ${reg2}"),
3302 "ftint_s.w");
3303}
3304
3305TEST_F(AssemblerMIPS64Test, Ftint_sD) {
3306 DriverStr(RepeatVV(&mips64::Mips64Assembler::Ftint_sD, "ftint_s.d ${reg1}, ${reg2}"),
3307 "ftint_s.d");
3308}
3309
3310TEST_F(AssemblerMIPS64Test, SllB) {
3311 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SllB, "sll.b ${reg1}, ${reg2}, ${reg3}"), "sll.b");
3312}
3313
3314TEST_F(AssemblerMIPS64Test, SllH) {
3315 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SllH, "sll.h ${reg1}, ${reg2}, ${reg3}"), "sll.h");
3316}
3317
3318TEST_F(AssemblerMIPS64Test, SllW) {
3319 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SllW, "sll.w ${reg1}, ${reg2}, ${reg3}"), "sll.w");
3320}
3321
3322TEST_F(AssemblerMIPS64Test, SllD) {
3323 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SllD, "sll.d ${reg1}, ${reg2}, ${reg3}"), "sll.d");
3324}
3325
3326TEST_F(AssemblerMIPS64Test, SraB) {
3327 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SraB, "sra.b ${reg1}, ${reg2}, ${reg3}"), "sra.b");
3328}
3329
3330TEST_F(AssemblerMIPS64Test, SraH) {
3331 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SraH, "sra.h ${reg1}, ${reg2}, ${reg3}"), "sra.h");
3332}
3333
3334TEST_F(AssemblerMIPS64Test, SraW) {
3335 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SraW, "sra.w ${reg1}, ${reg2}, ${reg3}"), "sra.w");
3336}
3337
3338TEST_F(AssemblerMIPS64Test, SraD) {
3339 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SraD, "sra.d ${reg1}, ${reg2}, ${reg3}"), "sra.d");
3340}
3341
3342TEST_F(AssemblerMIPS64Test, SrlB) {
3343 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SrlB, "srl.b ${reg1}, ${reg2}, ${reg3}"), "srl.b");
3344}
3345
3346TEST_F(AssemblerMIPS64Test, SrlH) {
3347 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SrlH, "srl.h ${reg1}, ${reg2}, ${reg3}"), "srl.h");
3348}
3349
3350TEST_F(AssemblerMIPS64Test, SrlW) {
3351 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SrlW, "srl.w ${reg1}, ${reg2}, ${reg3}"), "srl.w");
3352}
3353
3354TEST_F(AssemblerMIPS64Test, SrlD) {
3355 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SrlD, "srl.d ${reg1}, ${reg2}, ${reg3}"), "srl.d");
3356}
3357
3358TEST_F(AssemblerMIPS64Test, SlliB) {
3359 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SlliB, 3, "slli.b ${reg1}, ${reg2}, {imm}"),
3360 "slli.b");
3361}
3362
3363TEST_F(AssemblerMIPS64Test, SlliH) {
3364 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SlliH, 4, "slli.h ${reg1}, ${reg2}, {imm}"),
3365 "slli.h");
3366}
3367
3368TEST_F(AssemblerMIPS64Test, SlliW) {
3369 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SlliW, 5, "slli.w ${reg1}, ${reg2}, {imm}"),
3370 "slli.w");
3371}
3372
3373TEST_F(AssemblerMIPS64Test, SlliD) {
3374 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SlliD, 6, "slli.d ${reg1}, ${reg2}, {imm}"),
3375 "slli.d");
3376}
3377
3378TEST_F(AssemblerMIPS64Test, MoveV) {
3379 DriverStr(RepeatVV(&mips64::Mips64Assembler::MoveV, "move.v ${reg1}, ${reg2}"), "move.v");
3380}
3381
3382TEST_F(AssemblerMIPS64Test, SplatiB) {
3383 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SplatiB, 4, "splati.b ${reg1}, ${reg2}[{imm}]"),
3384 "splati.b");
3385}
3386
3387TEST_F(AssemblerMIPS64Test, SplatiH) {
3388 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SplatiH, 3, "splati.h ${reg1}, ${reg2}[{imm}]"),
3389 "splati.h");
3390}
3391
3392TEST_F(AssemblerMIPS64Test, SplatiW) {
3393 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SplatiW, 2, "splati.w ${reg1}, ${reg2}[{imm}]"),
3394 "splati.w");
3395}
3396
3397TEST_F(AssemblerMIPS64Test, SplatiD) {
3398 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SplatiD, 1, "splati.d ${reg1}, ${reg2}[{imm}]"),
3399 "splati.d");
3400}
3401
3402TEST_F(AssemblerMIPS64Test, FillB) {
3403 DriverStr(RepeatVR(&mips64::Mips64Assembler::FillB, "fill.b ${reg1}, ${reg2}"), "fill.b");
3404}
3405
3406TEST_F(AssemblerMIPS64Test, FillH) {
3407 DriverStr(RepeatVR(&mips64::Mips64Assembler::FillH, "fill.h ${reg1}, ${reg2}"), "fill.h");
3408}
3409
3410TEST_F(AssemblerMIPS64Test, FillW) {
3411 DriverStr(RepeatVR(&mips64::Mips64Assembler::FillW, "fill.w ${reg1}, ${reg2}"), "fill.w");
3412}
3413
3414TEST_F(AssemblerMIPS64Test, FillD) {
3415 DriverStr(RepeatVR(&mips64::Mips64Assembler::FillD, "fill.d ${reg1}, ${reg2}"), "fill.d");
3416}
3417
Goran Jakovljevic3f444032017-03-31 14:38:20 +02003418TEST_F(AssemblerMIPS64Test, LdiB) {
3419 DriverStr(RepeatVIb(&mips64::Mips64Assembler::LdiB, -8, "ldi.b ${reg}, {imm}"), "ldi.b");
3420}
3421
3422TEST_F(AssemblerMIPS64Test, LdiH) {
3423 DriverStr(RepeatVIb(&mips64::Mips64Assembler::LdiH, -10, "ldi.h ${reg}, {imm}"), "ldi.h");
3424}
3425
3426TEST_F(AssemblerMIPS64Test, LdiW) {
3427 DriverStr(RepeatVIb(&mips64::Mips64Assembler::LdiW, -10, "ldi.w ${reg}, {imm}"), "ldi.w");
3428}
3429
3430TEST_F(AssemblerMIPS64Test, LdiD) {
3431 DriverStr(RepeatVIb(&mips64::Mips64Assembler::LdiD, -10, "ldi.d ${reg}, {imm}"), "ldi.d");
3432}
3433
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +00003434TEST_F(AssemblerMIPS64Test, LdB) {
3435 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::LdB, -10, "ld.b ${reg1}, {imm}(${reg2})"), "ld.b");
3436}
3437
3438TEST_F(AssemblerMIPS64Test, LdH) {
3439 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::LdH, -10, "ld.h ${reg1}, {imm}(${reg2})", 0, 2),
3440 "ld.h");
3441}
3442
3443TEST_F(AssemblerMIPS64Test, LdW) {
3444 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::LdW, -10, "ld.w ${reg1}, {imm}(${reg2})", 0, 4),
3445 "ld.w");
3446}
3447
3448TEST_F(AssemblerMIPS64Test, LdD) {
3449 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::LdD, -10, "ld.d ${reg1}, {imm}(${reg2})", 0, 8),
3450 "ld.d");
3451}
3452
3453TEST_F(AssemblerMIPS64Test, StB) {
3454 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::StB, -10, "st.b ${reg1}, {imm}(${reg2})"), "st.b");
3455}
3456
3457TEST_F(AssemblerMIPS64Test, StH) {
3458 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::StH, -10, "st.h ${reg1}, {imm}(${reg2})", 0, 2),
3459 "st.h");
3460}
3461
3462TEST_F(AssemblerMIPS64Test, StW) {
3463 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::StW, -10, "st.w ${reg1}, {imm}(${reg2})", 0, 4),
3464 "st.w");
3465}
3466
3467TEST_F(AssemblerMIPS64Test, StD) {
3468 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::StD, -10, "st.d ${reg1}, {imm}(${reg2})", 0, 8),
3469 "st.d");
3470}
3471
Goran Jakovljevic38370112017-05-10 14:30:28 +02003472TEST_F(AssemblerMIPS64Test, IlvrB) {
3473 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvrB, "ilvr.b ${reg1}, ${reg2}, ${reg3}"),
3474 "ilvr.b");
3475}
3476
3477TEST_F(AssemblerMIPS64Test, IlvrH) {
3478 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvrH, "ilvr.h ${reg1}, ${reg2}, ${reg3}"),
3479 "ilvr.h");
3480}
3481
3482TEST_F(AssemblerMIPS64Test, IlvrW) {
3483 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvrW, "ilvr.w ${reg1}, ${reg2}, ${reg3}"),
3484 "ilvr.w");
3485}
3486
3487TEST_F(AssemblerMIPS64Test, IlvrD) {
3488 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvrD, "ilvr.d ${reg1}, ${reg2}, ${reg3}"),
3489 "ilvr.d");
3490}
3491
Lena Djokicb3d79e42017-07-25 11:20:52 +02003492TEST_F(AssemblerMIPS64Test, MaddvB) {
3493 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MaddvB, "maddv.b ${reg1}, ${reg2}, ${reg3}"),
3494 "maddv.b");
3495}
3496
3497TEST_F(AssemblerMIPS64Test, MaddvH) {
3498 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MaddvH, "maddv.h ${reg1}, ${reg2}, ${reg3}"),
3499 "maddv.h");
3500}
3501
3502TEST_F(AssemblerMIPS64Test, MaddvW) {
3503 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MaddvW, "maddv.w ${reg1}, ${reg2}, ${reg3}"),
3504 "maddv.w");
3505}
3506
3507TEST_F(AssemblerMIPS64Test, MaddvD) {
3508 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MaddvD, "maddv.d ${reg1}, ${reg2}, ${reg3}"),
3509 "maddv.d");
3510}
3511
3512TEST_F(AssemblerMIPS64Test, MsubvB) {
3513 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MsubvB, "msubv.b ${reg1}, ${reg2}, ${reg3}"),
3514 "msubv.b");
3515}
3516
3517TEST_F(AssemblerMIPS64Test, MsubvH) {
3518 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MsubvH, "msubv.h ${reg1}, ${reg2}, ${reg3}"),
3519 "msubv.h");
3520}
3521
3522TEST_F(AssemblerMIPS64Test, MsubvW) {
3523 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MsubvW, "msubv.w ${reg1}, ${reg2}, ${reg3}"),
3524 "msubv.w");
3525}
3526
3527TEST_F(AssemblerMIPS64Test, MsubvD) {
3528 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MsubvD, "msubv.d ${reg1}, ${reg2}, ${reg3}"),
3529 "msubv.d");
3530}
3531
3532TEST_F(AssemblerMIPS64Test, FmaddW) {
3533 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmaddW, "fmadd.w ${reg1}, ${reg2}, ${reg3}"),
3534 "fmadd.w");
3535}
3536
3537TEST_F(AssemblerMIPS64Test, FmaddD) {
3538 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmaddD, "fmadd.d ${reg1}, ${reg2}, ${reg3}"),
3539 "fmadd.d");
3540}
3541
3542TEST_F(AssemblerMIPS64Test, FmsubW) {
3543 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmsubW, "fmsub.w ${reg1}, ${reg2}, ${reg3}"),
3544 "fmsub.w");
3545}
3546
3547TEST_F(AssemblerMIPS64Test, FmsubD) {
3548 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmsubD, "fmsub.d ${reg1}, ${reg2}, ${reg3}"),
3549 "fmsub.d");
3550}
3551
Lazar Trsicd9672662015-09-03 17:33:01 +02003552#undef __
3553
Chris Larsendbce0d72015-09-17 13:34:00 -07003554} // namespace art