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