| OLD | NEW |
| (Empty) | |
| 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 |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 #include "vm/globals.h" |
| 6 #if defined(TARGET_ARCH_DBC) |
| 7 |
| 8 #include "vm/assembler.h" |
| 9 #include "vm/unit_test.h" |
| 10 |
| 11 namespace dart { |
| 12 |
| 13 #define __ assembler-> |
| 14 |
| 15 ASSEMBLER_TEST_GENERATE(Simple, assembler) { |
| 16 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 17 __ ReturnTOS(); |
| 18 } |
| 19 |
| 20 |
| 21 ASSEMBLER_TEST_RUN(Simple, test) { |
| 22 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 23 } |
| 24 |
| 25 |
| 26 // - AddTOS; SubTOS; MulTOS; BitOrTOS; BitAndTOS; EqualTOS; LessThanTOS; |
| 27 // GreaterThanTOS; |
| 28 // |
| 29 // Smi fast-path for a corresponding method. Checks if SP[0] and SP[-1] are |
| 30 // both smis and result of SP[0] <op> SP[-1] is a smi - if this is true |
| 31 // then pops operands and pushes result on the stack and skips the next |
| 32 // instruction (which implements a slow path fallback). |
| 33 ASSEMBLER_TEST_GENERATE(AddTOS, assembler) { |
| 34 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 35 __ PushConstant(Smi::Handle(Smi::New(84))); |
| 36 __ AddTOS(); |
| 37 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. |
| 38 __ ReturnTOS(); |
| 39 } |
| 40 |
| 41 |
| 42 ASSEMBLER_TEST_RUN(AddTOS, test) { |
| 43 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 44 } |
| 45 |
| 46 |
| 47 ASSEMBLER_TEST_GENERATE(AddTOSOverflow, assembler) { |
| 48 __ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue))); |
| 49 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 50 __ AddTOS(); |
| 51 __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. |
| 52 __ ReturnTOS(); |
| 53 } |
| 54 |
| 55 |
| 56 ASSEMBLER_TEST_RUN(AddTOSOverflow, test) { |
| 57 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 58 } |
| 59 |
| 60 |
| 61 ASSEMBLER_TEST_GENERATE(AddTOSNonSmi, assembler) { |
| 62 const String& numstr = |
| 63 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 64 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 65 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 66 __ AddTOS(); |
| 67 __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. |
| 68 __ ReturnTOS(); |
| 69 } |
| 70 |
| 71 |
| 72 ASSEMBLER_TEST_RUN(AddTOSNonSmi, test) { |
| 73 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 74 } |
| 75 |
| 76 |
| 77 ASSEMBLER_TEST_GENERATE(SubTOS, assembler) { |
| 78 __ PushConstant(Smi::Handle(Smi::New(30))); |
| 79 __ PushConstant(Smi::Handle(Smi::New(-12))); |
| 80 __ SubTOS(); |
| 81 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. |
| 82 __ ReturnTOS(); |
| 83 } |
| 84 |
| 85 |
| 86 ASSEMBLER_TEST_RUN(SubTOS, test) { |
| 87 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 88 } |
| 89 |
| 90 |
| 91 ASSEMBLER_TEST_GENERATE(SubTOSOverflow, assembler) { |
| 92 __ PushConstant(Smi::Handle(Smi::New(Smi::kMinValue))); |
| 93 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 94 __ SubTOS(); |
| 95 __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. |
| 96 __ ReturnTOS(); |
| 97 } |
| 98 |
| 99 |
| 100 ASSEMBLER_TEST_RUN(SubTOSOverflow, test) { |
| 101 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 102 } |
| 103 |
| 104 |
| 105 ASSEMBLER_TEST_GENERATE(SubTOSNonSmi, assembler) { |
| 106 const String& numstr = |
| 107 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 108 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 109 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 110 __ SubTOS(); |
| 111 __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. |
| 112 __ ReturnTOS(); |
| 113 } |
| 114 |
| 115 |
| 116 ASSEMBLER_TEST_RUN(SubTOSNonSmi, test) { |
| 117 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 118 } |
| 119 |
| 120 |
| 121 ASSEMBLER_TEST_GENERATE(MulTOS, assembler) { |
| 122 __ PushConstant(Smi::Handle(Smi::New(-6))); |
| 123 __ PushConstant(Smi::Handle(Smi::New(-7))); |
| 124 __ MulTOS(); |
| 125 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. |
| 126 __ ReturnTOS(); |
| 127 } |
| 128 |
| 129 |
| 130 ASSEMBLER_TEST_RUN(MulTOS, test) { |
| 131 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 132 } |
| 133 |
| 134 |
| 135 ASSEMBLER_TEST_GENERATE(MulTOSOverflow, assembler) { |
| 136 __ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue))); |
| 137 __ PushConstant(Smi::Handle(Smi::New(-8))); |
| 138 __ MulTOS(); |
| 139 __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. |
| 140 __ ReturnTOS(); |
| 141 } |
| 142 |
| 143 |
| 144 ASSEMBLER_TEST_RUN(MulTOSOverflow, test) { |
| 145 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 146 } |
| 147 |
| 148 |
| 149 ASSEMBLER_TEST_GENERATE(MulTOSNonSmi, assembler) { |
| 150 const String& numstr = |
| 151 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 152 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 153 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 154 __ MulTOS(); |
| 155 __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. |
| 156 __ ReturnTOS(); |
| 157 } |
| 158 |
| 159 |
| 160 ASSEMBLER_TEST_RUN(MulTOSNonSmi, test) { |
| 161 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 162 } |
| 163 |
| 164 |
| 165 ASSEMBLER_TEST_GENERATE(BitOrTOS, assembler) { |
| 166 __ PushConstant(Smi::Handle(Smi::New(0x22))); |
| 167 __ PushConstant(Smi::Handle(Smi::New(0x08))); |
| 168 __ BitOrTOS(); |
| 169 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. |
| 170 __ ReturnTOS(); |
| 171 } |
| 172 |
| 173 |
| 174 ASSEMBLER_TEST_RUN(BitOrTOS, test) { |
| 175 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 176 } |
| 177 |
| 178 |
| 179 ASSEMBLER_TEST_GENERATE(BitOrTOSNonSmi, assembler) { |
| 180 const String& numstr = |
| 181 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 182 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 183 __ PushConstant(Smi::Handle(Smi::New(0x08))); |
| 184 __ BitOrTOS(); |
| 185 __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. |
| 186 __ ReturnTOS(); |
| 187 } |
| 188 |
| 189 |
| 190 ASSEMBLER_TEST_RUN(BitOrTOSNonSmi, test) { |
| 191 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 192 } |
| 193 |
| 194 |
| 195 ASSEMBLER_TEST_GENERATE(BitAndTOS, assembler) { |
| 196 __ PushConstant(Smi::Handle(Smi::New(0x2a))); |
| 197 __ PushConstant(Smi::Handle(Smi::New(0xaa))); |
| 198 __ BitAndTOS(); |
| 199 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. |
| 200 __ ReturnTOS(); |
| 201 } |
| 202 |
| 203 |
| 204 ASSEMBLER_TEST_RUN(BitAndTOS, test) { |
| 205 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 206 } |
| 207 |
| 208 |
| 209 ASSEMBLER_TEST_GENERATE(BitAndTOSNonSmi, assembler) { |
| 210 const String& numstr = |
| 211 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 212 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 213 __ PushConstant(Smi::Handle(Smi::New(0x08))); |
| 214 __ BitAndTOS(); |
| 215 __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. |
| 216 __ ReturnTOS(); |
| 217 } |
| 218 |
| 219 |
| 220 ASSEMBLER_TEST_RUN(BitAndTOSNonSmi, test) { |
| 221 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 222 } |
| 223 |
| 224 |
| 225 ASSEMBLER_TEST_GENERATE(EqualTOSTrue, assembler) { |
| 226 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 227 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 228 __ EqualTOS(); |
| 229 __ PushConstant(Bool::False()); // Should be skipped. |
| 230 __ ReturnTOS(); |
| 231 } |
| 232 |
| 233 |
| 234 ASSEMBLER_TEST_RUN(EqualTOSTrue, test) { |
| 235 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 236 } |
| 237 |
| 238 |
| 239 ASSEMBLER_TEST_GENERATE(EqualTOSFalse, assembler) { |
| 240 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 241 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 242 __ EqualTOS(); |
| 243 __ PushConstant(Bool::True()); // Should be skipped. |
| 244 __ ReturnTOS(); |
| 245 } |
| 246 |
| 247 |
| 248 ASSEMBLER_TEST_RUN(EqualTOSFalse, test) { |
| 249 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); |
| 250 } |
| 251 |
| 252 |
| 253 ASSEMBLER_TEST_GENERATE(EqualTOSNonSmi, assembler) { |
| 254 const String& numstr = |
| 255 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 256 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 257 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 258 __ EqualTOS(); |
| 259 __ PushConstant(Bool::True()); // Shouldn't be skipped. |
| 260 __ ReturnTOS(); |
| 261 } |
| 262 |
| 263 |
| 264 ASSEMBLER_TEST_RUN(EqualTOSNonSmi, test) { |
| 265 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 266 } |
| 267 |
| 268 |
| 269 ASSEMBLER_TEST_GENERATE(LessThanTOSTrue, assembler) { |
| 270 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 271 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 272 __ LessThanTOS(); |
| 273 __ PushConstant(Bool::False()); // Should be skipped. |
| 274 __ ReturnTOS(); |
| 275 } |
| 276 |
| 277 |
| 278 ASSEMBLER_TEST_RUN(LessThanTOSTrue, test) { |
| 279 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 280 } |
| 281 |
| 282 |
| 283 ASSEMBLER_TEST_GENERATE(LessThanTOSFalse, assembler) { |
| 284 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 285 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 286 __ LessThanTOS(); |
| 287 __ PushConstant(Bool::False()); // Should be skipped. |
| 288 __ ReturnTOS(); |
| 289 } |
| 290 |
| 291 |
| 292 ASSEMBLER_TEST_RUN(LessThanTOSFalse, test) { |
| 293 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); |
| 294 } |
| 295 |
| 296 |
| 297 ASSEMBLER_TEST_GENERATE(LessThanTOSNonSmi, assembler) { |
| 298 const String& numstr = |
| 299 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 300 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 301 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 302 __ LessThanTOS(); |
| 303 __ PushConstant(Bool::True()); // Shouldn't be skipped. |
| 304 __ ReturnTOS(); |
| 305 } |
| 306 |
| 307 |
| 308 ASSEMBLER_TEST_RUN(LessThanTOSNonSmi, test) { |
| 309 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 310 } |
| 311 |
| 312 |
| 313 ASSEMBLER_TEST_GENERATE(GreaterThanTOSTrue, assembler) { |
| 314 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 315 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 316 __ GreaterThanTOS(); |
| 317 __ PushConstant(Bool::False()); // Should be skipped. |
| 318 __ ReturnTOS(); |
| 319 } |
| 320 |
| 321 |
| 322 ASSEMBLER_TEST_RUN(GreaterThanTOSTrue, test) { |
| 323 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 324 } |
| 325 |
| 326 |
| 327 ASSEMBLER_TEST_GENERATE(GreaterThanTOSFalse, assembler) { |
| 328 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 329 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 330 __ GreaterThanTOS(); |
| 331 __ PushConstant(Bool::False()); // Should be skipped. |
| 332 __ ReturnTOS(); |
| 333 } |
| 334 |
| 335 |
| 336 ASSEMBLER_TEST_RUN(GreaterThanTOSFalse, test) { |
| 337 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); |
| 338 } |
| 339 |
| 340 |
| 341 ASSEMBLER_TEST_GENERATE(GreaterThanTOSNonSmi, assembler) { |
| 342 const String& numstr = |
| 343 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 344 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 345 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 346 __ GreaterThanTOS(); |
| 347 __ PushConstant(Bool::True()); // Shouldn't be skipped. |
| 348 __ ReturnTOS(); |
| 349 } |
| 350 |
| 351 |
| 352 ASSEMBLER_TEST_RUN(GreaterThanTOSNonSmi, test) { |
| 353 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 354 } |
| 355 |
| 356 |
| 357 // - IfNeStrictTOS; IfEqStrictTOS; IfNeStrictNumTOS; IfEqStrictNumTOS |
| 358 // |
| 359 // Skips the next instruction unless the given condition holds. 'Num' |
| 360 // variants perform number check while non-Num variants just compare |
| 361 // RawObject pointers. |
| 362 // |
| 363 // Used to implement conditional jump: |
| 364 // |
| 365 // IfNeStrictTOS |
| 366 // Jump T ;; jump if not equal |
| 367 ASSEMBLER_TEST_GENERATE(IfNeStrictTOSTaken, assembler) { |
| 368 Label branch_taken; |
| 369 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld)); |
| 370 const Array& array2 = Array::Handle(Array::New(2, Heap::kOld)); |
| 371 __ PushConstant(array1); |
| 372 __ PushConstant(array2); |
| 373 __ IfNeStrictTOS(); |
| 374 __ Jump(&branch_taken); |
| 375 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 376 __ ReturnTOS(); |
| 377 __ Bind(&branch_taken); |
| 378 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 379 __ ReturnTOS(); |
| 380 } |
| 381 |
| 382 |
| 383 ASSEMBLER_TEST_RUN(IfNeStrictTOSTaken, test) { |
| 384 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 385 } |
| 386 |
| 387 |
| 388 ASSEMBLER_TEST_GENERATE(IfNeStrictTOSNotTaken, assembler) { |
| 389 Label branch_taken; |
| 390 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld)); |
| 391 __ PushConstant(array1); |
| 392 __ PushConstant(array1); |
| 393 __ IfNeStrictTOS(); |
| 394 __ Jump(&branch_taken); |
| 395 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 396 __ ReturnTOS(); |
| 397 __ Bind(&branch_taken); |
| 398 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 399 __ ReturnTOS(); |
| 400 } |
| 401 |
| 402 ASSEMBLER_TEST_RUN(IfNeStrictTOSNotTaken, test) { |
| 403 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 404 } |
| 405 |
| 406 |
| 407 // TODO(zra): Also add tests that use Mint, Bignum. |
| 408 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSTaken, assembler) { |
| 409 Label branch_taken; |
| 410 __ PushConstant(Smi::Handle(Smi::New(-1))); |
| 411 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 412 __ IfNeStrictNumTOS(); |
| 413 __ Jump(&branch_taken); |
| 414 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 415 __ ReturnTOS(); |
| 416 __ Bind(&branch_taken); |
| 417 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 418 __ ReturnTOS(); |
| 419 } |
| 420 |
| 421 |
| 422 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSTaken, test) { |
| 423 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 424 } |
| 425 |
| 426 |
| 427 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSNotTaken, assembler) { |
| 428 Label branch_taken; |
| 429 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 430 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 431 __ IfNeStrictNumTOS(); |
| 432 __ Jump(&branch_taken); |
| 433 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 434 __ ReturnTOS(); |
| 435 __ Bind(&branch_taken); |
| 436 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 437 __ ReturnTOS(); |
| 438 } |
| 439 |
| 440 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSNotTaken, test) { |
| 441 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 442 } |
| 443 |
| 444 |
| 445 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSTakenDouble, assembler) { |
| 446 Label branch_taken; |
| 447 __ PushConstant(Double::Handle(Double::New(-1.0, Heap::kOld))); |
| 448 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); |
| 449 __ IfNeStrictNumTOS(); |
| 450 __ Jump(&branch_taken); |
| 451 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 452 __ ReturnTOS(); |
| 453 __ Bind(&branch_taken); |
| 454 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 455 __ ReturnTOS(); |
| 456 } |
| 457 |
| 458 |
| 459 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSTakenDouble, test) { |
| 460 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 461 } |
| 462 |
| 463 |
| 464 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSNotTakenDouble, assembler) { |
| 465 Label branch_taken; |
| 466 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); |
| 467 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); |
| 468 __ IfNeStrictNumTOS(); |
| 469 __ Jump(&branch_taken); |
| 470 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 471 __ ReturnTOS(); |
| 472 __ Bind(&branch_taken); |
| 473 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 474 __ ReturnTOS(); |
| 475 } |
| 476 |
| 477 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSNotTakenDouble, test) { |
| 478 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 479 } |
| 480 |
| 481 |
| 482 ASSEMBLER_TEST_GENERATE(IfEqStrictTOSTaken, assembler) { |
| 483 Label branch_taken; |
| 484 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld)); |
| 485 __ PushConstant(array1); |
| 486 __ PushConstant(array1); |
| 487 __ IfEqStrictTOS(); |
| 488 __ Jump(&branch_taken); |
| 489 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 490 __ ReturnTOS(); |
| 491 __ Bind(&branch_taken); |
| 492 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 493 __ ReturnTOS(); |
| 494 } |
| 495 |
| 496 |
| 497 ASSEMBLER_TEST_RUN(IfEqStrictTOSTaken, test) { |
| 498 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 499 } |
| 500 |
| 501 |
| 502 ASSEMBLER_TEST_GENERATE(IfEqStrictTOSNotTaken, assembler) { |
| 503 Label branch_taken; |
| 504 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld)); |
| 505 const Array& array2 = Array::Handle(Array::New(2, Heap::kOld)); |
| 506 __ PushConstant(array1); |
| 507 __ PushConstant(array2); |
| 508 __ IfEqStrictTOS(); |
| 509 __ Jump(&branch_taken); |
| 510 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 511 __ ReturnTOS(); |
| 512 __ Bind(&branch_taken); |
| 513 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 514 __ ReturnTOS(); |
| 515 } |
| 516 |
| 517 ASSEMBLER_TEST_RUN(IfEqStrictTOSNotTaken, test) { |
| 518 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 519 } |
| 520 |
| 521 |
| 522 // TODO(zra): Also add tests that use Mint, Bignum. |
| 523 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSTaken, assembler) { |
| 524 Label branch_taken; |
| 525 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 526 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 527 __ IfEqStrictNumTOS(); |
| 528 __ Jump(&branch_taken); |
| 529 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 530 __ ReturnTOS(); |
| 531 __ Bind(&branch_taken); |
| 532 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 533 __ ReturnTOS(); |
| 534 } |
| 535 |
| 536 |
| 537 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSTaken, test) { |
| 538 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 539 } |
| 540 |
| 541 |
| 542 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSNotTaken, assembler) { |
| 543 Label branch_taken; |
| 544 __ PushConstant(Smi::Handle(Smi::New(-1))); |
| 545 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 546 __ IfEqStrictNumTOS(); |
| 547 __ Jump(&branch_taken); |
| 548 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 549 __ ReturnTOS(); |
| 550 __ Bind(&branch_taken); |
| 551 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 552 __ ReturnTOS(); |
| 553 } |
| 554 |
| 555 |
| 556 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSNotTaken, test) { |
| 557 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 558 } |
| 559 |
| 560 |
| 561 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSTakenDouble, assembler) { |
| 562 Label branch_taken; |
| 563 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); |
| 564 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); |
| 565 __ IfEqStrictNumTOS(); |
| 566 __ Jump(&branch_taken); |
| 567 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 568 __ ReturnTOS(); |
| 569 __ Bind(&branch_taken); |
| 570 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 571 __ ReturnTOS(); |
| 572 } |
| 573 |
| 574 |
| 575 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSTakenDouble, test) { |
| 576 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 577 } |
| 578 |
| 579 |
| 580 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSNotTakenDouble, assembler) { |
| 581 Label branch_taken; |
| 582 __ PushConstant(Double::Handle(Double::New(-1.0, Heap::kOld))); |
| 583 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); |
| 584 __ IfEqStrictNumTOS(); |
| 585 __ Jump(&branch_taken); |
| 586 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 587 __ ReturnTOS(); |
| 588 __ Bind(&branch_taken); |
| 589 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 590 __ ReturnTOS(); |
| 591 } |
| 592 |
| 593 |
| 594 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSNotTakenDouble, test) { |
| 595 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 596 } |
| 597 |
| 598 } // namespace dart |
| 599 |
| 600 #endif // defined(TARGET_ARCH_DBC) |
| OLD | NEW |