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