112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Redistribution and use in source and binary forms, with or without
312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// modification, are permitted provided that the following conditions are
412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// met:
512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org//
612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org//     * Redistributions of source code must retain the above copyright
712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org//       notice, this list of conditions and the following disclaimer.
812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org//     * Redistributions in binary form must reproduce the above
912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org//       copyright notice, this list of conditions and the following
1012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org//       disclaimer in the documentation and/or other materials provided
1112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org//       with the distribution.
1212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org//     * Neither the name of Google Inc. nor the names of its
1312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org//       contributors may be used to endorse or promote products derived
1412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org//       from this software without specific prior written permission.
1512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org//
1612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
2812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "src/v8.h"
2912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
3012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "src/disassembler.h"
3112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "src/factory.h"
3212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "src/macro-assembler.h"
3312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "src/mips64/macro-assembler-mips64.h"
3412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "src/mips64/simulator-mips64.h"
3512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
3612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "test/cctest/cctest.h"
3712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
3812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgusing namespace v8::internal;
3912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
4012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
4112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Define these function prototypes to match JSEntryFunction in execution.cc.
4212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgtypedef Object* (*F1)(int x, int p1, int p2, int p3, int p4);
4312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgtypedef Object* (*F2)(int x, int y, int p2, int p3, int p4);
4412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgtypedef Object* (*F3)(void* p, int p1, int p2, int p3, int p4);
4512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
4612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
4712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#define __ assm.
4812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
4912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
5012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgTEST(MIPS0) {
5112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CcTest::InitializeVM();
5212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
5312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HandleScope scope(isolate);
5412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
5512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MacroAssembler assm(isolate, NULL, 0);
5612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
5712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Addition.
5812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ addu(v0, a0, a1);
5912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ jr(ra);
6012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
6112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
6212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CodeDesc desc;
6312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  assm.GetCode(&desc);
6412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
6512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
6612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  F2 f = FUNCTION_CAST<F2>(code->entry());
6712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int64_t res =
6812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      reinterpret_cast<int64_t>(CALL_GENERATED_CODE(f, 0xab0, 0xc, 0, 0, 0));
6912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ::printf("f() = %ld\n", res);
7012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0xabcL, res);
7112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
7212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
7312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
7412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgTEST(MIPS1) {
7512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CcTest::InitializeVM();
7612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
7712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HandleScope scope(isolate);
7812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
7912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MacroAssembler assm(isolate, NULL, 0);
8012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Label L, C;
8112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
8212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ mov(a1, a0);
8312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ li(v0, 0);
8412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ b(&C);
8512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
8612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
8712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ bind(&L);
8812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ addu(v0, v0, a1);
8912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ addiu(a1, a1, -1);
9012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
9112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ bind(&C);
9212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ xori(v1, a1, 0);
9312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&L, ne, v1, Operand((int64_t)0));
9412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
9512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
9612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ jr(ra);
9712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
9812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
9912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CodeDesc desc;
10012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  assm.GetCode(&desc);
10112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
10212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
10312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  F1 f = FUNCTION_CAST<F1>(code->entry());
10412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int64_t res =
10512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org     reinterpret_cast<int64_t>(CALL_GENERATED_CODE(f, 50, 0, 0, 0, 0));
10612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ::printf("f() = %ld\n", res);
10712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(1275L, res);
10812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
10912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
11012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
11112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgTEST(MIPS2) {
11212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CcTest::InitializeVM();
11312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
11412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HandleScope scope(isolate);
11512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
11612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MacroAssembler assm(isolate, NULL, 0);
11712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
11812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Label exit, error;
11912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
12012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // ----- Test all instructions.
12112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
12212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Test lui, ori, and addiu, used in the li pseudo-instruction.
12312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // This way we can then safely load registers with chosen values.
12412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
12512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ori(a4, zero_reg, 0);
12612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ lui(a4, 0x1234);
12712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ori(a4, a4, 0);
12812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ori(a4, a4, 0x0f0f);
12912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ori(a4, a4, 0xf0f0);
13012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ addiu(a5, a4, 1);
13112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ addiu(a6, a5, -0x10);
13212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
13312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Load values in temporary registers.
13412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ li(a4, 0x00000004);
13512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ li(a5, 0x00001234);
13612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ li(a6, 0x12345678);
13712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ li(a7, 0x7fffffff);
13812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ li(t0, 0xfffffffc);
13912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ li(t1, 0xffffedcc);
14012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ li(t2, 0xedcba988);
14112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ li(t3, 0x80000000);
14212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
14312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // SPECIAL class.
14412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ srl(v0, a6, 8);    // 0x00123456
14512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sll(v0, v0, 11);   // 0x91a2b000
14612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sra(v0, v0, 3);    // 0xf2345600
14712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ srav(v0, v0, a4);  // 0xff234560
14812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sllv(v0, v0, a4);  // 0xf2345600
14912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ srlv(v0, v0, a4);  // 0x0f234560
15012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&error, ne, v0, Operand(0x0f234560));
15112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
15212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
15312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ addu(v0, a4, a5);  // 0x00001238
15412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ subu(v0, v0, a4);  // 0x00001234
15512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&error, ne, v0, Operand(0x00001234));
15612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
15712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ addu(v1, a7, a4);  // 32bit addu result is sign-extended into 64bit reg.
15812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&error, ne, v1, Operand(0xffffffff80000003));
15912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
16012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ subu(v1, t3, a4);  // 0x7ffffffc
16112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&error, ne, v1, Operand(0x7ffffffc));
16212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
16312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
16412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ and_(v0, a5, a6);  // 0x0000000000001230
16512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ or_(v0, v0, a5);   // 0x0000000000001234
16612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ xor_(v0, v0, a6);  // 0x000000001234444c
16712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nor(v0, v0, a6);   // 0xffffffffedcba987
16812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&error, ne, v0, Operand(0xffffffffedcba983));
16912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
17012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
17112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Shift both 32bit number to left, to preserve meaning of next comparison.
17212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ dsll32(a7, a7, 0);
17312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ dsll32(t3, t3, 0);
17412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
17512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ slt(v0, t3, a7);
17612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&error, ne, v0, Operand(0x1));
17712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
17812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sltu(v0, t3, a7);
17912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&error, ne, v0, Operand(zero_reg));
18012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
18112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
18212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Restore original values in registers.
18312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ dsrl32(a7, a7, 0);
18412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ dsrl32(t3, t3, 0);
18512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // End of SPECIAL class.
18612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
18712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ addiu(v0, zero_reg, 0x7421);  // 0x00007421
18812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ addiu(v0, v0, -0x1);          // 0x00007420
18912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ addiu(v0, v0, -0x20);         // 0x00007400
19012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&error, ne, v0, Operand(0x00007400));
19112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
19212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ addiu(v1, a7, 0x1);  // 0x80000000 - result is sign-extended.
19312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&error, ne, v1, Operand(0xffffffff80000000));
19412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
19512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
19612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ slti(v0, a5, 0x00002000);  // 0x1
19712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ slti(v0, v0, 0xffff8000);  // 0x0
19812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&error, ne, v0, Operand(zero_reg));
19912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
20012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sltiu(v0, a5, 0x00002000);  // 0x1
20112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sltiu(v0, v0, 0x00008000);  // 0x1
20212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&error, ne, v0, Operand(0x1));
20312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
20412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
20512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ andi(v0, a5, 0xf0f0);  // 0x00001030
20612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ori(v0, v0, 0x8a00);   // 0x00009a30
20712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ xori(v0, v0, 0x83cc);  // 0x000019fc
20812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&error, ne, v0, Operand(0x000019fc));
20912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
21012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ lui(v1, 0x8123);  // Result is sign-extended into 64bit register.
21112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&error, ne, v1, Operand(0xffffffff81230000));
21212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
21312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
21412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Bit twiddling instructions & conditional moves.
21512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Uses a4-t3 as set above.
21612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Clz(v0, a4);       // 29
21712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Clz(v1, a5);       // 19
21812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ addu(v0, v0, v1);  // 48
21912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Clz(v1, a6);       // 3
22012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ addu(v0, v0, v1);  // 51
22112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Clz(v1, t3);       // 0
22212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ addu(v0, v0, v1);  // 51
22312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&error, ne, v0, Operand(51));
22412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Movn(a0, a7, a4);  // Move a0<-a7 (a4 is NOT 0).
22512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Ins(a0, a5, 12, 8);  // 0x7ff34fff
22612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&error, ne, a0, Operand(0x7ff34fff));
22712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Movz(a0, t2, t3);    // a0 not updated (t3 is NOT 0).
22812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Ext(a1, a0, 8, 12);  // 0x34f
22912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&error, ne, a1, Operand(0x34f));
23012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Movz(a0, t2, v1);    // a0<-t2, v0 is 0, from 8 instr back.
23112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&error, ne, a0, Operand(t2));
23212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
23312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Everything was correctly executed. Load the expected result.
23412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ li(v0, 0x31415926);
23512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ b(&exit);
23612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
23712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
23812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ bind(&error);
23912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Got an error. Return a wrong result.
24012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ li(v0, 666);
24112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
24212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ bind(&exit);
24312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ jr(ra);
24412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
24512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
24612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CodeDesc desc;
24712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  assm.GetCode(&desc);
24812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
24912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
25012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  F2 f = FUNCTION_CAST<F2>(code->entry());
25112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int64_t res =
25212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      reinterpret_cast<int64_t>(CALL_GENERATED_CODE(f, 0xab0, 0xc, 0, 0, 0));
25312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ::printf("f() = %ld\n", res);
25412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
25512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x31415926L, res);
25612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
25712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
25812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
25912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgTEST(MIPS3) {
26012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Test floating point instructions.
26112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CcTest::InitializeVM();
26212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
26312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HandleScope scope(isolate);
26412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
26512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  typedef struct {
26612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double a;
26712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double b;
26812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double c;
26912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double d;
27012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double e;
27112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double f;
27212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double g;
27312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double h;
27412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double i;
27512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } T;
27612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  T t;
27712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
27812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Create a function that accepts &t, and loads, manipulates, and stores
27912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // the doubles t.a ... t.f.
28012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MacroAssembler assm(isolate, NULL, 0);
28112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Label L, C;
28212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
28312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
28412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) );
28512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ add_d(f8, f4, f6);
28612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sdc1(f8, MemOperand(a0, OFFSET_OF(T, c)) );  // c = a + b.
28712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
28812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ mov_d(f10, f8);  // c
28912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ neg_d(f12, f6);  // -b
29012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sub_d(f10, f10, f12);
29112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, d)) );  // d = c - (-b).
29212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
29312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sdc1(f4, MemOperand(a0, OFFSET_OF(T, b)) );   // b = a.
29412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
29512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ li(a4, 120);
29612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ mtc1(a4, f14);
29712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ cvt_d_w(f14, f14);   // f14 = 120.0.
29812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ mul_d(f10, f10, f14);
29912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, e)) );  // e = d * 120 = 1.8066e16.
30012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
30112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ div_d(f12, f10, f4);
30212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sdc1(f12, MemOperand(a0, OFFSET_OF(T, f)) );  // f = e / a = 120.44.
30312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
30412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sqrt_d(f14, f12);
30512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sdc1(f14, MemOperand(a0, OFFSET_OF(T, g)) );
30612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // g = sqrt(f) = 10.97451593465515908537
30712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
30812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (kArchVariant == kMips64r2) {
30912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, h)) );
31012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, i)) );
31112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ madd_d(f14, f6, f4, f6);
31212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ sdc1(f14, MemOperand(a0, OFFSET_OF(T, h)) );
31312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
31412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
31512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ jr(ra);
31612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
31712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
31812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CodeDesc desc;
31912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  assm.GetCode(&desc);
32012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
32112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
32212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
32312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.a = 1.5e14;
32412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.b = 2.75e11;
32512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.c = 0.0;
32612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.d = 0.0;
32712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.e = 0.0;
32812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.f = 0.0;
32912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.h = 1.5;
33012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.i = 2.75;
33112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
33212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  USE(dummy);
33312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(1.5e14, t.a);
33412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(1.5e14, t.b);
33512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(1.50275e14, t.c);
33612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(1.50550e14, t.d);
33712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(1.8066e16, t.e);
33812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(120.44, t.f);
33912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(10.97451593465515908537, t.g);
34012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (kArchVariant == kMips64r2) {
34112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    CHECK_EQ(6.875, t.h);
34212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
34312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
34412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
34512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
34612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgTEST(MIPS4) {
34712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Test moves between floating point and integer registers.
34812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CcTest::InitializeVM();
34912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
35012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HandleScope scope(isolate);
35112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
35212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  typedef struct {
35312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double a;
35412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double b;
35512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double c;
356a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    double d;
357a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    int64_t high;
358a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    int64_t low;
35912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } T;
36012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  T t;
36112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
36212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Assembler assm(isolate, NULL, 0);
36312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Label L, C;
36412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
365a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)));
366a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ ldc1(f5, MemOperand(a0, OFFSET_OF(T, b)));
36712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
36812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Swap f4 and f5, by using 3 integer registers, a4-a6,
36912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // both two 32-bit chunks, and one 64-bit chunk.
37012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // mXhc1 is mips32/64-r2 only, not r1,
37112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // but we will not support r1 in practice.
37212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ mfc1(a4, f4);
37312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ mfhc1(a5, f4);
37412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ dmfc1(a6, f5);
37512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
37612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ mtc1(a4, f5);
37712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ mthc1(a5, f5);
37812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ dmtc1(a6, f4);
37912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
38012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Store the swapped f4 and f5 back to memory.
381a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ sdc1(f4, MemOperand(a0, OFFSET_OF(T, a)));
382a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ sdc1(f5, MemOperand(a0, OFFSET_OF(T, c)));
383a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
384a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  // Test sign extension of move operations from coprocessor.
385a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, d)));
386a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ mfhc1(a4, f4);
387a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ mfc1(a5, f4);
388a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
389a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ sd(a4, MemOperand(a0, OFFSET_OF(T, high)));
390a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ sd(a5, MemOperand(a0, OFFSET_OF(T, low)));
39112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
39212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ jr(ra);
39312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
39412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
39512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CodeDesc desc;
39612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  assm.GetCode(&desc);
39712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
39812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
39912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
40012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.a = 1.5e22;
40112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.b = 2.75e11;
40212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.c = 17.17;
403a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  t.d = -2.75e11;
40412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
40512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  USE(dummy);
40612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
40712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(2.75e11, t.a);
40812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(2.75e11, t.b);
40912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(1.5e22, t.c);
410a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  CHECK_EQ(0xffffffffc25001d1L, t.high);
411a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  CHECK_EQ(0xffffffffbf800000L, t.low);
41212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
41312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
41412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
41512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgTEST(MIPS5) {
41612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Test conversions between doubles and integers.
41712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CcTest::InitializeVM();
41812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
41912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HandleScope scope(isolate);
42012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
42112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  typedef struct {
42212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double a;
42312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double b;
42412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int i;
42512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int j;
42612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } T;
42712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  T t;
42812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
42912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Assembler assm(isolate, NULL, 0);
43012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Label L, C;
43112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
43212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Load all structure elements to registers.
43312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
43412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) );
43512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ lw(a4, MemOperand(a0, OFFSET_OF(T, i)) );
43612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ lw(a5, MemOperand(a0, OFFSET_OF(T, j)) );
43712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
43812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Convert double in f4 to int in element i.
43912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ cvt_w_d(f8, f4);
44012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ mfc1(a6, f8);
44112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(a6, MemOperand(a0, OFFSET_OF(T, i)) );
44212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
44312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Convert double in f6 to int in element j.
44412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ cvt_w_d(f10, f6);
44512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ mfc1(a7, f10);
44612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(a7, MemOperand(a0, OFFSET_OF(T, j)) );
44712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
44812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Convert int in original i (a4) to double in a.
44912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ mtc1(a4, f12);
45012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ cvt_d_w(f0, f12);
45112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sdc1(f0, MemOperand(a0, OFFSET_OF(T, a)) );
45212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
45312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Convert int in original j (a5) to double in b.
45412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ mtc1(a5, f14);
45512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ cvt_d_w(f2, f14);
45612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sdc1(f2, MemOperand(a0, OFFSET_OF(T, b)) );
45712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
45812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ jr(ra);
45912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
46012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
46112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CodeDesc desc;
46212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  assm.GetCode(&desc);
46312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
46412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
46512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
46612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.a = 1.5e4;
46712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.b = 2.75e8;
46812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.i = 12345678;
46912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.j = -100000;
47012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
47112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  USE(dummy);
47212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
47312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(12345678.0, t.a);
47412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(-100000.0, t.b);
47512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(15000, t.i);
47612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(275000000, t.j);
47712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
47812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
47912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
48012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgTEST(MIPS6) {
48112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Test simple memory loads and stores.
48212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CcTest::InitializeVM();
48312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
48412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HandleScope scope(isolate);
48512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
48612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  typedef struct {
48712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    uint32_t ui;
48812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t si;
48912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t r1;
49012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t r2;
49112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t r3;
49212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t r4;
49312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t r5;
49412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t r6;
49512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } T;
49612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  T t;
49712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
49812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Assembler assm(isolate, NULL, 0);
49912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Label L, C;
50012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
50112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Basic word load/store.
50212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ lw(a4, MemOperand(a0, OFFSET_OF(T, ui)) );
50312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(a4, MemOperand(a0, OFFSET_OF(T, r1)) );
50412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
50512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // lh with positive data.
50612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ lh(a5, MemOperand(a0, OFFSET_OF(T, ui)) );
50712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(a5, MemOperand(a0, OFFSET_OF(T, r2)) );
50812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
50912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // lh with negative data.
51012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ lh(a6, MemOperand(a0, OFFSET_OF(T, si)) );
51112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(a6, MemOperand(a0, OFFSET_OF(T, r3)) );
51212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
51312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // lhu with negative data.
51412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ lhu(a7, MemOperand(a0, OFFSET_OF(T, si)) );
51512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(a7, MemOperand(a0, OFFSET_OF(T, r4)) );
51612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
51712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // lb with negative data.
51812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ lb(t0, MemOperand(a0, OFFSET_OF(T, si)) );
51912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(t0, MemOperand(a0, OFFSET_OF(T, r5)) );
52012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
52112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // sh writes only 1/2 of word.
52212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ lui(t1, 0x3333);
52312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ori(t1, t1, 0x3333);
52412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(t1, MemOperand(a0, OFFSET_OF(T, r6)) );
52512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ lhu(t1, MemOperand(a0, OFFSET_OF(T, si)) );
52612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sh(t1, MemOperand(a0, OFFSET_OF(T, r6)) );
52712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
52812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ jr(ra);
52912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
53012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
53112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CodeDesc desc;
53212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  assm.GetCode(&desc);
53312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
53412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
53512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
53612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.ui = 0x11223344;
53712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.si = 0x99aabbcc;
53812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
53912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  USE(dummy);
54012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
54112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x11223344, t.r1);
54212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x3344, t.r2);
54312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0xffffbbcc, t.r3);
54412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x0000bbcc, t.r4);
54512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0xffffffcc, t.r5);
54612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x3333bbcc, t.r6);
54712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
54812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
54912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
55012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgTEST(MIPS7) {
55112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Test floating point compare and branch instructions.
55212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CcTest::InitializeVM();
55312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
55412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HandleScope scope(isolate);
55512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
55612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  typedef struct {
55712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double a;
55812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double b;
55912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double c;
56012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double d;
56112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double e;
56212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double f;
56312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t result;
56412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } T;
56512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  T t;
56612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
56712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Create a function that accepts &t, and loads, manipulates, and stores
56812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // the doubles t.a ... t.f.
56912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MacroAssembler assm(isolate, NULL, 0);
57012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Label neither_is_nan, less_than, outa_here;
57112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
57212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
57312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) );
574dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  if (kArchVariant != kMips64r6) {
575dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    __ c(UN, D, f4, f6);
576dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    __ bc1f(&neither_is_nan);
577dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  } else {
578dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    __ cmp(UN, L, f2, f4, f6);
579dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    __ bc1eqz(&neither_is_nan, f2);
580dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  }
58112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
58212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(zero_reg, MemOperand(a0, OFFSET_OF(T, result)) );
58312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&outa_here);
58412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
58512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ bind(&neither_is_nan);
58612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
587dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  if (kArchVariant == kMips64r6) {
588dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    __ cmp(OLT, L, f2, f6, f4);
589dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    __ bc1nez(&less_than, f2);
59012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
59112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ c(OLT, D, f6, f4, 2);
59212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ bc1t(&less_than, 2);
59312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
594dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
59512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
59612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(zero_reg, MemOperand(a0, OFFSET_OF(T, result)) );
59712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&outa_here);
59812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
59912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ bind(&less_than);
60012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Addu(a4, zero_reg, Operand(1));
60112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(a4, MemOperand(a0, OFFSET_OF(T, result)) );  // Set true.
60212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
60312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
60412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // This test-case should have additional tests.
60512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
60612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ bind(&outa_here);
60712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
60812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ jr(ra);
60912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
61012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
61112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CodeDesc desc;
61212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  assm.GetCode(&desc);
61312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
61412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
61512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
61612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.a = 1.5e14;
61712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.b = 2.75e11;
61812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.c = 2.0;
61912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.d = -4.0;
62012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.e = 0.0;
62112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.f = 0.0;
62212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.result = 0;
62312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
62412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  USE(dummy);
62512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(1.5e14, t.a);
62612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(2.75e11, t.b);
62712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(1, t.result);
62812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
62912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
63012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
63112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgTEST(MIPS8) {
63212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Test ROTR and ROTRV instructions.
63312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CcTest::InitializeVM();
63412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
63512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HandleScope scope(isolate);
63612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
63712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  typedef struct {
63812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t input;
63912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t result_rotr_4;
64012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t result_rotr_8;
64112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t result_rotr_12;
64212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t result_rotr_16;
64312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t result_rotr_20;
64412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t result_rotr_24;
64512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t result_rotr_28;
64612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t result_rotrv_4;
64712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t result_rotrv_8;
64812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t result_rotrv_12;
64912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t result_rotrv_16;
65012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t result_rotrv_20;
65112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t result_rotrv_24;
65212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t result_rotrv_28;
65312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } T;
65412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  T t;
65512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
65612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MacroAssembler assm(isolate, NULL, 0);
65712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
65812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Basic word load.
65912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ lw(a4, MemOperand(a0, OFFSET_OF(T, input)) );
66012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
66112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // ROTR instruction (called through the Ror macro).
66212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Ror(a5, a4, 0x0004);
66312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Ror(a6, a4, 0x0008);
66412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Ror(a7, a4, 0x000c);
66512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Ror(t0, a4, 0x0010);
66612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Ror(t1, a4, 0x0014);
66712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Ror(t2, a4, 0x0018);
66812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Ror(t3, a4, 0x001c);
66912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
67012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Basic word store.
67112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(a5, MemOperand(a0, OFFSET_OF(T, result_rotr_4)) );
67212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(a6, MemOperand(a0, OFFSET_OF(T, result_rotr_8)) );
67312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(a7, MemOperand(a0, OFFSET_OF(T, result_rotr_12)) );
67412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(t0, MemOperand(a0, OFFSET_OF(T, result_rotr_16)) );
67512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(t1, MemOperand(a0, OFFSET_OF(T, result_rotr_20)) );
67612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(t2, MemOperand(a0, OFFSET_OF(T, result_rotr_24)) );
67712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(t3, MemOperand(a0, OFFSET_OF(T, result_rotr_28)) );
67812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
67912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // ROTRV instruction (called through the Ror macro).
68012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ li(t3, 0x0004);
68112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Ror(a5, a4, t3);
68212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ li(t3, 0x0008);
68312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Ror(a6, a4, t3);
68412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ li(t3, 0x000C);
68512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Ror(a7, a4, t3);
68612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ li(t3, 0x0010);
68712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Ror(t0, a4, t3);
68812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ li(t3, 0x0014);
68912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Ror(t1, a4, t3);
69012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ li(t3, 0x0018);
69112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Ror(t2, a4, t3);
69212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ li(t3, 0x001C);
69312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Ror(t3, a4, t3);
69412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
69512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Basic word store.
69612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(a5, MemOperand(a0, OFFSET_OF(T, result_rotrv_4)) );
69712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(a6, MemOperand(a0, OFFSET_OF(T, result_rotrv_8)) );
69812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(a7, MemOperand(a0, OFFSET_OF(T, result_rotrv_12)) );
69912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(t0, MemOperand(a0, OFFSET_OF(T, result_rotrv_16)) );
70012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(t1, MemOperand(a0, OFFSET_OF(T, result_rotrv_20)) );
70112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(t2, MemOperand(a0, OFFSET_OF(T, result_rotrv_24)) );
70212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(t3, MemOperand(a0, OFFSET_OF(T, result_rotrv_28)) );
70312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
70412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ jr(ra);
70512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
70612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
70712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CodeDesc desc;
70812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  assm.GetCode(&desc);
70912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
71012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
71112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
71212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.input = 0x12345678;
71312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0x0, 0, 0, 0);
71412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  USE(dummy);
71512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x81234567, t.result_rotr_4);
71612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x78123456, t.result_rotr_8);
71712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x67812345, t.result_rotr_12);
71812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x56781234, t.result_rotr_16);
71912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x45678123, t.result_rotr_20);
72012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x34567812, t.result_rotr_24);
72112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x23456781, t.result_rotr_28);
72212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
72312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x81234567, t.result_rotrv_4);
72412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x78123456, t.result_rotrv_8);
72512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x67812345, t.result_rotrv_12);
72612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x56781234, t.result_rotrv_16);
72712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x45678123, t.result_rotrv_20);
72812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x34567812, t.result_rotrv_24);
72912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x23456781, t.result_rotrv_28);
73012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
73112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
73212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
73312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgTEST(MIPS9) {
73412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Test BRANCH improvements.
73512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CcTest::InitializeVM();
73612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
73712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HandleScope scope(isolate);
73812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
73912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MacroAssembler assm(isolate, NULL, 0);
74012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Label exit, exit2, exit3;
74112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
74212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&exit, ge, a0, Operand(zero_reg));
74312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&exit2, ge, a0, Operand(0x00001FFF));
74412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Branch(&exit3, ge, a0, Operand(0x0001FFFF));
74512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
74612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ bind(&exit);
74712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ bind(&exit2);
74812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ bind(&exit3);
74912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ jr(ra);
75012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
75112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
75212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CodeDesc desc;
75312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  assm.GetCode(&desc);
75412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  isolate->factory()->NewCode(
75512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
75612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
75712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
75812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
75912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgTEST(MIPS10) {
76012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Test conversions between doubles and long integers.
76112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Test hos the long ints map to FP regs pairs.
76212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CcTest::InitializeVM();
76312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
76412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HandleScope scope(isolate);
76512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
76612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  typedef struct {
76712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double a;
76812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double a_converted;
76912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double b;
77012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t dbl_mant;
77112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t dbl_exp;
77212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t long_hi;
77312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t long_lo;
77412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int64_t long_as_int64;
77512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t b_long_hi;
77612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t b_long_lo;
77712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int64_t b_long_as_int64;
77812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } T;
77912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  T t;
78012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
78112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Assembler assm(isolate, NULL, 0);
78212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Label L, C;
78312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
78412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (kArchVariant == kMips64r2) {
78512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // Rewritten for FR=1 FPU mode:
78612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    //  -  32 FP regs of 64-bits each, no odd/even pairs.
78712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    //  -  Note that cvt_l_d/cvt_d_l ARE legal in FR=1 mode.
78812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // Load all structure elements to registers.
78912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, a)));
79012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
79112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // Save the raw bits of the double.
79212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ mfc1(a4, f0);
79312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ mfhc1(a5, f0);
79412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ sw(a4, MemOperand(a0, OFFSET_OF(T, dbl_mant)));
79512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ sw(a5, MemOperand(a0, OFFSET_OF(T, dbl_exp)));
79612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
79712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // Convert double in f0 to long, save hi/lo parts.
79812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ cvt_l_d(f0, f0);
79912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ mfc1(a4, f0);  // f0 LS 32 bits of long.
80012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ mfhc1(a5, f0);  // f0 MS 32 bits of long.
80112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ sw(a4, MemOperand(a0, OFFSET_OF(T, long_lo)));
80212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ sw(a5, MemOperand(a0, OFFSET_OF(T, long_hi)));
80312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
80412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // Combine the high/low ints, convert back to double.
80512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ dsll32(a6, a5, 0);  // Move a5 to high bits of a6.
80612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ or_(a6, a6, a4);
80712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ dmtc1(a6, f1);
80812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ cvt_d_l(f1, f1);
80912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ sdc1(f1, MemOperand(a0, OFFSET_OF(T, a_converted)));
81012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
81112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
81212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // Convert the b long integers to double b.
81312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ lw(a4, MemOperand(a0, OFFSET_OF(T, b_long_lo)));
81412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ lw(a5, MemOperand(a0, OFFSET_OF(T, b_long_hi)));
81512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ mtc1(a4, f8);  // f8 LS 32-bits.
81612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ mthc1(a5, f8);  // f8 MS 32-bits.
81712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ cvt_d_l(f10, f8);
81812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, b)));
81912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
82012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // Convert double b back to long-int.
82112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ ldc1(f31, MemOperand(a0, OFFSET_OF(T, b)));
82212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ cvt_l_d(f31, f31);
82312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ dmfc1(a7, f31);
82412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ sd(a7, MemOperand(a0, OFFSET_OF(T, b_long_as_int64)));
82512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
82612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
82712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ jr(ra);
82812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    __ nop();
82912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
83012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    CodeDesc desc;
83112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    assm.GetCode(&desc);
83212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    Handle<Code> code = isolate->factory()->NewCode(
83312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
83412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    F3 f = FUNCTION_CAST<F3>(code->entry());
83512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    t.a = 2.147483647e9;       // 0x7fffffff -> 0x41DFFFFFFFC00000 as double.
83612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    t.b_long_hi = 0x000000ff;  // 0xFF00FF00FF -> 0x426FE01FE01FE000 as double.
83712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    t.b_long_lo = 0x00ff00ff;
83812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
83912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    USE(dummy);
84012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
84112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    CHECK_EQ(0x41DFFFFF, t.dbl_exp);
84212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    CHECK_EQ(0xFFC00000, t.dbl_mant);
84312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    CHECK_EQ(0, t.long_hi);
84412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    CHECK_EQ(0x7fffffff, t.long_lo);
84512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    CHECK_EQ(2.147483647e9, t.a_converted);
84612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
84712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // 0xFF00FF00FF -> 1.095233372415e12.
84812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    CHECK_EQ(1.095233372415e12, t.b);
84912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    CHECK_EQ(0xFF00FF00FF, t.b_long_as_int64);
85012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
85112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
85212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
85312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
85412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgTEST(MIPS11) {
855dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  // Do not run test on MIPS64r6, as these instructions are removed.
856dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  if (kArchVariant != kMips64r6) {
857dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    // Test LWL, LWR, SWL and SWR instructions.
858dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    CcTest::InitializeVM();
859dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    Isolate* isolate = CcTest::i_isolate();
860dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    HandleScope scope(isolate);
861dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
862dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    typedef struct {
863dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      int32_t reg_init;
864dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      int32_t mem_init;
865dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      int32_t lwl_0;
866dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      int32_t lwl_1;
867dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      int32_t lwl_2;
868dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      int32_t lwl_3;
869dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      int32_t lwr_0;
870dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      int32_t lwr_1;
871dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      int32_t lwr_2;
872dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      int32_t lwr_3;
873dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      int32_t swl_0;
874dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      int32_t swl_1;
875dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      int32_t swl_2;
876dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      int32_t swl_3;
877dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      int32_t swr_0;
878dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      int32_t swr_1;
879dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      int32_t swr_2;
880dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      int32_t swr_3;
881dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    } T;
882dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    T t;
883dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
884dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    Assembler assm(isolate, NULL, 0);
885dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
886dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    // Test all combinations of LWL and vAddr.
887a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a4, MemOperand(a0, OFFSET_OF(T, reg_init)));
888a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lwl(a4, MemOperand(a0, OFFSET_OF(T, mem_init)));
889a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ sw(a4, MemOperand(a0, OFFSET_OF(T, lwl_0)));
890dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
891a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a5, MemOperand(a0, OFFSET_OF(T, reg_init)));
892a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lwl(a5, MemOperand(a0, OFFSET_OF(T, mem_init) + 1));
893a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ sw(a5, MemOperand(a0, OFFSET_OF(T, lwl_1)));
894dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
895a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a6, MemOperand(a0, OFFSET_OF(T, reg_init)));
896a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lwl(a6, MemOperand(a0, OFFSET_OF(T, mem_init) + 2));
897a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ sw(a6, MemOperand(a0, OFFSET_OF(T, lwl_2)));
898dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
899a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a7, MemOperand(a0, OFFSET_OF(T, reg_init)));
900a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lwl(a7, MemOperand(a0, OFFSET_OF(T, mem_init) + 3));
901a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ sw(a7, MemOperand(a0, OFFSET_OF(T, lwl_3)));
902dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
903dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    // Test all combinations of LWR and vAddr.
904a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a4, MemOperand(a0, OFFSET_OF(T, reg_init)));
905a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lwr(a4, MemOperand(a0, OFFSET_OF(T, mem_init)));
906a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ sw(a4, MemOperand(a0, OFFSET_OF(T, lwr_0)));
907dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
908a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a5, MemOperand(a0, OFFSET_OF(T, reg_init)));
909a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lwr(a5, MemOperand(a0, OFFSET_OF(T, mem_init) + 1));
910a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ sw(a5, MemOperand(a0, OFFSET_OF(T, lwr_1)));
911dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
912a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a6, MemOperand(a0, OFFSET_OF(T, reg_init)));
913a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lwr(a6, MemOperand(a0, OFFSET_OF(T, mem_init) + 2));
914dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    __ sw(a6, MemOperand(a0, OFFSET_OF(T, lwr_2)) );
915dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
916a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a7, MemOperand(a0, OFFSET_OF(T, reg_init)));
917a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lwr(a7, MemOperand(a0, OFFSET_OF(T, mem_init) + 3));
918dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    __ sw(a7, MemOperand(a0, OFFSET_OF(T, lwr_3)) );
919dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
920dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    // Test all combinations of SWL and vAddr.
921a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a4, MemOperand(a0, OFFSET_OF(T, mem_init)));
922a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ sw(a4, MemOperand(a0, OFFSET_OF(T, swl_0)));
923a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a4, MemOperand(a0, OFFSET_OF(T, reg_init)));
924a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ swl(a4, MemOperand(a0, OFFSET_OF(T, swl_0)));
925a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
926a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a5, MemOperand(a0, OFFSET_OF(T, mem_init)));
927a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ sw(a5, MemOperand(a0, OFFSET_OF(T, swl_1)));
928a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a5, MemOperand(a0, OFFSET_OF(T, reg_init)));
929a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ swl(a5, MemOperand(a0, OFFSET_OF(T, swl_1) + 1));
930a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
931a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a6, MemOperand(a0, OFFSET_OF(T, mem_init)));
932a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ sw(a6, MemOperand(a0, OFFSET_OF(T, swl_2)));
933a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a6, MemOperand(a0, OFFSET_OF(T, reg_init)));
934a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ swl(a6, MemOperand(a0, OFFSET_OF(T, swl_2) + 2));
935a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
936a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a7, MemOperand(a0, OFFSET_OF(T, mem_init)));
937a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ sw(a7, MemOperand(a0, OFFSET_OF(T, swl_3)));
938a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a7, MemOperand(a0, OFFSET_OF(T, reg_init)));
939a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ swl(a7, MemOperand(a0, OFFSET_OF(T, swl_3) + 3));
940dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
941dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    // Test all combinations of SWR and vAddr.
942a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a4, MemOperand(a0, OFFSET_OF(T, mem_init)));
943a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ sw(a4, MemOperand(a0, OFFSET_OF(T, swr_0)));
944a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a4, MemOperand(a0, OFFSET_OF(T, reg_init)));
945a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ swr(a4, MemOperand(a0, OFFSET_OF(T, swr_0)));
946a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
947a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a5, MemOperand(a0, OFFSET_OF(T, mem_init)));
948a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ sw(a5, MemOperand(a0, OFFSET_OF(T, swr_1)));
949a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a5, MemOperand(a0, OFFSET_OF(T, reg_init)));
950a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ swr(a5, MemOperand(a0, OFFSET_OF(T, swr_1) + 1));
951a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
952a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a6, MemOperand(a0, OFFSET_OF(T, mem_init)));
953a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ sw(a6, MemOperand(a0, OFFSET_OF(T, swr_2)));
954a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a6, MemOperand(a0, OFFSET_OF(T, reg_init)));
955a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ swr(a6, MemOperand(a0, OFFSET_OF(T, swr_2) + 2));
956a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
957a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a7, MemOperand(a0, OFFSET_OF(T, mem_init)));
958a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ sw(a7, MemOperand(a0, OFFSET_OF(T, swr_3)));
959a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ lw(a7, MemOperand(a0, OFFSET_OF(T, reg_init)));
960a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    __ swr(a7, MemOperand(a0, OFFSET_OF(T, swr_3) + 3));
96112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
962dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    __ jr(ra);
963dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    __ nop();
96412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
965dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    CodeDesc desc;
966dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    assm.GetCode(&desc);
967dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    Handle<Code> code = isolate->factory()->NewCode(
968dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org        desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
969dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    F3 f = FUNCTION_CAST<F3>(code->entry());
970dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    t.reg_init = 0xaabbccdd;
971dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    t.mem_init = 0x11223344;
97212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
973dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
974dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    USE(dummy);
97512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
976dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    CHECK_EQ(0x44bbccdd, t.lwl_0);
977dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    CHECK_EQ(0x3344ccdd, t.lwl_1);
978dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    CHECK_EQ(0x223344dd, t.lwl_2);
979dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    CHECK_EQ(0x11223344, t.lwl_3);
980dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
981dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    CHECK_EQ(0x11223344, t.lwr_0);
982dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    CHECK_EQ(0xaa112233, t.lwr_1);
983dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    CHECK_EQ(0xaabb1122, t.lwr_2);
984dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    CHECK_EQ(0xaabbcc11, t.lwr_3);
985dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
986dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    CHECK_EQ(0x112233aa, t.swl_0);
987dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    CHECK_EQ(0x1122aabb, t.swl_1);
988dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    CHECK_EQ(0x11aabbcc, t.swl_2);
989dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    CHECK_EQ(0xaabbccdd, t.swl_3);
990dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
991dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    CHECK_EQ(0xaabbccdd, t.swr_0);
992dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    CHECK_EQ(0xbbccdd44, t.swr_1);
993dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    CHECK_EQ(0xccdd3344, t.swr_2);
994dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    CHECK_EQ(0xdd223344, t.swr_3);
995dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  }
99612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
99712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
99812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
99912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgTEST(MIPS12) {
100012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CcTest::InitializeVM();
100112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
100212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HandleScope scope(isolate);
100312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
100412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  typedef struct {
100512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      int32_t  x;
100612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      int32_t  y;
100712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      int32_t  y1;
100812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      int32_t  y2;
100912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      int32_t  y3;
101012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      int32_t  y4;
101112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } T;
101212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  T t;
101312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
101412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MacroAssembler assm(isolate, NULL, 0);
101512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
101612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ mov(t2, fp);  // Save frame pointer.
101712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ mov(fp, a0);  // Access struct T by fp.
1018a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ lw(a4, MemOperand(a0, OFFSET_OF(T, y)));
1019a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ lw(a7, MemOperand(a0, OFFSET_OF(T, y4)));
102012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
102112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ addu(a5, a4, a7);
102212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ subu(t0, a4, a7);
102312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
102412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ push(a4);  // These instructions disappear after opt.
102512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Pop();
102612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ addu(a4, a4, a4);
102712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
102812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Pop();     // These instructions disappear after opt.
102912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ push(a7);
103012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
103112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ push(a7);  // These instructions disappear after opt.
103212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ pop(a7);
103312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
103412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ push(a7);
103512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ pop(t0);
103612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
1037a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ sw(a4, MemOperand(fp, OFFSET_OF(T, y)));
1038a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ lw(a4, MemOperand(fp, OFFSET_OF(T, y)));
103912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
1040a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ sw(a4, MemOperand(fp, OFFSET_OF(T, y)));
1041a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ lw(a5, MemOperand(fp, OFFSET_OF(T, y)));
104212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
104312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ push(a5);
1044a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ lw(a5, MemOperand(fp, OFFSET_OF(T, y)));
104512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ pop(a5);
104612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
104712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ push(a5);
1048a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ lw(a6, MemOperand(fp, OFFSET_OF(T, y)));
104912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ pop(a5);
105012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
105112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ push(a5);
1052a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ lw(a6, MemOperand(fp, OFFSET_OF(T, y)));
105312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ pop(a6);
105412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
105512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ push(a6);
1056a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ lw(a6, MemOperand(fp, OFFSET_OF(T, y)));
105712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ pop(a5);
105812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
105912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ push(a5);
1060a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ lw(a6, MemOperand(fp, OFFSET_OF(T, y)));
106112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ pop(a7);
106212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
106312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
106412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ mov(fp, t2);
106512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ jr(ra);
106612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
106712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
106812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CodeDesc desc;
106912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  assm.GetCode(&desc);
107012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
107112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
107212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
107312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.x = 1;
107412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.y = 2;
107512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.y1 = 3;
107612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.y2 = 4;
107712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.y3 = 0XBABA;
107812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.y4 = 0xDEDA;
107912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
108012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
108112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  USE(dummy);
108212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
108312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(3, t.y1);
108412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
108512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
108612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
108712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgTEST(MIPS13) {
108812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Test Cvt_d_uw and Trunc_uw_d macros.
108912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CcTest::InitializeVM();
109012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
109112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HandleScope scope(isolate);
109212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
109312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  typedef struct {
109412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double cvt_big_out;
109512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double cvt_small_out;
109612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    uint32_t trunc_big_out;
109712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    uint32_t trunc_small_out;
109812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    uint32_t cvt_big_in;
109912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    uint32_t cvt_small_in;
110012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } T;
110112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  T t;
110212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
110312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MacroAssembler assm(isolate, NULL, 0);
110412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
110512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(a4, MemOperand(a0, OFFSET_OF(T, cvt_small_in)));
110612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Cvt_d_uw(f10, a4, f22);
110712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, cvt_small_out)));
110812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
110912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Trunc_uw_d(f10, f10, f22);
111012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ swc1(f10, MemOperand(a0, OFFSET_OF(T, trunc_small_out)));
111112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
111212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(a4, MemOperand(a0, OFFSET_OF(T, cvt_big_in)));
111312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Cvt_d_uw(f8, a4, f22);
111412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sdc1(f8, MemOperand(a0, OFFSET_OF(T, cvt_big_out)));
111512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
111612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ Trunc_uw_d(f8, f8, f22);
111712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ swc1(f8, MemOperand(a0, OFFSET_OF(T, trunc_big_out)));
111812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
111912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ jr(ra);
112012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
112112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
112212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CodeDesc desc;
112312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  assm.GetCode(&desc);
112412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
112512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
112612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
112712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
112812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.cvt_big_in = 0xFFFFFFFF;
112912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.cvt_small_in  = 333;
113012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
113112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
113212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  USE(dummy);
113312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
113412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(t.cvt_big_out, static_cast<double>(t.cvt_big_in));
113512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(t.cvt_small_out, static_cast<double>(t.cvt_small_in));
113612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
113712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(static_cast<int>(t.trunc_big_out), static_cast<int>(t.cvt_big_in));
113812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(static_cast<int>(t.trunc_small_out),
113912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org           static_cast<int>(t.cvt_small_in));
114012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
114112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
114212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
114312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgTEST(MIPS14) {
114412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Test round, floor, ceil, trunc, cvt.
114512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CcTest::InitializeVM();
114612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
114712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HandleScope scope(isolate);
114812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
114912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#define ROUND_STRUCT_ELEMENT(x) \
115012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int32_t x##_up_out; \
115112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int32_t x##_down_out; \
115212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int32_t neg_##x##_up_out; \
115312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int32_t neg_##x##_down_out; \
115412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  uint32_t x##_err1_out; \
115512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  uint32_t x##_err2_out; \
115612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  uint32_t x##_err3_out; \
115712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  uint32_t x##_err4_out; \
115812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int32_t x##_invalid_result;
115912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
116012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  typedef struct {
116112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double round_up_in;
116212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double round_down_in;
116312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double neg_round_up_in;
116412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double neg_round_down_in;
116512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double err1_in;
116612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double err2_in;
116712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double err3_in;
116812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    double err4_in;
116912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
117012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    ROUND_STRUCT_ELEMENT(round)
117112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    ROUND_STRUCT_ELEMENT(floor)
117212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    ROUND_STRUCT_ELEMENT(ceil)
117312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    ROUND_STRUCT_ELEMENT(trunc)
117412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    ROUND_STRUCT_ELEMENT(cvt)
117512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } T;
117612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  T t;
117712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
117812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#undef ROUND_STRUCT_ELEMENT
117912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
118012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MacroAssembler assm(isolate, NULL, 0);
118112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
118212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Save FCSR.
118312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ cfc1(a1, FCSR);
118412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Disable FPU exceptions.
118512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ctc1(zero_reg, FCSR);
118612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#define RUN_ROUND_TEST(x) \
118712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, round_up_in))); \
118812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ x##_w_d(f0, f0); \
118912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ swc1(f0, MemOperand(a0, OFFSET_OF(T, x##_up_out))); \
119012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  \
119112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, round_down_in))); \
119212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ x##_w_d(f0, f0); \
119312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ swc1(f0, MemOperand(a0, OFFSET_OF(T, x##_down_out))); \
119412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  \
119512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, neg_round_up_in))); \
119612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ x##_w_d(f0, f0); \
119712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ swc1(f0, MemOperand(a0, OFFSET_OF(T, neg_##x##_up_out))); \
119812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  \
119912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, neg_round_down_in))); \
120012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ x##_w_d(f0, f0); \
120112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ swc1(f0, MemOperand(a0, OFFSET_OF(T, neg_##x##_down_out))); \
120212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  \
120312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err1_in))); \
120412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ctc1(zero_reg, FCSR); \
120512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ x##_w_d(f0, f0); \
120612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ cfc1(a2, FCSR); \
120712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err1_out))); \
120812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  \
120912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err2_in))); \
121012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ctc1(zero_reg, FCSR); \
121112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ x##_w_d(f0, f0); \
121212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ cfc1(a2, FCSR); \
121312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err2_out))); \
121412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  \
121512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err3_in))); \
121612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ctc1(zero_reg, FCSR); \
121712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ x##_w_d(f0, f0); \
121812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ cfc1(a2, FCSR); \
121912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err3_out))); \
122012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  \
122112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err4_in))); \
122212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ctc1(zero_reg, FCSR); \
122312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ x##_w_d(f0, f0); \
122412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ cfc1(a2, FCSR); \
122512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err4_out))); \
122612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ swc1(f0, MemOperand(a0, OFFSET_OF(T, x##_invalid_result)));
122712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
122812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  RUN_ROUND_TEST(round)
122912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  RUN_ROUND_TEST(floor)
123012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  RUN_ROUND_TEST(ceil)
123112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  RUN_ROUND_TEST(trunc)
123212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  RUN_ROUND_TEST(cvt)
123312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
123412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Restore FCSR.
123512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ctc1(a1, FCSR);
123612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
123712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ jr(ra);
123812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
123912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
124012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CodeDesc desc;
124112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  assm.GetCode(&desc);
124212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
124312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
124412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
124512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
124612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.round_up_in = 123.51;
124712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.round_down_in = 123.49;
124812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.neg_round_up_in = -123.5;
124912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.neg_round_down_in = -123.49;
125012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.err1_in = 123.51;
125112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.err2_in = 1;
125212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.err3_in = static_cast<double>(1) + 0xFFFFFFFF;
125312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.err4_in = NAN;
125412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
125512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
125612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  USE(dummy);
125712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
125812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#define GET_FPU_ERR(x) (static_cast<int>(x & kFCSRFlagMask))
125912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#define CHECK_ROUND_RESULT(type) \
126012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK(GET_FPU_ERR(t.type##_err1_out) & kFCSRInexactFlagMask); \
126112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0, GET_FPU_ERR(t.type##_err2_out)); \
126212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK(GET_FPU_ERR(t.type##_err3_out) & kFCSRInvalidOpFlagMask); \
126312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK(GET_FPU_ERR(t.type##_err4_out) & kFCSRInvalidOpFlagMask); \
126412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(static_cast<int32_t>(kFPUInvalidResult), t.type##_invalid_result);
126512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
126612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_ROUND_RESULT(round);
126712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_ROUND_RESULT(floor);
126812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_ROUND_RESULT(ceil);
126912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_ROUND_RESULT(cvt);
127012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
127112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
127212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
127312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgTEST(MIPS15) {
127412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Test chaining of label usages within instructions (issue 1644).
127512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CcTest::InitializeVM();
127612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
127712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HandleScope scope(isolate);
127812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Assembler assm(isolate, NULL, 0);
127912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
128012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Label target;
128112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ beq(v0, v1, &target);
128212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
128312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ bne(v0, v1, &target);
128412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
128512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ bind(&target);
128612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
128712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
128812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
128912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
129012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// ----- mips64 tests -----------------------------------------------
129112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
129212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgTEST(MIPS16) {
129312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Test 64-bit memory loads and stores.
129412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CcTest::InitializeVM();
129512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
129612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HandleScope scope(isolate);
129712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
129812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  typedef struct {
129912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int64_t r1;
130012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int64_t r2;
130112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int64_t r3;
130212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int64_t r4;
130312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int64_t r5;
130412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int64_t r6;
130512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    uint32_t ui;
130612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int32_t si;
130712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } T;
130812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  T t;
130912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
131012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Assembler assm(isolate, NULL, 0);
131112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Label L, C;
131212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
131312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Basic 32-bit word load/store, with un-signed data.
1314a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ lw(a4, MemOperand(a0, OFFSET_OF(T, ui)));
1315a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ sw(a4, MemOperand(a0, OFFSET_OF(T, r1)));
131612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
131712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Check that the data got zero-extended into 64-bit a4.
1318a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ sd(a4, MemOperand(a0, OFFSET_OF(T, r2)));
131912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
132012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Basic 32-bit word load/store, with SIGNED data.
1321a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ lw(a5, MemOperand(a0, OFFSET_OF(T, si)));
1322a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ sw(a5, MemOperand(a0, OFFSET_OF(T, r3)));
132312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
132412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Check that the data got sign-extended into 64-bit a4.
1325a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ sd(a5, MemOperand(a0, OFFSET_OF(T, r4)));
132612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
132712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // 32-bit UNSIGNED word load/store, with SIGNED data.
1328a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ lwu(a6, MemOperand(a0, OFFSET_OF(T, si)));
1329a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ sw(a6, MemOperand(a0, OFFSET_OF(T, r5)));
133012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
133112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Check that the data got zero-extended into 64-bit a4.
1332a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ sd(a6, MemOperand(a0, OFFSET_OF(T, r6)));
133312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
133412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // lh with positive data.
1335a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ lh(a5, MemOperand(a0, OFFSET_OF(T, ui)));
1336a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ sw(a5, MemOperand(a0, OFFSET_OF(T, r2)));
133712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
133812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // lh with negative data.
1339a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ lh(a6, MemOperand(a0, OFFSET_OF(T, si)));
1340a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ sw(a6, MemOperand(a0, OFFSET_OF(T, r3)));
134112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
134212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // lhu with negative data.
1343a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ lhu(a7, MemOperand(a0, OFFSET_OF(T, si)));
1344a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ sw(a7, MemOperand(a0, OFFSET_OF(T, r4)));
134512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
134612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // lb with negative data.
1347a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ lb(t0, MemOperand(a0, OFFSET_OF(T, si)));
1348a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ sw(t0, MemOperand(a0, OFFSET_OF(T, r5)));
134912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
135012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // // sh writes only 1/2 of word.
135112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ lui(t1, 0x3333);
135212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ ori(t1, t1, 0x3333);
1353a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ sw(t1, MemOperand(a0, OFFSET_OF(T, r6)));
1354a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ lhu(t1, MemOperand(a0, OFFSET_OF(T, si)));
1355a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  __ sh(t1, MemOperand(a0, OFFSET_OF(T, r6)));
135612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
135712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ jr(ra);
135812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  __ nop();
135912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
136012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CodeDesc desc;
136112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  assm.GetCode(&desc);
136212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
136312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
136412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  F3 f = FUNCTION_CAST<F3>(code->entry());
136512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.ui = 0x44332211;
136612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.si = 0x99aabbcc;
136712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.r1 = 0x1111111111111111;
136812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.r2 = 0x2222222222222222;
136912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.r3 = 0x3333333333333333;
137012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.r4 = 0x4444444444444444;
137112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.r5 = 0x5555555555555555;
137212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  t.r6 = 0x6666666666666666;
137312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
137412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  USE(dummy);
137512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
137612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Unsigned data, 32 & 64.
137712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x1111111144332211L, t.r1);
137812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x0000000000002211L, t.r2);
137912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
138012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Signed data, 32 & 64.
138112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x33333333ffffbbccL, t.r3);
138212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0xffffffff0000bbccL, t.r4);
138312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
138412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Signed data, 32 & 64.
138512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x55555555ffffffccL, t.r5);
138612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CHECK_EQ(0x000000003333bbccL, t.r6);
138712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
138812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
138912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#undef __
1390