1864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Copyright 2013 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"
314b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "test/cctest/cctest.h"
32864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
335de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/platform/platform.h"
34196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/factory.h"
354b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/macro-assembler.h"
36196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/serialize.h"
37864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
38864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgusing namespace v8::internal;
39864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
40864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#if __GNUC__
41864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#define STDCALL  __attribute__((stdcall))
42864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#else
43864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#define STDCALL  __stdcall
44864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#endif
45864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
46864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgtypedef int STDCALL F0Type();
47864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgtypedef F0Type* F0;
48864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
49864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#define __ masm->
50864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
51864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
52864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgTEST(LoadAndStoreWithRepresentation) {
53864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Allocate an executable page of memory.
54864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  size_t actual_size;
555de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  byte* buffer = static_cast<byte*>(v8::base::OS::Allocate(
565de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org      Assembler::kMinimalBufferSize, &actual_size, true));
57864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  CHECK(buffer);
58864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
59864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  HandleScope handles(isolate);
60864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
61864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  MacroAssembler* masm = &assembler;  // Create a pointer for the __ macro.
62864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ push(ebx);
63864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ push(edx);
64864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ sub(esp, Immediate(1 * kPointerSize));
65864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Label exit;
66864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
67864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Test 1.
68864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(eax, Immediate(1));  // Test number.
69864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(Operand(esp, 0 * kPointerSize), Immediate(0));
70864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(ebx, Immediate(-1));
71864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ Store(ebx, Operand(esp, 0 * kPointerSize), Representation::UInteger8());
72864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(ebx, Operand(esp, 0 * kPointerSize));
73864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(edx, Immediate(255));
74864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ cmp(ebx, edx);
75864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ j(not_equal, &exit);
76864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ Load(ebx, Operand(esp, 0 * kPointerSize), Representation::UInteger8());
77864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ cmp(ebx, edx);
78864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ j(not_equal, &exit);
79864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
80864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
81864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Test 2.
82864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(eax, Immediate(2));  // Test number.
83864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(Operand(esp, 0 * kPointerSize), Immediate(0));
84864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(ebx, Immediate(-1));
85864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ Store(ebx, Operand(esp, 0 * kPointerSize), Representation::Integer8());
86864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(ebx, Operand(esp, 0 * kPointerSize));
87864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(edx, Immediate(255));
88864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ cmp(ebx, edx);
89864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ j(not_equal, &exit);
90864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ Load(ebx, Operand(esp, 0 * kPointerSize), Representation::Integer8());
91864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(edx, Immediate(-1));
92864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ cmp(ebx, edx);
93864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ j(not_equal, &exit);
94864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
95864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Test 3.
96864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(eax, Immediate(3));  // Test number.
97864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(Operand(esp, 0 * kPointerSize), Immediate(0));
98864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(ebx, Immediate(-1));
99864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ Store(ebx, Operand(esp, 0 * kPointerSize), Representation::Integer16());
100864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(ebx, Operand(esp, 0 * kPointerSize));
101864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(edx, Immediate(65535));
102864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ cmp(ebx, edx);
103864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ j(not_equal, &exit);
104864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ Load(edx, Operand(esp, 0 * kPointerSize), Representation::Integer16());
105864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(ebx, Immediate(-1));
106864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ cmp(ebx, edx);
107864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ j(not_equal, &exit);
108864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
109864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Test 4.
110864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(eax, Immediate(4));  // Test number.
111864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(Operand(esp, 0 * kPointerSize), Immediate(0));
112864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(ebx, Immediate(-1));
113864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ Store(ebx, Operand(esp, 0 * kPointerSize), Representation::UInteger16());
114864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(ebx, Operand(esp, 0 * kPointerSize));
115864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(edx, Immediate(65535));
116864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ cmp(ebx, edx);
117864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ j(not_equal, &exit);
118864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ Load(edx, Operand(esp, 0 * kPointerSize), Representation::UInteger16());
119864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ cmp(ebx, edx);
120864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ j(not_equal, &exit);
121864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
122864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Test 5.
123864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ mov(eax, Immediate(5));
124864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ Move(edx, Immediate(0));  // Test Move()
125864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ cmp(edx, Immediate(0));
126864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ j(not_equal, &exit);
127864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ Move(ecx, Immediate(-1));
128864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ cmp(ecx, Immediate(-1));
129864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ j(not_equal, &exit);
130864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ Move(ebx, Immediate(0x77));
131864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ cmp(ebx, Immediate(0x77));
132864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ j(not_equal, &exit);
133864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
134864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ xor_(eax, eax);  // Success.
135864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ bind(&exit);
136864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ add(esp, Immediate(1 * kPointerSize));
137864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ pop(edx);
138864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ pop(ebx);
139864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  __ ret(0);
140864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
141864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  CodeDesc desc;
142864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  masm->GetCode(&desc);
143864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Call the function from C++.
144864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int result = FUNCTION_CAST<F0>(buffer)();
145864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  CHECK_EQ(0, result);
146864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org}
147864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
148864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#undef __
149