blob: 419ef35526b4299649a8c1ce902d6eb07409e052 [file] [log] [blame]
mstarzinger@chromium.org3233d2f2012-03-14 11:16:03 +00001// Copyright 2012 the V8 project authors. All rights reserved.
ager@chromium.org5c838252010-02-19 08:53:10 +00002// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28#include "v8.h"
29
30#include "disassembler.h"
31#include "factory.h"
32#include "macro-assembler.h"
33#include "mips/macro-assembler-mips.h"
34#include "mips/simulator-mips.h"
35
36#include "cctest.h"
37
38using namespace v8::internal;
39
40
41// Define these function prototypes to match JSEntryFunction in execution.cc.
42typedef Object* (*F1)(int x, int p1, int p2, int p3, int p4);
43typedef Object* (*F2)(int x, int y, int p2, int p3, int p4);
44typedef Object* (*F3)(void* p, int p1, int p2, int p3, int p4);
45
46
ager@chromium.org5c838252010-02-19 08:53:10 +000047#define __ assm.
48
lrn@chromium.org7516f052011-03-30 08:52:27 +000049
ager@chromium.org5c838252010-02-19 08:53:10 +000050TEST(MIPS0) {
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +000051 CcTest::InitializeVM();
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +000052 Isolate* isolate = Isolate::Current();
53 HandleScope scope(isolate);
ager@chromium.org5c838252010-02-19 08:53:10 +000054
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +000055 MacroAssembler assm(isolate, NULL, 0);
ager@chromium.org5c838252010-02-19 08:53:10 +000056
57 // Addition.
58 __ addu(v0, a0, a1);
59 __ jr(ra);
60 __ nop();
61
62 CodeDesc desc;
63 assm.GetCode(&desc);
lrn@chromium.org7516f052011-03-30 08:52:27 +000064 Object* code = HEAP->CreateCode(
65 desc,
66 Code::ComputeFlags(Code::STUB),
ulan@chromium.org09d7ab52013-02-25 15:50:35 +000067 Handle<Code>())->ToObjectChecked();
ager@chromium.org5c838252010-02-19 08:53:10 +000068 CHECK(code->IsCode());
ager@chromium.org5c838252010-02-19 08:53:10 +000069 F2 f = FUNCTION_CAST<F2>(Code::cast(code)->entry());
70 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 0xab0, 0xc, 0, 0, 0));
71 ::printf("f() = %d\n", res);
72 CHECK_EQ(0xabc, res);
73}
74
75
76TEST(MIPS1) {
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +000077 CcTest::InitializeVM();
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +000078 Isolate* isolate = Isolate::Current();
79 HandleScope scope(isolate);
ager@chromium.org5c838252010-02-19 08:53:10 +000080
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +000081 MacroAssembler assm(isolate, NULL, 0);
ager@chromium.org5c838252010-02-19 08:53:10 +000082 Label L, C;
83
84 __ mov(a1, a0);
85 __ li(v0, 0);
86 __ b(&C);
87 __ nop();
88
89 __ bind(&L);
lrn@chromium.org7516f052011-03-30 08:52:27 +000090 __ addu(v0, v0, a1);
ager@chromium.org5c838252010-02-19 08:53:10 +000091 __ addiu(a1, a1, -1);
92
93 __ bind(&C);
94 __ xori(v1, a1, 0);
lrn@chromium.org7516f052011-03-30 08:52:27 +000095 __ Branch(&L, ne, v1, Operand(0));
ager@chromium.org5c838252010-02-19 08:53:10 +000096 __ nop();
97
98 __ jr(ra);
99 __ nop();
100
101 CodeDesc desc;
102 assm.GetCode(&desc);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000103 Object* code = HEAP->CreateCode(
104 desc,
105 Code::ComputeFlags(Code::STUB),
ulan@chromium.org09d7ab52013-02-25 15:50:35 +0000106 Handle<Code>())->ToObjectChecked();
ager@chromium.org5c838252010-02-19 08:53:10 +0000107 CHECK(code->IsCode());
ager@chromium.org5c838252010-02-19 08:53:10 +0000108 F1 f = FUNCTION_CAST<F1>(Code::cast(code)->entry());
109 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 50, 0, 0, 0, 0));
110 ::printf("f() = %d\n", res);
111 CHECK_EQ(1275, res);
112}
113
114
115TEST(MIPS2) {
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000116 CcTest::InitializeVM();
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000117 Isolate* isolate = Isolate::Current();
118 HandleScope scope(isolate);
ager@chromium.org5c838252010-02-19 08:53:10 +0000119
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000120 MacroAssembler assm(isolate, NULL, 0);
ager@chromium.org5c838252010-02-19 08:53:10 +0000121
122 Label exit, error;
123
124 // ----- Test all instructions.
125
126 // Test lui, ori, and addiu, used in the li pseudo-instruction.
127 // This way we can then safely load registers with chosen values.
128
129 __ ori(t0, zero_reg, 0);
130 __ lui(t0, 0x1234);
131 __ ori(t0, t0, 0);
132 __ ori(t0, t0, 0x0f0f);
133 __ ori(t0, t0, 0xf0f0);
134 __ addiu(t1, t0, 1);
135 __ addiu(t2, t1, -0x10);
136
137 // Load values in temporary registers.
138 __ li(t0, 0x00000004);
139 __ li(t1, 0x00001234);
140 __ li(t2, 0x12345678);
141 __ li(t3, 0x7fffffff);
142 __ li(t4, 0xfffffffc);
143 __ li(t5, 0xffffedcc);
144 __ li(t6, 0xedcba988);
145 __ li(t7, 0x80000000);
146
147 // SPECIAL class.
148 __ srl(v0, t2, 8); // 0x00123456
149 __ sll(v0, v0, 11); // 0x91a2b000
150 __ sra(v0, v0, 3); // 0xf2345600
151 __ srav(v0, v0, t0); // 0xff234560
152 __ sllv(v0, v0, t0); // 0xf2345600
153 __ srlv(v0, v0, t0); // 0x0f234560
lrn@chromium.org7516f052011-03-30 08:52:27 +0000154 __ Branch(&error, ne, v0, Operand(0x0f234560));
ager@chromium.org5c838252010-02-19 08:53:10 +0000155 __ nop();
156
lrn@chromium.org7516f052011-03-30 08:52:27 +0000157 __ addu(v0, t0, t1); // 0x00001238
158 __ subu(v0, v0, t0); // 0x00001234
159 __ Branch(&error, ne, v0, Operand(0x00001234));
ager@chromium.org5c838252010-02-19 08:53:10 +0000160 __ nop();
161 __ addu(v1, t3, t0);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000162 __ Branch(&error, ne, v1, Operand(0x80000003));
ager@chromium.org5c838252010-02-19 08:53:10 +0000163 __ nop();
164 __ subu(v1, t7, t0); // 0x7ffffffc
lrn@chromium.org7516f052011-03-30 08:52:27 +0000165 __ Branch(&error, ne, v1, Operand(0x7ffffffc));
ager@chromium.org5c838252010-02-19 08:53:10 +0000166 __ nop();
167
168 __ and_(v0, t1, t2); // 0x00001230
169 __ or_(v0, v0, t1); // 0x00001234
170 __ xor_(v0, v0, t2); // 0x1234444c
171 __ nor(v0, v0, t2); // 0xedcba987
lrn@chromium.org7516f052011-03-30 08:52:27 +0000172 __ Branch(&error, ne, v0, Operand(0xedcba983));
ager@chromium.org5c838252010-02-19 08:53:10 +0000173 __ nop();
174
175 __ slt(v0, t7, t3);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000176 __ Branch(&error, ne, v0, Operand(0x1));
ager@chromium.org5c838252010-02-19 08:53:10 +0000177 __ nop();
178 __ sltu(v0, t7, t3);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000179 __ Branch(&error, ne, v0, Operand(0x0));
ager@chromium.org5c838252010-02-19 08:53:10 +0000180 __ nop();
181 // End of SPECIAL class.
182
lrn@chromium.org7516f052011-03-30 08:52:27 +0000183 __ addiu(v0, zero_reg, 0x7421); // 0x00007421
184 __ addiu(v0, v0, -0x1); // 0x00007420
ager@chromium.org5c838252010-02-19 08:53:10 +0000185 __ addiu(v0, v0, -0x20); // 0x00007400
lrn@chromium.org7516f052011-03-30 08:52:27 +0000186 __ Branch(&error, ne, v0, Operand(0x00007400));
ager@chromium.org5c838252010-02-19 08:53:10 +0000187 __ nop();
188 __ addiu(v1, t3, 0x1); // 0x80000000
lrn@chromium.org7516f052011-03-30 08:52:27 +0000189 __ Branch(&error, ne, v1, Operand(0x80000000));
ager@chromium.org5c838252010-02-19 08:53:10 +0000190 __ nop();
191
192 __ slti(v0, t1, 0x00002000); // 0x1
193 __ slti(v0, v0, 0xffff8000); // 0x0
lrn@chromium.org7516f052011-03-30 08:52:27 +0000194 __ Branch(&error, ne, v0, Operand(0x0));
ager@chromium.org5c838252010-02-19 08:53:10 +0000195 __ nop();
196 __ sltiu(v0, t1, 0x00002000); // 0x1
197 __ sltiu(v0, v0, 0x00008000); // 0x1
lrn@chromium.org7516f052011-03-30 08:52:27 +0000198 __ Branch(&error, ne, v0, Operand(0x1));
ager@chromium.org5c838252010-02-19 08:53:10 +0000199 __ nop();
200
201 __ andi(v0, t1, 0xf0f0); // 0x00001030
202 __ ori(v0, v0, 0x8a00); // 0x00009a30
203 __ xori(v0, v0, 0x83cc); // 0x000019fc
lrn@chromium.org7516f052011-03-30 08:52:27 +0000204 __ Branch(&error, ne, v0, Operand(0x000019fc));
ager@chromium.org5c838252010-02-19 08:53:10 +0000205 __ nop();
206 __ lui(v1, 0x8123); // 0x81230000
lrn@chromium.org7516f052011-03-30 08:52:27 +0000207 __ Branch(&error, ne, v1, Operand(0x81230000));
ager@chromium.org5c838252010-02-19 08:53:10 +0000208 __ nop();
209
lrn@chromium.org7516f052011-03-30 08:52:27 +0000210 // Bit twiddling instructions & conditional moves.
211 // Uses t0-t7 as set above.
mstarzinger@chromium.org3233d2f2012-03-14 11:16:03 +0000212 __ Clz(v0, t0); // 29
213 __ Clz(v1, t1); // 19
lrn@chromium.org7516f052011-03-30 08:52:27 +0000214 __ addu(v0, v0, v1); // 48
mstarzinger@chromium.org3233d2f2012-03-14 11:16:03 +0000215 __ Clz(v1, t2); // 3
lrn@chromium.org7516f052011-03-30 08:52:27 +0000216 __ addu(v0, v0, v1); // 51
mstarzinger@chromium.org3233d2f2012-03-14 11:16:03 +0000217 __ Clz(v1, t7); // 0
lrn@chromium.org7516f052011-03-30 08:52:27 +0000218 __ addu(v0, v0, v1); // 51
219 __ Branch(&error, ne, v0, Operand(51));
mstarzinger@chromium.org3233d2f2012-03-14 11:16:03 +0000220 __ Movn(a0, t3, t0); // Move a0<-t3 (t0 is NOT 0).
lrn@chromium.org7516f052011-03-30 08:52:27 +0000221 __ Ins(a0, t1, 12, 8); // 0x7ff34fff
222 __ Branch(&error, ne, a0, Operand(0x7ff34fff));
mstarzinger@chromium.org3233d2f2012-03-14 11:16:03 +0000223 __ Movz(a0, t6, t7); // a0 not updated (t7 is NOT 0).
lrn@chromium.org7516f052011-03-30 08:52:27 +0000224 __ Ext(a1, a0, 8, 12); // 0x34f
225 __ Branch(&error, ne, a1, Operand(0x34f));
mstarzinger@chromium.org3233d2f2012-03-14 11:16:03 +0000226 __ Movz(a0, t6, v1); // a0<-t6, v0 is 0, from 8 instr back.
lrn@chromium.org7516f052011-03-30 08:52:27 +0000227 __ Branch(&error, ne, a0, Operand(t6));
228
ager@chromium.org5c838252010-02-19 08:53:10 +0000229 // Everything was correctly executed. Load the expected result.
230 __ li(v0, 0x31415926);
231 __ b(&exit);
232 __ nop();
233
234 __ bind(&error);
235 // Got an error. Return a wrong result.
lrn@chromium.org7516f052011-03-30 08:52:27 +0000236 __ li(v0, 666);
ager@chromium.org5c838252010-02-19 08:53:10 +0000237
238 __ bind(&exit);
239 __ jr(ra);
240 __ nop();
241
242 CodeDesc desc;
243 assm.GetCode(&desc);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000244 Object* code = HEAP->CreateCode(
245 desc,
246 Code::ComputeFlags(Code::STUB),
ulan@chromium.org09d7ab52013-02-25 15:50:35 +0000247 Handle<Code>())->ToObjectChecked();
ager@chromium.org5c838252010-02-19 08:53:10 +0000248 CHECK(code->IsCode());
ager@chromium.org5c838252010-02-19 08:53:10 +0000249 F2 f = FUNCTION_CAST<F2>(Code::cast(code)->entry());
250 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 0xab0, 0xc, 0, 0, 0));
251 ::printf("f() = %d\n", res);
252 CHECK_EQ(0x31415926, res);
253}
254
lrn@chromium.org7516f052011-03-30 08:52:27 +0000255
256TEST(MIPS3) {
257 // Test floating point instructions.
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000258 CcTest::InitializeVM();
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000259 Isolate* isolate = Isolate::Current();
260 HandleScope scope(isolate);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000261
262 typedef struct {
263 double a;
264 double b;
265 double c;
266 double d;
267 double e;
268 double f;
269 double g;
jkummerow@chromium.org59297c72013-01-09 16:32:23 +0000270 double h;
271 double i;
lrn@chromium.org7516f052011-03-30 08:52:27 +0000272 } T;
273 T t;
274
275 // Create a function that accepts &t, and loads, manipulates, and stores
276 // the doubles t.a ... t.f.
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000277 MacroAssembler assm(isolate, NULL, 0);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000278 Label L, C;
279
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000280 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
281 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) );
282 __ add_d(f8, f4, f6);
283 __ sdc1(f8, MemOperand(a0, OFFSET_OF(T, c)) ); // c = a + b.
lrn@chromium.org7516f052011-03-30 08:52:27 +0000284
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000285 __ mov_d(f10, f8); // c
286 __ neg_d(f12, f6); // -b
287 __ sub_d(f10, f10, f12);
288 __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, d)) ); // d = c - (-b).
lrn@chromium.org7516f052011-03-30 08:52:27 +0000289
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000290 __ sdc1(f4, MemOperand(a0, OFFSET_OF(T, b)) ); // b = a.
lrn@chromium.org7516f052011-03-30 08:52:27 +0000291
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000292 __ li(t0, 120);
293 __ mtc1(t0, f14);
294 __ cvt_d_w(f14, f14); // f14 = 120.0.
295 __ mul_d(f10, f10, f14);
296 __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, e)) ); // e = d * 120 = 1.8066e16.
lrn@chromium.org7516f052011-03-30 08:52:27 +0000297
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000298 __ div_d(f12, f10, f4);
299 __ sdc1(f12, MemOperand(a0, OFFSET_OF(T, f)) ); // f = e / a = 120.44.
lrn@chromium.org7516f052011-03-30 08:52:27 +0000300
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000301 __ sqrt_d(f14, f12);
302 __ sdc1(f14, MemOperand(a0, OFFSET_OF(T, g)) );
303 // g = sqrt(f) = 10.97451593465515908537
lrn@chromium.org7516f052011-03-30 08:52:27 +0000304
jkummerow@chromium.org59297c72013-01-09 16:32:23 +0000305 if (kArchVariant == kMips32r2) {
306 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, h)) );
307 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, i)) );
308 __ madd_d(f14, f6, f4, f6);
309 __ sdc1(f14, MemOperand(a0, OFFSET_OF(T, h)) );
310 }
311
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000312 __ jr(ra);
313 __ nop();
lrn@chromium.org7516f052011-03-30 08:52:27 +0000314
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000315 CodeDesc desc;
316 assm.GetCode(&desc);
317 Object* code = HEAP->CreateCode(
318 desc,
319 Code::ComputeFlags(Code::STUB),
320 Handle<Code>())->ToObjectChecked();
321 CHECK(code->IsCode());
322 F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
323 t.a = 1.5e14;
324 t.b = 2.75e11;
325 t.c = 0.0;
326 t.d = 0.0;
327 t.e = 0.0;
328 t.f = 0.0;
329 t.h = 1.5;
330 t.i = 2.75;
331 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
332 USE(dummy);
333 CHECK_EQ(1.5e14, t.a);
334 CHECK_EQ(1.5e14, t.b);
335 CHECK_EQ(1.50275e14, t.c);
336 CHECK_EQ(1.50550e14, t.d);
337 CHECK_EQ(1.8066e16, t.e);
338 CHECK_EQ(120.44, t.f);
339 CHECK_EQ(10.97451593465515908537, t.g);
340 CHECK_EQ(6.875, t.h);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000341}
342
343
344TEST(MIPS4) {
345 // Test moves between floating point and integer registers.
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000346 CcTest::InitializeVM();
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000347 Isolate* isolate = Isolate::Current();
348 HandleScope scope(isolate);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000349
350 typedef struct {
351 double a;
352 double b;
353 double c;
354 } T;
355 T t;
356
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000357 Assembler assm(isolate, NULL, 0);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000358 Label L, C;
359
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000360 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
361 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) );
lrn@chromium.org7516f052011-03-30 08:52:27 +0000362
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000363 // Swap f4 and f6, by using four integer registers, t0-t3.
364 __ mfc1(t0, f4);
365 __ mfc1(t1, f5);
366 __ mfc1(t2, f6);
367 __ mfc1(t3, f7);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000368
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000369 __ mtc1(t0, f6);
370 __ mtc1(t1, f7);
371 __ mtc1(t2, f4);
372 __ mtc1(t3, f5);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000373
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000374 // Store the swapped f4 and f5 back to memory.
375 __ sdc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
376 __ sdc1(f6, MemOperand(a0, OFFSET_OF(T, c)) );
lrn@chromium.org7516f052011-03-30 08:52:27 +0000377
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000378 __ jr(ra);
379 __ nop();
lrn@chromium.org7516f052011-03-30 08:52:27 +0000380
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000381 CodeDesc desc;
382 assm.GetCode(&desc);
383 Object* code = HEAP->CreateCode(
384 desc,
385 Code::ComputeFlags(Code::STUB),
386 Handle<Code>())->ToObjectChecked();
387 CHECK(code->IsCode());
388 F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
389 t.a = 1.5e22;
390 t.b = 2.75e11;
391 t.c = 17.17;
392 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
393 USE(dummy);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000394
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000395 CHECK_EQ(2.75e11, t.a);
396 CHECK_EQ(2.75e11, t.b);
397 CHECK_EQ(1.5e22, t.c);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000398}
399
400
401TEST(MIPS5) {
402 // Test conversions between doubles and integers.
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000403 CcTest::InitializeVM();
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000404 Isolate* isolate = Isolate::Current();
405 HandleScope scope(isolate);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000406
407 typedef struct {
408 double a;
409 double b;
410 int i;
411 int j;
412 } T;
413 T t;
414
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000415 Assembler assm(isolate, NULL, 0);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000416 Label L, C;
417
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000418 // Load all structure elements to registers.
419 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
420 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) );
421 __ lw(t0, MemOperand(a0, OFFSET_OF(T, i)) );
422 __ lw(t1, MemOperand(a0, OFFSET_OF(T, j)) );
lrn@chromium.org7516f052011-03-30 08:52:27 +0000423
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000424 // Convert double in f4 to int in element i.
425 __ cvt_w_d(f8, f4);
426 __ mfc1(t2, f8);
427 __ sw(t2, MemOperand(a0, OFFSET_OF(T, i)) );
lrn@chromium.org7516f052011-03-30 08:52:27 +0000428
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000429 // Convert double in f6 to int in element j.
430 __ cvt_w_d(f10, f6);
431 __ mfc1(t3, f10);
432 __ sw(t3, MemOperand(a0, OFFSET_OF(T, j)) );
lrn@chromium.org7516f052011-03-30 08:52:27 +0000433
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000434 // Convert int in original i (t0) to double in a.
435 __ mtc1(t0, f12);
436 __ cvt_d_w(f0, f12);
437 __ sdc1(f0, MemOperand(a0, OFFSET_OF(T, a)) );
lrn@chromium.org7516f052011-03-30 08:52:27 +0000438
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000439 // Convert int in original j (t1) to double in b.
440 __ mtc1(t1, f14);
441 __ cvt_d_w(f2, f14);
442 __ sdc1(f2, MemOperand(a0, OFFSET_OF(T, b)) );
lrn@chromium.org7516f052011-03-30 08:52:27 +0000443
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000444 __ jr(ra);
445 __ nop();
lrn@chromium.org7516f052011-03-30 08:52:27 +0000446
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000447 CodeDesc desc;
448 assm.GetCode(&desc);
449 Object* code = HEAP->CreateCode(
450 desc,
451 Code::ComputeFlags(Code::STUB),
452 Handle<Code>())->ToObjectChecked();
453 CHECK(code->IsCode());
454 F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
455 t.a = 1.5e4;
456 t.b = 2.75e8;
457 t.i = 12345678;
458 t.j = -100000;
459 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
460 USE(dummy);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000461
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000462 CHECK_EQ(12345678.0, t.a);
463 CHECK_EQ(-100000.0, t.b);
464 CHECK_EQ(15000, t.i);
465 CHECK_EQ(275000000, t.j);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000466}
467
468
469TEST(MIPS6) {
470 // Test simple memory loads and stores.
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000471 CcTest::InitializeVM();
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000472 Isolate* isolate = Isolate::Current();
473 HandleScope scope(isolate);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000474
475 typedef struct {
476 uint32_t ui;
477 int32_t si;
478 int32_t r1;
479 int32_t r2;
480 int32_t r3;
481 int32_t r4;
482 int32_t r5;
483 int32_t r6;
484 } T;
485 T t;
486
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000487 Assembler assm(isolate, NULL, 0);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000488 Label L, C;
489
490 // Basic word load/store.
491 __ lw(t0, MemOperand(a0, OFFSET_OF(T, ui)) );
492 __ sw(t0, MemOperand(a0, OFFSET_OF(T, r1)) );
493
494 // lh with positive data.
495 __ lh(t1, MemOperand(a0, OFFSET_OF(T, ui)) );
496 __ sw(t1, MemOperand(a0, OFFSET_OF(T, r2)) );
497
498 // lh with negative data.
499 __ lh(t2, MemOperand(a0, OFFSET_OF(T, si)) );
500 __ sw(t2, MemOperand(a0, OFFSET_OF(T, r3)) );
501
502 // lhu with negative data.
503 __ lhu(t3, MemOperand(a0, OFFSET_OF(T, si)) );
504 __ sw(t3, MemOperand(a0, OFFSET_OF(T, r4)) );
505
506 // lb with negative data.
507 __ lb(t4, MemOperand(a0, OFFSET_OF(T, si)) );
508 __ sw(t4, MemOperand(a0, OFFSET_OF(T, r5)) );
509
510 // sh writes only 1/2 of word.
511 __ lui(t5, 0x3333);
512 __ ori(t5, t5, 0x3333);
513 __ sw(t5, MemOperand(a0, OFFSET_OF(T, r6)) );
514 __ lhu(t5, MemOperand(a0, OFFSET_OF(T, si)) );
515 __ sh(t5, MemOperand(a0, OFFSET_OF(T, r6)) );
516
517 __ jr(ra);
518 __ nop();
519
520 CodeDesc desc;
521 assm.GetCode(&desc);
522 Object* code = HEAP->CreateCode(
523 desc,
524 Code::ComputeFlags(Code::STUB),
ulan@chromium.org09d7ab52013-02-25 15:50:35 +0000525 Handle<Code>())->ToObjectChecked();
lrn@chromium.org7516f052011-03-30 08:52:27 +0000526 CHECK(code->IsCode());
527 F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
528 t.ui = 0x11223344;
529 t.si = 0x99aabbcc;
530 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
531 USE(dummy);
532
533 CHECK_EQ(0x11223344, t.r1);
534 CHECK_EQ(0x3344, t.r2);
535 CHECK_EQ(0xffffbbcc, t.r3);
536 CHECK_EQ(0x0000bbcc, t.r4);
537 CHECK_EQ(0xffffffcc, t.r5);
538 CHECK_EQ(0x3333bbcc, t.r6);
539}
540
541
542TEST(MIPS7) {
543 // Test floating point compare and branch instructions.
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000544 CcTest::InitializeVM();
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000545 Isolate* isolate = Isolate::Current();
546 HandleScope scope(isolate);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000547
548 typedef struct {
549 double a;
550 double b;
551 double c;
552 double d;
553 double e;
554 double f;
555 int32_t result;
556 } T;
557 T t;
558
559 // Create a function that accepts &t, and loads, manipulates, and stores
560 // the doubles t.a ... t.f.
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000561 MacroAssembler assm(isolate, NULL, 0);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000562 Label neither_is_nan, less_than, outa_here;
563
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000564 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
565 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) );
566 __ c(UN, D, f4, f6);
567 __ bc1f(&neither_is_nan);
568 __ nop();
569 __ sw(zero_reg, MemOperand(a0, OFFSET_OF(T, result)) );
570 __ Branch(&outa_here);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000571
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000572 __ bind(&neither_is_nan);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000573
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000574 if (kArchVariant == kLoongson) {
575 __ c(OLT, D, f6, f4);
576 __ bc1t(&less_than);
577 } else {
578 __ c(OLT, D, f6, f4, 2);
579 __ bc1t(&less_than, 2);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000580 }
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000581 __ nop();
582 __ sw(zero_reg, MemOperand(a0, OFFSET_OF(T, result)) );
583 __ Branch(&outa_here);
584
585 __ bind(&less_than);
586 __ Addu(t0, zero_reg, Operand(1));
587 __ sw(t0, MemOperand(a0, OFFSET_OF(T, result)) ); // Set true.
588
589
590 // This test-case should have additional tests.
591
592 __ bind(&outa_here);
593
594 __ jr(ra);
595 __ nop();
596
597 CodeDesc desc;
598 assm.GetCode(&desc);
599 Object* code = HEAP->CreateCode(
600 desc,
601 Code::ComputeFlags(Code::STUB),
602 Handle<Code>())->ToObjectChecked();
603 CHECK(code->IsCode());
604 F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
605 t.a = 1.5e14;
606 t.b = 2.75e11;
607 t.c = 2.0;
608 t.d = -4.0;
609 t.e = 0.0;
610 t.f = 0.0;
611 t.result = 0;
612 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
613 USE(dummy);
614 CHECK_EQ(1.5e14, t.a);
615 CHECK_EQ(2.75e11, t.b);
616 CHECK_EQ(1, t.result);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000617}
618
619
620TEST(MIPS8) {
621 // Test ROTR and ROTRV instructions.
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000622 CcTest::InitializeVM();
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000623 Isolate* isolate = Isolate::Current();
624 HandleScope scope(isolate);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000625
626 typedef struct {
627 int32_t input;
628 int32_t result_rotr_4;
629 int32_t result_rotr_8;
630 int32_t result_rotr_12;
631 int32_t result_rotr_16;
632 int32_t result_rotr_20;
633 int32_t result_rotr_24;
634 int32_t result_rotr_28;
635 int32_t result_rotrv_4;
636 int32_t result_rotrv_8;
637 int32_t result_rotrv_12;
638 int32_t result_rotrv_16;
639 int32_t result_rotrv_20;
640 int32_t result_rotrv_24;
641 int32_t result_rotrv_28;
642 } T;
643 T t;
644
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000645 MacroAssembler assm(isolate, NULL, 0);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000646
647 // Basic word load.
648 __ lw(t0, MemOperand(a0, OFFSET_OF(T, input)) );
649
650 // ROTR instruction (called through the Ror macro).
651 __ Ror(t1, t0, 0x0004);
652 __ Ror(t2, t0, 0x0008);
653 __ Ror(t3, t0, 0x000c);
654 __ Ror(t4, t0, 0x0010);
655 __ Ror(t5, t0, 0x0014);
656 __ Ror(t6, t0, 0x0018);
657 __ Ror(t7, t0, 0x001c);
658
659 // Basic word store.
660 __ sw(t1, MemOperand(a0, OFFSET_OF(T, result_rotr_4)) );
661 __ sw(t2, MemOperand(a0, OFFSET_OF(T, result_rotr_8)) );
662 __ sw(t3, MemOperand(a0, OFFSET_OF(T, result_rotr_12)) );
663 __ sw(t4, MemOperand(a0, OFFSET_OF(T, result_rotr_16)) );
664 __ sw(t5, MemOperand(a0, OFFSET_OF(T, result_rotr_20)) );
665 __ sw(t6, MemOperand(a0, OFFSET_OF(T, result_rotr_24)) );
666 __ sw(t7, MemOperand(a0, OFFSET_OF(T, result_rotr_28)) );
667
668 // ROTRV instruction (called through the Ror macro).
669 __ li(t7, 0x0004);
670 __ Ror(t1, t0, t7);
671 __ li(t7, 0x0008);
672 __ Ror(t2, t0, t7);
673 __ li(t7, 0x000C);
674 __ Ror(t3, t0, t7);
675 __ li(t7, 0x0010);
676 __ Ror(t4, t0, t7);
677 __ li(t7, 0x0014);
678 __ Ror(t5, t0, t7);
679 __ li(t7, 0x0018);
680 __ Ror(t6, t0, t7);
681 __ li(t7, 0x001C);
682 __ Ror(t7, t0, t7);
683
684 // Basic word store.
685 __ sw(t1, MemOperand(a0, OFFSET_OF(T, result_rotrv_4)) );
686 __ sw(t2, MemOperand(a0, OFFSET_OF(T, result_rotrv_8)) );
687 __ sw(t3, MemOperand(a0, OFFSET_OF(T, result_rotrv_12)) );
688 __ sw(t4, MemOperand(a0, OFFSET_OF(T, result_rotrv_16)) );
689 __ sw(t5, MemOperand(a0, OFFSET_OF(T, result_rotrv_20)) );
690 __ sw(t6, MemOperand(a0, OFFSET_OF(T, result_rotrv_24)) );
691 __ sw(t7, MemOperand(a0, OFFSET_OF(T, result_rotrv_28)) );
692
693 __ jr(ra);
694 __ nop();
695
696 CodeDesc desc;
697 assm.GetCode(&desc);
698 Object* code = HEAP->CreateCode(
699 desc,
700 Code::ComputeFlags(Code::STUB),
ulan@chromium.org09d7ab52013-02-25 15:50:35 +0000701 Handle<Code>())->ToObjectChecked();
lrn@chromium.org7516f052011-03-30 08:52:27 +0000702 CHECK(code->IsCode());
703 F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
704 t.input = 0x12345678;
705 Object* dummy = CALL_GENERATED_CODE(f, &t, 0x0, 0, 0, 0);
706 USE(dummy);
707 CHECK_EQ(0x81234567, t.result_rotr_4);
708 CHECK_EQ(0x78123456, t.result_rotr_8);
709 CHECK_EQ(0x67812345, t.result_rotr_12);
710 CHECK_EQ(0x56781234, t.result_rotr_16);
711 CHECK_EQ(0x45678123, t.result_rotr_20);
712 CHECK_EQ(0x34567812, t.result_rotr_24);
713 CHECK_EQ(0x23456781, t.result_rotr_28);
714
715 CHECK_EQ(0x81234567, t.result_rotrv_4);
716 CHECK_EQ(0x78123456, t.result_rotrv_8);
717 CHECK_EQ(0x67812345, t.result_rotrv_12);
718 CHECK_EQ(0x56781234, t.result_rotrv_16);
719 CHECK_EQ(0x45678123, t.result_rotrv_20);
720 CHECK_EQ(0x34567812, t.result_rotrv_24);
721 CHECK_EQ(0x23456781, t.result_rotrv_28);
722}
723
724
725TEST(MIPS9) {
726 // Test BRANCH improvements.
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000727 CcTest::InitializeVM();
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000728 Isolate* isolate = Isolate::Current();
729 HandleScope scope(isolate);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000730
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000731 MacroAssembler assm(isolate, NULL, 0);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000732 Label exit, exit2, exit3;
733
734 __ Branch(&exit, ge, a0, Operand(0x00000000));
735 __ Branch(&exit2, ge, a0, Operand(0x00001FFF));
736 __ Branch(&exit3, ge, a0, Operand(0x0001FFFF));
737
738 __ bind(&exit);
739 __ bind(&exit2);
740 __ bind(&exit3);
741 __ jr(ra);
742 __ nop();
743
744 CodeDesc desc;
745 assm.GetCode(&desc);
746 Object* code = HEAP->CreateCode(
747 desc,
748 Code::ComputeFlags(Code::STUB),
ulan@chromium.org09d7ab52013-02-25 15:50:35 +0000749 Handle<Code>())->ToObjectChecked();
lrn@chromium.org7516f052011-03-30 08:52:27 +0000750 CHECK(code->IsCode());
751}
752
753
754TEST(MIPS10) {
755 // Test conversions between doubles and long integers.
756 // Test hos the long ints map to FP regs pairs.
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000757 CcTest::InitializeVM();
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000758 Isolate* isolate = Isolate::Current();
759 HandleScope scope(isolate);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000760
761 typedef struct {
762 double a;
763 double b;
764 int32_t dbl_mant;
765 int32_t dbl_exp;
766 int32_t long_hi;
767 int32_t long_lo;
768 int32_t b_long_hi;
769 int32_t b_long_lo;
770 } T;
771 T t;
772
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000773 Assembler assm(isolate, NULL, 0);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000774 Label L, C;
775
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000776 if (kArchVariant == kMips32r2) {
lrn@chromium.org7516f052011-03-30 08:52:27 +0000777 // Load all structure elements to registers.
778 __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, a)));
779
780 // Save the raw bits of the double.
781 __ mfc1(t0, f0);
782 __ mfc1(t1, f1);
783 __ sw(t0, MemOperand(a0, OFFSET_OF(T, dbl_mant)));
784 __ sw(t1, MemOperand(a0, OFFSET_OF(T, dbl_exp)));
785
786 // Convert double in f0 to long, save hi/lo parts.
787 __ cvt_l_d(f0, f0);
788 __ mfc1(t0, f0); // f0 has LS 32 bits of long.
789 __ mfc1(t1, f1); // f1 has MS 32 bits of long.
790 __ sw(t0, MemOperand(a0, OFFSET_OF(T, long_lo)));
791 __ sw(t1, MemOperand(a0, OFFSET_OF(T, long_hi)));
792
793 // Convert the b long integers to double b.
794 __ lw(t0, MemOperand(a0, OFFSET_OF(T, b_long_lo)));
795 __ lw(t1, MemOperand(a0, OFFSET_OF(T, b_long_hi)));
796 __ mtc1(t0, f8); // f8 has LS 32-bits.
797 __ mtc1(t1, f9); // f9 has MS 32-bits.
798 __ cvt_d_l(f10, f8);
799 __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, b)));
800
801 __ jr(ra);
802 __ nop();
803
804 CodeDesc desc;
805 assm.GetCode(&desc);
806 Object* code = HEAP->CreateCode(
807 desc,
808 Code::ComputeFlags(Code::STUB),
ulan@chromium.org09d7ab52013-02-25 15:50:35 +0000809 Handle<Code>())->ToObjectChecked();
lrn@chromium.org7516f052011-03-30 08:52:27 +0000810 CHECK(code->IsCode());
811 F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
812 t.a = 2.147483647e9; // 0x7fffffff -> 0x41DFFFFFFFC00000 as double.
813 t.b_long_hi = 0x000000ff; // 0xFF00FF00FF -> 0x426FE01FE01FE000 as double.
814 t.b_long_lo = 0x00ff00ff;
815 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
816 USE(dummy);
817
818 CHECK_EQ(0x41DFFFFF, t.dbl_exp);
819 CHECK_EQ(0xFFC00000, t.dbl_mant);
820 CHECK_EQ(0, t.long_hi);
821 CHECK_EQ(0x7fffffff, t.long_lo);
822 // 0xFF00FF00FF -> 1.095233372415e12.
823 CHECK_EQ(1.095233372415e12, t.b);
824 }
825}
826
827
828TEST(MIPS11) {
829 // Test LWL, LWR, SWL and SWR instructions.
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000830 CcTest::InitializeVM();
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000831 Isolate* isolate = Isolate::Current();
832 HandleScope scope(isolate);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000833
834 typedef struct {
835 int32_t reg_init;
836 int32_t mem_init;
837 int32_t lwl_0;
838 int32_t lwl_1;
839 int32_t lwl_2;
840 int32_t lwl_3;
841 int32_t lwr_0;
842 int32_t lwr_1;
843 int32_t lwr_2;
844 int32_t lwr_3;
845 int32_t swl_0;
846 int32_t swl_1;
847 int32_t swl_2;
848 int32_t swl_3;
849 int32_t swr_0;
850 int32_t swr_1;
851 int32_t swr_2;
852 int32_t swr_3;
853 } T;
854 T t;
855
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000856 Assembler assm(isolate, NULL, 0);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000857
858 // Test all combinations of LWL and vAddr.
859 __ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) );
860 __ lwl(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) );
861 __ sw(t0, MemOperand(a0, OFFSET_OF(T, lwl_0)) );
862
863 __ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) );
864 __ lwl(t1, MemOperand(a0, OFFSET_OF(T, mem_init) + 1) );
865 __ sw(t1, MemOperand(a0, OFFSET_OF(T, lwl_1)) );
866
867 __ lw(t2, MemOperand(a0, OFFSET_OF(T, reg_init)) );
868 __ lwl(t2, MemOperand(a0, OFFSET_OF(T, mem_init) + 2) );
869 __ sw(t2, MemOperand(a0, OFFSET_OF(T, lwl_2)) );
870
871 __ lw(t3, MemOperand(a0, OFFSET_OF(T, reg_init)) );
872 __ lwl(t3, MemOperand(a0, OFFSET_OF(T, mem_init) + 3) );
873 __ sw(t3, MemOperand(a0, OFFSET_OF(T, lwl_3)) );
874
875 // Test all combinations of LWR and vAddr.
876 __ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) );
877 __ lwr(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) );
878 __ sw(t0, MemOperand(a0, OFFSET_OF(T, lwr_0)) );
879
880 __ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) );
881 __ lwr(t1, MemOperand(a0, OFFSET_OF(T, mem_init) + 1) );
882 __ sw(t1, MemOperand(a0, OFFSET_OF(T, lwr_1)) );
883
884 __ lw(t2, MemOperand(a0, OFFSET_OF(T, reg_init)) );
885 __ lwr(t2, MemOperand(a0, OFFSET_OF(T, mem_init) + 2) );
886 __ sw(t2, MemOperand(a0, OFFSET_OF(T, lwr_2)) );
887
888 __ lw(t3, MemOperand(a0, OFFSET_OF(T, reg_init)) );
889 __ lwr(t3, MemOperand(a0, OFFSET_OF(T, mem_init) + 3) );
890 __ sw(t3, MemOperand(a0, OFFSET_OF(T, lwr_3)) );
891
892 // Test all combinations of SWL and vAddr.
893 __ lw(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) );
894 __ sw(t0, MemOperand(a0, OFFSET_OF(T, swl_0)) );
895 __ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) );
896 __ swl(t0, MemOperand(a0, OFFSET_OF(T, swl_0)) );
897
898 __ lw(t1, MemOperand(a0, OFFSET_OF(T, mem_init)) );
899 __ sw(t1, MemOperand(a0, OFFSET_OF(T, swl_1)) );
900 __ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) );
901 __ swl(t1, MemOperand(a0, OFFSET_OF(T, swl_1) + 1) );
902
903 __ lw(t2, MemOperand(a0, OFFSET_OF(T, mem_init)) );
904 __ sw(t2, MemOperand(a0, OFFSET_OF(T, swl_2)) );
905 __ lw(t2, MemOperand(a0, OFFSET_OF(T, reg_init)) );
906 __ swl(t2, MemOperand(a0, OFFSET_OF(T, swl_2) + 2) );
907
908 __ lw(t3, MemOperand(a0, OFFSET_OF(T, mem_init)) );
909 __ sw(t3, MemOperand(a0, OFFSET_OF(T, swl_3)) );
910 __ lw(t3, MemOperand(a0, OFFSET_OF(T, reg_init)) );
911 __ swl(t3, MemOperand(a0, OFFSET_OF(T, swl_3) + 3) );
912
913 // Test all combinations of SWR and vAddr.
914 __ lw(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) );
915 __ sw(t0, MemOperand(a0, OFFSET_OF(T, swr_0)) );
916 __ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) );
917 __ swr(t0, MemOperand(a0, OFFSET_OF(T, swr_0)) );
918
919 __ lw(t1, MemOperand(a0, OFFSET_OF(T, mem_init)) );
920 __ sw(t1, MemOperand(a0, OFFSET_OF(T, swr_1)) );
921 __ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) );
922 __ swr(t1, MemOperand(a0, OFFSET_OF(T, swr_1) + 1) );
923
924 __ lw(t2, MemOperand(a0, OFFSET_OF(T, mem_init)) );
925 __ sw(t2, MemOperand(a0, OFFSET_OF(T, swr_2)) );
926 __ lw(t2, MemOperand(a0, OFFSET_OF(T, reg_init)) );
927 __ swr(t2, MemOperand(a0, OFFSET_OF(T, swr_2) + 2) );
928
929 __ lw(t3, MemOperand(a0, OFFSET_OF(T, mem_init)) );
930 __ sw(t3, MemOperand(a0, OFFSET_OF(T, swr_3)) );
931 __ lw(t3, MemOperand(a0, OFFSET_OF(T, reg_init)) );
932 __ swr(t3, MemOperand(a0, OFFSET_OF(T, swr_3) + 3) );
933
934 __ jr(ra);
935 __ nop();
936
937 CodeDesc desc;
938 assm.GetCode(&desc);
939 Object* code = HEAP->CreateCode(
940 desc,
941 Code::ComputeFlags(Code::STUB),
ulan@chromium.org09d7ab52013-02-25 15:50:35 +0000942 Handle<Code>())->ToObjectChecked();
lrn@chromium.org7516f052011-03-30 08:52:27 +0000943 CHECK(code->IsCode());
944 F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
945 t.reg_init = 0xaabbccdd;
946 t.mem_init = 0x11223344;
947
948 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
949 USE(dummy);
950
951 CHECK_EQ(0x44bbccdd, t.lwl_0);
952 CHECK_EQ(0x3344ccdd, t.lwl_1);
953 CHECK_EQ(0x223344dd, t.lwl_2);
954 CHECK_EQ(0x11223344, t.lwl_3);
955
956 CHECK_EQ(0x11223344, t.lwr_0);
957 CHECK_EQ(0xaa112233, t.lwr_1);
958 CHECK_EQ(0xaabb1122, t.lwr_2);
959 CHECK_EQ(0xaabbcc11, t.lwr_3);
960
961 CHECK_EQ(0x112233aa, t.swl_0);
962 CHECK_EQ(0x1122aabb, t.swl_1);
963 CHECK_EQ(0x11aabbcc, t.swl_2);
964 CHECK_EQ(0xaabbccdd, t.swl_3);
965
966 CHECK_EQ(0xaabbccdd, t.swr_0);
967 CHECK_EQ(0xbbccdd44, t.swr_1);
968 CHECK_EQ(0xccdd3344, t.swr_2);
969 CHECK_EQ(0xdd223344, t.swr_3);
970}
971
972
973TEST(MIPS12) {
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000974 CcTest::InitializeVM();
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000975 Isolate* isolate = Isolate::Current();
976 HandleScope scope(isolate);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000977
978 typedef struct {
979 int32_t x;
980 int32_t y;
981 int32_t y1;
982 int32_t y2;
983 int32_t y3;
984 int32_t y4;
985 } T;
986 T t;
987
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +0000988 MacroAssembler assm(isolate, NULL, 0);
lrn@chromium.org7516f052011-03-30 08:52:27 +0000989
990 __ mov(t6, fp); // Save frame pointer.
991 __ mov(fp, a0); // Access struct T by fp.
992 __ lw(t0, MemOperand(a0, OFFSET_OF(T, y)) );
993 __ lw(t3, MemOperand(a0, OFFSET_OF(T, y4)) );
994
995 __ addu(t1, t0, t3);
996 __ subu(t4, t0, t3);
997 __ nop();
karlklose@chromium.org83a47282011-05-11 11:54:09 +0000998 __ push(t0); // These instructions disappear after opt.
lrn@chromium.org7516f052011-03-30 08:52:27 +0000999 __ Pop();
1000 __ addu(t0, t0, t0);
1001 __ nop();
1002 __ Pop(); // These instructions disappear after opt.
karlklose@chromium.org83a47282011-05-11 11:54:09 +00001003 __ push(t3);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001004 __ nop();
karlklose@chromium.org83a47282011-05-11 11:54:09 +00001005 __ push(t3); // These instructions disappear after opt.
1006 __ pop(t3);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001007 __ nop();
karlklose@chromium.org83a47282011-05-11 11:54:09 +00001008 __ push(t3);
1009 __ pop(t4);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001010 __ nop();
1011 __ sw(t0, MemOperand(fp, OFFSET_OF(T, y)) );
1012 __ lw(t0, MemOperand(fp, OFFSET_OF(T, y)) );
1013 __ nop();
1014 __ sw(t0, MemOperand(fp, OFFSET_OF(T, y)) );
1015 __ lw(t1, MemOperand(fp, OFFSET_OF(T, y)) );
1016 __ nop();
karlklose@chromium.org83a47282011-05-11 11:54:09 +00001017 __ push(t1);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001018 __ lw(t1, MemOperand(fp, OFFSET_OF(T, y)) );
karlklose@chromium.org83a47282011-05-11 11:54:09 +00001019 __ pop(t1);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001020 __ nop();
karlklose@chromium.org83a47282011-05-11 11:54:09 +00001021 __ push(t1);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001022 __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) );
karlklose@chromium.org83a47282011-05-11 11:54:09 +00001023 __ pop(t1);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001024 __ nop();
karlklose@chromium.org83a47282011-05-11 11:54:09 +00001025 __ push(t1);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001026 __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) );
karlklose@chromium.org83a47282011-05-11 11:54:09 +00001027 __ pop(t2);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001028 __ nop();
karlklose@chromium.org83a47282011-05-11 11:54:09 +00001029 __ push(t2);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001030 __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) );
karlklose@chromium.org83a47282011-05-11 11:54:09 +00001031 __ pop(t1);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001032 __ nop();
karlklose@chromium.org83a47282011-05-11 11:54:09 +00001033 __ push(t1);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001034 __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) );
karlklose@chromium.org83a47282011-05-11 11:54:09 +00001035 __ pop(t3);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001036 __ nop();
1037
1038 __ mov(fp, t6);
1039 __ jr(ra);
1040 __ nop();
1041
1042 CodeDesc desc;
1043 assm.GetCode(&desc);
1044 Object* code = HEAP->CreateCode(
1045 desc,
1046 Code::ComputeFlags(Code::STUB),
ulan@chromium.org09d7ab52013-02-25 15:50:35 +00001047 Handle<Code>())->ToObjectChecked();
lrn@chromium.org7516f052011-03-30 08:52:27 +00001048 CHECK(code->IsCode());
1049 F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
1050 t.x = 1;
1051 t.y = 2;
1052 t.y1 = 3;
1053 t.y2 = 4;
1054 t.y3 = 0XBABA;
1055 t.y4 = 0xDEDA;
1056
1057 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
1058 USE(dummy);
1059
1060 CHECK_EQ(3, t.y1);
1061}
1062
1063
1064TEST(MIPS13) {
1065 // Test Cvt_d_uw and Trunc_uw_d macros.
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001066 CcTest::InitializeVM();
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +00001067 Isolate* isolate = Isolate::Current();
1068 HandleScope scope(isolate);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001069
1070 typedef struct {
1071 double cvt_big_out;
1072 double cvt_small_out;
1073 uint32_t trunc_big_out;
1074 uint32_t trunc_small_out;
1075 uint32_t cvt_big_in;
1076 uint32_t cvt_small_in;
1077 } T;
1078 T t;
1079
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +00001080 MacroAssembler assm(isolate, NULL, 0);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001081
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001082 __ sw(t0, MemOperand(a0, OFFSET_OF(T, cvt_small_in)));
1083 __ Cvt_d_uw(f10, t0, f22);
1084 __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, cvt_small_out)));
lrn@chromium.org7516f052011-03-30 08:52:27 +00001085
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001086 __ Trunc_uw_d(f10, f10, f22);
1087 __ swc1(f10, MemOperand(a0, OFFSET_OF(T, trunc_small_out)));
lrn@chromium.org7516f052011-03-30 08:52:27 +00001088
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001089 __ sw(t0, MemOperand(a0, OFFSET_OF(T, cvt_big_in)));
1090 __ Cvt_d_uw(f8, t0, f22);
1091 __ sdc1(f8, MemOperand(a0, OFFSET_OF(T, cvt_big_out)));
lrn@chromium.org7516f052011-03-30 08:52:27 +00001092
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001093 __ Trunc_uw_d(f8, f8, f22);
1094 __ swc1(f8, MemOperand(a0, OFFSET_OF(T, trunc_big_out)));
lrn@chromium.org7516f052011-03-30 08:52:27 +00001095
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001096 __ jr(ra);
1097 __ nop();
lrn@chromium.org7516f052011-03-30 08:52:27 +00001098
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001099 CodeDesc desc;
1100 assm.GetCode(&desc);
1101 Object* code = HEAP->CreateCode(
1102 desc,
1103 Code::ComputeFlags(Code::STUB),
1104 Handle<Code>())->ToObjectChecked();
1105 CHECK(code->IsCode());
1106 F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
lrn@chromium.org7516f052011-03-30 08:52:27 +00001107
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001108 t.cvt_big_in = 0xFFFFFFFF;
1109 t.cvt_small_in = 333;
lrn@chromium.org7516f052011-03-30 08:52:27 +00001110
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001111 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
1112 USE(dummy);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001113
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001114 CHECK_EQ(t.cvt_big_out, static_cast<double>(t.cvt_big_in));
1115 CHECK_EQ(t.cvt_small_out, static_cast<double>(t.cvt_small_in));
lrn@chromium.org7516f052011-03-30 08:52:27 +00001116
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001117 CHECK_EQ(static_cast<int>(t.trunc_big_out), static_cast<int>(t.cvt_big_in));
1118 CHECK_EQ(static_cast<int>(t.trunc_small_out),
1119 static_cast<int>(t.cvt_small_in));
lrn@chromium.org7516f052011-03-30 08:52:27 +00001120}
1121
1122
1123TEST(MIPS14) {
1124 // Test round, floor, ceil, trunc, cvt.
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001125 CcTest::InitializeVM();
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +00001126 Isolate* isolate = Isolate::Current();
1127 HandleScope scope(isolate);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001128
1129#define ROUND_STRUCT_ELEMENT(x) \
1130 int32_t x##_up_out; \
1131 int32_t x##_down_out; \
1132 int32_t neg_##x##_up_out; \
1133 int32_t neg_##x##_down_out; \
karlklose@chromium.org83a47282011-05-11 11:54:09 +00001134 uint32_t x##_err1_out; \
1135 uint32_t x##_err2_out; \
1136 uint32_t x##_err3_out; \
1137 uint32_t x##_err4_out; \
lrn@chromium.org7516f052011-03-30 08:52:27 +00001138 int32_t x##_invalid_result;
1139
1140 typedef struct {
1141 double round_up_in;
1142 double round_down_in;
1143 double neg_round_up_in;
1144 double neg_round_down_in;
1145 double err1_in;
1146 double err2_in;
1147 double err3_in;
1148 double err4_in;
1149
1150 ROUND_STRUCT_ELEMENT(round)
1151 ROUND_STRUCT_ELEMENT(floor)
1152 ROUND_STRUCT_ELEMENT(ceil)
1153 ROUND_STRUCT_ELEMENT(trunc)
1154 ROUND_STRUCT_ELEMENT(cvt)
1155 } T;
1156 T t;
1157
1158#undef ROUND_STRUCT_ELEMENT
1159
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +00001160 MacroAssembler assm(isolate, NULL, 0);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001161
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001162 // Save FCSR.
1163 __ cfc1(a1, FCSR);
1164 // Disable FPU exceptions.
1165 __ ctc1(zero_reg, FCSR);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001166#define RUN_ROUND_TEST(x) \
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001167 __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, round_up_in))); \
1168 __ x##_w_d(f0, f0); \
1169 __ swc1(f0, MemOperand(a0, OFFSET_OF(T, x##_up_out))); \
1170 \
1171 __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, round_down_in))); \
1172 __ x##_w_d(f0, f0); \
1173 __ swc1(f0, MemOperand(a0, OFFSET_OF(T, x##_down_out))); \
1174 \
1175 __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, neg_round_up_in))); \
1176 __ x##_w_d(f0, f0); \
1177 __ swc1(f0, MemOperand(a0, OFFSET_OF(T, neg_##x##_up_out))); \
1178 \
1179 __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, neg_round_down_in))); \
1180 __ x##_w_d(f0, f0); \
1181 __ swc1(f0, MemOperand(a0, OFFSET_OF(T, neg_##x##_down_out))); \
1182 \
1183 __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err1_in))); \
1184 __ ctc1(zero_reg, FCSR); \
1185 __ x##_w_d(f0, f0); \
1186 __ cfc1(a2, FCSR); \
1187 __ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err1_out))); \
1188 \
1189 __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err2_in))); \
1190 __ ctc1(zero_reg, FCSR); \
1191 __ x##_w_d(f0, f0); \
1192 __ cfc1(a2, FCSR); \
1193 __ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err2_out))); \
1194 \
1195 __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err3_in))); \
1196 __ ctc1(zero_reg, FCSR); \
1197 __ x##_w_d(f0, f0); \
1198 __ cfc1(a2, FCSR); \
1199 __ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err3_out))); \
1200 \
1201 __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err4_in))); \
1202 __ ctc1(zero_reg, FCSR); \
1203 __ x##_w_d(f0, f0); \
1204 __ cfc1(a2, FCSR); \
1205 __ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err4_out))); \
1206 __ swc1(f0, MemOperand(a0, OFFSET_OF(T, x##_invalid_result)));
lrn@chromium.org7516f052011-03-30 08:52:27 +00001207
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001208 RUN_ROUND_TEST(round)
1209 RUN_ROUND_TEST(floor)
1210 RUN_ROUND_TEST(ceil)
1211 RUN_ROUND_TEST(trunc)
1212 RUN_ROUND_TEST(cvt)
lrn@chromium.org7516f052011-03-30 08:52:27 +00001213
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001214 // Restore FCSR.
1215 __ ctc1(a1, FCSR);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001216
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001217 __ jr(ra);
1218 __ nop();
lrn@chromium.org7516f052011-03-30 08:52:27 +00001219
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001220 CodeDesc desc;
1221 assm.GetCode(&desc);
1222 Object* code = HEAP->CreateCode(
1223 desc,
1224 Code::ComputeFlags(Code::STUB),
1225 Handle<Code>())->ToObjectChecked();
1226 CHECK(code->IsCode());
1227 F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
lrn@chromium.org7516f052011-03-30 08:52:27 +00001228
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001229 t.round_up_in = 123.51;
1230 t.round_down_in = 123.49;
1231 t.neg_round_up_in = -123.5;
1232 t.neg_round_down_in = -123.49;
1233 t.err1_in = 123.51;
1234 t.err2_in = 1;
1235 t.err3_in = static_cast<double>(1) + 0xFFFFFFFF;
1236 t.err4_in = NAN;
lrn@chromium.org7516f052011-03-30 08:52:27 +00001237
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001238 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
1239 USE(dummy);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001240
erik.corry@gmail.comd6076d92011-06-06 09:39:18 +00001241#define GET_FPU_ERR(x) (static_cast<int>(x & kFCSRFlagMask))
1242#define CHECK_ROUND_RESULT(type) \
1243 CHECK(GET_FPU_ERR(t.type##_err1_out) & kFCSRInexactFlagMask); \
1244 CHECK_EQ(0, GET_FPU_ERR(t.type##_err2_out)); \
1245 CHECK(GET_FPU_ERR(t.type##_err3_out) & kFCSRInvalidOpFlagMask); \
1246 CHECK(GET_FPU_ERR(t.type##_err4_out) & kFCSRInvalidOpFlagMask); \
1247 CHECK_EQ(kFPUInvalidResult, t.type##_invalid_result);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001248
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001249 CHECK_ROUND_RESULT(round);
1250 CHECK_ROUND_RESULT(floor);
1251 CHECK_ROUND_RESULT(ceil);
1252 CHECK_ROUND_RESULT(cvt);
lrn@chromium.org7516f052011-03-30 08:52:27 +00001253}
1254
yangguo@chromium.org80c42ed2011-08-31 09:03:56 +00001255
1256TEST(MIPS15) {
1257 // Test chaining of label usages within instructions (issue 1644).
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +00001258 CcTest::InitializeVM();
svenpanne@chromium.org2bda5432013-03-15 12:39:50 +00001259 Isolate* isolate = Isolate::Current();
1260 HandleScope scope(isolate);
1261 Assembler assm(isolate, NULL, 0);
yangguo@chromium.org80c42ed2011-08-31 09:03:56 +00001262
1263 Label target;
1264 __ beq(v0, v1, &target);
fschneider@chromium.org1805e212011-09-05 10:49:12 +00001265 __ nop();
yangguo@chromium.org80c42ed2011-08-31 09:03:56 +00001266 __ bne(v0, v1, &target);
fschneider@chromium.org1805e212011-09-05 10:49:12 +00001267 __ nop();
yangguo@chromium.org80c42ed2011-08-31 09:03:56 +00001268 __ bind(&target);
1269 __ nop();
1270}
1271
ager@chromium.org5c838252010-02-19 08:53:10 +00001272#undef __