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