blob: 1541780e2ff4667fc5189e8728bf537d9fbdcc5f [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,
38 mips64::GpuRegister,
39 mips64::FpuRegister,
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +000040 uint32_t,
41 mips64::VectorRegister> {
Chris Larsendbce0d72015-09-17 13:34:00 -070042 public:
43 typedef AssemblerTest<mips64::Mips64Assembler,
44 mips64::GpuRegister,
45 mips64::FpuRegister,
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +000046 uint32_t,
47 mips64::VectorRegister> Base;
Chris Larsendbce0d72015-09-17 13:34:00 -070048
Goran Jakovljevic27af9372017-03-15 15:31:34 +010049 AssemblerMIPS64Test()
50 : instruction_set_features_(Mips64InstructionSetFeatures::FromVariant("default", nullptr)) {}
51
Chris Larsendbce0d72015-09-17 13:34:00 -070052 protected:
53 // Get the typically used name for this architecture, e.g., aarch64, x86-64, ...
54 std::string GetArchitectureString() OVERRIDE {
55 return "mips64";
56 }
57
Alexey Frunzea0e87b02015-09-24 22:57:20 -070058 std::string GetAssemblerCmdName() OVERRIDE {
59 // We assemble and link for MIPS64R6. See GetAssemblerParameters() for details.
60 return "gcc";
61 }
62
Chris Larsendbce0d72015-09-17 13:34:00 -070063 std::string GetAssemblerParameters() OVERRIDE {
Alexey Frunzea0e87b02015-09-24 22:57:20 -070064 // We assemble and link for MIPS64R6. The reason is that object files produced for MIPS64R6
65 // (and MIPS32R6) with the GNU assembler don't have correct final offsets in PC-relative
66 // branches in the .text section and so they require a relocation pass (there's a relocation
67 // section, .rela.text, that has the needed info to fix up the branches).
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +000068 return " -march=mips64r6 -mmsa -Wa,--no-warn -Wl,-Ttext=0 -Wl,-e0 -nostdlib";
Alexey Frunzea0e87b02015-09-24 22:57:20 -070069 }
70
71 void Pad(std::vector<uint8_t>& data) OVERRIDE {
72 // The GNU linker unconditionally pads the code segment with NOPs to a size that is a multiple
73 // of 16 and there doesn't appear to be a way to suppress this padding. Our assembler doesn't
74 // pad, so, in order for two assembler outputs to match, we need to match the padding as well.
75 // NOP is encoded as four zero bytes on MIPS.
76 size_t pad_size = RoundUp(data.size(), 16u) - data.size();
77 data.insert(data.end(), pad_size, 0);
Chris Larsendbce0d72015-09-17 13:34:00 -070078 }
79
80 std::string GetDisassembleParameters() OVERRIDE {
81 return " -D -bbinary -mmips:isa64r6";
82 }
83
Goran Jakovljevic27af9372017-03-15 15:31:34 +010084 mips64::Mips64Assembler* CreateAssembler(ArenaAllocator* arena) OVERRIDE {
85 return new (arena) mips64::Mips64Assembler(arena, instruction_set_features_.get());
86 }
87
Chris Larsendbce0d72015-09-17 13:34:00 -070088 void SetUpHelpers() OVERRIDE {
89 if (registers_.size() == 0) {
90 registers_.push_back(new mips64::GpuRegister(mips64::ZERO));
91 registers_.push_back(new mips64::GpuRegister(mips64::AT));
92 registers_.push_back(new mips64::GpuRegister(mips64::V0));
93 registers_.push_back(new mips64::GpuRegister(mips64::V1));
94 registers_.push_back(new mips64::GpuRegister(mips64::A0));
95 registers_.push_back(new mips64::GpuRegister(mips64::A1));
96 registers_.push_back(new mips64::GpuRegister(mips64::A2));
97 registers_.push_back(new mips64::GpuRegister(mips64::A3));
98 registers_.push_back(new mips64::GpuRegister(mips64::A4));
99 registers_.push_back(new mips64::GpuRegister(mips64::A5));
100 registers_.push_back(new mips64::GpuRegister(mips64::A6));
101 registers_.push_back(new mips64::GpuRegister(mips64::A7));
102 registers_.push_back(new mips64::GpuRegister(mips64::T0));
103 registers_.push_back(new mips64::GpuRegister(mips64::T1));
104 registers_.push_back(new mips64::GpuRegister(mips64::T2));
105 registers_.push_back(new mips64::GpuRegister(mips64::T3));
106 registers_.push_back(new mips64::GpuRegister(mips64::S0));
107 registers_.push_back(new mips64::GpuRegister(mips64::S1));
108 registers_.push_back(new mips64::GpuRegister(mips64::S2));
109 registers_.push_back(new mips64::GpuRegister(mips64::S3));
110 registers_.push_back(new mips64::GpuRegister(mips64::S4));
111 registers_.push_back(new mips64::GpuRegister(mips64::S5));
112 registers_.push_back(new mips64::GpuRegister(mips64::S6));
113 registers_.push_back(new mips64::GpuRegister(mips64::S7));
114 registers_.push_back(new mips64::GpuRegister(mips64::T8));
115 registers_.push_back(new mips64::GpuRegister(mips64::T9));
116 registers_.push_back(new mips64::GpuRegister(mips64::K0));
117 registers_.push_back(new mips64::GpuRegister(mips64::K1));
118 registers_.push_back(new mips64::GpuRegister(mips64::GP));
119 registers_.push_back(new mips64::GpuRegister(mips64::SP));
120 registers_.push_back(new mips64::GpuRegister(mips64::S8));
121 registers_.push_back(new mips64::GpuRegister(mips64::RA));
122
123 secondary_register_names_.emplace(mips64::GpuRegister(mips64::ZERO), "zero");
124 secondary_register_names_.emplace(mips64::GpuRegister(mips64::AT), "at");
125 secondary_register_names_.emplace(mips64::GpuRegister(mips64::V0), "v0");
126 secondary_register_names_.emplace(mips64::GpuRegister(mips64::V1), "v1");
127 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A0), "a0");
128 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A1), "a1");
129 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A2), "a2");
130 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A3), "a3");
131 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A4), "a4");
132 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A5), "a5");
133 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A6), "a6");
134 secondary_register_names_.emplace(mips64::GpuRegister(mips64::A7), "a7");
135 secondary_register_names_.emplace(mips64::GpuRegister(mips64::T0), "t0");
136 secondary_register_names_.emplace(mips64::GpuRegister(mips64::T1), "t1");
137 secondary_register_names_.emplace(mips64::GpuRegister(mips64::T2), "t2");
138 secondary_register_names_.emplace(mips64::GpuRegister(mips64::T3), "t3");
139 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S0), "s0");
140 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S1), "s1");
141 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S2), "s2");
142 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S3), "s3");
143 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S4), "s4");
144 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S5), "s5");
145 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S6), "s6");
146 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S7), "s7");
147 secondary_register_names_.emplace(mips64::GpuRegister(mips64::T8), "t8");
148 secondary_register_names_.emplace(mips64::GpuRegister(mips64::T9), "t9");
149 secondary_register_names_.emplace(mips64::GpuRegister(mips64::K0), "k0");
150 secondary_register_names_.emplace(mips64::GpuRegister(mips64::K1), "k1");
151 secondary_register_names_.emplace(mips64::GpuRegister(mips64::GP), "gp");
152 secondary_register_names_.emplace(mips64::GpuRegister(mips64::SP), "sp");
153 secondary_register_names_.emplace(mips64::GpuRegister(mips64::S8), "s8");
154 secondary_register_names_.emplace(mips64::GpuRegister(mips64::RA), "ra");
155
156 fp_registers_.push_back(new mips64::FpuRegister(mips64::F0));
157 fp_registers_.push_back(new mips64::FpuRegister(mips64::F1));
158 fp_registers_.push_back(new mips64::FpuRegister(mips64::F2));
159 fp_registers_.push_back(new mips64::FpuRegister(mips64::F3));
160 fp_registers_.push_back(new mips64::FpuRegister(mips64::F4));
161 fp_registers_.push_back(new mips64::FpuRegister(mips64::F5));
162 fp_registers_.push_back(new mips64::FpuRegister(mips64::F6));
163 fp_registers_.push_back(new mips64::FpuRegister(mips64::F7));
164 fp_registers_.push_back(new mips64::FpuRegister(mips64::F8));
165 fp_registers_.push_back(new mips64::FpuRegister(mips64::F9));
166 fp_registers_.push_back(new mips64::FpuRegister(mips64::F10));
167 fp_registers_.push_back(new mips64::FpuRegister(mips64::F11));
168 fp_registers_.push_back(new mips64::FpuRegister(mips64::F12));
169 fp_registers_.push_back(new mips64::FpuRegister(mips64::F13));
170 fp_registers_.push_back(new mips64::FpuRegister(mips64::F14));
171 fp_registers_.push_back(new mips64::FpuRegister(mips64::F15));
172 fp_registers_.push_back(new mips64::FpuRegister(mips64::F16));
173 fp_registers_.push_back(new mips64::FpuRegister(mips64::F17));
174 fp_registers_.push_back(new mips64::FpuRegister(mips64::F18));
175 fp_registers_.push_back(new mips64::FpuRegister(mips64::F19));
176 fp_registers_.push_back(new mips64::FpuRegister(mips64::F20));
177 fp_registers_.push_back(new mips64::FpuRegister(mips64::F21));
178 fp_registers_.push_back(new mips64::FpuRegister(mips64::F22));
179 fp_registers_.push_back(new mips64::FpuRegister(mips64::F23));
180 fp_registers_.push_back(new mips64::FpuRegister(mips64::F24));
181 fp_registers_.push_back(new mips64::FpuRegister(mips64::F25));
182 fp_registers_.push_back(new mips64::FpuRegister(mips64::F26));
183 fp_registers_.push_back(new mips64::FpuRegister(mips64::F27));
184 fp_registers_.push_back(new mips64::FpuRegister(mips64::F28));
185 fp_registers_.push_back(new mips64::FpuRegister(mips64::F29));
186 fp_registers_.push_back(new mips64::FpuRegister(mips64::F30));
187 fp_registers_.push_back(new mips64::FpuRegister(mips64::F31));
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +0000188
189 vec_registers_.push_back(new mips64::VectorRegister(mips64::W0));
190 vec_registers_.push_back(new mips64::VectorRegister(mips64::W1));
191 vec_registers_.push_back(new mips64::VectorRegister(mips64::W2));
192 vec_registers_.push_back(new mips64::VectorRegister(mips64::W3));
193 vec_registers_.push_back(new mips64::VectorRegister(mips64::W4));
194 vec_registers_.push_back(new mips64::VectorRegister(mips64::W5));
195 vec_registers_.push_back(new mips64::VectorRegister(mips64::W6));
196 vec_registers_.push_back(new mips64::VectorRegister(mips64::W7));
197 vec_registers_.push_back(new mips64::VectorRegister(mips64::W8));
198 vec_registers_.push_back(new mips64::VectorRegister(mips64::W9));
199 vec_registers_.push_back(new mips64::VectorRegister(mips64::W10));
200 vec_registers_.push_back(new mips64::VectorRegister(mips64::W11));
201 vec_registers_.push_back(new mips64::VectorRegister(mips64::W12));
202 vec_registers_.push_back(new mips64::VectorRegister(mips64::W13));
203 vec_registers_.push_back(new mips64::VectorRegister(mips64::W14));
204 vec_registers_.push_back(new mips64::VectorRegister(mips64::W15));
205 vec_registers_.push_back(new mips64::VectorRegister(mips64::W16));
206 vec_registers_.push_back(new mips64::VectorRegister(mips64::W17));
207 vec_registers_.push_back(new mips64::VectorRegister(mips64::W18));
208 vec_registers_.push_back(new mips64::VectorRegister(mips64::W19));
209 vec_registers_.push_back(new mips64::VectorRegister(mips64::W20));
210 vec_registers_.push_back(new mips64::VectorRegister(mips64::W21));
211 vec_registers_.push_back(new mips64::VectorRegister(mips64::W22));
212 vec_registers_.push_back(new mips64::VectorRegister(mips64::W23));
213 vec_registers_.push_back(new mips64::VectorRegister(mips64::W24));
214 vec_registers_.push_back(new mips64::VectorRegister(mips64::W25));
215 vec_registers_.push_back(new mips64::VectorRegister(mips64::W26));
216 vec_registers_.push_back(new mips64::VectorRegister(mips64::W27));
217 vec_registers_.push_back(new mips64::VectorRegister(mips64::W28));
218 vec_registers_.push_back(new mips64::VectorRegister(mips64::W29));
219 vec_registers_.push_back(new mips64::VectorRegister(mips64::W30));
220 vec_registers_.push_back(new mips64::VectorRegister(mips64::W31));
Chris Larsendbce0d72015-09-17 13:34:00 -0700221 }
222 }
223
224 void TearDown() OVERRIDE {
225 AssemblerTest::TearDown();
226 STLDeleteElements(&registers_);
227 STLDeleteElements(&fp_registers_);
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +0000228 STLDeleteElements(&vec_registers_);
Chris Larsendbce0d72015-09-17 13:34:00 -0700229 }
230
231 std::vector<mips64::GpuRegister*> GetRegisters() OVERRIDE {
232 return registers_;
233 }
234
235 std::vector<mips64::FpuRegister*> GetFPRegisters() OVERRIDE {
236 return fp_registers_;
237 }
238
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +0000239 std::vector<mips64::VectorRegister*> GetVectorRegisters() OVERRIDE {
240 return vec_registers_;
241 }
242
Chris Larsendbce0d72015-09-17 13:34:00 -0700243 uint32_t CreateImmediate(int64_t imm_value) OVERRIDE {
244 return imm_value;
245 }
246
247 std::string GetSecondaryRegisterName(const mips64::GpuRegister& reg) OVERRIDE {
248 CHECK(secondary_register_names_.find(reg) != secondary_register_names_.end());
249 return secondary_register_names_[reg];
250 }
251
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700252 std::string RepeatInsn(size_t count, const std::string& insn) {
253 std::string result;
254 for (; count != 0u; --count) {
255 result += insn;
256 }
257 return result;
258 }
259
Alexey Frunze0cab6562017-07-25 15:19:36 -0700260 void BranchHelper(void (mips64::Mips64Assembler::*f)(mips64::Mips64Label*,
261 bool),
262 const std::string& instr_name,
263 bool is_bare = false) {
264 mips64::Mips64Label label1, label2;
265 (Base::GetAssembler()->*f)(&label1, is_bare);
266 constexpr size_t kAdduCount1 = 63;
267 for (size_t i = 0; i != kAdduCount1; ++i) {
268 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
269 }
270 __ Bind(&label1);
271 (Base::GetAssembler()->*f)(&label2, is_bare);
272 constexpr size_t kAdduCount2 = 64;
273 for (size_t i = 0; i != kAdduCount2; ++i) {
274 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
275 }
276 __ Bind(&label2);
277 (Base::GetAssembler()->*f)(&label1, is_bare);
278 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
279
280 std::string expected =
281 ".set noreorder\n" +
282 instr_name + " 1f\n" +
283 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
284 "1:\n" +
285 instr_name + " 2f\n" +
286 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
287 "2:\n" +
288 instr_name + " 1b\n" +
289 "addu $zero, $zero, $zero\n";
290 DriverStr(expected, instr_name);
291 }
292
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700293 void BranchCondOneRegHelper(void (mips64::Mips64Assembler::*f)(mips64::GpuRegister,
Alexey Frunze0cab6562017-07-25 15:19:36 -0700294 mips64::Mips64Label*,
295 bool),
296 const std::string& instr_name,
297 bool is_bare = false) {
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700298 mips64::Mips64Label label;
Alexey Frunze0cab6562017-07-25 15:19:36 -0700299 (Base::GetAssembler()->*f)(mips64::A0, &label, is_bare);
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700300 constexpr size_t kAdduCount1 = 63;
301 for (size_t i = 0; i != kAdduCount1; ++i) {
302 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
303 }
304 __ Bind(&label);
305 constexpr size_t kAdduCount2 = 64;
306 for (size_t i = 0; i != kAdduCount2; ++i) {
307 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
308 }
Alexey Frunze0cab6562017-07-25 15:19:36 -0700309 (Base::GetAssembler()->*f)(mips64::A1, &label, is_bare);
310 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700311
312 std::string expected =
313 ".set noreorder\n" +
Alexey Frunze0cab6562017-07-25 15:19:36 -0700314 instr_name + " $a0, 1f\n" +
315 (is_bare ? "" : "nop\n") +
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700316 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
317 "1:\n" +
318 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
Alexey Frunze0cab6562017-07-25 15:19:36 -0700319 instr_name + " $a1, 1b\n" +
320 (is_bare ? "" : "nop\n") +
321 "addu $zero, $zero, $zero\n";
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700322 DriverStr(expected, instr_name);
323 }
324
325 void BranchCondTwoRegsHelper(void (mips64::Mips64Assembler::*f)(mips64::GpuRegister,
326 mips64::GpuRegister,
Alexey Frunze0cab6562017-07-25 15:19:36 -0700327 mips64::Mips64Label*,
328 bool),
329 const std::string& instr_name,
330 bool is_bare = false) {
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700331 mips64::Mips64Label label;
Alexey Frunze0cab6562017-07-25 15:19:36 -0700332 (Base::GetAssembler()->*f)(mips64::A0, mips64::A1, &label, is_bare);
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700333 constexpr size_t kAdduCount1 = 63;
334 for (size_t i = 0; i != kAdduCount1; ++i) {
335 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
336 }
337 __ Bind(&label);
338 constexpr size_t kAdduCount2 = 64;
339 for (size_t i = 0; i != kAdduCount2; ++i) {
340 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
341 }
Alexey Frunze0cab6562017-07-25 15:19:36 -0700342 (Base::GetAssembler()->*f)(mips64::A2, mips64::A3, &label, is_bare);
343 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700344
345 std::string expected =
346 ".set noreorder\n" +
Alexey Frunze0cab6562017-07-25 15:19:36 -0700347 instr_name + " $a0, $a1, 1f\n" +
348 (is_bare ? "" : "nop\n") +
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700349 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
350 "1:\n" +
351 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
Alexey Frunze0cab6562017-07-25 15:19:36 -0700352 instr_name + " $a2, $a3, 1b\n" +
353 (is_bare ? "" : "nop\n") +
354 "addu $zero, $zero, $zero\n";
355 DriverStr(expected, instr_name);
356 }
357
358 void BranchFpuCondHelper(void (mips64::Mips64Assembler::*f)(mips64::FpuRegister,
359 mips64::Mips64Label*,
360 bool),
361 const std::string& instr_name,
362 bool is_bare = false) {
363 mips64::Mips64Label label;
364 (Base::GetAssembler()->*f)(mips64::F0, &label, is_bare);
365 constexpr size_t kAdduCount1 = 63;
366 for (size_t i = 0; i != kAdduCount1; ++i) {
367 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
368 }
369 __ Bind(&label);
370 constexpr size_t kAdduCount2 = 64;
371 for (size_t i = 0; i != kAdduCount2; ++i) {
372 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
373 }
374 (Base::GetAssembler()->*f)(mips64::F31, &label, is_bare);
375 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
376
377 std::string expected =
378 ".set noreorder\n" +
379 instr_name + " $f0, 1f\n" +
380 (is_bare ? "" : "nop\n") +
381 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") +
382 "1:\n" +
383 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") +
384 instr_name + " $f31, 1b\n" +
385 (is_bare ? "" : "nop\n") +
386 "addu $zero, $zero, $zero\n";
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700387 DriverStr(expected, instr_name);
388 }
389
Chris Larsendbce0d72015-09-17 13:34:00 -0700390 private:
391 std::vector<mips64::GpuRegister*> registers_;
392 std::map<mips64::GpuRegister, std::string, MIPS64CpuRegisterCompare> secondary_register_names_;
393
394 std::vector<mips64::FpuRegister*> fp_registers_;
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +0000395 std::vector<mips64::VectorRegister*> vec_registers_;
Chris Larsendbce0d72015-09-17 13:34:00 -0700396
Goran Jakovljevic27af9372017-03-15 15:31:34 +0100397 std::unique_ptr<const Mips64InstructionSetFeatures> instruction_set_features_;
398};
Chris Larsendbce0d72015-09-17 13:34:00 -0700399
400TEST_F(AssemblerMIPS64Test, Toolchain) {
401 EXPECT_TRUE(CheckTools());
402}
403
Chris Larsendbce0d72015-09-17 13:34:00 -0700404///////////////////
405// FP Operations //
406///////////////////
407
Goran Jakovljevic95f27142017-01-20 11:11:11 +0100408TEST_F(AssemblerMIPS64Test, AddS) {
409 DriverStr(RepeatFFF(&mips64::Mips64Assembler::AddS, "add.s ${reg1}, ${reg2}, ${reg3}"), "add.s");
410}
411
412TEST_F(AssemblerMIPS64Test, AddD) {
413 DriverStr(RepeatFFF(&mips64::Mips64Assembler::AddD, "add.d ${reg1}, ${reg2}, ${reg3}"), "add.d");
414}
415
416TEST_F(AssemblerMIPS64Test, SubS) {
417 DriverStr(RepeatFFF(&mips64::Mips64Assembler::SubS, "sub.s ${reg1}, ${reg2}, ${reg3}"), "sub.s");
418}
419
420TEST_F(AssemblerMIPS64Test, SubD) {
421 DriverStr(RepeatFFF(&mips64::Mips64Assembler::SubD, "sub.d ${reg1}, ${reg2}, ${reg3}"), "sub.d");
422}
423
424TEST_F(AssemblerMIPS64Test, MulS) {
425 DriverStr(RepeatFFF(&mips64::Mips64Assembler::MulS, "mul.s ${reg1}, ${reg2}, ${reg3}"), "mul.s");
426}
427
428TEST_F(AssemblerMIPS64Test, MulD) {
429 DriverStr(RepeatFFF(&mips64::Mips64Assembler::MulD, "mul.d ${reg1}, ${reg2}, ${reg3}"), "mul.d");
430}
431
432TEST_F(AssemblerMIPS64Test, DivS) {
433 DriverStr(RepeatFFF(&mips64::Mips64Assembler::DivS, "div.s ${reg1}, ${reg2}, ${reg3}"), "div.s");
434}
435
436TEST_F(AssemblerMIPS64Test, DivD) {
437 DriverStr(RepeatFFF(&mips64::Mips64Assembler::DivD, "div.d ${reg1}, ${reg2}, ${reg3}"), "div.d");
438}
439
Chris Larsendbce0d72015-09-17 13:34:00 -0700440TEST_F(AssemblerMIPS64Test, SqrtS) {
441 DriverStr(RepeatFF(&mips64::Mips64Assembler::SqrtS, "sqrt.s ${reg1}, ${reg2}"), "sqrt.s");
442}
443
444TEST_F(AssemblerMIPS64Test, SqrtD) {
445 DriverStr(RepeatFF(&mips64::Mips64Assembler::SqrtD, "sqrt.d ${reg1}, ${reg2}"), "sqrt.d");
446}
447
448TEST_F(AssemblerMIPS64Test, AbsS) {
449 DriverStr(RepeatFF(&mips64::Mips64Assembler::AbsS, "abs.s ${reg1}, ${reg2}"), "abs.s");
450}
451
452TEST_F(AssemblerMIPS64Test, AbsD) {
453 DriverStr(RepeatFF(&mips64::Mips64Assembler::AbsD, "abs.d ${reg1}, ${reg2}"), "abs.d");
454}
455
Chris Larsen51417632015-10-02 13:24:25 -0700456TEST_F(AssemblerMIPS64Test, MovS) {
457 DriverStr(RepeatFF(&mips64::Mips64Assembler::MovS, "mov.s ${reg1}, ${reg2}"), "mov.s");
458}
459
460TEST_F(AssemblerMIPS64Test, MovD) {
461 DriverStr(RepeatFF(&mips64::Mips64Assembler::MovD, "mov.d ${reg1}, ${reg2}"), "mov.d");
462}
463
464TEST_F(AssemblerMIPS64Test, NegS) {
465 DriverStr(RepeatFF(&mips64::Mips64Assembler::NegS, "neg.s ${reg1}, ${reg2}"), "neg.s");
466}
467
468TEST_F(AssemblerMIPS64Test, NegD) {
469 DriverStr(RepeatFF(&mips64::Mips64Assembler::NegD, "neg.d ${reg1}, ${reg2}"), "neg.d");
470}
471
Chris Larsendbce0d72015-09-17 13:34:00 -0700472TEST_F(AssemblerMIPS64Test, RoundLS) {
473 DriverStr(RepeatFF(&mips64::Mips64Assembler::RoundLS, "round.l.s ${reg1}, ${reg2}"), "round.l.s");
474}
475
476TEST_F(AssemblerMIPS64Test, RoundLD) {
477 DriverStr(RepeatFF(&mips64::Mips64Assembler::RoundLD, "round.l.d ${reg1}, ${reg2}"), "round.l.d");
478}
479
480TEST_F(AssemblerMIPS64Test, RoundWS) {
481 DriverStr(RepeatFF(&mips64::Mips64Assembler::RoundWS, "round.w.s ${reg1}, ${reg2}"), "round.w.s");
482}
483
484TEST_F(AssemblerMIPS64Test, RoundWD) {
485 DriverStr(RepeatFF(&mips64::Mips64Assembler::RoundWD, "round.w.d ${reg1}, ${reg2}"), "round.w.d");
486}
487
488TEST_F(AssemblerMIPS64Test, CeilLS) {
489 DriverStr(RepeatFF(&mips64::Mips64Assembler::CeilLS, "ceil.l.s ${reg1}, ${reg2}"), "ceil.l.s");
490}
491
492TEST_F(AssemblerMIPS64Test, CeilLD) {
493 DriverStr(RepeatFF(&mips64::Mips64Assembler::CeilLD, "ceil.l.d ${reg1}, ${reg2}"), "ceil.l.d");
494}
495
496TEST_F(AssemblerMIPS64Test, CeilWS) {
497 DriverStr(RepeatFF(&mips64::Mips64Assembler::CeilWS, "ceil.w.s ${reg1}, ${reg2}"), "ceil.w.s");
498}
499
500TEST_F(AssemblerMIPS64Test, CeilWD) {
501 DriverStr(RepeatFF(&mips64::Mips64Assembler::CeilWD, "ceil.w.d ${reg1}, ${reg2}"), "ceil.w.d");
502}
503
504TEST_F(AssemblerMIPS64Test, FloorLS) {
505 DriverStr(RepeatFF(&mips64::Mips64Assembler::FloorLS, "floor.l.s ${reg1}, ${reg2}"), "floor.l.s");
506}
507
508TEST_F(AssemblerMIPS64Test, FloorLD) {
509 DriverStr(RepeatFF(&mips64::Mips64Assembler::FloorLD, "floor.l.d ${reg1}, ${reg2}"), "floor.l.d");
510}
511
512TEST_F(AssemblerMIPS64Test, FloorWS) {
513 DriverStr(RepeatFF(&mips64::Mips64Assembler::FloorWS, "floor.w.s ${reg1}, ${reg2}"), "floor.w.s");
514}
515
516TEST_F(AssemblerMIPS64Test, FloorWD) {
517 DriverStr(RepeatFF(&mips64::Mips64Assembler::FloorWD, "floor.w.d ${reg1}, ${reg2}"), "floor.w.d");
518}
519
520TEST_F(AssemblerMIPS64Test, SelS) {
521 DriverStr(RepeatFFF(&mips64::Mips64Assembler::SelS, "sel.s ${reg1}, ${reg2}, ${reg3}"), "sel.s");
522}
523
524TEST_F(AssemblerMIPS64Test, SelD) {
525 DriverStr(RepeatFFF(&mips64::Mips64Assembler::SelD, "sel.d ${reg1}, ${reg2}, ${reg3}"), "sel.d");
526}
527
528TEST_F(AssemblerMIPS64Test, RintS) {
529 DriverStr(RepeatFF(&mips64::Mips64Assembler::RintS, "rint.s ${reg1}, ${reg2}"), "rint.s");
530}
531
532TEST_F(AssemblerMIPS64Test, RintD) {
533 DriverStr(RepeatFF(&mips64::Mips64Assembler::RintD, "rint.d ${reg1}, ${reg2}"), "rint.d");
534}
535
536TEST_F(AssemblerMIPS64Test, ClassS) {
537 DriverStr(RepeatFF(&mips64::Mips64Assembler::ClassS, "class.s ${reg1}, ${reg2}"), "class.s");
538}
539
540TEST_F(AssemblerMIPS64Test, ClassD) {
541 DriverStr(RepeatFF(&mips64::Mips64Assembler::ClassD, "class.d ${reg1}, ${reg2}"), "class.d");
542}
543
544TEST_F(AssemblerMIPS64Test, MinS) {
545 DriverStr(RepeatFFF(&mips64::Mips64Assembler::MinS, "min.s ${reg1}, ${reg2}, ${reg3}"), "min.s");
546}
547
548TEST_F(AssemblerMIPS64Test, MinD) {
549 DriverStr(RepeatFFF(&mips64::Mips64Assembler::MinD, "min.d ${reg1}, ${reg2}, ${reg3}"), "min.d");
550}
551
552TEST_F(AssemblerMIPS64Test, MaxS) {
553 DriverStr(RepeatFFF(&mips64::Mips64Assembler::MaxS, "max.s ${reg1}, ${reg2}, ${reg3}"), "max.s");
554}
555
556TEST_F(AssemblerMIPS64Test, MaxD) {
557 DriverStr(RepeatFFF(&mips64::Mips64Assembler::MaxD, "max.d ${reg1}, ${reg2}, ${reg3}"), "max.d");
558}
559
Alexey Frunze299a9392015-12-08 16:08:02 -0800560TEST_F(AssemblerMIPS64Test, CmpUnS) {
561 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUnS, "cmp.un.s ${reg1}, ${reg2}, ${reg3}"),
562 "cmp.un.s");
563}
564
565TEST_F(AssemblerMIPS64Test, CmpEqS) {
566 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpEqS, "cmp.eq.s ${reg1}, ${reg2}, ${reg3}"),
567 "cmp.eq.s");
568}
569
570TEST_F(AssemblerMIPS64Test, CmpUeqS) {
571 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUeqS, "cmp.ueq.s ${reg1}, ${reg2}, ${reg3}"),
572 "cmp.ueq.s");
573}
574
575TEST_F(AssemblerMIPS64Test, CmpLtS) {
576 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpLtS, "cmp.lt.s ${reg1}, ${reg2}, ${reg3}"),
577 "cmp.lt.s");
578}
579
580TEST_F(AssemblerMIPS64Test, CmpUltS) {
581 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUltS, "cmp.ult.s ${reg1}, ${reg2}, ${reg3}"),
582 "cmp.ult.s");
583}
584
585TEST_F(AssemblerMIPS64Test, CmpLeS) {
586 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpLeS, "cmp.le.s ${reg1}, ${reg2}, ${reg3}"),
587 "cmp.le.s");
588}
589
590TEST_F(AssemblerMIPS64Test, CmpUleS) {
591 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUleS, "cmp.ule.s ${reg1}, ${reg2}, ${reg3}"),
592 "cmp.ule.s");
593}
594
595TEST_F(AssemblerMIPS64Test, CmpOrS) {
596 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpOrS, "cmp.or.s ${reg1}, ${reg2}, ${reg3}"),
597 "cmp.or.s");
598}
599
600TEST_F(AssemblerMIPS64Test, CmpUneS) {
601 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUneS, "cmp.une.s ${reg1}, ${reg2}, ${reg3}"),
602 "cmp.une.s");
603}
604
605TEST_F(AssemblerMIPS64Test, CmpNeS) {
606 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpNeS, "cmp.ne.s ${reg1}, ${reg2}, ${reg3}"),
607 "cmp.ne.s");
608}
609
610TEST_F(AssemblerMIPS64Test, CmpUnD) {
611 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUnD, "cmp.un.d ${reg1}, ${reg2}, ${reg3}"),
612 "cmp.un.d");
613}
614
615TEST_F(AssemblerMIPS64Test, CmpEqD) {
616 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpEqD, "cmp.eq.d ${reg1}, ${reg2}, ${reg3}"),
617 "cmp.eq.d");
618}
619
620TEST_F(AssemblerMIPS64Test, CmpUeqD) {
621 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUeqD, "cmp.ueq.d ${reg1}, ${reg2}, ${reg3}"),
622 "cmp.ueq.d");
623}
624
625TEST_F(AssemblerMIPS64Test, CmpLtD) {
626 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpLtD, "cmp.lt.d ${reg1}, ${reg2}, ${reg3}"),
627 "cmp.lt.d");
628}
629
630TEST_F(AssemblerMIPS64Test, CmpUltD) {
631 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUltD, "cmp.ult.d ${reg1}, ${reg2}, ${reg3}"),
632 "cmp.ult.d");
633}
634
635TEST_F(AssemblerMIPS64Test, CmpLeD) {
636 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpLeD, "cmp.le.d ${reg1}, ${reg2}, ${reg3}"),
637 "cmp.le.d");
638}
639
640TEST_F(AssemblerMIPS64Test, CmpUleD) {
641 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUleD, "cmp.ule.d ${reg1}, ${reg2}, ${reg3}"),
642 "cmp.ule.d");
643}
644
645TEST_F(AssemblerMIPS64Test, CmpOrD) {
646 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpOrD, "cmp.or.d ${reg1}, ${reg2}, ${reg3}"),
647 "cmp.or.d");
648}
649
650TEST_F(AssemblerMIPS64Test, CmpUneD) {
651 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpUneD, "cmp.une.d ${reg1}, ${reg2}, ${reg3}"),
652 "cmp.une.d");
653}
654
655TEST_F(AssemblerMIPS64Test, CmpNeD) {
656 DriverStr(RepeatFFF(&mips64::Mips64Assembler::CmpNeD, "cmp.ne.d ${reg1}, ${reg2}, ${reg3}"),
657 "cmp.ne.d");
658}
659
Chris Larsendbce0d72015-09-17 13:34:00 -0700660TEST_F(AssemblerMIPS64Test, CvtDL) {
661 DriverStr(RepeatFF(&mips64::Mips64Assembler::Cvtdl, "cvt.d.l ${reg1}, ${reg2}"), "cvt.d.l");
662}
663
Chris Larsen51417632015-10-02 13:24:25 -0700664TEST_F(AssemblerMIPS64Test, CvtDS) {
665 DriverStr(RepeatFF(&mips64::Mips64Assembler::Cvtds, "cvt.d.s ${reg1}, ${reg2}"), "cvt.d.s");
666}
667
668TEST_F(AssemblerMIPS64Test, CvtDW) {
669 DriverStr(RepeatFF(&mips64::Mips64Assembler::Cvtdw, "cvt.d.w ${reg1}, ${reg2}"), "cvt.d.w");
670}
671
672TEST_F(AssemblerMIPS64Test, CvtSL) {
673 DriverStr(RepeatFF(&mips64::Mips64Assembler::Cvtsl, "cvt.s.l ${reg1}, ${reg2}"), "cvt.s.l");
674}
675
676TEST_F(AssemblerMIPS64Test, CvtSD) {
677 DriverStr(RepeatFF(&mips64::Mips64Assembler::Cvtsd, "cvt.s.d ${reg1}, ${reg2}"), "cvt.s.d");
678}
679
680TEST_F(AssemblerMIPS64Test, CvtSW) {
681 DriverStr(RepeatFF(&mips64::Mips64Assembler::Cvtsw, "cvt.s.w ${reg1}, ${reg2}"), "cvt.s.w");
682}
683
Alexey Frunzebaf60b72015-12-22 15:15:03 -0800684TEST_F(AssemblerMIPS64Test, TruncWS) {
685 DriverStr(RepeatFF(&mips64::Mips64Assembler::TruncWS, "trunc.w.s ${reg1}, ${reg2}"), "trunc.w.s");
686}
687
688TEST_F(AssemblerMIPS64Test, TruncWD) {
689 DriverStr(RepeatFF(&mips64::Mips64Assembler::TruncWD, "trunc.w.d ${reg1}, ${reg2}"), "trunc.w.d");
690}
691
692TEST_F(AssemblerMIPS64Test, TruncLS) {
693 DriverStr(RepeatFF(&mips64::Mips64Assembler::TruncLS, "trunc.l.s ${reg1}, ${reg2}"), "trunc.l.s");
694}
695
696TEST_F(AssemblerMIPS64Test, TruncLD) {
697 DriverStr(RepeatFF(&mips64::Mips64Assembler::TruncLD, "trunc.l.d ${reg1}, ${reg2}"), "trunc.l.d");
698}
699
Lazar Trsicd9672662015-09-03 17:33:01 +0200700TEST_F(AssemblerMIPS64Test, Mfc1) {
701 DriverStr(RepeatRF(&mips64::Mips64Assembler::Mfc1, "mfc1 ${reg1}, ${reg2}"), "Mfc1");
702}
703
704TEST_F(AssemblerMIPS64Test, Mfhc1) {
705 DriverStr(RepeatRF(&mips64::Mips64Assembler::Mfhc1, "mfhc1 ${reg1}, ${reg2}"), "Mfhc1");
706}
707
708TEST_F(AssemblerMIPS64Test, Mtc1) {
709 DriverStr(RepeatRF(&mips64::Mips64Assembler::Mtc1, "mtc1 ${reg1}, ${reg2}"), "Mtc1");
710}
711
712TEST_F(AssemblerMIPS64Test, Mthc1) {
713 DriverStr(RepeatRF(&mips64::Mips64Assembler::Mthc1, "mthc1 ${reg1}, ${reg2}"), "Mthc1");
714}
715
716TEST_F(AssemblerMIPS64Test, Dmfc1) {
717 DriverStr(RepeatRF(&mips64::Mips64Assembler::Dmfc1, "dmfc1 ${reg1}, ${reg2}"), "Dmfc1");
718}
719
720TEST_F(AssemblerMIPS64Test, Dmtc1) {
721 DriverStr(RepeatRF(&mips64::Mips64Assembler::Dmtc1, "dmtc1 ${reg1}, ${reg2}"), "Dmtc1");
722}
723
Goran Jakovljevic95f27142017-01-20 11:11:11 +0100724TEST_F(AssemblerMIPS64Test, Lwc1) {
725 DriverStr(RepeatFRIb(&mips64::Mips64Assembler::Lwc1, -16, "lwc1 ${reg1}, {imm}(${reg2})"),
726 "lwc1");
727}
728
729TEST_F(AssemblerMIPS64Test, Ldc1) {
730 DriverStr(RepeatFRIb(&mips64::Mips64Assembler::Ldc1, -16, "ldc1 ${reg1}, {imm}(${reg2})"),
731 "ldc1");
732}
733
734TEST_F(AssemblerMIPS64Test, Swc1) {
735 DriverStr(RepeatFRIb(&mips64::Mips64Assembler::Swc1, -16, "swc1 ${reg1}, {imm}(${reg2})"),
736 "swc1");
737}
738
739TEST_F(AssemblerMIPS64Test, Sdc1) {
740 DriverStr(RepeatFRIb(&mips64::Mips64Assembler::Sdc1, -16, "sdc1 ${reg1}, {imm}(${reg2})"),
741 "sdc1");
742}
743
Alexey Frunze0cab6562017-07-25 15:19:36 -0700744//////////////
745// BRANCHES //
746//////////////
Chris Larsen51417632015-10-02 13:24:25 -0700747
748TEST_F(AssemblerMIPS64Test, Jalr) {
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700749 DriverStr(".set noreorder\n" +
750 RepeatRRNoDupes(&mips64::Mips64Assembler::Jalr, "jalr ${reg1}, ${reg2}"), "jalr");
751}
752
Alexey Frunze0cab6562017-07-25 15:19:36 -0700753TEST_F(AssemblerMIPS64Test, Bc) {
754 BranchHelper(&mips64::Mips64Assembler::Bc, "Bc");
755}
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700756
Alexey Frunze0cab6562017-07-25 15:19:36 -0700757TEST_F(AssemblerMIPS64Test, Balc) {
758 BranchHelper(&mips64::Mips64Assembler::Balc, "Balc");
759}
760
761TEST_F(AssemblerMIPS64Test, Beqzc) {
762 BranchCondOneRegHelper(&mips64::Mips64Assembler::Beqzc, "Beqzc");
763}
764
765TEST_F(AssemblerMIPS64Test, Bnezc) {
766 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bnezc, "Bnezc");
767}
768
769TEST_F(AssemblerMIPS64Test, Bltzc) {
770 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bltzc, "Bltzc");
771}
772
773TEST_F(AssemblerMIPS64Test, Bgezc) {
774 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bgezc, "Bgezc");
775}
776
777TEST_F(AssemblerMIPS64Test, Blezc) {
778 BranchCondOneRegHelper(&mips64::Mips64Assembler::Blezc, "Blezc");
779}
780
781TEST_F(AssemblerMIPS64Test, Bgtzc) {
782 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bgtzc, "Bgtzc");
783}
784
785TEST_F(AssemblerMIPS64Test, Beqc) {
786 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Beqc, "Beqc");
787}
788
789TEST_F(AssemblerMIPS64Test, Bnec) {
790 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bnec, "Bnec");
791}
792
793TEST_F(AssemblerMIPS64Test, Bltc) {
794 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bltc, "Bltc");
795}
796
797TEST_F(AssemblerMIPS64Test, Bgec) {
798 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bgec, "Bgec");
799}
800
801TEST_F(AssemblerMIPS64Test, Bltuc) {
802 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bltuc, "Bltuc");
803}
804
805TEST_F(AssemblerMIPS64Test, Bgeuc) {
806 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bgeuc, "Bgeuc");
807}
808
809TEST_F(AssemblerMIPS64Test, Bc1eqz) {
810 BranchFpuCondHelper(&mips64::Mips64Assembler::Bc1eqz, "Bc1eqz");
811}
812
813TEST_F(AssemblerMIPS64Test, Bc1nez) {
814 BranchFpuCondHelper(&mips64::Mips64Assembler::Bc1nez, "Bc1nez");
815}
816
817TEST_F(AssemblerMIPS64Test, BareBc) {
818 BranchHelper(&mips64::Mips64Assembler::Bc, "Bc", /* is_bare */ true);
819}
820
821TEST_F(AssemblerMIPS64Test, BareBalc) {
822 BranchHelper(&mips64::Mips64Assembler::Balc, "Balc", /* is_bare */ true);
823}
824
825TEST_F(AssemblerMIPS64Test, BareBeqzc) {
826 BranchCondOneRegHelper(&mips64::Mips64Assembler::Beqzc, "Beqzc", /* is_bare */ true);
827}
828
829TEST_F(AssemblerMIPS64Test, BareBnezc) {
830 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bnezc, "Bnezc", /* is_bare */ true);
831}
832
833TEST_F(AssemblerMIPS64Test, BareBltzc) {
834 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bltzc, "Bltzc", /* is_bare */ true);
835}
836
837TEST_F(AssemblerMIPS64Test, BareBgezc) {
838 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bgezc, "Bgezc", /* is_bare */ true);
839}
840
841TEST_F(AssemblerMIPS64Test, BareBlezc) {
842 BranchCondOneRegHelper(&mips64::Mips64Assembler::Blezc, "Blezc", /* is_bare */ true);
843}
844
845TEST_F(AssemblerMIPS64Test, BareBgtzc) {
846 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bgtzc, "Bgtzc", /* is_bare */ true);
847}
848
849TEST_F(AssemblerMIPS64Test, BareBeqc) {
850 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Beqc, "Beqc", /* is_bare */ true);
851}
852
853TEST_F(AssemblerMIPS64Test, BareBnec) {
854 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bnec, "Bnec", /* is_bare */ true);
855}
856
857TEST_F(AssemblerMIPS64Test, BareBltc) {
858 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bltc, "Bltc", /* is_bare */ true);
859}
860
861TEST_F(AssemblerMIPS64Test, BareBgec) {
862 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bgec, "Bgec", /* is_bare */ true);
863}
864
865TEST_F(AssemblerMIPS64Test, BareBltuc) {
866 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bltuc, "Bltuc", /* is_bare */ true);
867}
868
869TEST_F(AssemblerMIPS64Test, BareBgeuc) {
870 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bgeuc, "Bgeuc", /* is_bare */ true);
871}
872
873TEST_F(AssemblerMIPS64Test, BareBc1eqz) {
874 BranchFpuCondHelper(&mips64::Mips64Assembler::Bc1eqz, "Bc1eqz", /* is_bare */ true);
875}
876
877TEST_F(AssemblerMIPS64Test, BareBc1nez) {
878 BranchFpuCondHelper(&mips64::Mips64Assembler::Bc1nez, "Bc1nez", /* is_bare */ true);
879}
880
881TEST_F(AssemblerMIPS64Test, BareBeqz) {
882 BranchCondOneRegHelper(&mips64::Mips64Assembler::Beqz, "Beqz", /* is_bare */ true);
883}
884
885TEST_F(AssemblerMIPS64Test, BareBnez) {
886 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bnez, "Bnez", /* is_bare */ true);
887}
888
889TEST_F(AssemblerMIPS64Test, BareBltz) {
890 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bltz, "Bltz", /* is_bare */ true);
891}
892
893TEST_F(AssemblerMIPS64Test, BareBgez) {
894 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bgez, "Bgez", /* is_bare */ true);
895}
896
897TEST_F(AssemblerMIPS64Test, BareBlez) {
898 BranchCondOneRegHelper(&mips64::Mips64Assembler::Blez, "Blez", /* is_bare */ true);
899}
900
901TEST_F(AssemblerMIPS64Test, BareBgtz) {
902 BranchCondOneRegHelper(&mips64::Mips64Assembler::Bgtz, "Bgtz", /* is_bare */ true);
903}
904
905TEST_F(AssemblerMIPS64Test, BareBeq) {
906 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Beq, "Beq", /* is_bare */ true);
907}
908
909TEST_F(AssemblerMIPS64Test, BareBne) {
910 BranchCondTwoRegsHelper(&mips64::Mips64Assembler::Bne, "Bne", /* is_bare */ true);
911}
912
913TEST_F(AssemblerMIPS64Test, LongBeqc) {
914 mips64::Mips64Label label;
915 __ Beqc(mips64::A0, mips64::A1, &label);
916 constexpr uint32_t kAdduCount1 = (1u << 15) + 1;
917 for (uint32_t i = 0; i != kAdduCount1; ++i) {
918 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
919 }
920 __ Bind(&label);
921 constexpr uint32_t kAdduCount2 = (1u << 15) + 1;
922 for (uint32_t i = 0; i != kAdduCount2; ++i) {
923 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
924 }
925 __ Beqc(mips64::A2, mips64::A3, &label);
926
927 uint32_t offset_forward = 2 + kAdduCount1; // 2: account for auipc and jic.
928 offset_forward <<= 2;
929 offset_forward += (offset_forward & 0x8000) << 1; // Account for sign extension in jic.
930
931 uint32_t offset_back = -(kAdduCount2 + 1); // 1: account for bnec.
932 offset_back <<= 2;
933 offset_back += (offset_back & 0x8000) << 1; // Account for sign extension in jic.
934
935 std::ostringstream oss;
936 oss <<
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700937 ".set noreorder\n"
Alexey Frunze0cab6562017-07-25 15:19:36 -0700938 "bnec $a0, $a1, 1f\n"
939 "auipc $at, 0x" << std::hex << High16Bits(offset_forward) << "\n"
940 "jic $at, 0x" << std::hex << Low16Bits(offset_forward) << "\n"
941 "1:\n" <<
942 RepeatInsn(kAdduCount1, "addu $zero, $zero, $zero\n") <<
943 "2:\n" <<
944 RepeatInsn(kAdduCount2, "addu $zero, $zero, $zero\n") <<
945 "bnec $a2, $a3, 3f\n"
946 "auipc $at, 0x" << std::hex << High16Bits(offset_back) << "\n"
947 "jic $at, 0x" << std::hex << Low16Bits(offset_back) << "\n"
948 "3:\n";
949 std::string expected = oss.str();
950 DriverStr(expected, "LongBeqc");
951}
952
953TEST_F(AssemblerMIPS64Test, LongBeqzc) {
954 constexpr uint32_t kNopCount1 = (1u << 20) + 1;
955 constexpr uint32_t kNopCount2 = (1u << 20) + 1;
956 constexpr uint32_t kRequiredCapacity = (kNopCount1 + kNopCount2 + 6u) * 4u;
957 ASSERT_LT(__ GetBuffer()->Capacity(), kRequiredCapacity);
958 __ GetBuffer()->ExtendCapacity(kRequiredCapacity);
959 mips64::Mips64Label label;
960 __ Beqzc(mips64::A0, &label);
961 for (uint32_t i = 0; i != kNopCount1; ++i) {
962 __ Nop();
963 }
964 __ Bind(&label);
965 for (uint32_t i = 0; i != kNopCount2; ++i) {
966 __ Nop();
967 }
968 __ Beqzc(mips64::A2, &label);
969
970 uint32_t offset_forward = 2 + kNopCount1; // 2: account for auipc and jic.
971 offset_forward <<= 2;
972 offset_forward += (offset_forward & 0x8000) << 1; // Account for sign extension in jic.
973
974 uint32_t offset_back = -(kNopCount2 + 1); // 1: account for bnezc.
975 offset_back <<= 2;
976 offset_back += (offset_back & 0x8000) << 1; // Account for sign extension in jic.
977
978 // Note, we're using the ".fill" directive to tell the assembler to generate many NOPs
979 // instead of generating them ourselves in the source code. This saves test time.
980 std::ostringstream oss;
981 oss <<
982 ".set noreorder\n"
983 "bnezc $a0, 1f\n"
984 "auipc $at, 0x" << std::hex << High16Bits(offset_forward) << "\n"
985 "jic $at, 0x" << std::hex << Low16Bits(offset_forward) << "\n"
986 "1:\n" <<
987 ".fill 0x" << std::hex << kNopCount1 << " , 4, 0\n"
988 "2:\n" <<
989 ".fill 0x" << std::hex << kNopCount2 << " , 4, 0\n"
990 "bnezc $a2, 3f\n"
991 "auipc $at, 0x" << std::hex << High16Bits(offset_back) << "\n"
992 "jic $at, 0x" << std::hex << Low16Bits(offset_back) << "\n"
993 "3:\n";
994 std::string expected = oss.str();
995 DriverStr(expected, "LongBeqzc");
Alexey Frunzea0e87b02015-09-24 22:57:20 -0700996}
997
Alexey Frunze19f6c692016-11-30 19:19:55 -0800998TEST_F(AssemblerMIPS64Test, LongBalc) {
Vladimir Marko36073942016-12-14 14:18:22 +0000999 constexpr uint32_t kNopCount1 = (1u << 25) + 1;
1000 constexpr uint32_t kNopCount2 = (1u << 25) + 1;
1001 constexpr uint32_t kRequiredCapacity = (kNopCount1 + kNopCount2 + 6u) * 4u;
1002 ASSERT_LT(__ GetBuffer()->Capacity(), kRequiredCapacity);
1003 __ GetBuffer()->ExtendCapacity(kRequiredCapacity);
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001004 mips64::Mips64Label label1, label2;
Alexey Frunze19f6c692016-11-30 19:19:55 -08001005 __ Balc(&label1);
Alexey Frunze19f6c692016-11-30 19:19:55 -08001006 for (uint32_t i = 0; i != kNopCount1; ++i) {
1007 __ Nop();
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001008 }
1009 __ Bind(&label1);
Alexey Frunze19f6c692016-11-30 19:19:55 -08001010 __ Balc(&label2);
Alexey Frunze19f6c692016-11-30 19:19:55 -08001011 for (uint32_t i = 0; i != kNopCount2; ++i) {
1012 __ Nop();
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001013 }
1014 __ Bind(&label2);
Alexey Frunze19f6c692016-11-30 19:19:55 -08001015 __ Balc(&label1);
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001016
Alexey Frunze19f6c692016-11-30 19:19:55 -08001017 uint32_t offset_forward1 = 2 + kNopCount1; // 2: account for auipc and jialc.
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001018 offset_forward1 <<= 2;
Alexey Frunze19f6c692016-11-30 19:19:55 -08001019 offset_forward1 += (offset_forward1 & 0x8000) << 1; // Account for sign extension in jialc.
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001020
Alexey Frunze19f6c692016-11-30 19:19:55 -08001021 uint32_t offset_forward2 = 2 + kNopCount2; // 2: account for auipc and jialc.
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001022 offset_forward2 <<= 2;
Alexey Frunze19f6c692016-11-30 19:19:55 -08001023 offset_forward2 += (offset_forward2 & 0x8000) << 1; // Account for sign extension in jialc.
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001024
Alexey Frunze19f6c692016-11-30 19:19:55 -08001025 uint32_t offset_back = -(2 + kNopCount2); // 2: account for auipc and jialc.
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001026 offset_back <<= 2;
Alexey Frunze19f6c692016-11-30 19:19:55 -08001027 offset_back += (offset_back & 0x8000) << 1; // Account for sign extension in jialc.
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001028
Alexey Frunze19f6c692016-11-30 19:19:55 -08001029 // Note, we're using the ".fill" directive to tell the assembler to generate many NOPs
1030 // instead of generating them ourselves in the source code. This saves a few minutes
1031 // of test time.
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001032 std::ostringstream oss;
1033 oss <<
1034 ".set noreorder\n"
Alexey Frunze19f6c692016-11-30 19:19:55 -08001035 "auipc $at, 0x" << std::hex << High16Bits(offset_forward1) << "\n"
1036 "jialc $at, 0x" << std::hex << Low16Bits(offset_forward1) << "\n"
1037 ".fill 0x" << std::hex << kNopCount1 << " , 4, 0\n"
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001038 "1:\n"
Alexey Frunze19f6c692016-11-30 19:19:55 -08001039 "auipc $at, 0x" << std::hex << High16Bits(offset_forward2) << "\n"
1040 "jialc $at, 0x" << std::hex << Low16Bits(offset_forward2) << "\n"
1041 ".fill 0x" << std::hex << kNopCount2 << " , 4, 0\n"
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001042 "2:\n"
Alexey Frunze19f6c692016-11-30 19:19:55 -08001043 "auipc $at, 0x" << std::hex << High16Bits(offset_back) << "\n"
1044 "jialc $at, 0x" << std::hex << Low16Bits(offset_back) << "\n";
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001045 std::string expected = oss.str();
Alexey Frunze19f6c692016-11-30 19:19:55 -08001046 DriverStr(expected, "LongBalc");
Alexey Frunzea0e87b02015-09-24 22:57:20 -07001047}
1048
Chris Larsendbce0d72015-09-17 13:34:00 -07001049//////////
1050// MISC //
1051//////////
1052
Alexey Frunze19f6c692016-11-30 19:19:55 -08001053TEST_F(AssemblerMIPS64Test, Lwpc) {
1054 // Lwpc() takes an unsigned 19-bit immediate, while the GNU assembler needs a signed offset,
1055 // hence the sign extension from bit 18 with `imm - ((imm & 0x40000) << 1)`.
1056 // The GNU assembler also wants the offset to be a multiple of 4, which it will shift right
1057 // by 2 positions when encoding, hence `<< 2` to compensate for that shift.
1058 // We capture the value of the immediate with `.set imm, {imm}` because the value is needed
1059 // twice for the sign extension, but `{imm}` is substituted only once.
1060 const char* code = ".set imm, {imm}\nlw ${reg}, ((imm - ((imm & 0x40000) << 1)) << 2)($pc)";
1061 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Lwpc, 19, code), "Lwpc");
1062}
1063
1064TEST_F(AssemblerMIPS64Test, Lwupc) {
1065 // The comment for the Lwpc test applies here as well.
1066 const char* code = ".set imm, {imm}\nlwu ${reg}, ((imm - ((imm & 0x40000) << 1)) << 2)($pc)";
1067 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Lwupc, 19, code), "Lwupc");
1068}
1069
1070TEST_F(AssemblerMIPS64Test, Ldpc) {
1071 // The comment for the Lwpc test applies here as well.
1072 const char* code = ".set imm, {imm}\nld ${reg}, ((imm - ((imm & 0x20000) << 1)) << 3)($pc)";
1073 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Ldpc, 18, code), "Ldpc");
1074}
1075
Goran Jakovljevic95f27142017-01-20 11:11:11 +01001076TEST_F(AssemblerMIPS64Test, Auipc) {
1077 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Auipc, 16, "auipc ${reg}, {imm}"), "Auipc");
1078}
1079
1080TEST_F(AssemblerMIPS64Test, Addiupc) {
1081 // The comment from the Lwpc() test applies to this Addiupc() test as well.
1082 const char* code = ".set imm, {imm}\naddiupc ${reg}, (imm - ((imm & 0x40000) << 1)) << 2";
1083 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Addiupc, 19, code), "Addiupc");
1084}
1085
Goran Jakovljevic95f27142017-01-20 11:11:11 +01001086TEST_F(AssemblerMIPS64Test, Addu) {
1087 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Addu, "addu ${reg1}, ${reg2}, ${reg3}"), "addu");
1088}
1089
1090TEST_F(AssemblerMIPS64Test, Addiu) {
1091 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Addiu, -16, "addiu ${reg1}, ${reg2}, {imm}"),
1092 "addiu");
1093}
1094
1095TEST_F(AssemblerMIPS64Test, Daddu) {
1096 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Daddu, "daddu ${reg1}, ${reg2}, ${reg3}"), "daddu");
1097}
1098
1099TEST_F(AssemblerMIPS64Test, Daddiu) {
1100 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Daddiu, -16, "daddiu ${reg1}, ${reg2}, {imm}"),
1101 "daddiu");
1102}
1103
1104TEST_F(AssemblerMIPS64Test, Subu) {
1105 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Subu, "subu ${reg1}, ${reg2}, ${reg3}"), "subu");
1106}
1107
1108TEST_F(AssemblerMIPS64Test, Dsubu) {
1109 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dsubu, "dsubu ${reg1}, ${reg2}, ${reg3}"), "dsubu");
1110}
1111
1112TEST_F(AssemblerMIPS64Test, MulR6) {
1113 DriverStr(RepeatRRR(&mips64::Mips64Assembler::MulR6, "mul ${reg1}, ${reg2}, ${reg3}"), "mulR6");
1114}
1115
1116TEST_F(AssemblerMIPS64Test, DivR6) {
1117 DriverStr(RepeatRRR(&mips64::Mips64Assembler::DivR6, "div ${reg1}, ${reg2}, ${reg3}"), "divR6");
1118}
1119
1120TEST_F(AssemblerMIPS64Test, ModR6) {
1121 DriverStr(RepeatRRR(&mips64::Mips64Assembler::ModR6, "mod ${reg1}, ${reg2}, ${reg3}"), "modR6");
1122}
1123
1124TEST_F(AssemblerMIPS64Test, DivuR6) {
1125 DriverStr(RepeatRRR(&mips64::Mips64Assembler::DivuR6, "divu ${reg1}, ${reg2}, ${reg3}"),
1126 "divuR6");
1127}
1128
1129TEST_F(AssemblerMIPS64Test, ModuR6) {
1130 DriverStr(RepeatRRR(&mips64::Mips64Assembler::ModuR6, "modu ${reg1}, ${reg2}, ${reg3}"),
1131 "moduR6");
1132}
1133
1134TEST_F(AssemblerMIPS64Test, Dmul) {
1135 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dmul, "dmul ${reg1}, ${reg2}, ${reg3}"), "dmul");
1136}
1137
1138TEST_F(AssemblerMIPS64Test, Ddiv) {
1139 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Ddiv, "ddiv ${reg1}, ${reg2}, ${reg3}"), "ddiv");
1140}
1141
1142TEST_F(AssemblerMIPS64Test, Dmod) {
1143 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dmod, "dmod ${reg1}, ${reg2}, ${reg3}"), "dmod");
1144}
1145
1146TEST_F(AssemblerMIPS64Test, Ddivu) {
1147 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Ddivu, "ddivu ${reg1}, ${reg2}, ${reg3}"), "ddivu");
1148}
1149
1150TEST_F(AssemblerMIPS64Test, Dmodu) {
1151 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dmodu, "dmodu ${reg1}, ${reg2}, ${reg3}"), "dmodu");
1152}
1153
1154TEST_F(AssemblerMIPS64Test, And) {
1155 DriverStr(RepeatRRR(&mips64::Mips64Assembler::And, "and ${reg1}, ${reg2}, ${reg3}"), "and");
1156}
1157
1158TEST_F(AssemblerMIPS64Test, Andi) {
1159 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Andi, 16, "andi ${reg1}, ${reg2}, {imm}"), "andi");
1160}
1161
1162TEST_F(AssemblerMIPS64Test, Or) {
1163 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Or, "or ${reg1}, ${reg2}, ${reg3}"), "or");
1164}
1165
1166TEST_F(AssemblerMIPS64Test, Ori) {
1167 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Ori, 16, "ori ${reg1}, ${reg2}, {imm}"), "ori");
1168}
1169
1170TEST_F(AssemblerMIPS64Test, Xor) {
1171 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Xor, "xor ${reg1}, ${reg2}, ${reg3}"), "xor");
1172}
1173
1174TEST_F(AssemblerMIPS64Test, Xori) {
1175 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Xori, 16, "xori ${reg1}, ${reg2}, {imm}"), "xori");
1176}
1177
1178TEST_F(AssemblerMIPS64Test, Nor) {
1179 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Nor, "nor ${reg1}, ${reg2}, ${reg3}"), "nor");
1180}
1181
1182TEST_F(AssemblerMIPS64Test, Lb) {
1183 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lb, -16, "lb ${reg1}, {imm}(${reg2})"), "lb");
1184}
1185
1186TEST_F(AssemblerMIPS64Test, Lh) {
1187 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lh, -16, "lh ${reg1}, {imm}(${reg2})"), "lh");
1188}
1189
1190TEST_F(AssemblerMIPS64Test, Lw) {
1191 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lw, -16, "lw ${reg1}, {imm}(${reg2})"), "lw");
1192}
1193
1194TEST_F(AssemblerMIPS64Test, Ld) {
1195 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Ld, -16, "ld ${reg1}, {imm}(${reg2})"), "ld");
1196}
1197
1198TEST_F(AssemblerMIPS64Test, Lbu) {
1199 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lbu, -16, "lbu ${reg1}, {imm}(${reg2})"), "lbu");
1200}
1201
1202TEST_F(AssemblerMIPS64Test, Lhu) {
1203 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lhu, -16, "lhu ${reg1}, {imm}(${reg2})"), "lhu");
1204}
1205
1206TEST_F(AssemblerMIPS64Test, Lwu) {
1207 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lwu, -16, "lwu ${reg1}, {imm}(${reg2})"), "lwu");
1208}
1209
1210TEST_F(AssemblerMIPS64Test, Lui) {
1211 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Lui, 16, "lui ${reg}, {imm}"), "lui");
1212}
1213
Alexey Frunzec061de12017-02-14 13:27:23 -08001214TEST_F(AssemblerMIPS64Test, Daui) {
1215 std::vector<mips64::GpuRegister*> reg1_registers = GetRegisters();
1216 std::vector<mips64::GpuRegister*> reg2_registers = GetRegisters();
1217 reg2_registers.erase(reg2_registers.begin()); // reg2 can't be ZERO, remove it.
1218 std::vector<int64_t> imms = CreateImmediateValuesBits(/* imm_bits */ 16, /* as_uint */ true);
1219 WarnOnCombinations(reg1_registers.size() * reg2_registers.size() * imms.size());
1220 std::ostringstream expected;
1221 for (mips64::GpuRegister* reg1 : reg1_registers) {
1222 for (mips64::GpuRegister* reg2 : reg2_registers) {
1223 for (int64_t imm : imms) {
1224 __ Daui(*reg1, *reg2, imm);
1225 expected << "daui $" << *reg1 << ", $" << *reg2 << ", " << imm << "\n";
1226 }
1227 }
1228 }
1229 DriverStr(expected.str(), "daui");
1230}
1231
Goran Jakovljevic95f27142017-01-20 11:11:11 +01001232TEST_F(AssemblerMIPS64Test, Dahi) {
1233 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Dahi, 16, "dahi ${reg}, ${reg}, {imm}"), "dahi");
1234}
1235
1236TEST_F(AssemblerMIPS64Test, Dati) {
1237 DriverStr(RepeatRIb(&mips64::Mips64Assembler::Dati, 16, "dati ${reg}, ${reg}, {imm}"), "dati");
1238}
1239
1240TEST_F(AssemblerMIPS64Test, Sb) {
1241 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sb, -16, "sb ${reg1}, {imm}(${reg2})"), "sb");
1242}
1243
1244TEST_F(AssemblerMIPS64Test, Sh) {
1245 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sh, -16, "sh ${reg1}, {imm}(${reg2})"), "sh");
1246}
1247
1248TEST_F(AssemblerMIPS64Test, Sw) {
1249 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sw, -16, "sw ${reg1}, {imm}(${reg2})"), "sw");
1250}
1251
1252TEST_F(AssemblerMIPS64Test, Sd) {
1253 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sd, -16, "sd ${reg1}, {imm}(${reg2})"), "sd");
1254}
1255
1256TEST_F(AssemblerMIPS64Test, Slt) {
1257 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Slt, "slt ${reg1}, ${reg2}, ${reg3}"), "slt");
1258}
1259
1260TEST_F(AssemblerMIPS64Test, Sltu) {
1261 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Sltu, "sltu ${reg1}, ${reg2}, ${reg3}"), "sltu");
1262}
1263
1264TEST_F(AssemblerMIPS64Test, Slti) {
1265 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Slti, -16, "slti ${reg1}, ${reg2}, {imm}"),
1266 "slti");
1267}
1268
1269TEST_F(AssemblerMIPS64Test, Sltiu) {
1270 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sltiu, -16, "sltiu ${reg1}, ${reg2}, {imm}"),
1271 "sltiu");
1272}
1273
1274TEST_F(AssemblerMIPS64Test, Move) {
1275 DriverStr(RepeatRR(&mips64::Mips64Assembler::Move, "or ${reg1}, ${reg2}, $zero"), "move");
1276}
1277
1278TEST_F(AssemblerMIPS64Test, Clear) {
1279 DriverStr(RepeatR(&mips64::Mips64Assembler::Clear, "or ${reg}, $zero, $zero"), "clear");
1280}
1281
1282TEST_F(AssemblerMIPS64Test, Not) {
1283 DriverStr(RepeatRR(&mips64::Mips64Assembler::Not, "nor ${reg1}, ${reg2}, $zero"), "not");
1284}
1285
Chris Larsendbce0d72015-09-17 13:34:00 -07001286TEST_F(AssemblerMIPS64Test, Bitswap) {
1287 DriverStr(RepeatRR(&mips64::Mips64Assembler::Bitswap, "bitswap ${reg1}, ${reg2}"), "bitswap");
1288}
1289
1290TEST_F(AssemblerMIPS64Test, Dbitswap) {
1291 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dbitswap, "dbitswap ${reg1}, ${reg2}"), "dbitswap");
1292}
1293
Chris Larsen51417632015-10-02 13:24:25 -07001294TEST_F(AssemblerMIPS64Test, Seb) {
1295 DriverStr(RepeatRR(&mips64::Mips64Assembler::Seb, "seb ${reg1}, ${reg2}"), "seb");
1296}
1297
1298TEST_F(AssemblerMIPS64Test, Seh) {
1299 DriverStr(RepeatRR(&mips64::Mips64Assembler::Seh, "seh ${reg1}, ${reg2}"), "seh");
1300}
1301
Chris Larsendbce0d72015-09-17 13:34:00 -07001302TEST_F(AssemblerMIPS64Test, Dsbh) {
1303 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dsbh, "dsbh ${reg1}, ${reg2}"), "dsbh");
1304}
1305
1306TEST_F(AssemblerMIPS64Test, Dshd) {
1307 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dshd, "dshd ${reg1}, ${reg2}"), "dshd");
1308}
1309
Lazar Trsicd9672662015-09-03 17:33:01 +02001310TEST_F(AssemblerMIPS64Test, Dext) {
1311 std::vector<mips64::GpuRegister*> reg1_registers = GetRegisters();
1312 std::vector<mips64::GpuRegister*> reg2_registers = GetRegisters();
1313 WarnOnCombinations(reg1_registers.size() * reg2_registers.size() * 33 * 16);
1314 std::ostringstream expected;
1315 for (mips64::GpuRegister* reg1 : reg1_registers) {
1316 for (mips64::GpuRegister* reg2 : reg2_registers) {
1317 for (int32_t pos = 0; pos < 32; pos++) {
1318 for (int32_t size = 1; size <= 32; size++) {
1319 __ Dext(*reg1, *reg2, pos, size);
1320 expected << "dext $" << *reg1 << ", $" << *reg2 << ", " << pos << ", " << size << "\n";
1321 }
1322 }
1323 }
1324 }
1325
1326 DriverStr(expected.str(), "Dext");
1327}
1328
1329TEST_F(AssemblerMIPS64Test, Dinsu) {
1330 std::vector<mips64::GpuRegister*> reg1_registers = GetRegisters();
1331 std::vector<mips64::GpuRegister*> reg2_registers = GetRegisters();
1332 WarnOnCombinations(reg1_registers.size() * reg2_registers.size() * 33 * 16);
1333 std::ostringstream expected;
1334 for (mips64::GpuRegister* reg1 : reg1_registers) {
1335 for (mips64::GpuRegister* reg2 : reg2_registers) {
1336 for (int32_t pos = 32; pos < 64; pos++) {
1337 for (int32_t size = 1; pos + size <= 64; size++) {
1338 __ Dinsu(*reg1, *reg2, pos, size);
1339 expected << "dinsu $" << *reg1 << ", $" << *reg2 << ", " << pos << ", " << size << "\n";
1340 }
1341 }
1342 }
1343 }
1344
1345 DriverStr(expected.str(), "Dinsu");
1346}
1347
Chris Larsene3660592016-11-09 11:13:42 -08001348TEST_F(AssemblerMIPS64Test, Lsa) {
1349 DriverStr(RepeatRRRIb(&mips64::Mips64Assembler::Lsa,
1350 2,
1351 "lsa ${reg1}, ${reg2}, ${reg3}, {imm}",
1352 1),
1353 "lsa");
1354}
1355
1356TEST_F(AssemblerMIPS64Test, Dlsa) {
1357 DriverStr(RepeatRRRIb(&mips64::Mips64Assembler::Dlsa,
1358 2,
1359 "dlsa ${reg1}, ${reg2}, ${reg3}, {imm}",
1360 1),
1361 "dlsa");
1362}
1363
Chris Larsendbce0d72015-09-17 13:34:00 -07001364TEST_F(AssemblerMIPS64Test, Wsbh) {
1365 DriverStr(RepeatRR(&mips64::Mips64Assembler::Wsbh, "wsbh ${reg1}, ${reg2}"), "wsbh");
1366}
1367
Chris Larsen51417632015-10-02 13:24:25 -07001368TEST_F(AssemblerMIPS64Test, Sll) {
1369 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sll, 5, "sll ${reg1}, ${reg2}, {imm}"), "sll");
1370}
1371
1372TEST_F(AssemblerMIPS64Test, Srl) {
1373 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Srl, 5, "srl ${reg1}, ${reg2}, {imm}"), "srl");
1374}
1375
Chris Larsen98a73e12015-10-19 14:17:16 -07001376TEST_F(AssemblerMIPS64Test, Rotr) {
1377 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Rotr, 5, "rotr ${reg1}, ${reg2}, {imm}"), "rotr");
1378}
1379
Chris Larsen51417632015-10-02 13:24:25 -07001380TEST_F(AssemblerMIPS64Test, Sra) {
1381 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sra, 5, "sra ${reg1}, ${reg2}, {imm}"), "sra");
1382}
1383
Chris Larsen98a73e12015-10-19 14:17:16 -07001384TEST_F(AssemblerMIPS64Test, Sllv) {
1385 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Sllv, "sllv ${reg1}, ${reg2}, ${reg3}"), "sllv");
1386}
1387
1388TEST_F(AssemblerMIPS64Test, Srlv) {
1389 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Srlv, "srlv ${reg1}, ${reg2}, ${reg3}"), "srlv");
1390}
1391
1392TEST_F(AssemblerMIPS64Test, Rotrv) {
1393 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Rotrv, "rotrv ${reg1}, ${reg2}, ${reg3}"), "rotrv");
1394}
1395
1396TEST_F(AssemblerMIPS64Test, Srav) {
1397 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Srav, "srav ${reg1}, ${reg2}, ${reg3}"), "srav");
1398}
1399
Chris Larsen51417632015-10-02 13:24:25 -07001400TEST_F(AssemblerMIPS64Test, Dsll) {
1401 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsll, 5, "dsll ${reg1}, ${reg2}, {imm}"), "dsll");
1402}
1403
1404TEST_F(AssemblerMIPS64Test, Dsrl) {
1405 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsrl, 5, "dsrl ${reg1}, ${reg2}, {imm}"), "dsrl");
1406}
1407
Chris Larsen98a73e12015-10-19 14:17:16 -07001408TEST_F(AssemblerMIPS64Test, Drotr) {
1409 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Drotr, 5, "drotr ${reg1}, ${reg2}, {imm}"),
1410 "drotr");
1411}
1412
Chris Larsen51417632015-10-02 13:24:25 -07001413TEST_F(AssemblerMIPS64Test, Dsra) {
1414 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsra, 5, "dsra ${reg1}, ${reg2}, {imm}"), "dsra");
1415}
1416
1417TEST_F(AssemblerMIPS64Test, Dsll32) {
Chris Larsen98a73e12015-10-19 14:17:16 -07001418 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsll32, 5, "dsll32 ${reg1}, ${reg2}, {imm}"),
1419 "dsll32");
Chris Larsen51417632015-10-02 13:24:25 -07001420}
1421
1422TEST_F(AssemblerMIPS64Test, Dsrl32) {
Chris Larsen98a73e12015-10-19 14:17:16 -07001423 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsrl32, 5, "dsrl32 ${reg1}, ${reg2}, {imm}"),
1424 "dsrl32");
1425}
1426
1427TEST_F(AssemblerMIPS64Test, Drotr32) {
1428 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Drotr32, 5, "drotr32 ${reg1}, ${reg2}, {imm}"),
1429 "drotr32");
Chris Larsen51417632015-10-02 13:24:25 -07001430}
1431
1432TEST_F(AssemblerMIPS64Test, Dsra32) {
Chris Larsen98a73e12015-10-19 14:17:16 -07001433 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Dsra32, 5, "dsra32 ${reg1}, ${reg2}, {imm}"),
1434 "dsra32");
Chris Larsen51417632015-10-02 13:24:25 -07001435}
1436
Goran Jakovljevic95f27142017-01-20 11:11:11 +01001437TEST_F(AssemblerMIPS64Test, Dsllv) {
1438 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dsllv, "dsllv ${reg1}, ${reg2}, ${reg3}"), "dsllv");
1439}
1440
1441TEST_F(AssemblerMIPS64Test, Dsrlv) {
1442 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dsrlv, "dsrlv ${reg1}, ${reg2}, ${reg3}"), "dsrlv");
1443}
1444
1445TEST_F(AssemblerMIPS64Test, Dsrav) {
1446 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Dsrav, "dsrav ${reg1}, ${reg2}, ${reg3}"), "dsrav");
1447}
1448
Chris Larsendbce0d72015-09-17 13:34:00 -07001449TEST_F(AssemblerMIPS64Test, Sc) {
1450 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Sc, -9, "sc ${reg1}, {imm}(${reg2})"), "sc");
1451}
1452
1453TEST_F(AssemblerMIPS64Test, Scd) {
1454 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Scd, -9, "scd ${reg1}, {imm}(${reg2})"), "scd");
1455}
1456
1457TEST_F(AssemblerMIPS64Test, Ll) {
1458 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Ll, -9, "ll ${reg1}, {imm}(${reg2})"), "ll");
1459}
1460
1461TEST_F(AssemblerMIPS64Test, Lld) {
1462 DriverStr(RepeatRRIb(&mips64::Mips64Assembler::Lld, -9, "lld ${reg1}, {imm}(${reg2})"), "lld");
1463}
1464
Chris Larsendbce0d72015-09-17 13:34:00 -07001465TEST_F(AssemblerMIPS64Test, Seleqz) {
1466 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Seleqz, "seleqz ${reg1}, ${reg2}, ${reg3}"),
1467 "seleqz");
1468}
1469
1470TEST_F(AssemblerMIPS64Test, Selnez) {
1471 DriverStr(RepeatRRR(&mips64::Mips64Assembler::Selnez, "selnez ${reg1}, ${reg2}, ${reg3}"),
1472 "selnez");
1473}
1474
1475TEST_F(AssemblerMIPS64Test, Clz) {
1476 DriverStr(RepeatRR(&mips64::Mips64Assembler::Clz, "clz ${reg1}, ${reg2}"), "clz");
1477}
1478
1479TEST_F(AssemblerMIPS64Test, Clo) {
1480 DriverStr(RepeatRR(&mips64::Mips64Assembler::Clo, "clo ${reg1}, ${reg2}"), "clo");
1481}
1482
1483TEST_F(AssemblerMIPS64Test, Dclz) {
1484 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dclz, "dclz ${reg1}, ${reg2}"), "dclz");
1485}
1486
1487TEST_F(AssemblerMIPS64Test, Dclo) {
1488 DriverStr(RepeatRR(&mips64::Mips64Assembler::Dclo, "dclo ${reg1}, ${reg2}"), "dclo");
1489}
1490
Lazar Trsicd9672662015-09-03 17:33:01 +02001491TEST_F(AssemblerMIPS64Test, LoadFromOffset) {
1492 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A0, 0);
1493 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0);
1494 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 1);
1495 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 256);
1496 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 1000);
1497 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x7FFF);
1498 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x8000);
1499 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x8001);
1500 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x10000);
1501 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x12345678);
1502 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, -256);
1503 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, -32768);
1504 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001505 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x7FFFFFFE);
1506 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x7FFFFFFF);
1507 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x80000000);
1508 __ LoadFromOffset(mips64::kLoadSignedByte, mips64::A0, mips64::A1, 0x80000001);
Lazar Trsicd9672662015-09-03 17:33:01 +02001509
1510 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A0, 0);
1511 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0);
1512 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 1);
1513 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 256);
1514 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 1000);
1515 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x7FFF);
1516 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x8000);
1517 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x8001);
1518 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x10000);
1519 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x12345678);
1520 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, -256);
1521 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, -32768);
1522 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001523 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x7FFFFFFE);
1524 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x7FFFFFFF);
1525 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x80000000);
1526 __ LoadFromOffset(mips64::kLoadUnsignedByte, mips64::A0, mips64::A1, 0x80000001);
Lazar Trsicd9672662015-09-03 17:33:01 +02001527
1528 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A0, 0);
1529 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0);
1530 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 2);
1531 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 256);
1532 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 1000);
1533 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x7FFE);
1534 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x8000);
1535 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x8002);
1536 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x10000);
1537 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x12345678);
1538 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, -256);
1539 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, -32768);
1540 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001541 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x7FFFFFFC);
1542 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x7FFFFFFE);
1543 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x80000000);
1544 __ LoadFromOffset(mips64::kLoadSignedHalfword, mips64::A0, mips64::A1, 0x80000002);
Lazar Trsicd9672662015-09-03 17:33:01 +02001545
1546 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A0, 0);
1547 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0);
1548 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 2);
1549 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 256);
1550 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 1000);
1551 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x7FFE);
1552 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x8000);
1553 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x8002);
1554 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x10000);
1555 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x12345678);
1556 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, -256);
1557 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, -32768);
1558 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001559 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x7FFFFFFC);
1560 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x7FFFFFFE);
1561 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x80000000);
1562 __ LoadFromOffset(mips64::kLoadUnsignedHalfword, mips64::A0, mips64::A1, 0x80000002);
Lazar Trsicd9672662015-09-03 17:33:01 +02001563
1564 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A0, 0);
1565 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0);
1566 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 4);
1567 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 256);
1568 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 1000);
1569 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x7FFC);
1570 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x8000);
1571 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x8004);
1572 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x10000);
1573 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x12345678);
1574 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, -256);
1575 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, -32768);
1576 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001577 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x7FFFFFF8);
1578 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x7FFFFFFC);
1579 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x80000000);
1580 __ LoadFromOffset(mips64::kLoadWord, mips64::A0, mips64::A1, 0x80000004);
Lazar Trsicd9672662015-09-03 17:33:01 +02001581
1582 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A0, 0);
1583 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0);
1584 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 4);
1585 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 256);
1586 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 1000);
1587 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x7FFC);
1588 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x8000);
1589 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x8004);
1590 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x10000);
1591 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x12345678);
1592 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, -256);
1593 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, -32768);
1594 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001595 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x7FFFFFF8);
1596 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x7FFFFFFC);
1597 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x80000000);
1598 __ LoadFromOffset(mips64::kLoadUnsignedWord, mips64::A0, mips64::A1, 0x80000004);
Lazar Trsicd9672662015-09-03 17:33:01 +02001599
1600 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A0, 0);
1601 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0);
1602 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 4);
1603 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 256);
1604 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 1000);
1605 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x7FFC);
1606 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x8000);
1607 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x8004);
1608 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x10000);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001609 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x27FFC);
Lazar Trsicd9672662015-09-03 17:33:01 +02001610 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x12345678);
1611 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, -256);
1612 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, -32768);
1613 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001614 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x7FFFFFF8);
1615 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x7FFFFFFC);
1616 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x80000000);
1617 __ LoadFromOffset(mips64::kLoadDoubleword, mips64::A0, mips64::A1, 0x80000004);
Lazar Trsicd9672662015-09-03 17:33:01 +02001618
1619 const char* expected =
1620 "lb $a0, 0($a0)\n"
1621 "lb $a0, 0($a1)\n"
1622 "lb $a0, 1($a1)\n"
1623 "lb $a0, 256($a1)\n"
1624 "lb $a0, 1000($a1)\n"
1625 "lb $a0, 0x7FFF($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001626 "daddiu $at, $a1, 0x7FF8\n"
1627 "lb $a0, 8($at)\n"
1628 "daddiu $at, $a1, 32760\n"
1629 "lb $a0, 9($at)\n"
1630 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001631 "lb $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001632 "daui $at, $a1, 0x1234\n"
1633 "lb $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001634 "lb $a0, -256($a1)\n"
1635 "lb $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001636 "daui $at, $a1, 0xABCE\n"
1637 "lb $a0, -4352($at)\n"
1638 "daui $at, $a1, 32768\n"
1639 "dahi $at, $at, 1\n"
1640 "lb $a0, -2($at)\n"
1641 "daui $at, $a1, 32768\n"
1642 "dahi $at, $at, 1\n"
1643 "lb $a0, -1($at)\n"
1644 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001645 "lb $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001646 "daui $at, $a1, 32768\n"
1647 "lb $a0, 1($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001648
1649 "lbu $a0, 0($a0)\n"
1650 "lbu $a0, 0($a1)\n"
1651 "lbu $a0, 1($a1)\n"
1652 "lbu $a0, 256($a1)\n"
1653 "lbu $a0, 1000($a1)\n"
1654 "lbu $a0, 0x7FFF($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001655 "daddiu $at, $a1, 0x7FF8\n"
1656 "lbu $a0, 8($at)\n"
1657 "daddiu $at, $a1, 32760\n"
1658 "lbu $a0, 9($at)\n"
1659 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001660 "lbu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001661 "daui $at, $a1, 0x1234\n"
1662 "lbu $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001663 "lbu $a0, -256($a1)\n"
1664 "lbu $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001665 "daui $at, $a1, 0xABCE\n"
1666 "lbu $a0, -4352($at)\n"
1667 "daui $at, $a1, 32768\n"
1668 "dahi $at, $at, 1\n"
1669 "lbu $a0, -2($at)\n"
1670 "daui $at, $a1, 32768\n"
1671 "dahi $at, $at, 1\n"
1672 "lbu $a0, -1($at)\n"
1673 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001674 "lbu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001675 "daui $at, $a1, 32768\n"
1676 "lbu $a0, 1($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001677
1678 "lh $a0, 0($a0)\n"
1679 "lh $a0, 0($a1)\n"
1680 "lh $a0, 2($a1)\n"
1681 "lh $a0, 256($a1)\n"
1682 "lh $a0, 1000($a1)\n"
1683 "lh $a0, 0x7FFE($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001684 "daddiu $at, $a1, 0x7FF8\n"
1685 "lh $a0, 8($at)\n"
1686 "daddiu $at, $a1, 32760\n"
1687 "lh $a0, 10($at)\n"
1688 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001689 "lh $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001690 "daui $at, $a1, 0x1234\n"
1691 "lh $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001692 "lh $a0, -256($a1)\n"
1693 "lh $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001694 "daui $at, $a1, 0xABCE\n"
1695 "lh $a0, -4352($at)\n"
1696 "daui $at, $a1, 32768\n"
1697 "dahi $at, $at, 1\n"
1698 "lh $a0, -4($at)\n"
1699 "daui $at, $a1, 32768\n"
1700 "dahi $at, $at, 1\n"
1701 "lh $a0, -2($at)\n"
1702 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001703 "lh $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001704 "daui $at, $a1, 32768\n"
1705 "lh $a0, 2($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001706
1707 "lhu $a0, 0($a0)\n"
1708 "lhu $a0, 0($a1)\n"
1709 "lhu $a0, 2($a1)\n"
1710 "lhu $a0, 256($a1)\n"
1711 "lhu $a0, 1000($a1)\n"
1712 "lhu $a0, 0x7FFE($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001713 "daddiu $at, $a1, 0x7FF8\n"
1714 "lhu $a0, 8($at)\n"
1715 "daddiu $at, $a1, 32760\n"
1716 "lhu $a0, 10($at)\n"
1717 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001718 "lhu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001719 "daui $at, $a1, 0x1234\n"
1720 "lhu $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001721 "lhu $a0, -256($a1)\n"
1722 "lhu $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001723 "daui $at, $a1, 0xABCE\n"
1724 "lhu $a0, -4352($at)\n"
1725 "daui $at, $a1, 32768\n"
1726 "dahi $at, $at, 1\n"
1727 "lhu $a0, -4($at)\n"
1728 "daui $at, $a1, 32768\n"
1729 "dahi $at, $at, 1\n"
1730 "lhu $a0, -2($at)\n"
1731 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001732 "lhu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001733 "daui $at, $a1, 32768\n"
1734 "lhu $a0, 2($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001735
1736 "lw $a0, 0($a0)\n"
1737 "lw $a0, 0($a1)\n"
1738 "lw $a0, 4($a1)\n"
1739 "lw $a0, 256($a1)\n"
1740 "lw $a0, 1000($a1)\n"
1741 "lw $a0, 0x7FFC($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001742 "daddiu $at, $a1, 0x7FF8\n"
1743 "lw $a0, 8($at)\n"
1744 "daddiu $at, $a1, 32760\n"
1745 "lw $a0, 12($at)\n"
1746 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001747 "lw $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001748 "daui $at, $a1, 0x1234\n"
1749 "lw $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001750 "lw $a0, -256($a1)\n"
1751 "lw $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001752 "daui $at, $a1, 0xABCE\n"
1753 "lw $a0, -4352($at)\n"
1754 "daui $at, $a1, 32768\n"
1755 "dahi $at, $at, 1\n"
1756 "lw $a0, -8($at)\n"
1757 "daui $at, $a1, 32768\n"
1758 "dahi $at, $at, 1\n"
1759 "lw $a0, -4($at)\n"
1760 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001761 "lw $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001762 "daui $at, $a1, 32768\n"
1763 "lw $a0, 4($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001764
1765 "lwu $a0, 0($a0)\n"
1766 "lwu $a0, 0($a1)\n"
1767 "lwu $a0, 4($a1)\n"
1768 "lwu $a0, 256($a1)\n"
1769 "lwu $a0, 1000($a1)\n"
1770 "lwu $a0, 0x7FFC($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001771 "daddiu $at, $a1, 0x7FF8\n"
1772 "lwu $a0, 8($at)\n"
1773 "daddiu $at, $a1, 32760\n"
1774 "lwu $a0, 12($at)\n"
1775 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001776 "lwu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001777 "daui $at, $a1, 0x1234\n"
1778 "lwu $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001779 "lwu $a0, -256($a1)\n"
1780 "lwu $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001781 "daui $at, $a1, 0xABCE\n"
1782 "lwu $a0, -4352($at)\n"
1783 "daui $at, $a1, 32768\n"
1784 "dahi $at, $at, 1\n"
1785 "lwu $a0, -8($at)\n"
1786 "daui $at, $a1, 32768\n"
1787 "dahi $at, $at, 1\n"
1788 "lwu $a0, -4($at)\n"
1789 "daui $at, $a1, 32768\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001790 "lwu $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001791 "daui $at, $a1, 32768\n"
1792 "lwu $a0, 4($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001793
1794 "ld $a0, 0($a0)\n"
1795 "ld $a0, 0($a1)\n"
1796 "lwu $a0, 4($a1)\n"
1797 "lwu $t3, 8($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001798 "dinsu $a0, $t3, 32, 32\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001799 "ld $a0, 256($a1)\n"
1800 "ld $a0, 1000($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001801 "daddiu $at, $a1, 32760\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001802 "lwu $a0, 4($at)\n"
1803 "lwu $t3, 8($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001804 "dinsu $a0, $t3, 32, 32\n"
1805 "daddiu $at, $a1, 32760\n"
1806 "ld $a0, 8($at)\n"
1807 "daddiu $at, $a1, 32760\n"
1808 "lwu $a0, 12($at)\n"
1809 "lwu $t3, 16($at)\n"
1810 "dinsu $a0, $t3, 32, 32\n"
1811 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001812 "ld $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001813 "daui $at, $a1, 2\n"
1814 "daddiu $at, $at, 8\n"
1815 "lwu $a0, 0x7ff4($at)\n"
1816 "lwu $t3, 0x7ff8($at)\n"
1817 "dinsu $a0, $t3, 32, 32\n"
1818 "daui $at, $a1, 0x1234\n"
1819 "ld $a0, 0x5678($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001820 "ld $a0, -256($a1)\n"
1821 "ld $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001822 "daui $at, $a1, 0xABCE\n"
1823 "ld $a0, -4352($at)\n"
1824 "daui $at, $a1, 32768\n"
1825 "dahi $at, $at, 1\n"
1826 "ld $a0, -8($at)\n"
1827 "daui $at, $a1, 32768\n"
1828 "dahi $at, $at, 1\n"
1829 "lwu $a0, -4($at)\n"
1830 "lwu $t3, 0($at)\n"
1831 "dinsu $a0, $t3, 32, 32\n"
1832 "daui $at, $a1, 32768\n"
1833 "ld $a0, 0($at)\n"
1834 "daui $at, $a1, 32768\n"
1835 "lwu $a0, 4($at)\n"
1836 "lwu $t3, 8($at)\n"
1837 "dinsu $a0, $t3, 32, 32\n";
Lazar Trsicd9672662015-09-03 17:33:01 +02001838 DriverStr(expected, "LoadFromOffset");
1839}
1840
1841TEST_F(AssemblerMIPS64Test, LoadFpuFromOffset) {
1842 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0);
1843 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 4);
1844 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 256);
1845 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x7FFC);
1846 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x8000);
1847 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x8004);
1848 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x10000);
1849 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0x12345678);
1850 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, -256);
1851 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, -32768);
1852 __ LoadFpuFromOffset(mips64::kLoadWord, mips64::F0, mips64::A0, 0xABCDEF00);
1853
1854 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0);
1855 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 4);
1856 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 256);
1857 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x7FFC);
1858 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x8000);
1859 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x8004);
1860 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x10000);
1861 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0x12345678);
1862 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, -256);
1863 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, -32768);
1864 __ LoadFpuFromOffset(mips64::kLoadDoubleword, mips64::F0, mips64::A0, 0xABCDEF00);
1865
Goran Jakovljevicd8b6a532017-04-20 11:42:30 +02001866 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0);
1867 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 1);
1868 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 2);
1869 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4);
1870 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 8);
1871 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 511);
1872 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 512);
1873 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 513);
1874 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 514);
1875 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 516);
1876 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 1022);
1877 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 1024);
1878 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 1025);
1879 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 1026);
1880 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 1028);
1881 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 2044);
1882 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 2048);
1883 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 2049);
1884 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 2050);
1885 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 2052);
1886 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4088);
1887 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4096);
1888 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4097);
1889 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4098);
1890 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4100);
1891 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 4104);
1892 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0x7FFC);
1893 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0x8000);
1894 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0x10000);
1895 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0x12345678);
1896 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0x12350078);
1897 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -256);
1898 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -511);
1899 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -513);
1900 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -1022);
1901 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -1026);
1902 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -2044);
1903 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -2052);
1904 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -4096);
1905 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -4104);
1906 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, -32768);
1907 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0xABCDEF00);
1908 __ LoadFpuFromOffset(mips64::kLoadQuadword, mips64::F0, mips64::A0, 0x7FFFABCD);
1909
Lazar Trsicd9672662015-09-03 17:33:01 +02001910 const char* expected =
1911 "lwc1 $f0, 0($a0)\n"
1912 "lwc1 $f0, 4($a0)\n"
1913 "lwc1 $f0, 256($a0)\n"
1914 "lwc1 $f0, 0x7FFC($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001915 "daddiu $at, $a0, 32760 # 0x7FF8\n"
1916 "lwc1 $f0, 8($at)\n"
1917 "daddiu $at, $a0, 32760 # 0x7FF8\n"
1918 "lwc1 $f0, 12($at)\n"
1919 "daui $at, $a0, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001920 "lwc1 $f0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001921 "daui $at, $a0, 4660 # 0x1234\n"
1922 "lwc1 $f0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001923 "lwc1 $f0, -256($a0)\n"
1924 "lwc1 $f0, -32768($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001925 "daui $at, $a0, 0xABCE\n"
1926 "lwc1 $f0, -0x1100($at) # 0xEF00\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001927
1928 "ldc1 $f0, 0($a0)\n"
1929 "lwc1 $f0, 4($a0)\n"
1930 "lw $t3, 8($a0)\n"
1931 "mthc1 $t3, $f0\n"
1932 "ldc1 $f0, 256($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001933 "daddiu $at, $a0, 32760 # 0x7FF8\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001934 "lwc1 $f0, 4($at)\n"
1935 "lw $t3, 8($at)\n"
1936 "mthc1 $t3, $f0\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001937 "daddiu $at, $a0, 32760 # 0x7FF8\n"
1938 "ldc1 $f0, 8($at)\n"
1939 "daddiu $at, $a0, 32760 # 0x7FF8\n"
1940 "lwc1 $f0, 12($at)\n"
1941 "lw $t3, 16($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001942 "mthc1 $t3, $f0\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001943 "daui $at, $a0, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001944 "ldc1 $f0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001945 "daui $at, $a0, 4660 # 0x1234\n"
1946 "ldc1 $f0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02001947 "ldc1 $f0, -256($a0)\n"
1948 "ldc1 $f0, -32768($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08001949 "daui $at, $a0, 0xABCE\n"
Goran Jakovljevicd8b6a532017-04-20 11:42:30 +02001950 "ldc1 $f0, -0x1100($at) # 0xEF00\n"
1951
1952 "ld.d $w0, 0($a0)\n"
1953 "ld.b $w0, 1($a0)\n"
1954 "ld.h $w0, 2($a0)\n"
1955 "ld.w $w0, 4($a0)\n"
1956 "ld.d $w0, 8($a0)\n"
1957 "ld.b $w0, 511($a0)\n"
1958 "ld.d $w0, 512($a0)\n"
1959 "daddiu $at, $a0, 513\n"
1960 "ld.b $w0, 0($at)\n"
1961 "ld.h $w0, 514($a0)\n"
1962 "ld.w $w0, 516($a0)\n"
1963 "ld.h $w0, 1022($a0)\n"
1964 "ld.d $w0, 1024($a0)\n"
1965 "daddiu $at, $a0, 1025\n"
1966 "ld.b $w0, 0($at)\n"
1967 "daddiu $at, $a0, 1026\n"
1968 "ld.h $w0, 0($at)\n"
1969 "ld.w $w0, 1028($a0)\n"
1970 "ld.w $w0, 2044($a0)\n"
1971 "ld.d $w0, 2048($a0)\n"
1972 "daddiu $at, $a0, 2049\n"
1973 "ld.b $w0, 0($at)\n"
1974 "daddiu $at, $a0, 2050\n"
1975 "ld.h $w0, 0($at)\n"
1976 "daddiu $at, $a0, 2052\n"
1977 "ld.w $w0, 0($at)\n"
1978 "ld.d $w0, 4088($a0)\n"
1979 "daddiu $at, $a0, 4096\n"
1980 "ld.d $w0, 0($at)\n"
1981 "daddiu $at, $a0, 4097\n"
1982 "ld.b $w0, 0($at)\n"
1983 "daddiu $at, $a0, 4098\n"
1984 "ld.h $w0, 0($at)\n"
1985 "daddiu $at, $a0, 4100\n"
1986 "ld.w $w0, 0($at)\n"
1987 "daddiu $at, $a0, 4104\n"
1988 "ld.d $w0, 0($at)\n"
1989 "daddiu $at, $a0, 0x7FFC\n"
1990 "ld.w $w0, 0($at)\n"
1991 "daddiu $at, $a0, 0x7FF8\n"
1992 "ld.d $w0, 8($at)\n"
1993 "daui $at, $a0, 0x1\n"
1994 "ld.d $w0, 0($at)\n"
1995 "daui $at, $a0, 0x1234\n"
1996 "daddiu $at, $at, 0x6000\n"
1997 "ld.d $w0, -2440($at) # 0xF678\n"
1998 "daui $at, $a0, 0x1235\n"
1999 "ld.d $w0, 0x78($at)\n"
2000 "ld.d $w0, -256($a0)\n"
2001 "ld.b $w0, -511($a0)\n"
2002 "daddiu $at, $a0, -513\n"
2003 "ld.b $w0, 0($at)\n"
2004 "ld.h $w0, -1022($a0)\n"
2005 "daddiu $at, $a0, -1026\n"
2006 "ld.h $w0, 0($at)\n"
2007 "ld.w $w0, -2044($a0)\n"
2008 "daddiu $at, $a0, -2052\n"
2009 "ld.w $w0, 0($at)\n"
2010 "ld.d $w0, -4096($a0)\n"
2011 "daddiu $at, $a0, -4104\n"
2012 "ld.d $w0, 0($at)\n"
2013 "daddiu $at, $a0, -32768\n"
2014 "ld.d $w0, 0($at)\n"
2015 "daui $at, $a0, 0xABCE\n"
2016 "daddiu $at, $at, -8192 # 0xE000\n"
2017 "ld.d $w0, 0xF00($at)\n"
2018 "daui $at, $a0, 0x8000\n"
2019 "dahi $at, $at, 1\n"
2020 "daddiu $at, $at, -21504 # 0xAC00\n"
2021 "ld.b $w0, -51($at) # 0xFFCD\n";
Lazar Trsicd9672662015-09-03 17:33:01 +02002022 DriverStr(expected, "LoadFpuFromOffset");
2023}
2024
2025TEST_F(AssemblerMIPS64Test, StoreToOffset) {
2026 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A0, 0);
2027 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0);
2028 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 1);
2029 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 256);
2030 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 1000);
2031 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x7FFF);
2032 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x8000);
2033 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x8001);
2034 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x10000);
2035 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0x12345678);
2036 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, -256);
2037 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, -32768);
2038 __ StoreToOffset(mips64::kStoreByte, mips64::A0, mips64::A1, 0xABCDEF00);
2039
2040 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A0, 0);
2041 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0);
2042 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 2);
2043 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 256);
2044 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 1000);
2045 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x7FFE);
2046 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x8000);
2047 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x8002);
2048 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x10000);
2049 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0x12345678);
2050 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, -256);
2051 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, -32768);
2052 __ StoreToOffset(mips64::kStoreHalfword, mips64::A0, mips64::A1, 0xABCDEF00);
2053
2054 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A0, 0);
2055 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0);
2056 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 4);
2057 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 256);
2058 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 1000);
2059 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x7FFC);
2060 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x8000);
2061 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x8004);
2062 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x10000);
2063 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0x12345678);
2064 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, -256);
2065 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, -32768);
2066 __ StoreToOffset(mips64::kStoreWord, mips64::A0, mips64::A1, 0xABCDEF00);
2067
2068 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A0, 0);
2069 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0);
2070 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 4);
2071 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 256);
2072 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 1000);
2073 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x7FFC);
2074 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x8000);
2075 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x8004);
2076 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x10000);
2077 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x12345678);
2078 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, -256);
2079 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, -32768);
2080 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0xABCDEF00);
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002081 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x7FFFFFF8);
2082 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x7FFFFFFC);
2083 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x80000000);
2084 __ StoreToOffset(mips64::kStoreDoubleword, mips64::A0, mips64::A1, 0x80000004);
Lazar Trsicd9672662015-09-03 17:33:01 +02002085
2086 const char* expected =
2087 "sb $a0, 0($a0)\n"
2088 "sb $a0, 0($a1)\n"
2089 "sb $a0, 1($a1)\n"
2090 "sb $a0, 256($a1)\n"
2091 "sb $a0, 1000($a1)\n"
2092 "sb $a0, 0x7FFF($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002093 "daddiu $at, $a1, 0x7FF8\n"
2094 "sb $a0, 8($at)\n"
2095 "daddiu $at, $a1, 0x7FF8\n"
2096 "sb $a0, 9($at)\n"
2097 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002098 "sb $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002099 "daui $at, $a1, 4660 # 0x1234\n"
2100 "sb $a0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002101 "sb $a0, -256($a1)\n"
2102 "sb $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002103 "daui $at, $a1, 43982 # 0xABCE\n"
2104 "sb $a0, -4352($at) # 0xEF00\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002105
2106 "sh $a0, 0($a0)\n"
2107 "sh $a0, 0($a1)\n"
2108 "sh $a0, 2($a1)\n"
2109 "sh $a0, 256($a1)\n"
2110 "sh $a0, 1000($a1)\n"
2111 "sh $a0, 0x7FFE($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002112 "daddiu $at, $a1, 0x7FF8\n"
2113 "sh $a0, 8($at)\n"
2114 "daddiu $at, $a1, 0x7FF8\n"
2115 "sh $a0, 10($at)\n"
2116 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002117 "sh $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002118 "daui $at, $a1, 4660 # 0x1234\n"
2119 "sh $a0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002120 "sh $a0, -256($a1)\n"
2121 "sh $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002122 "daui $at, $a1, 43982 # 0xABCE\n"
2123 "sh $a0, -4352($at) # 0xEF00\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002124
2125 "sw $a0, 0($a0)\n"
2126 "sw $a0, 0($a1)\n"
2127 "sw $a0, 4($a1)\n"
2128 "sw $a0, 256($a1)\n"
2129 "sw $a0, 1000($a1)\n"
2130 "sw $a0, 0x7FFC($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002131 "daddiu $at, $a1, 0x7FF8\n"
2132 "sw $a0, 8($at)\n"
2133 "daddiu $at, $a1, 0x7FF8\n"
2134 "sw $a0, 12($at)\n"
2135 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002136 "sw $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002137 "daui $at, $a1, 4660 # 0x1234\n"
2138 "sw $a0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002139 "sw $a0, -256($a1)\n"
2140 "sw $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002141 "daui $at, $a1, 43982 # 0xABCE\n"
2142 "sw $a0, -4352($at) # 0xEF00\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002143
2144 "sd $a0, 0($a0)\n"
2145 "sd $a0, 0($a1)\n"
2146 "sw $a0, 4($a1)\n"
2147 "dsrl32 $t3, $a0, 0\n"
2148 "sw $t3, 8($a1)\n"
2149 "sd $a0, 256($a1)\n"
2150 "sd $a0, 1000($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002151 "daddiu $at, $a1, 0x7FF8\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002152 "sw $a0, 4($at)\n"
2153 "dsrl32 $t3, $a0, 0\n"
2154 "sw $t3, 8($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002155 "daddiu $at, $a1, 32760 # 0x7FF8\n"
2156 "sd $a0, 8($at)\n"
2157 "daddiu $at, $a1, 32760 # 0x7FF8\n"
2158 "sw $a0, 12($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002159 "dsrl32 $t3, $a0, 0\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002160 "sw $t3, 16($at)\n"
2161 "daui $at, $a1, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002162 "sd $a0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002163 "daui $at, $a1, 4660 # 0x1234\n"
2164 "sd $a0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002165 "sd $a0, -256($a1)\n"
2166 "sd $a0, -32768($a1)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002167 "daui $at, $a1, 0xABCE\n"
2168 "sd $a0, -0x1100($at)\n"
2169 "daui $at, $a1, 0x8000\n"
2170 "dahi $at, $at, 1\n"
2171 "sd $a0, -8($at)\n"
2172 "daui $at, $a1, 0x8000\n"
2173 "dahi $at, $at, 1\n"
2174 "sw $a0, -4($at) # 0xFFFC\n"
2175 "dsrl32 $t3, $a0, 0\n"
2176 "sw $t3, 0($at) # 0x0\n"
2177 "daui $at, $a1, 0x8000\n"
2178 "sd $a0, 0($at) # 0x0\n"
2179 "daui $at, $a1, 0x8000\n"
2180 "sw $a0, 4($at) # 0x4\n"
2181 "dsrl32 $t3, $a0, 0\n"
2182 "sw $t3, 8($at) # 0x8\n";
Lazar Trsicd9672662015-09-03 17:33:01 +02002183 DriverStr(expected, "StoreToOffset");
2184}
2185
2186TEST_F(AssemblerMIPS64Test, StoreFpuToOffset) {
2187 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0);
2188 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 4);
2189 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 256);
2190 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x7FFC);
2191 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x8000);
2192 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x8004);
2193 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x10000);
2194 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0x12345678);
2195 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, -256);
2196 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, -32768);
2197 __ StoreFpuToOffset(mips64::kStoreWord, mips64::F0, mips64::A0, 0xABCDEF00);
2198
2199 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0);
2200 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 4);
2201 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 256);
2202 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x7FFC);
2203 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x8000);
2204 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x8004);
2205 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x10000);
2206 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0x12345678);
2207 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, -256);
2208 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, -32768);
2209 __ StoreFpuToOffset(mips64::kStoreDoubleword, mips64::F0, mips64::A0, 0xABCDEF00);
2210
Goran Jakovljevicd8b6a532017-04-20 11:42:30 +02002211 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0);
2212 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 1);
2213 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 2);
2214 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4);
2215 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 8);
2216 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 511);
2217 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 512);
2218 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 513);
2219 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 514);
2220 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 516);
2221 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 1022);
2222 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 1024);
2223 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 1025);
2224 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 1026);
2225 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 1028);
2226 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 2044);
2227 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 2048);
2228 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 2049);
2229 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 2050);
2230 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 2052);
2231 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4088);
2232 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4096);
2233 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4097);
2234 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4098);
2235 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4100);
2236 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 4104);
2237 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0x7FFC);
2238 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0x8000);
2239 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0x10000);
2240 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0x12345678);
2241 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0x12350078);
2242 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -256);
2243 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -511);
2244 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -513);
2245 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -1022);
2246 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -1026);
2247 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -2044);
2248 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -2052);
2249 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -4096);
2250 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -4104);
2251 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, -32768);
2252 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0xABCDEF00);
2253 __ StoreFpuToOffset(mips64::kStoreQuadword, mips64::F0, mips64::A0, 0x7FFFABCD);
2254
Lazar Trsicd9672662015-09-03 17:33:01 +02002255 const char* expected =
2256 "swc1 $f0, 0($a0)\n"
2257 "swc1 $f0, 4($a0)\n"
2258 "swc1 $f0, 256($a0)\n"
2259 "swc1 $f0, 0x7FFC($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002260 "daddiu $at, $a0, 32760 # 0x7FF8\n"
2261 "swc1 $f0, 8($at)\n"
2262 "daddiu $at, $a0, 32760 # 0x7FF8\n"
2263 "swc1 $f0, 12($at)\n"
2264 "daui $at, $a0, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002265 "swc1 $f0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002266 "daui $at, $a0, 4660 # 0x1234\n"
2267 "swc1 $f0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002268 "swc1 $f0, -256($a0)\n"
2269 "swc1 $f0, -32768($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002270 "daui $at, $a0, 0xABCE\n"
2271 "swc1 $f0, -0x1100($at)\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002272
2273 "sdc1 $f0, 0($a0)\n"
2274 "mfhc1 $t3, $f0\n"
2275 "swc1 $f0, 4($a0)\n"
2276 "sw $t3, 8($a0)\n"
2277 "sdc1 $f0, 256($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002278 "daddiu $at, $a0, 32760 # 0x7FF8\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002279 "mfhc1 $t3, $f0\n"
2280 "swc1 $f0, 4($at)\n"
2281 "sw $t3, 8($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002282 "daddiu $at, $a0, 32760 # 0x7FF8\n"
2283 "sdc1 $f0, 8($at)\n"
2284 "daddiu $at, $a0, 32760 # 0x7FF8\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002285 "mfhc1 $t3, $f0\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002286 "swc1 $f0, 12($at)\n"
2287 "sw $t3, 16($at)\n"
2288 "daui $at, $a0, 1\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002289 "sdc1 $f0, 0($at)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002290 "daui $at, $a0, 4660 # 0x1234\n"
2291 "sdc1 $f0, 22136($at) # 0x5678\n"
Lazar Trsicd9672662015-09-03 17:33:01 +02002292 "sdc1 $f0, -256($a0)\n"
2293 "sdc1 $f0, -32768($a0)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002294 "daui $at, $a0, 0xABCE\n"
Goran Jakovljevicd8b6a532017-04-20 11:42:30 +02002295 "sdc1 $f0, -0x1100($at)\n"
2296
2297 "st.d $w0, 0($a0)\n"
2298 "st.b $w0, 1($a0)\n"
2299 "st.h $w0, 2($a0)\n"
2300 "st.w $w0, 4($a0)\n"
2301 "st.d $w0, 8($a0)\n"
2302 "st.b $w0, 511($a0)\n"
2303 "st.d $w0, 512($a0)\n"
2304 "daddiu $at, $a0, 513\n"
2305 "st.b $w0, 0($at)\n"
2306 "st.h $w0, 514($a0)\n"
2307 "st.w $w0, 516($a0)\n"
2308 "st.h $w0, 1022($a0)\n"
2309 "st.d $w0, 1024($a0)\n"
2310 "daddiu $at, $a0, 1025\n"
2311 "st.b $w0, 0($at)\n"
2312 "daddiu $at, $a0, 1026\n"
2313 "st.h $w0, 0($at)\n"
2314 "st.w $w0, 1028($a0)\n"
2315 "st.w $w0, 2044($a0)\n"
2316 "st.d $w0, 2048($a0)\n"
2317 "daddiu $at, $a0, 2049\n"
2318 "st.b $w0, 0($at)\n"
2319 "daddiu $at, $a0, 2050\n"
2320 "st.h $w0, 0($at)\n"
2321 "daddiu $at, $a0, 2052\n"
2322 "st.w $w0, 0($at)\n"
2323 "st.d $w0, 4088($a0)\n"
2324 "daddiu $at, $a0, 4096\n"
2325 "st.d $w0, 0($at)\n"
2326 "daddiu $at, $a0, 4097\n"
2327 "st.b $w0, 0($at)\n"
2328 "daddiu $at, $a0, 4098\n"
2329 "st.h $w0, 0($at)\n"
2330 "daddiu $at, $a0, 4100\n"
2331 "st.w $w0, 0($at)\n"
2332 "daddiu $at, $a0, 4104\n"
2333 "st.d $w0, 0($at)\n"
2334 "daddiu $at, $a0, 0x7FFC\n"
2335 "st.w $w0, 0($at)\n"
2336 "daddiu $at, $a0, 0x7FF8\n"
2337 "st.d $w0, 8($at)\n"
2338 "daui $at, $a0, 0x1\n"
2339 "st.d $w0, 0($at)\n"
2340 "daui $at, $a0, 0x1234\n"
2341 "daddiu $at, $at, 0x6000\n"
2342 "st.d $w0, -2440($at) # 0xF678\n"
2343 "daui $at, $a0, 0x1235\n"
2344 "st.d $w0, 0x78($at)\n"
2345 "st.d $w0, -256($a0)\n"
2346 "st.b $w0, -511($a0)\n"
2347 "daddiu $at, $a0, -513\n"
2348 "st.b $w0, 0($at)\n"
2349 "st.h $w0, -1022($a0)\n"
2350 "daddiu $at, $a0, -1026\n"
2351 "st.h $w0, 0($at)\n"
2352 "st.w $w0, -2044($a0)\n"
2353 "daddiu $at, $a0, -2052\n"
2354 "st.w $w0, 0($at)\n"
2355 "st.d $w0, -4096($a0)\n"
2356 "daddiu $at, $a0, -4104\n"
2357 "st.d $w0, 0($at)\n"
2358 "daddiu $at, $a0, -32768\n"
2359 "st.d $w0, 0($at)\n"
2360 "daui $at, $a0, 0xABCE\n"
2361 "daddiu $at, $at, -8192 # 0xE000\n"
2362 "st.d $w0, 0xF00($at)\n"
2363 "daui $at, $a0, 0x8000\n"
2364 "dahi $at, $at, 1\n"
2365 "daddiu $at, $at, -21504 # 0xAC00\n"
2366 "st.b $w0, -51($at) # 0xFFCD\n";
Lazar Trsicd9672662015-09-03 17:33:01 +02002367 DriverStr(expected, "StoreFpuToOffset");
2368}
2369
Tijana Jakovljevicba89c342017-03-10 13:36:08 +01002370TEST_F(AssemblerMIPS64Test, StoreConstToOffset) {
2371 __ StoreConstToOffset(mips64::kStoreByte, 0xFF, mips64::A1, +0, mips64::T8);
2372 __ StoreConstToOffset(mips64::kStoreHalfword, 0xFFFF, mips64::A1, +0, mips64::T8);
2373 __ StoreConstToOffset(mips64::kStoreWord, 0x12345678, mips64::A1, +0, mips64::T8);
2374 __ StoreConstToOffset(mips64::kStoreDoubleword, 0x123456789ABCDEF0, mips64::A1, +0, mips64::T8);
2375
2376 __ StoreConstToOffset(mips64::kStoreByte, 0, mips64::A1, +0, mips64::T8);
2377 __ StoreConstToOffset(mips64::kStoreHalfword, 0, mips64::A1, +0, mips64::T8);
2378 __ StoreConstToOffset(mips64::kStoreWord, 0, mips64::A1, +0, mips64::T8);
2379 __ StoreConstToOffset(mips64::kStoreDoubleword, 0, mips64::A1, +0, mips64::T8);
2380
2381 __ StoreConstToOffset(mips64::kStoreDoubleword, 0x1234567812345678, mips64::A1, +0, mips64::T8);
2382 __ StoreConstToOffset(mips64::kStoreDoubleword, 0x1234567800000000, mips64::A1, +0, mips64::T8);
2383 __ StoreConstToOffset(mips64::kStoreDoubleword, 0x0000000012345678, mips64::A1, +0, mips64::T8);
2384
2385 __ StoreConstToOffset(mips64::kStoreWord, 0, mips64::T8, +0, mips64::T8);
2386 __ StoreConstToOffset(mips64::kStoreWord, 0x12345678, mips64::T8, +0, mips64::T8);
2387
2388 __ StoreConstToOffset(mips64::kStoreWord, 0, mips64::A1, -0xFFF0, mips64::T8);
2389 __ StoreConstToOffset(mips64::kStoreWord, 0x12345678, mips64::A1, +0xFFF0, mips64::T8);
2390
2391 __ StoreConstToOffset(mips64::kStoreWord, 0, mips64::T8, -0xFFF0, mips64::T8);
2392 __ StoreConstToOffset(mips64::kStoreWord, 0x12345678, mips64::T8, +0xFFF0, mips64::T8);
2393
2394 const char* expected =
2395 "ori $t8, $zero, 0xFF\n"
2396 "sb $t8, 0($a1)\n"
2397 "ori $t8, $zero, 0xFFFF\n"
2398 "sh $t8, 0($a1)\n"
2399 "lui $t8, 0x1234\n"
2400 "ori $t8, $t8,0x5678\n"
2401 "sw $t8, 0($a1)\n"
2402 "lui $t8, 0x9abc\n"
2403 "ori $t8, $t8,0xdef0\n"
2404 "dahi $t8, $t8, 0x5679\n"
2405 "dati $t8, $t8, 0x1234\n"
2406 "sd $t8, 0($a1)\n"
2407 "sb $zero, 0($a1)\n"
2408 "sh $zero, 0($a1)\n"
2409 "sw $zero, 0($a1)\n"
2410 "sd $zero, 0($a1)\n"
2411 "lui $t8, 0x1234\n"
2412 "ori $t8, $t8,0x5678\n"
2413 "dins $t8, $t8, 0x20, 0x20\n"
2414 "sd $t8, 0($a1)\n"
2415 "lui $t8, 0x246\n"
2416 "ori $t8, $t8, 0x8acf\n"
2417 "dsll32 $t8, $t8, 0x3\n"
2418 "sd $t8, 0($a1)\n"
2419 "lui $t8, 0x1234\n"
2420 "ori $t8, $t8, 0x5678\n"
2421 "sd $t8, 0($a1)\n"
2422 "sw $zero, 0($t8)\n"
2423 "lui $at,0x1234\n"
2424 "ori $at, $at, 0x5678\n"
2425 "sw $at, 0($t8)\n"
Chris Larsenc3fec0c2016-12-15 11:44:14 -08002426 "daddiu $at, $a1, -32760 # 0x8008\n"
2427 "sw $zero, -32760($at) # 0x8008\n"
2428 "daddiu $at, $a1, 32760 # 0x7FF8\n"
2429 "lui $t8, 4660 # 0x1234\n"
2430 "ori $t8, $t8, 22136 # 0x5678\n"
2431 "sw $t8, 32760($at) # 0x7FF8\n"
2432 "daddiu $at, $t8, -32760 # 0x8008\n"
2433 "sw $zero, -32760($at) # 0x8008\n"
2434 "daddiu $at, $t8, 32760 # 0x7FF8\n"
2435 "lui $t8, 4660 # 0x1234\n"
2436 "ori $t8, $t8, 22136 # 0x5678\n"
2437 "sw $t8, 32760($at) # 0x7FF8\n";
Tijana Jakovljevicba89c342017-03-10 13:36:08 +01002438 DriverStr(expected, "StoreConstToOffset");
2439}
Alexey Frunze0960ac52016-12-20 17:24:59 -08002440//////////////////////////////
2441// Loading/adding Constants //
2442//////////////////////////////
Chris Larsenc733dca2016-05-13 16:11:47 -07002443
2444TEST_F(AssemblerMIPS64Test, LoadConst32) {
2445 // IsUint<16>(value)
2446 __ LoadConst32(mips64::V0, 0);
2447 __ LoadConst32(mips64::V0, 65535);
2448 // IsInt<16>(value)
2449 __ LoadConst32(mips64::V0, -1);
2450 __ LoadConst32(mips64::V0, -32768);
2451 // Everything else
2452 __ LoadConst32(mips64::V0, 65536);
2453 __ LoadConst32(mips64::V0, 65537);
2454 __ LoadConst32(mips64::V0, 2147483647);
2455 __ LoadConst32(mips64::V0, -32769);
2456 __ LoadConst32(mips64::V0, -65536);
2457 __ LoadConst32(mips64::V0, -65537);
2458 __ LoadConst32(mips64::V0, -2147483647);
2459 __ LoadConst32(mips64::V0, -2147483648);
2460
2461 const char* expected =
2462 // IsUint<16>(value)
2463 "ori $v0, $zero, 0\n" // __ LoadConst32(mips64::V0, 0);
2464 "ori $v0, $zero, 65535\n" // __ LoadConst32(mips64::V0, 65535);
2465 // IsInt<16>(value)
2466 "addiu $v0, $zero, -1\n" // __ LoadConst32(mips64::V0, -1);
2467 "addiu $v0, $zero, -32768\n" // __ LoadConst32(mips64::V0, -32768);
2468 // Everything else
2469 "lui $v0, 1\n" // __ LoadConst32(mips64::V0, 65536);
2470 "lui $v0, 1\n" // __ LoadConst32(mips64::V0, 65537);
2471 "ori $v0, 1\n" // "
2472 "lui $v0, 32767\n" // __ LoadConst32(mips64::V0, 2147483647);
2473 "ori $v0, 65535\n" // "
2474 "lui $v0, 65535\n" // __ LoadConst32(mips64::V0, -32769);
2475 "ori $v0, 32767\n" // "
2476 "lui $v0, 65535\n" // __ LoadConst32(mips64::V0, -65536);
2477 "lui $v0, 65534\n" // __ LoadConst32(mips64::V0, -65537);
2478 "ori $v0, 65535\n" // "
2479 "lui $v0, 32768\n" // __ LoadConst32(mips64::V0, -2147483647);
2480 "ori $v0, 1\n" // "
2481 "lui $v0, 32768\n"; // __ LoadConst32(mips64::V0, -2147483648);
2482 DriverStr(expected, "LoadConst32");
2483}
2484
Alexey Frunze0960ac52016-12-20 17:24:59 -08002485TEST_F(AssemblerMIPS64Test, Addiu32) {
2486 __ Addiu32(mips64::A1, mips64::A2, -0x8000);
2487 __ Addiu32(mips64::A1, mips64::A2, +0);
2488 __ Addiu32(mips64::A1, mips64::A2, +0x7FFF);
2489 __ Addiu32(mips64::A1, mips64::A2, -0x8001);
2490 __ Addiu32(mips64::A1, mips64::A2, +0x8000);
2491 __ Addiu32(mips64::A1, mips64::A2, -0x10000);
2492 __ Addiu32(mips64::A1, mips64::A2, +0x10000);
2493 __ Addiu32(mips64::A1, mips64::A2, +0x12345678);
2494
2495 const char* expected =
2496 "addiu $a1, $a2, -0x8000\n"
2497 "addiu $a1, $a2, 0\n"
2498 "addiu $a1, $a2, 0x7FFF\n"
2499 "aui $a1, $a2, 0xFFFF\n"
2500 "addiu $a1, $a1, 0x7FFF\n"
2501 "aui $a1, $a2, 1\n"
2502 "addiu $a1, $a1, -0x8000\n"
2503 "aui $a1, $a2, 0xFFFF\n"
2504 "aui $a1, $a2, 1\n"
2505 "aui $a1, $a2, 0x1234\n"
2506 "addiu $a1, $a1, 0x5678\n";
2507 DriverStr(expected, "Addiu32");
2508}
2509
Chris Larsenc733dca2016-05-13 16:11:47 -07002510static uint64_t SignExtend16To64(uint16_t n) {
2511 return static_cast<int16_t>(n);
2512}
2513
2514// The art::mips64::Mips64Assembler::LoadConst64() method uses a template
2515// to minimize the number of instructions needed to load a 64-bit constant
2516// value into a register. The template calls various methods which emit
2517// MIPS machine instructions. This struct (class) uses the same template
2518// but overrides the definitions of the methods which emit MIPS instructions
2519// to use methods which simulate the operation of the corresponding MIPS
2520// instructions. After invoking LoadConst64() the target register should
2521// contain the same 64-bit value as was input to LoadConst64(). If the
2522// simulated register doesn't contain the correct value then there is probably
2523// an error in the template function.
2524struct LoadConst64Tester {
2525 LoadConst64Tester() {
2526 // Initialize all of the registers for simulation to zero.
2527 for (int r = 0; r < 32; r++) {
2528 regs_[r] = 0;
2529 }
2530 // Clear all of the path flags.
2531 loadconst64_paths_ = art::mips64::kLoadConst64PathZero;
2532 }
2533 void Addiu(mips64::GpuRegister rd, mips64::GpuRegister rs, uint16_t c) {
2534 regs_[rd] = static_cast<int32_t>(regs_[rs] + SignExtend16To64(c));
2535 }
2536 void Daddiu(mips64::GpuRegister rd, mips64::GpuRegister rs, uint16_t c) {
2537 regs_[rd] = regs_[rs] + SignExtend16To64(c);
2538 }
2539 void Dahi(mips64::GpuRegister rd, uint16_t c) {
2540 regs_[rd] += SignExtend16To64(c) << 32;
2541 }
2542 void Dati(mips64::GpuRegister rd, uint16_t c) {
2543 regs_[rd] += SignExtend16To64(c) << 48;
2544 }
2545 void Dinsu(mips64::GpuRegister rt, mips64::GpuRegister rs, int pos, int size) {
2546 CHECK(IsUint<5>(pos - 32)) << pos;
2547 CHECK(IsUint<5>(size - 1)) << size;
2548 CHECK(IsUint<5>(pos + size - 33)) << pos << " + " << size;
2549 uint64_t src_mask = (UINT64_C(1) << size) - 1;
2550 uint64_t dsk_mask = ~(src_mask << pos);
2551
2552 regs_[rt] = (regs_[rt] & dsk_mask) | ((regs_[rs] & src_mask) << pos);
2553 }
2554 void Dsll(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2555 regs_[rd] = regs_[rt] << (shamt & 0x1f);
2556 }
2557 void Dsll32(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2558 regs_[rd] = regs_[rt] << (32 + (shamt & 0x1f));
2559 }
2560 void Dsrl(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2561 regs_[rd] = regs_[rt] >> (shamt & 0x1f);
2562 }
2563 void Dsrl32(mips64::GpuRegister rd, mips64::GpuRegister rt, int shamt) {
2564 regs_[rd] = regs_[rt] >> (32 + (shamt & 0x1f));
2565 }
2566 void Lui(mips64::GpuRegister rd, uint16_t c) {
2567 regs_[rd] = SignExtend16To64(c) << 16;
2568 }
2569 void Ori(mips64::GpuRegister rd, mips64::GpuRegister rs, uint16_t c) {
2570 regs_[rd] = regs_[rs] | c;
2571 }
2572 void LoadConst32(mips64::GpuRegister rd, int32_t c) {
2573 CHECK_NE(rd, 0);
2574 mips64::TemplateLoadConst32<LoadConst64Tester>(this, rd, c);
2575 CHECK_EQ(regs_[rd], static_cast<uint64_t>(c));
2576 }
2577 void LoadConst64(mips64::GpuRegister rd, int64_t c) {
2578 CHECK_NE(rd, 0);
2579 mips64::TemplateLoadConst64<LoadConst64Tester>(this, rd, c);
2580 CHECK_EQ(regs_[rd], static_cast<uint64_t>(c));
2581 }
2582 uint64_t regs_[32];
2583
2584 // Getter function for loadconst64_paths_.
2585 int GetPathsCovered() {
2586 return loadconst64_paths_;
2587 }
2588
2589 void RecordLoadConst64Path(int value) {
2590 loadconst64_paths_ |= value;
2591 }
2592
2593 private:
2594 // This variable holds a bitmask to tell us which paths were taken
2595 // through the template function which loads 64-bit values.
2596 int loadconst64_paths_;
2597};
2598
2599TEST_F(AssemblerMIPS64Test, LoadConst64) {
2600 const uint16_t imms[] = {
2601 0, 1, 2, 3, 4, 0x33, 0x66, 0x55, 0x99, 0xaa, 0xcc, 0xff, 0x5500, 0x5555,
2602 0x7ffc, 0x7ffd, 0x7ffe, 0x7fff, 0x8000, 0x8001, 0x8002, 0x8003, 0x8004,
2603 0xaaaa, 0xfffc, 0xfffd, 0xfffe, 0xffff
2604 };
2605 unsigned d0, d1, d2, d3;
2606 LoadConst64Tester tester;
2607
2608 union {
2609 int64_t v64;
2610 uint16_t v16[4];
2611 } u;
2612
2613 for (d3 = 0; d3 < sizeof imms / sizeof imms[0]; d3++) {
2614 u.v16[3] = imms[d3];
2615
2616 for (d2 = 0; d2 < sizeof imms / sizeof imms[0]; d2++) {
2617 u.v16[2] = imms[d2];
2618
2619 for (d1 = 0; d1 < sizeof imms / sizeof imms[0]; d1++) {
2620 u.v16[1] = imms[d1];
2621
2622 for (d0 = 0; d0 < sizeof imms / sizeof imms[0]; d0++) {
2623 u.v16[0] = imms[d0];
2624
2625 tester.LoadConst64(mips64::V0, u.v64);
2626 }
2627 }
2628 }
2629 }
2630
2631 // Verify that we tested all paths through the "load 64-bit value"
2632 // function template.
2633 EXPECT_EQ(tester.GetPathsCovered(), art::mips64::kLoadConst64PathAllPaths);
2634}
2635
Alexey Frunze0cab6562017-07-25 15:19:36 -07002636TEST_F(AssemblerMIPS64Test, LoadFarthestNearLabelAddress) {
2637 mips64::Mips64Label label;
2638 __ LoadLabelAddress(mips64::V0, &label);
2639 constexpr uint32_t kAdduCount = 0x3FFDE;
2640 for (uint32_t i = 0; i != kAdduCount; ++i) {
2641 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2642 }
2643 __ Bind(&label);
2644
2645 std::string expected =
2646 "lapc $v0, 1f\n" +
2647 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2648 "1:\n";
2649 DriverStr(expected, "LoadFarthestNearLabelAddress");
2650 EXPECT_EQ(__ GetLabelLocation(&label), (1 + kAdduCount) * 4);
2651}
2652
2653TEST_F(AssemblerMIPS64Test, LoadNearestFarLabelAddress) {
2654 mips64::Mips64Label label;
2655 __ LoadLabelAddress(mips64::V0, &label);
2656 constexpr uint32_t kAdduCount = 0x3FFDF;
2657 for (uint32_t i = 0; i != kAdduCount; ++i) {
2658 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2659 }
2660 __ Bind(&label);
2661
2662 std::string expected =
2663 "1:\n"
2664 "auipc $at, %hi(2f - 1b)\n"
2665 "daddiu $v0, $at, %lo(2f - 1b)\n" +
2666 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2667 "2:\n";
2668 DriverStr(expected, "LoadNearestFarLabelAddress");
2669 EXPECT_EQ(__ GetLabelLocation(&label), (2 + kAdduCount) * 4);
2670}
2671
2672TEST_F(AssemblerMIPS64Test, LoadFarthestNearLiteral) {
2673 mips64::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
2674 __ LoadLiteral(mips64::V0, mips64::kLoadWord, literal);
2675 constexpr uint32_t kAdduCount = 0x3FFDE;
2676 for (uint32_t i = 0; i != kAdduCount; ++i) {
2677 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2678 }
2679
2680 std::string expected =
2681 "lwpc $v0, 1f\n" +
2682 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2683 "1:\n"
2684 ".word 0x12345678\n";
2685 DriverStr(expected, "LoadFarthestNearLiteral");
2686 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (1 + kAdduCount) * 4);
2687}
2688
2689TEST_F(AssemblerMIPS64Test, LoadNearestFarLiteral) {
2690 mips64::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
2691 __ LoadLiteral(mips64::V0, mips64::kLoadWord, literal);
2692 constexpr uint32_t kAdduCount = 0x3FFDF;
2693 for (uint32_t i = 0; i != kAdduCount; ++i) {
2694 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2695 }
2696
2697 std::string expected =
2698 "1:\n"
2699 "auipc $at, %hi(2f - 1b)\n"
2700 "lw $v0, %lo(2f - 1b)($at)\n" +
2701 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2702 "2:\n"
2703 ".word 0x12345678\n";
2704 DriverStr(expected, "LoadNearestFarLiteral");
2705 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (2 + kAdduCount) * 4);
2706}
2707
2708TEST_F(AssemblerMIPS64Test, LoadFarthestNearLiteralUnsigned) {
2709 mips64::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
2710 __ LoadLiteral(mips64::V0, mips64::kLoadUnsignedWord, literal);
2711 constexpr uint32_t kAdduCount = 0x3FFDE;
2712 for (uint32_t i = 0; i != kAdduCount; ++i) {
2713 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2714 }
2715
2716 std::string expected =
2717 "lwupc $v0, 1f\n" +
2718 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2719 "1:\n"
2720 ".word 0x12345678\n";
2721 DriverStr(expected, "LoadFarthestNearLiteralUnsigned");
2722 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (1 + kAdduCount) * 4);
2723}
2724
2725TEST_F(AssemblerMIPS64Test, LoadNearestFarLiteralUnsigned) {
2726 mips64::Literal* literal = __ NewLiteral<uint32_t>(0x12345678);
2727 __ LoadLiteral(mips64::V0, mips64::kLoadUnsignedWord, literal);
2728 constexpr uint32_t kAdduCount = 0x3FFDF;
2729 for (uint32_t i = 0; i != kAdduCount; ++i) {
2730 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2731 }
2732
2733 std::string expected =
2734 "1:\n"
2735 "auipc $at, %hi(2f - 1b)\n"
2736 "lwu $v0, %lo(2f - 1b)($at)\n" +
2737 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2738 "2:\n"
2739 ".word 0x12345678\n";
2740 DriverStr(expected, "LoadNearestFarLiteralUnsigned");
2741 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (2 + kAdduCount) * 4);
2742}
2743
2744TEST_F(AssemblerMIPS64Test, LoadFarthestNearLiteralLong) {
2745 mips64::Literal* literal = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
2746 __ LoadLiteral(mips64::V0, mips64::kLoadDoubleword, literal);
2747 constexpr uint32_t kAdduCount = 0x3FFDD;
2748 for (uint32_t i = 0; i != kAdduCount; ++i) {
2749 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2750 }
2751
2752 std::string expected =
2753 "ldpc $v0, 1f\n" +
2754 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2755 "1:\n"
2756 ".dword 0x0123456789ABCDEF\n";
2757 DriverStr(expected, "LoadFarthestNearLiteralLong");
2758 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (1 + kAdduCount) * 4);
2759}
2760
2761TEST_F(AssemblerMIPS64Test, LoadNearestFarLiteralLong) {
2762 mips64::Literal* literal = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
2763 __ LoadLiteral(mips64::V0, mips64::kLoadDoubleword, literal);
2764 constexpr uint32_t kAdduCount = 0x3FFDE;
2765 for (uint32_t i = 0; i != kAdduCount; ++i) {
2766 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2767 }
2768
2769 std::string expected =
2770 "1:\n"
2771 "auipc $at, %hi(2f - 1b)\n"
2772 "ld $v0, %lo(2f - 1b)($at)\n" +
2773 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2774 "2:\n"
2775 ".dword 0x0123456789ABCDEF\n";
2776 DriverStr(expected, "LoadNearestFarLiteralLong");
2777 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (2 + kAdduCount) * 4);
2778}
2779
2780TEST_F(AssemblerMIPS64Test, LongLiteralAlignmentNop) {
2781 mips64::Literal* literal1 = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
2782 mips64::Literal* literal2 = __ NewLiteral<uint64_t>(UINT64_C(0x5555555555555555));
2783 mips64::Literal* literal3 = __ NewLiteral<uint64_t>(UINT64_C(0xAAAAAAAAAAAAAAAA));
2784 __ LoadLiteral(mips64::A1, mips64::kLoadDoubleword, literal1);
2785 __ LoadLiteral(mips64::A2, mips64::kLoadDoubleword, literal2);
2786 __ LoadLiteral(mips64::A3, mips64::kLoadDoubleword, literal3);
2787 __ LoadLabelAddress(mips64::V0, literal1->GetLabel());
2788 __ LoadLabelAddress(mips64::V1, literal2->GetLabel());
2789 // A nop will be inserted here before the 64-bit literals.
2790
2791 std::string expected =
2792 "ldpc $a1, 1f\n"
2793 // The GNU assembler incorrectly requires the ldpc instruction to be located
2794 // at an address that's a multiple of 8. TODO: Remove this workaround if/when
2795 // the assembler is fixed.
2796 // "ldpc $a2, 2f\n"
2797 ".word 0xECD80004\n"
2798 "ldpc $a3, 3f\n"
2799 "lapc $v0, 1f\n"
2800 "lapc $v1, 2f\n"
2801 "nop\n"
2802 "1:\n"
2803 ".dword 0x0123456789ABCDEF\n"
2804 "2:\n"
2805 ".dword 0x5555555555555555\n"
2806 "3:\n"
2807 ".dword 0xAAAAAAAAAAAAAAAA\n";
2808 DriverStr(expected, "LongLiteralAlignmentNop");
2809 EXPECT_EQ(__ GetLabelLocation(literal1->GetLabel()), 6 * 4u);
2810 EXPECT_EQ(__ GetLabelLocation(literal2->GetLabel()), 8 * 4u);
2811 EXPECT_EQ(__ GetLabelLocation(literal3->GetLabel()), 10 * 4u);
2812}
2813
2814TEST_F(AssemblerMIPS64Test, LongLiteralAlignmentNoNop) {
2815 mips64::Literal* literal1 = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
2816 mips64::Literal* literal2 = __ NewLiteral<uint64_t>(UINT64_C(0x5555555555555555));
2817 __ LoadLiteral(mips64::A1, mips64::kLoadDoubleword, literal1);
2818 __ LoadLiteral(mips64::A2, mips64::kLoadDoubleword, literal2);
2819 __ LoadLabelAddress(mips64::V0, literal1->GetLabel());
2820 __ LoadLabelAddress(mips64::V1, literal2->GetLabel());
2821
2822 std::string expected =
2823 "ldpc $a1, 1f\n"
2824 // The GNU assembler incorrectly requires the ldpc instruction to be located
2825 // at an address that's a multiple of 8. TODO: Remove this workaround if/when
2826 // the assembler is fixed.
2827 // "ldpc $a2, 2f\n"
2828 ".word 0xECD80003\n"
2829 "lapc $v0, 1f\n"
2830 "lapc $v1, 2f\n"
2831 "1:\n"
2832 ".dword 0x0123456789ABCDEF\n"
2833 "2:\n"
2834 ".dword 0x5555555555555555\n";
2835 DriverStr(expected, "LongLiteralAlignmentNoNop");
2836 EXPECT_EQ(__ GetLabelLocation(literal1->GetLabel()), 4 * 4u);
2837 EXPECT_EQ(__ GetLabelLocation(literal2->GetLabel()), 6 * 4u);
2838}
2839
2840TEST_F(AssemblerMIPS64Test, FarLongLiteralAlignmentNop) {
2841 mips64::Literal* literal = __ NewLiteral<uint64_t>(UINT64_C(0x0123456789ABCDEF));
2842 __ LoadLiteral(mips64::V0, mips64::kLoadDoubleword, literal);
2843 __ LoadLabelAddress(mips64::V1, literal->GetLabel());
2844 constexpr uint32_t kAdduCount = 0x3FFDF;
2845 for (uint32_t i = 0; i != kAdduCount; ++i) {
2846 __ Addu(mips64::ZERO, mips64::ZERO, mips64::ZERO);
2847 }
2848 // A nop will be inserted here before the 64-bit literal.
2849
2850 std::string expected =
2851 "1:\n"
2852 "auipc $at, %hi(3f - 1b)\n"
2853 "ld $v0, %lo(3f - 1b)($at)\n"
2854 "2:\n"
2855 "auipc $at, %hi(3f - 2b)\n"
2856 "daddiu $v1, $at, %lo(3f - 2b)\n" +
2857 RepeatInsn(kAdduCount, "addu $zero, $zero, $zero\n") +
2858 "nop\n"
2859 "3:\n"
2860 ".dword 0x0123456789ABCDEF\n";
2861 DriverStr(expected, "FarLongLiteralAlignmentNop");
2862 EXPECT_EQ(__ GetLabelLocation(literal->GetLabel()), (5 + kAdduCount) * 4);
2863}
2864
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +00002865// MSA instructions.
2866
2867TEST_F(AssemblerMIPS64Test, AndV) {
2868 DriverStr(RepeatVVV(&mips64::Mips64Assembler::AndV, "and.v ${reg1}, ${reg2}, ${reg3}"), "and.v");
2869}
2870
2871TEST_F(AssemblerMIPS64Test, OrV) {
2872 DriverStr(RepeatVVV(&mips64::Mips64Assembler::OrV, "or.v ${reg1}, ${reg2}, ${reg3}"), "or.v");
2873}
2874
2875TEST_F(AssemblerMIPS64Test, NorV) {
2876 DriverStr(RepeatVVV(&mips64::Mips64Assembler::NorV, "nor.v ${reg1}, ${reg2}, ${reg3}"), "nor.v");
2877}
2878
2879TEST_F(AssemblerMIPS64Test, XorV) {
2880 DriverStr(RepeatVVV(&mips64::Mips64Assembler::XorV, "xor.v ${reg1}, ${reg2}, ${reg3}"), "xor.v");
2881}
2882
2883TEST_F(AssemblerMIPS64Test, AddvB) {
2884 DriverStr(RepeatVVV(&mips64::Mips64Assembler::AddvB, "addv.b ${reg1}, ${reg2}, ${reg3}"),
2885 "addv.b");
2886}
2887
2888TEST_F(AssemblerMIPS64Test, AddvH) {
2889 DriverStr(RepeatVVV(&mips64::Mips64Assembler::AddvH, "addv.h ${reg1}, ${reg2}, ${reg3}"),
2890 "addv.h");
2891}
2892
2893TEST_F(AssemblerMIPS64Test, AddvW) {
2894 DriverStr(RepeatVVV(&mips64::Mips64Assembler::AddvW, "addv.w ${reg1}, ${reg2}, ${reg3}"),
2895 "addv.w");
2896}
2897
2898TEST_F(AssemblerMIPS64Test, AddvD) {
2899 DriverStr(RepeatVVV(&mips64::Mips64Assembler::AddvD, "addv.d ${reg1}, ${reg2}, ${reg3}"),
2900 "addv.d");
2901}
2902
2903TEST_F(AssemblerMIPS64Test, SubvB) {
2904 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SubvB, "subv.b ${reg1}, ${reg2}, ${reg3}"),
2905 "subv.b");
2906}
2907
2908TEST_F(AssemblerMIPS64Test, SubvH) {
2909 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SubvH, "subv.h ${reg1}, ${reg2}, ${reg3}"),
2910 "subv.h");
2911}
2912
2913TEST_F(AssemblerMIPS64Test, SubvW) {
2914 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SubvW, "subv.w ${reg1}, ${reg2}, ${reg3}"),
2915 "subv.w");
2916}
2917
2918TEST_F(AssemblerMIPS64Test, SubvD) {
2919 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SubvD, "subv.d ${reg1}, ${reg2}, ${reg3}"),
2920 "subv.d");
2921}
2922
2923TEST_F(AssemblerMIPS64Test, MulvB) {
2924 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MulvB, "mulv.b ${reg1}, ${reg2}, ${reg3}"),
2925 "mulv.b");
2926}
2927
2928TEST_F(AssemblerMIPS64Test, MulvH) {
2929 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MulvH, "mulv.h ${reg1}, ${reg2}, ${reg3}"),
2930 "mulv.h");
2931}
2932
2933TEST_F(AssemblerMIPS64Test, MulvW) {
2934 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MulvW, "mulv.w ${reg1}, ${reg2}, ${reg3}"),
2935 "mulv.w");
2936}
2937
2938TEST_F(AssemblerMIPS64Test, MulvD) {
2939 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MulvD, "mulv.d ${reg1}, ${reg2}, ${reg3}"),
2940 "mulv.d");
2941}
2942
2943TEST_F(AssemblerMIPS64Test, Div_sB) {
2944 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_sB, "div_s.b ${reg1}, ${reg2}, ${reg3}"),
2945 "div_s.b");
2946}
2947
2948TEST_F(AssemblerMIPS64Test, Div_sH) {
2949 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_sH, "div_s.h ${reg1}, ${reg2}, ${reg3}"),
2950 "div_s.h");
2951}
2952
2953TEST_F(AssemblerMIPS64Test, Div_sW) {
2954 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_sW, "div_s.w ${reg1}, ${reg2}, ${reg3}"),
2955 "div_s.w");
2956}
2957
2958TEST_F(AssemblerMIPS64Test, Div_sD) {
2959 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_sD, "div_s.d ${reg1}, ${reg2}, ${reg3}"),
2960 "div_s.d");
2961}
2962
2963TEST_F(AssemblerMIPS64Test, Div_uB) {
2964 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_uB, "div_u.b ${reg1}, ${reg2}, ${reg3}"),
2965 "div_u.b");
2966}
2967
2968TEST_F(AssemblerMIPS64Test, Div_uH) {
2969 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_uH, "div_u.h ${reg1}, ${reg2}, ${reg3}"),
2970 "div_u.h");
2971}
2972
2973TEST_F(AssemblerMIPS64Test, Div_uW) {
2974 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_uW, "div_u.w ${reg1}, ${reg2}, ${reg3}"),
2975 "div_u.w");
2976}
2977
2978TEST_F(AssemblerMIPS64Test, Div_uD) {
2979 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_uD, "div_u.d ${reg1}, ${reg2}, ${reg3}"),
2980 "div_u.d");
2981}
2982
2983TEST_F(AssemblerMIPS64Test, Mod_sB) {
2984 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_sB, "mod_s.b ${reg1}, ${reg2}, ${reg3}"),
2985 "mod_s.b");
2986}
2987
2988TEST_F(AssemblerMIPS64Test, Mod_sH) {
2989 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_sH, "mod_s.h ${reg1}, ${reg2}, ${reg3}"),
2990 "mod_s.h");
2991}
2992
2993TEST_F(AssemblerMIPS64Test, Mod_sW) {
2994 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_sW, "mod_s.w ${reg1}, ${reg2}, ${reg3}"),
2995 "mod_s.w");
2996}
2997
2998TEST_F(AssemblerMIPS64Test, Mod_sD) {
2999 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_sD, "mod_s.d ${reg1}, ${reg2}, ${reg3}"),
3000 "mod_s.d");
3001}
3002
3003TEST_F(AssemblerMIPS64Test, Mod_uB) {
3004 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_uB, "mod_u.b ${reg1}, ${reg2}, ${reg3}"),
3005 "mod_u.b");
3006}
3007
3008TEST_F(AssemblerMIPS64Test, Mod_uH) {
3009 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_uH, "mod_u.h ${reg1}, ${reg2}, ${reg3}"),
3010 "mod_u.h");
3011}
3012
3013TEST_F(AssemblerMIPS64Test, Mod_uW) {
3014 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_uW, "mod_u.w ${reg1}, ${reg2}, ${reg3}"),
3015 "mod_u.w");
3016}
3017
3018TEST_F(AssemblerMIPS64Test, Mod_uD) {
3019 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_uD, "mod_u.d ${reg1}, ${reg2}, ${reg3}"),
3020 "mod_u.d");
3021}
3022
Goran Jakovljevic80248d72017-04-20 11:55:47 +02003023TEST_F(AssemblerMIPS64Test, Add_aB) {
3024 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Add_aB, "add_a.b ${reg1}, ${reg2}, ${reg3}"),
3025 "add_a.b");
3026}
3027
3028TEST_F(AssemblerMIPS64Test, Add_aH) {
3029 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Add_aH, "add_a.h ${reg1}, ${reg2}, ${reg3}"),
3030 "add_a.h");
3031}
3032
3033TEST_F(AssemblerMIPS64Test, Add_aW) {
3034 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Add_aW, "add_a.w ${reg1}, ${reg2}, ${reg3}"),
3035 "add_a.w");
3036}
3037
3038TEST_F(AssemblerMIPS64Test, Add_aD) {
3039 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Add_aD, "add_a.d ${reg1}, ${reg2}, ${reg3}"),
3040 "add_a.d");
3041}
3042
3043TEST_F(AssemblerMIPS64Test, Ave_sB) {
3044 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_sB, "ave_s.b ${reg1}, ${reg2}, ${reg3}"),
3045 "ave_s.b");
3046}
3047
3048TEST_F(AssemblerMIPS64Test, Ave_sH) {
3049 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_sH, "ave_s.h ${reg1}, ${reg2}, ${reg3}"),
3050 "ave_s.h");
3051}
3052
3053TEST_F(AssemblerMIPS64Test, Ave_sW) {
3054 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_sW, "ave_s.w ${reg1}, ${reg2}, ${reg3}"),
3055 "ave_s.w");
3056}
3057
3058TEST_F(AssemblerMIPS64Test, Ave_sD) {
3059 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_sD, "ave_s.d ${reg1}, ${reg2}, ${reg3}"),
3060 "ave_s.d");
3061}
3062
3063TEST_F(AssemblerMIPS64Test, Ave_uB) {
3064 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_uB, "ave_u.b ${reg1}, ${reg2}, ${reg3}"),
3065 "ave_u.b");
3066}
3067
3068TEST_F(AssemblerMIPS64Test, Ave_uH) {
3069 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_uH, "ave_u.h ${reg1}, ${reg2}, ${reg3}"),
3070 "ave_u.h");
3071}
3072
3073TEST_F(AssemblerMIPS64Test, Ave_uW) {
3074 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_uW, "ave_u.w ${reg1}, ${reg2}, ${reg3}"),
3075 "ave_u.w");
3076}
3077
3078TEST_F(AssemblerMIPS64Test, Ave_uD) {
3079 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Ave_uD, "ave_u.d ${reg1}, ${reg2}, ${reg3}"),
3080 "ave_u.d");
3081}
3082
3083TEST_F(AssemblerMIPS64Test, Aver_sB) {
3084 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_sB, "aver_s.b ${reg1}, ${reg2}, ${reg3}"),
3085 "aver_s.b");
3086}
3087
3088TEST_F(AssemblerMIPS64Test, Aver_sH) {
3089 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_sH, "aver_s.h ${reg1}, ${reg2}, ${reg3}"),
3090 "aver_s.h");
3091}
3092
3093TEST_F(AssemblerMIPS64Test, Aver_sW) {
3094 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_sW, "aver_s.w ${reg1}, ${reg2}, ${reg3}"),
3095 "aver_s.w");
3096}
3097
3098TEST_F(AssemblerMIPS64Test, Aver_sD) {
3099 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_sD, "aver_s.d ${reg1}, ${reg2}, ${reg3}"),
3100 "aver_s.d");
3101}
3102
3103TEST_F(AssemblerMIPS64Test, Aver_uB) {
3104 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_uB, "aver_u.b ${reg1}, ${reg2}, ${reg3}"),
3105 "aver_u.b");
3106}
3107
3108TEST_F(AssemblerMIPS64Test, Aver_uH) {
3109 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_uH, "aver_u.h ${reg1}, ${reg2}, ${reg3}"),
3110 "aver_u.h");
3111}
3112
3113TEST_F(AssemblerMIPS64Test, Aver_uW) {
3114 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_uW, "aver_u.w ${reg1}, ${reg2}, ${reg3}"),
3115 "aver_u.w");
3116}
3117
3118TEST_F(AssemblerMIPS64Test, Aver_uD) {
3119 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Aver_uD, "aver_u.d ${reg1}, ${reg2}, ${reg3}"),
3120 "aver_u.d");
3121}
3122
Goran Jakovljevic658263e2017-06-07 09:35:53 +02003123TEST_F(AssemblerMIPS64Test, Max_sB) {
3124 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_sB, "max_s.b ${reg1}, ${reg2}, ${reg3}"),
3125 "max_s.b");
3126}
3127
3128TEST_F(AssemblerMIPS64Test, Max_sH) {
3129 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_sH, "max_s.h ${reg1}, ${reg2}, ${reg3}"),
3130 "max_s.h");
3131}
3132
3133TEST_F(AssemblerMIPS64Test, Max_sW) {
3134 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_sW, "max_s.w ${reg1}, ${reg2}, ${reg3}"),
3135 "max_s.w");
3136}
3137
3138TEST_F(AssemblerMIPS64Test, Max_sD) {
3139 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_sD, "max_s.d ${reg1}, ${reg2}, ${reg3}"),
3140 "max_s.d");
3141}
3142
3143TEST_F(AssemblerMIPS64Test, Max_uB) {
3144 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_uB, "max_u.b ${reg1}, ${reg2}, ${reg3}"),
3145 "max_u.b");
3146}
3147
3148TEST_F(AssemblerMIPS64Test, Max_uH) {
3149 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_uH, "max_u.h ${reg1}, ${reg2}, ${reg3}"),
3150 "max_u.h");
3151}
3152
3153TEST_F(AssemblerMIPS64Test, Max_uW) {
3154 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_uW, "max_u.w ${reg1}, ${reg2}, ${reg3}"),
3155 "max_u.w");
3156}
3157
3158TEST_F(AssemblerMIPS64Test, Max_uD) {
3159 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Max_uD, "max_u.d ${reg1}, ${reg2}, ${reg3}"),
3160 "max_u.d");
3161}
3162
3163TEST_F(AssemblerMIPS64Test, Min_sB) {
3164 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_sB, "min_s.b ${reg1}, ${reg2}, ${reg3}"),
3165 "min_s.b");
3166}
3167
3168TEST_F(AssemblerMIPS64Test, Min_sH) {
3169 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_sH, "min_s.h ${reg1}, ${reg2}, ${reg3}"),
3170 "min_s.h");
3171}
3172
3173TEST_F(AssemblerMIPS64Test, Min_sW) {
3174 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_sW, "min_s.w ${reg1}, ${reg2}, ${reg3}"),
3175 "min_s.w");
3176}
3177
3178TEST_F(AssemblerMIPS64Test, Min_sD) {
3179 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_sD, "min_s.d ${reg1}, ${reg2}, ${reg3}"),
3180 "min_s.d");
3181}
3182
3183TEST_F(AssemblerMIPS64Test, Min_uB) {
3184 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_uB, "min_u.b ${reg1}, ${reg2}, ${reg3}"),
3185 "min_u.b");
3186}
3187
3188TEST_F(AssemblerMIPS64Test, Min_uH) {
3189 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_uH, "min_u.h ${reg1}, ${reg2}, ${reg3}"),
3190 "min_u.h");
3191}
3192
3193TEST_F(AssemblerMIPS64Test, Min_uW) {
3194 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_uW, "min_u.w ${reg1}, ${reg2}, ${reg3}"),
3195 "min_u.w");
3196}
3197
3198TEST_F(AssemblerMIPS64Test, Min_uD) {
3199 DriverStr(RepeatVVV(&mips64::Mips64Assembler::Min_uD, "min_u.d ${reg1}, ${reg2}, ${reg3}"),
3200 "min_u.d");
3201}
3202
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +00003203TEST_F(AssemblerMIPS64Test, FaddW) {
3204 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FaddW, "fadd.w ${reg1}, ${reg2}, ${reg3}"),
3205 "fadd.w");
3206}
3207
3208TEST_F(AssemblerMIPS64Test, FaddD) {
3209 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FaddD, "fadd.d ${reg1}, ${reg2}, ${reg3}"),
3210 "fadd.d");
3211}
3212
3213TEST_F(AssemblerMIPS64Test, FsubW) {
3214 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FsubW, "fsub.w ${reg1}, ${reg2}, ${reg3}"),
3215 "fsub.w");
3216}
3217
3218TEST_F(AssemblerMIPS64Test, FsubD) {
3219 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FsubD, "fsub.d ${reg1}, ${reg2}, ${reg3}"),
3220 "fsub.d");
3221}
3222
3223TEST_F(AssemblerMIPS64Test, FmulW) {
3224 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmulW, "fmul.w ${reg1}, ${reg2}, ${reg3}"),
3225 "fmul.w");
3226}
3227
3228TEST_F(AssemblerMIPS64Test, FmulD) {
3229 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmulD, "fmul.d ${reg1}, ${reg2}, ${reg3}"),
3230 "fmul.d");
3231}
3232
3233TEST_F(AssemblerMIPS64Test, FdivW) {
3234 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FdivW, "fdiv.w ${reg1}, ${reg2}, ${reg3}"),
3235 "fdiv.w");
3236}
3237
3238TEST_F(AssemblerMIPS64Test, FdivD) {
3239 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FdivD, "fdiv.d ${reg1}, ${reg2}, ${reg3}"),
3240 "fdiv.d");
3241}
3242
Goran Jakovljevic658263e2017-06-07 09:35:53 +02003243TEST_F(AssemblerMIPS64Test, FmaxW) {
3244 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmaxW, "fmax.w ${reg1}, ${reg2}, ${reg3}"),
3245 "fmax.w");
3246}
3247
3248TEST_F(AssemblerMIPS64Test, FmaxD) {
3249 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmaxD, "fmax.d ${reg1}, ${reg2}, ${reg3}"),
3250 "fmax.d");
3251}
3252
3253TEST_F(AssemblerMIPS64Test, FminW) {
3254 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FminW, "fmin.w ${reg1}, ${reg2}, ${reg3}"),
3255 "fmin.w");
3256}
3257
3258TEST_F(AssemblerMIPS64Test, FminD) {
3259 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FminD, "fmin.d ${reg1}, ${reg2}, ${reg3}"),
3260 "fmin.d");
3261}
3262
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +00003263TEST_F(AssemblerMIPS64Test, Ffint_sW) {
3264 DriverStr(RepeatVV(&mips64::Mips64Assembler::Ffint_sW, "ffint_s.w ${reg1}, ${reg2}"),
3265 "ffint_s.w");
3266}
3267
3268TEST_F(AssemblerMIPS64Test, Ffint_sD) {
3269 DriverStr(RepeatVV(&mips64::Mips64Assembler::Ffint_sD, "ffint_s.d ${reg1}, ${reg2}"),
3270 "ffint_s.d");
3271}
3272
3273TEST_F(AssemblerMIPS64Test, Ftint_sW) {
3274 DriverStr(RepeatVV(&mips64::Mips64Assembler::Ftint_sW, "ftint_s.w ${reg1}, ${reg2}"),
3275 "ftint_s.w");
3276}
3277
3278TEST_F(AssemblerMIPS64Test, Ftint_sD) {
3279 DriverStr(RepeatVV(&mips64::Mips64Assembler::Ftint_sD, "ftint_s.d ${reg1}, ${reg2}"),
3280 "ftint_s.d");
3281}
3282
3283TEST_F(AssemblerMIPS64Test, SllB) {
3284 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SllB, "sll.b ${reg1}, ${reg2}, ${reg3}"), "sll.b");
3285}
3286
3287TEST_F(AssemblerMIPS64Test, SllH) {
3288 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SllH, "sll.h ${reg1}, ${reg2}, ${reg3}"), "sll.h");
3289}
3290
3291TEST_F(AssemblerMIPS64Test, SllW) {
3292 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SllW, "sll.w ${reg1}, ${reg2}, ${reg3}"), "sll.w");
3293}
3294
3295TEST_F(AssemblerMIPS64Test, SllD) {
3296 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SllD, "sll.d ${reg1}, ${reg2}, ${reg3}"), "sll.d");
3297}
3298
3299TEST_F(AssemblerMIPS64Test, SraB) {
3300 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SraB, "sra.b ${reg1}, ${reg2}, ${reg3}"), "sra.b");
3301}
3302
3303TEST_F(AssemblerMIPS64Test, SraH) {
3304 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SraH, "sra.h ${reg1}, ${reg2}, ${reg3}"), "sra.h");
3305}
3306
3307TEST_F(AssemblerMIPS64Test, SraW) {
3308 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SraW, "sra.w ${reg1}, ${reg2}, ${reg3}"), "sra.w");
3309}
3310
3311TEST_F(AssemblerMIPS64Test, SraD) {
3312 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SraD, "sra.d ${reg1}, ${reg2}, ${reg3}"), "sra.d");
3313}
3314
3315TEST_F(AssemblerMIPS64Test, SrlB) {
3316 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SrlB, "srl.b ${reg1}, ${reg2}, ${reg3}"), "srl.b");
3317}
3318
3319TEST_F(AssemblerMIPS64Test, SrlH) {
3320 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SrlH, "srl.h ${reg1}, ${reg2}, ${reg3}"), "srl.h");
3321}
3322
3323TEST_F(AssemblerMIPS64Test, SrlW) {
3324 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SrlW, "srl.w ${reg1}, ${reg2}, ${reg3}"), "srl.w");
3325}
3326
3327TEST_F(AssemblerMIPS64Test, SrlD) {
3328 DriverStr(RepeatVVV(&mips64::Mips64Assembler::SrlD, "srl.d ${reg1}, ${reg2}, ${reg3}"), "srl.d");
3329}
3330
3331TEST_F(AssemblerMIPS64Test, SlliB) {
3332 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SlliB, 3, "slli.b ${reg1}, ${reg2}, {imm}"),
3333 "slli.b");
3334}
3335
3336TEST_F(AssemblerMIPS64Test, SlliH) {
3337 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SlliH, 4, "slli.h ${reg1}, ${reg2}, {imm}"),
3338 "slli.h");
3339}
3340
3341TEST_F(AssemblerMIPS64Test, SlliW) {
3342 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SlliW, 5, "slli.w ${reg1}, ${reg2}, {imm}"),
3343 "slli.w");
3344}
3345
3346TEST_F(AssemblerMIPS64Test, SlliD) {
3347 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SlliD, 6, "slli.d ${reg1}, ${reg2}, {imm}"),
3348 "slli.d");
3349}
3350
3351TEST_F(AssemblerMIPS64Test, MoveV) {
3352 DriverStr(RepeatVV(&mips64::Mips64Assembler::MoveV, "move.v ${reg1}, ${reg2}"), "move.v");
3353}
3354
3355TEST_F(AssemblerMIPS64Test, SplatiB) {
3356 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SplatiB, 4, "splati.b ${reg1}, ${reg2}[{imm}]"),
3357 "splati.b");
3358}
3359
3360TEST_F(AssemblerMIPS64Test, SplatiH) {
3361 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SplatiH, 3, "splati.h ${reg1}, ${reg2}[{imm}]"),
3362 "splati.h");
3363}
3364
3365TEST_F(AssemblerMIPS64Test, SplatiW) {
3366 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SplatiW, 2, "splati.w ${reg1}, ${reg2}[{imm}]"),
3367 "splati.w");
3368}
3369
3370TEST_F(AssemblerMIPS64Test, SplatiD) {
3371 DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SplatiD, 1, "splati.d ${reg1}, ${reg2}[{imm}]"),
3372 "splati.d");
3373}
3374
3375TEST_F(AssemblerMIPS64Test, FillB) {
3376 DriverStr(RepeatVR(&mips64::Mips64Assembler::FillB, "fill.b ${reg1}, ${reg2}"), "fill.b");
3377}
3378
3379TEST_F(AssemblerMIPS64Test, FillH) {
3380 DriverStr(RepeatVR(&mips64::Mips64Assembler::FillH, "fill.h ${reg1}, ${reg2}"), "fill.h");
3381}
3382
3383TEST_F(AssemblerMIPS64Test, FillW) {
3384 DriverStr(RepeatVR(&mips64::Mips64Assembler::FillW, "fill.w ${reg1}, ${reg2}"), "fill.w");
3385}
3386
3387TEST_F(AssemblerMIPS64Test, FillD) {
3388 DriverStr(RepeatVR(&mips64::Mips64Assembler::FillD, "fill.d ${reg1}, ${reg2}"), "fill.d");
3389}
3390
Goran Jakovljevic3f444032017-03-31 14:38:20 +02003391TEST_F(AssemblerMIPS64Test, LdiB) {
3392 DriverStr(RepeatVIb(&mips64::Mips64Assembler::LdiB, -8, "ldi.b ${reg}, {imm}"), "ldi.b");
3393}
3394
3395TEST_F(AssemblerMIPS64Test, LdiH) {
3396 DriverStr(RepeatVIb(&mips64::Mips64Assembler::LdiH, -10, "ldi.h ${reg}, {imm}"), "ldi.h");
3397}
3398
3399TEST_F(AssemblerMIPS64Test, LdiW) {
3400 DriverStr(RepeatVIb(&mips64::Mips64Assembler::LdiW, -10, "ldi.w ${reg}, {imm}"), "ldi.w");
3401}
3402
3403TEST_F(AssemblerMIPS64Test, LdiD) {
3404 DriverStr(RepeatVIb(&mips64::Mips64Assembler::LdiD, -10, "ldi.d ${reg}, {imm}"), "ldi.d");
3405}
3406
Goran Jakovljevic5a9e51d2017-03-16 16:11:43 +00003407TEST_F(AssemblerMIPS64Test, LdB) {
3408 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::LdB, -10, "ld.b ${reg1}, {imm}(${reg2})"), "ld.b");
3409}
3410
3411TEST_F(AssemblerMIPS64Test, LdH) {
3412 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::LdH, -10, "ld.h ${reg1}, {imm}(${reg2})", 0, 2),
3413 "ld.h");
3414}
3415
3416TEST_F(AssemblerMIPS64Test, LdW) {
3417 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::LdW, -10, "ld.w ${reg1}, {imm}(${reg2})", 0, 4),
3418 "ld.w");
3419}
3420
3421TEST_F(AssemblerMIPS64Test, LdD) {
3422 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::LdD, -10, "ld.d ${reg1}, {imm}(${reg2})", 0, 8),
3423 "ld.d");
3424}
3425
3426TEST_F(AssemblerMIPS64Test, StB) {
3427 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::StB, -10, "st.b ${reg1}, {imm}(${reg2})"), "st.b");
3428}
3429
3430TEST_F(AssemblerMIPS64Test, StH) {
3431 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::StH, -10, "st.h ${reg1}, {imm}(${reg2})", 0, 2),
3432 "st.h");
3433}
3434
3435TEST_F(AssemblerMIPS64Test, StW) {
3436 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::StW, -10, "st.w ${reg1}, {imm}(${reg2})", 0, 4),
3437 "st.w");
3438}
3439
3440TEST_F(AssemblerMIPS64Test, StD) {
3441 DriverStr(RepeatVRIb(&mips64::Mips64Assembler::StD, -10, "st.d ${reg1}, {imm}(${reg2})", 0, 8),
3442 "st.d");
3443}
3444
Goran Jakovljevic38370112017-05-10 14:30:28 +02003445TEST_F(AssemblerMIPS64Test, IlvrB) {
3446 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvrB, "ilvr.b ${reg1}, ${reg2}, ${reg3}"),
3447 "ilvr.b");
3448}
3449
3450TEST_F(AssemblerMIPS64Test, IlvrH) {
3451 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvrH, "ilvr.h ${reg1}, ${reg2}, ${reg3}"),
3452 "ilvr.h");
3453}
3454
3455TEST_F(AssemblerMIPS64Test, IlvrW) {
3456 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvrW, "ilvr.w ${reg1}, ${reg2}, ${reg3}"),
3457 "ilvr.w");
3458}
3459
3460TEST_F(AssemblerMIPS64Test, IlvrD) {
3461 DriverStr(RepeatVVV(&mips64::Mips64Assembler::IlvrD, "ilvr.d ${reg1}, ${reg2}, ${reg3}"),
3462 "ilvr.d");
3463}
3464
Lena Djokicb3d79e42017-07-25 11:20:52 +02003465TEST_F(AssemblerMIPS64Test, MaddvB) {
3466 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MaddvB, "maddv.b ${reg1}, ${reg2}, ${reg3}"),
3467 "maddv.b");
3468}
3469
3470TEST_F(AssemblerMIPS64Test, MaddvH) {
3471 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MaddvH, "maddv.h ${reg1}, ${reg2}, ${reg3}"),
3472 "maddv.h");
3473}
3474
3475TEST_F(AssemblerMIPS64Test, MaddvW) {
3476 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MaddvW, "maddv.w ${reg1}, ${reg2}, ${reg3}"),
3477 "maddv.w");
3478}
3479
3480TEST_F(AssemblerMIPS64Test, MaddvD) {
3481 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MaddvD, "maddv.d ${reg1}, ${reg2}, ${reg3}"),
3482 "maddv.d");
3483}
3484
3485TEST_F(AssemblerMIPS64Test, MsubvB) {
3486 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MsubvB, "msubv.b ${reg1}, ${reg2}, ${reg3}"),
3487 "msubv.b");
3488}
3489
3490TEST_F(AssemblerMIPS64Test, MsubvH) {
3491 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MsubvH, "msubv.h ${reg1}, ${reg2}, ${reg3}"),
3492 "msubv.h");
3493}
3494
3495TEST_F(AssemblerMIPS64Test, MsubvW) {
3496 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MsubvW, "msubv.w ${reg1}, ${reg2}, ${reg3}"),
3497 "msubv.w");
3498}
3499
3500TEST_F(AssemblerMIPS64Test, MsubvD) {
3501 DriverStr(RepeatVVV(&mips64::Mips64Assembler::MsubvD, "msubv.d ${reg1}, ${reg2}, ${reg3}"),
3502 "msubv.d");
3503}
3504
3505TEST_F(AssemblerMIPS64Test, FmaddW) {
3506 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmaddW, "fmadd.w ${reg1}, ${reg2}, ${reg3}"),
3507 "fmadd.w");
3508}
3509
3510TEST_F(AssemblerMIPS64Test, FmaddD) {
3511 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmaddD, "fmadd.d ${reg1}, ${reg2}, ${reg3}"),
3512 "fmadd.d");
3513}
3514
3515TEST_F(AssemblerMIPS64Test, FmsubW) {
3516 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmsubW, "fmsub.w ${reg1}, ${reg2}, ${reg3}"),
3517 "fmsub.w");
3518}
3519
3520TEST_F(AssemblerMIPS64Test, FmsubD) {
3521 DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmsubD, "fmsub.d ${reg1}, ${reg2}, ${reg3}"),
3522 "fmsub.d");
3523}
3524
Lazar Trsicd9672662015-09-03 17:33:01 +02003525#undef __
3526
Chris Larsendbce0d72015-09-17 13:34:00 -07003527} // namespace art