| 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" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 #define EXECUTE_TEST_CODE_INTPTR(code) \ | 25 #define EXECUTE_TEST_CODE_INTPTR(code) \ |
| 26 Smi::Value(Smi::RawCast(ExecuteTest(code))) | 26 Smi::Value(Smi::RawCast(ExecuteTest(code))) |
| 27 #define EXECUTE_TEST_CODE_BOOL(code) \ | 27 #define EXECUTE_TEST_CODE_BOOL(code) \ |
| 28 (Bool::RawCast(ExecuteTest(code)) == Bool::True().raw()) | 28 (Bool::RawCast(ExecuteTest(code)) == Bool::True().raw()) |
| 29 #define EXECUTE_TEST_CODE_OBJECT(code) \ | 29 #define EXECUTE_TEST_CODE_OBJECT(code) \ |
| 30 Object::Handle(ExecuteTest(code)) | 30 Object::Handle(ExecuteTest(code)) |
| 31 | 31 |
| 32 #define __ assembler-> | 32 #define __ assembler-> |
| 33 | 33 |
| 34 | 34 |
| 35 static RawClass* CreateDummyClass(const String& class_name, |
| 36 const Script& script) { |
| 37 const Class& cls = Class::Handle(Class::New( |
| 38 Library::Handle(), class_name, script, TokenPosition::kNoSource)); |
| 39 cls.set_is_synthesized_class(); // Dummy class for testing. |
| 40 return cls.raw(); |
| 41 } |
| 42 |
| 43 |
| 44 static RawLibrary* CreateDummyLibrary(const String& library_name) { |
| 45 return Library::New(library_name); |
| 46 } |
| 47 |
| 48 |
| 49 static RawFunction* CreateFunction(const char* name) { |
| 50 Thread* thread = Thread::Current(); |
| 51 const String& class_name = String::Handle(Symbols::New(thread, "ownerClass")); |
| 52 const String& lib_name = String::Handle(Symbols::New(thread, "ownerLibrary")); |
| 53 const Script& script = Script::Handle(); |
| 54 const Class& owner_class = |
| 55 Class::Handle(CreateDummyClass(class_name, script)); |
| 56 const Library& owner_library = |
| 57 Library::Handle(CreateDummyLibrary(lib_name)); |
| 58 owner_class.set_library(owner_library); |
| 59 const String& function_name = String::ZoneHandle(Symbols::New(thread, name)); |
| 60 return Function::New(function_name, RawFunction::kRegularFunction, |
| 61 true, false, false, false, false, owner_class, |
| 62 TokenPosition::kMinSource); |
| 63 } |
| 64 |
| 65 |
| 66 static void GenerateDummyCode(Assembler* assembler, const Object& result) { |
| 67 __ PushConstant(result); |
| 68 __ ReturnTOS(); |
| 69 } |
| 70 |
| 71 |
| 72 static void MakeDummyInstanceCall(Assembler* assembler, const Object& result) { |
| 73 // Make a dummy function. |
| 74 Assembler _assembler_; |
| 75 GenerateDummyCode(&_assembler_, result); |
| 76 const char* dummy_function_name = "dummy_instance_function"; |
| 77 const Function& dummy_instance_function = |
| 78 Function::Handle(CreateFunction(dummy_function_name)); |
| 79 Code& code = |
| 80 Code::Handle(Code::FinalizeCode(dummy_instance_function, &_assembler_)); |
| 81 dummy_instance_function.AttachCode(code); |
| 82 |
| 83 // Make a dummy ICData. |
| 84 const Array& dummy_arguments_descriptor = |
| 85 Array::Handle(ArgumentsDescriptor::New(2)); |
| 86 const ICData& ic_data = ICData::Handle(ICData::New( |
| 87 dummy_instance_function, |
| 88 String::Handle(dummy_instance_function.name()), |
| 89 dummy_arguments_descriptor, |
| 90 Thread::kNoDeoptId, |
| 91 2)); |
| 92 |
| 93 // Wire up the Function in the ICData. |
| 94 GrowableArray<intptr_t> cids(2); |
| 95 cids.Add(kSmiCid); |
| 96 cids.Add(kSmiCid); |
| 97 ic_data.AddCheck(cids, dummy_instance_function); |
| 98 |
| 99 // For the non-Smi tests. |
| 100 cids[0] = kBigintCid; |
| 101 ic_data.AddCheck(cids, dummy_instance_function); |
| 102 ICData* call_ic_data = &ICData::ZoneHandle(ic_data.Original()); |
| 103 |
| 104 // Generate the instance call. |
| 105 const intptr_t call_ic_data_kidx = __ AddConstant(*call_ic_data); |
| 106 __ InstanceCall2(2, call_ic_data_kidx); |
| 107 } |
| 108 |
| 109 |
| 35 ASSEMBLER_TEST_GENERATE(Simple, assembler) { | 110 ASSEMBLER_TEST_GENERATE(Simple, assembler) { |
| 36 __ PushConstant(Smi::Handle(Smi::New(42))); | 111 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 37 __ ReturnTOS(); | 112 __ ReturnTOS(); |
| 38 } | 113 } |
| 39 | 114 |
| 40 | 115 |
| 41 ASSEMBLER_TEST_RUN(Simple, test) { | 116 ASSEMBLER_TEST_RUN(Simple, test) { |
| 42 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 117 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 43 } | 118 } |
| 44 | 119 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 59 // GreaterThanTOS; | 134 // GreaterThanTOS; |
| 60 // | 135 // |
| 61 // Smi fast-path for a corresponding method. Checks if SP[0] and SP[-1] are | 136 // Smi fast-path for a corresponding method. Checks if SP[0] and SP[-1] are |
| 62 // both smis and result of SP[0] <op> SP[-1] is a smi - if this is true | 137 // both smis and result of SP[0] <op> SP[-1] is a smi - if this is true |
| 63 // then pops operands and pushes result on the stack and skips the next | 138 // then pops operands and pushes result on the stack and skips the next |
| 64 // instruction (which implements a slow path fallback). | 139 // instruction (which implements a slow path fallback). |
| 65 ASSEMBLER_TEST_GENERATE(AddTOS, assembler) { | 140 ASSEMBLER_TEST_GENERATE(AddTOS, assembler) { |
| 66 __ PushConstant(Smi::Handle(Smi::New(-42))); | 141 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 67 __ PushConstant(Smi::Handle(Smi::New(84))); | 142 __ PushConstant(Smi::Handle(Smi::New(84))); |
| 68 __ AddTOS(); | 143 __ AddTOS(); |
| 69 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. | 144 // Should be skipped. |
| 145 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 70 __ ReturnTOS(); | 146 __ ReturnTOS(); |
| 71 } | 147 } |
| 72 | 148 |
| 73 | 149 |
| 74 ASSEMBLER_TEST_RUN(AddTOS, test) { | 150 ASSEMBLER_TEST_RUN(AddTOS, test) { |
| 75 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 151 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 76 } | 152 } |
| 77 | 153 |
| 78 | 154 |
| 79 ASSEMBLER_TEST_GENERATE(AddTOSOverflow, assembler) { | 155 ASSEMBLER_TEST_GENERATE(AddTOSOverflow, assembler) { |
| 80 __ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue))); | 156 __ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue))); |
| 81 __ PushConstant(Smi::Handle(Smi::New(1))); | 157 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 82 __ AddTOS(); | 158 __ AddTOS(); |
| 83 __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. | 159 // Shouldn't be skipped. |
| 160 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| 84 __ ReturnTOS(); | 161 __ ReturnTOS(); |
| 85 } | 162 } |
| 86 | 163 |
| 87 | 164 |
| 88 ASSEMBLER_TEST_RUN(AddTOSOverflow, test) { | 165 ASSEMBLER_TEST_RUN(AddTOSOverflow, test) { |
| 89 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 166 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 90 } | 167 } |
| 91 | 168 |
| 92 | 169 |
| 93 ASSEMBLER_TEST_GENERATE(AddTOSNonSmi, assembler) { | 170 ASSEMBLER_TEST_GENERATE(AddTOSNonSmi, assembler) { |
| 94 const String& numstr = | 171 const String& numstr = |
| 95 String::Handle(String::New("98765432198765432100", Heap::kOld)); | 172 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 96 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); | 173 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 97 __ PushConstant(Smi::Handle(Smi::New(1))); | 174 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 98 __ AddTOS(); | 175 __ AddTOS(); |
| 99 __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. | 176 // Shouldn't be skipped. |
| 177 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| 100 __ ReturnTOS(); | 178 __ ReturnTOS(); |
| 101 } | 179 } |
| 102 | 180 |
| 103 | 181 |
| 104 ASSEMBLER_TEST_RUN(AddTOSNonSmi, test) { | 182 ASSEMBLER_TEST_RUN(AddTOSNonSmi, test) { |
| 105 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 183 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 106 } | 184 } |
| 107 | 185 |
| 108 | 186 |
| 109 ASSEMBLER_TEST_GENERATE(SubTOS, assembler) { | 187 ASSEMBLER_TEST_GENERATE(SubTOS, assembler) { |
| 110 __ PushConstant(Smi::Handle(Smi::New(30))); | 188 __ PushConstant(Smi::Handle(Smi::New(30))); |
| 111 __ PushConstant(Smi::Handle(Smi::New(-12))); | 189 __ PushConstant(Smi::Handle(Smi::New(-12))); |
| 112 __ SubTOS(); | 190 __ SubTOS(); |
| 113 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. | 191 // Should be skipped. |
| 192 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 114 __ ReturnTOS(); | 193 __ ReturnTOS(); |
| 115 } | 194 } |
| 116 | 195 |
| 117 | 196 |
| 118 ASSEMBLER_TEST_RUN(SubTOS, test) { | 197 ASSEMBLER_TEST_RUN(SubTOS, test) { |
| 119 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 198 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 120 } | 199 } |
| 121 | 200 |
| 122 | 201 |
| 123 ASSEMBLER_TEST_GENERATE(SubTOSOverflow, assembler) { | 202 ASSEMBLER_TEST_GENERATE(SubTOSOverflow, assembler) { |
| 124 __ PushConstant(Smi::Handle(Smi::New(Smi::kMinValue))); | 203 __ PushConstant(Smi::Handle(Smi::New(Smi::kMinValue))); |
| 125 __ PushConstant(Smi::Handle(Smi::New(1))); | 204 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 126 __ SubTOS(); | 205 __ SubTOS(); |
| 127 __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. | 206 // Shouldn't be skipped. |
| 207 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| 128 __ ReturnTOS(); | 208 __ ReturnTOS(); |
| 129 } | 209 } |
| 130 | 210 |
| 131 | 211 |
| 132 ASSEMBLER_TEST_RUN(SubTOSOverflow, test) { | 212 ASSEMBLER_TEST_RUN(SubTOSOverflow, test) { |
| 133 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 213 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 134 } | 214 } |
| 135 | 215 |
| 136 | 216 |
| 137 ASSEMBLER_TEST_GENERATE(SubTOSNonSmi, assembler) { | 217 ASSEMBLER_TEST_GENERATE(SubTOSNonSmi, assembler) { |
| 138 const String& numstr = | 218 const String& numstr = |
| 139 String::Handle(String::New("98765432198765432100", Heap::kOld)); | 219 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 140 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); | 220 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 141 __ PushConstant(Smi::Handle(Smi::New(1))); | 221 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 142 __ SubTOS(); | 222 __ SubTOS(); |
| 143 __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. | 223 // Shouldn't be skipped. |
| 224 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| 144 __ ReturnTOS(); | 225 __ ReturnTOS(); |
| 145 } | 226 } |
| 146 | 227 |
| 147 | 228 |
| 148 ASSEMBLER_TEST_RUN(SubTOSNonSmi, test) { | 229 ASSEMBLER_TEST_RUN(SubTOSNonSmi, test) { |
| 149 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 230 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 150 } | 231 } |
| 151 | 232 |
| 152 | 233 |
| 153 ASSEMBLER_TEST_GENERATE(MulTOS, assembler) { | 234 ASSEMBLER_TEST_GENERATE(MulTOS, assembler) { |
| 154 __ PushConstant(Smi::Handle(Smi::New(-6))); | 235 __ PushConstant(Smi::Handle(Smi::New(-6))); |
| 155 __ PushConstant(Smi::Handle(Smi::New(-7))); | 236 __ PushConstant(Smi::Handle(Smi::New(-7))); |
| 156 __ MulTOS(); | 237 __ MulTOS(); |
| 157 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. | 238 // Should be skipped. |
| 239 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 158 __ ReturnTOS(); | 240 __ ReturnTOS(); |
| 159 } | 241 } |
| 160 | 242 |
| 161 | 243 |
| 162 ASSEMBLER_TEST_RUN(MulTOS, test) { | 244 ASSEMBLER_TEST_RUN(MulTOS, test) { |
| 163 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 245 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 164 } | 246 } |
| 165 | 247 |
| 166 | 248 |
| 167 ASSEMBLER_TEST_GENERATE(MulTOSOverflow, assembler) { | 249 ASSEMBLER_TEST_GENERATE(MulTOSOverflow, assembler) { |
| 168 __ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue))); | 250 __ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue))); |
| 169 __ PushConstant(Smi::Handle(Smi::New(-8))); | 251 __ PushConstant(Smi::Handle(Smi::New(-8))); |
| 170 __ MulTOS(); | 252 __ MulTOS(); |
| 171 __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. | 253 // Shouldn't be skipped. |
| 254 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| 172 __ ReturnTOS(); | 255 __ ReturnTOS(); |
| 173 } | 256 } |
| 174 | 257 |
| 175 | 258 |
| 176 ASSEMBLER_TEST_RUN(MulTOSOverflow, test) { | 259 ASSEMBLER_TEST_RUN(MulTOSOverflow, test) { |
| 177 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 260 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 178 } | 261 } |
| 179 | 262 |
| 180 | 263 |
| 181 ASSEMBLER_TEST_GENERATE(MulTOSNonSmi, assembler) { | 264 ASSEMBLER_TEST_GENERATE(MulTOSNonSmi, assembler) { |
| 182 const String& numstr = | 265 const String& numstr = |
| 183 String::Handle(String::New("98765432198765432100", Heap::kOld)); | 266 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 184 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); | 267 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 185 __ PushConstant(Smi::Handle(Smi::New(1))); | 268 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 186 __ MulTOS(); | 269 __ MulTOS(); |
| 187 __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. | 270 // Shouldn't be skipped. |
| 271 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| 188 __ ReturnTOS(); | 272 __ ReturnTOS(); |
| 189 } | 273 } |
| 190 | 274 |
| 191 | 275 |
| 192 ASSEMBLER_TEST_RUN(MulTOSNonSmi, test) { | 276 ASSEMBLER_TEST_RUN(MulTOSNonSmi, test) { |
| 193 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 277 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 194 } | 278 } |
| 195 | 279 |
| 196 | 280 |
| 197 ASSEMBLER_TEST_GENERATE(BitOrTOS, assembler) { | 281 ASSEMBLER_TEST_GENERATE(BitOrTOS, assembler) { |
| 198 __ PushConstant(Smi::Handle(Smi::New(0x22))); | 282 __ PushConstant(Smi::Handle(Smi::New(0x22))); |
| 199 __ PushConstant(Smi::Handle(Smi::New(0x08))); | 283 __ PushConstant(Smi::Handle(Smi::New(0x08))); |
| 200 __ BitOrTOS(); | 284 __ BitOrTOS(); |
| 201 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. | 285 // Should be skipped. |
| 286 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 202 __ ReturnTOS(); | 287 __ ReturnTOS(); |
| 203 } | 288 } |
| 204 | 289 |
| 205 | 290 |
| 206 ASSEMBLER_TEST_RUN(BitOrTOS, test) { | 291 ASSEMBLER_TEST_RUN(BitOrTOS, test) { |
| 207 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 292 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 208 } | 293 } |
| 209 | 294 |
| 210 | 295 |
| 211 ASSEMBLER_TEST_GENERATE(BitOrTOSNonSmi, assembler) { | 296 ASSEMBLER_TEST_GENERATE(BitOrTOSNonSmi, assembler) { |
| 212 const String& numstr = | 297 const String& numstr = |
| 213 String::Handle(String::New("98765432198765432100", Heap::kOld)); | 298 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 214 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); | 299 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 215 __ PushConstant(Smi::Handle(Smi::New(0x08))); | 300 __ PushConstant(Smi::Handle(Smi::New(0x08))); |
| 216 __ BitOrTOS(); | 301 __ BitOrTOS(); |
| 217 __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. | 302 // Shouldn't be skipped. |
| 303 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| 218 __ ReturnTOS(); | 304 __ ReturnTOS(); |
| 219 } | 305 } |
| 220 | 306 |
| 221 | 307 |
| 222 ASSEMBLER_TEST_RUN(BitOrTOSNonSmi, test) { | 308 ASSEMBLER_TEST_RUN(BitOrTOSNonSmi, test) { |
| 223 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 309 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 224 } | 310 } |
| 225 | 311 |
| 226 | 312 |
| 227 ASSEMBLER_TEST_GENERATE(BitAndTOS, assembler) { | 313 ASSEMBLER_TEST_GENERATE(BitAndTOS, assembler) { |
| 228 __ PushConstant(Smi::Handle(Smi::New(0x2a))); | 314 __ PushConstant(Smi::Handle(Smi::New(0x2a))); |
| 229 __ PushConstant(Smi::Handle(Smi::New(0xaa))); | 315 __ PushConstant(Smi::Handle(Smi::New(0xaa))); |
| 230 __ BitAndTOS(); | 316 __ BitAndTOS(); |
| 231 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. | 317 // Should be skipped. |
| 318 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 232 __ ReturnTOS(); | 319 __ ReturnTOS(); |
| 233 } | 320 } |
| 234 | 321 |
| 235 | 322 |
| 236 ASSEMBLER_TEST_RUN(BitAndTOS, test) { | 323 ASSEMBLER_TEST_RUN(BitAndTOS, test) { |
| 237 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 324 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 238 } | 325 } |
| 239 | 326 |
| 240 | 327 |
| 241 ASSEMBLER_TEST_GENERATE(BitAndTOSNonSmi, assembler) { | 328 ASSEMBLER_TEST_GENERATE(BitAndTOSNonSmi, assembler) { |
| 242 const String& numstr = | 329 const String& numstr = |
| 243 String::Handle(String::New("98765432198765432100", Heap::kOld)); | 330 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 244 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); | 331 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 245 __ PushConstant(Smi::Handle(Smi::New(0x08))); | 332 __ PushConstant(Smi::Handle(Smi::New(0x08))); |
| 246 __ BitAndTOS(); | 333 __ BitAndTOS(); |
| 247 __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. | 334 // Shouldn't be skipped. |
| 335 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| 248 __ ReturnTOS(); | 336 __ ReturnTOS(); |
| 249 } | 337 } |
| 250 | 338 |
| 251 | 339 |
| 252 ASSEMBLER_TEST_RUN(BitAndTOSNonSmi, test) { | 340 ASSEMBLER_TEST_RUN(BitAndTOSNonSmi, test) { |
| 253 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 341 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 254 } | 342 } |
| 255 | 343 |
| 256 | 344 |
| 257 ASSEMBLER_TEST_GENERATE(EqualTOSTrue, assembler) { | 345 ASSEMBLER_TEST_GENERATE(EqualTOSTrue, assembler) { |
| 258 __ PushConstant(Smi::Handle(Smi::New(42))); | 346 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 259 __ PushConstant(Smi::Handle(Smi::New(42))); | 347 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 260 __ EqualTOS(); | 348 __ EqualTOS(); |
| 261 __ PushConstant(Bool::False()); // Should be skipped. | 349 // Should be skipped. |
| 350 MakeDummyInstanceCall(assembler, Bool::False()); |
| 262 __ ReturnTOS(); | 351 __ ReturnTOS(); |
| 263 } | 352 } |
| 264 | 353 |
| 265 | 354 |
| 266 ASSEMBLER_TEST_RUN(EqualTOSTrue, test) { | 355 ASSEMBLER_TEST_RUN(EqualTOSTrue, test) { |
| 267 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); | 356 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 268 } | 357 } |
| 269 | 358 |
| 270 | 359 |
| 271 ASSEMBLER_TEST_GENERATE(EqualTOSFalse, assembler) { | 360 ASSEMBLER_TEST_GENERATE(EqualTOSFalse, assembler) { |
| 272 __ PushConstant(Smi::Handle(Smi::New(42))); | 361 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 273 __ PushConstant(Smi::Handle(Smi::New(-42))); | 362 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 274 __ EqualTOS(); | 363 __ EqualTOS(); |
| 275 __ PushConstant(Bool::True()); // Should be skipped. | 364 // Should be skipped. |
| 365 MakeDummyInstanceCall(assembler, Bool::True()); |
| 276 __ ReturnTOS(); | 366 __ ReturnTOS(); |
| 277 } | 367 } |
| 278 | 368 |
| 279 | 369 |
| 280 ASSEMBLER_TEST_RUN(EqualTOSFalse, test) { | 370 ASSEMBLER_TEST_RUN(EqualTOSFalse, test) { |
| 281 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); | 371 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); |
| 282 } | 372 } |
| 283 | 373 |
| 284 | 374 |
| 285 ASSEMBLER_TEST_GENERATE(EqualTOSNonSmi, assembler) { | 375 ASSEMBLER_TEST_GENERATE(EqualTOSNonSmi, assembler) { |
| 286 const String& numstr = | 376 const String& numstr = |
| 287 String::Handle(String::New("98765432198765432100", Heap::kOld)); | 377 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 288 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); | 378 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 289 __ PushConstant(Smi::Handle(Smi::New(-42))); | 379 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 290 __ EqualTOS(); | 380 __ EqualTOS(); |
| 291 __ PushConstant(Bool::True()); // Shouldn't be skipped. | 381 // Shouldn't be skipped. |
| 382 MakeDummyInstanceCall(assembler, Bool::True()); |
| 292 __ ReturnTOS(); | 383 __ ReturnTOS(); |
| 293 } | 384 } |
| 294 | 385 |
| 295 | 386 |
| 296 ASSEMBLER_TEST_RUN(EqualTOSNonSmi, test) { | 387 ASSEMBLER_TEST_RUN(EqualTOSNonSmi, test) { |
| 297 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); | 388 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 298 } | 389 } |
| 299 | 390 |
| 300 | 391 |
| 301 ASSEMBLER_TEST_GENERATE(LessThanTOSTrue, assembler) { | 392 ASSEMBLER_TEST_GENERATE(LessThanTOSTrue, assembler) { |
| 302 __ PushConstant(Smi::Handle(Smi::New(-42))); | 393 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 303 __ PushConstant(Smi::Handle(Smi::New(42))); | 394 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 304 __ LessThanTOS(); | 395 __ LessThanTOS(); |
| 305 __ PushConstant(Bool::False()); // Should be skipped. | 396 // Should be skipped. |
| 397 MakeDummyInstanceCall(assembler, Bool::False()); |
| 306 __ ReturnTOS(); | 398 __ ReturnTOS(); |
| 307 } | 399 } |
| 308 | 400 |
| 309 | 401 |
| 310 ASSEMBLER_TEST_RUN(LessThanTOSTrue, test) { | 402 ASSEMBLER_TEST_RUN(LessThanTOSTrue, test) { |
| 311 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); | 403 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 312 } | 404 } |
| 313 | 405 |
| 314 | 406 |
| 315 ASSEMBLER_TEST_GENERATE(LessThanTOSFalse, assembler) { | 407 ASSEMBLER_TEST_GENERATE(LessThanTOSFalse, assembler) { |
| 316 __ PushConstant(Smi::Handle(Smi::New(42))); | 408 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 317 __ PushConstant(Smi::Handle(Smi::New(-42))); | 409 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 318 __ LessThanTOS(); | 410 __ LessThanTOS(); |
| 319 __ PushConstant(Bool::False()); // Should be skipped. | 411 // Should be skipped. |
| 412 MakeDummyInstanceCall(assembler, Bool::False()); |
| 320 __ ReturnTOS(); | 413 __ ReturnTOS(); |
| 321 } | 414 } |
| 322 | 415 |
| 323 | 416 |
| 324 ASSEMBLER_TEST_RUN(LessThanTOSFalse, test) { | 417 ASSEMBLER_TEST_RUN(LessThanTOSFalse, test) { |
| 325 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); | 418 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); |
| 326 } | 419 } |
| 327 | 420 |
| 328 | 421 |
| 329 ASSEMBLER_TEST_GENERATE(LessThanTOSNonSmi, assembler) { | 422 ASSEMBLER_TEST_GENERATE(LessThanTOSNonSmi, assembler) { |
| 330 const String& numstr = | 423 const String& numstr = |
| 331 String::Handle(String::New("98765432198765432100", Heap::kOld)); | 424 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 332 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); | 425 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 333 __ PushConstant(Smi::Handle(Smi::New(-42))); | 426 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 334 __ LessThanTOS(); | 427 __ LessThanTOS(); |
| 335 __ PushConstant(Bool::True()); // Shouldn't be skipped. | 428 // Shouldn't be skipped. |
| 429 MakeDummyInstanceCall(assembler, Bool::True()); |
| 336 __ ReturnTOS(); | 430 __ ReturnTOS(); |
| 337 } | 431 } |
| 338 | 432 |
| 339 | 433 |
| 340 ASSEMBLER_TEST_RUN(LessThanTOSNonSmi, test) { | 434 ASSEMBLER_TEST_RUN(LessThanTOSNonSmi, test) { |
| 341 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); | 435 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 342 } | 436 } |
| 343 | 437 |
| 344 | 438 |
| 345 ASSEMBLER_TEST_GENERATE(GreaterThanTOSTrue, assembler) { | 439 ASSEMBLER_TEST_GENERATE(GreaterThanTOSTrue, assembler) { |
| 346 __ PushConstant(Smi::Handle(Smi::New(42))); | 440 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 347 __ PushConstant(Smi::Handle(Smi::New(-42))); | 441 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 348 __ GreaterThanTOS(); | 442 __ GreaterThanTOS(); |
| 349 __ PushConstant(Bool::False()); // Should be skipped. | 443 // Should be skipped. |
| 444 MakeDummyInstanceCall(assembler, Bool::False()); |
| 350 __ ReturnTOS(); | 445 __ ReturnTOS(); |
| 351 } | 446 } |
| 352 | 447 |
| 353 | 448 |
| 354 ASSEMBLER_TEST_RUN(GreaterThanTOSTrue, test) { | 449 ASSEMBLER_TEST_RUN(GreaterThanTOSTrue, test) { |
| 355 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); | 450 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 356 } | 451 } |
| 357 | 452 |
| 358 | 453 |
| 359 ASSEMBLER_TEST_GENERATE(GreaterThanTOSFalse, assembler) { | 454 ASSEMBLER_TEST_GENERATE(GreaterThanTOSFalse, assembler) { |
| 360 __ PushConstant(Smi::Handle(Smi::New(-42))); | 455 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 361 __ PushConstant(Smi::Handle(Smi::New(42))); | 456 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 362 __ GreaterThanTOS(); | 457 __ GreaterThanTOS(); |
| 363 __ PushConstant(Bool::False()); // Should be skipped. | 458 // Should be skipped. |
| 459 MakeDummyInstanceCall(assembler, Bool::False()); |
| 364 __ ReturnTOS(); | 460 __ ReturnTOS(); |
| 365 } | 461 } |
| 366 | 462 |
| 367 | 463 |
| 368 ASSEMBLER_TEST_RUN(GreaterThanTOSFalse, test) { | 464 ASSEMBLER_TEST_RUN(GreaterThanTOSFalse, test) { |
| 369 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); | 465 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); |
| 370 } | 466 } |
| 371 | 467 |
| 372 | 468 |
| 373 ASSEMBLER_TEST_GENERATE(GreaterThanTOSNonSmi, assembler) { | 469 ASSEMBLER_TEST_GENERATE(GreaterThanTOSNonSmi, assembler) { |
| 374 const String& numstr = | 470 const String& numstr = |
| 375 String::Handle(String::New("98765432198765432100", Heap::kOld)); | 471 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 376 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); | 472 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 377 __ PushConstant(Smi::Handle(Smi::New(-42))); | 473 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 378 __ GreaterThanTOS(); | 474 __ GreaterThanTOS(); |
| 379 __ PushConstant(Bool::True()); // Shouldn't be skipped. | 475 // Shouldn't be skipped. |
| 476 MakeDummyInstanceCall(assembler, Bool::True()); |
| 380 __ ReturnTOS(); | 477 __ ReturnTOS(); |
| 381 } | 478 } |
| 382 | 479 |
| 383 | 480 |
| 384 ASSEMBLER_TEST_RUN(GreaterThanTOSNonSmi, test) { | 481 ASSEMBLER_TEST_RUN(GreaterThanTOSNonSmi, test) { |
| 385 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); | 482 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 386 } | 483 } |
| 387 | 484 |
| 388 | 485 |
| 389 // - IfNeStrictTOS; IfEqStrictTOS; IfNeStrictNumTOS; IfEqStrictNumTOS | 486 // - IfNeStrictTOS; IfEqStrictTOS; IfNeStrictNumTOS; IfEqStrictNumTOS |
| (...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 770 __ PushConstant(Smi::Handle(Smi::New(37))); | 867 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 771 __ PushConstant(Smi::Handle(Smi::New(37))); | 868 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 772 __ PushConstant(Smi::Handle(Smi::New(37))); | 869 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 773 __ PushConstant(Smi::Handle(Smi::New(37))); | 870 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 774 __ PushConstant(Smi::Handle(Smi::New(37))); | 871 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 775 __ PushConstant(Smi::Handle(Smi::New(37))); | 872 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 776 __ PushConstant(Smi::Handle(Smi::New(37))); | 873 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 777 __ PushConstant(Smi::Handle(Smi::New(41))); | 874 __ PushConstant(Smi::Handle(Smi::New(41))); |
| 778 __ DropR(11); | 875 __ DropR(11); |
| 779 __ AddTOS(); | 876 __ AddTOS(); |
| 780 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. | 877 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 781 __ ReturnTOS(); | 878 __ ReturnTOS(); |
| 782 } | 879 } |
| 783 | 880 |
| 784 | 881 |
| 785 ASSEMBLER_TEST_RUN(DropR, test) { | 882 ASSEMBLER_TEST_RUN(DropR, test) { |
| 786 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 883 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 787 } | 884 } |
| 788 | 885 |
| 789 | 886 |
| 790 // - Frame D | 887 // - Frame D |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 833 | 930 |
| 834 // - StoreLocal rX; PopLocal rX | 931 // - StoreLocal rX; PopLocal rX |
| 835 // | 932 // |
| 836 // Store top of the stack into FP[rX] and pop it if needed. | 933 // Store top of the stack into FP[rX] and pop it if needed. |
| 837 // | 934 // |
| 838 // - Push rX | 935 // - Push rX |
| 839 // | 936 // |
| 840 // Push FP[rX] to the stack. | 937 // Push FP[rX] to the stack. |
| 841 ASSEMBLER_TEST_GENERATE(StoreLocalPush, assembler) { | 938 ASSEMBLER_TEST_GENERATE(StoreLocalPush, assembler) { |
| 842 __ Frame(1); | 939 __ Frame(1); |
| 940 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 843 __ PushConstant(Smi::Handle(Smi::New(21))); | 941 __ PushConstant(Smi::Handle(Smi::New(21))); |
| 844 __ StoreLocal(0); | 942 __ StoreLocal(0); |
| 845 __ Push(0); | 943 __ Push(0); |
| 846 __ AddTOS(); | 944 __ AddTOS(); |
| 847 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. | 945 // Should be skipped. |
| 946 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 848 __ ReturnTOS(); | 947 __ ReturnTOS(); |
| 849 } | 948 } |
| 850 | 949 |
| 851 | 950 |
| 852 ASSEMBLER_TEST_RUN(StoreLocalPush, test) { | 951 ASSEMBLER_TEST_RUN(StoreLocalPush, test) { |
| 853 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 952 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 854 } | 953 } |
| 855 | 954 |
| 856 | 955 |
| 857 ASSEMBLER_TEST_GENERATE(PopLocalPush, assembler) { | 956 ASSEMBLER_TEST_GENERATE(PopLocalPush, assembler) { |
| 858 __ Frame(1); | 957 __ Frame(1); |
| 859 __ PushConstant(Smi::Handle(Smi::New(21))); | 958 __ PushConstant(Smi::Handle(Smi::New(21))); |
| 860 __ PopLocal(0); | 959 __ PopLocal(0); |
| 861 __ Push(0); | 960 __ Push(0); |
| 862 __ Push(0); | 961 __ Push(0); |
| 863 __ AddTOS(); | 962 __ AddTOS(); |
| 864 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. | 963 // Should be skipped. |
| 964 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 865 __ ReturnTOS(); | 965 __ ReturnTOS(); |
| 866 } | 966 } |
| 867 | 967 |
| 868 | 968 |
| 869 ASSEMBLER_TEST_RUN(PopLocalPush, test) { | 969 ASSEMBLER_TEST_RUN(PopLocalPush, test) { |
| 870 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 970 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 871 } | 971 } |
| 872 | 972 |
| 873 | 973 |
| 874 ASSEMBLER_TEST_GENERATE(LoadConstantPush, assembler) { | 974 ASSEMBLER_TEST_GENERATE(LoadConstantPush, assembler) { |
| 875 __ Frame(1); | 975 __ Frame(1); |
| 876 __ LoadConstant(0, Smi::Handle(Smi::New(21))); | 976 __ LoadConstant(0, Smi::Handle(Smi::New(21))); |
| 877 __ Push(0); | 977 __ Push(0); |
| 878 __ Push(0); | 978 __ Push(0); |
| 879 __ AddTOS(); | 979 __ AddTOS(); |
| 880 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. | 980 // Should be skipped. |
| 981 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 881 __ ReturnTOS(); | 982 __ ReturnTOS(); |
| 882 } | 983 } |
| 883 | 984 |
| 884 | 985 |
| 885 ASSEMBLER_TEST_RUN(LoadConstantPush, test) { | 986 ASSEMBLER_TEST_RUN(LoadConstantPush, test) { |
| 886 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 987 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 887 } | 988 } |
| 888 | 989 |
| 889 | 990 |
| 890 // - Move rA, rX | 991 // - Move rA, rX |
| 891 // | 992 // |
| 892 // FP[rA] <- FP[rX] | 993 // FP[rA] <- FP[rX] |
| 893 // Note: rX is signed so it can be used to address parameters which are | 994 // Note: rX is signed so it can be used to address parameters which are |
| 894 // at negative indices with respect to FP. | 995 // at negative indices with respect to FP. |
| 895 ASSEMBLER_TEST_GENERATE(MoveLocalLocal, assembler) { | 996 ASSEMBLER_TEST_GENERATE(MoveLocalLocal, assembler) { |
| 896 __ Frame(2); | 997 __ Frame(2); |
| 897 __ PushConstant(Smi::Handle(Smi::New(21))); | 998 __ PushConstant(Smi::Handle(Smi::New(21))); |
| 898 __ PopLocal(0); | 999 __ PopLocal(0); |
| 899 __ Move(1, 0); | 1000 __ Move(1, 0); |
| 900 __ Push(0); | 1001 __ Push(0); |
| 901 __ Push(1); | 1002 __ Push(1); |
| 902 __ AddTOS(); | 1003 __ AddTOS(); |
| 903 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. | 1004 // Should be skipped. |
| 1005 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 904 __ ReturnTOS(); | 1006 __ ReturnTOS(); |
| 905 } | 1007 } |
| 906 | 1008 |
| 907 | 1009 |
| 908 ASSEMBLER_TEST_RUN(MoveLocalLocal, test) { | 1010 ASSEMBLER_TEST_RUN(MoveLocalLocal, test) { |
| 909 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1011 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 910 } | 1012 } |
| 911 | 1013 |
| 912 | 1014 |
| 913 // - Return R; ReturnTOS | 1015 // - Return R; ReturnTOS |
| (...skipping 30 matching lines...) Expand all Loading... |
| 944 __ Frame(2); | 1046 __ Frame(2); |
| 945 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1047 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 946 __ LoadConstant(1, Smi::Handle(Smi::New(0))); | 1048 __ LoadConstant(1, Smi::Handle(Smi::New(0))); |
| 947 | 1049 |
| 948 Label loop_entry, error; | 1050 Label loop_entry, error; |
| 949 __ Bind(&loop_entry); | 1051 __ Bind(&loop_entry); |
| 950 // Add 1 to FP[1]. | 1052 // Add 1 to FP[1]. |
| 951 __ PushConstant(Smi::Handle(Smi::New(1))); | 1053 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 952 __ Push(1); | 1054 __ Push(1); |
| 953 __ AddTOS(); | 1055 __ AddTOS(); |
| 954 __ Jump(&error); | 1056 // Should be skipped. |
| 1057 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(-1))); |
| 955 __ PopLocal(1); | 1058 __ PopLocal(1); |
| 956 | 1059 |
| 957 // Subtract 1 from FP[0]. | 1060 // Subtract 1 from FP[0]. |
| 958 __ Push(0); | 1061 __ Push(0); |
| 959 __ PushConstant(Smi::Handle(Smi::New(1))); | 1062 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 960 __ SubTOS(); | 1063 __ SubTOS(); |
| 961 __ Jump(&error); | 1064 // Should be skipped. |
| 1065 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(-1))); |
| 962 | 1066 |
| 963 // Jump to loop_entry if FP[0] != 0. | 1067 // Jump to loop_entry if FP[0] != 0. |
| 964 __ StoreLocal(0); | 1068 __ StoreLocal(0); |
| 965 __ PushConstant(Smi::Handle(Smi::New(0))); | 1069 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 966 __ IfNeStrictNumTOS(); | 1070 __ IfNeStrictNumTOS(); |
| 967 __ Jump(&loop_entry); | 1071 __ Jump(&loop_entry); |
| 968 | 1072 |
| 969 __ Return(1); | 1073 __ Return(1); |
| 970 | 1074 |
| 971 __ Bind(&error); | 1075 __ Bind(&error); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1024 const Object& obj = EXECUTE_TEST_CODE_OBJECT(test->code()); | 1128 const Object& obj = EXECUTE_TEST_CODE_OBJECT(test->code()); |
| 1025 EXPECT(obj.IsArray()); | 1129 EXPECT(obj.IsArray()); |
| 1026 Array& array = Array::Handle(); | 1130 Array& array = Array::Handle(); |
| 1027 array ^= obj.raw(); | 1131 array ^= obj.raw(); |
| 1028 EXPECT_EQ(10, array.Length()); | 1132 EXPECT_EQ(10, array.Length()); |
| 1029 } | 1133 } |
| 1030 | 1134 |
| 1031 } // namespace dart | 1135 } // namespace dart |
| 1032 | 1136 |
| 1033 #endif // defined(TARGET_ARCH_DBC) | 1137 #endif // defined(TARGET_ARCH_DBC) |
| OLD | NEW |