13233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
25c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Redistribution and use in source and binary forms, with or without
35c838251403b0be9a882540f1922577abba4c872ager@chromium.org// modification, are permitted provided that the following conditions are
45c838251403b0be9a882540f1922577abba4c872ager@chromium.org// met:
55c838251403b0be9a882540f1922577abba4c872ager@chromium.org//
65c838251403b0be9a882540f1922577abba4c872ager@chromium.org//     * Redistributions of source code must retain the above copyright
75c838251403b0be9a882540f1922577abba4c872ager@chromium.org//       notice, this list of conditions and the following disclaimer.
85c838251403b0be9a882540f1922577abba4c872ager@chromium.org//     * Redistributions in binary form must reproduce the above
95c838251403b0be9a882540f1922577abba4c872ager@chromium.org//       copyright notice, this list of conditions and the following
105c838251403b0be9a882540f1922577abba4c872ager@chromium.org//       disclaimer in the documentation and/or other materials provided
115c838251403b0be9a882540f1922577abba4c872ager@chromium.org//       with the distribution.
125c838251403b0be9a882540f1922577abba4c872ager@chromium.org//     * Neither the name of Google Inc. nor the names of its
135c838251403b0be9a882540f1922577abba4c872ager@chromium.org//       contributors may be used to endorse or promote products derived
145c838251403b0be9a882540f1922577abba4c872ager@chromium.org//       from this software without specific prior written permission.
155c838251403b0be9a882540f1922577abba4c872ager@chromium.org//
165c838251403b0be9a882540f1922577abba4c872ager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
175c838251403b0be9a882540f1922577abba4c872ager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
185c838251403b0be9a882540f1922577abba4c872ager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
195c838251403b0be9a882540f1922577abba4c872ager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
205c838251403b0be9a882540f1922577abba4c872ager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215c838251403b0be9a882540f1922577abba4c872ager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225c838251403b0be9a882540f1922577abba4c872ager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235c838251403b0be9a882540f1922577abba4c872ager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245c838251403b0be9a882540f1922577abba4c872ager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255c838251403b0be9a882540f1922577abba4c872ager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265c838251403b0be9a882540f1922577abba4c872ager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275c838251403b0be9a882540f1922577abba4c872ager@chromium.org
28196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
295c838251403b0be9a882540f1922577abba4c872ager@chromium.org
30196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/disassembler.h"
31196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/factory.h"
32196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/macro-assembler.h"
33196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/mips/macro-assembler-mips.h"
34196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/mips/simulator-mips.h"
355c838251403b0be9a882540f1922577abba4c872ager@chromium.org
36196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h"
375c838251403b0be9a882540f1922577abba4c872ager@chromium.org
385c838251403b0be9a882540f1922577abba4c872ager@chromium.orgusing namespace v8::internal;
395c838251403b0be9a882540f1922577abba4c872ager@chromium.org
405c838251403b0be9a882540f1922577abba4c872ager@chromium.org
415c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Define these function prototypes to match JSEntryFunction in execution.cc.
425c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtypedef Object* (*F1)(int x, int p1, int p2, int p3, int p4);
435c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtypedef Object* (*F2)(int x, int y, int p2, int p3, int p4);
445c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtypedef Object* (*F3)(void* p, int p1, int p2, int p3, int p4);
455c838251403b0be9a882540f1922577abba4c872ager@chromium.org
465c838251403b0be9a882540f1922577abba4c872ager@chromium.org
475c838251403b0be9a882540f1922577abba4c872ager@chromium.org#define __ assm.
485c838251403b0be9a882540f1922577abba4c872ager@chromium.org
497516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
505c838251403b0be9a882540f1922577abba4c872ager@chromium.orgTEST(MIPS0) {
51e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
52528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
532bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
545c838251403b0be9a882540f1922577abba4c872ager@chromium.org
552bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  MacroAssembler assm(isolate, NULL, 0);
565c838251403b0be9a882540f1922577abba4c872ager@chromium.org
575c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // Addition.
585c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ addu(v0, a0, a1);
595c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ jr(ra);
605c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nop();
615c838251403b0be9a882540f1922577abba4c872ager@chromium.org
625c838251403b0be9a882540f1922577abba4c872ager@chromium.org  CodeDesc desc;
635c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assm.GetCode(&desc);
649fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
659fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
669fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F2 f = FUNCTION_CAST<F2>(code->entry());
675c838251403b0be9a882540f1922577abba4c872ager@chromium.org  int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 0xab0, 0xc, 0, 0, 0));
685c838251403b0be9a882540f1922577abba4c872ager@chromium.org  ::printf("f() = %d\n", res);
695c838251403b0be9a882540f1922577abba4c872ager@chromium.org  CHECK_EQ(0xabc, res);
705c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
715c838251403b0be9a882540f1922577abba4c872ager@chromium.org
725c838251403b0be9a882540f1922577abba4c872ager@chromium.org
735c838251403b0be9a882540f1922577abba4c872ager@chromium.orgTEST(MIPS1) {
74e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
75528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
762bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
775c838251403b0be9a882540f1922577abba4c872ager@chromium.org
782bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  MacroAssembler assm(isolate, NULL, 0);
795c838251403b0be9a882540f1922577abba4c872ager@chromium.org  Label L, C;
805c838251403b0be9a882540f1922577abba4c872ager@chromium.org
815c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ mov(a1, a0);
825c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ li(v0, 0);
835c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ b(&C);
845c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nop();
855c838251403b0be9a882540f1922577abba4c872ager@chromium.org
865c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ bind(&L);
877516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ addu(v0, v0, a1);
885c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ addiu(a1, a1, -1);
895c838251403b0be9a882540f1922577abba4c872ager@chromium.org
905c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ bind(&C);
915c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ xori(v1, a1, 0);
927516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Branch(&L, ne, v1, Operand(0));
935c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nop();
945c838251403b0be9a882540f1922577abba4c872ager@chromium.org
955c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ jr(ra);
965c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nop();
975c838251403b0be9a882540f1922577abba4c872ager@chromium.org
985c838251403b0be9a882540f1922577abba4c872ager@chromium.org  CodeDesc desc;
995c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assm.GetCode(&desc);
1009fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
1019fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
1029fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F1 f = FUNCTION_CAST<F1>(code->entry());
1035c838251403b0be9a882540f1922577abba4c872ager@chromium.org  int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 50, 0, 0, 0, 0));
1045c838251403b0be9a882540f1922577abba4c872ager@chromium.org  ::printf("f() = %d\n", res);
1055c838251403b0be9a882540f1922577abba4c872ager@chromium.org  CHECK_EQ(1275, res);
1065c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
1075c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1085c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1095c838251403b0be9a882540f1922577abba4c872ager@chromium.orgTEST(MIPS2) {
110e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
111528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
1122bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
1135c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1142bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  MacroAssembler assm(isolate, NULL, 0);
1155c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1165c838251403b0be9a882540f1922577abba4c872ager@chromium.org  Label exit, error;
1175c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1185c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // ----- Test all instructions.
1195c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1205c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // Test lui, ori, and addiu, used in the li pseudo-instruction.
1215c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // This way we can then safely load registers with chosen values.
1225c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1235c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ ori(t0, zero_reg, 0);
1245c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ lui(t0, 0x1234);
1255c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ ori(t0, t0, 0);
1265c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ ori(t0, t0, 0x0f0f);
1275c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ ori(t0, t0, 0xf0f0);
1285c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ addiu(t1, t0, 1);
1295c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ addiu(t2, t1, -0x10);
1305c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1315c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // Load values in temporary registers.
1325c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ li(t0, 0x00000004);
1335c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ li(t1, 0x00001234);
1345c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ li(t2, 0x12345678);
1355c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ li(t3, 0x7fffffff);
1365c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ li(t4, 0xfffffffc);
1375c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ li(t5, 0xffffedcc);
1385c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ li(t6, 0xedcba988);
1395c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ li(t7, 0x80000000);
1405c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1415c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // SPECIAL class.
1425c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ srl(v0, t2, 8);    // 0x00123456
1435c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ sll(v0, v0, 11);   // 0x91a2b000
1445c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ sra(v0, v0, 3);    // 0xf2345600
1455c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ srav(v0, v0, t0);  // 0xff234560
1465c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ sllv(v0, v0, t0);  // 0xf2345600
1475c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ srlv(v0, v0, t0);  // 0x0f234560
1487516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Branch(&error, ne, v0, Operand(0x0f234560));
1495c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nop();
1505c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1517516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ addu(v0, t0, t1);   // 0x00001238
1527516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ subu(v0, v0, t0);  // 0x00001234
1537516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Branch(&error, ne, v0, Operand(0x00001234));
1545c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nop();
1555c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ addu(v1, t3, t0);
1567516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Branch(&error, ne, v1, Operand(0x80000003));
1575c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nop();
1585c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ subu(v1, t7, t0);  // 0x7ffffffc
1597516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Branch(&error, ne, v1, Operand(0x7ffffffc));
1605c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nop();
1615c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1625c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ and_(v0, t1, t2);  // 0x00001230
1635c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ or_(v0, v0, t1);   // 0x00001234
1645c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ xor_(v0, v0, t2);  // 0x1234444c
1655c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nor(v0, v0, t2);   // 0xedcba987
1667516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Branch(&error, ne, v0, Operand(0xedcba983));
1675c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nop();
1685c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1695c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ slt(v0, t7, t3);
1707516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Branch(&error, ne, v0, Operand(0x1));
1715c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nop();
1725c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ sltu(v0, t7, t3);
1735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  __ Branch(&error, ne, v0, Operand(zero_reg));
1745c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nop();
1755c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // End of SPECIAL class.
1765c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1777516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ addiu(v0, zero_reg, 0x7421);  // 0x00007421
1787516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ addiu(v0, v0, -0x1);  // 0x00007420
1795c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ addiu(v0, v0, -0x20);  // 0x00007400
1807516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Branch(&error, ne, v0, Operand(0x00007400));
1815c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nop();
1825c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ addiu(v1, t3, 0x1);  // 0x80000000
1837516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Branch(&error, ne, v1, Operand(0x80000000));
1845c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nop();
1855c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1865c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ slti(v0, t1, 0x00002000);  // 0x1
1875c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ slti(v0, v0, 0xffff8000);  // 0x0
1885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  __ Branch(&error, ne, v0, Operand(zero_reg));
1895c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nop();
1905c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ sltiu(v0, t1, 0x00002000);  // 0x1
1915c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ sltiu(v0, v0, 0x00008000);  // 0x1
1927516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Branch(&error, ne, v0, Operand(0x1));
1935c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nop();
1945c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1955c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ andi(v0, t1, 0xf0f0);  // 0x00001030
1965c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ ori(v0, v0, 0x8a00);  // 0x00009a30
1975c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ xori(v0, v0, 0x83cc);  // 0x000019fc
1987516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Branch(&error, ne, v0, Operand(0x000019fc));
1995c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nop();
2005c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ lui(v1, 0x8123);  // 0x81230000
2017516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Branch(&error, ne, v1, Operand(0x81230000));
2025c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nop();
2035c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2047516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Bit twiddling instructions & conditional moves.
2057516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Uses t0-t7 as set above.
2063233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org  __ Clz(v0, t0);       // 29
2073233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org  __ Clz(v1, t1);       // 19
2087516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ addu(v0, v0, v1);  // 48
2093233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org  __ Clz(v1, t2);       // 3
2107516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ addu(v0, v0, v1);  // 51
2113233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org  __ Clz(v1, t7);       // 0
2127516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ addu(v0, v0, v1);  // 51
2137516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Branch(&error, ne, v0, Operand(51));
2143233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org  __ Movn(a0, t3, t0);  // Move a0<-t3 (t0 is NOT 0).
2157516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Ins(a0, t1, 12, 8);  // 0x7ff34fff
2167516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Branch(&error, ne, a0, Operand(0x7ff34fff));
2173233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org  __ Movz(a0, t6, t7);    // a0 not updated (t7 is NOT 0).
2187516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Ext(a1, a0, 8, 12);  // 0x34f
2197516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Branch(&error, ne, a1, Operand(0x34f));
2203233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org  __ Movz(a0, t6, v1);    // a0<-t6, v0 is 0, from 8 instr back.
2217516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Branch(&error, ne, a0, Operand(t6));
2227516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2235c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // Everything was correctly executed. Load the expected result.
2245c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ li(v0, 0x31415926);
2255c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ b(&exit);
2265c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nop();
2275c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2285c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ bind(&error);
2295c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // Got an error. Return a wrong result.
2307516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ li(v0, 666);
2315c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2325c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ bind(&exit);
2335c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ jr(ra);
2345c838251403b0be9a882540f1922577abba4c872ager@chromium.org  __ nop();
2355c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2365c838251403b0be9a882540f1922577abba4c872ager@chromium.org  CodeDesc desc;
2375c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assm.GetCode(&desc);
2389fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
2399fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
2409fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F2 f = FUNCTION_CAST<F2>(code->entry());
2415c838251403b0be9a882540f1922577abba4c872ager@chromium.org  int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 0xab0, 0xc, 0, 0, 0));
2425c838251403b0be9a882540f1922577abba4c872ager@chromium.org  ::printf("f() = %d\n", res);
2435c838251403b0be9a882540f1922577abba4c872ager@chromium.org  CHECK_EQ(0x31415926, res);
2445c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
2455c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2467516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2477516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgTEST(MIPS3) {
2487516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Test floating point instructions.
249e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
250528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
2512bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
2527516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2537516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  typedef struct {
2547516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double a;
2557516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double b;
2567516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double c;
2577516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double d;
2587516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double e;
2597516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double f;
2607516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double g;
26159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    double h;
26259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    double i;
2637516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  } T;
2647516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  T t;
2657516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2667516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Create a function that accepts &t, and loads, manipulates, and stores
2677516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // the doubles t.a ... t.f.
2682bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  MacroAssembler assm(isolate, NULL, 0);
2697516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  Label L, C;
2707516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
271e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
272e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) );
273e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ add_d(f8, f4, f6);
274e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sdc1(f8, MemOperand(a0, OFFSET_OF(T, c)) );  // c = a + b.
2757516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
276e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ mov_d(f10, f8);  // c
277e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ neg_d(f12, f6);  // -b
278e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sub_d(f10, f10, f12);
279e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, d)) );  // d = c - (-b).
2807516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
281e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sdc1(f4, MemOperand(a0, OFFSET_OF(T, b)) );   // b = a.
2827516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
283e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ li(t0, 120);
284e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ mtc1(t0, f14);
285e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ cvt_d_w(f14, f14);   // f14 = 120.0.
286e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ mul_d(f10, f10, f14);
287e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, e)) );  // e = d * 120 = 1.8066e16.
2887516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
289e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ div_d(f12, f10, f4);
290e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sdc1(f12, MemOperand(a0, OFFSET_OF(T, f)) );  // f = e / a = 120.44.
2917516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
292e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sqrt_d(f14, f12);
293e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sdc1(f14, MemOperand(a0, OFFSET_OF(T, g)) );
294e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // g = sqrt(f) = 10.97451593465515908537
2957516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  if (IsMipsArchVariant(kMips32r2)) {
29759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, h)) );
29859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, i)) );
29959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    __ madd_d(f14, f6, f4, f6);
30059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    __ sdc1(f14, MemOperand(a0, OFFSET_OF(T, h)) );
30159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  }
30259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
303e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ jr(ra);
304e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ nop();
3057516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
306e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CodeDesc desc;
307e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  assm.GetCode(&desc);
3089fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
3099fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
3109fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
311e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.a = 1.5e14;
312e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.b = 2.75e11;
313e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.c = 0.0;
314e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.d = 0.0;
315e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.e = 0.0;
316e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.f = 0.0;
317e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.h = 1.5;
318e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.i = 2.75;
319e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
320e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  USE(dummy);
321e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(1.5e14, t.a);
322e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(1.5e14, t.b);
323e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(1.50275e14, t.c);
324e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(1.50550e14, t.d);
325e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(1.8066e16, t.e);
326e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(120.44, t.f);
327e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(10.97451593465515908537, t.g);
3285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  if (IsMipsArchVariant(kMips32r2)) {
3291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    CHECK_EQ(6.875, t.h);
3301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
3317516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org}
3327516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
3337516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
3347516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgTEST(MIPS4) {
3357516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Test moves between floating point and integer registers.
336e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
337528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
3382bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
3397516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
3407516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  typedef struct {
3417516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double a;
3427516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double b;
3437516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double c;
3447516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  } T;
3457516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  T t;
3467516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
3472bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  Assembler assm(isolate, NULL, 0);
3487516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  Label L, C;
3497516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
350e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
351e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) );
3527516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
353e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Swap f4 and f6, by using four integer registers, t0-t3.
3545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  if (!IsFp64Mode()) {
3555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ mfc1(t0, f4);
3565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ mfc1(t1, f5);
3575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ mfc1(t2, f6);
3585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ mfc1(t3, f7);
3595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
3605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ mtc1(t0, f6);
3615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ mtc1(t1, f7);
3625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ mtc1(t2, f4);
3635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ mtc1(t3, f5);
3645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  } else {
3655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    DCHECK(!IsMipsArchVariant(kMips32r1) && !IsMipsArchVariant(kLoongson));
3665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ mfc1(t0, f4);
3675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ mfhc1(t1, f4);
3685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ mfc1(t2, f6);
3695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ mfhc1(t3, f6);
3705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
3715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ mtc1(t0, f6);
3725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ mthc1(t1, f6);
3735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ mtc1(t2, f4);
3745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ mthc1(t3, f4);
3755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
376e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Store the swapped f4 and f5 back to memory.
377e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sdc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
378e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sdc1(f6, MemOperand(a0, OFFSET_OF(T, c)) );
3797516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
380e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ jr(ra);
381e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ nop();
3827516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
383e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CodeDesc desc;
384e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  assm.GetCode(&desc);
3859fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
3869fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
3879fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
388e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.a = 1.5e22;
389e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.b = 2.75e11;
390e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.c = 17.17;
391e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
392e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  USE(dummy);
3937516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
394e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(2.75e11, t.a);
395e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(2.75e11, t.b);
396e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(1.5e22, t.c);
3977516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org}
3987516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
3997516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
4007516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgTEST(MIPS5) {
4017516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Test conversions between doubles and integers.
402e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
403528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
4042bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
4057516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
4067516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  typedef struct {
4077516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double a;
4087516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double b;
4097516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int i;
4107516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int j;
4117516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  } T;
4127516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  T t;
4137516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
4142bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  Assembler assm(isolate, NULL, 0);
4157516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  Label L, C;
4167516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
417e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Load all structure elements to registers.
418e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
419e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) );
420e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ lw(t0, MemOperand(a0, OFFSET_OF(T, i)) );
421e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ lw(t1, MemOperand(a0, OFFSET_OF(T, j)) );
4227516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
423e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Convert double in f4 to int in element i.
424e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ cvt_w_d(f8, f4);
425e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ mfc1(t2, f8);
426e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sw(t2, MemOperand(a0, OFFSET_OF(T, i)) );
4277516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
428e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Convert double in f6 to int in element j.
429e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ cvt_w_d(f10, f6);
430e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ mfc1(t3, f10);
431e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sw(t3, MemOperand(a0, OFFSET_OF(T, j)) );
4327516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
433e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Convert int in original i (t0) to double in a.
434e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ mtc1(t0, f12);
435e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ cvt_d_w(f0, f12);
436e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sdc1(f0, MemOperand(a0, OFFSET_OF(T, a)) );
4377516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
438e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Convert int in original j (t1) to double in b.
439e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ mtc1(t1, f14);
440e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ cvt_d_w(f2, f14);
441e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sdc1(f2, MemOperand(a0, OFFSET_OF(T, b)) );
442e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
443e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ jr(ra);
444e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ nop();
445e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
446e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CodeDesc desc;
447e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  assm.GetCode(&desc);
4489fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
4499fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
4509fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
451e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.a = 1.5e4;
452e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.b = 2.75e8;
453e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.i = 12345678;
454e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.j = -100000;
455e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
456e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  USE(dummy);
457e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
458e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(12345678.0, t.a);
459e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(-100000.0, t.b);
460e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(15000, t.i);
461e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(275000000, t.j);
4627516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org}
4637516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
4647516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
4657516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgTEST(MIPS6) {
4667516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Test simple memory loads and stores.
467e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
468528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
4692bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
4707516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
4717516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  typedef struct {
4727516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    uint32_t ui;
4737516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t si;
4747516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t r1;
4757516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t r2;
4767516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t r3;
4777516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t r4;
4787516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t r5;
4797516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t r6;
4807516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  } T;
4817516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  T t;
4827516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
4832bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  Assembler assm(isolate, NULL, 0);
4847516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  Label L, C;
4857516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
4867516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Basic word load/store.
4877516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t0, MemOperand(a0, OFFSET_OF(T, ui)) );
4887516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t0, MemOperand(a0, OFFSET_OF(T, r1)) );
4897516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
4907516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // lh with positive data.
4917516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lh(t1, MemOperand(a0, OFFSET_OF(T, ui)) );
4927516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t1, MemOperand(a0, OFFSET_OF(T, r2)) );
4937516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
4947516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // lh with negative data.
4957516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lh(t2, MemOperand(a0, OFFSET_OF(T, si)) );
4967516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t2, MemOperand(a0, OFFSET_OF(T, r3)) );
4977516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
4987516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // lhu with negative data.
4997516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lhu(t3, MemOperand(a0, OFFSET_OF(T, si)) );
5007516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t3, MemOperand(a0, OFFSET_OF(T, r4)) );
5017516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
5027516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // lb with negative data.
5037516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lb(t4, MemOperand(a0, OFFSET_OF(T, si)) );
5047516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t4, MemOperand(a0, OFFSET_OF(T, r5)) );
5057516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
5067516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // sh writes only 1/2 of word.
5077516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lui(t5, 0x3333);
5087516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ ori(t5, t5, 0x3333);
5097516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t5, MemOperand(a0, OFFSET_OF(T, r6)) );
5107516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lhu(t5, MemOperand(a0, OFFSET_OF(T, si)) );
5117516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sh(t5, MemOperand(a0, OFFSET_OF(T, r6)) );
5127516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
5137516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ jr(ra);
5147516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ nop();
5157516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
5167516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CodeDesc desc;
5177516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  assm.GetCode(&desc);
5189fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
5199fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
5209fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
5217516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  t.ui = 0x11223344;
5227516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  t.si = 0x99aabbcc;
5237516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
5247516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  USE(dummy);
5257516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
5267516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x11223344, t.r1);
527731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org#if __BYTE_ORDER == __LITTLE_ENDIAN
5287516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x3344, t.r2);
5297516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0xffffbbcc, t.r3);
5307516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x0000bbcc, t.r4);
5317516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0xffffffcc, t.r5);
5327516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x3333bbcc, t.r6);
533731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org#elif __BYTE_ORDER == __BIG_ENDIAN
534731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0x1122, t.r2);
535731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0xffff99aa, t.r3);
536731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0x000099aa, t.r4);
537731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0xffffff99, t.r5);
538731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0x99aa3333, t.r6);
539731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org#else
540731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org#error Unknown endianness
541731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org#endif
5427516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org}
5437516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
5447516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
5457516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgTEST(MIPS7) {
5467516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Test floating point compare and branch instructions.
547e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
548528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
5492bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
5507516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
5517516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  typedef struct {
5527516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double a;
5537516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double b;
5547516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double c;
5557516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double d;
5567516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double e;
5577516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double f;
5587516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t result;
5597516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  } T;
5607516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  T t;
5617516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
5627516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Create a function that accepts &t, and loads, manipulates, and stores
5637516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // the doubles t.a ... t.f.
5642bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  MacroAssembler assm(isolate, NULL, 0);
5657516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  Label neither_is_nan, less_than, outa_here;
5667516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
567e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
568e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) );
5695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  if (!IsMipsArchVariant(kMips32r6)) {
570e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ c(UN, D, f4, f6);
571e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ bc1f(&neither_is_nan);
5725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  } else {
5735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ cmp(UN, L, f2, f4, f6);
5745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ bc1eqz(&neither_is_nan, f2);
5755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
576e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ nop();
577e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sw(zero_reg, MemOperand(a0, OFFSET_OF(T, result)) );
578e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ Branch(&outa_here);
5797516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
580e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ bind(&neither_is_nan);
5817516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
5825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  if (IsMipsArchVariant(kLoongson)) {
583e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    __ c(OLT, D, f6, f4);
584e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    __ bc1t(&less_than);
5855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  } else if (IsMipsArchVariant(kMips32r6)) {
5865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ cmp(OLT, L, f2, f6, f4);
5875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    __ bc1nez(&less_than, f2);
588e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  } else {
589e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    __ c(OLT, D, f6, f4, 2);
590e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    __ bc1t(&less_than, 2);
591e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
5925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
593e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ nop();
594e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sw(zero_reg, MemOperand(a0, OFFSET_OF(T, result)) );
595e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ Branch(&outa_here);
5967516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
597e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ bind(&less_than);
598e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ Addu(t0, zero_reg, Operand(1));
599e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sw(t0, MemOperand(a0, OFFSET_OF(T, result)) );  // Set true.
6007516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
6017516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
602e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // This test-case should have additional tests.
6037516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
604e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ bind(&outa_here);
6057516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
606e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ jr(ra);
607e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ nop();
608e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
609e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CodeDesc desc;
610e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  assm.GetCode(&desc);
6119fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
6129fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
6139fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
614e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.a = 1.5e14;
615e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.b = 2.75e11;
616e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.c = 2.0;
617e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.d = -4.0;
618e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.e = 0.0;
619e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.f = 0.0;
620e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.result = 0;
621e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
622e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  USE(dummy);
623e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(1.5e14, t.a);
624e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(2.75e11, t.b);
625e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(1, t.result);
6267516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org}
6277516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
6287516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
6297516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgTEST(MIPS8) {
6307516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Test ROTR and ROTRV instructions.
631e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
632528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
6332bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
6347516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
6357516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  typedef struct {
6367516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t input;
6377516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t result_rotr_4;
6387516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t result_rotr_8;
6397516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t result_rotr_12;
6407516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t result_rotr_16;
6417516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t result_rotr_20;
6427516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t result_rotr_24;
6437516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t result_rotr_28;
6447516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t result_rotrv_4;
6457516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t result_rotrv_8;
6467516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t result_rotrv_12;
6477516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t result_rotrv_16;
6487516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t result_rotrv_20;
6497516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t result_rotrv_24;
6507516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t result_rotrv_28;
6517516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  } T;
6527516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  T t;
6537516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
6542bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  MacroAssembler assm(isolate, NULL, 0);
6557516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
6567516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Basic word load.
6577516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t0, MemOperand(a0, OFFSET_OF(T, input)) );
6587516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
6597516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // ROTR instruction (called through the Ror macro).
6607516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Ror(t1, t0, 0x0004);
6617516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Ror(t2, t0, 0x0008);
6627516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Ror(t3, t0, 0x000c);
6637516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Ror(t4, t0, 0x0010);
6647516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Ror(t5, t0, 0x0014);
6657516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Ror(t6, t0, 0x0018);
6667516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Ror(t7, t0, 0x001c);
6677516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
6687516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Basic word store.
6697516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t1, MemOperand(a0, OFFSET_OF(T, result_rotr_4)) );
6707516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t2, MemOperand(a0, OFFSET_OF(T, result_rotr_8)) );
6717516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t3, MemOperand(a0, OFFSET_OF(T, result_rotr_12)) );
6727516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t4, MemOperand(a0, OFFSET_OF(T, result_rotr_16)) );
6737516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t5, MemOperand(a0, OFFSET_OF(T, result_rotr_20)) );
6747516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t6, MemOperand(a0, OFFSET_OF(T, result_rotr_24)) );
6757516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t7, MemOperand(a0, OFFSET_OF(T, result_rotr_28)) );
6767516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
6777516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // ROTRV instruction (called through the Ror macro).
6787516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ li(t7, 0x0004);
6797516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Ror(t1, t0, t7);
6807516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ li(t7, 0x0008);
6817516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Ror(t2, t0, t7);
6827516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ li(t7, 0x000C);
6837516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Ror(t3, t0, t7);
6847516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ li(t7, 0x0010);
6857516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Ror(t4, t0, t7);
6867516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ li(t7, 0x0014);
6877516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Ror(t5, t0, t7);
6887516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ li(t7, 0x0018);
6897516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Ror(t6, t0, t7);
6907516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ li(t7, 0x001C);
6917516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Ror(t7, t0, t7);
6927516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
6937516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Basic word store.
6947516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t1, MemOperand(a0, OFFSET_OF(T, result_rotrv_4)) );
6957516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t2, MemOperand(a0, OFFSET_OF(T, result_rotrv_8)) );
6967516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t3, MemOperand(a0, OFFSET_OF(T, result_rotrv_12)) );
6977516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t4, MemOperand(a0, OFFSET_OF(T, result_rotrv_16)) );
6987516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t5, MemOperand(a0, OFFSET_OF(T, result_rotrv_20)) );
6997516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t6, MemOperand(a0, OFFSET_OF(T, result_rotrv_24)) );
7007516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t7, MemOperand(a0, OFFSET_OF(T, result_rotrv_28)) );
7017516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
7027516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ jr(ra);
7037516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ nop();
7047516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
7057516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CodeDesc desc;
7067516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  assm.GetCode(&desc);
7079fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
7089fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
7099fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
7107516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  t.input = 0x12345678;
7117516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0x0, 0, 0, 0);
7127516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  USE(dummy);
7137516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x81234567, t.result_rotr_4);
7147516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x78123456, t.result_rotr_8);
7157516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x67812345, t.result_rotr_12);
7167516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x56781234, t.result_rotr_16);
7177516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x45678123, t.result_rotr_20);
7187516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x34567812, t.result_rotr_24);
7197516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x23456781, t.result_rotr_28);
7207516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
7217516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x81234567, t.result_rotrv_4);
7227516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x78123456, t.result_rotrv_8);
7237516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x67812345, t.result_rotrv_12);
7247516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x56781234, t.result_rotrv_16);
7257516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x45678123, t.result_rotrv_20);
7267516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x34567812, t.result_rotrv_24);
7277516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x23456781, t.result_rotrv_28);
7287516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org}
7297516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
7307516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
7317516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgTEST(MIPS9) {
7327516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Test BRANCH improvements.
733e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
734528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
7352bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
7367516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
7372bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  MacroAssembler assm(isolate, NULL, 0);
7387516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  Label exit, exit2, exit3;
7397516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
7405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  __ Branch(&exit, ge, a0, Operand(zero_reg));
7417516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Branch(&exit2, ge, a0, Operand(0x00001FFF));
7427516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Branch(&exit3, ge, a0, Operand(0x0001FFFF));
7437516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
7447516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ bind(&exit);
7457516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ bind(&exit2);
7467516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ bind(&exit3);
7477516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ jr(ra);
7487516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ nop();
7497516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
7507516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CodeDesc desc;
7517516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  assm.GetCode(&desc);
7529fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  isolate->factory()->NewCode(
7539fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
7547516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org}
7557516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
7567516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
7577516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgTEST(MIPS10) {
7587516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Test conversions between doubles and long integers.
7597516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Test hos the long ints map to FP regs pairs.
760e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
761528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
7622bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
7637516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
7647516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  typedef struct {
7657516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double a;
7667516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double b;
7677516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t dbl_mant;
7687516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t dbl_exp;
7690a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org    int32_t word;
7700a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org    int32_t b_word;
7717516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  } T;
7727516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  T t;
7737516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
7742bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  Assembler assm(isolate, NULL, 0);
7757516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  Label L, C;
7767516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
7775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  if (!IsMipsArchVariant(kMips32r2)) return;
7785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
7795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  // Load all structure elements to registers.
7805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, a)));
7815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
7825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  // Save the raw bits of the double.
7835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  __ mfc1(t0, f0);
7845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  __ mfc1(t1, f1);
7855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  __ sw(t0, MemOperand(a0, OFFSET_OF(T, dbl_mant)));
7865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  __ sw(t1, MemOperand(a0, OFFSET_OF(T, dbl_exp)));
7875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
7885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  // Convert double in f0 to long, save hi/lo parts.
7895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  __ cvt_w_d(f0, f0);
7905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  __ mfc1(t0, f0);  // f0 has a 32-bits word.
7915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  __ sw(t0, MemOperand(a0, OFFSET_OF(T, word)));
7925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
7935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  // Convert the b long integers to double b.
7945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  __ lw(t0, MemOperand(a0, OFFSET_OF(T, b_word)));
7955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  __ mtc1(t0, f8);  // f8 has a 32-bits word.
7965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  __ cvt_d_w(f10, f8);
7975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, b)));
7985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
7995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  __ jr(ra);
8005e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  __ nop();
8015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
8025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  CodeDesc desc;
8035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  assm.GetCode(&desc);
8045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
8055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
8065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
8075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  t.a = 2.147483646e+09;       // 0x7FFFFFFE -> 0xFF80000041DFFFFF as double.
8085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  t.b_word = 0x0ff00ff0;       // 0x0FF00FF0 -> 0x as double.
8095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
8105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  USE(dummy);
8115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
8125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  CHECK_EQ(0x41DFFFFF, t.dbl_exp);
8135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  CHECK_EQ(0xFF800000, t.dbl_mant);
8145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  CHECK_EQ(0X7FFFFFFE, t.word);
8155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  // 0x0FF00FF0 -> 2.6739096+e08
8165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  CHECK_EQ(2.6739096e08, t.b);
8177516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org}
8187516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
8197516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
8207516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgTEST(MIPS11) {
8215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  // Do not run test on MIPS32r6, as these instructions are removed.
8225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  if (IsMipsArchVariant(kMips32r6)) return;
8237516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Test LWL, LWR, SWL and SWR instructions.
824e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
825528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
8262bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
8277516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
8287516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  typedef struct {
8297516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t reg_init;
8307516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t mem_init;
8317516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t lwl_0;
8327516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t lwl_1;
8337516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t lwl_2;
8347516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t lwl_3;
8357516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t lwr_0;
8367516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t lwr_1;
8377516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t lwr_2;
8387516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t lwr_3;
8397516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t swl_0;
8407516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t swl_1;
8417516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t swl_2;
8427516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t swl_3;
8437516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t swr_0;
8447516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t swr_1;
8457516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t swr_2;
8467516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    int32_t swr_3;
8477516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  } T;
8487516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  T t;
8497516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
8502bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  Assembler assm(isolate, NULL, 0);
8517516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
8527516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Test all combinations of LWL and vAddr.
8537516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) );
8547516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lwl(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) );
8557516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t0, MemOperand(a0, OFFSET_OF(T, lwl_0)) );
8567516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
8577516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) );
8587516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lwl(t1, MemOperand(a0, OFFSET_OF(T, mem_init) + 1) );
8597516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t1, MemOperand(a0, OFFSET_OF(T, lwl_1)) );
8607516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
8617516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t2, MemOperand(a0, OFFSET_OF(T, reg_init)) );
8627516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lwl(t2, MemOperand(a0, OFFSET_OF(T, mem_init) + 2) );
8637516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t2, MemOperand(a0, OFFSET_OF(T, lwl_2)) );
8647516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
8657516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t3, MemOperand(a0, OFFSET_OF(T, reg_init)) );
8667516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lwl(t3, MemOperand(a0, OFFSET_OF(T, mem_init) + 3) );
8677516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t3, MemOperand(a0, OFFSET_OF(T, lwl_3)) );
8687516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
8697516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Test all combinations of LWR and vAddr.
8707516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) );
8717516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lwr(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) );
8727516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t0, MemOperand(a0, OFFSET_OF(T, lwr_0)) );
8737516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
8747516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) );
8757516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lwr(t1, MemOperand(a0, OFFSET_OF(T, mem_init) + 1) );
8767516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t1, MemOperand(a0, OFFSET_OF(T, lwr_1)) );
8777516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
8787516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t2, MemOperand(a0, OFFSET_OF(T, reg_init)) );
8797516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lwr(t2, MemOperand(a0, OFFSET_OF(T, mem_init) + 2) );
8807516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t2, MemOperand(a0, OFFSET_OF(T, lwr_2)) );
8817516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
8827516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t3, MemOperand(a0, OFFSET_OF(T, reg_init)) );
8837516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lwr(t3, MemOperand(a0, OFFSET_OF(T, mem_init) + 3) );
8847516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t3, MemOperand(a0, OFFSET_OF(T, lwr_3)) );
8857516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
8867516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Test all combinations of SWL and vAddr.
8877516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) );
8887516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t0, MemOperand(a0, OFFSET_OF(T, swl_0)) );
8897516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) );
8907516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ swl(t0, MemOperand(a0, OFFSET_OF(T, swl_0)) );
8917516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
8927516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t1, MemOperand(a0, OFFSET_OF(T, mem_init)) );
8937516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t1, MemOperand(a0, OFFSET_OF(T, swl_1)) );
8947516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) );
8957516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ swl(t1, MemOperand(a0, OFFSET_OF(T, swl_1) + 1) );
8967516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
8977516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t2, MemOperand(a0, OFFSET_OF(T, mem_init)) );
8987516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t2, MemOperand(a0, OFFSET_OF(T, swl_2)) );
8997516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t2, MemOperand(a0, OFFSET_OF(T, reg_init)) );
9007516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ swl(t2, MemOperand(a0, OFFSET_OF(T, swl_2) + 2) );
9017516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
9027516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t3, MemOperand(a0, OFFSET_OF(T, mem_init)) );
9037516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t3, MemOperand(a0, OFFSET_OF(T, swl_3)) );
9047516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t3, MemOperand(a0, OFFSET_OF(T, reg_init)) );
9057516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ swl(t3, MemOperand(a0, OFFSET_OF(T, swl_3) + 3) );
9067516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
9077516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Test all combinations of SWR and vAddr.
9087516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) );
9097516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t0, MemOperand(a0, OFFSET_OF(T, swr_0)) );
9107516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) );
9117516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ swr(t0, MemOperand(a0, OFFSET_OF(T, swr_0)) );
9127516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
9137516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t1, MemOperand(a0, OFFSET_OF(T, mem_init)) );
9147516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t1, MemOperand(a0, OFFSET_OF(T, swr_1)) );
9157516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) );
9167516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ swr(t1, MemOperand(a0, OFFSET_OF(T, swr_1) + 1) );
9177516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
9187516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t2, MemOperand(a0, OFFSET_OF(T, mem_init)) );
9197516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t2, MemOperand(a0, OFFSET_OF(T, swr_2)) );
9207516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t2, MemOperand(a0, OFFSET_OF(T, reg_init)) );
9217516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ swr(t2, MemOperand(a0, OFFSET_OF(T, swr_2) + 2) );
9227516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
9237516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t3, MemOperand(a0, OFFSET_OF(T, mem_init)) );
9247516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t3, MemOperand(a0, OFFSET_OF(T, swr_3)) );
9257516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t3, MemOperand(a0, OFFSET_OF(T, reg_init)) );
9267516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ swr(t3, MemOperand(a0, OFFSET_OF(T, swr_3) + 3) );
9277516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
9287516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ jr(ra);
9297516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ nop();
9307516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
9317516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CodeDesc desc;
9327516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  assm.GetCode(&desc);
9339fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
9349fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
9359fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
9367516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  t.reg_init = 0xaabbccdd;
9377516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  t.mem_init = 0x11223344;
9387516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
9397516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
9407516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  USE(dummy);
9417516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
942731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org#if __BYTE_ORDER == __LITTLE_ENDIAN
9437516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x44bbccdd, t.lwl_0);
9447516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x3344ccdd, t.lwl_1);
9457516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x223344dd, t.lwl_2);
9467516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x11223344, t.lwl_3);
9477516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
9487516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x11223344, t.lwr_0);
9497516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0xaa112233, t.lwr_1);
9507516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0xaabb1122, t.lwr_2);
9517516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0xaabbcc11, t.lwr_3);
9527516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
9537516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x112233aa, t.swl_0);
9547516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x1122aabb, t.swl_1);
9557516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0x11aabbcc, t.swl_2);
9567516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0xaabbccdd, t.swl_3);
9577516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
9587516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0xaabbccdd, t.swr_0);
9597516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0xbbccdd44, t.swr_1);
9607516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0xccdd3344, t.swr_2);
9617516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(0xdd223344, t.swr_3);
962731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org#elif __BYTE_ORDER == __BIG_ENDIAN
963731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0x11223344, t.lwl_0);
964731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0x223344dd, t.lwl_1);
965731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0x3344ccdd, t.lwl_2);
966731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0x44bbccdd, t.lwl_3);
967731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org
968731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0xaabbcc11, t.lwr_0);
969731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0xaabb1122, t.lwr_1);
970731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0xaa112233, t.lwr_2);
971731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0x11223344, t.lwr_3);
972731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org
973731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0xaabbccdd, t.swl_0);
974731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0x11aabbcc, t.swl_1);
975731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0x1122aabb, t.swl_2);
976731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0x112233aa, t.swl_3);
977731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org
978731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0xdd223344, t.swr_0);
979731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0xccdd3344, t.swr_1);
980731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0xbbccdd44, t.swr_2);
981731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(0xaabbccdd, t.swr_3);
982731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org#else
983731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org#error Unknown endianness
984731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org#endif
9857516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org}
9867516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
9877516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
9887516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgTEST(MIPS12) {
989e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
990528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
9912bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
9927516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
9937516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  typedef struct {
9947516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org      int32_t  x;
9957516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org      int32_t  y;
9967516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org      int32_t  y1;
9977516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org      int32_t  y2;
9987516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org      int32_t  y3;
9997516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org      int32_t  y4;
10007516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  } T;
10017516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  T t;
10027516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
10032bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  MacroAssembler assm(isolate, NULL, 0);
10047516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
10057516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ mov(t6, fp);  // Save frame pointer.
10067516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ mov(fp, a0);  // Access struct T by fp.
10077516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t0, MemOperand(a0, OFFSET_OF(T, y)) );
10087516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t3, MemOperand(a0, OFFSET_OF(T, y4)) );
10097516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
10107516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ addu(t1, t0, t3);
10117516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ subu(t4, t0, t3);
10127516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ nop();
101383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  __ push(t0);  // These instructions disappear after opt.
10147516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Pop();
10157516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ addu(t0, t0, t0);
10167516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ nop();
10177516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ Pop();     // These instructions disappear after opt.
101883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  __ push(t3);
10197516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ nop();
102083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  __ push(t3);  // These instructions disappear after opt.
102183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  __ pop(t3);
10227516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ nop();
102383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  __ push(t3);
102483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  __ pop(t4);
10257516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ nop();
10267516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t0, MemOperand(fp, OFFSET_OF(T, y)) );
10277516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t0, MemOperand(fp, OFFSET_OF(T, y)) );
10287516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ nop();
10297516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ sw(t0, MemOperand(fp, OFFSET_OF(T, y)) );
10307516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t1, MemOperand(fp, OFFSET_OF(T, y)) );
10317516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ nop();
103283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  __ push(t1);
10337516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t1, MemOperand(fp, OFFSET_OF(T, y)) );
103483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  __ pop(t1);
10357516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ nop();
103683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  __ push(t1);
10377516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) );
103883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  __ pop(t1);
10397516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ nop();
104083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  __ push(t1);
10417516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) );
104283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  __ pop(t2);
10437516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ nop();
104483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  __ push(t2);
10457516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) );
104683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  __ pop(t1);
10477516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ nop();
104883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  __ push(t1);
10497516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) );
105083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  __ pop(t3);
10517516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ nop();
10527516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
10537516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ mov(fp, t6);
10547516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ jr(ra);
10557516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  __ nop();
10567516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
10577516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CodeDesc desc;
10587516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  assm.GetCode(&desc);
10599fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
10609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
10619fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
10627516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  t.x = 1;
10637516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  t.y = 2;
10647516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  t.y1 = 3;
10657516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  t.y2 = 4;
10667516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  t.y3 = 0XBABA;
10677516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  t.y4 = 0xDEDA;
10687516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
10697516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
10707516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  USE(dummy);
10717516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
10727516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  CHECK_EQ(3, t.y1);
10737516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org}
10747516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
10757516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
10767516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgTEST(MIPS13) {
10777516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Test Cvt_d_uw and Trunc_uw_d macros.
1078e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
1079528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
10802bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
10817516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
10827516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  typedef struct {
10837516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double cvt_big_out;
10847516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double cvt_small_out;
10857516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    uint32_t trunc_big_out;
10867516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    uint32_t trunc_small_out;
10877516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    uint32_t cvt_big_in;
10887516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    uint32_t cvt_small_in;
10897516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  } T;
10907516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  T t;
10917516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
10922bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  MacroAssembler assm(isolate, NULL, 0);
10937516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1094e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sw(t0, MemOperand(a0, OFFSET_OF(T, cvt_small_in)));
1095e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ Cvt_d_uw(f10, t0, f22);
1096e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, cvt_small_out)));
10977516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1098e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ Trunc_uw_d(f10, f10, f22);
1099e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ swc1(f10, MemOperand(a0, OFFSET_OF(T, trunc_small_out)));
11007516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1101e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sw(t0, MemOperand(a0, OFFSET_OF(T, cvt_big_in)));
1102e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ Cvt_d_uw(f8, t0, f22);
1103e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sdc1(f8, MemOperand(a0, OFFSET_OF(T, cvt_big_out)));
11047516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1105e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ Trunc_uw_d(f8, f8, f22);
1106e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ swc1(f8, MemOperand(a0, OFFSET_OF(T, trunc_big_out)));
11077516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1108e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ jr(ra);
1109e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ nop();
11107516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1111e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CodeDesc desc;
1112e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  assm.GetCode(&desc);
11139fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
11149fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
11159fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
11167516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1117e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.cvt_big_in = 0xFFFFFFFF;
1118e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.cvt_small_in  = 333;
11197516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1120e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
1121e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  USE(dummy);
11227516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1123e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(t.cvt_big_out, static_cast<double>(t.cvt_big_in));
1124e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(t.cvt_small_out, static_cast<double>(t.cvt_small_in));
11257516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1126e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(static_cast<int>(t.trunc_big_out), static_cast<int>(t.cvt_big_in));
1127e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_EQ(static_cast<int>(t.trunc_small_out),
1128e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org           static_cast<int>(t.cvt_small_in));
11297516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org}
11307516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
11317516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
11327516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgTEST(MIPS14) {
11337516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Test round, floor, ceil, trunc, cvt.
1134e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
1135528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
11362bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
11377516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
11387516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#define ROUND_STRUCT_ELEMENT(x) \
11397516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  int32_t x##_up_out; \
11407516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  int32_t x##_down_out; \
11417516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  int32_t neg_##x##_up_out; \
11427516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  int32_t neg_##x##_down_out; \
114383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  uint32_t x##_err1_out; \
114483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  uint32_t x##_err2_out; \
114583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  uint32_t x##_err3_out; \
114683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  uint32_t x##_err4_out; \
11477516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  int32_t x##_invalid_result;
11487516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
11497516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  typedef struct {
11507516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double round_up_in;
11517516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double round_down_in;
11527516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double neg_round_up_in;
11537516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double neg_round_down_in;
11547516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double err1_in;
11557516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double err2_in;
11567516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double err3_in;
11577516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    double err4_in;
11587516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
11597516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    ROUND_STRUCT_ELEMENT(round)
11607516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    ROUND_STRUCT_ELEMENT(floor)
11617516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    ROUND_STRUCT_ELEMENT(ceil)
11627516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    ROUND_STRUCT_ELEMENT(trunc)
11637516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    ROUND_STRUCT_ELEMENT(cvt)
11647516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  } T;
11657516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  T t;
11667516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
11677516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#undef ROUND_STRUCT_ELEMENT
11687516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
11692bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  MacroAssembler assm(isolate, NULL, 0);
11707516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1171e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Save FCSR.
1172e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ cfc1(a1, FCSR);
1173e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Disable FPU exceptions.
1174e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ctc1(zero_reg, FCSR);
11757516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#define RUN_ROUND_TEST(x) \
1176e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, round_up_in))); \
1177e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ x##_w_d(f0, f0); \
1178e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ swc1(f0, MemOperand(a0, OFFSET_OF(T, x##_up_out))); \
1179e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  \
1180e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, round_down_in))); \
1181e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ x##_w_d(f0, f0); \
1182e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ swc1(f0, MemOperand(a0, OFFSET_OF(T, x##_down_out))); \
1183e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  \
1184e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, neg_round_up_in))); \
1185e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ x##_w_d(f0, f0); \
1186e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ swc1(f0, MemOperand(a0, OFFSET_OF(T, neg_##x##_up_out))); \
1187e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  \
1188e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, neg_round_down_in))); \
1189e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ x##_w_d(f0, f0); \
1190e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ swc1(f0, MemOperand(a0, OFFSET_OF(T, neg_##x##_down_out))); \
1191e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  \
1192e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err1_in))); \
1193e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ctc1(zero_reg, FCSR); \
1194e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ x##_w_d(f0, f0); \
1195e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ cfc1(a2, FCSR); \
1196e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err1_out))); \
1197e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  \
1198e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err2_in))); \
1199e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ctc1(zero_reg, FCSR); \
1200e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ x##_w_d(f0, f0); \
1201e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ cfc1(a2, FCSR); \
1202e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err2_out))); \
1203e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  \
1204e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err3_in))); \
1205e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ctc1(zero_reg, FCSR); \
1206e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ x##_w_d(f0, f0); \
1207e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ cfc1(a2, FCSR); \
1208e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err3_out))); \
1209e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  \
1210e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err4_in))); \
1211e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ctc1(zero_reg, FCSR); \
1212e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ x##_w_d(f0, f0); \
1213e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ cfc1(a2, FCSR); \
1214e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err4_out))); \
1215e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ swc1(f0, MemOperand(a0, OFFSET_OF(T, x##_invalid_result)));
1216e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1217e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  RUN_ROUND_TEST(round)
1218e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  RUN_ROUND_TEST(floor)
1219e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  RUN_ROUND_TEST(ceil)
1220e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  RUN_ROUND_TEST(trunc)
1221e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  RUN_ROUND_TEST(cvt)
1222e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1223e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Restore FCSR.
1224e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ ctc1(a1, FCSR);
12257516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1226e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ jr(ra);
1227e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  __ nop();
12287516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1229e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CodeDesc desc;
1230e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  assm.GetCode(&desc);
12319fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
12329fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
12339fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
12347516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1235e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.round_up_in = 123.51;
1236e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.round_down_in = 123.49;
1237e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.neg_round_up_in = -123.5;
1238e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.neg_round_down_in = -123.49;
1239e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.err1_in = 123.51;
1240e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.err2_in = 1;
1241e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.err3_in = static_cast<double>(1) + 0xFFFFFFFF;
1242e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  t.err4_in = NAN;
12437516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1244e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
1245e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  USE(dummy);
12467516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1247d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com#define GET_FPU_ERR(x) (static_cast<int>(x & kFCSRFlagMask))
1248d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com#define CHECK_ROUND_RESULT(type) \
1249d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com  CHECK(GET_FPU_ERR(t.type##_err1_out) & kFCSRInexactFlagMask); \
1250d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com  CHECK_EQ(0, GET_FPU_ERR(t.type##_err2_out)); \
1251d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com  CHECK(GET_FPU_ERR(t.type##_err3_out) & kFCSRInvalidOpFlagMask); \
1252d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com  CHECK(GET_FPU_ERR(t.type##_err4_out) & kFCSRInvalidOpFlagMask); \
1253d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com  CHECK_EQ(kFPUInvalidResult, t.type##_invalid_result);
1254d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com
1255e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_ROUND_RESULT(round);
1256e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_ROUND_RESULT(floor);
1257e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_ROUND_RESULT(ceil);
1258e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CHECK_ROUND_RESULT(cvt);
12597516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org}
12607516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
126180c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org
126280c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.orgTEST(MIPS15) {
126380c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  // Test chaining of label usages within instructions (issue 1644).
1264e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
1265528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
12662bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
12672bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  Assembler assm(isolate, NULL, 0);
126880c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org
126980c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  Label target;
127080c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  __ beq(v0, v1, &target);
12711805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  __ nop();
127280c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  __ bne(v0, v1, &target);
12731805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  __ nop();
127480c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  __ bind(&target);
127580c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  __ nop();
127680c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org}
127780c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org
12785c838251403b0be9a882540f1922577abba4c872ager@chromium.org#undef __
1279