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