1c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Copyright 2011 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
289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include <stdlib.h>
299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
30196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
325de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/platform/platform.h"
33196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/disassembler.h"
34196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/factory.h"
35196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/macro-assembler.h"
367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/ostreams.h"
37196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/serialize.h"
38196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h"
399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing namespace v8::internal;
419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtypedef int (*F0)();
449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtypedef int (*F1)(int x);
459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtypedef int (*F2)(int x, int y);
469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#define __ assm.
499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(AssemblerIa320) {
51e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
52e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate());
532bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  v8::internal::byte buffer[256];
5609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Assembler assm(isolate, buffer, sizeof buffer);
579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ mov(eax, Operand(esp, 4));
599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ add(eax, Operand(esp, 8));
609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ ret(0);
619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CodeDesc desc;
639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  assm.GetCode(&desc);
649fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
659fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
669e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#ifdef OBJECT_PRINT
67f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  OFStream os(stdout);
68f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  code->Print(os);
699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif
709fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F2 f = FUNCTION_CAST<F2>(code->entry());
719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  int res = f(3, 4);
729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  ::printf("f() = %d\n", res);
739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(7, res);
749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(AssemblerIa321) {
78e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
79e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate());
802bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  v8::internal::byte buffer[256];
8309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Assembler assm(isolate, buffer, sizeof buffer);
849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Label L, C;
859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ mov(edx, Operand(esp, 4));
87c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  __ xor_(eax, eax);  // clear eax
889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ jmp(&C);
899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ bind(&L);
91c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  __ add(eax, edx);
92c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  __ sub(edx, Immediate(1));
939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ bind(&C);
95c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  __ test(edx, edx);
967304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  __ j(not_zero, &L);
979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ ret(0);
989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CodeDesc desc;
1009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  assm.GetCode(&desc);
1019fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
1029fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
1039e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#ifdef OBJECT_PRINT
104f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  OFStream os(stdout);
105f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  code->Print(os);
1069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif
1079fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F1 f = FUNCTION_CAST<F1>(code->entry());
1089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  int res = f(100);
1099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  ::printf("f() = %d\n", res);
1109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(5050, res);
1119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(AssemblerIa322) {
115e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
116e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate());
1172bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
1189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  v8::internal::byte buffer[256];
12009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Assembler assm(isolate, buffer, sizeof buffer);
1219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Label L, C;
1229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ mov(edx, Operand(esp, 4));
1249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ mov(eax, 1);
1259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ jmp(&C);
1269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ bind(&L);
128c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  __ imul(eax, edx);
129c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  __ sub(edx, Immediate(1));
1309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ bind(&C);
132c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  __ test(edx, edx);
1337304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  __ j(not_zero, &L);
1349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ ret(0);
1359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // some relocated stuff here, not executed
137d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  __ mov(eax, isolate->factory()->true_value());
138236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org  __ jmp(NULL, RelocInfo::RUNTIME_ENTRY);
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>());
1449e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#ifdef OBJECT_PRINT
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 = f(10);
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.comtypedef int (*F3)(float x);
1569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(AssemblerIa323) {
158e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
159c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
160e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate());
1612bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
1629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  v8::internal::byte buffer[256];
16409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Assembler assm(isolate, buffer, sizeof buffer);
1659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1663c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  __ cvttss2si(eax, Operand(esp, 4));
1673c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  __ ret(0);
1689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CodeDesc desc;
1709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  assm.GetCode(&desc);
1719fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
1729fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
1739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // don't print the code - our disassembler can't handle cvttss2si
1749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // instead print bytes
1759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Disassembler::Dump(stdout,
1769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                     code->instruction_start(),
1779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                     code->instruction_start() + code->instruction_size());
1789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  F3 f = FUNCTION_CAST<F3>(code->entry());
1799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  int res = f(static_cast<float>(-3.1415));
1809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  ::printf("f() = %d\n", res);
1819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(-3, res);
1829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtypedef int (*F4)(double x);
1869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(AssemblerIa324) {
188e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
189c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
190e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate());
1912bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
1929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  v8::internal::byte buffer[256];
19409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Assembler assm(isolate, buffer, sizeof buffer);
1959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ cvttsd2si(eax, Operand(esp, 4));
1979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ ret(0);
1989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CodeDesc desc;
2009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  assm.GetCode(&desc);
2019fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
2029fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
2039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // don't print the code - our disassembler can't handle cvttsd2si
2049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // instead print bytes
2059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Disassembler::Dump(stdout,
2069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                     code->instruction_start(),
2079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                     code->instruction_start() + code->instruction_size());
2089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  F4 f = FUNCTION_CAST<F4>(code->entry());
2099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  int res = f(2.718281828);
2109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  ::printf("f() = %d\n", res);
2119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(2, res);
2129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic int baz = 42;
2169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(AssemblerIa325) {
217e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
218e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate());
2192bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
2209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  v8::internal::byte buffer[256];
22209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Assembler assm(isolate, buffer, sizeof buffer);
2239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
22459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  __ mov(eax, Operand(reinterpret_cast<intptr_t>(&baz), RelocInfo::NONE32));
2259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ ret(0);
2269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CodeDesc desc;
2289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  assm.GetCode(&desc);
2299fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
2309fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
2319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  F0 f = FUNCTION_CAST<F0>(code->entry());
2329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  int res = f();
2339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(42, res);
2349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtypedef double (*F5)(double x, double y);
2389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(AssemblerIa326) {
240e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
241c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
242e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate());
2432bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
2449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  v8::internal::byte buffer[256];
24509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Assembler assm(isolate, buffer, sizeof buffer);
2469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2470fdb2a65d0f07bb7f6d6ce2f8337e00e5c9c323dbmeurer@chromium.org  __ movsd(xmm0, Operand(esp, 1 * kPointerSize));
2480fdb2a65d0f07bb7f6d6ce2f8337e00e5c9c323dbmeurer@chromium.org  __ movsd(xmm1, Operand(esp, 3 * kPointerSize));
2499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ addsd(xmm0, xmm1);
2509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ mulsd(xmm0, xmm1);
2519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ subsd(xmm0, xmm1);
2529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ divsd(xmm0, xmm1);
2539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Copy xmm0 to st(0) using eight bytes of stack.
254c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  __ sub(esp, Immediate(8));
2550fdb2a65d0f07bb7f6d6ce2f8337e00e5c9c323dbmeurer@chromium.org  __ movsd(Operand(esp, 0), xmm0);
2569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ fld_d(Operand(esp, 0));
257c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  __ add(esp, Immediate(8));
2589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ ret(0);
2599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CodeDesc desc;
2619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  assm.GetCode(&desc);
2629fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
2639fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
2649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#ifdef DEBUG
2659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  ::printf("\n---\n");
2669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // don't print the code - our disassembler can't handle SSE instructions
2679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // instead print bytes
2689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Disassembler::Dump(stdout,
2699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                     code->instruction_start(),
2709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                     code->instruction_start() + code->instruction_size());
2719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif
2729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  F5 f = FUNCTION_CAST<F5>(code->entry());
2739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  double res = f(2.2, 1.1);
2749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  ::printf("f() = %f\n", res);
2759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(2.29 < res && res < 2.31);
2769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtypedef double (*F6)(int x);
2809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(AssemblerIa328) {
282e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
283c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
284e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate());
2852bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
2869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  v8::internal::byte buffer[256];
28709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Assembler assm(isolate, buffer, sizeof buffer);
2889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ mov(eax, Operand(esp, 4));
289c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  __ cvtsi2sd(xmm0, eax);
2909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Copy xmm0 to st(0) using eight bytes of stack.
291c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  __ sub(esp, Immediate(8));
2920fdb2a65d0f07bb7f6d6ce2f8337e00e5c9c323dbmeurer@chromium.org  __ movsd(Operand(esp, 0), xmm0);
2939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ fld_d(Operand(esp, 0));
294c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  __ add(esp, Immediate(8));
2959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ ret(0);
2969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CodeDesc desc;
2979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  assm.GetCode(&desc);
2989fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
2999fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
3009e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#ifdef OBJECT_PRINT
301f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  OFStream os(stdout);
302f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  code->Print(os);
3039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif
3049fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F6 f = FUNCTION_CAST<F6>(code->entry());
3059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  double res = f(12);
3069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  ::printf("f() = %f\n", res);
3089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(11.99 < res && res < 12.001);
3099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtypedef int (*F7)(double x, double y);
3139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(AssemblerIa329) {
315e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
316e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate());
3172bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
3189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  v8::internal::byte buffer[256];
31909d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  MacroAssembler assm(isolate, buffer, sizeof buffer);
3209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  enum { kEqual = 0, kGreater = 1, kLess = 2, kNaN = 3, kUndefined = 4 };
3219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Label equal_l, less_l, greater_l, nan_l;
3229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ fld_d(Operand(esp, 3 * kPointerSize));
3239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ fld_d(Operand(esp, 1 * kPointerSize));
3249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ FCmp();
3257304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  __ j(parity_even, &nan_l);
3267304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  __ j(equal, &equal_l);
3277304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  __ j(below, &less_l);
3287304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  __ j(above, &greater_l);
3299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ mov(eax, kUndefined);
3319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ ret(0);
3329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ bind(&equal_l);
3349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ mov(eax, kEqual);
3359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ ret(0);
3369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ bind(&greater_l);
3389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ mov(eax, kGreater);
3399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ ret(0);
3409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ bind(&less_l);
3429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ mov(eax, kLess);
3439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ ret(0);
3449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ bind(&nan_l);
3469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ mov(eax, kNaN);
3479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ ret(0);
3489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CodeDesc desc;
3519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  assm.GetCode(&desc);
3529fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
3539fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
3549e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#ifdef OBJECT_PRINT
355f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  OFStream os(stdout);
356f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  code->Print(os);
3579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif
3589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3599fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F7 f = FUNCTION_CAST<F7>(code->entry());
3609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(kLess, f(1.1, 2.2));
3619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(kEqual, f(2.2, 2.2));
3629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(kGreater, f(3.3, 2.2));
3635de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  CHECK_EQ(kNaN, f(v8::base::OS::nan_value(), 1.1));
3649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
36680c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org
36780c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.orgTEST(AssemblerIa3210) {
36880c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  // Test chaining of label usages within instructions (issue 1644).
369e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
370e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate());
3712bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
37209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Assembler assm(isolate, NULL, 0);
37380c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org
37480c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  Label target;
37580c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  __ j(equal, &target);
37680c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  __ j(not_equal, &target);
37780c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  __ bind(&target);
37880c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  __ nop();
37980c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org}
38080c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org
38164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
38264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgTEST(AssemblerMultiByteNop) {
383e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
384e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate());
3852bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
38664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  v8::internal::byte buffer[1024];
38709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Assembler assm(isolate, buffer, sizeof(buffer));
38864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ push(ebx);
38964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ push(ecx);
39064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ push(edx);
39164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ push(edi);
39264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ push(esi);
39364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ mov(eax, 1);
39464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ mov(ebx, 2);
39564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ mov(ecx, 3);
39664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ mov(edx, 4);
39764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ mov(edi, 5);
39864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ mov(esi, 6);
39964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  for (int i = 0; i < 16; i++) {
40064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    int before = assm.pc_offset();
40164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    __ Nop(i);
40264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    CHECK_EQ(assm.pc_offset() - before, i);
40364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  }
40464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
40564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  Label fail;
40664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ cmp(eax, 1);
40764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ j(not_equal, &fail);
40864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ cmp(ebx, 2);
40964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ j(not_equal, &fail);
41064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ cmp(ecx, 3);
41164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ j(not_equal, &fail);
41264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ cmp(edx, 4);
41364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ j(not_equal, &fail);
41464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ cmp(edi, 5);
41564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ j(not_equal, &fail);
41664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ cmp(esi, 6);
41764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ j(not_equal, &fail);
41864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ mov(eax, 42);
41964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ pop(esi);
42064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ pop(edi);
42164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ pop(edx);
42264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ pop(ecx);
42364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ pop(ebx);
42464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ ret(0);
42564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ bind(&fail);
42664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ mov(eax, 13);
42764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ pop(esi);
42864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ pop(edi);
42964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ pop(edx);
43064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ pop(ecx);
43164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ pop(ebx);
43264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  __ ret(0);
43364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
43464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  CodeDesc desc;
43564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  assm.GetCode(&desc);
4369fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
4379fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
43864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  CHECK(code->IsCode());
43964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
44064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  F0 f = FUNCTION_CAST<F0>(code->entry());
44164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  int res = f();
44264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  CHECK_EQ(42, res);
44364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
44464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
44564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
446e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org#ifdef __GNUC__
447e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org#define ELEMENT_COUNT 4
448e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
449e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgvoid DoSSE2(const v8::FunctionCallbackInfo<v8::Value>& args) {
450e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate());
451e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  HandleScope scope(isolate);
452e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
453e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CHECK(args[0]->IsArray());
454e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  v8::Local<v8::Array> vec = v8::Local<v8::Array>::Cast(args[0]);
455e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CHECK_EQ(ELEMENT_COUNT, vec->Length());
456e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
457e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  v8::internal::byte buffer[256];
458e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  Assembler assm(isolate, buffer, sizeof buffer);
459e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
460e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  // Remove return address from the stack for fix stack frame alignment.
461e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  __ pop(ecx);
462e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
463e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  // Store input vector on the stack.
464e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  for (int i = 0; i < ELEMENT_COUNT; ++i) {
465e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org    __ push(Immediate(vec->Get(i)->Int32Value()));
466e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  }
467e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
468e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  // Read vector into a xmm register.
469e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  __ pxor(xmm0, xmm0);
470e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  __ movdqa(xmm0, Operand(esp, 0));
471e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  // Create mask and store it in the return register.
472e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  __ movmskps(eax, xmm0);
473e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
474e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  // Remove unused data from the stack.
475e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  __ add(esp, Immediate(ELEMENT_COUNT * sizeof(int32_t)));
476e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  // Restore return address.
477e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  __ push(ecx);
478e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
479e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  __ ret(0);
480e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
481e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CodeDesc desc;
482e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  assm.GetCode(&desc);
483e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
4849fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
4859fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
486e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
4879fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F0 f = FUNCTION_CAST<F0>(code->entry());
488e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  int res = f();
4890f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org  args.GetReturnValue().Set(v8::Integer::New(CcTest::isolate(), res));
490e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org}
491e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
492e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
493e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgTEST(StackAlignmentForSSE2) {
494e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CcTest::InitializeVM();
4955de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  CHECK_EQ(0, v8::base::OS::ActivationFrameAlignment() % 16);
496e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
497528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  v8::Isolate* isolate = CcTest::isolate();
498e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  v8::HandleScope handle_scope(isolate);
4999cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org  v8::Handle<v8::ObjectTemplate> global_template =
5009cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org      v8::ObjectTemplate::New(isolate);
5014f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  global_template->Set(v8_str("do_sse2"),
5024f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org                       v8::FunctionTemplate::New(isolate, DoSSE2));
503e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
504e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  LocalContext env(NULL, global_template);
505e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CompileRun(
506e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org      "function foo(vec) {"
507e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org      "  return do_sse2(vec);"
508e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org      "}");
509e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
510e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  v8::Local<v8::Object> global_object = env->Global();
511e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  v8::Local<v8::Function> foo =
512e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org      v8::Local<v8::Function>::Cast(global_object->Get(v8_str("foo")));
513e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
514e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  int32_t vec[ELEMENT_COUNT] = { -1, 1, 1, 1 };
5159f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  v8::Local<v8::Array> v8_vec = v8::Array::New(isolate, ELEMENT_COUNT);
516e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  for (int i = 0; i < ELEMENT_COUNT; i++) {
517e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org      v8_vec->Set(i, v8_num(vec[i]));
518e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  }
519e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
520e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  v8::Local<v8::Value> args[] = { v8_vec };
521e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  v8::Local<v8::Value> result = foo->Call(global_object, 1, args);
522e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
523e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  // The mask should be 0b1000.
524e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CHECK_EQ(8, result->Int32Value());
525e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org}
526e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
527e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org#undef ELEMENT_COUNT
528e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org#endif  // __GNUC__
52964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
53064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
531b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.orgTEST(AssemblerIa32Extractps) {
532b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  CcTest::InitializeVM();
5333c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  if (!CpuFeatures::IsSupported(SSE4_1)) return;
534b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org
535b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate());
536b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  HandleScope scope(isolate);
537b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  v8::internal::byte buffer[256];
538b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  MacroAssembler assm(isolate, buffer, sizeof buffer);
5393c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  { CpuFeatureScope fscope41(&assm, SSE4_1);
5400fdb2a65d0f07bb7f6d6ce2f8337e00e5c9c323dbmeurer@chromium.org    __ movsd(xmm1, Operand(esp, 4));
541b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    __ extractps(eax, xmm1, 0x1);
542b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    __ ret(0);
543b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  }
544b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org
545b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  CodeDesc desc;
546b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  assm.GetCode(&desc);
5479fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
5489fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
549b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org#ifdef OBJECT_PRINT
550f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  OFStream os(stdout);
551f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  code->Print(os);
552b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org#endif
553b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org
5549fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F4 f = FUNCTION_CAST<F4>(code->entry());
555b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  uint64_t value1 = V8_2PART_UINT64_C(0x12345678, 87654321);
556b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  CHECK_EQ(0x12345678, f(uint64_to_double(value1)));
557b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  uint64_t value2 = V8_2PART_UINT64_C(0x87654321, 12345678);
558b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  CHECK_EQ(0x87654321, f(uint64_to_double(value2)));
559b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org}
560b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org
561b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org
562af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgtypedef int (*F8)(float x, float y);
563af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgTEST(AssemblerIa32SSE) {
564af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  CcTest::InitializeVM();
565af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org
566af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate());
567af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  HandleScope scope(isolate);
568af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  v8::internal::byte buffer[256];
569af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  MacroAssembler assm(isolate, buffer, sizeof buffer);
570af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  {
571af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org    __ movss(xmm0, Operand(esp, kPointerSize));
572af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org    __ movss(xmm1, Operand(esp, 2 * kPointerSize));
573af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org    __ shufps(xmm0, xmm0, 0x0);
574af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org    __ shufps(xmm1, xmm1, 0x0);
575af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org    __ movaps(xmm2, xmm1);
576af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org    __ addps(xmm2, xmm0);
577af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org    __ mulps(xmm2, xmm1);
578af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org    __ subps(xmm2, xmm0);
579af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org    __ divps(xmm2, xmm1);
580af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org    __ cvttss2si(eax, xmm2);
581af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org    __ ret(0);
582af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  }
583af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org
584af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  CodeDesc desc;
585af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  assm.GetCode(&desc);
5869fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
5879fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
588af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org#ifdef OBJECT_PRINT
589f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  OFStream os(stdout);
590f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  code->Print(os);
591af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org#endif
592af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org
5939fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  F8 f = FUNCTION_CAST<F8>(code->entry());
594af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  CHECK_EQ(2, f(1.0, 2.0));
595af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org}
596af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org
597af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org
5989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#undef __
599