1864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 2864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Redistribution and use in source and binary forms, with or without 3864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// modification, are permitted provided that the following conditions are 4864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// met: 5864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// 6864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// * Redistributions of source code must retain the above copyright 7864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// notice, this list of conditions and the following disclaimer. 8864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// * Redistributions in binary form must reproduce the above 9864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// copyright notice, this list of conditions and the following 10864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// disclaimer in the documentation and/or other materials provided 11864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// with the distribution. 12864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// * Neither the name of Google Inc. nor the names of its 13864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// contributors may be used to endorse or promote products derived 14864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// from this software without specific prior written permission. 15864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// 16864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 28864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#include <stdlib.h> 29864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 30196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 31864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 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" 365c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org#include "src/ostreams.h" 37196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/serialize.h" 38196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h" 39864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 40864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgusing namespace v8::internal; 41864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 42864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 43864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgtypedef int (*F0)(); 44864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgtypedef int (*F1)(int x); 45864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgtypedef int (*F2)(int x, int y); 46864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 47864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 48864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#define __ assm. 49864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 50864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgTEST(AssemblerIa320) { 51864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CcTest::InitializeVM(); 52864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate()); 53864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org HandleScope scope(isolate); 54864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 55864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org v8::internal::byte buffer[256]; 56864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Assembler assm(isolate, buffer, sizeof buffer); 57864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 58864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ mov(eax, Operand(esp, 4)); 59864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ add(eax, Operand(esp, 8)); 60864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ ret(0); 61864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 62864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CodeDesc desc; 63864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org assm.GetCode(&desc); 64864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 65864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 66864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#ifdef OBJECT_PRINT 6760fc910a49e86bb7faeeee0017abbd1ca05d16e8machenbach@chromium.org OFStream os(stdout); 6860fc910a49e86bb7faeeee0017abbd1ca05d16e8machenbach@chromium.org code->Print(os); 69864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#endif 70864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org F2 f = FUNCTION_CAST<F2>(code->entry()); 71864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int res = f(3, 4); 72864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org ::printf("f() = %d\n", res); 73864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CHECK_EQ(7, res); 74864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 75864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 76864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 77864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgTEST(AssemblerIa321) { 78864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CcTest::InitializeVM(); 79864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate()); 80864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org HandleScope scope(isolate); 81864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 82864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org v8::internal::byte buffer[256]; 83864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Assembler assm(isolate, buffer, sizeof buffer); 84864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Label L, C; 85864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 86864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ mov(edx, Operand(esp, 4)); 87864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ xor_(eax, eax); // clear eax 88864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ jmp(&C); 89864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 90864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ bind(&L); 91864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ add(eax, edx); 92864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ sub(edx, Immediate(1)); 93864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 94864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ bind(&C); 95864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ test(edx, edx); 96864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ j(not_zero, &L); 97864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ ret(0); 98864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 99864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CodeDesc desc; 100864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org assm.GetCode(&desc); 101864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 102864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 103864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#ifdef OBJECT_PRINT 10460fc910a49e86bb7faeeee0017abbd1ca05d16e8machenbach@chromium.org OFStream os(stdout); 10560fc910a49e86bb7faeeee0017abbd1ca05d16e8machenbach@chromium.org code->Print(os); 106864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#endif 107864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org F1 f = FUNCTION_CAST<F1>(code->entry()); 108864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int res = f(100); 109864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org ::printf("f() = %d\n", res); 110864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CHECK_EQ(5050, res); 111864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 112864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 113864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 114864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgTEST(AssemblerIa322) { 115864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CcTest::InitializeVM(); 116864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate()); 117864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org HandleScope scope(isolate); 118864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 119864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org v8::internal::byte buffer[256]; 120864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Assembler assm(isolate, buffer, sizeof buffer); 121864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Label L, C; 122864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 123864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ mov(edx, Operand(esp, 4)); 124864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ mov(eax, 1); 125864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ jmp(&C); 126864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 127864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ bind(&L); 128864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ imul(eax, edx); 129864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ sub(edx, Immediate(1)); 130864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 131864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ bind(&C); 132864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ test(edx, edx); 133864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ j(not_zero, &L); 134864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ ret(0); 135864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 136864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // some relocated stuff here, not executed 137864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ mov(eax, isolate->factory()->true_value()); 138864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ jmp(NULL, RelocInfo::RUNTIME_ENTRY); 139864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 140864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CodeDesc desc; 141864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org assm.GetCode(&desc); 142864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 143864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 144864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#ifdef OBJECT_PRINT 14560fc910a49e86bb7faeeee0017abbd1ca05d16e8machenbach@chromium.org OFStream os(stdout); 14660fc910a49e86bb7faeeee0017abbd1ca05d16e8machenbach@chromium.org code->Print(os); 147864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#endif 148864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org F1 f = FUNCTION_CAST<F1>(code->entry()); 149864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int res = f(10); 150864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org ::printf("f() = %d\n", res); 151864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CHECK_EQ(3628800, res); 152864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 153864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 154864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 155864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgtypedef int (*F3)(float x); 156864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 157864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgtypedef int (*F4)(double x); 158864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 159864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgstatic int baz = 42; 160864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgTEST(AssemblerIa325) { 161864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CcTest::InitializeVM(); 162864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate()); 163864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org HandleScope scope(isolate); 164864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 165864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org v8::internal::byte buffer[256]; 166864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Assembler assm(isolate, buffer, sizeof buffer); 167864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 168864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ mov(eax, Operand(reinterpret_cast<intptr_t>(&baz), RelocInfo::NONE32)); 169864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ ret(0); 170864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 171864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CodeDesc desc; 172864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org assm.GetCode(&desc); 173864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 174864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 175864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org F0 f = FUNCTION_CAST<F0>(code->entry()); 176864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int res = f(); 177864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CHECK_EQ(42, res); 178864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 179864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 180864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 181864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgtypedef int (*F7)(double x, double y); 182864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 183864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgTEST(AssemblerIa329) { 184864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CcTest::InitializeVM(); 185864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate()); 186864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org HandleScope scope(isolate); 187864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org v8::internal::byte buffer[256]; 188864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org MacroAssembler assm(isolate, buffer, sizeof buffer); 189864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org enum { kEqual = 0, kGreater = 1, kLess = 2, kNaN = 3, kUndefined = 4 }; 190864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Label equal_l, less_l, greater_l, nan_l; 191864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ fld_d(Operand(esp, 3 * kPointerSize)); 192864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ fld_d(Operand(esp, 1 * kPointerSize)); 193864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ FCmp(); 194864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ j(parity_even, &nan_l); 195864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ j(equal, &equal_l); 196864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ j(below, &less_l); 197864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ j(above, &greater_l); 198864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 199864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ mov(eax, kUndefined); 200864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ ret(0); 201864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 202864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ bind(&equal_l); 203864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ mov(eax, kEqual); 204864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ ret(0); 205864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 206864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ bind(&greater_l); 207864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ mov(eax, kGreater); 208864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ ret(0); 209864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 210864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ bind(&less_l); 211864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ mov(eax, kLess); 212864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ ret(0); 213864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 214864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ bind(&nan_l); 215864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ mov(eax, kNaN); 216864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ ret(0); 217864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 218864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 219864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CodeDesc desc; 220864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org assm.GetCode(&desc); 221864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 222864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 223864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#ifdef OBJECT_PRINT 22460fc910a49e86bb7faeeee0017abbd1ca05d16e8machenbach@chromium.org OFStream os(stdout); 22560fc910a49e86bb7faeeee0017abbd1ca05d16e8machenbach@chromium.org code->Print(os); 226864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#endif 227864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 228864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org F7 f = FUNCTION_CAST<F7>(code->entry()); 229864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CHECK_EQ(kLess, f(1.1, 2.2)); 230864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CHECK_EQ(kEqual, f(2.2, 2.2)); 231864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CHECK_EQ(kGreater, f(3.3, 2.2)); 2325de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org CHECK_EQ(kNaN, f(v8::base::OS::nan_value(), 1.1)); 233864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 234864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 235864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 236864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgTEST(AssemblerIa3210) { 237864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Test chaining of label usages within instructions (issue 1644). 238864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CcTest::InitializeVM(); 239864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate()); 240864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org HandleScope scope(isolate); 241864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Assembler assm(isolate, NULL, 0); 242864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 243864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Label target; 244864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ j(equal, &target); 245864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ j(not_equal, &target); 246864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ bind(&target); 247864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ nop(); 248864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 249864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 250864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 251864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgTEST(AssemblerMultiByteNop) { 252864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CcTest::InitializeVM(); 253864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate()); 254864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org HandleScope scope(isolate); 255864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org v8::internal::byte buffer[1024]; 256864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Assembler assm(isolate, buffer, sizeof(buffer)); 257864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ push(ebx); 258864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ push(ecx); 259864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ push(edx); 260864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ push(edi); 261864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ push(esi); 262864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ mov(eax, 1); 263864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ mov(ebx, 2); 264864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ mov(ecx, 3); 265864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ mov(edx, 4); 266864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ mov(edi, 5); 267864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ mov(esi, 6); 268864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org for (int i = 0; i < 16; i++) { 269864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int before = assm.pc_offset(); 270864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ Nop(i); 271864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CHECK_EQ(assm.pc_offset() - before, i); 272864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 273864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 274864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Label fail; 275864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ cmp(eax, 1); 276864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ j(not_equal, &fail); 277864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ cmp(ebx, 2); 278864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ j(not_equal, &fail); 279864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ cmp(ecx, 3); 280864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ j(not_equal, &fail); 281864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ cmp(edx, 4); 282864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ j(not_equal, &fail); 283864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ cmp(edi, 5); 284864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ j(not_equal, &fail); 285864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ cmp(esi, 6); 286864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ j(not_equal, &fail); 287864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ mov(eax, 42); 288864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ pop(esi); 289864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ pop(edi); 290864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ pop(edx); 291864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ pop(ecx); 292864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ pop(ebx); 293864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ ret(0); 294864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ bind(&fail); 295864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ mov(eax, 13); 296864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ pop(esi); 297864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ pop(edi); 298864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ pop(edx); 299864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ pop(ecx); 300864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ pop(ebx); 301864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org __ ret(0); 302864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 303864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CodeDesc desc; 304864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org assm.GetCode(&desc); 305864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Handle<Code> code = isolate->factory()->NewCode( 306864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 307864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CHECK(code->IsCode()); 308864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 309864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org F0 f = FUNCTION_CAST<F0>(code->entry()); 310864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int res = f(); 311864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CHECK_EQ(42, res); 312864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 313864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 314864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 315864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#undef __ 316