OLD | NEW |
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 Loading... |
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 Loading... |
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) |
OLD | NEW |