1b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Redistribution and use in source and binary forms, with or without 39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// modification, are permitted provided that the following conditions are 49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// met: 59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// 69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Redistributions of source code must retain the above copyright 79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// notice, this list of conditions and the following disclaimer. 89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Redistributions in binary form must reproduce the above 99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// copyright notice, this list of conditions and the following 109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// disclaimer in the documentation and/or other materials provided 119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// with the distribution. 129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Neither the name of Google Inc. nor the names of its 139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// contributors may be used to endorse or promote products derived 149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// from this software without specific prior written permission. 159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// 169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 28196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 294b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "test/cctest/cctest.h" 309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 314b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/arm/assembler-arm-inl.h" 324b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/arm/simulator-arm.h" 33196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/disassembler.h" 34196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/factory.h" 357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/ostreams.h" 369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing namespace v8::internal; 389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Define these function prototypes to match JSEntryFunction in execution.cc. 41a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.orgtypedef Object* (*F1)(int x, int p1, int p2, int p3, int p4); 42a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.orgtypedef Object* (*F2)(int x, int y, int p2, int p3, int p4); 4374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.orgtypedef Object* (*F3)(void* p0, int p1, int p2, int p3, int p4); 4474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.orgtypedef Object* (*F4)(void* p0, void* p1, int p2, int p3, int p4); 459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#define __ assm. 489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(0) { 50e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CcTest::InitializeVM(); 51528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 522bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope scope(isolate); 532bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 5409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Assembler assm(isolate, NULL, 0); 559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ add(r0, r0, Operand(r1)); 579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ mov(pc, Operand(lr)); 589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CodeDesc desc; 609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com assm.GetCode(&desc); 619fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 629fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#ifdef DEBUG 64f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OFStream os(stdout); 65f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org code->Print(os); 669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif 679fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org F2 f = FUNCTION_CAST<F2>(code->entry()); 689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 3, 4, 0, 0, 0)); 699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ::printf("f() = %d\n", res); 709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(7, res); 719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(1) { 75e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CcTest::InitializeVM(); 76528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 772bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope scope(isolate); 782bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 7909d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Assembler assm(isolate, NULL, 0); 809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com Label L, C; 819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ mov(r1, Operand(r0)); 8359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org __ mov(r0, Operand::Zero()); 849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ b(&C); 859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ bind(&L); 879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ add(r0, r0, Operand(r1)); 889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ sub(r1, r1, Operand(1)); 899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ bind(&C); 9159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org __ teq(r1, Operand::Zero()); 929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ b(ne, &L); 939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ mov(pc, Operand(lr)); 949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CodeDesc desc; 969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com assm.GetCode(&desc); 979fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 989fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#ifdef DEBUG 100f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OFStream os(stdout); 101f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org code->Print(os); 1029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif 1039fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org F1 f = FUNCTION_CAST<F1>(code->entry()); 1049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 100, 0, 0, 0, 0)); 1059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ::printf("f() = %d\n", res); 1069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(5050, res); 1079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 1089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(2) { 111e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CcTest::InitializeVM(); 112528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 1132bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope scope(isolate); 1142bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 11509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Assembler assm(isolate, NULL, 0); 1169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com Label L, C; 1179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ mov(r1, Operand(r0)); 1199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ mov(r0, Operand(1)); 1209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ b(&C); 1219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ bind(&L); 1239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ mul(r0, r1, r0); 1249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ sub(r1, r1, Operand(1)); 1259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ bind(&C); 12759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org __ teq(r1, Operand::Zero()); 1289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ b(ne, &L); 1299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ mov(pc, Operand(lr)); 1309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // some relocated stuff here, not executed 1329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ RecordComment("dead code, just testing relocations"); 133d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org __ mov(r0, Operand(isolate->factory()->true_value())); 1349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ RecordComment("dead code, just testing immediate operands"); 1359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ mov(r0, Operand(-1)); 1369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ mov(r0, Operand(0xFF000000)); 1379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ mov(r0, Operand(0xF0F0F0F0)); 1389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ mov(r0, Operand(0xFFF0FFFF)); 1399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CodeDesc desc; 1419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com assm.GetCode(&desc); 1429fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 1439fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 1449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#ifdef DEBUG 145f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OFStream os(stdout); 146f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org code->Print(os); 1479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif 1489fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org F1 f = FUNCTION_CAST<F1>(code->entry()); 1499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 10, 0, 0, 0, 0)); 1509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ::printf("f() = %d\n", res); 1519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(3628800, res); 1529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 1539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(3) { 156e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CcTest::InitializeVM(); 157528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 1582bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope scope(isolate); 1599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com typedef struct { 1619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int i; 1629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com char c; 1639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int16_t s; 1649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } T; 1659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com T t; 1669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 16709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Assembler assm(isolate, NULL, 0); 1689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com Label L, C; 1699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ mov(ip, Operand(sp)); 17118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org __ stm(db_w, sp, r4.bit() | fp.bit() | lr.bit()); 1729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ sub(fp, ip, Operand(4)); 1739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ mov(r4, Operand(r0)); 1749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ ldr(r0, MemOperand(r4, OFFSET_OF(T, i))); 1759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ mov(r2, Operand(r0, ASR, 1)); 1769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ str(r2, MemOperand(r4, OFFSET_OF(T, i))); 1779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ ldrsb(r2, MemOperand(r4, OFFSET_OF(T, c))); 1789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ add(r0, r2, Operand(r0)); 1799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ mov(r2, Operand(r2, LSL, 2)); 1809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ strb(r2, MemOperand(r4, OFFSET_OF(T, c))); 1819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ ldrsh(r2, MemOperand(r4, OFFSET_OF(T, s))); 1829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ add(r0, r2, Operand(r0)); 1839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ mov(r2, Operand(r2, ASR, 3)); 1849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com __ strh(r2, MemOperand(r4, OFFSET_OF(T, s))); 18518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); 1869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CodeDesc desc; 1889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com assm.GetCode(&desc); 1899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 1909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 1919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#ifdef DEBUG 192f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OFStream os(stdout); 193f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org code->Print(os); 1949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif 1959fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org F3 f = FUNCTION_CAST<F3>(code->entry()); 1969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com t.i = 100000; 1979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com t.c = 10; 1989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com t.s = 1000; 1999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0)); 2009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ::printf("f() = %d\n", res); 2019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(101010, res); 2029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(100000/2, t.i); 2039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(10*4, t.c); 2049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1000/8, t.s); 2059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 2069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 208b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgTEST(4) { 209b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // Test the VFP floating point instructions. 210e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CcTest::InitializeVM(); 211528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 2122bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope scope(isolate); 213b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 214b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org typedef struct { 215b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org double a; 216b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org double b; 217b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org double c; 218d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org double d; 219d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org double e; 220d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org double f; 2217a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org double g; 2227a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org double h; 223d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org int i; 224bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org double j; 225badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org double m; 226badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org double n; 227d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org float x; 228d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org float y; 229b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } T; 230b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org T t; 231b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 232b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // Create a function that accepts &t, and loads, manipulates, and stores 233d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // the doubles and floats. 23409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Assembler assm(isolate, NULL, 0); 235b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org Label L, C; 236b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 237b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 238c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org if (CpuFeatures::IsSupported(VFP3)) { 239750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org CpuFeatureScope scope(&assm, VFP3); 240b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 241b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org __ mov(ip, Operand(sp)); 242b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org __ stm(db_w, sp, r4.bit() | fp.bit() | lr.bit()); 243b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org __ sub(fp, ip, Operand(4)); 244b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 245b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org __ mov(r4, Operand(r0)); 246b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org __ vldr(d6, r4, OFFSET_OF(T, a)); 247b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org __ vldr(d7, r4, OFFSET_OF(T, b)); 248b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org __ vadd(d5, d6, d7); 249b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org __ vstr(d5, r4, OFFSET_OF(T, c)); 250b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 251fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org __ vmla(d5, d6, d7); 2528432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org __ vmls(d5, d5, d6); 253fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 254b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org __ vmov(r2, r3, d5); 255b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org __ vmov(d4, r2, r3); 256b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org __ vstr(d4, r4, OFFSET_OF(T, b)); 257b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 258d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // Load t.x and t.y, switch values, and store back to the struct. 259d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org __ vldr(s0, r4, OFFSET_OF(T, x)); 260d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org __ vldr(s31, r4, OFFSET_OF(T, y)); 261d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org __ vmov(s16, s0); 262d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org __ vmov(s0, s31); 263d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org __ vmov(s31, s16); 264d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org __ vstr(s0, r4, OFFSET_OF(T, x)); 265d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org __ vstr(s31, r4, OFFSET_OF(T, y)); 266d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org 267d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // Move a literal into a register that can be encoded in the instruction. 268d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org __ vmov(d4, 1.0); 269d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org __ vstr(d4, r4, OFFSET_OF(T, e)); 270d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org 271d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // Move a literal into a register that requires 64 bits to encode. 272d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // 0x3ff0000010000000 = 1.000000059604644775390625 273d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org __ vmov(d4, 1.000000059604644775390625); 274d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org __ vstr(d4, r4, OFFSET_OF(T, d)); 275d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org 276d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // Convert from floating point to integer. 277d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org __ vmov(d4, 2.0); 278d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org __ vcvt_s32_f64(s31, d4); 279d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org __ vstr(s31, r4, OFFSET_OF(T, i)); 280d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org 281d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // Convert from integer to floating point. 282d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org __ mov(lr, Operand(42)); 283d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org __ vmov(s31, lr); 284d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org __ vcvt_f64_s32(d4, s31); 285d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org __ vstr(d4, r4, OFFSET_OF(T, f)); 2867a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org 287bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org // Convert from fixed point to floating point. 2888f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org __ mov(lr, Operand(2468)); 289bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org __ vmov(s8, lr); 2908f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org __ vcvt_f64_s32(d4, 2); 291bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org __ vstr(d4, r4, OFFSET_OF(T, j)); 292bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org 2937a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org // Test vabs. 2947a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org __ vldr(d1, r4, OFFSET_OF(T, g)); 2957a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org __ vabs(d0, d1); 2967a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org __ vstr(d0, r4, OFFSET_OF(T, g)); 2977a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org __ vldr(d2, r4, OFFSET_OF(T, h)); 2987a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org __ vabs(d0, d2); 2997a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org __ vstr(d0, r4, OFFSET_OF(T, h)); 3007a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org 301badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org // Test vneg. 302badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org __ vldr(d1, r4, OFFSET_OF(T, m)); 303badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org __ vneg(d0, d1); 304badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org __ vstr(d0, r4, OFFSET_OF(T, m)); 305badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org __ vldr(d1, r4, OFFSET_OF(T, n)); 306badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org __ vneg(d0, d1); 307badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org __ vstr(d0, r4, OFFSET_OF(T, n)); 308badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org 309b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); 310b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 311b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org CodeDesc desc; 312b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org assm.GetCode(&desc); 3139fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 3149fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 315b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org#ifdef DEBUG 316f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OFStream os(stdout); 317f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org code->Print(os); 318b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org#endif 3199fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org F3 f = FUNCTION_CAST<F3>(code->entry()); 320b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org t.a = 1.5; 321b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org t.b = 2.75; 322b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org t.c = 17.17; 323d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org t.d = 0.0; 324d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org t.e = 0.0; 325d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org t.f = 0.0; 3267a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org t.g = -2718.2818; 3277a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org t.h = 31415926.5; 328d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org t.i = 0; 329bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org t.j = 0; 330badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org t.m = -2718.2818; 331badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org t.n = 123.456; 332d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org t.x = 4.5; 333d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org t.y = 9.0; 334b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0); 335b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org USE(dummy); 336d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org CHECK_EQ(4.5, t.y); 337d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org CHECK_EQ(9.0, t.x); 338badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org CHECK_EQ(-123.456, t.n); 339badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org CHECK_EQ(2718.2818, t.m); 340d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org CHECK_EQ(2, t.i); 3417a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org CHECK_EQ(2718.2818, t.g); 3427a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org CHECK_EQ(31415926.5, t.h); 343bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org CHECK_EQ(617.0, t.j); 344d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org CHECK_EQ(42.0, t.f); 345d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org CHECK_EQ(1.0, t.e); 346d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org CHECK_EQ(1.000000059604644775390625, t.d); 347b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org CHECK_EQ(4.25, t.c); 3488432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org CHECK_EQ(-4.1875, t.b); 349b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org CHECK_EQ(1.5, t.a); 350b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 351b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 352b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 35330ce411529579186181838984710b0b0980857aaricow@chromium.org 35430ce411529579186181838984710b0b0980857aaricow@chromium.orgTEST(5) { 35530ce411529579186181838984710b0b0980857aaricow@chromium.org // Test the ARMv7 bitfield instructions. 356e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CcTest::InitializeVM(); 357528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 3582bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope scope(isolate); 3592bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 36009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Assembler assm(isolate, NULL, 0); 36130ce411529579186181838984710b0b0980857aaricow@chromium.org 362c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org if (CpuFeatures::IsSupported(ARMv7)) { 363750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org CpuFeatureScope scope(&assm, ARMv7); 36430ce411529579186181838984710b0b0980857aaricow@chromium.org // On entry, r0 = 0xAAAAAAAA = 0b10..10101010. 36530ce411529579186181838984710b0b0980857aaricow@chromium.org __ ubfx(r0, r0, 1, 12); // 0b00..010101010101 = 0x555 36630ce411529579186181838984710b0b0980857aaricow@chromium.org __ sbfx(r0, r0, 0, 5); // 0b11..111111110101 = -11 36730ce411529579186181838984710b0b0980857aaricow@chromium.org __ bfc(r0, 1, 3); // 0b11..111111110001 = -15 36830ce411529579186181838984710b0b0980857aaricow@chromium.org __ mov(r1, Operand(7)); 36930ce411529579186181838984710b0b0980857aaricow@chromium.org __ bfi(r0, r1, 3, 3); // 0b11..111111111001 = -7 37030ce411529579186181838984710b0b0980857aaricow@chromium.org __ mov(pc, Operand(lr)); 37130ce411529579186181838984710b0b0980857aaricow@chromium.org 37230ce411529579186181838984710b0b0980857aaricow@chromium.org CodeDesc desc; 37330ce411529579186181838984710b0b0980857aaricow@chromium.org assm.GetCode(&desc); 3749fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 3759fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 37630ce411529579186181838984710b0b0980857aaricow@chromium.org#ifdef DEBUG 377f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OFStream os(stdout); 378f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org code->Print(os); 37930ce411529579186181838984710b0b0980857aaricow@chromium.org#endif 3809fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org F1 f = FUNCTION_CAST<F1>(code->entry()); 38130ce411529579186181838984710b0b0980857aaricow@chromium.org int res = reinterpret_cast<int>( 38230ce411529579186181838984710b0b0980857aaricow@chromium.org CALL_GENERATED_CODE(f, 0xAAAAAAAA, 0, 0, 0, 0)); 38330ce411529579186181838984710b0b0980857aaricow@chromium.org ::printf("f() = %d\n", res); 38430ce411529579186181838984710b0b0980857aaricow@chromium.org CHECK_EQ(-7, res); 38530ce411529579186181838984710b0b0980857aaricow@chromium.org } 38630ce411529579186181838984710b0b0980857aaricow@chromium.org} 38730ce411529579186181838984710b0b0980857aaricow@chromium.org 388ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org 389ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.orgTEST(6) { 390ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org // Test saturating instructions. 391e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CcTest::InitializeVM(); 392528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 3932bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope scope(isolate); 3942bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 39509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Assembler assm(isolate, NULL, 0); 396ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org 397c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org if (CpuFeatures::IsSupported(ARMv7)) { 398750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org CpuFeatureScope scope(&assm, ARMv7); 399ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org __ usat(r1, 8, Operand(r0)); // Sat 0xFFFF to 0-255 = 0xFF. 400ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org __ usat(r2, 12, Operand(r0, ASR, 9)); // Sat (0xFFFF>>9) to 0-4095 = 0x7F. 401ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org __ usat(r3, 1, Operand(r0, LSL, 16)); // Sat (0xFFFF<<16) to 0-1 = 0x0. 402ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org __ add(r0, r1, Operand(r2)); 403ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org __ add(r0, r0, Operand(r3)); 404ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org __ mov(pc, Operand(lr)); 405ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org 406ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org CodeDesc desc; 407ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assm.GetCode(&desc); 4089fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 4099fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 410ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org#ifdef DEBUG 411f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OFStream os(stdout); 412f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org code->Print(os); 413ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org#endif 4149fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org F1 f = FUNCTION_CAST<F1>(code->entry()); 415ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org int res = reinterpret_cast<int>( 416ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org CALL_GENERATED_CODE(f, 0xFFFF, 0, 0, 0, 0)); 417ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org ::printf("f() = %d\n", res); 418ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org CHECK_EQ(382, res); 419ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org } 420ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org} 421ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org 42201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 42383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgenum VCVTTypes { 42483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org s32_f64, 42583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org u32_f64 42683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org}; 42783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 42883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgstatic void TestRoundingMode(VCVTTypes types, 42983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org VFPRoundingMode mode, 43083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org double value, 43183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org int expected, 43283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org bool expected_exception = false) { 433528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 4342bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope scope(isolate); 4352bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 43609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Assembler assm(isolate, NULL, 0); 43701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 438c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org if (CpuFeatures::IsSupported(VFP3)) { 439750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org CpuFeatureScope scope(&assm, VFP3); 44001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 44183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org Label wrong_exception; 44283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 44383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org __ vmrs(r1); 44483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org // Set custom FPSCR. 44583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org __ bic(r2, r1, Operand(kVFPRoundingModeMask | kVFPExceptionMask)); 44683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org __ orr(r2, r2, Operand(mode)); 44783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org __ vmsr(r2); 44883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 44983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org // Load value, convert, and move back result to r0 if everything went well. 45083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org __ vmov(d1, value); 45183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org switch (types) { 45283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org case s32_f64: 45383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org __ vcvt_s32_f64(s0, d1, kFPSCRRounding); 45483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org break; 45583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 45683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org case u32_f64: 45783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org __ vcvt_u32_f64(s0, d1, kFPSCRRounding); 45883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org break; 45983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 46083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org default: 46183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org UNREACHABLE(); 46283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org break; 46383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org } 46483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org // Check for vfp exceptions 46583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org __ vmrs(r2); 46683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org __ tst(r2, Operand(kVFPExceptionMask)); 46783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org // Check that we behaved as expected. 46883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org __ b(&wrong_exception, 46983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org expected_exception ? eq : ne); 47083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org // There was no exception. Retrieve the result and return. 47183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org __ vmov(r0, s0); 47283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org __ mov(pc, Operand(lr)); 47301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 47483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org // The exception behaviour is not what we expected. 47583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org // Load a special value and return. 47683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org __ bind(&wrong_exception); 47783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org __ mov(r0, Operand(11223344)); 47883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org __ mov(pc, Operand(lr)); 47901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 48083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org CodeDesc desc; 48183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org assm.GetCode(&desc); 4829fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 4839fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 48401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org#ifdef DEBUG 485f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OFStream os(stdout); 486f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org code->Print(os); 48701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org#endif 4889fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org F1 f = FUNCTION_CAST<F1>(code->entry()); 48983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org int res = reinterpret_cast<int>( 49083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org CALL_GENERATED_CODE(f, 0, 0, 0, 0, 0)); 49183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org ::printf("res = %d\n", res); 49283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org CHECK_EQ(expected, res); 49383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org } 49401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org} 49501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 49601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 49701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.orgTEST(7) { 498528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::InitializeVM(); 49901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // Test vfp rounding modes. 50001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 50183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org // s32_f64 (double to integer). 50283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 50383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RN, 0, 0); 50483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RN, 0.5, 0); 50583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RN, -0.5, 0); 50683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RN, 1.5, 2); 50783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RN, -1.5, -2); 50883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RN, 123.7, 124); 50983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RN, -123.7, -124); 51083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RN, 123456.2, 123456); 51183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RN, -123456.2, -123456); 51283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RN, static_cast<double>(kMaxInt), kMaxInt); 51383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RN, (kMaxInt + 0.49), kMaxInt); 51483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RN, (kMaxInt + 1.0), kMaxInt, true); 51583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RN, (kMaxInt + 0.5), kMaxInt, true); 51683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RN, static_cast<double>(kMinInt), kMinInt); 51783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RN, (kMinInt - 0.5), kMinInt); 51883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RN, (kMinInt - 1.0), kMinInt, true); 51983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RN, (kMinInt - 0.51), kMinInt, true); 52083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 52183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RM, 0, 0); 52283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RM, 0.5, 0); 52383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RM, -0.5, -1); 52483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RM, 123.7, 123); 52583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RM, -123.7, -124); 52683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RM, 123456.2, 123456); 52783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RM, -123456.2, -123457); 52883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RM, static_cast<double>(kMaxInt), kMaxInt); 52983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RM, (kMaxInt + 0.5), kMaxInt); 53083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RM, (kMaxInt + 1.0), kMaxInt, true); 53183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RM, static_cast<double>(kMinInt), kMinInt); 53283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RM, (kMinInt - 0.5), kMinInt, true); 53383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RM, (kMinInt + 0.5), kMinInt); 53483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 53583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RZ, 0, 0); 53683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RZ, 0.5, 0); 53783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RZ, -0.5, 0); 53883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RZ, 123.7, 123); 53983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RZ, -123.7, -123); 54083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RZ, 123456.2, 123456); 54183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RZ, -123456.2, -123456); 54283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RZ, static_cast<double>(kMaxInt), kMaxInt); 54383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RZ, (kMaxInt + 0.5), kMaxInt); 54483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RZ, (kMaxInt + 1.0), kMaxInt, true); 54583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RZ, static_cast<double>(kMinInt), kMinInt); 54683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RZ, (kMinInt - 0.5), kMinInt); 54783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(s32_f64, RZ, (kMinInt - 1.0), kMinInt, true); 54883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 54983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 55083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org // u32_f64 (double to integer). 55183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 55283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org // Negative values. 55383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RN, -0.5, 0); 55483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RN, -123456.7, 0, true); 55583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RN, static_cast<double>(kMinInt), 0, true); 55683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RN, kMinInt - 1.0, 0, true); 55783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 55883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RM, -0.5, 0, true); 55983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RM, -123456.7, 0, true); 56083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RM, static_cast<double>(kMinInt), 0, true); 56183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RM, kMinInt - 1.0, 0, true); 56283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 56383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RZ, -0.5, 0); 56483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RZ, -123456.7, 0, true); 56583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RZ, static_cast<double>(kMinInt), 0, true); 56683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RZ, kMinInt - 1.0, 0, true); 56783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 56883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org // Positive values. 56983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org // kMaxInt is the maximum *signed* integer: 0x7fffffff. 57083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org static const uint32_t kMaxUInt = 0xffffffffu; 57183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RZ, 0, 0); 57283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RZ, 0.5, 0); 57383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RZ, 123.7, 123); 57483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RZ, 123456.2, 123456); 57583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RZ, static_cast<double>(kMaxInt), kMaxInt); 57683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RZ, (kMaxInt + 0.5), kMaxInt); 57783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RZ, (kMaxInt + 1.0), 57883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org static_cast<uint32_t>(kMaxInt) + 1); 57983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RZ, (kMaxUInt + 0.5), kMaxUInt); 58083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RZ, (kMaxUInt + 1.0), kMaxUInt, true); 58183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 58283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RM, 0, 0); 58383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RM, 0.5, 0); 58483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RM, 123.7, 123); 58583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RM, 123456.2, 123456); 58683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RM, static_cast<double>(kMaxInt), kMaxInt); 58783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RM, (kMaxInt + 0.5), kMaxInt); 58883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RM, (kMaxInt + 1.0), 58983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org static_cast<uint32_t>(kMaxInt) + 1); 59083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RM, (kMaxUInt + 0.5), kMaxUInt); 59183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RM, (kMaxUInt + 1.0), kMaxUInt, true); 59283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 59383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RN, 0, 0); 59483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RN, 0.5, 0); 59583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RN, 1.5, 2); 59683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RN, 123.7, 124); 59783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RN, 123456.2, 123456); 59883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RN, static_cast<double>(kMaxInt), kMaxInt); 59983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RN, (kMaxInt + 0.49), kMaxInt); 60083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RN, (kMaxInt + 0.5), 60183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org static_cast<uint32_t>(kMaxInt) + 1); 60283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RN, (kMaxUInt + 0.49), kMaxUInt); 60383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RN, (kMaxUInt + 0.5), kMaxUInt, true); 60483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org TestRoundingMode(u32_f64, RN, (kMaxUInt + 1.0), kMaxUInt, true); 60501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org} 60601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 607e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 60874f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.orgTEST(8) { 60974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org // Test VFP multi load/store with ia_w. 610e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CcTest::InitializeVM(); 611528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 6122bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope scope(isolate); 61374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 61474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org typedef struct { 61574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double a; 61674f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double b; 61774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double c; 61874f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double d; 61974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double e; 62074f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double f; 62174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double g; 62274f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double h; 62374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org } D; 62474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org D d; 62574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 62674f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org typedef struct { 62774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float a; 62874f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float b; 62974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float c; 63074f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float d; 63174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float e; 63274f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float f; 63374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float g; 63474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float h; 63574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org } F; 63674f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org F f; 63774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 63874f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org // Create a function that uses vldm/vstm to move some double and 63974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org // single precision values around in memory. 64009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Assembler assm(isolate, NULL, 0); 64174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 642e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ mov(ip, Operand(sp)); 643e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ stm(db_w, sp, r4.bit() | fp.bit() | lr.bit()); 644e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ sub(fp, ip, Operand(4)); 64574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 646e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ add(r4, r0, Operand(OFFSET_OF(D, a))); 647e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vldm(ia_w, r4, d0, d3); 648e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vldm(ia_w, r4, d4, d7); 64974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 650e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ add(r4, r0, Operand(OFFSET_OF(D, a))); 651e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vstm(ia_w, r4, d6, d7); 652e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vstm(ia_w, r4, d0, d5); 65374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 654e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ add(r4, r1, Operand(OFFSET_OF(F, a))); 655e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vldm(ia_w, r4, s0, s3); 656e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vldm(ia_w, r4, s4, s7); 65774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 658e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ add(r4, r1, Operand(OFFSET_OF(F, a))); 659e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vstm(ia_w, r4, s6, s7); 660e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vstm(ia_w, r4, s0, s5); 66174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 662e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); 66374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 664e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CodeDesc desc; 665e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assm.GetCode(&desc); 6669fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 6679fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 66874f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org#ifdef DEBUG 669f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OFStream os(stdout); 670f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org code->Print(os); 67174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org#endif 6729fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org F4 fn = FUNCTION_CAST<F4>(code->entry()); 673e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.a = 1.1; 674e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.b = 2.2; 675e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.c = 3.3; 676e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.d = 4.4; 677e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.e = 5.5; 678e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.f = 6.6; 679e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.g = 7.7; 680e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.h = 8.8; 681e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 682e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.a = 1.0; 683e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.b = 2.0; 684e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.c = 3.0; 685e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.d = 4.0; 686e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.e = 5.0; 687e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.f = 6.0; 688e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.g = 7.0; 689e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.h = 8.0; 690e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 691e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Object* dummy = CALL_GENERATED_CODE(fn, &d, &f, 0, 0, 0); 692e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org USE(dummy); 69374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 694e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(7.7, d.a); 695e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(8.8, d.b); 696e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(1.1, d.c); 697e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(2.2, d.d); 698e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(3.3, d.e); 699e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(4.4, d.f); 700e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(5.5, d.g); 701e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(6.6, d.h); 702e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 703e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(7.0, f.a); 704e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(8.0, f.b); 705e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(1.0, f.c); 706e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(2.0, f.d); 707e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(3.0, f.e); 708e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(4.0, f.f); 709e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(5.0, f.g); 710e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(6.0, f.h); 71174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org} 71274f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 71374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 71474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.orgTEST(9) { 71574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org // Test VFP multi load/store with ia. 716e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CcTest::InitializeVM(); 717528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 7182bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope scope(isolate); 71974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 72074f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org typedef struct { 72174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double a; 72274f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double b; 72374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double c; 72474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double d; 72574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double e; 72674f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double f; 72774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double g; 72874f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double h; 72974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org } D; 73074f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org D d; 73174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 73274f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org typedef struct { 73374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float a; 73474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float b; 73574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float c; 73674f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float d; 73774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float e; 73874f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float f; 73974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float g; 74074f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float h; 74174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org } F; 74274f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org F f; 74374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 74474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org // Create a function that uses vldm/vstm to move some double and 74574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org // single precision values around in memory. 74609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Assembler assm(isolate, NULL, 0); 74774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 748e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ mov(ip, Operand(sp)); 749e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ stm(db_w, sp, r4.bit() | fp.bit() | lr.bit()); 750e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ sub(fp, ip, Operand(4)); 75174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 752e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ add(r4, r0, Operand(OFFSET_OF(D, a))); 753e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vldm(ia, r4, d0, d3); 754e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ add(r4, r4, Operand(4 * 8)); 755e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vldm(ia, r4, d4, d7); 75674f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 757e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ add(r4, r0, Operand(OFFSET_OF(D, a))); 758e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vstm(ia, r4, d6, d7); 759e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ add(r4, r4, Operand(2 * 8)); 760e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vstm(ia, r4, d0, d5); 76174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 762e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ add(r4, r1, Operand(OFFSET_OF(F, a))); 763e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vldm(ia, r4, s0, s3); 764e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ add(r4, r4, Operand(4 * 4)); 765e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vldm(ia, r4, s4, s7); 76674f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 767e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ add(r4, r1, Operand(OFFSET_OF(F, a))); 768e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vstm(ia, r4, s6, s7); 769e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ add(r4, r4, Operand(2 * 4)); 770e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vstm(ia, r4, s0, s5); 77174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 772e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); 77374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 774e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CodeDesc desc; 775e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assm.GetCode(&desc); 7769fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 7779fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 77874f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org#ifdef DEBUG 779f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OFStream os(stdout); 780f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org code->Print(os); 78174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org#endif 7829fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org F4 fn = FUNCTION_CAST<F4>(code->entry()); 783e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.a = 1.1; 784e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.b = 2.2; 785e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.c = 3.3; 786e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.d = 4.4; 787e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.e = 5.5; 788e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.f = 6.6; 789e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.g = 7.7; 790e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.h = 8.8; 791e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 792e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.a = 1.0; 793e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.b = 2.0; 794e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.c = 3.0; 795e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.d = 4.0; 796e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.e = 5.0; 797e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.f = 6.0; 798e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.g = 7.0; 799e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.h = 8.0; 800e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 801e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Object* dummy = CALL_GENERATED_CODE(fn, &d, &f, 0, 0, 0); 802e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org USE(dummy); 80374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 804e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(7.7, d.a); 805e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(8.8, d.b); 806e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(1.1, d.c); 807e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(2.2, d.d); 808e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(3.3, d.e); 809e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(4.4, d.f); 810e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(5.5, d.g); 811e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(6.6, d.h); 812e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 813e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(7.0, f.a); 814e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(8.0, f.b); 815e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(1.0, f.c); 816e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(2.0, f.d); 817e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(3.0, f.e); 818e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(4.0, f.f); 819e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(5.0, f.g); 820e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(6.0, f.h); 82174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org} 82274f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 82374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 82474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.orgTEST(10) { 82574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org // Test VFP multi load/store with db_w. 826e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CcTest::InitializeVM(); 827528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 8282bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope scope(isolate); 82974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 83074f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org typedef struct { 83174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double a; 83274f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double b; 83374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double c; 83474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double d; 83574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double e; 83674f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double f; 83774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double g; 83874f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org double h; 83974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org } D; 84074f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org D d; 84174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 84274f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org typedef struct { 84374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float a; 84474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float b; 84574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float c; 84674f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float d; 84774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float e; 84874f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float f; 84974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float g; 85074f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org float h; 85174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org } F; 85274f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org F f; 85374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 85474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org // Create a function that uses vldm/vstm to move some double and 85574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org // single precision values around in memory. 85609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Assembler assm(isolate, NULL, 0); 85774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 858e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ mov(ip, Operand(sp)); 859e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ stm(db_w, sp, r4.bit() | fp.bit() | lr.bit()); 860e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ sub(fp, ip, Operand(4)); 86174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 862e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ add(r4, r0, Operand(OFFSET_OF(D, h) + 8)); 863e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vldm(db_w, r4, d4, d7); 864e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vldm(db_w, r4, d0, d3); 86574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 866e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ add(r4, r0, Operand(OFFSET_OF(D, h) + 8)); 867e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vstm(db_w, r4, d0, d5); 868e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vstm(db_w, r4, d6, d7); 86974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 870e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ add(r4, r1, Operand(OFFSET_OF(F, h) + 4)); 871e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vldm(db_w, r4, s4, s7); 872e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vldm(db_w, r4, s0, s3); 87374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 874e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ add(r4, r1, Operand(OFFSET_OF(F, h) + 4)); 875e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vstm(db_w, r4, s0, s5); 876e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vstm(db_w, r4, s6, s7); 87774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 878e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); 87974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 880e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CodeDesc desc; 881e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assm.GetCode(&desc); 8829fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 8839fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 88474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org#ifdef DEBUG 885f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OFStream os(stdout); 886f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org code->Print(os); 88774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org#endif 8889fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org F4 fn = FUNCTION_CAST<F4>(code->entry()); 889e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.a = 1.1; 890e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.b = 2.2; 891e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.c = 3.3; 892e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.d = 4.4; 893e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.e = 5.5; 894e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.f = 6.6; 895e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.g = 7.7; 896e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org d.h = 8.8; 897e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 898e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.a = 1.0; 899e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.b = 2.0; 900e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.c = 3.0; 901e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.d = 4.0; 902e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.e = 5.0; 903e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.f = 6.0; 904e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.g = 7.0; 905e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f.h = 8.0; 906e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 907e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Object* dummy = CALL_GENERATED_CODE(fn, &d, &f, 0, 0, 0); 908e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org USE(dummy); 90974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 910e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(7.7, d.a); 911e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(8.8, d.b); 912e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(1.1, d.c); 913e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(2.2, d.d); 914e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(3.3, d.e); 915e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(4.4, d.f); 916e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(5.5, d.g); 917e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(6.6, d.h); 918e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 919e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(7.0, f.a); 920e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(8.0, f.b); 921e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(1.0, f.c); 922e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(2.0, f.d); 923e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(3.0, f.e); 924e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(4.0, f.f); 925e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(5.0, f.g); 926e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CHECK_EQ(6.0, f.h); 92774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org} 92874f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 929dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org 930dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.orgTEST(11) { 931dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org // Test instructions using the carry flag. 932e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CcTest::InitializeVM(); 933528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 9342bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope scope(isolate); 935dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org 936dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org typedef struct { 937dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org int32_t a; 938dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org int32_t b; 939dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org int32_t c; 940dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org int32_t d; 941dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org } I; 942dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org I i; 943dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org 944dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org i.a = 0xabcd0001; 945dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org i.b = 0xabcd0000; 946dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org 94709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Assembler assm(isolate, NULL, 0); 948dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org 949dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org // Test HeapObject untagging. 950dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org __ ldr(r1, MemOperand(r0, OFFSET_OF(I, a))); 951dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org __ mov(r1, Operand(r1, ASR, 1), SetCC); 952dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org __ adc(r1, r1, Operand(r1), LeaveCC, cs); 953dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org __ str(r1, MemOperand(r0, OFFSET_OF(I, a))); 954dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org 955dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org __ ldr(r2, MemOperand(r0, OFFSET_OF(I, b))); 956dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org __ mov(r2, Operand(r2, ASR, 1), SetCC); 957dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org __ adc(r2, r2, Operand(r2), LeaveCC, cs); 958dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org __ str(r2, MemOperand(r0, OFFSET_OF(I, b))); 959dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org 960dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org // Test corner cases. 961dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org __ mov(r1, Operand(0xffffffff)); 96259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org __ mov(r2, Operand::Zero()); 963dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org __ mov(r3, Operand(r1, ASR, 1), SetCC); // Set the carry. 964dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org __ adc(r3, r1, Operand(r2)); 965dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org __ str(r3, MemOperand(r0, OFFSET_OF(I, c))); 966dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org 967dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org __ mov(r1, Operand(0xffffffff)); 96859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org __ mov(r2, Operand::Zero()); 969dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org __ mov(r3, Operand(r2, ASR, 1), SetCC); // Unset the carry. 970dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org __ adc(r3, r1, Operand(r2)); 971dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org __ str(r3, MemOperand(r0, OFFSET_OF(I, d))); 972dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org 973dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org __ mov(pc, Operand(lr)); 974dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org 975dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org CodeDesc desc; 976dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org assm.GetCode(&desc); 9779fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 9789fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 979dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org#ifdef DEBUG 980f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OFStream os(stdout); 981f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org code->Print(os); 982dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org#endif 9839fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org F3 f = FUNCTION_CAST<F3>(code->entry()); 984dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org Object* dummy = CALL_GENERATED_CODE(f, &i, 0, 0, 0, 0); 985dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org USE(dummy); 986dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org 987dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org CHECK_EQ(0xabcd0001, i.a); 988dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org CHECK_EQ(static_cast<int32_t>(0xabcd0000) >> 1, i.b); 989dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org CHECK_EQ(0x00000000, i.c); 990dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org CHECK_EQ(0xffffffff, i.d); 991dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org} 992dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org 99380c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org 99480c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.orgTEST(12) { 99580c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org // Test chaining of label usages within instructions (issue 1644). 996e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CcTest::InitializeVM(); 997528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 9982bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope scope(isolate); 99980c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org 10002bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org Assembler assm(isolate, NULL, 0); 100180c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org Label target; 100280c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org __ b(eq, &target); 100380c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org __ b(ne, &target); 100480c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org __ bind(&target); 100580c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org __ nop(); 100680c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org} 100780c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org 1008003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1009003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgTEST(13) { 1010003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org // Test VFP instructions using registers d16-d31. 1011e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CcTest::InitializeVM(); 1012528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 10132bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope scope(isolate); 1014003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1015003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org if (!CpuFeatures::IsSupported(VFP32DREGS)) { 1016003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org return; 1017003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org } 1018003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1019003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org typedef struct { 1020003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org double a; 1021003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org double b; 1022003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org double c; 1023003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org double x; 1024003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org double y; 1025003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org double z; 1026003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org double i; 1027003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org double j; 1028003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org double k; 1029fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org uint32_t low; 1030fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org uint32_t high; 1031003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org } T; 1032003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org T t; 1033003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1034003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org // Create a function that accepts &t, and loads, manipulates, and stores 1035003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org // the doubles and floats. 103609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Assembler assm(isolate, NULL, 0); 1037003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org Label L, C; 1038003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1039003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1040003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org if (CpuFeatures::IsSupported(VFP3)) { 1041750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org CpuFeatureScope scope(&assm, VFP3); 1042003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1043003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ stm(db_w, sp, r4.bit() | lr.bit()); 1044003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1045003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org // Load a, b, c into d16, d17, d18. 1046003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ mov(r4, Operand(r0)); 1047003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vldr(d16, r4, OFFSET_OF(T, a)); 1048003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vldr(d17, r4, OFFSET_OF(T, b)); 1049003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vldr(d18, r4, OFFSET_OF(T, c)); 1050003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1051003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vneg(d25, d16); 1052003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vadd(d25, d25, d17); 1053003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vsub(d25, d25, d18); 1054003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vmul(d25, d25, d25); 1055003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vdiv(d25, d25, d18); 1056003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1057003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vmov(d16, d25); 1058003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vsqrt(d17, d25); 1059003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vneg(d17, d17); 1060003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vabs(d17, d17); 1061003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vmla(d18, d16, d17); 1062003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1063003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org // Store d16, d17, d18 into a, b, c. 1064003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ mov(r4, Operand(r0)); 1065003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vstr(d16, r4, OFFSET_OF(T, a)); 1066003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vstr(d17, r4, OFFSET_OF(T, b)); 1067003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vstr(d18, r4, OFFSET_OF(T, c)); 1068003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1069003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org // Load x, y, z into d29-d31. 1070003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ add(r4, r0, Operand(OFFSET_OF(T, x))); 1071003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vldm(ia_w, r4, d29, d31); 1072003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1073003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org // Swap d29 and d30 via r registers. 1074003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vmov(r1, r2, d29); 1075003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vmov(d29, d30); 1076003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vmov(d30, r1, r2); 1077003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1078003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org // Convert to and from integer. 1079003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vcvt_s32_f64(s1, d31); 1080003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vcvt_f64_u32(d31, s1); 1081003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1082003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org // Store d29-d31 into x, y, z. 1083003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ add(r4, r0, Operand(OFFSET_OF(T, x))); 1084003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vstm(ia_w, r4, d29, d31); 1085003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1086003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org // Move constants into d20, d21, d22 and store into i, j, k. 1087003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vmov(d20, 14.7610017472335499); 1088003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vmov(d21, 16.0); 1089003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ mov(r1, Operand(372106121)); 1090003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ mov(r2, Operand(1079146608)); 10916ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org __ vmov(d22, VmovIndexLo, r1); 10926ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org __ vmov(d22, VmovIndexHi, r2); 1093003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ add(r4, r0, Operand(OFFSET_OF(T, i))); 1094003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ vstm(ia_w, r4, d20, d22); 1095fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org // Move d22 into low and high. 1096fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org __ vmov(r4, VmovIndexLo, d22); 1097fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org __ str(r4, MemOperand(r0, OFFSET_OF(T, low))); 1098fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org __ vmov(r4, VmovIndexHi, d22); 1099fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org __ str(r4, MemOperand(r0, OFFSET_OF(T, high))); 1100003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1101003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org __ ldm(ia_w, sp, r4.bit() | pc.bit()); 1102003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1103003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org CodeDesc desc; 1104003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org assm.GetCode(&desc); 11059fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 11069fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 1107003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org#ifdef DEBUG 1108f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OFStream os(stdout); 1109f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org code->Print(os); 1110003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org#endif 11119fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org F3 f = FUNCTION_CAST<F3>(code->entry()); 1112003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org t.a = 1.5; 1113003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org t.b = 2.75; 1114003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org t.c = 17.17; 1115003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org t.x = 1.5; 1116003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org t.y = 2.75; 1117003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org t.z = 17.17; 1118003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0); 1119003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org USE(dummy); 1120003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org CHECK_EQ(14.7610017472335499, t.a); 1121003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org CHECK_EQ(3.84200491244266251, t.b); 1122003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org CHECK_EQ(73.8818412254460241, t.c); 1123003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org CHECK_EQ(2.75, t.x); 1124003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org CHECK_EQ(1.5, t.y); 1125003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org CHECK_EQ(17.0, t.z); 1126003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org CHECK_EQ(14.7610017472335499, t.i); 1127003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org CHECK_EQ(16.0, t.j); 1128003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org CHECK_EQ(73.8818412254460241, t.k); 1129fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org CHECK_EQ(372106121, t.low); 1130fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org CHECK_EQ(1079146608, t.high); 1131003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org } 1132003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org} 1133003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1134e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1135e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgTEST(14) { 1136e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Test the VFP Canonicalized Nan mode. 1137e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CcTest::InitializeVM(); 1138528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 1139e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org HandleScope scope(isolate); 1140e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1141e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org typedef struct { 1142e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org double left; 1143e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org double right; 1144e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org double add_result; 1145e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org double sub_result; 1146e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org double mul_result; 1147e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org double div_result; 1148e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } T; 1149e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org T t; 1150e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1151e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Create a function that makes the four basic operations. 1152e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Assembler assm(isolate, NULL, 0); 1153e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1154e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Ensure FPSCR state (as JSEntryStub does). 1155e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Label fpscr_done; 1156e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vmrs(r1); 1157e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ tst(r1, Operand(kVFPDefaultNaNModeControlBit)); 1158e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ b(ne, &fpscr_done); 1159e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ orr(r1, r1, Operand(kVFPDefaultNaNModeControlBit)); 1160e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vmsr(r1); 1161e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ bind(&fpscr_done); 1162e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1163e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vldr(d0, r0, OFFSET_OF(T, left)); 1164e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vldr(d1, r0, OFFSET_OF(T, right)); 1165e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vadd(d2, d0, d1); 1166e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vstr(d2, r0, OFFSET_OF(T, add_result)); 1167e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vsub(d2, d0, d1); 1168e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vstr(d2, r0, OFFSET_OF(T, sub_result)); 1169e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vmul(d2, d0, d1); 1170e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vstr(d2, r0, OFFSET_OF(T, mul_result)); 1171e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vdiv(d2, d0, d1); 1172e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ vstr(d2, r0, OFFSET_OF(T, div_result)); 1173e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1174e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org __ mov(pc, Operand(lr)); 1175e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1176e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CodeDesc desc; 1177e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assm.GetCode(&desc); 11789fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 11799fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 1180e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#ifdef DEBUG 1181f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OFStream os(stdout); 1182f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org code->Print(os); 1183e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif 11849fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org F3 f = FUNCTION_CAST<F3>(code->entry()); 1185e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org t.left = bit_cast<double>(kHoleNanInt64); 1186e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org t.right = 1; 1187e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org t.add_result = 0; 1188e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org t.sub_result = 0; 1189e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org t.mul_result = 0; 1190e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org t.div_result = 0; 1191e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0); 1192e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org USE(dummy); 1193e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org const uint32_t kArmNanUpper32 = 0x7ff80000; 1194e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org const uint32_t kArmNanLower32 = 0x00000000; 1195e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#ifdef DEBUG 1196e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org const uint64_t kArmNanInt64 = 1197e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org (static_cast<uint64_t>(kArmNanUpper32) << 32) | kArmNanLower32; 1198e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(kArmNanInt64 != kHoleNanInt64); 1199e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif 1200e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // With VFP2 the sign of the canonicalized Nan is undefined. So 1201e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // we remove the sign bit for the upper tests. 1202e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org CHECK_EQ(kArmNanUpper32, 1203e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org (bit_cast<int64_t>(t.add_result) >> 32) & 0x7fffffff); 1204e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org CHECK_EQ(kArmNanLower32, bit_cast<int64_t>(t.add_result) & 0xffffffffu); 1205e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org CHECK_EQ(kArmNanUpper32, 1206e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org (bit_cast<int64_t>(t.sub_result) >> 32) & 0x7fffffff); 1207e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org CHECK_EQ(kArmNanLower32, bit_cast<int64_t>(t.sub_result) & 0xffffffffu); 1208e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org CHECK_EQ(kArmNanUpper32, 1209e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org (bit_cast<int64_t>(t.mul_result) >> 32) & 0x7fffffff); 1210e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org CHECK_EQ(kArmNanLower32, bit_cast<int64_t>(t.mul_result) & 0xffffffffu); 1211e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org CHECK_EQ(kArmNanUpper32, 1212e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org (bit_cast<int64_t>(t.div_result) >> 32) & 0x7fffffff); 1213e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org CHECK_EQ(kArmNanLower32, bit_cast<int64_t>(t.div_result) & 0xffffffffu); 1214e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1215e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1216169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1217169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgTEST(15) { 1218169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org // Test the Neon instructions. 1219169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CcTest::InitializeVM(); 1220528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 1221169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org HandleScope scope(isolate); 1222169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1223169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org typedef struct { 1224169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t src0; 1225169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t src1; 1226169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t src2; 1227169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t src3; 1228169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t src4; 1229169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t src5; 1230169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t src6; 1231169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t src7; 1232169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t dst0; 1233169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t dst1; 1234169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t dst2; 1235169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t dst3; 1236169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t dst4; 1237169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t dst5; 1238169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t dst6; 1239169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t dst7; 1240169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t srcA0; 1241169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t srcA1; 1242169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t dstA0; 1243169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t dstA1; 1244169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t dstA2; 1245169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t dstA3; 1246a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org uint32_t dstA4; 1247a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org uint32_t dstA5; 1248a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org uint32_t dstA6; 1249a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org uint32_t dstA7; 1250169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } T; 1251169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org T t; 1252169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1253169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org // Create a function that accepts &t, and loads, manipulates, and stores 1254169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org // the doubles and floats. 1255169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Assembler assm(isolate, NULL, 0); 1256169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1257169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1258169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if (CpuFeatures::IsSupported(NEON)) { 1259169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CpuFeatureScope scope(&assm, NEON); 1260169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1261169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ stm(db_w, sp, r4.bit() | lr.bit()); 1262169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org // Move 32 bytes with neon. 1263169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ add(r4, r0, Operand(OFFSET_OF(T, src0))); 1264169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ vld1(Neon8, NeonListOperand(d0, 4), NeonMemOperand(r4)); 1265169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ add(r4, r0, Operand(OFFSET_OF(T, dst0))); 1266169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ vst1(Neon8, NeonListOperand(d0, 4), NeonMemOperand(r4)); 1267169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1268169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org // Expand 8 bytes into 8 words(16 bits). 1269169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ add(r4, r0, Operand(OFFSET_OF(T, srcA0))); 1270169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ vld1(Neon8, NeonListOperand(d0), NeonMemOperand(r4)); 1271169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ vmovl(NeonU8, q0, d0); 1272169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ add(r4, r0, Operand(OFFSET_OF(T, dstA0))); 1273169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ vst1(Neon8, NeonListOperand(d0, 2), NeonMemOperand(r4)); 1274169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1275a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org // The same expansion, but with different source and destination registers. 1276a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org __ add(r4, r0, Operand(OFFSET_OF(T, srcA0))); 1277a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org __ vld1(Neon8, NeonListOperand(d1), NeonMemOperand(r4)); 1278a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org __ vmovl(NeonU8, q1, d1); 1279a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org __ add(r4, r0, Operand(OFFSET_OF(T, dstA4))); 1280a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org __ vst1(Neon8, NeonListOperand(d2, 2), NeonMemOperand(r4)); 1281a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org 1282a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org __ ldm(ia_w, sp, r4.bit() | pc.bit()); 1283169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1284169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CodeDesc desc; 1285169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org assm.GetCode(&desc); 12869fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 12879fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 1288169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org#ifdef DEBUG 1289f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OFStream os(stdout); 1290f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org code->Print(os); 1291169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org#endif 12929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org F3 f = FUNCTION_CAST<F3>(code->entry()); 1293169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.src0 = 0x01020304; 1294169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.src1 = 0x11121314; 1295169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.src2 = 0x21222324; 1296169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.src3 = 0x31323334; 1297169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.src4 = 0x41424344; 1298169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.src5 = 0x51525354; 1299169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.src6 = 0x61626364; 1300169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.src7 = 0x71727374; 1301169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.dst0 = 0; 1302169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.dst1 = 0; 1303169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.dst2 = 0; 1304169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.dst3 = 0; 1305169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.dst4 = 0; 1306169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.dst5 = 0; 1307169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.dst6 = 0; 1308169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.dst7 = 0; 1309169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.srcA0 = 0x41424344; 1310169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.srcA1 = 0x81828384; 1311169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.dstA0 = 0; 1312169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.dstA1 = 0; 1313169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.dstA2 = 0; 1314169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.dstA3 = 0; 1315a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org t.dstA4 = 0; 1316a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org t.dstA5 = 0; 1317a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org t.dstA6 = 0; 1318a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org t.dstA7 = 0; 1319169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0); 1320169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org USE(dummy); 1321169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CHECK_EQ(0x01020304, t.dst0); 1322169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CHECK_EQ(0x11121314, t.dst1); 1323169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CHECK_EQ(0x21222324, t.dst2); 1324169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CHECK_EQ(0x31323334, t.dst3); 1325169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CHECK_EQ(0x41424344, t.dst4); 1326169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CHECK_EQ(0x51525354, t.dst5); 1327169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CHECK_EQ(0x61626364, t.dst6); 1328169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CHECK_EQ(0x71727374, t.dst7); 1329169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CHECK_EQ(0x00430044, t.dstA0); 1330169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CHECK_EQ(0x00410042, t.dstA1); 1331169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CHECK_EQ(0x00830084, t.dstA2); 1332169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CHECK_EQ(0x00810082, t.dstA3); 1333a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org CHECK_EQ(0x00430044, t.dstA4); 1334a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org CHECK_EQ(0x00410042, t.dstA5); 1335a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org CHECK_EQ(0x00830084, t.dstA6); 1336a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org CHECK_EQ(0x00810082, t.dstA7); 1337169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 1338169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org} 1339169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1340169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1341169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgTEST(16) { 1342169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org // Test the pkh, uxtb, uxtab and uxtb16 instructions. 1343169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CcTest::InitializeVM(); 1344528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 1345169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org HandleScope scope(isolate); 1346169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1347169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org typedef struct { 1348169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t src0; 1349169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t src1; 1350169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t src2; 1351169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t dst0; 1352169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t dst1; 1353169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t dst2; 1354169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t dst3; 1355169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org uint32_t dst4; 1356169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } T; 1357169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org T t; 1358169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1359169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org // Create a function that accepts &t, and loads, manipulates, and stores 1360169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org // the doubles and floats. 1361169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Assembler assm(isolate, NULL, 0); 1362169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1363169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ stm(db_w, sp, r4.bit() | lr.bit()); 1364169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1365169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ mov(r4, Operand(r0)); 1366169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ ldr(r0, MemOperand(r4, OFFSET_OF(T, src0))); 1367169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ ldr(r1, MemOperand(r4, OFFSET_OF(T, src1))); 1368169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1369169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ pkhbt(r2, r0, Operand(r1, LSL, 8)); 1370169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ str(r2, MemOperand(r4, OFFSET_OF(T, dst0))); 1371169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1372169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ pkhtb(r2, r0, Operand(r1, ASR, 8)); 1373169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ str(r2, MemOperand(r4, OFFSET_OF(T, dst1))); 1374169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1375169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ uxtb16(r2, Operand(r0, ROR, 8)); 1376169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ str(r2, MemOperand(r4, OFFSET_OF(T, dst2))); 1377169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1378169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ uxtb(r2, Operand(r0, ROR, 8)); 1379169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ str(r2, MemOperand(r4, OFFSET_OF(T, dst3))); 1380169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1381169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ ldr(r0, MemOperand(r4, OFFSET_OF(T, src2))); 1382169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ uxtab(r2, r0, Operand(r1, ROR, 8)); 1383169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ str(r2, MemOperand(r4, OFFSET_OF(T, dst4))); 1384169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1385169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org __ ldm(ia_w, sp, r4.bit() | pc.bit()); 1386169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1387169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CodeDesc desc; 1388169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org assm.GetCode(&desc); 13899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 13909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 1391169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org#ifdef DEBUG 1392f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OFStream os(stdout); 1393f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org code->Print(os); 1394169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org#endif 13959fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org F3 f = FUNCTION_CAST<F3>(code->entry()); 1396169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.src0 = 0x01020304; 1397169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.src1 = 0x11121314; 1398169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.src2 = 0x11121300; 1399169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.dst0 = 0; 1400169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.dst1 = 0; 1401169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.dst2 = 0; 1402169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.dst3 = 0; 1403169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org t.dst4 = 0; 1404169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0); 1405169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org USE(dummy); 1406169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CHECK_EQ(0x12130304, t.dst0); 1407169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CHECK_EQ(0x01021213, t.dst1); 1408169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CHECK_EQ(0x00010003, t.dst2); 1409169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CHECK_EQ(0x00000003, t.dst3); 1410169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org CHECK_EQ(0x11121313, t.dst4); 1411169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org} 1412169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1413d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 1414d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgTEST(17) { 1415d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org // Test generating labels at high addresses. 1416d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org // Should not assert. 1417d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org CcTest::InitializeVM(); 1418528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 1419d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org HandleScope scope(isolate); 1420d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 1421d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org // Generate a code segment that will be longer than 2^24 bytes. 1422d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org Assembler assm(isolate, NULL, 0); 1423d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org for (size_t i = 0; i < 1 << 23 ; ++i) { // 2^23 1424d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org __ nop(); 1425d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } 1426d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 1427d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org Label target; 1428d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org __ b(eq, &target); 1429d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org __ bind(&target); 1430d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org __ nop(); 1431d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org} 1432d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 1433d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 14340f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org#define TEST_SDIV(expected_, dividend_, divisor_) \ 14350f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org t.dividend = dividend_; \ 14360f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org t.divisor = divisor_; \ 14370f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org t.result = 0; \ 14380f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0); \ 14390f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org CHECK_EQ(expected_, t.result); 14400f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org 14410f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org 14420f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.orgTEST(18) { 14430f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org // Test the sdiv. 14440f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org CcTest::InitializeVM(); 14450f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org Isolate* isolate = CcTest::i_isolate(); 14460f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org HandleScope scope(isolate); 14470f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org 14480f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org typedef struct { 14490f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org uint32_t dividend; 14500f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org uint32_t divisor; 14510f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org uint32_t result; 14520f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org } T; 14530f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org T t; 14540f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org 14550f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org Assembler assm(isolate, NULL, 0); 14560f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org 14570f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org if (CpuFeatures::IsSupported(SUDIV)) { 14580f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org CpuFeatureScope scope(&assm, SUDIV); 14590f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org 14600f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org __ mov(r3, Operand(r0)); 14610f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org 14620f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org __ ldr(r0, MemOperand(r3, OFFSET_OF(T, dividend))); 14630f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org __ ldr(r1, MemOperand(r3, OFFSET_OF(T, divisor))); 14640f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org 14650f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org __ sdiv(r2, r0, r1); 14660f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org __ str(r2, MemOperand(r3, OFFSET_OF(T, result))); 14670f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org 14680f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org __ bx(lr); 14690f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org 14700f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org CodeDesc desc; 14710f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org assm.GetCode(&desc); 14729fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 14739fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 14740f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org#ifdef DEBUG 1475f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OFStream os(stdout); 1476f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org code->Print(os); 14770f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org#endif 14789fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org F3 f = FUNCTION_CAST<F3>(code->entry()); 14790f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org Object* dummy; 14800f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org TEST_SDIV(1073741824, kMinInt, -2); 14810f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org TEST_SDIV(kMinInt, kMinInt, -1); 14820f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org TEST_SDIV(5, 10, 2); 14830f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org TEST_SDIV(3, 10, 3); 14840f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org TEST_SDIV(-5, 10, -2); 14850f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org TEST_SDIV(-3, 10, -3); 14860f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org TEST_SDIV(-5, -10, 2); 14870f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org TEST_SDIV(-3, -10, 3); 14880f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org TEST_SDIV(5, -10, -2); 14890f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org TEST_SDIV(3, -10, -3); 14900f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org USE(dummy); 14910f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org } 14920f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org} 14930f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org 14940f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org 14950f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org#undef TEST_SDIV 14960f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org 14970f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org 14984a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.orgTEST(code_relative_offset) { 14994a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // Test extracting the offset of a label from the beginning of the code 15004a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // in a register. 15014a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org CcTest::InitializeVM(); 1502528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 15034a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org HandleScope scope(isolate); 15044a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // Initialize a code object that will contain the code. 15054a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org Handle<Object> code_object(isolate->heap()->undefined_value(), isolate); 15064a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org 15074a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org Assembler assm(isolate, NULL, 0); 15084a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org 15094a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org Label start, target_away, target_faraway; 15104a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org 15114a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ stm(db_w, sp, r4.bit() | r5.bit() | lr.bit()); 15124a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org 15134a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // r3 is used as the address zero, the test will crash when we load it. 15144a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ mov(r3, Operand::Zero()); 15154a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org 15164a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // r5 will be a pointer to the start of the code. 15174a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ mov(r5, Operand(code_object)); 15184a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ mov_label_offset(r4, &start); 15194a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org 15204a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ mov_label_offset(r1, &target_faraway); 15214a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ str(r1, MemOperand(sp, kPointerSize, NegPreIndex)); 15224a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org 15234a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ mov_label_offset(r1, &target_away); 15244a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org 15254a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // Jump straight to 'target_away' the first time and use the relative 15264a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // position the second time. This covers the case when extracting the 15274a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // position of a label which is linked. 15284a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ mov(r2, Operand::Zero()); 15294a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ bind(&start); 15304a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ cmp(r2, Operand::Zero()); 15314a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ b(eq, &target_away); 15324a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ add(pc, r5, r1); 15334a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // Emit invalid instructions to push the label between 2^8 and 2^16 15344a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // instructions away. The test will crash if they are reached. 15354a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org for (int i = 0; i < (1 << 10); i++) { 15364a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ ldr(r3, MemOperand(r3)); 15374a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org } 15384a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ bind(&target_away); 15394a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // This will be hit twice: r0 = r0 + 5 + 5. 15404a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ add(r0, r0, Operand(5)); 15414a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org 15424a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ ldr(r1, MemOperand(sp, kPointerSize, PostIndex), ne); 15434a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ add(pc, r5, r4, LeaveCC, ne); 15444a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org 15454a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ mov(r2, Operand(1)); 15464a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ b(&start); 15474a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // Emit invalid instructions to push the label between 2^16 and 2^24 15484a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // instructions away. The test will crash if they are reached. 15494a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org for (int i = 0; i < (1 << 21); i++) { 15504a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ ldr(r3, MemOperand(r3)); 15514a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org } 15524a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ bind(&target_faraway); 15534a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org // r0 = r0 + 5 + 5 + 11 15544a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ add(r0, r0, Operand(11)); 15554a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org 15564a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org __ ldm(ia_w, sp, r4.bit() | r5.bit() | pc.bit()); 15574a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org 15584a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org CodeDesc desc; 15594a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org assm.GetCode(&desc); 15609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 15619fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), code_object); 15624a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org F1 f = FUNCTION_CAST<F1>(code->entry()); 15634a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 21, 0, 0, 0, 0)); 15644a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org ::printf("f() = %d\n", res); 15654a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org CHECK_EQ(42, res); 15664a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org} 15674a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org 15689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#undef __ 1569