Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(141)

Side by Side Diff: runtime/vm/assembler_dbc_test.cc

Issue 2974233002: VM: Re-format to use at most one newline between functions (Closed)
Patch Set: Rebase and merge Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/assembler_dbc.cc ('k') | runtime/vm/assembler_ia32.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/globals.h" 5 #include "vm/globals.h"
6 #if defined(TARGET_ARCH_DBC) 6 #if defined(TARGET_ARCH_DBC)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/stack_frame.h" 9 #include "vm/stack_frame.h"
10 #include "vm/unit_test.h" 10 #include "vm/unit_test.h"
11 11
12 namespace dart { 12 namespace dart {
13 13
14 static RawObject* ExecuteTest(const Code& code) { 14 static RawObject* ExecuteTest(const Code& code) {
15 Thread* thread = Thread::Current(); 15 Thread* thread = Thread::Current();
16 TransitionToGenerated transition(thread); 16 TransitionToGenerated transition(thread);
17 const intptr_t kTypeArgsLen = 0; 17 const intptr_t kTypeArgsLen = 0;
18 const intptr_t kNumArgs = 0; 18 const intptr_t kNumArgs = 0;
19 return Simulator::Current()->Call( 19 return Simulator::Current()->Call(
20 code, Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs)), 20 code, Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs)),
21 Array::Handle(Array::New(0)), thread); 21 Array::Handle(Array::New(0)), thread);
22 } 22 }
23 23
24
25 #define EXECUTE_TEST_CODE_INTPTR(code) \ 24 #define EXECUTE_TEST_CODE_INTPTR(code) \
26 Smi::Value(Smi::RawCast(ExecuteTest(code))) 25 Smi::Value(Smi::RawCast(ExecuteTest(code)))
27 #define EXECUTE_TEST_CODE_BOOL(code) \ 26 #define EXECUTE_TEST_CODE_BOOL(code) \
28 (Bool::RawCast(ExecuteTest(code)) == Bool::True().raw()) 27 (Bool::RawCast(ExecuteTest(code)) == Bool::True().raw())
29 #define EXECUTE_TEST_CODE_OBJECT(code) Object::Handle(ExecuteTest(code)) 28 #define EXECUTE_TEST_CODE_OBJECT(code) Object::Handle(ExecuteTest(code))
30 #define EXECUTE_TEST_CODE_DOUBLE(code) \ 29 #define EXECUTE_TEST_CODE_DOUBLE(code) \
31 bit_cast<double, RawObject*>(ExecuteTest(code)) 30 bit_cast<double, RawObject*>(ExecuteTest(code))
32 31
33 #define __ assembler-> 32 #define __ assembler->
34 33
35
36 static RawClass* CreateDummyClass(const String& class_name, 34 static RawClass* CreateDummyClass(const String& class_name,
37 const Script& script) { 35 const Script& script) {
38 const Class& cls = Class::Handle(Class::New( 36 const Class& cls = Class::Handle(Class::New(
39 Library::Handle(), class_name, script, TokenPosition::kNoSource)); 37 Library::Handle(), class_name, script, TokenPosition::kNoSource));
40 cls.set_is_synthesized_class(); // Dummy class for testing. 38 cls.set_is_synthesized_class(); // Dummy class for testing.
41 return cls.raw(); 39 return cls.raw();
42 } 40 }
43 41
44
45 static RawLibrary* CreateDummyLibrary(const String& library_name) { 42 static RawLibrary* CreateDummyLibrary(const String& library_name) {
46 return Library::New(library_name); 43 return Library::New(library_name);
47 } 44 }
48 45
49
50 static RawFunction* CreateFunction(const char* name) { 46 static RawFunction* CreateFunction(const char* name) {
51 Thread* thread = Thread::Current(); 47 Thread* thread = Thread::Current();
52 const String& class_name = String::Handle(Symbols::New(thread, "ownerClass")); 48 const String& class_name = String::Handle(Symbols::New(thread, "ownerClass"));
53 const String& lib_name = String::Handle(Symbols::New(thread, "ownerLibrary")); 49 const String& lib_name = String::Handle(Symbols::New(thread, "ownerLibrary"));
54 const Script& script = Script::Handle(); 50 const Script& script = Script::Handle();
55 const Class& owner_class = 51 const Class& owner_class =
56 Class::Handle(CreateDummyClass(class_name, script)); 52 Class::Handle(CreateDummyClass(class_name, script));
57 const Library& owner_library = Library::Handle(CreateDummyLibrary(lib_name)); 53 const Library& owner_library = Library::Handle(CreateDummyLibrary(lib_name));
58 owner_class.set_library(owner_library); 54 owner_class.set_library(owner_library);
59 const String& function_name = String::ZoneHandle(Symbols::New(thread, name)); 55 const String& function_name = String::ZoneHandle(Symbols::New(thread, name));
60 return Function::New(function_name, RawFunction::kRegularFunction, true, 56 return Function::New(function_name, RawFunction::kRegularFunction, true,
61 false, false, false, false, owner_class, 57 false, false, false, false, owner_class,
62 TokenPosition::kMinSource); 58 TokenPosition::kMinSource);
63 } 59 }
64 60
65
66 static void GenerateDummyCode(Assembler* assembler, const Object& result) { 61 static void GenerateDummyCode(Assembler* assembler, const Object& result) {
67 __ PushConstant(result); 62 __ PushConstant(result);
68 __ ReturnTOS(); 63 __ ReturnTOS();
69 } 64 }
70 65
71
72 static void MakeDummyInstanceCall(Assembler* assembler, const Object& result) { 66 static void MakeDummyInstanceCall(Assembler* assembler, const Object& result) {
73 // Make a dummy function. 67 // Make a dummy function.
74 Assembler _assembler_; 68 Assembler _assembler_;
75 GenerateDummyCode(&_assembler_, result); 69 GenerateDummyCode(&_assembler_, result);
76 const char* dummy_function_name = "dummy_instance_function"; 70 const char* dummy_function_name = "dummy_instance_function";
77 const Function& dummy_instance_function = 71 const Function& dummy_instance_function =
78 Function::Handle(CreateFunction(dummy_function_name)); 72 Function::Handle(CreateFunction(dummy_function_name));
79 Code& code = 73 Code& code =
80 Code::Handle(Code::FinalizeCode(dummy_instance_function, &_assembler_)); 74 Code::Handle(Code::FinalizeCode(dummy_instance_function, &_assembler_));
81 dummy_instance_function.AttachCode(code); 75 dummy_instance_function.AttachCode(code);
(...skipping 17 matching lines...) Expand all
99 // For the non-Smi tests. 93 // For the non-Smi tests.
100 cids[0] = kBigintCid; 94 cids[0] = kBigintCid;
101 ic_data.AddCheck(cids, dummy_instance_function); 95 ic_data.AddCheck(cids, dummy_instance_function);
102 ICData* call_ic_data = &ICData::ZoneHandle(ic_data.Original()); 96 ICData* call_ic_data = &ICData::ZoneHandle(ic_data.Original());
103 97
104 // Generate the instance call. 98 // Generate the instance call.
105 const intptr_t call_ic_data_kidx = __ AddConstant(*call_ic_data); 99 const intptr_t call_ic_data_kidx = __ AddConstant(*call_ic_data);
106 __ InstanceCall2(2, call_ic_data_kidx); 100 __ InstanceCall2(2, call_ic_data_kidx);
107 } 101 }
108 102
109
110 ASSEMBLER_TEST_GENERATE(Simple, assembler) { 103 ASSEMBLER_TEST_GENERATE(Simple, assembler) {
111 __ PushConstant(Smi::Handle(Smi::New(42))); 104 __ PushConstant(Smi::Handle(Smi::New(42)));
112 __ ReturnTOS(); 105 __ ReturnTOS();
113 } 106 }
114 107
115
116 ASSEMBLER_TEST_RUN(Simple, test) { 108 ASSEMBLER_TEST_RUN(Simple, test) {
117 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 109 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
118 } 110 }
119 111
120
121 ASSEMBLER_TEST_GENERATE(Nop, assembler) { 112 ASSEMBLER_TEST_GENERATE(Nop, assembler) {
122 __ PushConstant(Smi::Handle(Smi::New(42))); 113 __ PushConstant(Smi::Handle(Smi::New(42)));
123 __ Nop(0); 114 __ Nop(0);
124 __ Nop(0); 115 __ Nop(0);
125 __ Nop(0); 116 __ Nop(0);
126 __ Nop(0); 117 __ Nop(0);
127 __ Nop(0); 118 __ Nop(0);
128 __ ReturnTOS(); 119 __ ReturnTOS();
129 } 120 }
130 121
131
132 ASSEMBLER_TEST_RUN(Nop, test) { 122 ASSEMBLER_TEST_RUN(Nop, test) {
133 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 123 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
134 } 124 }
135 125
136
137 // Called from assembler_test.cc. 126 // Called from assembler_test.cc.
138 // FP[-kParamEndSlotFromFp - 1]: growable array 127 // FP[-kParamEndSlotFromFp - 1]: growable array
139 // FP[-kParamEndSlotFromFp - 2]: value 128 // FP[-kParamEndSlotFromFp - 2]: value
140 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { 129 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) {
141 __ Frame(2); 130 __ Frame(2);
142 __ Move(0, -kParamEndSlotFromFp - 1); 131 __ Move(0, -kParamEndSlotFromFp - 1);
143 __ Move(1, -kParamEndSlotFromFp - 2); 132 __ Move(1, -kParamEndSlotFromFp - 2);
144 __ StoreField(0, GrowableObjectArray::data_offset() / kWordSize, 1); 133 __ StoreField(0, GrowableObjectArray::data_offset() / kWordSize, 1);
145 __ Return(0); 134 __ Return(0);
146 } 135 }
147 136
148
149 // - OneByteStringFromCharCode rA, rX 137 // - OneByteStringFromCharCode rA, rX
150 // 138 //
151 // Load the one-character symbol with the char code given by the Smi 139 // Load the one-character symbol with the char code given by the Smi
152 // in FP[rX] into FP[rA]. 140 // in FP[rX] into FP[rA].
153 ASSEMBLER_TEST_GENERATE(OneByteStringFromCharCode, assembler) { 141 ASSEMBLER_TEST_GENERATE(OneByteStringFromCharCode, assembler) {
154 __ Frame(2); 142 __ Frame(2);
155 __ LoadConstant(0, Smi::ZoneHandle(Smi::New(65))); 143 __ LoadConstant(0, Smi::ZoneHandle(Smi::New(65)));
156 __ OneByteStringFromCharCode(1, 0); 144 __ OneByteStringFromCharCode(1, 0);
157 __ Return(1); 145 __ Return(1);
158 } 146 }
159 147
160
161 ASSEMBLER_TEST_RUN(OneByteStringFromCharCode, test) { 148 ASSEMBLER_TEST_RUN(OneByteStringFromCharCode, test) {
162 EXPECT_EQ(Symbols::New(Thread::Current(), "A"), 149 EXPECT_EQ(Symbols::New(Thread::Current(), "A"),
163 EXECUTE_TEST_CODE_OBJECT(test->code()).raw()); 150 EXECUTE_TEST_CODE_OBJECT(test->code()).raw());
164 } 151 }
165 152
166
167 // - StringToCharCode rA, rX 153 // - StringToCharCode rA, rX
168 // 154 //
169 // Load and smi-encode the single char code of the string in FP[rX] into 155 // Load and smi-encode the single char code of the string in FP[rX] into
170 // FP[rA]. If the string's length is not 1, load smi -1 instead. 156 // FP[rA]. If the string's length is not 1, load smi -1 instead.
171 // 157 //
172 ASSEMBLER_TEST_GENERATE(StringToCharCode, assembler) { 158 ASSEMBLER_TEST_GENERATE(StringToCharCode, assembler) {
173 __ Frame(2); 159 __ Frame(2);
174 __ LoadConstant(0, String::ZoneHandle(String::New("A", Heap::kOld))); 160 __ LoadConstant(0, String::ZoneHandle(String::New("A", Heap::kOld)));
175 __ StringToCharCode(1, 0); 161 __ StringToCharCode(1, 0);
176 __ Return(1); 162 __ Return(1);
177 } 163 }
178 164
179
180 ASSEMBLER_TEST_RUN(StringToCharCode, test) { 165 ASSEMBLER_TEST_RUN(StringToCharCode, test) {
181 EXPECT_EQ(65, EXECUTE_TEST_CODE_INTPTR(test->code())); 166 EXPECT_EQ(65, EXECUTE_TEST_CODE_INTPTR(test->code()));
182 } 167 }
183 168
184
185 ASSEMBLER_TEST_GENERATE(StringToCharCodeIllegalLength, assembler) { 169 ASSEMBLER_TEST_GENERATE(StringToCharCodeIllegalLength, assembler) {
186 __ Frame(2); 170 __ Frame(2);
187 __ LoadConstant(0, String::ZoneHandle(String::New("AAA", Heap::kOld))); 171 __ LoadConstant(0, String::ZoneHandle(String::New("AAA", Heap::kOld)));
188 __ StringToCharCode(1, 0); 172 __ StringToCharCode(1, 0);
189 __ Return(1); 173 __ Return(1);
190 } 174 }
191 175
192
193 ASSEMBLER_TEST_RUN(StringToCharCodeIllegalLength, test) { 176 ASSEMBLER_TEST_RUN(StringToCharCodeIllegalLength, test) {
194 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INTPTR(test->code())); 177 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INTPTR(test->code()));
195 } 178 }
196 179
197
198 // - AddTOS; SubTOS; MulTOS; BitOrTOS; BitAndTOS; EqualTOS; LessThanTOS; 180 // - AddTOS; SubTOS; MulTOS; BitOrTOS; BitAndTOS; EqualTOS; LessThanTOS;
199 // GreaterThanTOS; 181 // GreaterThanTOS;
200 // 182 //
201 // Smi fast-path for a corresponding method. Checks if SP[0] and SP[-1] are 183 // Smi fast-path for a corresponding method. Checks if SP[0] and SP[-1] are
202 // both smis and result of SP[0] <op> SP[-1] is a smi - if this is true 184 // both smis and result of SP[0] <op> SP[-1] is a smi - if this is true
203 // then pops operands and pushes result on the stack and skips the next 185 // then pops operands and pushes result on the stack and skips the next
204 // instruction (which implements a slow path fallback). 186 // instruction (which implements a slow path fallback).
205 ASSEMBLER_TEST_GENERATE(AddTOS, assembler) { 187 ASSEMBLER_TEST_GENERATE(AddTOS, assembler) {
206 __ PushConstant(Smi::Handle(Smi::New(-42))); 188 __ PushConstant(Smi::Handle(Smi::New(-42)));
207 __ PushConstant(Smi::Handle(Smi::New(84))); 189 __ PushConstant(Smi::Handle(Smi::New(84)));
208 __ AddTOS(); 190 __ AddTOS();
209 // Should be skipped. 191 // Should be skipped.
210 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); 192 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
211 __ ReturnTOS(); 193 __ ReturnTOS();
212 } 194 }
213 195
214
215 ASSEMBLER_TEST_RUN(AddTOS, test) { 196 ASSEMBLER_TEST_RUN(AddTOS, test) {
216 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 197 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
217 } 198 }
218 199
219
220 ASSEMBLER_TEST_GENERATE(AddTOSOverflow, assembler) { 200 ASSEMBLER_TEST_GENERATE(AddTOSOverflow, assembler) {
221 __ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue))); 201 __ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue)));
222 __ PushConstant(Smi::Handle(Smi::New(1))); 202 __ PushConstant(Smi::Handle(Smi::New(1)));
223 __ AddTOS(); 203 __ AddTOS();
224 // Shouldn't be skipped. 204 // Shouldn't be skipped.
225 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); 205 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
226 __ ReturnTOS(); 206 __ ReturnTOS();
227 } 207 }
228 208
229
230 ASSEMBLER_TEST_RUN(AddTOSOverflow, test) { 209 ASSEMBLER_TEST_RUN(AddTOSOverflow, test) {
231 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 210 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
232 } 211 }
233 212
234
235 ASSEMBLER_TEST_GENERATE(AddTOSNonSmi, assembler) { 213 ASSEMBLER_TEST_GENERATE(AddTOSNonSmi, assembler) {
236 const String& numstr = 214 const String& numstr =
237 String::Handle(String::New("98765432198765432100", Heap::kOld)); 215 String::Handle(String::New("98765432198765432100", Heap::kOld));
238 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); 216 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
239 __ PushConstant(Smi::Handle(Smi::New(1))); 217 __ PushConstant(Smi::Handle(Smi::New(1)));
240 __ AddTOS(); 218 __ AddTOS();
241 // Shouldn't be skipped. 219 // Shouldn't be skipped.
242 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); 220 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
243 __ ReturnTOS(); 221 __ ReturnTOS();
244 } 222 }
245 223
246
247 ASSEMBLER_TEST_RUN(AddTOSNonSmi, test) { 224 ASSEMBLER_TEST_RUN(AddTOSNonSmi, test) {
248 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 225 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
249 } 226 }
250 227
251
252 ASSEMBLER_TEST_GENERATE(SubTOS, assembler) { 228 ASSEMBLER_TEST_GENERATE(SubTOS, assembler) {
253 __ PushConstant(Smi::Handle(Smi::New(30))); 229 __ PushConstant(Smi::Handle(Smi::New(30)));
254 __ PushConstant(Smi::Handle(Smi::New(-12))); 230 __ PushConstant(Smi::Handle(Smi::New(-12)));
255 __ SubTOS(); 231 __ SubTOS();
256 // Should be skipped. 232 // Should be skipped.
257 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); 233 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
258 __ ReturnTOS(); 234 __ ReturnTOS();
259 } 235 }
260 236
261
262 ASSEMBLER_TEST_RUN(SubTOS, test) { 237 ASSEMBLER_TEST_RUN(SubTOS, test) {
263 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 238 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
264 } 239 }
265 240
266
267 ASSEMBLER_TEST_GENERATE(SubTOSOverflow, assembler) { 241 ASSEMBLER_TEST_GENERATE(SubTOSOverflow, assembler) {
268 __ PushConstant(Smi::Handle(Smi::New(Smi::kMinValue))); 242 __ PushConstant(Smi::Handle(Smi::New(Smi::kMinValue)));
269 __ PushConstant(Smi::Handle(Smi::New(1))); 243 __ PushConstant(Smi::Handle(Smi::New(1)));
270 __ SubTOS(); 244 __ SubTOS();
271 // Shouldn't be skipped. 245 // Shouldn't be skipped.
272 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); 246 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
273 __ ReturnTOS(); 247 __ ReturnTOS();
274 } 248 }
275 249
276
277 ASSEMBLER_TEST_RUN(SubTOSOverflow, test) { 250 ASSEMBLER_TEST_RUN(SubTOSOverflow, test) {
278 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 251 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
279 } 252 }
280 253
281
282 ASSEMBLER_TEST_GENERATE(SubTOSNonSmi, assembler) { 254 ASSEMBLER_TEST_GENERATE(SubTOSNonSmi, assembler) {
283 const String& numstr = 255 const String& numstr =
284 String::Handle(String::New("98765432198765432100", Heap::kOld)); 256 String::Handle(String::New("98765432198765432100", Heap::kOld));
285 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); 257 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
286 __ PushConstant(Smi::Handle(Smi::New(1))); 258 __ PushConstant(Smi::Handle(Smi::New(1)));
287 __ SubTOS(); 259 __ SubTOS();
288 // Shouldn't be skipped. 260 // Shouldn't be skipped.
289 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); 261 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
290 __ ReturnTOS(); 262 __ ReturnTOS();
291 } 263 }
292 264
293
294 ASSEMBLER_TEST_RUN(SubTOSNonSmi, test) { 265 ASSEMBLER_TEST_RUN(SubTOSNonSmi, test) {
295 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 266 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
296 } 267 }
297 268
298
299 ASSEMBLER_TEST_GENERATE(MulTOS, assembler) { 269 ASSEMBLER_TEST_GENERATE(MulTOS, assembler) {
300 __ PushConstant(Smi::Handle(Smi::New(-6))); 270 __ PushConstant(Smi::Handle(Smi::New(-6)));
301 __ PushConstant(Smi::Handle(Smi::New(-7))); 271 __ PushConstant(Smi::Handle(Smi::New(-7)));
302 __ MulTOS(); 272 __ MulTOS();
303 // Should be skipped. 273 // Should be skipped.
304 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); 274 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
305 __ ReturnTOS(); 275 __ ReturnTOS();
306 } 276 }
307 277
308
309 ASSEMBLER_TEST_RUN(MulTOS, test) { 278 ASSEMBLER_TEST_RUN(MulTOS, test) {
310 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 279 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
311 } 280 }
312 281
313
314 ASSEMBLER_TEST_GENERATE(MulTOSOverflow, assembler) { 282 ASSEMBLER_TEST_GENERATE(MulTOSOverflow, assembler) {
315 __ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue))); 283 __ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue)));
316 __ PushConstant(Smi::Handle(Smi::New(-8))); 284 __ PushConstant(Smi::Handle(Smi::New(-8)));
317 __ MulTOS(); 285 __ MulTOS();
318 // Shouldn't be skipped. 286 // Shouldn't be skipped.
319 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); 287 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
320 __ ReturnTOS(); 288 __ ReturnTOS();
321 } 289 }
322 290
323
324 ASSEMBLER_TEST_RUN(MulTOSOverflow, test) { 291 ASSEMBLER_TEST_RUN(MulTOSOverflow, test) {
325 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 292 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
326 } 293 }
327 294
328
329 ASSEMBLER_TEST_GENERATE(MulTOSNonSmi, assembler) { 295 ASSEMBLER_TEST_GENERATE(MulTOSNonSmi, assembler) {
330 const String& numstr = 296 const String& numstr =
331 String::Handle(String::New("98765432198765432100", Heap::kOld)); 297 String::Handle(String::New("98765432198765432100", Heap::kOld));
332 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); 298 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
333 __ PushConstant(Smi::Handle(Smi::New(1))); 299 __ PushConstant(Smi::Handle(Smi::New(1)));
334 __ MulTOS(); 300 __ MulTOS();
335 // Shouldn't be skipped. 301 // Shouldn't be skipped.
336 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); 302 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
337 __ ReturnTOS(); 303 __ ReturnTOS();
338 } 304 }
339 305
340
341 ASSEMBLER_TEST_RUN(MulTOSNonSmi, test) { 306 ASSEMBLER_TEST_RUN(MulTOSNonSmi, test) {
342 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 307 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
343 } 308 }
344 309
345
346 ASSEMBLER_TEST_GENERATE(BitOrTOS, assembler) { 310 ASSEMBLER_TEST_GENERATE(BitOrTOS, assembler) {
347 __ PushConstant(Smi::Handle(Smi::New(0x22))); 311 __ PushConstant(Smi::Handle(Smi::New(0x22)));
348 __ PushConstant(Smi::Handle(Smi::New(0x08))); 312 __ PushConstant(Smi::Handle(Smi::New(0x08)));
349 __ BitOrTOS(); 313 __ BitOrTOS();
350 // Should be skipped. 314 // Should be skipped.
351 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); 315 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
352 __ ReturnTOS(); 316 __ ReturnTOS();
353 } 317 }
354 318
355
356 ASSEMBLER_TEST_RUN(BitOrTOS, test) { 319 ASSEMBLER_TEST_RUN(BitOrTOS, test) {
357 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 320 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
358 } 321 }
359 322
360
361 ASSEMBLER_TEST_GENERATE(BitOrTOSNonSmi, assembler) { 323 ASSEMBLER_TEST_GENERATE(BitOrTOSNonSmi, assembler) {
362 const String& numstr = 324 const String& numstr =
363 String::Handle(String::New("98765432198765432100", Heap::kOld)); 325 String::Handle(String::New("98765432198765432100", Heap::kOld));
364 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); 326 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
365 __ PushConstant(Smi::Handle(Smi::New(0x08))); 327 __ PushConstant(Smi::Handle(Smi::New(0x08)));
366 __ BitOrTOS(); 328 __ BitOrTOS();
367 // Shouldn't be skipped. 329 // Shouldn't be skipped.
368 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); 330 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
369 __ ReturnTOS(); 331 __ ReturnTOS();
370 } 332 }
371 333
372
373 ASSEMBLER_TEST_RUN(BitOrTOSNonSmi, test) { 334 ASSEMBLER_TEST_RUN(BitOrTOSNonSmi, test) {
374 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 335 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
375 } 336 }
376 337
377
378 ASSEMBLER_TEST_GENERATE(BitAndTOS, assembler) { 338 ASSEMBLER_TEST_GENERATE(BitAndTOS, assembler) {
379 __ PushConstant(Smi::Handle(Smi::New(0x2a))); 339 __ PushConstant(Smi::Handle(Smi::New(0x2a)));
380 __ PushConstant(Smi::Handle(Smi::New(0xaa))); 340 __ PushConstant(Smi::Handle(Smi::New(0xaa)));
381 __ BitAndTOS(); 341 __ BitAndTOS();
382 // Should be skipped. 342 // Should be skipped.
383 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); 343 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
384 __ ReturnTOS(); 344 __ ReturnTOS();
385 } 345 }
386 346
387
388 ASSEMBLER_TEST_RUN(BitAndTOS, test) { 347 ASSEMBLER_TEST_RUN(BitAndTOS, test) {
389 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 348 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
390 } 349 }
391 350
392
393 ASSEMBLER_TEST_GENERATE(BitAndTOSNonSmi, assembler) { 351 ASSEMBLER_TEST_GENERATE(BitAndTOSNonSmi, assembler) {
394 const String& numstr = 352 const String& numstr =
395 String::Handle(String::New("98765432198765432100", Heap::kOld)); 353 String::Handle(String::New("98765432198765432100", Heap::kOld));
396 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); 354 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
397 __ PushConstant(Smi::Handle(Smi::New(0x08))); 355 __ PushConstant(Smi::Handle(Smi::New(0x08)));
398 __ BitAndTOS(); 356 __ BitAndTOS();
399 // Shouldn't be skipped. 357 // Shouldn't be skipped.
400 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); 358 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
401 __ ReturnTOS(); 359 __ ReturnTOS();
402 } 360 }
403 361
404
405 ASSEMBLER_TEST_RUN(BitAndTOSNonSmi, test) { 362 ASSEMBLER_TEST_RUN(BitAndTOSNonSmi, test) {
406 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 363 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
407 } 364 }
408 365
409
410 ASSEMBLER_TEST_GENERATE(EqualTOSTrue, assembler) { 366 ASSEMBLER_TEST_GENERATE(EqualTOSTrue, assembler) {
411 __ PushConstant(Smi::Handle(Smi::New(42))); 367 __ PushConstant(Smi::Handle(Smi::New(42)));
412 __ PushConstant(Smi::Handle(Smi::New(42))); 368 __ PushConstant(Smi::Handle(Smi::New(42)));
413 __ EqualTOS(); 369 __ EqualTOS();
414 // Should be skipped. 370 // Should be skipped.
415 MakeDummyInstanceCall(assembler, Bool::False()); 371 MakeDummyInstanceCall(assembler, Bool::False());
416 __ ReturnTOS(); 372 __ ReturnTOS();
417 } 373 }
418 374
419
420 ASSEMBLER_TEST_RUN(EqualTOSTrue, test) { 375 ASSEMBLER_TEST_RUN(EqualTOSTrue, test) {
421 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); 376 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code()));
422 } 377 }
423 378
424
425 ASSEMBLER_TEST_GENERATE(EqualTOSFalse, assembler) { 379 ASSEMBLER_TEST_GENERATE(EqualTOSFalse, assembler) {
426 __ PushConstant(Smi::Handle(Smi::New(42))); 380 __ PushConstant(Smi::Handle(Smi::New(42)));
427 __ PushConstant(Smi::Handle(Smi::New(-42))); 381 __ PushConstant(Smi::Handle(Smi::New(-42)));
428 __ EqualTOS(); 382 __ EqualTOS();
429 // Should be skipped. 383 // Should be skipped.
430 MakeDummyInstanceCall(assembler, Bool::True()); 384 MakeDummyInstanceCall(assembler, Bool::True());
431 __ ReturnTOS(); 385 __ ReturnTOS();
432 } 386 }
433 387
434
435 ASSEMBLER_TEST_RUN(EqualTOSFalse, test) { 388 ASSEMBLER_TEST_RUN(EqualTOSFalse, test) {
436 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); 389 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code()));
437 } 390 }
438 391
439
440 ASSEMBLER_TEST_GENERATE(EqualTOSNonSmi, assembler) { 392 ASSEMBLER_TEST_GENERATE(EqualTOSNonSmi, assembler) {
441 const String& numstr = 393 const String& numstr =
442 String::Handle(String::New("98765432198765432100", Heap::kOld)); 394 String::Handle(String::New("98765432198765432100", Heap::kOld));
443 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); 395 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
444 __ PushConstant(Smi::Handle(Smi::New(-42))); 396 __ PushConstant(Smi::Handle(Smi::New(-42)));
445 __ EqualTOS(); 397 __ EqualTOS();
446 // Shouldn't be skipped. 398 // Shouldn't be skipped.
447 MakeDummyInstanceCall(assembler, Bool::True()); 399 MakeDummyInstanceCall(assembler, Bool::True());
448 __ ReturnTOS(); 400 __ ReturnTOS();
449 } 401 }
450 402
451
452 ASSEMBLER_TEST_RUN(EqualTOSNonSmi, test) { 403 ASSEMBLER_TEST_RUN(EqualTOSNonSmi, test) {
453 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); 404 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code()));
454 } 405 }
455 406
456
457 ASSEMBLER_TEST_GENERATE(LessThanTOSTrue, assembler) { 407 ASSEMBLER_TEST_GENERATE(LessThanTOSTrue, assembler) {
458 __ PushConstant(Smi::Handle(Smi::New(-42))); 408 __ PushConstant(Smi::Handle(Smi::New(-42)));
459 __ PushConstant(Smi::Handle(Smi::New(42))); 409 __ PushConstant(Smi::Handle(Smi::New(42)));
460 __ LessThanTOS(); 410 __ LessThanTOS();
461 // Should be skipped. 411 // Should be skipped.
462 MakeDummyInstanceCall(assembler, Bool::False()); 412 MakeDummyInstanceCall(assembler, Bool::False());
463 __ ReturnTOS(); 413 __ ReturnTOS();
464 } 414 }
465 415
466
467 ASSEMBLER_TEST_RUN(LessThanTOSTrue, test) { 416 ASSEMBLER_TEST_RUN(LessThanTOSTrue, test) {
468 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); 417 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code()));
469 } 418 }
470 419
471
472 ASSEMBLER_TEST_GENERATE(LessThanTOSFalse, assembler) { 420 ASSEMBLER_TEST_GENERATE(LessThanTOSFalse, assembler) {
473 __ PushConstant(Smi::Handle(Smi::New(42))); 421 __ PushConstant(Smi::Handle(Smi::New(42)));
474 __ PushConstant(Smi::Handle(Smi::New(-42))); 422 __ PushConstant(Smi::Handle(Smi::New(-42)));
475 __ LessThanTOS(); 423 __ LessThanTOS();
476 // Should be skipped. 424 // Should be skipped.
477 MakeDummyInstanceCall(assembler, Bool::False()); 425 MakeDummyInstanceCall(assembler, Bool::False());
478 __ ReturnTOS(); 426 __ ReturnTOS();
479 } 427 }
480 428
481
482 ASSEMBLER_TEST_RUN(LessThanTOSFalse, test) { 429 ASSEMBLER_TEST_RUN(LessThanTOSFalse, test) {
483 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); 430 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code()));
484 } 431 }
485 432
486
487 ASSEMBLER_TEST_GENERATE(LessThanTOSNonSmi, assembler) { 433 ASSEMBLER_TEST_GENERATE(LessThanTOSNonSmi, assembler) {
488 const String& numstr = 434 const String& numstr =
489 String::Handle(String::New("98765432198765432100", Heap::kOld)); 435 String::Handle(String::New("98765432198765432100", Heap::kOld));
490 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); 436 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
491 __ PushConstant(Smi::Handle(Smi::New(-42))); 437 __ PushConstant(Smi::Handle(Smi::New(-42)));
492 __ LessThanTOS(); 438 __ LessThanTOS();
493 // Shouldn't be skipped. 439 // Shouldn't be skipped.
494 MakeDummyInstanceCall(assembler, Bool::True()); 440 MakeDummyInstanceCall(assembler, Bool::True());
495 __ ReturnTOS(); 441 __ ReturnTOS();
496 } 442 }
497 443
498
499 ASSEMBLER_TEST_RUN(LessThanTOSNonSmi, test) { 444 ASSEMBLER_TEST_RUN(LessThanTOSNonSmi, test) {
500 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); 445 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code()));
501 } 446 }
502 447
503
504 ASSEMBLER_TEST_GENERATE(GreaterThanTOSTrue, assembler) { 448 ASSEMBLER_TEST_GENERATE(GreaterThanTOSTrue, assembler) {
505 __ PushConstant(Smi::Handle(Smi::New(42))); 449 __ PushConstant(Smi::Handle(Smi::New(42)));
506 __ PushConstant(Smi::Handle(Smi::New(-42))); 450 __ PushConstant(Smi::Handle(Smi::New(-42)));
507 __ GreaterThanTOS(); 451 __ GreaterThanTOS();
508 // Should be skipped. 452 // Should be skipped.
509 MakeDummyInstanceCall(assembler, Bool::False()); 453 MakeDummyInstanceCall(assembler, Bool::False());
510 __ ReturnTOS(); 454 __ ReturnTOS();
511 } 455 }
512 456
513
514 ASSEMBLER_TEST_RUN(GreaterThanTOSTrue, test) { 457 ASSEMBLER_TEST_RUN(GreaterThanTOSTrue, test) {
515 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); 458 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code()));
516 } 459 }
517 460
518
519 ASSEMBLER_TEST_GENERATE(GreaterThanTOSFalse, assembler) { 461 ASSEMBLER_TEST_GENERATE(GreaterThanTOSFalse, assembler) {
520 __ PushConstant(Smi::Handle(Smi::New(-42))); 462 __ PushConstant(Smi::Handle(Smi::New(-42)));
521 __ PushConstant(Smi::Handle(Smi::New(42))); 463 __ PushConstant(Smi::Handle(Smi::New(42)));
522 __ GreaterThanTOS(); 464 __ GreaterThanTOS();
523 // Should be skipped. 465 // Should be skipped.
524 MakeDummyInstanceCall(assembler, Bool::False()); 466 MakeDummyInstanceCall(assembler, Bool::False());
525 __ ReturnTOS(); 467 __ ReturnTOS();
526 } 468 }
527 469
528
529 ASSEMBLER_TEST_RUN(GreaterThanTOSFalse, test) { 470 ASSEMBLER_TEST_RUN(GreaterThanTOSFalse, test) {
530 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); 471 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code()));
531 } 472 }
532 473
533
534 ASSEMBLER_TEST_GENERATE(GreaterThanTOSNonSmi, assembler) { 474 ASSEMBLER_TEST_GENERATE(GreaterThanTOSNonSmi, assembler) {
535 const String& numstr = 475 const String& numstr =
536 String::Handle(String::New("98765432198765432100", Heap::kOld)); 476 String::Handle(String::New("98765432198765432100", Heap::kOld));
537 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); 477 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
538 __ PushConstant(Smi::Handle(Smi::New(-42))); 478 __ PushConstant(Smi::Handle(Smi::New(-42)));
539 __ GreaterThanTOS(); 479 __ GreaterThanTOS();
540 // Shouldn't be skipped. 480 // Shouldn't be skipped.
541 MakeDummyInstanceCall(assembler, Bool::True()); 481 MakeDummyInstanceCall(assembler, Bool::True());
542 __ ReturnTOS(); 482 __ ReturnTOS();
543 } 483 }
544 484
545
546 ASSEMBLER_TEST_RUN(GreaterThanTOSNonSmi, test) { 485 ASSEMBLER_TEST_RUN(GreaterThanTOSNonSmi, test) {
547 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); 486 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code()));
548 } 487 }
549 488
550
551 // - Add, Sub, Mul, Div, Mod, Shl, Shr rA, rB, rC 489 // - Add, Sub, Mul, Div, Mod, Shl, Shr rA, rB, rC
552 // 490 //
553 // Arithmetic operations on Smis. FP[rA] <- FP[rB] op FP[rC]. 491 // Arithmetic operations on Smis. FP[rA] <- FP[rB] op FP[rC].
554 // If these instructions can trigger a deoptimization, the following 492 // If these instructions can trigger a deoptimization, the following
555 // instruction should be Deopt. If no deoptimization should be triggered, 493 // instruction should be Deopt. If no deoptimization should be triggered,
556 // the immediately following instruction is skipped. 494 // the immediately following instruction is skipped.
557 ASSEMBLER_TEST_GENERATE(AddNoOverflow, assembler) { 495 ASSEMBLER_TEST_GENERATE(AddNoOverflow, assembler) {
558 __ Frame(3); 496 __ Frame(3);
559 __ LoadConstant(0, Smi::Handle(Smi::New(20))); 497 __ LoadConstant(0, Smi::Handle(Smi::New(20)));
560 __ LoadConstant(1, Smi::Handle(Smi::New(22))); 498 __ LoadConstant(1, Smi::Handle(Smi::New(22)));
561 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 499 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
562 __ Add(2, 0, 1); 500 __ Add(2, 0, 1);
563 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); 501 __ LoadConstant(2, Smi::Handle(Smi::New(-42)));
564 __ Return(2); 502 __ Return(2);
565 } 503 }
566 504
567
568 ASSEMBLER_TEST_RUN(AddNoOverflow, test) { 505 ASSEMBLER_TEST_RUN(AddNoOverflow, test) {
569 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 506 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
570 } 507 }
571 508
572
573 ASSEMBLER_TEST_GENERATE(AddOverflow, assembler) { 509 ASSEMBLER_TEST_GENERATE(AddOverflow, assembler) {
574 __ Frame(3); 510 __ Frame(3);
575 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMaxValue))); 511 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMaxValue)));
576 __ LoadConstant(1, Smi::Handle(Smi::New(1))); 512 __ LoadConstant(1, Smi::Handle(Smi::New(1)));
577 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 513 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
578 __ Add(2, 0, 1); 514 __ Add(2, 0, 1);
579 __ LoadConstant(2, Smi::Handle(Smi::New(42))); 515 __ LoadConstant(2, Smi::Handle(Smi::New(42)));
580 __ Return(2); 516 __ Return(2);
581 } 517 }
582 518
583
584 ASSEMBLER_TEST_RUN(AddOverflow, test) { 519 ASSEMBLER_TEST_RUN(AddOverflow, test) {
585 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 520 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
586 } 521 }
587 522
588
589 ASSEMBLER_TEST_GENERATE(SubNoOverflow, assembler) { 523 ASSEMBLER_TEST_GENERATE(SubNoOverflow, assembler) {
590 __ Frame(3); 524 __ Frame(3);
591 __ LoadConstant(0, Smi::Handle(Smi::New(64))); 525 __ LoadConstant(0, Smi::Handle(Smi::New(64)));
592 __ LoadConstant(1, Smi::Handle(Smi::New(22))); 526 __ LoadConstant(1, Smi::Handle(Smi::New(22)));
593 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 527 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
594 __ Sub(2, 0, 1); 528 __ Sub(2, 0, 1);
595 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); 529 __ LoadConstant(2, Smi::Handle(Smi::New(-42)));
596 __ Return(2); 530 __ Return(2);
597 } 531 }
598 532
599
600 ASSEMBLER_TEST_RUN(SubNoOverflow, test) { 533 ASSEMBLER_TEST_RUN(SubNoOverflow, test) {
601 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 534 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
602 } 535 }
603 536
604
605 ASSEMBLER_TEST_GENERATE(SubOverflow, assembler) { 537 ASSEMBLER_TEST_GENERATE(SubOverflow, assembler) {
606 __ Frame(3); 538 __ Frame(3);
607 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMinValue))); 539 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMinValue)));
608 __ LoadConstant(1, Smi::Handle(Smi::New(1))); 540 __ LoadConstant(1, Smi::Handle(Smi::New(1)));
609 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 541 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
610 __ Sub(2, 0, 1); 542 __ Sub(2, 0, 1);
611 __ LoadConstant(2, Smi::Handle(Smi::New(42))); 543 __ LoadConstant(2, Smi::Handle(Smi::New(42)));
612 __ Return(2); 544 __ Return(2);
613 } 545 }
614 546
615
616 ASSEMBLER_TEST_RUN(SubOverflow, test) { 547 ASSEMBLER_TEST_RUN(SubOverflow, test) {
617 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 548 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
618 } 549 }
619 550
620
621 ASSEMBLER_TEST_GENERATE(MulNoOverflow, assembler) { 551 ASSEMBLER_TEST_GENERATE(MulNoOverflow, assembler) {
622 __ Frame(3); 552 __ Frame(3);
623 __ LoadConstant(0, Smi::Handle(Smi::New(-6))); 553 __ LoadConstant(0, Smi::Handle(Smi::New(-6)));
624 __ LoadConstant(1, Smi::Handle(Smi::New(-7))); 554 __ LoadConstant(1, Smi::Handle(Smi::New(-7)));
625 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 555 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
626 __ Mul(2, 0, 1); 556 __ Mul(2, 0, 1);
627 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); 557 __ LoadConstant(2, Smi::Handle(Smi::New(-42)));
628 __ Return(2); 558 __ Return(2);
629 } 559 }
630 560
631
632 ASSEMBLER_TEST_RUN(MulNoOverflow, test) { 561 ASSEMBLER_TEST_RUN(MulNoOverflow, test) {
633 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 562 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
634 } 563 }
635 564
636
637 ASSEMBLER_TEST_GENERATE(MulOverflow, assembler) { 565 ASSEMBLER_TEST_GENERATE(MulOverflow, assembler) {
638 __ Frame(3); 566 __ Frame(3);
639 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMaxValue))); 567 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMaxValue)));
640 __ LoadConstant(1, Smi::Handle(Smi::New(-8))); 568 __ LoadConstant(1, Smi::Handle(Smi::New(-8)));
641 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 569 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
642 __ Mul(2, 0, 1); 570 __ Mul(2, 0, 1);
643 __ LoadConstant(2, Smi::Handle(Smi::New(42))); 571 __ LoadConstant(2, Smi::Handle(Smi::New(42)));
644 __ Return(2); 572 __ Return(2);
645 } 573 }
646 574
647
648 ASSEMBLER_TEST_RUN(MulOverflow, test) { 575 ASSEMBLER_TEST_RUN(MulOverflow, test) {
649 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 576 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
650 } 577 }
651 578
652
653 ASSEMBLER_TEST_GENERATE(DivNoDeopt, assembler) { 579 ASSEMBLER_TEST_GENERATE(DivNoDeopt, assembler) {
654 __ Frame(3); 580 __ Frame(3);
655 __ LoadConstant(0, Smi::Handle(Smi::New(27))); 581 __ LoadConstant(0, Smi::Handle(Smi::New(27)));
656 __ LoadConstant(1, Smi::Handle(Smi::New(3))); 582 __ LoadConstant(1, Smi::Handle(Smi::New(3)));
657 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 583 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
658 __ Div(2, 0, 1); 584 __ Div(2, 0, 1);
659 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); 585 __ LoadConstant(2, Smi::Handle(Smi::New(-42)));
660 __ Return(2); 586 __ Return(2);
661 } 587 }
662 588
663
664 ASSEMBLER_TEST_RUN(DivNoDeopt, test) { 589 ASSEMBLER_TEST_RUN(DivNoDeopt, test) {
665 EXPECT_EQ(9, EXECUTE_TEST_CODE_INTPTR(test->code())); 590 EXPECT_EQ(9, EXECUTE_TEST_CODE_INTPTR(test->code()));
666 } 591 }
667 592
668
669 ASSEMBLER_TEST_GENERATE(DivZero, assembler) { 593 ASSEMBLER_TEST_GENERATE(DivZero, assembler) {
670 __ Frame(3); 594 __ Frame(3);
671 __ LoadConstant(0, Smi::Handle(Smi::New(3))); 595 __ LoadConstant(0, Smi::Handle(Smi::New(3)));
672 __ LoadConstant(1, Smi::Handle(Smi::New(0))); 596 __ LoadConstant(1, Smi::Handle(Smi::New(0)));
673 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 597 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
674 __ Div(2, 0, 1); 598 __ Div(2, 0, 1);
675 __ LoadConstant(2, Smi::Handle(Smi::New(42))); 599 __ LoadConstant(2, Smi::Handle(Smi::New(42)));
676 __ Return(2); 600 __ Return(2);
677 } 601 }
678 602
679
680 ASSEMBLER_TEST_RUN(DivZero, test) { 603 ASSEMBLER_TEST_RUN(DivZero, test) {
681 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 604 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
682 } 605 }
683 606
684
685 ASSEMBLER_TEST_GENERATE(DivCornerCase, assembler) { 607 ASSEMBLER_TEST_GENERATE(DivCornerCase, assembler) {
686 __ Frame(3); 608 __ Frame(3);
687 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMinValue))); 609 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMinValue)));
688 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 610 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
689 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 611 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
690 __ Div(2, 0, 1); 612 __ Div(2, 0, 1);
691 __ LoadConstant(2, Smi::Handle(Smi::New(42))); 613 __ LoadConstant(2, Smi::Handle(Smi::New(42)));
692 __ Return(2); 614 __ Return(2);
693 } 615 }
694 616
695
696 ASSEMBLER_TEST_RUN(DivCornerCase, test) { 617 ASSEMBLER_TEST_RUN(DivCornerCase, test) {
697 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 618 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
698 } 619 }
699 620
700
701 ASSEMBLER_TEST_GENERATE(ModPosPos, assembler) { 621 ASSEMBLER_TEST_GENERATE(ModPosPos, assembler) {
702 __ Frame(3); 622 __ Frame(3);
703 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 623 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
704 __ LoadConstant(1, Smi::Handle(Smi::New(4))); 624 __ LoadConstant(1, Smi::Handle(Smi::New(4)));
705 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 625 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
706 __ Mod(2, 0, 1); 626 __ Mod(2, 0, 1);
707 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); 627 __ LoadConstant(2, Smi::Handle(Smi::New(-42)));
708 __ Return(2); 628 __ Return(2);
709 } 629 }
710 630
711
712 ASSEMBLER_TEST_RUN(ModPosPos, test) { 631 ASSEMBLER_TEST_RUN(ModPosPos, test) {
713 EXPECT_EQ(2, EXECUTE_TEST_CODE_INTPTR(test->code())); 632 EXPECT_EQ(2, EXECUTE_TEST_CODE_INTPTR(test->code()));
714 } 633 }
715 634
716
717 ASSEMBLER_TEST_GENERATE(ModNegPos, assembler) { 635 ASSEMBLER_TEST_GENERATE(ModNegPos, assembler) {
718 __ Frame(3); 636 __ Frame(3);
719 __ LoadConstant(0, Smi::Handle(Smi::New(-42))); 637 __ LoadConstant(0, Smi::Handle(Smi::New(-42)));
720 __ LoadConstant(1, Smi::Handle(Smi::New(4))); 638 __ LoadConstant(1, Smi::Handle(Smi::New(4)));
721 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 639 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
722 __ Mod(2, 0, 1); 640 __ Mod(2, 0, 1);
723 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); 641 __ LoadConstant(2, Smi::Handle(Smi::New(-42)));
724 __ Return(2); 642 __ Return(2);
725 } 643 }
726 644
727
728 ASSEMBLER_TEST_RUN(ModNegPos, test) { 645 ASSEMBLER_TEST_RUN(ModNegPos, test) {
729 EXPECT_EQ(2, EXECUTE_TEST_CODE_INTPTR(test->code())); 646 EXPECT_EQ(2, EXECUTE_TEST_CODE_INTPTR(test->code()));
730 } 647 }
731 648
732
733 ASSEMBLER_TEST_GENERATE(ModPosNeg, assembler) { 649 ASSEMBLER_TEST_GENERATE(ModPosNeg, assembler) {
734 __ Frame(3); 650 __ Frame(3);
735 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 651 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
736 __ LoadConstant(1, Smi::Handle(Smi::New(-4))); 652 __ LoadConstant(1, Smi::Handle(Smi::New(-4)));
737 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 653 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
738 __ Mod(2, 0, 1); 654 __ Mod(2, 0, 1);
739 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); 655 __ LoadConstant(2, Smi::Handle(Smi::New(-42)));
740 __ Return(2); 656 __ Return(2);
741 } 657 }
742 658
743
744 ASSEMBLER_TEST_RUN(ModPosNeg, test) { 659 ASSEMBLER_TEST_RUN(ModPosNeg, test) {
745 EXPECT_EQ(2, EXECUTE_TEST_CODE_INTPTR(test->code())); 660 EXPECT_EQ(2, EXECUTE_TEST_CODE_INTPTR(test->code()));
746 } 661 }
747 662
748
749 ASSEMBLER_TEST_GENERATE(ModZero, assembler) { 663 ASSEMBLER_TEST_GENERATE(ModZero, assembler) {
750 __ Frame(3); 664 __ Frame(3);
751 __ LoadConstant(0, Smi::Handle(Smi::New(3))); 665 __ LoadConstant(0, Smi::Handle(Smi::New(3)));
752 __ LoadConstant(1, Smi::Handle(Smi::New(0))); 666 __ LoadConstant(1, Smi::Handle(Smi::New(0)));
753 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 667 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
754 __ Mod(2, 0, 1); 668 __ Mod(2, 0, 1);
755 __ LoadConstant(2, Smi::Handle(Smi::New(42))); 669 __ LoadConstant(2, Smi::Handle(Smi::New(42)));
756 __ Return(2); 670 __ Return(2);
757 } 671 }
758 672
759
760 ASSEMBLER_TEST_RUN(ModZero, test) { 673 ASSEMBLER_TEST_RUN(ModZero, test) {
761 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 674 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
762 } 675 }
763 676
764
765 ASSEMBLER_TEST_GENERATE(ShlNoDeopt, assembler) { 677 ASSEMBLER_TEST_GENERATE(ShlNoDeopt, assembler) {
766 __ Frame(3); 678 __ Frame(3);
767 __ LoadConstant(0, Smi::Handle(Smi::New(21))); 679 __ LoadConstant(0, Smi::Handle(Smi::New(21)));
768 __ LoadConstant(1, Smi::Handle(Smi::New(1))); 680 __ LoadConstant(1, Smi::Handle(Smi::New(1)));
769 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 681 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
770 __ Shl(2, 0, 1); 682 __ Shl(2, 0, 1);
771 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); 683 __ LoadConstant(2, Smi::Handle(Smi::New(-42)));
772 __ Return(2); 684 __ Return(2);
773 } 685 }
774 686
775
776 ASSEMBLER_TEST_RUN(ShlNoDeopt, test) { 687 ASSEMBLER_TEST_RUN(ShlNoDeopt, test) {
777 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 688 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
778 } 689 }
779 690
780
781 ASSEMBLER_TEST_GENERATE(ShlOverflow, assembler) { 691 ASSEMBLER_TEST_GENERATE(ShlOverflow, assembler) {
782 __ Frame(3); 692 __ Frame(3);
783 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMaxValue))); 693 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMaxValue)));
784 __ LoadConstant(1, Smi::Handle(Smi::New(1))); 694 __ LoadConstant(1, Smi::Handle(Smi::New(1)));
785 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 695 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
786 __ Shl(2, 0, 1); 696 __ Shl(2, 0, 1);
787 __ LoadConstant(2, Smi::Handle(Smi::New(42))); 697 __ LoadConstant(2, Smi::Handle(Smi::New(42)));
788 __ Return(2); 698 __ Return(2);
789 } 699 }
790 700
791
792 ASSEMBLER_TEST_RUN(ShlOverflow, test) { 701 ASSEMBLER_TEST_RUN(ShlOverflow, test) {
793 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 702 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
794 } 703 }
795 704
796
797 ASSEMBLER_TEST_GENERATE(ShlNegShift, assembler) { 705 ASSEMBLER_TEST_GENERATE(ShlNegShift, assembler) {
798 __ Frame(3); 706 __ Frame(3);
799 __ LoadConstant(0, Smi::Handle(Smi::New(21))); 707 __ LoadConstant(0, Smi::Handle(Smi::New(21)));
800 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 708 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
801 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 709 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
802 __ Shl(2, 0, 1); 710 __ Shl(2, 0, 1);
803 __ LoadConstant(2, Smi::Handle(Smi::New(42))); 711 __ LoadConstant(2, Smi::Handle(Smi::New(42)));
804 __ Return(2); 712 __ Return(2);
805 } 713 }
806 714
807
808 ASSEMBLER_TEST_RUN(ShlNegShift, test) { 715 ASSEMBLER_TEST_RUN(ShlNegShift, test) {
809 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 716 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
810 } 717 }
811 718
812
813 ASSEMBLER_TEST_GENERATE(ShrNoDeopt, assembler) { 719 ASSEMBLER_TEST_GENERATE(ShrNoDeopt, assembler) {
814 __ Frame(3); 720 __ Frame(3);
815 __ LoadConstant(0, Smi::Handle(Smi::New(84))); 721 __ LoadConstant(0, Smi::Handle(Smi::New(84)));
816 __ LoadConstant(1, Smi::Handle(Smi::New(1))); 722 __ LoadConstant(1, Smi::Handle(Smi::New(1)));
817 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 723 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
818 __ Shr(2, 0, 1); 724 __ Shr(2, 0, 1);
819 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); 725 __ LoadConstant(2, Smi::Handle(Smi::New(-42)));
820 __ Return(2); 726 __ Return(2);
821 } 727 }
822 728
823
824 ASSEMBLER_TEST_RUN(ShrNoDeopt, test) { 729 ASSEMBLER_TEST_RUN(ShrNoDeopt, test) {
825 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 730 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
826 } 731 }
827 732
828
829 ASSEMBLER_TEST_GENERATE(ShrNegShift, assembler) { 733 ASSEMBLER_TEST_GENERATE(ShrNegShift, assembler) {
830 __ Frame(3); 734 __ Frame(3);
831 __ LoadConstant(0, Smi::Handle(Smi::New(21))); 735 __ LoadConstant(0, Smi::Handle(Smi::New(21)));
832 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 736 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
833 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 737 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
834 __ Shr(2, 0, 1); 738 __ Shr(2, 0, 1);
835 __ LoadConstant(2, Smi::Handle(Smi::New(42))); 739 __ LoadConstant(2, Smi::Handle(Smi::New(42)));
836 __ Return(2); 740 __ Return(2);
837 } 741 }
838 742
839
840 ASSEMBLER_TEST_RUN(ShrNegShift, test) { 743 ASSEMBLER_TEST_RUN(ShrNegShift, test) {
841 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 744 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
842 } 745 }
843 746
844
845 // - Neg rA , rD 747 // - Neg rA , rD
846 // 748 //
847 // FP[rA] <- -FP[rD]. Assumes FP[rD] is a Smi. If there is no overflow the 749 // FP[rA] <- -FP[rD]. Assumes FP[rD] is a Smi. If there is no overflow the
848 // immediately following instruction is skipped. 750 // immediately following instruction is skipped.
849 ASSEMBLER_TEST_GENERATE(NegPos, assembler) { 751 ASSEMBLER_TEST_GENERATE(NegPos, assembler) {
850 __ Frame(2); 752 __ Frame(2);
851 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 753 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
852 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 754 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
853 __ Neg(1, 0); 755 __ Neg(1, 0);
854 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 756 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
855 __ Return(1); 757 __ Return(1);
856 } 758 }
857 759
858
859 ASSEMBLER_TEST_RUN(NegPos, test) { 760 ASSEMBLER_TEST_RUN(NegPos, test) {
860 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INTPTR(test->code())); 761 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INTPTR(test->code()));
861 } 762 }
862 763
863
864 ASSEMBLER_TEST_GENERATE(NegNeg, assembler) { 764 ASSEMBLER_TEST_GENERATE(NegNeg, assembler) {
865 __ Frame(2); 765 __ Frame(2);
866 __ LoadConstant(0, Smi::Handle(Smi::New(-42))); 766 __ LoadConstant(0, Smi::Handle(Smi::New(-42)));
867 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 767 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
868 __ Neg(1, 0); 768 __ Neg(1, 0);
869 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 769 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
870 __ Return(1); 770 __ Return(1);
871 } 771 }
872 772
873
874 ASSEMBLER_TEST_RUN(NegNeg, test) { 773 ASSEMBLER_TEST_RUN(NegNeg, test) {
875 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 774 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
876 } 775 }
877 776
878
879 ASSEMBLER_TEST_GENERATE(NegOverflow, assembler) { 777 ASSEMBLER_TEST_GENERATE(NegOverflow, assembler) {
880 __ Frame(2); 778 __ Frame(2);
881 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMinValue))); 779 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMinValue)));
882 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 780 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
883 __ Neg(1, 0); 781 __ Neg(1, 0);
884 __ LoadConstant(1, Smi::Handle(Smi::New(42))); 782 __ LoadConstant(1, Smi::Handle(Smi::New(42)));
885 __ Return(1); 783 __ Return(1);
886 } 784 }
887 785
888
889 ASSEMBLER_TEST_RUN(NegOverflow, test) { 786 ASSEMBLER_TEST_RUN(NegOverflow, test) {
890 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 787 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
891 } 788 }
892 789
893
894 // - BitOr, BitAnd, BitXor rA, rB, rC 790 // - BitOr, BitAnd, BitXor rA, rB, rC
895 // 791 //
896 // FP[rA] <- FP[rB] op FP[rC] 792 // FP[rA] <- FP[rB] op FP[rC]
897 ASSEMBLER_TEST_GENERATE(BitOr, assembler) { 793 ASSEMBLER_TEST_GENERATE(BitOr, assembler) {
898 __ Frame(3); 794 __ Frame(3);
899 __ LoadConstant(0, Smi::Handle(Smi::New(0x2))); 795 __ LoadConstant(0, Smi::Handle(Smi::New(0x2)));
900 __ LoadConstant(1, Smi::Handle(Smi::New(0x28))); 796 __ LoadConstant(1, Smi::Handle(Smi::New(0x28)));
901 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 797 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
902 __ BitOr(2, 0, 1); 798 __ BitOr(2, 0, 1);
903 __ Return(2); 799 __ Return(2);
904 } 800 }
905 801
906
907 ASSEMBLER_TEST_RUN(BitOr, test) { 802 ASSEMBLER_TEST_RUN(BitOr, test) {
908 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 803 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
909 } 804 }
910 805
911
912 ASSEMBLER_TEST_GENERATE(BitAnd, assembler) { 806 ASSEMBLER_TEST_GENERATE(BitAnd, assembler) {
913 __ Frame(3); 807 __ Frame(3);
914 __ LoadConstant(0, Smi::Handle(Smi::New(0x2b))); 808 __ LoadConstant(0, Smi::Handle(Smi::New(0x2b)));
915 __ LoadConstant(1, Smi::Handle(Smi::New(0x6a))); 809 __ LoadConstant(1, Smi::Handle(Smi::New(0x6a)));
916 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 810 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
917 __ BitAnd(2, 0, 1); 811 __ BitAnd(2, 0, 1);
918 __ Return(2); 812 __ Return(2);
919 } 813 }
920 814
921
922 ASSEMBLER_TEST_RUN(BitAnd, test) { 815 ASSEMBLER_TEST_RUN(BitAnd, test) {
923 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 816 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
924 } 817 }
925 818
926
927 ASSEMBLER_TEST_GENERATE(BitXor, assembler) { 819 ASSEMBLER_TEST_GENERATE(BitXor, assembler) {
928 __ Frame(3); 820 __ Frame(3);
929 __ LoadConstant(0, Smi::Handle(Smi::New(0x37))); 821 __ LoadConstant(0, Smi::Handle(Smi::New(0x37)));
930 __ LoadConstant(1, Smi::Handle(Smi::New(0x1d))); 822 __ LoadConstant(1, Smi::Handle(Smi::New(0x1d)));
931 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); 823 __ LoadConstant(2, Smi::Handle(Smi::New(-1)));
932 __ BitXor(2, 0, 1); 824 __ BitXor(2, 0, 1);
933 __ Return(2); 825 __ Return(2);
934 } 826 }
935 827
936
937 ASSEMBLER_TEST_RUN(BitXor, test) { 828 ASSEMBLER_TEST_RUN(BitXor, test) {
938 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 829 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
939 } 830 }
940 831
941
942 // - BitNot rA, rD 832 // - BitNot rA, rD
943 // 833 //
944 // FP[rA] <- ~FP[rD]. As above, assumes FP[rD] is a Smi. 834 // FP[rA] <- ~FP[rD]. As above, assumes FP[rD] is a Smi.
945 ASSEMBLER_TEST_GENERATE(BitNot, assembler) { 835 ASSEMBLER_TEST_GENERATE(BitNot, assembler) {
946 __ Frame(2); 836 __ Frame(2);
947 __ LoadConstant(0, Smi::Handle(Smi::New(~42))); 837 __ LoadConstant(0, Smi::Handle(Smi::New(~42)));
948 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 838 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
949 __ BitNot(1, 0); 839 __ BitNot(1, 0);
950 __ Return(1); 840 __ Return(1);
951 } 841 }
952 842
953
954 ASSEMBLER_TEST_RUN(BitNot, test) { 843 ASSEMBLER_TEST_RUN(BitNot, test) {
955 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 844 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
956 } 845 }
957 846
958 // - IfNeStrictTOS; IfEqStrictTOS; IfNeStrictNumTOS; IfEqStrictNumTOS 847 // - IfNeStrictTOS; IfEqStrictTOS; IfNeStrictNumTOS; IfEqStrictNumTOS
959 // 848 //
960 // Skips the next instruction unless the given condition holds. 'Num' 849 // Skips the next instruction unless the given condition holds. 'Num'
961 // variants perform number check while non-Num variants just compare 850 // variants perform number check while non-Num variants just compare
962 // RawObject pointers. 851 // RawObject pointers.
963 // 852 //
964 // Used to implement conditional jump: 853 // Used to implement conditional jump:
965 // 854 //
966 // IfNeStrictTOS 855 // IfNeStrictTOS
967 // Jump T ;; jump if not equal 856 // Jump T ;; jump if not equal
968 ASSEMBLER_TEST_GENERATE(IfNeStrictTOSTaken, assembler) { 857 ASSEMBLER_TEST_GENERATE(IfNeStrictTOSTaken, assembler) {
969 Label branch_taken; 858 Label branch_taken;
970 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld)); 859 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld));
971 const Array& array2 = Array::Handle(Array::New(2, Heap::kOld)); 860 const Array& array2 = Array::Handle(Array::New(2, Heap::kOld));
972 __ PushConstant(array1); 861 __ PushConstant(array1);
973 __ PushConstant(array2); 862 __ PushConstant(array2);
974 __ IfNeStrictTOS(); 863 __ IfNeStrictTOS();
975 __ Jump(&branch_taken); 864 __ Jump(&branch_taken);
976 __ PushConstant(Smi::Handle(Smi::New(0))); 865 __ PushConstant(Smi::Handle(Smi::New(0)));
977 __ ReturnTOS(); 866 __ ReturnTOS();
978 __ Bind(&branch_taken); 867 __ Bind(&branch_taken);
979 __ PushConstant(Smi::Handle(Smi::New(42))); 868 __ PushConstant(Smi::Handle(Smi::New(42)));
980 __ ReturnTOS(); 869 __ ReturnTOS();
981 } 870 }
982 871
983
984 ASSEMBLER_TEST_RUN(IfNeStrictTOSTaken, test) { 872 ASSEMBLER_TEST_RUN(IfNeStrictTOSTaken, test) {
985 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 873 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
986 } 874 }
987 875
988
989 ASSEMBLER_TEST_GENERATE(IfNeStrictTOSNotTaken, assembler) { 876 ASSEMBLER_TEST_GENERATE(IfNeStrictTOSNotTaken, assembler) {
990 Label branch_taken; 877 Label branch_taken;
991 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld)); 878 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld));
992 __ PushConstant(array1); 879 __ PushConstant(array1);
993 __ PushConstant(array1); 880 __ PushConstant(array1);
994 __ IfNeStrictTOS(); 881 __ IfNeStrictTOS();
995 __ Jump(&branch_taken); 882 __ Jump(&branch_taken);
996 __ PushConstant(Smi::Handle(Smi::New(42))); 883 __ PushConstant(Smi::Handle(Smi::New(42)));
997 __ ReturnTOS(); 884 __ ReturnTOS();
998 __ Bind(&branch_taken); 885 __ Bind(&branch_taken);
999 __ PushConstant(Smi::Handle(Smi::New(0))); 886 __ PushConstant(Smi::Handle(Smi::New(0)));
1000 __ ReturnTOS(); 887 __ ReturnTOS();
1001 } 888 }
1002 889
1003 ASSEMBLER_TEST_RUN(IfNeStrictTOSNotTaken, test) { 890 ASSEMBLER_TEST_RUN(IfNeStrictTOSNotTaken, test) {
1004 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 891 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1005 } 892 }
1006 893
1007
1008 // TODO(zra): Also add tests that use Mint, Bignum. 894 // TODO(zra): Also add tests that use Mint, Bignum.
1009 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSTaken, assembler) { 895 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSTaken, assembler) {
1010 Label branch_taken; 896 Label branch_taken;
1011 __ PushConstant(Smi::Handle(Smi::New(-1))); 897 __ PushConstant(Smi::Handle(Smi::New(-1)));
1012 __ PushConstant(Smi::Handle(Smi::New(1))); 898 __ PushConstant(Smi::Handle(Smi::New(1)));
1013 __ IfNeStrictNumTOS(); 899 __ IfNeStrictNumTOS();
1014 __ Jump(&branch_taken); 900 __ Jump(&branch_taken);
1015 __ PushConstant(Smi::Handle(Smi::New(0))); 901 __ PushConstant(Smi::Handle(Smi::New(0)));
1016 __ ReturnTOS(); 902 __ ReturnTOS();
1017 __ Bind(&branch_taken); 903 __ Bind(&branch_taken);
1018 __ PushConstant(Smi::Handle(Smi::New(42))); 904 __ PushConstant(Smi::Handle(Smi::New(42)));
1019 __ ReturnTOS(); 905 __ ReturnTOS();
1020 } 906 }
1021 907
1022
1023 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSTaken, test) { 908 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSTaken, test) {
1024 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 909 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1025 } 910 }
1026 911
1027
1028 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSNotTaken, assembler) { 912 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSNotTaken, assembler) {
1029 Label branch_taken; 913 Label branch_taken;
1030 __ PushConstant(Smi::Handle(Smi::New(1))); 914 __ PushConstant(Smi::Handle(Smi::New(1)));
1031 __ PushConstant(Smi::Handle(Smi::New(1))); 915 __ PushConstant(Smi::Handle(Smi::New(1)));
1032 __ IfNeStrictNumTOS(); 916 __ IfNeStrictNumTOS();
1033 __ Jump(&branch_taken); 917 __ Jump(&branch_taken);
1034 __ PushConstant(Smi::Handle(Smi::New(42))); 918 __ PushConstant(Smi::Handle(Smi::New(42)));
1035 __ ReturnTOS(); 919 __ ReturnTOS();
1036 __ Bind(&branch_taken); 920 __ Bind(&branch_taken);
1037 __ PushConstant(Smi::Handle(Smi::New(0))); 921 __ PushConstant(Smi::Handle(Smi::New(0)));
1038 __ ReturnTOS(); 922 __ ReturnTOS();
1039 } 923 }
1040 924
1041 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSNotTaken, test) { 925 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSNotTaken, test) {
1042 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 926 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1043 } 927 }
1044 928
1045
1046 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSTakenDouble, assembler) { 929 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSTakenDouble, assembler) {
1047 Label branch_taken; 930 Label branch_taken;
1048 __ PushConstant(Double::Handle(Double::New(-1.0, Heap::kOld))); 931 __ PushConstant(Double::Handle(Double::New(-1.0, Heap::kOld)));
1049 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); 932 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld)));
1050 __ IfNeStrictNumTOS(); 933 __ IfNeStrictNumTOS();
1051 __ Jump(&branch_taken); 934 __ Jump(&branch_taken);
1052 __ PushConstant(Smi::Handle(Smi::New(0))); 935 __ PushConstant(Smi::Handle(Smi::New(0)));
1053 __ ReturnTOS(); 936 __ ReturnTOS();
1054 __ Bind(&branch_taken); 937 __ Bind(&branch_taken);
1055 __ PushConstant(Smi::Handle(Smi::New(42))); 938 __ PushConstant(Smi::Handle(Smi::New(42)));
1056 __ ReturnTOS(); 939 __ ReturnTOS();
1057 } 940 }
1058 941
1059
1060 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSTakenDouble, test) { 942 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSTakenDouble, test) {
1061 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 943 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1062 } 944 }
1063 945
1064
1065 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSNotTakenDouble, assembler) { 946 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSNotTakenDouble, assembler) {
1066 Label branch_taken; 947 Label branch_taken;
1067 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); 948 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld)));
1068 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); 949 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld)));
1069 __ IfNeStrictNumTOS(); 950 __ IfNeStrictNumTOS();
1070 __ Jump(&branch_taken); 951 __ Jump(&branch_taken);
1071 __ PushConstant(Smi::Handle(Smi::New(42))); 952 __ PushConstant(Smi::Handle(Smi::New(42)));
1072 __ ReturnTOS(); 953 __ ReturnTOS();
1073 __ Bind(&branch_taken); 954 __ Bind(&branch_taken);
1074 __ PushConstant(Smi::Handle(Smi::New(0))); 955 __ PushConstant(Smi::Handle(Smi::New(0)));
1075 __ ReturnTOS(); 956 __ ReturnTOS();
1076 } 957 }
1077 958
1078 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSNotTakenDouble, test) { 959 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSNotTakenDouble, test) {
1079 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 960 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1080 } 961 }
1081 962
1082
1083 ASSEMBLER_TEST_GENERATE(IfEqStrictTOSTaken, assembler) { 963 ASSEMBLER_TEST_GENERATE(IfEqStrictTOSTaken, assembler) {
1084 Label branch_taken; 964 Label branch_taken;
1085 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld)); 965 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld));
1086 __ PushConstant(array1); 966 __ PushConstant(array1);
1087 __ PushConstant(array1); 967 __ PushConstant(array1);
1088 __ IfEqStrictTOS(); 968 __ IfEqStrictTOS();
1089 __ Jump(&branch_taken); 969 __ Jump(&branch_taken);
1090 __ PushConstant(Smi::Handle(Smi::New(0))); 970 __ PushConstant(Smi::Handle(Smi::New(0)));
1091 __ ReturnTOS(); 971 __ ReturnTOS();
1092 __ Bind(&branch_taken); 972 __ Bind(&branch_taken);
1093 __ PushConstant(Smi::Handle(Smi::New(42))); 973 __ PushConstant(Smi::Handle(Smi::New(42)));
1094 __ ReturnTOS(); 974 __ ReturnTOS();
1095 } 975 }
1096 976
1097
1098 ASSEMBLER_TEST_RUN(IfEqStrictTOSTaken, test) { 977 ASSEMBLER_TEST_RUN(IfEqStrictTOSTaken, test) {
1099 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 978 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1100 } 979 }
1101 980
1102
1103 ASSEMBLER_TEST_GENERATE(IfEqStrictTOSNotTaken, assembler) { 981 ASSEMBLER_TEST_GENERATE(IfEqStrictTOSNotTaken, assembler) {
1104 Label branch_taken; 982 Label branch_taken;
1105 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld)); 983 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld));
1106 const Array& array2 = Array::Handle(Array::New(2, Heap::kOld)); 984 const Array& array2 = Array::Handle(Array::New(2, Heap::kOld));
1107 __ PushConstant(array1); 985 __ PushConstant(array1);
1108 __ PushConstant(array2); 986 __ PushConstant(array2);
1109 __ IfEqStrictTOS(); 987 __ IfEqStrictTOS();
1110 __ Jump(&branch_taken); 988 __ Jump(&branch_taken);
1111 __ PushConstant(Smi::Handle(Smi::New(42))); 989 __ PushConstant(Smi::Handle(Smi::New(42)));
1112 __ ReturnTOS(); 990 __ ReturnTOS();
1113 __ Bind(&branch_taken); 991 __ Bind(&branch_taken);
1114 __ PushConstant(Smi::Handle(Smi::New(0))); 992 __ PushConstant(Smi::Handle(Smi::New(0)));
1115 __ ReturnTOS(); 993 __ ReturnTOS();
1116 } 994 }
1117 995
1118 ASSEMBLER_TEST_RUN(IfEqStrictTOSNotTaken, test) { 996 ASSEMBLER_TEST_RUN(IfEqStrictTOSNotTaken, test) {
1119 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 997 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1120 } 998 }
1121 999
1122
1123 // TODO(zra): Also add tests that use Mint, Bignum. 1000 // TODO(zra): Also add tests that use Mint, Bignum.
1124 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSTaken, assembler) { 1001 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSTaken, assembler) {
1125 Label branch_taken; 1002 Label branch_taken;
1126 __ PushConstant(Smi::Handle(Smi::New(1))); 1003 __ PushConstant(Smi::Handle(Smi::New(1)));
1127 __ PushConstant(Smi::Handle(Smi::New(1))); 1004 __ PushConstant(Smi::Handle(Smi::New(1)));
1128 __ IfEqStrictNumTOS(); 1005 __ IfEqStrictNumTOS();
1129 __ Jump(&branch_taken); 1006 __ Jump(&branch_taken);
1130 __ PushConstant(Smi::Handle(Smi::New(0))); 1007 __ PushConstant(Smi::Handle(Smi::New(0)));
1131 __ ReturnTOS(); 1008 __ ReturnTOS();
1132 __ Bind(&branch_taken); 1009 __ Bind(&branch_taken);
1133 __ PushConstant(Smi::Handle(Smi::New(42))); 1010 __ PushConstant(Smi::Handle(Smi::New(42)));
1134 __ ReturnTOS(); 1011 __ ReturnTOS();
1135 } 1012 }
1136 1013
1137
1138 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSTaken, test) { 1014 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSTaken, test) {
1139 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1015 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1140 } 1016 }
1141 1017
1142
1143 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSNotTaken, assembler) { 1018 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSNotTaken, assembler) {
1144 Label branch_taken; 1019 Label branch_taken;
1145 __ PushConstant(Smi::Handle(Smi::New(-1))); 1020 __ PushConstant(Smi::Handle(Smi::New(-1)));
1146 __ PushConstant(Smi::Handle(Smi::New(1))); 1021 __ PushConstant(Smi::Handle(Smi::New(1)));
1147 __ IfEqStrictNumTOS(); 1022 __ IfEqStrictNumTOS();
1148 __ Jump(&branch_taken); 1023 __ Jump(&branch_taken);
1149 __ PushConstant(Smi::Handle(Smi::New(42))); 1024 __ PushConstant(Smi::Handle(Smi::New(42)));
1150 __ ReturnTOS(); 1025 __ ReturnTOS();
1151 __ Bind(&branch_taken); 1026 __ Bind(&branch_taken);
1152 __ PushConstant(Smi::Handle(Smi::New(0))); 1027 __ PushConstant(Smi::Handle(Smi::New(0)));
1153 __ ReturnTOS(); 1028 __ ReturnTOS();
1154 } 1029 }
1155 1030
1156
1157 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSNotTaken, test) { 1031 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSNotTaken, test) {
1158 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1032 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1159 } 1033 }
1160 1034
1161
1162 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSTakenDouble, assembler) { 1035 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSTakenDouble, assembler) {
1163 Label branch_taken; 1036 Label branch_taken;
1164 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); 1037 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld)));
1165 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); 1038 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld)));
1166 __ IfEqStrictNumTOS(); 1039 __ IfEqStrictNumTOS();
1167 __ Jump(&branch_taken); 1040 __ Jump(&branch_taken);
1168 __ PushConstant(Smi::Handle(Smi::New(0))); 1041 __ PushConstant(Smi::Handle(Smi::New(0)));
1169 __ ReturnTOS(); 1042 __ ReturnTOS();
1170 __ Bind(&branch_taken); 1043 __ Bind(&branch_taken);
1171 __ PushConstant(Smi::Handle(Smi::New(42))); 1044 __ PushConstant(Smi::Handle(Smi::New(42)));
1172 __ ReturnTOS(); 1045 __ ReturnTOS();
1173 } 1046 }
1174 1047
1175
1176 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSTakenDouble, test) { 1048 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSTakenDouble, test) {
1177 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1049 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1178 } 1050 }
1179 1051
1180
1181 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSNotTakenDouble, assembler) { 1052 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSNotTakenDouble, assembler) {
1182 Label branch_taken; 1053 Label branch_taken;
1183 __ PushConstant(Double::Handle(Double::New(-1.0, Heap::kOld))); 1054 __ PushConstant(Double::Handle(Double::New(-1.0, Heap::kOld)));
1184 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); 1055 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld)));
1185 __ IfEqStrictNumTOS(); 1056 __ IfEqStrictNumTOS();
1186 __ Jump(&branch_taken); 1057 __ Jump(&branch_taken);
1187 __ PushConstant(Smi::Handle(Smi::New(42))); 1058 __ PushConstant(Smi::Handle(Smi::New(42)));
1188 __ ReturnTOS(); 1059 __ ReturnTOS();
1189 __ Bind(&branch_taken); 1060 __ Bind(&branch_taken);
1190 __ PushConstant(Smi::Handle(Smi::New(0))); 1061 __ PushConstant(Smi::Handle(Smi::New(0)));
1191 __ ReturnTOS(); 1062 __ ReturnTOS();
1192 } 1063 }
1193 1064
1194
1195 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSNotTakenDouble, test) { 1065 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSNotTakenDouble, test) {
1196 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1066 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1197 } 1067 }
1198 1068
1199
1200 // - BooleanNegateTOS 1069 // - BooleanNegateTOS
1201 // 1070 //
1202 // SP[0] = !SP[0] 1071 // SP[0] = !SP[0]
1203 ASSEMBLER_TEST_GENERATE(BooleanNegateTOSTrue, assembler) { 1072 ASSEMBLER_TEST_GENERATE(BooleanNegateTOSTrue, assembler) {
1204 __ PushConstant(Bool::True()); 1073 __ PushConstant(Bool::True());
1205 __ BooleanNegateTOS(); 1074 __ BooleanNegateTOS();
1206 __ ReturnTOS(); 1075 __ ReturnTOS();
1207 } 1076 }
1208 1077
1209
1210 ASSEMBLER_TEST_RUN(BooleanNegateTOSTrue, test) { 1078 ASSEMBLER_TEST_RUN(BooleanNegateTOSTrue, test) {
1211 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); 1079 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code()));
1212 } 1080 }
1213 1081
1214
1215 ASSEMBLER_TEST_GENERATE(BooleanNegateTOSFalse, assembler) { 1082 ASSEMBLER_TEST_GENERATE(BooleanNegateTOSFalse, assembler) {
1216 __ PushConstant(Bool::False()); 1083 __ PushConstant(Bool::False());
1217 __ BooleanNegateTOS(); 1084 __ BooleanNegateTOS();
1218 __ ReturnTOS(); 1085 __ ReturnTOS();
1219 } 1086 }
1220 1087
1221
1222 ASSEMBLER_TEST_RUN(BooleanNegateTOSFalse, test) { 1088 ASSEMBLER_TEST_RUN(BooleanNegateTOSFalse, test) {
1223 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); 1089 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code()));
1224 } 1090 }
1225 1091
1226
1227 // - AssertBoolean A 1092 // - AssertBoolean A
1228 // 1093 //
1229 // Assert that TOS is a boolean (A = 1) or that TOS is not null (A = 0). 1094 // Assert that TOS is a boolean (A = 1) or that TOS is not null (A = 0).
1230 ASSEMBLER_TEST_GENERATE(AssertBooleanTrue, assembler) { 1095 ASSEMBLER_TEST_GENERATE(AssertBooleanTrue, assembler) {
1231 __ PushConstant(Bool::True()); 1096 __ PushConstant(Bool::True());
1232 __ AssertBoolean(1); 1097 __ AssertBoolean(1);
1233 __ ReturnTOS(); 1098 __ ReturnTOS();
1234 } 1099 }
1235 1100
1236
1237 ASSEMBLER_TEST_RUN(AssertBooleanTrue, test) { 1101 ASSEMBLER_TEST_RUN(AssertBooleanTrue, test) {
1238 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); 1102 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code()));
1239 } 1103 }
1240 1104
1241
1242 ASSEMBLER_TEST_GENERATE(AssertBooleanFalse, assembler) { 1105 ASSEMBLER_TEST_GENERATE(AssertBooleanFalse, assembler) {
1243 __ PushConstant(Bool::False()); 1106 __ PushConstant(Bool::False());
1244 __ AssertBoolean(1); 1107 __ AssertBoolean(1);
1245 __ ReturnTOS(); 1108 __ ReturnTOS();
1246 } 1109 }
1247 1110
1248
1249 ASSEMBLER_TEST_RUN(AssertBooleanFalse, test) { 1111 ASSEMBLER_TEST_RUN(AssertBooleanFalse, test) {
1250 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); 1112 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code()));
1251 } 1113 }
1252 1114
1253
1254 ASSEMBLER_TEST_GENERATE(AssertBooleanNotNull, assembler) { 1115 ASSEMBLER_TEST_GENERATE(AssertBooleanNotNull, assembler) {
1255 __ PushConstant(Bool::True()); 1116 __ PushConstant(Bool::True());
1256 __ AssertBoolean(0); 1117 __ AssertBoolean(0);
1257 __ ReturnTOS(); 1118 __ ReturnTOS();
1258 } 1119 }
1259 1120
1260
1261 ASSEMBLER_TEST_RUN(AssertBooleanNotNull, test) { 1121 ASSEMBLER_TEST_RUN(AssertBooleanNotNull, test) {
1262 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); 1122 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code()));
1263 } 1123 }
1264 1124
1265
1266 ASSEMBLER_TEST_GENERATE(AssertBooleanFail1, assembler) { 1125 ASSEMBLER_TEST_GENERATE(AssertBooleanFail1, assembler) {
1267 __ PushConstant(Smi::Handle(Smi::New(37))); 1126 __ PushConstant(Smi::Handle(Smi::New(37)));
1268 __ AssertBoolean(1); 1127 __ AssertBoolean(1);
1269 __ ReturnTOS(); 1128 __ ReturnTOS();
1270 } 1129 }
1271 1130
1272
1273 ASSEMBLER_TEST_RUN(AssertBooleanFail1, test) { 1131 ASSEMBLER_TEST_RUN(AssertBooleanFail1, test) {
1274 EXPECT(EXECUTE_TEST_CODE_OBJECT(test->code()).IsError()); 1132 EXPECT(EXECUTE_TEST_CODE_OBJECT(test->code()).IsError());
1275 } 1133 }
1276 1134
1277
1278 ASSEMBLER_TEST_GENERATE(AssertBooleanFail2, assembler) { 1135 ASSEMBLER_TEST_GENERATE(AssertBooleanFail2, assembler) {
1279 __ PushConstant(Object::null_object()); 1136 __ PushConstant(Object::null_object());
1280 __ AssertBoolean(0); 1137 __ AssertBoolean(0);
1281 __ ReturnTOS(); 1138 __ ReturnTOS();
1282 } 1139 }
1283 1140
1284
1285 ASSEMBLER_TEST_RUN(AssertBooleanFail2, test) { 1141 ASSEMBLER_TEST_RUN(AssertBooleanFail2, test) {
1286 EXPECT(EXECUTE_TEST_CODE_OBJECT(test->code()).IsError()); 1142 EXPECT(EXECUTE_TEST_CODE_OBJECT(test->code()).IsError());
1287 } 1143 }
1288 1144
1289
1290 // - Drop1; DropR n; Drop n 1145 // - Drop1; DropR n; Drop n
1291 // 1146 //
1292 // Drop 1 or n values from the stack, if instruction is DropR push the first 1147 // Drop 1 or n values from the stack, if instruction is DropR push the first
1293 // dropped value to the stack; 1148 // dropped value to the stack;
1294 ASSEMBLER_TEST_GENERATE(Drop1, assembler) { 1149 ASSEMBLER_TEST_GENERATE(Drop1, assembler) {
1295 __ PushConstant(Smi::Handle(Smi::New(0))); 1150 __ PushConstant(Smi::Handle(Smi::New(0)));
1296 __ PushConstant(Smi::Handle(Smi::New(42))); 1151 __ PushConstant(Smi::Handle(Smi::New(42)));
1297 __ PushConstant(Smi::Handle(Smi::New(37))); 1152 __ PushConstant(Smi::Handle(Smi::New(37)));
1298 __ Drop1(); 1153 __ Drop1();
1299 __ ReturnTOS(); 1154 __ ReturnTOS();
1300 } 1155 }
1301 1156
1302
1303 ASSEMBLER_TEST_RUN(Drop1, test) { 1157 ASSEMBLER_TEST_RUN(Drop1, test) {
1304 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1158 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1305 } 1159 }
1306 1160
1307
1308 ASSEMBLER_TEST_GENERATE(Drop, assembler) { 1161 ASSEMBLER_TEST_GENERATE(Drop, assembler) {
1309 __ PushConstant(Smi::Handle(Smi::New(0))); 1162 __ PushConstant(Smi::Handle(Smi::New(0)));
1310 __ PushConstant(Smi::Handle(Smi::New(42))); 1163 __ PushConstant(Smi::Handle(Smi::New(42)));
1311 __ PushConstant(Smi::Handle(Smi::New(37))); 1164 __ PushConstant(Smi::Handle(Smi::New(37)));
1312 __ PushConstant(Smi::Handle(Smi::New(37))); 1165 __ PushConstant(Smi::Handle(Smi::New(37)));
1313 __ PushConstant(Smi::Handle(Smi::New(37))); 1166 __ PushConstant(Smi::Handle(Smi::New(37)));
1314 __ PushConstant(Smi::Handle(Smi::New(37))); 1167 __ PushConstant(Smi::Handle(Smi::New(37)));
1315 __ PushConstant(Smi::Handle(Smi::New(37))); 1168 __ PushConstant(Smi::Handle(Smi::New(37)));
1316 __ PushConstant(Smi::Handle(Smi::New(37))); 1169 __ PushConstant(Smi::Handle(Smi::New(37)));
1317 __ PushConstant(Smi::Handle(Smi::New(37))); 1170 __ PushConstant(Smi::Handle(Smi::New(37)));
1318 __ PushConstant(Smi::Handle(Smi::New(37))); 1171 __ PushConstant(Smi::Handle(Smi::New(37)));
1319 __ PushConstant(Smi::Handle(Smi::New(37))); 1172 __ PushConstant(Smi::Handle(Smi::New(37)));
1320 __ PushConstant(Smi::Handle(Smi::New(37))); 1173 __ PushConstant(Smi::Handle(Smi::New(37)));
1321 __ PushConstant(Smi::Handle(Smi::New(37))); 1174 __ PushConstant(Smi::Handle(Smi::New(37)));
1322 __ Drop(11); 1175 __ Drop(11);
1323 __ ReturnTOS(); 1176 __ ReturnTOS();
1324 } 1177 }
1325 1178
1326
1327 ASSEMBLER_TEST_RUN(Drop, test) { 1179 ASSEMBLER_TEST_RUN(Drop, test) {
1328 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1180 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1329 } 1181 }
1330 1182
1331
1332 ASSEMBLER_TEST_GENERATE(DropR, assembler) { 1183 ASSEMBLER_TEST_GENERATE(DropR, assembler) {
1333 __ PushConstant(Smi::Handle(Smi::New(0))); 1184 __ PushConstant(Smi::Handle(Smi::New(0)));
1334 __ PushConstant(Smi::Handle(Smi::New(1))); 1185 __ PushConstant(Smi::Handle(Smi::New(1)));
1335 __ PushConstant(Smi::Handle(Smi::New(37))); 1186 __ PushConstant(Smi::Handle(Smi::New(37)));
1336 __ PushConstant(Smi::Handle(Smi::New(37))); 1187 __ PushConstant(Smi::Handle(Smi::New(37)));
1337 __ PushConstant(Smi::Handle(Smi::New(37))); 1188 __ PushConstant(Smi::Handle(Smi::New(37)));
1338 __ PushConstant(Smi::Handle(Smi::New(37))); 1189 __ PushConstant(Smi::Handle(Smi::New(37)));
1339 __ PushConstant(Smi::Handle(Smi::New(37))); 1190 __ PushConstant(Smi::Handle(Smi::New(37)));
1340 __ PushConstant(Smi::Handle(Smi::New(37))); 1191 __ PushConstant(Smi::Handle(Smi::New(37)));
1341 __ PushConstant(Smi::Handle(Smi::New(37))); 1192 __ PushConstant(Smi::Handle(Smi::New(37)));
1342 __ PushConstant(Smi::Handle(Smi::New(37))); 1193 __ PushConstant(Smi::Handle(Smi::New(37)));
1343 __ PushConstant(Smi::Handle(Smi::New(37))); 1194 __ PushConstant(Smi::Handle(Smi::New(37)));
1344 __ PushConstant(Smi::Handle(Smi::New(37))); 1195 __ PushConstant(Smi::Handle(Smi::New(37)));
1345 __ PushConstant(Smi::Handle(Smi::New(37))); 1196 __ PushConstant(Smi::Handle(Smi::New(37)));
1346 __ PushConstant(Smi::Handle(Smi::New(41))); 1197 __ PushConstant(Smi::Handle(Smi::New(41)));
1347 __ DropR(11); 1198 __ DropR(11);
1348 __ AddTOS(); 1199 __ AddTOS();
1349 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); 1200 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
1350 __ ReturnTOS(); 1201 __ ReturnTOS();
1351 } 1202 }
1352 1203
1353
1354 ASSEMBLER_TEST_RUN(DropR, test) { 1204 ASSEMBLER_TEST_RUN(DropR, test) {
1355 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1205 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1356 } 1206 }
1357 1207
1358
1359 // - Frame D 1208 // - Frame D
1360 // 1209 //
1361 // Reserve and initialize with null space for D local variables. 1210 // Reserve and initialize with null space for D local variables.
1362 ASSEMBLER_TEST_GENERATE(FrameInitialized1, assembler) { 1211 ASSEMBLER_TEST_GENERATE(FrameInitialized1, assembler) {
1363 __ Frame(1); 1212 __ Frame(1);
1364 __ ReturnTOS(); 1213 __ ReturnTOS();
1365 } 1214 }
1366 1215
1367
1368 ASSEMBLER_TEST_RUN(FrameInitialized1, test) { 1216 ASSEMBLER_TEST_RUN(FrameInitialized1, test) {
1369 EXPECT(EXECUTE_TEST_CODE_OBJECT(test->code()).IsNull()); 1217 EXPECT(EXECUTE_TEST_CODE_OBJECT(test->code()).IsNull());
1370 } 1218 }
1371 1219
1372
1373 ASSEMBLER_TEST_GENERATE(FrameInitialized, assembler) { 1220 ASSEMBLER_TEST_GENERATE(FrameInitialized, assembler) {
1374 Label error; 1221 Label error;
1375 __ PushConstant(Smi::Handle(Smi::New(42))); 1222 __ PushConstant(Smi::Handle(Smi::New(42)));
1376 __ Frame(4); 1223 __ Frame(4);
1377 __ PushConstant(Object::null_object()); 1224 __ PushConstant(Object::null_object());
1378 __ IfNeStrictTOS(); 1225 __ IfNeStrictTOS();
1379 __ Jump(&error); 1226 __ Jump(&error);
1380 __ PushConstant(Object::null_object()); 1227 __ PushConstant(Object::null_object());
1381 __ IfNeStrictTOS(); 1228 __ IfNeStrictTOS();
1382 __ Jump(&error); 1229 __ Jump(&error);
1383 __ PushConstant(Object::null_object()); 1230 __ PushConstant(Object::null_object());
1384 __ IfNeStrictTOS(); 1231 __ IfNeStrictTOS();
1385 __ Jump(&error); 1232 __ Jump(&error);
1386 __ PushConstant(Object::null_object()); 1233 __ PushConstant(Object::null_object());
1387 __ IfNeStrictTOS(); 1234 __ IfNeStrictTOS();
1388 __ Jump(&error); 1235 __ Jump(&error);
1389 __ ReturnTOS(); 1236 __ ReturnTOS();
1390 1237
1391 // If a frame slot was not initialized to null. 1238 // If a frame slot was not initialized to null.
1392 __ Bind(&error); 1239 __ Bind(&error);
1393 __ PushConstant(Smi::Handle(Smi::New(0))); 1240 __ PushConstant(Smi::Handle(Smi::New(0)));
1394 __ ReturnTOS(); 1241 __ ReturnTOS();
1395 } 1242 }
1396 1243
1397
1398 ASSEMBLER_TEST_RUN(FrameInitialized, test) { 1244 ASSEMBLER_TEST_RUN(FrameInitialized, test) {
1399 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1245 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1400 } 1246 }
1401 1247
1402
1403 // - StoreLocal rX; PopLocal rX 1248 // - StoreLocal rX; PopLocal rX
1404 // 1249 //
1405 // Store top of the stack into FP[rX] and pop it if needed. 1250 // Store top of the stack into FP[rX] and pop it if needed.
1406 // 1251 //
1407 // - Push rX 1252 // - Push rX
1408 // 1253 //
1409 // Push FP[rX] to the stack. 1254 // Push FP[rX] to the stack.
1410 ASSEMBLER_TEST_GENERATE(StoreLocalPush, assembler) { 1255 ASSEMBLER_TEST_GENERATE(StoreLocalPush, assembler) {
1411 __ Frame(1); 1256 __ Frame(1);
1412 __ PushConstant(Smi::Handle(Smi::New(37))); 1257 __ PushConstant(Smi::Handle(Smi::New(37)));
1413 __ PushConstant(Smi::Handle(Smi::New(21))); 1258 __ PushConstant(Smi::Handle(Smi::New(21)));
1414 __ StoreLocal(0); 1259 __ StoreLocal(0);
1415 __ Push(0); 1260 __ Push(0);
1416 __ AddTOS(); 1261 __ AddTOS();
1417 // Should be skipped. 1262 // Should be skipped.
1418 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); 1263 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
1419 __ ReturnTOS(); 1264 __ ReturnTOS();
1420 } 1265 }
1421 1266
1422
1423 ASSEMBLER_TEST_RUN(StoreLocalPush, test) { 1267 ASSEMBLER_TEST_RUN(StoreLocalPush, test) {
1424 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1268 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1425 } 1269 }
1426 1270
1427
1428 ASSEMBLER_TEST_GENERATE(PopLocalPush, assembler) { 1271 ASSEMBLER_TEST_GENERATE(PopLocalPush, assembler) {
1429 __ Frame(1); 1272 __ Frame(1);
1430 __ PushConstant(Smi::Handle(Smi::New(21))); 1273 __ PushConstant(Smi::Handle(Smi::New(21)));
1431 __ PopLocal(0); 1274 __ PopLocal(0);
1432 __ Push(0); 1275 __ Push(0);
1433 __ Push(0); 1276 __ Push(0);
1434 __ AddTOS(); 1277 __ AddTOS();
1435 // Should be skipped. 1278 // Should be skipped.
1436 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); 1279 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
1437 __ ReturnTOS(); 1280 __ ReturnTOS();
1438 } 1281 }
1439 1282
1440
1441 ASSEMBLER_TEST_RUN(PopLocalPush, test) { 1283 ASSEMBLER_TEST_RUN(PopLocalPush, test) {
1442 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1284 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1443 } 1285 }
1444 1286
1445
1446 ASSEMBLER_TEST_GENERATE(LoadConstantPush, assembler) { 1287 ASSEMBLER_TEST_GENERATE(LoadConstantPush, assembler) {
1447 __ Frame(1); 1288 __ Frame(1);
1448 __ LoadConstant(0, Smi::Handle(Smi::New(21))); 1289 __ LoadConstant(0, Smi::Handle(Smi::New(21)));
1449 __ Push(0); 1290 __ Push(0);
1450 __ Push(0); 1291 __ Push(0);
1451 __ AddTOS(); 1292 __ AddTOS();
1452 // Should be skipped. 1293 // Should be skipped.
1453 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); 1294 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
1454 __ ReturnTOS(); 1295 __ ReturnTOS();
1455 } 1296 }
1456 1297
1457
1458 ASSEMBLER_TEST_RUN(LoadConstantPush, test) { 1298 ASSEMBLER_TEST_RUN(LoadConstantPush, test) {
1459 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1299 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1460 } 1300 }
1461 1301
1462
1463 // - Move rA, rX 1302 // - Move rA, rX
1464 // 1303 //
1465 // FP[rA] <- FP[rX] 1304 // FP[rA] <- FP[rX]
1466 // Note: rX is signed so it can be used to address parameters which are 1305 // Note: rX is signed so it can be used to address parameters which are
1467 // at negative indices with respect to FP. 1306 // at negative indices with respect to FP.
1468 ASSEMBLER_TEST_GENERATE(MoveLocalLocal, assembler) { 1307 ASSEMBLER_TEST_GENERATE(MoveLocalLocal, assembler) {
1469 __ Frame(2); 1308 __ Frame(2);
1470 __ PushConstant(Smi::Handle(Smi::New(21))); 1309 __ PushConstant(Smi::Handle(Smi::New(21)));
1471 __ PopLocal(0); 1310 __ PopLocal(0);
1472 __ Move(1, 0); 1311 __ Move(1, 0);
1473 __ Push(0); 1312 __ Push(0);
1474 __ Push(1); 1313 __ Push(1);
1475 __ AddTOS(); 1314 __ AddTOS();
1476 // Should be skipped. 1315 // Should be skipped.
1477 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); 1316 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
1478 __ ReturnTOS(); 1317 __ ReturnTOS();
1479 } 1318 }
1480 1319
1481
1482 ASSEMBLER_TEST_RUN(MoveLocalLocal, test) { 1320 ASSEMBLER_TEST_RUN(MoveLocalLocal, test) {
1483 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1321 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1484 } 1322 }
1485 1323
1486
1487 // - Return R; ReturnTOS 1324 // - Return R; ReturnTOS
1488 // 1325 //
1489 // Return to the caller using either a value from the given register or a 1326 // Return to the caller using either a value from the given register or a
1490 // value from the top-of-stack as a result. 1327 // value from the top-of-stack as a result.
1491 ASSEMBLER_TEST_GENERATE(Return1, assembler) { 1328 ASSEMBLER_TEST_GENERATE(Return1, assembler) {
1492 __ Frame(1); 1329 __ Frame(1);
1493 __ PushConstant(Smi::Handle(Smi::New(42))); 1330 __ PushConstant(Smi::Handle(Smi::New(42)));
1494 __ StoreLocal(0); 1331 __ StoreLocal(0);
1495 __ Return(0); 1332 __ Return(0);
1496 } 1333 }
1497 1334
1498
1499 ASSEMBLER_TEST_RUN(Return1, test) { 1335 ASSEMBLER_TEST_RUN(Return1, test) {
1500 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1336 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1501 } 1337 }
1502 1338
1503
1504 ASSEMBLER_TEST_GENERATE(Return2, assembler) { 1339 ASSEMBLER_TEST_GENERATE(Return2, assembler) {
1505 __ Frame(2); 1340 __ Frame(2);
1506 __ PushConstant(Smi::Handle(Smi::New(42))); 1341 __ PushConstant(Smi::Handle(Smi::New(42)));
1507 __ StoreLocal(1); 1342 __ StoreLocal(1);
1508 __ Return(1); 1343 __ Return(1);
1509 } 1344 }
1510 1345
1511
1512 ASSEMBLER_TEST_RUN(Return2, test) { 1346 ASSEMBLER_TEST_RUN(Return2, test) {
1513 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1347 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1514 } 1348 }
1515 1349
1516
1517 ASSEMBLER_TEST_GENERATE(Loop, assembler) { 1350 ASSEMBLER_TEST_GENERATE(Loop, assembler) {
1518 __ Frame(2); 1351 __ Frame(2);
1519 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1352 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
1520 __ LoadConstant(1, Smi::Handle(Smi::New(0))); 1353 __ LoadConstant(1, Smi::Handle(Smi::New(0)));
1521 1354
1522 Label loop_entry, error; 1355 Label loop_entry, error;
1523 __ Bind(&loop_entry); 1356 __ Bind(&loop_entry);
1524 // Add 1 to FP[1]. 1357 // Add 1 to FP[1].
1525 __ PushConstant(Smi::Handle(Smi::New(1))); 1358 __ PushConstant(Smi::Handle(Smi::New(1)));
1526 __ Push(1); 1359 __ Push(1);
(...skipping 15 matching lines...) Expand all
1542 __ IfNeStrictNumTOS(); 1375 __ IfNeStrictNumTOS();
1543 __ Jump(&loop_entry); 1376 __ Jump(&loop_entry);
1544 1377
1545 __ Return(1); 1378 __ Return(1);
1546 1379
1547 __ Bind(&error); 1380 __ Bind(&error);
1548 __ LoadConstant(1, Smi::Handle(Smi::New(-42))); 1381 __ LoadConstant(1, Smi::Handle(Smi::New(-42)));
1549 __ Return(1); 1382 __ Return(1);
1550 } 1383 }
1551 1384
1552
1553 ASSEMBLER_TEST_RUN(Loop, test) { 1385 ASSEMBLER_TEST_RUN(Loop, test) {
1554 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1386 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1555 } 1387 }
1556 1388
1557
1558 // - LoadClassIdTOS, LoadClassId rA, D 1389 // - LoadClassIdTOS, LoadClassId rA, D
1559 // 1390 //
1560 // LoadClassIdTOS loads the class id from the object at SP[0] and stores it 1391 // LoadClassIdTOS loads the class id from the object at SP[0] and stores it
1561 // to SP[0]. LoadClassId loads the class id from FP[rA] and stores it to 1392 // to SP[0]. LoadClassId loads the class id from FP[rA] and stores it to
1562 // FP[D]. 1393 // FP[D].
1563 ASSEMBLER_TEST_GENERATE(LoadClassIdTOS, assembler) { 1394 ASSEMBLER_TEST_GENERATE(LoadClassIdTOS, assembler) {
1564 __ PushConstant(Smi::Handle(Smi::New(42))); 1395 __ PushConstant(Smi::Handle(Smi::New(42)));
1565 __ LoadClassIdTOS(); 1396 __ LoadClassIdTOS();
1566 __ ReturnTOS(); 1397 __ ReturnTOS();
1567 } 1398 }
1568 1399
1569
1570 ASSEMBLER_TEST_RUN(LoadClassIdTOS, test) { 1400 ASSEMBLER_TEST_RUN(LoadClassIdTOS, test) {
1571 EXPECT_EQ(kSmiCid, EXECUTE_TEST_CODE_INTPTR(test->code())); 1401 EXPECT_EQ(kSmiCid, EXECUTE_TEST_CODE_INTPTR(test->code()));
1572 } 1402 }
1573 1403
1574
1575 ASSEMBLER_TEST_GENERATE(LoadClassId, assembler) { 1404 ASSEMBLER_TEST_GENERATE(LoadClassId, assembler) {
1576 __ Frame(2); 1405 __ Frame(2);
1577 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1406 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
1578 __ LoadClassId(1, 0); 1407 __ LoadClassId(1, 0);
1579 __ Return(1); 1408 __ Return(1);
1580 } 1409 }
1581 1410
1582
1583 ASSEMBLER_TEST_RUN(LoadClassId, test) { 1411 ASSEMBLER_TEST_RUN(LoadClassId, test) {
1584 EXPECT_EQ(kSmiCid, EXECUTE_TEST_CODE_INTPTR(test->code())); 1412 EXPECT_EQ(kSmiCid, EXECUTE_TEST_CODE_INTPTR(test->code()));
1585 } 1413 }
1586 1414
1587
1588 // - CreateArrayTOS 1415 // - CreateArrayTOS
1589 // 1416 //
1590 // Allocate array of length SP[0] with type arguments SP[-1]. 1417 // Allocate array of length SP[0] with type arguments SP[-1].
1591 ASSEMBLER_TEST_GENERATE(CreateArrayTOS, assembler) { 1418 ASSEMBLER_TEST_GENERATE(CreateArrayTOS, assembler) {
1592 __ PushConstant(Object::null_object()); 1419 __ PushConstant(Object::null_object());
1593 __ PushConstant(Smi::Handle(Smi::New(10))); 1420 __ PushConstant(Smi::Handle(Smi::New(10)));
1594 __ CreateArrayTOS(); 1421 __ CreateArrayTOS();
1595 __ ReturnTOS(); 1422 __ ReturnTOS();
1596 } 1423 }
1597 1424
1598
1599 ASSEMBLER_TEST_RUN(CreateArrayTOS, test) { 1425 ASSEMBLER_TEST_RUN(CreateArrayTOS, test) {
1600 const Object& obj = EXECUTE_TEST_CODE_OBJECT(test->code()); 1426 const Object& obj = EXECUTE_TEST_CODE_OBJECT(test->code());
1601 EXPECT(obj.IsArray()); 1427 EXPECT(obj.IsArray());
1602 Array& array = Array::Handle(); 1428 Array& array = Array::Handle();
1603 array ^= obj.raw(); 1429 array ^= obj.raw();
1604 EXPECT_EQ(10, array.Length()); 1430 EXPECT_EQ(10, array.Length());
1605 } 1431 }
1606 1432
1607
1608 // - TestSmi rA, rD 1433 // - TestSmi rA, rD
1609 // 1434 //
1610 // If FP[rA] & FP[rD] != 0, then skip the next instruction. FP[rA] and FP[rD] 1435 // If FP[rA] & FP[rD] != 0, then skip the next instruction. FP[rA] and FP[rD]
1611 // must be Smis. 1436 // must be Smis.
1612 ASSEMBLER_TEST_GENERATE(TestSmiTrue, assembler) { 1437 ASSEMBLER_TEST_GENERATE(TestSmiTrue, assembler) {
1613 Label branch_taken; 1438 Label branch_taken;
1614 __ Frame(2); 1439 __ Frame(2);
1615 __ LoadConstant(0, Smi::Handle(Smi::New(7))); 1440 __ LoadConstant(0, Smi::Handle(Smi::New(7)));
1616 __ LoadConstant(1, Smi::Handle(Smi::New(3))); 1441 __ LoadConstant(1, Smi::Handle(Smi::New(3)));
1617 __ TestSmi(0, 1); 1442 __ TestSmi(0, 1);
1618 __ Jump(&branch_taken); 1443 __ Jump(&branch_taken);
1619 __ PushConstant(Bool::True()); 1444 __ PushConstant(Bool::True());
1620 __ ReturnTOS(); 1445 __ ReturnTOS();
1621 __ Bind(&branch_taken); 1446 __ Bind(&branch_taken);
1622 __ PushConstant(Bool::False()); 1447 __ PushConstant(Bool::False());
1623 __ ReturnTOS(); 1448 __ ReturnTOS();
1624 } 1449 }
1625 1450
1626
1627 ASSEMBLER_TEST_RUN(TestSmiTrue, test) { 1451 ASSEMBLER_TEST_RUN(TestSmiTrue, test) {
1628 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); 1452 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code()));
1629 } 1453 }
1630 1454
1631
1632 ASSEMBLER_TEST_GENERATE(TestSmiFalse, assembler) { 1455 ASSEMBLER_TEST_GENERATE(TestSmiFalse, assembler) {
1633 Label branch_taken; 1456 Label branch_taken;
1634 __ Frame(2); 1457 __ Frame(2);
1635 __ LoadConstant(0, Smi::Handle(Smi::New(8))); 1458 __ LoadConstant(0, Smi::Handle(Smi::New(8)));
1636 __ LoadConstant(1, Smi::Handle(Smi::New(4))); 1459 __ LoadConstant(1, Smi::Handle(Smi::New(4)));
1637 __ TestSmi(0, 1); 1460 __ TestSmi(0, 1);
1638 __ Jump(&branch_taken); 1461 __ Jump(&branch_taken);
1639 __ PushConstant(Bool::True()); 1462 __ PushConstant(Bool::True());
1640 __ ReturnTOS(); 1463 __ ReturnTOS();
1641 __ Bind(&branch_taken); 1464 __ Bind(&branch_taken);
1642 __ PushConstant(Bool::False()); 1465 __ PushConstant(Bool::False());
1643 __ ReturnTOS(); 1466 __ ReturnTOS();
1644 } 1467 }
1645 1468
1646
1647 ASSEMBLER_TEST_RUN(TestSmiFalse, test) { 1469 ASSEMBLER_TEST_RUN(TestSmiFalse, test) {
1648 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); 1470 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code()));
1649 } 1471 }
1650 1472
1651
1652 // - TestCids rA, D 1473 // - TestCids rA, D
1653 // 1474 //
1654 // The next D instructions must be Nops whose D field encodes a class id. If 1475 // The next D instructions must be Nops whose D field encodes a class id. If
1655 // the class id of FP[rA] matches, jump to PC + N + 1 if the matching Nop's 1476 // the class id of FP[rA] matches, jump to PC + N + 1 if the matching Nop's
1656 // A != 0 or PC + N + 2 if the matching Nop's A = 0. If no match is found, 1477 // A != 0 or PC + N + 2 if the matching Nop's A = 0. If no match is found,
1657 // jump to PC + N. 1478 // jump to PC + N.
1658 ASSEMBLER_TEST_GENERATE(TestCidsTrue, assembler) { 1479 ASSEMBLER_TEST_GENERATE(TestCidsTrue, assembler) {
1659 Label true_branch, no_match_branch; 1480 Label true_branch, no_match_branch;
1660 __ Frame(2); 1481 __ Frame(2);
1661 __ LoadConstant(0, Object::Handle(String::New("Hi", Heap::kOld))); 1482 __ LoadConstant(0, Object::Handle(String::New("Hi", Heap::kOld)));
1662 const intptr_t num_cases = 2; 1483 const intptr_t num_cases = 2;
1663 __ TestCids(0, num_cases); 1484 __ TestCids(0, num_cases);
1664 __ Nop(0, static_cast<uint16_t>(kSmiCid)); // Smi => false 1485 __ Nop(0, static_cast<uint16_t>(kSmiCid)); // Smi => false
1665 __ Nop(1, static_cast<uint16_t>(kOneByteStringCid)); // String => true 1486 __ Nop(1, static_cast<uint16_t>(kOneByteStringCid)); // String => true
1666 __ Jump(&no_match_branch); 1487 __ Jump(&no_match_branch);
1667 __ Jump(&true_branch); 1488 __ Jump(&true_branch);
1668 __ LoadConstant(1, Smi::Handle(Smi::New(0))); // false branch 1489 __ LoadConstant(1, Smi::Handle(Smi::New(0))); // false branch
1669 __ Return(1); 1490 __ Return(1);
1670 __ Bind(&true_branch); 1491 __ Bind(&true_branch);
1671 __ LoadConstant(1, Smi::Handle(Smi::New(1))); 1492 __ LoadConstant(1, Smi::Handle(Smi::New(1)));
1672 __ Return(1); 1493 __ Return(1);
1673 __ Bind(&no_match_branch); 1494 __ Bind(&no_match_branch);
1674 __ LoadConstant(1, Smi::Handle(Smi::New(2))); 1495 __ LoadConstant(1, Smi::Handle(Smi::New(2)));
1675 __ Return(1); 1496 __ Return(1);
1676 } 1497 }
1677 1498
1678
1679 ASSEMBLER_TEST_RUN(TestCidsTrue, test) { 1499 ASSEMBLER_TEST_RUN(TestCidsTrue, test) {
1680 EXPECT_EQ(1, EXECUTE_TEST_CODE_INTPTR(test->code())); 1500 EXPECT_EQ(1, EXECUTE_TEST_CODE_INTPTR(test->code()));
1681 } 1501 }
1682 1502
1683
1684 ASSEMBLER_TEST_GENERATE(TestCidsFalse, assembler) { 1503 ASSEMBLER_TEST_GENERATE(TestCidsFalse, assembler) {
1685 Label true_branch, no_match_branch; 1504 Label true_branch, no_match_branch;
1686 __ Frame(2); 1505 __ Frame(2);
1687 __ LoadConstant(0, Object::Handle(Smi::New(42))); 1506 __ LoadConstant(0, Object::Handle(Smi::New(42)));
1688 const intptr_t num_cases = 2; 1507 const intptr_t num_cases = 2;
1689 __ TestCids(0, num_cases); 1508 __ TestCids(0, num_cases);
1690 __ Nop(0, static_cast<uint16_t>(kSmiCid)); // Smi => false 1509 __ Nop(0, static_cast<uint16_t>(kSmiCid)); // Smi => false
1691 __ Nop(1, static_cast<uint16_t>(kOneByteStringCid)); // String => true 1510 __ Nop(1, static_cast<uint16_t>(kOneByteStringCid)); // String => true
1692 __ Jump(&no_match_branch); 1511 __ Jump(&no_match_branch);
1693 __ Jump(&true_branch); 1512 __ Jump(&true_branch);
1694 __ LoadConstant(1, Smi::Handle(Smi::New(0))); // false branch 1513 __ LoadConstant(1, Smi::Handle(Smi::New(0))); // false branch
1695 __ Return(1); 1514 __ Return(1);
1696 __ Bind(&true_branch); 1515 __ Bind(&true_branch);
1697 __ LoadConstant(1, Smi::Handle(Smi::New(1))); 1516 __ LoadConstant(1, Smi::Handle(Smi::New(1)));
1698 __ Return(1); 1517 __ Return(1);
1699 __ Bind(&no_match_branch); 1518 __ Bind(&no_match_branch);
1700 __ LoadConstant(1, Smi::Handle(Smi::New(2))); 1519 __ LoadConstant(1, Smi::Handle(Smi::New(2)));
1701 __ Return(1); 1520 __ Return(1);
1702 } 1521 }
1703 1522
1704
1705 ASSEMBLER_TEST_RUN(TestCidsFalse, test) { 1523 ASSEMBLER_TEST_RUN(TestCidsFalse, test) {
1706 EXPECT_EQ(0, EXECUTE_TEST_CODE_INTPTR(test->code())); 1524 EXPECT_EQ(0, EXECUTE_TEST_CODE_INTPTR(test->code()));
1707 } 1525 }
1708 1526
1709
1710 ASSEMBLER_TEST_GENERATE(TestCidsNoMatch, assembler) { 1527 ASSEMBLER_TEST_GENERATE(TestCidsNoMatch, assembler) {
1711 Label true_branch, no_match_branch; 1528 Label true_branch, no_match_branch;
1712 __ Frame(2); 1529 __ Frame(2);
1713 __ LoadConstant(0, Object::Handle(Array::New(1, Heap::kOld))); 1530 __ LoadConstant(0, Object::Handle(Array::New(1, Heap::kOld)));
1714 const intptr_t num_cases = 2; 1531 const intptr_t num_cases = 2;
1715 __ TestCids(0, num_cases); 1532 __ TestCids(0, num_cases);
1716 __ Nop(0, static_cast<uint16_t>(kSmiCid)); // Smi => false 1533 __ Nop(0, static_cast<uint16_t>(kSmiCid)); // Smi => false
1717 __ Nop(1, static_cast<uint16_t>(kOneByteStringCid)); // String => true 1534 __ Nop(1, static_cast<uint16_t>(kOneByteStringCid)); // String => true
1718 __ Jump(&no_match_branch); 1535 __ Jump(&no_match_branch);
1719 __ Jump(&true_branch); 1536 __ Jump(&true_branch);
1720 __ LoadConstant(1, Smi::Handle(Smi::New(0))); // false branch 1537 __ LoadConstant(1, Smi::Handle(Smi::New(0))); // false branch
1721 __ Return(1); 1538 __ Return(1);
1722 __ Bind(&true_branch); 1539 __ Bind(&true_branch);
1723 __ LoadConstant(1, Smi::Handle(Smi::New(1))); 1540 __ LoadConstant(1, Smi::Handle(Smi::New(1)));
1724 __ Return(1); 1541 __ Return(1);
1725 __ Bind(&no_match_branch); 1542 __ Bind(&no_match_branch);
1726 __ LoadConstant(1, Smi::Handle(Smi::New(2))); 1543 __ LoadConstant(1, Smi::Handle(Smi::New(2)));
1727 __ Return(1); 1544 __ Return(1);
1728 } 1545 }
1729 1546
1730
1731 ASSEMBLER_TEST_RUN(TestCidsNoMatch, test) { 1547 ASSEMBLER_TEST_RUN(TestCidsNoMatch, test) {
1732 EXPECT_EQ(2, EXECUTE_TEST_CODE_INTPTR(test->code())); 1548 EXPECT_EQ(2, EXECUTE_TEST_CODE_INTPTR(test->code()));
1733 } 1549 }
1734 1550
1735
1736 // - CheckSmi rA 1551 // - CheckSmi rA
1737 // 1552 //
1738 // If FP[rA] is a Smi, then skip the next instruction. 1553 // If FP[rA] is a Smi, then skip the next instruction.
1739 ASSEMBLER_TEST_GENERATE(CheckSmiPass, assembler) { 1554 ASSEMBLER_TEST_GENERATE(CheckSmiPass, assembler) {
1740 __ Frame(1); 1555 __ Frame(1);
1741 __ PushConstant(Smi::Handle(Smi::New(42))); 1556 __ PushConstant(Smi::Handle(Smi::New(42)));
1742 __ LoadConstant(0, Smi::Handle(Smi::New(0))); 1557 __ LoadConstant(0, Smi::Handle(Smi::New(0)));
1743 __ CheckSmi(0); 1558 __ CheckSmi(0);
1744 __ PushConstant(Smi::Handle(Smi::New(-1))); 1559 __ PushConstant(Smi::Handle(Smi::New(-1)));
1745 __ ReturnTOS(); 1560 __ ReturnTOS();
1746 } 1561 }
1747 1562
1748
1749 ASSEMBLER_TEST_RUN(CheckSmiPass, test) { 1563 ASSEMBLER_TEST_RUN(CheckSmiPass, test) {
1750 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1564 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1751 } 1565 }
1752 1566
1753
1754 ASSEMBLER_TEST_GENERATE(CheckSmiFail, assembler) { 1567 ASSEMBLER_TEST_GENERATE(CheckSmiFail, assembler) {
1755 __ Frame(1); 1568 __ Frame(1);
1756 __ PushConstant(Smi::Handle(Smi::New(-1))); 1569 __ PushConstant(Smi::Handle(Smi::New(-1)));
1757 __ LoadConstant(0, Bool::True()); 1570 __ LoadConstant(0, Bool::True());
1758 __ CheckSmi(0); 1571 __ CheckSmi(0);
1759 __ PushConstant(Smi::Handle(Smi::New(42))); 1572 __ PushConstant(Smi::Handle(Smi::New(42)));
1760 __ ReturnTOS(); 1573 __ ReturnTOS();
1761 } 1574 }
1762 1575
1763
1764 ASSEMBLER_TEST_RUN(CheckSmiFail, test) { 1576 ASSEMBLER_TEST_RUN(CheckSmiFail, test) {
1765 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1577 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1766 } 1578 }
1767 1579
1768
1769 // - CheckClassId rA, D 1580 // - CheckClassId rA, D
1770 // 1581 //
1771 // If the object at FP[rA]'s class id matches the class id in PP[D], then 1582 // If the object at FP[rA]'s class id matches the class id in PP[D], then
1772 // skip the following instruction. 1583 // skip the following instruction.
1773 ASSEMBLER_TEST_GENERATE(CheckClassIdSmiPass, assembler) { 1584 ASSEMBLER_TEST_GENERATE(CheckClassIdSmiPass, assembler) {
1774 __ Frame(2); 1585 __ Frame(2);
1775 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1586 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
1776 __ LoadClassId(1, 0); 1587 __ LoadClassId(1, 0);
1777 __ CheckClassId(1, kSmiCid); 1588 __ CheckClassId(1, kSmiCid);
1778 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1589 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
1779 __ Return(0); 1590 __ Return(0);
1780 } 1591 }
1781 1592
1782
1783 ASSEMBLER_TEST_RUN(CheckClassIdSmiPass, test) { 1593 ASSEMBLER_TEST_RUN(CheckClassIdSmiPass, test) {
1784 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1594 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1785 } 1595 }
1786 1596
1787
1788 ASSEMBLER_TEST_GENERATE(CheckClassIdNonSmiPass, assembler) { 1597 ASSEMBLER_TEST_GENERATE(CheckClassIdNonSmiPass, assembler) {
1789 __ Frame(2); 1598 __ Frame(2);
1790 __ LoadConstant(0, Bool::True()); 1599 __ LoadConstant(0, Bool::True());
1791 __ LoadClassId(1, 0); 1600 __ LoadClassId(1, 0);
1792 __ CheckClassId(1, kBoolCid); 1601 __ CheckClassId(1, kBoolCid);
1793 __ LoadConstant(0, Bool::False()); 1602 __ LoadConstant(0, Bool::False());
1794 __ Return(0); 1603 __ Return(0);
1795 } 1604 }
1796 1605
1797
1798 ASSEMBLER_TEST_RUN(CheckClassIdNonSmiPass, test) { 1606 ASSEMBLER_TEST_RUN(CheckClassIdNonSmiPass, test) {
1799 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); 1607 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code()));
1800 } 1608 }
1801 1609
1802
1803 ASSEMBLER_TEST_GENERATE(CheckClassIdFail, assembler) { 1610 ASSEMBLER_TEST_GENERATE(CheckClassIdFail, assembler) {
1804 __ Frame(2); 1611 __ Frame(2);
1805 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1612 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
1806 __ LoadClassId(1, 0); 1613 __ LoadClassId(1, 0);
1807 __ CheckClassId(1, kBoolCid); 1614 __ CheckClassId(1, kBoolCid);
1808 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1615 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
1809 __ Return(0); 1616 __ Return(0);
1810 } 1617 }
1811 1618
1812
1813 ASSEMBLER_TEST_RUN(CheckClassIdFail, test) { 1619 ASSEMBLER_TEST_RUN(CheckClassIdFail, test) {
1814 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1620 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1815 } 1621 }
1816 1622
1817
1818 // - If<Cond>Null rA 1623 // - If<Cond>Null rA
1819 // 1624 //
1820 // Cond is Eq or Ne. Skips the next instruction unless the given condition 1625 // Cond is Eq or Ne. Skips the next instruction unless the given condition
1821 // holds. 1626 // holds.
1822 ASSEMBLER_TEST_GENERATE(IfEqNullNotNull, assembler) { 1627 ASSEMBLER_TEST_GENERATE(IfEqNullNotNull, assembler) {
1823 __ Frame(2); 1628 __ Frame(2);
1824 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1629 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
1825 __ LoadConstant(1, Smi::Handle(Smi::New(42))); 1630 __ LoadConstant(1, Smi::Handle(Smi::New(42)));
1826 __ IfEqNull(0); 1631 __ IfEqNull(0);
1827 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 1632 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
1828 __ Return(1); 1633 __ Return(1);
1829 } 1634 }
1830 1635
1831
1832 ASSEMBLER_TEST_RUN(IfEqNullNotNull, test) { 1636 ASSEMBLER_TEST_RUN(IfEqNullNotNull, test) {
1833 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1637 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1834 } 1638 }
1835 1639
1836
1837 ASSEMBLER_TEST_GENERATE(IfEqNullIsNull, assembler) { 1640 ASSEMBLER_TEST_GENERATE(IfEqNullIsNull, assembler) {
1838 __ Frame(2); 1641 __ Frame(2);
1839 __ LoadConstant(0, Object::null_object()); 1642 __ LoadConstant(0, Object::null_object());
1840 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 1643 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
1841 __ IfEqNull(0); 1644 __ IfEqNull(0);
1842 __ LoadConstant(1, Smi::Handle(Smi::New(42))); 1645 __ LoadConstant(1, Smi::Handle(Smi::New(42)));
1843 __ Return(1); 1646 __ Return(1);
1844 } 1647 }
1845 1648
1846
1847 ASSEMBLER_TEST_RUN(IfEqNullIsNull, test) { 1649 ASSEMBLER_TEST_RUN(IfEqNullIsNull, test) {
1848 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1650 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1849 } 1651 }
1850 1652
1851
1852 ASSEMBLER_TEST_GENERATE(IfNeNullIsNull, assembler) { 1653 ASSEMBLER_TEST_GENERATE(IfNeNullIsNull, assembler) {
1853 __ Frame(2); 1654 __ Frame(2);
1854 __ LoadConstant(0, Object::null_object()); 1655 __ LoadConstant(0, Object::null_object());
1855 __ LoadConstant(1, Smi::Handle(Smi::New(42))); 1656 __ LoadConstant(1, Smi::Handle(Smi::New(42)));
1856 __ IfNeNull(0); 1657 __ IfNeNull(0);
1857 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 1658 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
1858 __ Return(1); 1659 __ Return(1);
1859 } 1660 }
1860 1661
1861
1862 ASSEMBLER_TEST_RUN(IfNeNullIsNull, test) { 1662 ASSEMBLER_TEST_RUN(IfNeNullIsNull, test) {
1863 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1663 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1864 } 1664 }
1865 1665
1866
1867 ASSEMBLER_TEST_GENERATE(IfNeNullNotNull, assembler) { 1666 ASSEMBLER_TEST_GENERATE(IfNeNullNotNull, assembler) {
1868 __ Frame(2); 1667 __ Frame(2);
1869 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1668 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
1870 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 1669 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
1871 __ IfNeNull(0); 1670 __ IfNeNull(0);
1872 __ LoadConstant(1, Smi::Handle(Smi::New(42))); 1671 __ LoadConstant(1, Smi::Handle(Smi::New(42)));
1873 __ Return(1); 1672 __ Return(1);
1874 } 1673 }
1875 1674
1876
1877 ASSEMBLER_TEST_RUN(IfNeNullNotNull, test) { 1675 ASSEMBLER_TEST_RUN(IfNeNullNotNull, test) {
1878 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1676 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1879 } 1677 }
1880 1678
1881 // - If<Cond> rA, rD 1679 // - If<Cond> rA, rD
1882 // 1680 //
1883 // Cond is Le, Lt, Ge, Gt, unsigned variants ULe, ULt, UGe, UGt, and 1681 // Cond is Le, Lt, Ge, Gt, unsigned variants ULe, ULt, UGe, UGt, and
1884 // unboxed double variants DEq, DNe, DLe, DLt, DGe, DGt. 1682 // unboxed double variants DEq, DNe, DLe, DLt, DGe, DGt.
1885 // Skips the next instruction unless FP[rA] <Cond> FP[rD]. Assumes that 1683 // Skips the next instruction unless FP[rA] <Cond> FP[rD]. Assumes that
1886 // FP[rA] and FP[rD] are Smis or unboxed doubles as indicated by <Cond>. 1684 // FP[rA] and FP[rD] are Smis or unboxed doubles as indicated by <Cond>.
1887 ASSEMBLER_TEST_GENERATE(IfLeTrue, assembler) { 1685 ASSEMBLER_TEST_GENERATE(IfLeTrue, assembler) {
1888 __ Frame(3); 1686 __ Frame(3);
1889 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1687 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
1890 __ LoadConstant(1, Smi::Handle(Smi::New(-5))); 1688 __ LoadConstant(1, Smi::Handle(Smi::New(-5)));
1891 __ LoadConstant(2, Smi::Handle(Smi::New(100))); 1689 __ LoadConstant(2, Smi::Handle(Smi::New(100)));
1892 __ IfLe(1, 2); 1690 __ IfLe(1, 2);
1893 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1691 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
1894 __ Return(0); 1692 __ Return(0);
1895 } 1693 }
1896 1694
1897
1898 ASSEMBLER_TEST_RUN(IfLeTrue, test) { 1695 ASSEMBLER_TEST_RUN(IfLeTrue, test) {
1899 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1696 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1900 } 1697 }
1901 1698
1902
1903 ASSEMBLER_TEST_GENERATE(IfLeFalse, assembler) { 1699 ASSEMBLER_TEST_GENERATE(IfLeFalse, assembler) {
1904 __ Frame(3); 1700 __ Frame(3);
1905 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1701 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
1906 __ LoadConstant(1, Smi::Handle(Smi::New(100))); 1702 __ LoadConstant(1, Smi::Handle(Smi::New(100)));
1907 __ LoadConstant(2, Smi::Handle(Smi::New(-5))); 1703 __ LoadConstant(2, Smi::Handle(Smi::New(-5)));
1908 __ IfLe(1, 2); 1704 __ IfLe(1, 2);
1909 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1705 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
1910 __ Return(0); 1706 __ Return(0);
1911 } 1707 }
1912 1708
1913
1914 ASSEMBLER_TEST_RUN(IfLeFalse, test) { 1709 ASSEMBLER_TEST_RUN(IfLeFalse, test) {
1915 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1710 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1916 } 1711 }
1917 1712
1918
1919 ASSEMBLER_TEST_GENERATE(IfLtTrue, assembler) { 1713 ASSEMBLER_TEST_GENERATE(IfLtTrue, assembler) {
1920 __ Frame(3); 1714 __ Frame(3);
1921 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1715 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
1922 __ LoadConstant(1, Smi::Handle(Smi::New(-5))); 1716 __ LoadConstant(1, Smi::Handle(Smi::New(-5)));
1923 __ LoadConstant(2, Smi::Handle(Smi::New(100))); 1717 __ LoadConstant(2, Smi::Handle(Smi::New(100)));
1924 __ IfLt(1, 2); 1718 __ IfLt(1, 2);
1925 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1719 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
1926 __ Return(0); 1720 __ Return(0);
1927 } 1721 }
1928 1722
1929
1930 ASSEMBLER_TEST_RUN(IfLtTrue, test) { 1723 ASSEMBLER_TEST_RUN(IfLtTrue, test) {
1931 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1724 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1932 } 1725 }
1933 1726
1934
1935 ASSEMBLER_TEST_GENERATE(IfLtFalse, assembler) { 1727 ASSEMBLER_TEST_GENERATE(IfLtFalse, assembler) {
1936 __ Frame(3); 1728 __ Frame(3);
1937 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1729 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
1938 __ LoadConstant(1, Smi::Handle(Smi::New(100))); 1730 __ LoadConstant(1, Smi::Handle(Smi::New(100)));
1939 __ LoadConstant(2, Smi::Handle(Smi::New(-5))); 1731 __ LoadConstant(2, Smi::Handle(Smi::New(-5)));
1940 __ IfLt(1, 2); 1732 __ IfLt(1, 2);
1941 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1733 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
1942 __ Return(0); 1734 __ Return(0);
1943 } 1735 }
1944 1736
1945
1946 ASSEMBLER_TEST_RUN(IfLtFalse, test) { 1737 ASSEMBLER_TEST_RUN(IfLtFalse, test) {
1947 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1738 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1948 } 1739 }
1949 1740
1950
1951 ASSEMBLER_TEST_GENERATE(IfGeTrue, assembler) { 1741 ASSEMBLER_TEST_GENERATE(IfGeTrue, assembler) {
1952 __ Frame(3); 1742 __ Frame(3);
1953 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1743 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
1954 __ LoadConstant(1, Smi::Handle(Smi::New(100))); 1744 __ LoadConstant(1, Smi::Handle(Smi::New(100)));
1955 __ LoadConstant(2, Smi::Handle(Smi::New(-5))); 1745 __ LoadConstant(2, Smi::Handle(Smi::New(-5)));
1956 __ IfGe(1, 2); 1746 __ IfGe(1, 2);
1957 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1747 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
1958 __ Return(0); 1748 __ Return(0);
1959 } 1749 }
1960 1750
1961
1962 ASSEMBLER_TEST_RUN(IfGeTrue, test) { 1751 ASSEMBLER_TEST_RUN(IfGeTrue, test) {
1963 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1752 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1964 } 1753 }
1965 1754
1966
1967 ASSEMBLER_TEST_GENERATE(IfGeFalse, assembler) { 1755 ASSEMBLER_TEST_GENERATE(IfGeFalse, assembler) {
1968 __ Frame(3); 1756 __ Frame(3);
1969 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1757 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
1970 __ LoadConstant(1, Smi::Handle(Smi::New(-5))); 1758 __ LoadConstant(1, Smi::Handle(Smi::New(-5)));
1971 __ LoadConstant(2, Smi::Handle(Smi::New(100))); 1759 __ LoadConstant(2, Smi::Handle(Smi::New(100)));
1972 __ IfGe(1, 2); 1760 __ IfGe(1, 2);
1973 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1761 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
1974 __ Return(0); 1762 __ Return(0);
1975 } 1763 }
1976 1764
1977
1978 ASSEMBLER_TEST_RUN(IfGeFalse, test) { 1765 ASSEMBLER_TEST_RUN(IfGeFalse, test) {
1979 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1766 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1980 } 1767 }
1981 1768
1982
1983 ASSEMBLER_TEST_GENERATE(IfGtTrue, assembler) { 1769 ASSEMBLER_TEST_GENERATE(IfGtTrue, assembler) {
1984 __ Frame(3); 1770 __ Frame(3);
1985 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1771 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
1986 __ LoadConstant(1, Smi::Handle(Smi::New(100))); 1772 __ LoadConstant(1, Smi::Handle(Smi::New(100)));
1987 __ LoadConstant(2, Smi::Handle(Smi::New(-5))); 1773 __ LoadConstant(2, Smi::Handle(Smi::New(-5)));
1988 __ IfGt(1, 2); 1774 __ IfGt(1, 2);
1989 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1775 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
1990 __ Return(0); 1776 __ Return(0);
1991 } 1777 }
1992 1778
1993
1994 ASSEMBLER_TEST_RUN(IfGtTrue, test) { 1779 ASSEMBLER_TEST_RUN(IfGtTrue, test) {
1995 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1780 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
1996 } 1781 }
1997 1782
1998
1999 ASSEMBLER_TEST_GENERATE(IfGtFalse, assembler) { 1783 ASSEMBLER_TEST_GENERATE(IfGtFalse, assembler) {
2000 __ Frame(3); 1784 __ Frame(3);
2001 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1785 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2002 __ LoadConstant(1, Smi::Handle(Smi::New(-5))); 1786 __ LoadConstant(1, Smi::Handle(Smi::New(-5)));
2003 __ LoadConstant(2, Smi::Handle(Smi::New(100))); 1787 __ LoadConstant(2, Smi::Handle(Smi::New(100)));
2004 __ IfGt(1, 2); 1788 __ IfGt(1, 2);
2005 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1789 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2006 __ Return(0); 1790 __ Return(0);
2007 } 1791 }
2008 1792
2009
2010 ASSEMBLER_TEST_RUN(IfGtFalse, test) { 1793 ASSEMBLER_TEST_RUN(IfGtFalse, test) {
2011 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1794 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2012 } 1795 }
2013 1796
2014
2015 #if defined(ARCH_IS_64_BIT) 1797 #if defined(ARCH_IS_64_BIT)
2016 ASSEMBLER_TEST_GENERATE(IfDNeTrue, assembler) { 1798 ASSEMBLER_TEST_GENERATE(IfDNeTrue, assembler) {
2017 __ Frame(3); 1799 __ Frame(3);
2018 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1800 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2019 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); 1801 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld)));
2020 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); 1802 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
2021 __ UnboxDouble(1, 1); 1803 __ UnboxDouble(1, 1);
2022 __ UnboxDouble(2, 2); 1804 __ UnboxDouble(2, 2);
2023 __ IfDNe(1, 2); 1805 __ IfDNe(1, 2);
2024 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1806 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2025 __ Return(0); 1807 __ Return(0);
2026 } 1808 }
2027 1809
2028
2029 ASSEMBLER_TEST_RUN(IfDNeTrue, test) { 1810 ASSEMBLER_TEST_RUN(IfDNeTrue, test) {
2030 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1811 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2031 } 1812 }
2032 1813
2033
2034 ASSEMBLER_TEST_GENERATE(IfDNeFalse, assembler) { 1814 ASSEMBLER_TEST_GENERATE(IfDNeFalse, assembler) {
2035 __ Frame(3); 1815 __ Frame(3);
2036 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1816 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2037 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); 1817 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld)));
2038 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld))); 1818 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld)));
2039 __ UnboxDouble(1, 1); 1819 __ UnboxDouble(1, 1);
2040 __ UnboxDouble(2, 2); 1820 __ UnboxDouble(2, 2);
2041 __ IfDNe(1, 2); 1821 __ IfDNe(1, 2);
2042 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1822 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2043 __ Return(0); 1823 __ Return(0);
2044 } 1824 }
2045 1825
2046
2047 ASSEMBLER_TEST_RUN(IfDNeFalse, test) { 1826 ASSEMBLER_TEST_RUN(IfDNeFalse, test) {
2048 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1827 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2049 } 1828 }
2050 1829
2051
2052 ASSEMBLER_TEST_GENERATE(IfDNeNan, assembler) { 1830 ASSEMBLER_TEST_GENERATE(IfDNeNan, assembler) {
2053 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL); 1831 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL);
2054 __ Frame(3); 1832 __ Frame(3);
2055 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1833 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2056 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld))); 1834 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld)));
2057 __ LoadConstant(2, Double::Handle(Double::New(not_a_number, Heap::kOld))); 1835 __ LoadConstant(2, Double::Handle(Double::New(not_a_number, Heap::kOld)));
2058 __ UnboxDouble(1, 1); 1836 __ UnboxDouble(1, 1);
2059 __ UnboxDouble(2, 2); 1837 __ UnboxDouble(2, 2);
2060 __ IfDNe(1, 2); 1838 __ IfDNe(1, 2);
2061 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1839 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2062 __ Return(0); 1840 __ Return(0);
2063 } 1841 }
2064 1842
2065
2066 ASSEMBLER_TEST_RUN(IfDNeNan, test) { 1843 ASSEMBLER_TEST_RUN(IfDNeNan, test) {
2067 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1844 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2068 } 1845 }
2069 1846
2070
2071 ASSEMBLER_TEST_GENERATE(IfDEqTrue, assembler) { 1847 ASSEMBLER_TEST_GENERATE(IfDEqTrue, assembler) {
2072 __ Frame(3); 1848 __ Frame(3);
2073 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1849 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2074 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); 1850 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld)));
2075 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld))); 1851 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld)));
2076 __ UnboxDouble(1, 1); 1852 __ UnboxDouble(1, 1);
2077 __ UnboxDouble(2, 2); 1853 __ UnboxDouble(2, 2);
2078 __ IfDEq(1, 2); 1854 __ IfDEq(1, 2);
2079 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1855 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2080 __ Return(0); 1856 __ Return(0);
2081 } 1857 }
2082 1858
2083
2084 ASSEMBLER_TEST_RUN(IfDEqTrue, test) { 1859 ASSEMBLER_TEST_RUN(IfDEqTrue, test) {
2085 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1860 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2086 } 1861 }
2087 1862
2088
2089 ASSEMBLER_TEST_GENERATE(IfDEqFalse, assembler) { 1863 ASSEMBLER_TEST_GENERATE(IfDEqFalse, assembler) {
2090 __ Frame(3); 1864 __ Frame(3);
2091 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1865 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2092 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); 1866 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld)));
2093 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); 1867 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
2094 __ UnboxDouble(1, 1); 1868 __ UnboxDouble(1, 1);
2095 __ UnboxDouble(2, 2); 1869 __ UnboxDouble(2, 2);
2096 __ IfDEq(1, 2); 1870 __ IfDEq(1, 2);
2097 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1871 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2098 __ Return(0); 1872 __ Return(0);
2099 } 1873 }
2100 1874
2101
2102 ASSEMBLER_TEST_RUN(IfDEqFalse, test) { 1875 ASSEMBLER_TEST_RUN(IfDEqFalse, test) {
2103 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1876 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2104 } 1877 }
2105 1878
2106
2107 ASSEMBLER_TEST_GENERATE(IfDEqNan, assembler) { 1879 ASSEMBLER_TEST_GENERATE(IfDEqNan, assembler) {
2108 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL); 1880 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL);
2109 __ Frame(3); 1881 __ Frame(3);
2110 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1882 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2111 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld))); 1883 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld)));
2112 __ LoadConstant(2, Double::Handle(Double::New(not_a_number, Heap::kOld))); 1884 __ LoadConstant(2, Double::Handle(Double::New(not_a_number, Heap::kOld)));
2113 __ UnboxDouble(1, 1); 1885 __ UnboxDouble(1, 1);
2114 __ UnboxDouble(2, 2); 1886 __ UnboxDouble(2, 2);
2115 __ IfDEq(1, 2); 1887 __ IfDEq(1, 2);
2116 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1888 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2117 __ Return(0); 1889 __ Return(0);
2118 } 1890 }
2119 1891
2120
2121 ASSEMBLER_TEST_RUN(IfDEqNan, test) { 1892 ASSEMBLER_TEST_RUN(IfDEqNan, test) {
2122 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1893 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2123 } 1894 }
2124 1895
2125
2126 ASSEMBLER_TEST_GENERATE(IfDLeTrue, assembler) { 1896 ASSEMBLER_TEST_GENERATE(IfDLeTrue, assembler) {
2127 __ Frame(3); 1897 __ Frame(3);
2128 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1898 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2129 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); 1899 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld)));
2130 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); 1900 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
2131 __ UnboxDouble(1, 1); 1901 __ UnboxDouble(1, 1);
2132 __ UnboxDouble(2, 2); 1902 __ UnboxDouble(2, 2);
2133 __ IfDLe(1, 2); 1903 __ IfDLe(1, 2);
2134 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1904 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2135 __ Return(0); 1905 __ Return(0);
2136 } 1906 }
2137 1907
2138
2139 ASSEMBLER_TEST_RUN(IfDLeTrue, test) { 1908 ASSEMBLER_TEST_RUN(IfDLeTrue, test) {
2140 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1909 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2141 } 1910 }
2142 1911
2143
2144 ASSEMBLER_TEST_GENERATE(IfDLeFalse, assembler) { 1912 ASSEMBLER_TEST_GENERATE(IfDLeFalse, assembler) {
2145 __ Frame(3); 1913 __ Frame(3);
2146 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1914 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2147 __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld))); 1915 __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld)));
2148 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld))); 1916 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld)));
2149 __ UnboxDouble(1, 1); 1917 __ UnboxDouble(1, 1);
2150 __ UnboxDouble(2, 2); 1918 __ UnboxDouble(2, 2);
2151 __ IfDLe(1, 2); 1919 __ IfDLe(1, 2);
2152 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1920 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2153 __ Return(0); 1921 __ Return(0);
2154 } 1922 }
2155 1923
2156
2157 ASSEMBLER_TEST_RUN(IfDLeFalse, test) { 1924 ASSEMBLER_TEST_RUN(IfDLeFalse, test) {
2158 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1925 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2159 } 1926 }
2160 1927
2161
2162 ASSEMBLER_TEST_GENERATE(IfDLeNan, assembler) { 1928 ASSEMBLER_TEST_GENERATE(IfDLeNan, assembler) {
2163 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL); 1929 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL);
2164 __ Frame(3); 1930 __ Frame(3);
2165 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1931 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2166 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld))); 1932 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld)));
2167 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); 1933 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
2168 __ UnboxDouble(1, 1); 1934 __ UnboxDouble(1, 1);
2169 __ UnboxDouble(2, 2); 1935 __ UnboxDouble(2, 2);
2170 __ IfDLe(1, 2); 1936 __ IfDLe(1, 2);
2171 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1937 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2172 __ Return(0); 1938 __ Return(0);
2173 } 1939 }
2174 1940
2175
2176 ASSEMBLER_TEST_RUN(IfDLeNan, test) { 1941 ASSEMBLER_TEST_RUN(IfDLeNan, test) {
2177 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1942 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2178 } 1943 }
2179 1944
2180
2181 ASSEMBLER_TEST_GENERATE(IfDLtTrue, assembler) { 1945 ASSEMBLER_TEST_GENERATE(IfDLtTrue, assembler) {
2182 __ Frame(3); 1946 __ Frame(3);
2183 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1947 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2184 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); 1948 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld)));
2185 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); 1949 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
2186 __ UnboxDouble(1, 1); 1950 __ UnboxDouble(1, 1);
2187 __ UnboxDouble(2, 2); 1951 __ UnboxDouble(2, 2);
2188 __ IfDLt(1, 2); 1952 __ IfDLt(1, 2);
2189 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1953 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2190 __ Return(0); 1954 __ Return(0);
2191 } 1955 }
2192 1956
2193
2194 ASSEMBLER_TEST_RUN(IfDLtTrue, test) { 1957 ASSEMBLER_TEST_RUN(IfDLtTrue, test) {
2195 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1958 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2196 } 1959 }
2197 1960
2198
2199 ASSEMBLER_TEST_GENERATE(IfDLtFalse, assembler) { 1961 ASSEMBLER_TEST_GENERATE(IfDLtFalse, assembler) {
2200 __ Frame(3); 1962 __ Frame(3);
2201 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1963 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2202 __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld))); 1964 __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld)));
2203 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld))); 1965 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld)));
2204 __ UnboxDouble(1, 1); 1966 __ UnboxDouble(1, 1);
2205 __ UnboxDouble(2, 2); 1967 __ UnboxDouble(2, 2);
2206 __ IfDLt(1, 2); 1968 __ IfDLt(1, 2);
2207 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1969 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2208 __ Return(0); 1970 __ Return(0);
2209 } 1971 }
2210 1972
2211
2212 ASSEMBLER_TEST_RUN(IfDLtFalse, test) { 1973 ASSEMBLER_TEST_RUN(IfDLtFalse, test) {
2213 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1974 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2214 } 1975 }
2215 1976
2216
2217 ASSEMBLER_TEST_GENERATE(IfDLtNan, assembler) { 1977 ASSEMBLER_TEST_GENERATE(IfDLtNan, assembler) {
2218 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL); 1978 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL);
2219 __ Frame(3); 1979 __ Frame(3);
2220 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 1980 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2221 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld))); 1981 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld)));
2222 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); 1982 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
2223 __ UnboxDouble(1, 1); 1983 __ UnboxDouble(1, 1);
2224 __ UnboxDouble(2, 2); 1984 __ UnboxDouble(2, 2);
2225 __ IfDLt(1, 2); 1985 __ IfDLt(1, 2);
2226 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1986 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2227 __ Return(0); 1987 __ Return(0);
2228 } 1988 }
2229 1989
2230
2231 ASSEMBLER_TEST_RUN(IfDLtNan, test) { 1990 ASSEMBLER_TEST_RUN(IfDLtNan, test) {
2232 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 1991 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2233 } 1992 }
2234 1993
2235
2236 ASSEMBLER_TEST_GENERATE(IfDGeTrue, assembler) { 1994 ASSEMBLER_TEST_GENERATE(IfDGeTrue, assembler) {
2237 __ Frame(3); 1995 __ Frame(3);
2238 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 1996 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2239 __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld))); 1997 __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld)));
2240 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld))); 1998 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld)));
2241 __ UnboxDouble(1, 1); 1999 __ UnboxDouble(1, 1);
2242 __ UnboxDouble(2, 2); 2000 __ UnboxDouble(2, 2);
2243 __ IfDGe(1, 2); 2001 __ IfDGe(1, 2);
2244 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 2002 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2245 __ Return(0); 2003 __ Return(0);
2246 } 2004 }
2247 2005
2248
2249 ASSEMBLER_TEST_RUN(IfDGeTrue, test) { 2006 ASSEMBLER_TEST_RUN(IfDGeTrue, test) {
2250 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2007 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2251 } 2008 }
2252 2009
2253
2254 ASSEMBLER_TEST_GENERATE(IfDGeFalse, assembler) { 2010 ASSEMBLER_TEST_GENERATE(IfDGeFalse, assembler) {
2255 __ Frame(3); 2011 __ Frame(3);
2256 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 2012 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2257 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); 2013 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld)));
2258 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); 2014 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
2259 __ UnboxDouble(1, 1); 2015 __ UnboxDouble(1, 1);
2260 __ UnboxDouble(2, 2); 2016 __ UnboxDouble(2, 2);
2261 __ IfDGe(1, 2); 2017 __ IfDGe(1, 2);
2262 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 2018 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2263 __ Return(0); 2019 __ Return(0);
2264 } 2020 }
2265 2021
2266
2267 ASSEMBLER_TEST_RUN(IfDGeFalse, test) { 2022 ASSEMBLER_TEST_RUN(IfDGeFalse, test) {
2268 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2023 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2269 } 2024 }
2270 2025
2271
2272 ASSEMBLER_TEST_GENERATE(IfDGeNan, assembler) { 2026 ASSEMBLER_TEST_GENERATE(IfDGeNan, assembler) {
2273 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL); 2027 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL);
2274 __ Frame(3); 2028 __ Frame(3);
2275 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 2029 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2276 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld))); 2030 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld)));
2277 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); 2031 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
2278 __ UnboxDouble(1, 1); 2032 __ UnboxDouble(1, 1);
2279 __ UnboxDouble(2, 2); 2033 __ UnboxDouble(2, 2);
2280 __ IfDGe(1, 2); 2034 __ IfDGe(1, 2);
2281 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 2035 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2282 __ Return(0); 2036 __ Return(0);
2283 } 2037 }
2284 2038
2285
2286 ASSEMBLER_TEST_RUN(IfDGeNan, test) { 2039 ASSEMBLER_TEST_RUN(IfDGeNan, test) {
2287 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2040 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2288 } 2041 }
2289 2042
2290
2291 ASSEMBLER_TEST_GENERATE(IfDGtTrue, assembler) { 2043 ASSEMBLER_TEST_GENERATE(IfDGtTrue, assembler) {
2292 __ Frame(3); 2044 __ Frame(3);
2293 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 2045 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2294 __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld))); 2046 __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld)));
2295 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld))); 2047 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld)));
2296 __ UnboxDouble(1, 1); 2048 __ UnboxDouble(1, 1);
2297 __ UnboxDouble(2, 2); 2049 __ UnboxDouble(2, 2);
2298 __ IfDGt(1, 2); 2050 __ IfDGt(1, 2);
2299 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 2051 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2300 __ Return(0); 2052 __ Return(0);
2301 } 2053 }
2302 2054
2303
2304 ASSEMBLER_TEST_RUN(IfDGtTrue, test) { 2055 ASSEMBLER_TEST_RUN(IfDGtTrue, test) {
2305 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2056 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2306 } 2057 }
2307 2058
2308
2309 ASSEMBLER_TEST_GENERATE(IfDGtFalse, assembler) { 2059 ASSEMBLER_TEST_GENERATE(IfDGtFalse, assembler) {
2310 __ Frame(3); 2060 __ Frame(3);
2311 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 2061 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2312 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); 2062 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld)));
2313 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); 2063 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
2314 __ UnboxDouble(1, 1); 2064 __ UnboxDouble(1, 1);
2315 __ UnboxDouble(2, 2); 2065 __ UnboxDouble(2, 2);
2316 __ IfDGt(1, 2); 2066 __ IfDGt(1, 2);
2317 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 2067 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2318 __ Return(0); 2068 __ Return(0);
2319 } 2069 }
2320 2070
2321
2322 ASSEMBLER_TEST_RUN(IfDGtFalse, test) { 2071 ASSEMBLER_TEST_RUN(IfDGtFalse, test) {
2323 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2072 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2324 } 2073 }
2325 2074
2326
2327 ASSEMBLER_TEST_GENERATE(IfDGtNan, assembler) { 2075 ASSEMBLER_TEST_GENERATE(IfDGtNan, assembler) {
2328 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL); 2076 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL);
2329 __ Frame(3); 2077 __ Frame(3);
2330 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 2078 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2331 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld))); 2079 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld)));
2332 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); 2080 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld)));
2333 __ UnboxDouble(1, 1); 2081 __ UnboxDouble(1, 1);
2334 __ UnboxDouble(2, 2); 2082 __ UnboxDouble(2, 2);
2335 __ IfDGt(1, 2); 2083 __ IfDGt(1, 2);
2336 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 2084 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2337 __ Return(0); 2085 __ Return(0);
2338 } 2086 }
2339 2087
2340
2341 ASSEMBLER_TEST_RUN(IfDGtNan, test) { 2088 ASSEMBLER_TEST_RUN(IfDGtNan, test) {
2342 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2089 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2343 } 2090 }
2344 #endif // defined(ARCH_IS_64_BIT) 2091 #endif // defined(ARCH_IS_64_BIT)
2345 2092
2346
2347 ASSEMBLER_TEST_GENERATE(IfULeTrue, assembler) { 2093 ASSEMBLER_TEST_GENERATE(IfULeTrue, assembler) {
2348 __ Frame(3); 2094 __ Frame(3);
2349 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 2095 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2350 __ LoadConstant(1, Smi::Handle(Smi::New(5))); 2096 __ LoadConstant(1, Smi::Handle(Smi::New(5)));
2351 __ LoadConstant(2, Smi::Handle(Smi::New(100))); 2097 __ LoadConstant(2, Smi::Handle(Smi::New(100)));
2352 __ IfULe(1, 2); 2098 __ IfULe(1, 2);
2353 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 2099 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2354 __ Return(0); 2100 __ Return(0);
2355 } 2101 }
2356 2102
2357
2358 ASSEMBLER_TEST_RUN(IfULeTrue, test) { 2103 ASSEMBLER_TEST_RUN(IfULeTrue, test) {
2359 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2104 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2360 } 2105 }
2361 2106
2362
2363 ASSEMBLER_TEST_GENERATE(IfULeFalse, assembler) { 2107 ASSEMBLER_TEST_GENERATE(IfULeFalse, assembler) {
2364 __ Frame(3); 2108 __ Frame(3);
2365 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 2109 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2366 __ LoadConstant(1, Smi::Handle(Smi::New(100))); 2110 __ LoadConstant(1, Smi::Handle(Smi::New(100)));
2367 __ LoadConstant(2, Smi::Handle(Smi::New(5))); 2111 __ LoadConstant(2, Smi::Handle(Smi::New(5)));
2368 __ IfULe(1, 2); 2112 __ IfULe(1, 2);
2369 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 2113 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2370 __ Return(0); 2114 __ Return(0);
2371 } 2115 }
2372 2116
2373
2374 ASSEMBLER_TEST_RUN(IfULeFalse, test) { 2117 ASSEMBLER_TEST_RUN(IfULeFalse, test) {
2375 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2118 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2376 } 2119 }
2377 2120
2378
2379 ASSEMBLER_TEST_GENERATE(IfULeNegTrue, assembler) { 2121 ASSEMBLER_TEST_GENERATE(IfULeNegTrue, assembler) {
2380 __ Frame(3); 2122 __ Frame(3);
2381 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 2123 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2382 __ LoadConstant(1, Smi::Handle(Smi::New(5))); 2124 __ LoadConstant(1, Smi::Handle(Smi::New(5)));
2383 __ LoadConstant(2, Smi::Handle(Smi::New(-5))); 2125 __ LoadConstant(2, Smi::Handle(Smi::New(-5)));
2384 __ IfULe(1, 2); 2126 __ IfULe(1, 2);
2385 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 2127 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2386 __ Return(0); 2128 __ Return(0);
2387 } 2129 }
2388 2130
2389
2390 ASSEMBLER_TEST_RUN(IfULeNegTrue, test) { 2131 ASSEMBLER_TEST_RUN(IfULeNegTrue, test) {
2391 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2132 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2392 } 2133 }
2393 2134
2394
2395 ASSEMBLER_TEST_GENERATE(IfULtTrue, assembler) { 2135 ASSEMBLER_TEST_GENERATE(IfULtTrue, assembler) {
2396 __ Frame(3); 2136 __ Frame(3);
2397 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 2137 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2398 __ LoadConstant(1, Smi::Handle(Smi::New(5))); 2138 __ LoadConstant(1, Smi::Handle(Smi::New(5)));
2399 __ LoadConstant(2, Smi::Handle(Smi::New(100))); 2139 __ LoadConstant(2, Smi::Handle(Smi::New(100)));
2400 __ IfULt(1, 2); 2140 __ IfULt(1, 2);
2401 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 2141 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2402 __ Return(0); 2142 __ Return(0);
2403 } 2143 }
2404 2144
2405
2406 ASSEMBLER_TEST_RUN(IfULtTrue, test) { 2145 ASSEMBLER_TEST_RUN(IfULtTrue, test) {
2407 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2146 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2408 } 2147 }
2409 2148
2410
2411 ASSEMBLER_TEST_GENERATE(IfULtFalse, assembler) { 2149 ASSEMBLER_TEST_GENERATE(IfULtFalse, assembler) {
2412 __ Frame(3); 2150 __ Frame(3);
2413 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 2151 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2414 __ LoadConstant(1, Smi::Handle(Smi::New(100))); 2152 __ LoadConstant(1, Smi::Handle(Smi::New(100)));
2415 __ LoadConstant(2, Smi::Handle(Smi::New(5))); 2153 __ LoadConstant(2, Smi::Handle(Smi::New(5)));
2416 __ IfULt(1, 2); 2154 __ IfULt(1, 2);
2417 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 2155 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2418 __ Return(0); 2156 __ Return(0);
2419 } 2157 }
2420 2158
2421
2422 ASSEMBLER_TEST_RUN(IfULtFalse, test) { 2159 ASSEMBLER_TEST_RUN(IfULtFalse, test) {
2423 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2160 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2424 } 2161 }
2425 2162
2426
2427 ASSEMBLER_TEST_GENERATE(IfUGeTrue, assembler) { 2163 ASSEMBLER_TEST_GENERATE(IfUGeTrue, assembler) {
2428 __ Frame(3); 2164 __ Frame(3);
2429 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 2165 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2430 __ LoadConstant(1, Smi::Handle(Smi::New(100))); 2166 __ LoadConstant(1, Smi::Handle(Smi::New(100)));
2431 __ LoadConstant(2, Smi::Handle(Smi::New(5))); 2167 __ LoadConstant(2, Smi::Handle(Smi::New(5)));
2432 __ IfUGe(1, 2); 2168 __ IfUGe(1, 2);
2433 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 2169 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2434 __ Return(0); 2170 __ Return(0);
2435 } 2171 }
2436 2172
2437
2438 ASSEMBLER_TEST_RUN(IfUGeTrue, test) { 2173 ASSEMBLER_TEST_RUN(IfUGeTrue, test) {
2439 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2174 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2440 } 2175 }
2441 2176
2442
2443 ASSEMBLER_TEST_GENERATE(IfUGeFalse, assembler) { 2177 ASSEMBLER_TEST_GENERATE(IfUGeFalse, assembler) {
2444 __ Frame(3); 2178 __ Frame(3);
2445 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 2179 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2446 __ LoadConstant(1, Smi::Handle(Smi::New(5))); 2180 __ LoadConstant(1, Smi::Handle(Smi::New(5)));
2447 __ LoadConstant(2, Smi::Handle(Smi::New(100))); 2181 __ LoadConstant(2, Smi::Handle(Smi::New(100)));
2448 __ IfUGe(1, 2); 2182 __ IfUGe(1, 2);
2449 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 2183 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2450 __ Return(0); 2184 __ Return(0);
2451 } 2185 }
2452 2186
2453
2454 ASSEMBLER_TEST_RUN(IfUGeFalse, test) { 2187 ASSEMBLER_TEST_RUN(IfUGeFalse, test) {
2455 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2188 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2456 } 2189 }
2457 2190
2458
2459 ASSEMBLER_TEST_GENERATE(IfUGtTrue, assembler) { 2191 ASSEMBLER_TEST_GENERATE(IfUGtTrue, assembler) {
2460 __ Frame(3); 2192 __ Frame(3);
2461 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 2193 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2462 __ LoadConstant(1, Smi::Handle(Smi::New(100))); 2194 __ LoadConstant(1, Smi::Handle(Smi::New(100)));
2463 __ LoadConstant(2, Smi::Handle(Smi::New(5))); 2195 __ LoadConstant(2, Smi::Handle(Smi::New(5)));
2464 __ IfUGt(1, 2); 2196 __ IfUGt(1, 2);
2465 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 2197 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2466 __ Return(0); 2198 __ Return(0);
2467 } 2199 }
2468 2200
2469
2470 ASSEMBLER_TEST_RUN(IfUGtTrue, test) { 2201 ASSEMBLER_TEST_RUN(IfUGtTrue, test) {
2471 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2202 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2472 } 2203 }
2473 2204
2474
2475 ASSEMBLER_TEST_GENERATE(IfUGtFalse, assembler) { 2205 ASSEMBLER_TEST_GENERATE(IfUGtFalse, assembler) {
2476 __ Frame(3); 2206 __ Frame(3);
2477 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 2207 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2478 __ LoadConstant(1, Smi::Handle(Smi::New(5))); 2208 __ LoadConstant(1, Smi::Handle(Smi::New(5)));
2479 __ LoadConstant(2, Smi::Handle(Smi::New(100))); 2209 __ LoadConstant(2, Smi::Handle(Smi::New(100)));
2480 __ IfUGt(1, 2); 2210 __ IfUGt(1, 2);
2481 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); 2211 __ LoadConstant(0, Smi::Handle(Smi::New(-1)));
2482 __ Return(0); 2212 __ Return(0);
2483 } 2213 }
2484 2214
2485
2486 ASSEMBLER_TEST_RUN(IfUGtFalse, test) { 2215 ASSEMBLER_TEST_RUN(IfUGtFalse, test) {
2487 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2216 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2488 } 2217 }
2489 2218
2490
2491 // - Min, Max rA, rB, rC 2219 // - Min, Max rA, rB, rC
2492 // 2220 //
2493 // FP[rA] <- {min, max}(FP[rB], FP[rC]). Assumes that FP[rB], and FP[rC] are 2221 // FP[rA] <- {min, max}(FP[rB], FP[rC]). Assumes that FP[rB], and FP[rC] are
2494 // Smis. 2222 // Smis.
2495 ASSEMBLER_TEST_GENERATE(Min, assembler) { 2223 ASSEMBLER_TEST_GENERATE(Min, assembler) {
2496 __ Frame(3); 2224 __ Frame(3);
2497 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 2225 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2498 __ LoadConstant(1, Smi::Handle(Smi::New(500))); 2226 __ LoadConstant(1, Smi::Handle(Smi::New(500)));
2499 __ Min(2, 0, 1); 2227 __ Min(2, 0, 1);
2500 __ Return(2); 2228 __ Return(2);
2501 } 2229 }
2502 2230
2503
2504 ASSEMBLER_TEST_RUN(Min, test) { 2231 ASSEMBLER_TEST_RUN(Min, test) {
2505 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2232 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2506 } 2233 }
2507 2234
2508
2509 ASSEMBLER_TEST_GENERATE(Max, assembler) { 2235 ASSEMBLER_TEST_GENERATE(Max, assembler) {
2510 __ Frame(3); 2236 __ Frame(3);
2511 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 2237 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2512 __ LoadConstant(1, Smi::Handle(Smi::New(5))); 2238 __ LoadConstant(1, Smi::Handle(Smi::New(5)));
2513 __ Max(2, 0, 1); 2239 __ Max(2, 0, 1);
2514 __ Return(2); 2240 __ Return(2);
2515 } 2241 }
2516 2242
2517
2518 ASSEMBLER_TEST_RUN(Max, test) { 2243 ASSEMBLER_TEST_RUN(Max, test) {
2519 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2244 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2520 } 2245 }
2521 2246
2522
2523 #if defined(ARCH_IS_64_BIT) 2247 #if defined(ARCH_IS_64_BIT)
2524 // - UnboxDouble rA, rD 2248 // - UnboxDouble rA, rD
2525 // 2249 //
2526 // Unbox the double in FP[rD] into FP[rA]. Assumes FP[rD] is a double. 2250 // Unbox the double in FP[rD] into FP[rA]. Assumes FP[rD] is a double.
2527 // 2251 //
2528 // - CheckedUnboxDouble rA, rD 2252 // - CheckedUnboxDouble rA, rD
2529 // 2253 //
2530 // Unboxes FP[rD] into FP[rA] and skips the following instruction unless 2254 // Unboxes FP[rD] into FP[rA] and skips the following instruction unless
2531 // FP[rD] is not a double or a Smi. When FP[rD] is a Smi, converts it to a 2255 // FP[rD] is not a double or a Smi. When FP[rD] is a Smi, converts it to a
2532 // double. 2256 // double.
2533 ASSEMBLER_TEST_GENERATE(Unbox, assembler) { 2257 ASSEMBLER_TEST_GENERATE(Unbox, assembler) {
2534 __ Frame(2); 2258 __ Frame(2);
2535 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld))); 2259 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld)));
2536 __ UnboxDouble(1, 0); 2260 __ UnboxDouble(1, 0);
2537 __ Return(1); 2261 __ Return(1);
2538 } 2262 }
2539 2263
2540
2541 ASSEMBLER_TEST_RUN(Unbox, test) { 2264 ASSEMBLER_TEST_RUN(Unbox, test) {
2542 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); 2265 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
2543 } 2266 }
2544 2267
2545
2546 ASSEMBLER_TEST_GENERATE(CheckedUnboxDouble, assembler) { 2268 ASSEMBLER_TEST_GENERATE(CheckedUnboxDouble, assembler) {
2547 __ Frame(2); 2269 __ Frame(2);
2548 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld))); 2270 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld)));
2549 __ CheckedUnboxDouble(1, 0); 2271 __ CheckedUnboxDouble(1, 0);
2550 __ LoadConstant(1, Smi::Handle(Smi::New(0))); 2272 __ LoadConstant(1, Smi::Handle(Smi::New(0)));
2551 __ Return(1); 2273 __ Return(1);
2552 } 2274 }
2553 2275
2554
2555 ASSEMBLER_TEST_RUN(CheckedUnboxDouble, test) { 2276 ASSEMBLER_TEST_RUN(CheckedUnboxDouble, test) {
2556 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); 2277 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
2557 } 2278 }
2558 2279
2559
2560 ASSEMBLER_TEST_GENERATE(CheckedUnboxSmi, assembler) { 2280 ASSEMBLER_TEST_GENERATE(CheckedUnboxSmi, assembler) {
2561 __ Frame(2); 2281 __ Frame(2);
2562 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 2282 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2563 __ CheckedUnboxDouble(1, 0); 2283 __ CheckedUnboxDouble(1, 0);
2564 __ LoadConstant(1, Smi::Handle(Smi::New(0))); 2284 __ LoadConstant(1, Smi::Handle(Smi::New(0)));
2565 __ Return(1); 2285 __ Return(1);
2566 } 2286 }
2567 2287
2568
2569 ASSEMBLER_TEST_RUN(CheckedUnboxSmi, test) { 2288 ASSEMBLER_TEST_RUN(CheckedUnboxSmi, test) {
2570 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); 2289 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
2571 } 2290 }
2572 2291
2573
2574 ASSEMBLER_TEST_GENERATE(CheckedUnboxFail, assembler) { 2292 ASSEMBLER_TEST_GENERATE(CheckedUnboxFail, assembler) {
2575 __ Frame(2); 2293 __ Frame(2);
2576 __ LoadConstant(0, Bool::True()); 2294 __ LoadConstant(0, Bool::True());
2577 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 2295 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
2578 __ CheckedUnboxDouble(1, 0); 2296 __ CheckedUnboxDouble(1, 0);
2579 __ LoadConstant(1, Smi::Handle(Smi::New(42))); 2297 __ LoadConstant(1, Smi::Handle(Smi::New(42)));
2580 __ Return(1); 2298 __ Return(1);
2581 } 2299 }
2582 2300
2583
2584 ASSEMBLER_TEST_RUN(CheckedUnboxFail, test) { 2301 ASSEMBLER_TEST_RUN(CheckedUnboxFail, test) {
2585 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2302 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2586 } 2303 }
2587 2304
2588
2589 // - DAdd, DSub, DMul, DDiv rA, rB, rC 2305 // - DAdd, DSub, DMul, DDiv rA, rB, rC
2590 // 2306 //
2591 // Arithmetic operations on unboxed doubles. FP[rA] <- FP[rB] op FP[rC]. 2307 // Arithmetic operations on unboxed doubles. FP[rA] <- FP[rB] op FP[rC].
2592 ASSEMBLER_TEST_GENERATE(DAdd, assembler) { 2308 ASSEMBLER_TEST_GENERATE(DAdd, assembler) {
2593 __ Frame(3); 2309 __ Frame(3);
2594 __ LoadConstant(0, Double::Handle(Double::New(41.0, Heap::kOld))); 2310 __ LoadConstant(0, Double::Handle(Double::New(41.0, Heap::kOld)));
2595 __ LoadConstant(1, Double::Handle(Double::New(1.0, Heap::kOld))); 2311 __ LoadConstant(1, Double::Handle(Double::New(1.0, Heap::kOld)));
2596 __ UnboxDouble(0, 0); 2312 __ UnboxDouble(0, 0);
2597 __ UnboxDouble(1, 1); 2313 __ UnboxDouble(1, 1);
2598 __ DAdd(2, 1, 0); 2314 __ DAdd(2, 1, 0);
2599 __ Return(2); 2315 __ Return(2);
2600 } 2316 }
2601 2317
2602
2603 ASSEMBLER_TEST_RUN(DAdd, test) { 2318 ASSEMBLER_TEST_RUN(DAdd, test) {
2604 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); 2319 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
2605 } 2320 }
2606 2321
2607
2608 ASSEMBLER_TEST_GENERATE(DSub, assembler) { 2322 ASSEMBLER_TEST_GENERATE(DSub, assembler) {
2609 __ Frame(3); 2323 __ Frame(3);
2610 __ LoadConstant(0, Double::Handle(Double::New(1.0, Heap::kOld))); 2324 __ LoadConstant(0, Double::Handle(Double::New(1.0, Heap::kOld)));
2611 __ LoadConstant(1, Double::Handle(Double::New(43.0, Heap::kOld))); 2325 __ LoadConstant(1, Double::Handle(Double::New(43.0, Heap::kOld)));
2612 __ UnboxDouble(0, 0); 2326 __ UnboxDouble(0, 0);
2613 __ UnboxDouble(1, 1); 2327 __ UnboxDouble(1, 1);
2614 __ DSub(2, 1, 0); 2328 __ DSub(2, 1, 0);
2615 __ Return(2); 2329 __ Return(2);
2616 } 2330 }
2617 2331
2618
2619 ASSEMBLER_TEST_RUN(DSub, test) { 2332 ASSEMBLER_TEST_RUN(DSub, test) {
2620 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); 2333 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
2621 } 2334 }
2622 2335
2623
2624 ASSEMBLER_TEST_GENERATE(DMul, assembler) { 2336 ASSEMBLER_TEST_GENERATE(DMul, assembler) {
2625 __ Frame(3); 2337 __ Frame(3);
2626 __ LoadConstant(0, Double::Handle(Double::New(6.0, Heap::kOld))); 2338 __ LoadConstant(0, Double::Handle(Double::New(6.0, Heap::kOld)));
2627 __ LoadConstant(1, Double::Handle(Double::New(7.0, Heap::kOld))); 2339 __ LoadConstant(1, Double::Handle(Double::New(7.0, Heap::kOld)));
2628 __ UnboxDouble(0, 0); 2340 __ UnboxDouble(0, 0);
2629 __ UnboxDouble(1, 1); 2341 __ UnboxDouble(1, 1);
2630 __ DMul(2, 1, 0); 2342 __ DMul(2, 1, 0);
2631 __ Return(2); 2343 __ Return(2);
2632 } 2344 }
2633 2345
2634
2635 ASSEMBLER_TEST_RUN(DMul, test) { 2346 ASSEMBLER_TEST_RUN(DMul, test) {
2636 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); 2347 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
2637 } 2348 }
2638 2349
2639
2640 ASSEMBLER_TEST_GENERATE(DDiv, assembler) { 2350 ASSEMBLER_TEST_GENERATE(DDiv, assembler) {
2641 __ Frame(3); 2351 __ Frame(3);
2642 __ LoadConstant(0, Double::Handle(Double::New(2.0, Heap::kOld))); 2352 __ LoadConstant(0, Double::Handle(Double::New(2.0, Heap::kOld)));
2643 __ LoadConstant(1, Double::Handle(Double::New(84.0, Heap::kOld))); 2353 __ LoadConstant(1, Double::Handle(Double::New(84.0, Heap::kOld)));
2644 __ UnboxDouble(0, 0); 2354 __ UnboxDouble(0, 0);
2645 __ UnboxDouble(1, 1); 2355 __ UnboxDouble(1, 1);
2646 __ DDiv(2, 1, 0); 2356 __ DDiv(2, 1, 0);
2647 __ Return(2); 2357 __ Return(2);
2648 } 2358 }
2649 2359
2650
2651 ASSEMBLER_TEST_RUN(DDiv, test) { 2360 ASSEMBLER_TEST_RUN(DDiv, test) {
2652 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); 2361 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
2653 } 2362 }
2654 2363
2655
2656 ASSEMBLER_TEST_GENERATE(DNeg, assembler) { 2364 ASSEMBLER_TEST_GENERATE(DNeg, assembler) {
2657 __ Frame(2); 2365 __ Frame(2);
2658 __ LoadConstant(0, Double::Handle(Double::New(-42.0, Heap::kOld))); 2366 __ LoadConstant(0, Double::Handle(Double::New(-42.0, Heap::kOld)));
2659 __ UnboxDouble(0, 0); 2367 __ UnboxDouble(0, 0);
2660 __ DNeg(1, 0); 2368 __ DNeg(1, 0);
2661 __ Return(1); 2369 __ Return(1);
2662 } 2370 }
2663 2371
2664
2665 ASSEMBLER_TEST_RUN(DNeg, test) { 2372 ASSEMBLER_TEST_RUN(DNeg, test) {
2666 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); 2373 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
2667 } 2374 }
2668 2375
2669
2670 ASSEMBLER_TEST_GENERATE(DSqrt, assembler) { 2376 ASSEMBLER_TEST_GENERATE(DSqrt, assembler) {
2671 __ Frame(2); 2377 __ Frame(2);
2672 __ LoadConstant(0, Double::Handle(Double::New(36.0, Heap::kOld))); 2378 __ LoadConstant(0, Double::Handle(Double::New(36.0, Heap::kOld)));
2673 __ UnboxDouble(0, 0); 2379 __ UnboxDouble(0, 0);
2674 __ DSqrt(1, 0); 2380 __ DSqrt(1, 0);
2675 __ Return(1); 2381 __ Return(1);
2676 } 2382 }
2677 2383
2678
2679 ASSEMBLER_TEST_RUN(DSqrt, test) { 2384 ASSEMBLER_TEST_RUN(DSqrt, test) {
2680 EXPECT_EQ(6.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); 2385 EXPECT_EQ(6.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
2681 } 2386 }
2682 2387
2683
2684 // - SmiToDouble rA, rD 2388 // - SmiToDouble rA, rD
2685 // 2389 //
2686 // Convert the Smi in FP[rD] to an unboxed double in FP[rA]. 2390 // Convert the Smi in FP[rD] to an unboxed double in FP[rA].
2687 // 2391 //
2688 // - DoubleToSmi rA, rD 2392 // - DoubleToSmi rA, rD
2689 // 2393 //
2690 // If the unboxed double in FP[rD] can be converted to a Smi in FP[rA], then 2394 // If the unboxed double in FP[rD] can be converted to a Smi in FP[rA], then
2691 // this instruction does so, and skips the following instruction. Otherwise, 2395 // this instruction does so, and skips the following instruction. Otherwise,
2692 // the following instruction is not skipped. 2396 // the following instruction is not skipped.
2693 ASSEMBLER_TEST_GENERATE(SmiToDouble, assembler) { 2397 ASSEMBLER_TEST_GENERATE(SmiToDouble, assembler) {
2694 __ Frame(2); 2398 __ Frame(2);
2695 __ LoadConstant(0, Smi::Handle(Smi::New(42))); 2399 __ LoadConstant(0, Smi::Handle(Smi::New(42)));
2696 __ SmiToDouble(1, 0); 2400 __ SmiToDouble(1, 0);
2697 __ Return(1); 2401 __ Return(1);
2698 } 2402 }
2699 2403
2700
2701 ASSEMBLER_TEST_RUN(SmiToDouble, test) { 2404 ASSEMBLER_TEST_RUN(SmiToDouble, test) {
2702 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); 2405 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
2703 } 2406 }
2704 2407
2705
2706 ASSEMBLER_TEST_GENERATE(DoubleToSmi, assembler) { 2408 ASSEMBLER_TEST_GENERATE(DoubleToSmi, assembler) {
2707 __ Frame(2); 2409 __ Frame(2);
2708 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld))); 2410 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld)));
2709 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 2411 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
2710 __ UnboxDouble(0, 0); 2412 __ UnboxDouble(0, 0);
2711 __ DoubleToSmi(1, 0); 2413 __ DoubleToSmi(1, 0);
2712 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 2414 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
2713 __ Return(1); 2415 __ Return(1);
2714 } 2416 }
2715 2417
2716
2717 ASSEMBLER_TEST_RUN(DoubleToSmi, test) { 2418 ASSEMBLER_TEST_RUN(DoubleToSmi, test) {
2718 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2419 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2719 } 2420 }
2720 2421
2721
2722 ASSEMBLER_TEST_GENERATE(DoubleToSmiNearMax, assembler) { 2422 ASSEMBLER_TEST_GENERATE(DoubleToSmiNearMax, assembler) {
2723 const double m = static_cast<double>(Smi::kMaxValue - 1000); 2423 const double m = static_cast<double>(Smi::kMaxValue - 1000);
2724 __ Frame(2); 2424 __ Frame(2);
2725 __ LoadConstant(0, Double::Handle(Double::New(m, Heap::kOld))); 2425 __ LoadConstant(0, Double::Handle(Double::New(m, Heap::kOld)));
2726 __ LoadConstant(1, Smi::Handle(Smi::New(42))); 2426 __ LoadConstant(1, Smi::Handle(Smi::New(42)));
2727 __ UnboxDouble(0, 0); 2427 __ UnboxDouble(0, 0);
2728 __ DoubleToSmi(0, 0); 2428 __ DoubleToSmi(0, 0);
2729 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 2429 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
2730 __ Return(1); 2430 __ Return(1);
2731 } 2431 }
2732 2432
2733
2734 ASSEMBLER_TEST_RUN(DoubleToSmiNearMax, test) { 2433 ASSEMBLER_TEST_RUN(DoubleToSmiNearMax, test) {
2735 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2434 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2736 } 2435 }
2737 2436
2738
2739 ASSEMBLER_TEST_GENERATE(DoubleToSmiNearMin, assembler) { 2437 ASSEMBLER_TEST_GENERATE(DoubleToSmiNearMin, assembler) {
2740 const double m = static_cast<double>(Smi::kMinValue); 2438 const double m = static_cast<double>(Smi::kMinValue);
2741 __ Frame(2); 2439 __ Frame(2);
2742 __ LoadConstant(0, Double::Handle(Double::New(m, Heap::kOld))); 2440 __ LoadConstant(0, Double::Handle(Double::New(m, Heap::kOld)));
2743 __ LoadConstant(1, Smi::Handle(Smi::New(42))); 2441 __ LoadConstant(1, Smi::Handle(Smi::New(42)));
2744 __ UnboxDouble(0, 0); 2442 __ UnboxDouble(0, 0);
2745 __ DoubleToSmi(0, 0); 2443 __ DoubleToSmi(0, 0);
2746 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 2444 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
2747 __ Return(1); 2445 __ Return(1);
2748 } 2446 }
2749 2447
2750
2751 ASSEMBLER_TEST_RUN(DoubleToSmiNearMin, test) { 2448 ASSEMBLER_TEST_RUN(DoubleToSmiNearMin, test) {
2752 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2449 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2753 } 2450 }
2754 2451
2755
2756 ASSEMBLER_TEST_GENERATE(DoubleToSmiFailPos, assembler) { 2452 ASSEMBLER_TEST_GENERATE(DoubleToSmiFailPos, assembler) {
2757 const double pos_overflow = static_cast<double>(Smi::kMaxValue + 1); 2453 const double pos_overflow = static_cast<double>(Smi::kMaxValue + 1);
2758 __ Frame(2); 2454 __ Frame(2);
2759 __ LoadConstant(0, Double::Handle(Double::New(pos_overflow, Heap::kOld))); 2455 __ LoadConstant(0, Double::Handle(Double::New(pos_overflow, Heap::kOld)));
2760 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 2456 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
2761 __ UnboxDouble(0, 0); 2457 __ UnboxDouble(0, 0);
2762 __ DoubleToSmi(1, 0); 2458 __ DoubleToSmi(1, 0);
2763 __ LoadConstant(1, Smi::Handle(Smi::New(42))); 2459 __ LoadConstant(1, Smi::Handle(Smi::New(42)));
2764 __ Return(1); 2460 __ Return(1);
2765 } 2461 }
2766 2462
2767
2768 ASSEMBLER_TEST_RUN(DoubleToSmiFailPos, test) { 2463 ASSEMBLER_TEST_RUN(DoubleToSmiFailPos, test) {
2769 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2464 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2770 } 2465 }
2771 2466
2772
2773 ASSEMBLER_TEST_GENERATE(DoubleToSmiFailNeg, assembler) { 2467 ASSEMBLER_TEST_GENERATE(DoubleToSmiFailNeg, assembler) {
2774 const double neg_overflow = static_cast<double>(Smi::kMinValue - 1000); 2468 const double neg_overflow = static_cast<double>(Smi::kMinValue - 1000);
2775 __ Frame(2); 2469 __ Frame(2);
2776 __ LoadConstant(0, Double::Handle(Double::New(neg_overflow, Heap::kOld))); 2470 __ LoadConstant(0, Double::Handle(Double::New(neg_overflow, Heap::kOld)));
2777 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); 2471 __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
2778 __ UnboxDouble(0, 0); 2472 __ UnboxDouble(0, 0);
2779 __ DoubleToSmi(1, 0); 2473 __ DoubleToSmi(1, 0);
2780 __ LoadConstant(1, Smi::Handle(Smi::New(42))); 2474 __ LoadConstant(1, Smi::Handle(Smi::New(42)));
2781 __ Return(1); 2475 __ Return(1);
2782 } 2476 }
2783 2477
2784
2785 ASSEMBLER_TEST_RUN(DoubleToSmiFailNeg, test) { 2478 ASSEMBLER_TEST_RUN(DoubleToSmiFailNeg, test) {
2786 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); 2479 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
2787 } 2480 }
2788 2481
2789
2790 ASSEMBLER_TEST_GENERATE(DMin, assembler) { 2482 ASSEMBLER_TEST_GENERATE(DMin, assembler) {
2791 __ Frame(3); 2483 __ Frame(3);
2792 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld))); 2484 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld)));
2793 __ LoadConstant(1, Double::Handle(Double::New(500.0, Heap::kOld))); 2485 __ LoadConstant(1, Double::Handle(Double::New(500.0, Heap::kOld)));
2794 __ UnboxDouble(0, 0); 2486 __ UnboxDouble(0, 0);
2795 __ UnboxDouble(1, 1); 2487 __ UnboxDouble(1, 1);
2796 __ DMin(2, 0, 1); 2488 __ DMin(2, 0, 1);
2797 __ Return(2); 2489 __ Return(2);
2798 } 2490 }
2799 2491
2800
2801 ASSEMBLER_TEST_RUN(DMin, test) { 2492 ASSEMBLER_TEST_RUN(DMin, test) {
2802 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); 2493 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
2803 } 2494 }
2804 2495
2805
2806 ASSEMBLER_TEST_GENERATE(DMax, assembler) { 2496 ASSEMBLER_TEST_GENERATE(DMax, assembler) {
2807 __ Frame(3); 2497 __ Frame(3);
2808 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld))); 2498 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld)));
2809 __ LoadConstant(1, Double::Handle(Double::New(5.0, Heap::kOld))); 2499 __ LoadConstant(1, Double::Handle(Double::New(5.0, Heap::kOld)));
2810 __ UnboxDouble(0, 0); 2500 __ UnboxDouble(0, 0);
2811 __ UnboxDouble(1, 1); 2501 __ UnboxDouble(1, 1);
2812 __ DMax(2, 0, 1); 2502 __ DMax(2, 0, 1);
2813 __ Return(2); 2503 __ Return(2);
2814 } 2504 }
2815 2505
2816
2817 ASSEMBLER_TEST_RUN(DMax, test) { 2506 ASSEMBLER_TEST_RUN(DMax, test) {
2818 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); 2507 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
2819 } 2508 }
2820 2509
2821 #endif // defined(ARCH_IS_64_BIT) 2510 #endif // defined(ARCH_IS_64_BIT)
2822 2511
2823 } // namespace dart 2512 } // namespace dart
2824 2513
2825 #endif // defined(TARGET_ARCH_DBC) 2514 #endif // defined(TARGET_ARCH_DBC)
OLDNEW
« no previous file with comments | « runtime/vm/assembler_dbc.cc ('k') | runtime/vm/assembler_ia32.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698