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