| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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_ARM64) | 6 #if defined(TARGET_ARCH_ARM64) |
| 7 | 7 |
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/cpu.h" | 9 #include "vm/cpu.h" |
| 10 #include "vm/os.h" | 10 #include "vm/os.h" |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 | 383 |
| 384 | 384 |
| 385 ASSEMBLER_TEST_RUN(WordOverflow, test) { | 385 ASSEMBLER_TEST_RUN(WordOverflow, test) { |
| 386 typedef int64_t (*Int64Return)() DART_UNUSED; | 386 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 387 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 387 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 388 } | 388 } |
| 389 | 389 |
| 390 | 390 |
| 391 // Loads and Stores. | 391 // Loads and Stores. |
| 392 ASSEMBLER_TEST_GENERATE(SimpleLoadStore, assembler) { | 392 ASSEMBLER_TEST_GENERATE(SimpleLoadStore, assembler) { |
| 393 __ SetupDartSP(kTestStackSpace); | 393 __ SetupDartSP(); |
| 394 __ movz(R0, Immediate(43), 0); | 394 __ movz(R0, Immediate(43), 0); |
| 395 __ movz(R1, Immediate(42), 0); | 395 __ movz(R1, Immediate(42), 0); |
| 396 __ str(R1, Address(SP, -1*kWordSize, Address::PreIndex)); | 396 __ str(R1, Address(SP, -1*kWordSize, Address::PreIndex)); |
| 397 __ ldr(R0, Address(SP, 1*kWordSize, Address::PostIndex)); | 397 __ ldr(R0, Address(SP, 1*kWordSize, Address::PostIndex)); |
| 398 __ mov(CSP, SP); | 398 __ RestoreCSP(); |
| 399 __ ret(); | 399 __ ret(); |
| 400 } | 400 } |
| 401 | 401 |
| 402 | 402 |
| 403 ASSEMBLER_TEST_RUN(SimpleLoadStore, test) { | 403 ASSEMBLER_TEST_RUN(SimpleLoadStore, test) { |
| 404 typedef int64_t (*Int64Return)() DART_UNUSED; | 404 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 405 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 405 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 406 } | 406 } |
| 407 | 407 |
| 408 | 408 |
| 409 ASSEMBLER_TEST_GENERATE(SimpleLoadStoreHeapTag, assembler) { | 409 ASSEMBLER_TEST_GENERATE(SimpleLoadStoreHeapTag, assembler) { |
| 410 __ SetupDartSP(kTestStackSpace); | 410 __ SetupDartSP(); |
| 411 __ movz(R0, Immediate(43), 0); | 411 __ movz(R0, Immediate(43), 0); |
| 412 __ movz(R1, Immediate(42), 0); | 412 __ movz(R1, Immediate(42), 0); |
| 413 __ add(R2, SP, Operand(1)); | 413 __ add(R2, SP, Operand(1)); |
| 414 __ str(R1, Address(R2, -1)); | 414 __ str(R1, Address(R2, -1)); |
| 415 __ ldr(R0, Address(R2, -1)); | 415 __ ldr(R0, Address(R2, -1)); |
| 416 __ mov(CSP, SP); | 416 __ RestoreCSP(); |
| 417 __ ret(); | 417 __ ret(); |
| 418 } | 418 } |
| 419 | 419 |
| 420 | 420 |
| 421 ASSEMBLER_TEST_RUN(SimpleLoadStoreHeapTag, test) { | 421 ASSEMBLER_TEST_RUN(SimpleLoadStoreHeapTag, test) { |
| 422 typedef int64_t (*Int64Return)() DART_UNUSED; | 422 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 423 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 423 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 424 } | 424 } |
| 425 | 425 |
| 426 | 426 |
| 427 ASSEMBLER_TEST_GENERATE(LoadStoreLargeIndex, assembler) { | 427 ASSEMBLER_TEST_GENERATE(LoadStoreLargeIndex, assembler) { |
| 428 __ SetupDartSP(kTestStackSpace); | 428 __ SetupDartSP(); |
| 429 __ movz(R0, Immediate(43), 0); | 429 __ movz(R0, Immediate(43), 0); |
| 430 __ movz(R1, Immediate(42), 0); | 430 __ movz(R1, Immediate(42), 0); |
| 431 // Largest negative offset that can fit in the signed 9-bit immediate field. | 431 // Largest negative offset that can fit in the signed 9-bit immediate field. |
| 432 __ str(R1, Address(SP, -32*kWordSize, Address::PreIndex)); | 432 __ str(R1, Address(SP, -32*kWordSize, Address::PreIndex)); |
| 433 // Largest positive kWordSize aligned offset that we can fit. | 433 // Largest positive kWordSize aligned offset that we can fit. |
| 434 __ ldr(R0, Address(SP, 31*kWordSize, Address::PostIndex)); | 434 __ ldr(R0, Address(SP, 31*kWordSize, Address::PostIndex)); |
| 435 // Correction. | 435 // Correction. |
| 436 __ add(SP, SP, Operand(kWordSize)); // Restore SP. | 436 __ add(SP, SP, Operand(kWordSize)); // Restore SP. |
| 437 __ mov(CSP, SP); | 437 __ RestoreCSP(); |
| 438 __ ret(); | 438 __ ret(); |
| 439 } | 439 } |
| 440 | 440 |
| 441 | 441 |
| 442 ASSEMBLER_TEST_RUN(LoadStoreLargeIndex, test) { | 442 ASSEMBLER_TEST_RUN(LoadStoreLargeIndex, test) { |
| 443 typedef int64_t (*Int64Return)() DART_UNUSED; | 443 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 444 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 444 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 445 } | 445 } |
| 446 | 446 |
| 447 | 447 |
| 448 ASSEMBLER_TEST_GENERATE(LoadStoreLargeOffset, assembler) { | 448 ASSEMBLER_TEST_GENERATE(LoadStoreLargeOffset, assembler) { |
| 449 __ SetupDartSP(kTestStackSpace); | 449 __ SetupDartSP(); |
| 450 __ movz(R0, Immediate(43), 0); | 450 __ movz(R0, Immediate(43), 0); |
| 451 __ movz(R1, Immediate(42), 0); | 451 __ movz(R1, Immediate(42), 0); |
| 452 __ sub(SP, SP, Operand(512*kWordSize)); | 452 __ sub(SP, SP, Operand(512*kWordSize)); |
| 453 __ str(R1, Address(SP, 512*kWordSize, Address::Offset)); | 453 __ str(R1, Address(SP, 512*kWordSize, Address::Offset)); |
| 454 __ add(SP, SP, Operand(512*kWordSize)); | 454 __ add(SP, SP, Operand(512*kWordSize)); |
| 455 __ ldr(R0, Address(SP)); | 455 __ ldr(R0, Address(SP)); |
| 456 __ mov(CSP, SP); | 456 __ RestoreCSP(); |
| 457 __ ret(); | 457 __ ret(); |
| 458 } | 458 } |
| 459 | 459 |
| 460 | 460 |
| 461 ASSEMBLER_TEST_RUN(LoadStoreLargeOffset, test) { | 461 ASSEMBLER_TEST_RUN(LoadStoreLargeOffset, test) { |
| 462 typedef int64_t (*Int64Return)() DART_UNUSED; | 462 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 463 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 463 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 464 } | 464 } |
| 465 | 465 |
| 466 | 466 |
| 467 ASSEMBLER_TEST_GENERATE(LoadStoreExtReg, assembler) { | 467 ASSEMBLER_TEST_GENERATE(LoadStoreExtReg, assembler) { |
| 468 __ SetupDartSP(kTestStackSpace); | 468 __ SetupDartSP(); |
| 469 __ movz(R0, Immediate(43), 0); | 469 __ movz(R0, Immediate(43), 0); |
| 470 __ movz(R1, Immediate(42), 0); | 470 __ movz(R1, Immediate(42), 0); |
| 471 __ movz(R2, Immediate(0xfff8), 0); | 471 __ movz(R2, Immediate(0xfff8), 0); |
| 472 __ movk(R2, Immediate(0xffff), 1); // R2 <- -8 (int32_t). | 472 __ movk(R2, Immediate(0xffff), 1); // R2 <- -8 (int32_t). |
| 473 // This should sign extend R2, and add to SP to get address, | 473 // This should sign extend R2, and add to SP to get address, |
| 474 // i.e. SP - kWordSize. | 474 // i.e. SP - kWordSize. |
| 475 __ str(R1, Address(SP, R2, SXTW)); | 475 __ str(R1, Address(SP, R2, SXTW)); |
| 476 __ sub(SP, SP, Operand(kWordSize)); | 476 __ sub(SP, SP, Operand(kWordSize)); |
| 477 __ ldr(R0, Address(SP)); | 477 __ ldr(R0, Address(SP)); |
| 478 __ add(SP, SP, Operand(kWordSize)); | 478 __ add(SP, SP, Operand(kWordSize)); |
| 479 __ mov(CSP, SP); | 479 __ RestoreCSP(); |
| 480 __ ret(); | 480 __ ret(); |
| 481 } | 481 } |
| 482 | 482 |
| 483 | 483 |
| 484 ASSEMBLER_TEST_RUN(LoadStoreExtReg, test) { | 484 ASSEMBLER_TEST_RUN(LoadStoreExtReg, test) { |
| 485 typedef int64_t (*Int64Return)() DART_UNUSED; | 485 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 486 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 486 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 487 } | 487 } |
| 488 | 488 |
| 489 | 489 |
| 490 ASSEMBLER_TEST_GENERATE(LoadStoreScaledReg, assembler) { | 490 ASSEMBLER_TEST_GENERATE(LoadStoreScaledReg, assembler) { |
| 491 __ SetupDartSP(kTestStackSpace); | 491 __ SetupDartSP(); |
| 492 __ movz(R0, Immediate(43), 0); | 492 __ movz(R0, Immediate(43), 0); |
| 493 __ movz(R1, Immediate(42), 0); | 493 __ movz(R1, Immediate(42), 0); |
| 494 __ movz(R2, Immediate(10), 0); | 494 __ movz(R2, Immediate(10), 0); |
| 495 __ sub(SP, SP, Operand(10*kWordSize)); | 495 __ sub(SP, SP, Operand(10*kWordSize)); |
| 496 // Store R1 into SP + R2 * kWordSize. | 496 // Store R1 into SP + R2 * kWordSize. |
| 497 __ str(R1, Address(SP, R2, UXTX, Address::Scaled)); | 497 __ str(R1, Address(SP, R2, UXTX, Address::Scaled)); |
| 498 __ ldr(R0, Address(SP, R2, UXTX, Address::Scaled)); | 498 __ ldr(R0, Address(SP, R2, UXTX, Address::Scaled)); |
| 499 __ add(SP, SP, Operand(10*kWordSize)); | 499 __ add(SP, SP, Operand(10*kWordSize)); |
| 500 __ mov(CSP, SP); | 500 __ RestoreCSP(); |
| 501 __ ret(); | 501 __ ret(); |
| 502 } | 502 } |
| 503 | 503 |
| 504 | 504 |
| 505 ASSEMBLER_TEST_RUN(LoadStoreScaledReg, test) { | 505 ASSEMBLER_TEST_RUN(LoadStoreScaledReg, test) { |
| 506 typedef int64_t (*Int64Return)() DART_UNUSED; | 506 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 507 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 507 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 508 } | 508 } |
| 509 | 509 |
| 510 | 510 |
| 511 ASSEMBLER_TEST_GENERATE(LoadSigned32Bit, assembler) { | 511 ASSEMBLER_TEST_GENERATE(LoadSigned32Bit, assembler) { |
| 512 __ SetupDartSP(kTestStackSpace); | 512 __ SetupDartSP(); |
| 513 __ LoadImmediate(R1, 0xffffffff); | 513 __ LoadImmediate(R1, 0xffffffff); |
| 514 __ str(R1, Address(SP, -4, Address::PreIndex, kWord), kWord); | 514 __ str(R1, Address(SP, -4, Address::PreIndex, kWord), kWord); |
| 515 __ ldr(R0, Address(SP), kWord); | 515 __ ldr(R0, Address(SP), kWord); |
| 516 __ ldr(R1, Address(SP, 4, Address::PostIndex, kWord), kWord); | 516 __ ldr(R1, Address(SP, 4, Address::PostIndex, kWord), kWord); |
| 517 __ mov(CSP, SP); | 517 __ RestoreCSP(); |
| 518 __ ret(); | 518 __ ret(); |
| 519 } | 519 } |
| 520 | 520 |
| 521 | 521 |
| 522 ASSEMBLER_TEST_RUN(LoadSigned32Bit, test) { | 522 ASSEMBLER_TEST_RUN(LoadSigned32Bit, test) { |
| 523 typedef int64_t (*Int64Return)() DART_UNUSED; | 523 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 524 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 524 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 525 } | 525 } |
| 526 | 526 |
| 527 | 527 |
| 528 ASSEMBLER_TEST_GENERATE(SimpleLoadStorePair, assembler) { | 528 ASSEMBLER_TEST_GENERATE(SimpleLoadStorePair, assembler) { |
| 529 __ SetupDartSP(kTestStackSpace); | 529 __ SetupDartSP(); |
| 530 __ LoadImmediate(R2, 43); | 530 __ LoadImmediate(R2, 43); |
| 531 __ LoadImmediate(R3, 42); | 531 __ LoadImmediate(R3, 42); |
| 532 __ stp(R2, R3, Address(SP, -2*kWordSize, Address::PairPreIndex)); | 532 __ stp(R2, R3, Address(SP, -2*kWordSize, Address::PairPreIndex)); |
| 533 __ ldp(R0, R1, Address(SP, 2*kWordSize, Address::PairPostIndex)); | 533 __ ldp(R0, R1, Address(SP, 2*kWordSize, Address::PairPostIndex)); |
| 534 __ sub(R0, R0, Operand(R1)); | 534 __ sub(R0, R0, Operand(R1)); |
| 535 __ mov(CSP, SP); | 535 __ RestoreCSP(); |
| 536 __ ret(); | 536 __ ret(); |
| 537 } | 537 } |
| 538 | 538 |
| 539 | 539 |
| 540 ASSEMBLER_TEST_RUN(SimpleLoadStorePair, test) { | 540 ASSEMBLER_TEST_RUN(SimpleLoadStorePair, test) { |
| 541 typedef int64_t (*Int64Return)() DART_UNUSED; | 541 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 542 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 542 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 543 } | 543 } |
| 544 | 544 |
| 545 | 545 |
| 546 ASSEMBLER_TEST_GENERATE(LoadStorePairOffset, assembler) { | 546 ASSEMBLER_TEST_GENERATE(LoadStorePairOffset, assembler) { |
| 547 __ SetupDartSP(kTestStackSpace); | 547 __ SetupDartSP(); |
| 548 __ LoadImmediate(R2, 43); | 548 __ LoadImmediate(R2, 43); |
| 549 __ LoadImmediate(R3, 42); | 549 __ LoadImmediate(R3, 42); |
| 550 __ sub(SP, SP, Operand(4 * kWordSize)); | 550 __ sub(SP, SP, Operand(4 * kWordSize)); |
| 551 __ stp(R2, R3, Address::Pair(SP, 2 * kWordSize)); | 551 __ stp(R2, R3, Address::Pair(SP, 2 * kWordSize)); |
| 552 __ ldp(R0, R1, Address::Pair(SP, 2 * kWordSize)); | 552 __ ldp(R0, R1, Address::Pair(SP, 2 * kWordSize)); |
| 553 __ add(SP, SP, Operand(4 * kWordSize)); | 553 __ add(SP, SP, Operand(4 * kWordSize)); |
| 554 __ sub(R0, R0, Operand(R1)); | 554 __ sub(R0, R0, Operand(R1)); |
| 555 __ mov(CSP, SP); | 555 __ RestoreCSP(); |
| 556 __ ret(); | 556 __ ret(); |
| 557 } | 557 } |
| 558 | 558 |
| 559 | 559 |
| 560 ASSEMBLER_TEST_RUN(LoadStorePairOffset, test) { | 560 ASSEMBLER_TEST_RUN(LoadStorePairOffset, test) { |
| 561 typedef int64_t (*Int64Return)() DART_UNUSED; | 561 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 562 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 562 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 563 } | 563 } |
| 564 | 564 |
| 565 | 565 |
| 566 ASSEMBLER_TEST_GENERATE(Semaphore, assembler) { | 566 ASSEMBLER_TEST_GENERATE(Semaphore, assembler) { |
| 567 __ SetupDartSP(kTestStackSpace); | 567 __ SetupDartSP(); |
| 568 __ movz(R0, Immediate(40), 0); | 568 __ movz(R0, Immediate(40), 0); |
| 569 __ movz(R1, Immediate(42), 0); | 569 __ movz(R1, Immediate(42), 0); |
| 570 __ Push(R0); | 570 __ Push(R0); |
| 571 Label retry; | 571 Label retry; |
| 572 __ Bind(&retry); | 572 __ Bind(&retry); |
| 573 __ ldxr(R0, SP); | 573 __ ldxr(R0, SP); |
| 574 __ stxr(TMP, R1, SP); // IP == 0, success | 574 __ stxr(TMP, R1, SP); // IP == 0, success |
| 575 __ cmp(TMP, Operand(0)); | 575 __ cmp(TMP, Operand(0)); |
| 576 __ b(&retry, NE); // NE if context switch occurred between ldrex and strex. | 576 __ b(&retry, NE); // NE if context switch occurred between ldrex and strex. |
| 577 __ Pop(R0); // 42 | 577 __ Pop(R0); // 42 |
| 578 __ mov(CSP, SP); | 578 __ RestoreCSP(); |
| 579 __ ret(); | 579 __ ret(); |
| 580 } | 580 } |
| 581 | 581 |
| 582 | 582 |
| 583 ASSEMBLER_TEST_RUN(Semaphore, test) { | 583 ASSEMBLER_TEST_RUN(Semaphore, test) { |
| 584 EXPECT(test != NULL); | 584 EXPECT(test != NULL); |
| 585 typedef int (*Semaphore)() DART_UNUSED; | 585 typedef int (*Semaphore)() DART_UNUSED; |
| 586 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Semaphore, test->entry())); | 586 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Semaphore, test->entry())); |
| 587 } | 587 } |
| 588 | 588 |
| 589 | 589 |
| 590 ASSEMBLER_TEST_GENERATE(FailedSemaphore, assembler) { | 590 ASSEMBLER_TEST_GENERATE(FailedSemaphore, assembler) { |
| 591 __ SetupDartSP(kTestStackSpace); | 591 __ SetupDartSP(); |
| 592 __ movz(R0, Immediate(40), 0); | 592 __ movz(R0, Immediate(40), 0); |
| 593 __ movz(R1, Immediate(42), 0); | 593 __ movz(R1, Immediate(42), 0); |
| 594 __ Push(R0); | 594 __ Push(R0); |
| 595 __ ldxr(R0, SP); | 595 __ ldxr(R0, SP); |
| 596 __ clrex(); // Simulate a context switch. | 596 __ clrex(); // Simulate a context switch. |
| 597 __ stxr(TMP, R1, SP); // IP == 1, failure | 597 __ stxr(TMP, R1, SP); // IP == 1, failure |
| 598 __ Pop(R0); // 40 | 598 __ Pop(R0); // 40 |
| 599 __ add(R0, R0, Operand(TMP)); | 599 __ add(R0, R0, Operand(TMP)); |
| 600 __ mov(CSP, SP); | 600 __ RestoreCSP(); |
| 601 __ ret(); | 601 __ ret(); |
| 602 } | 602 } |
| 603 | 603 |
| 604 | 604 |
| 605 ASSEMBLER_TEST_RUN(FailedSemaphore, test) { | 605 ASSEMBLER_TEST_RUN(FailedSemaphore, test) { |
| 606 EXPECT(test != NULL); | 606 EXPECT(test != NULL); |
| 607 typedef int (*FailedSemaphore)() DART_UNUSED; | 607 typedef int (*FailedSemaphore)() DART_UNUSED; |
| 608 EXPECT_EQ(41, EXECUTE_TEST_CODE_INT64(FailedSemaphore, test->entry())); | 608 EXPECT_EQ(41, EXECUTE_TEST_CODE_INT64(FailedSemaphore, test->entry())); |
| 609 } | 609 } |
| 610 | 610 |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 716 __ ret(); | 716 __ ret(); |
| 717 } | 717 } |
| 718 | 718 |
| 719 | 719 |
| 720 ASSEMBLER_TEST_RUN(AndImm, test) { | 720 ASSEMBLER_TEST_RUN(AndImm, test) { |
| 721 typedef int64_t (*Int64Return)() DART_UNUSED; | 721 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 722 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 722 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 723 } | 723 } |
| 724 | 724 |
| 725 | 725 |
| 726 ASSEMBLER_TEST_GENERATE(AndImmCsp, assembler) { |
| 727 // Note we must maintain the ARM64 ABI invariants on CSP here. |
| 728 __ mov(TMP, CSP); |
| 729 __ sub(TMP2, CSP, Operand(31)); |
| 730 __ andi(CSP, TMP2, Immediate(~15)); |
| 731 __ mov(R0, CSP); |
| 732 __ sub(R0, TMP, Operand(R0)); |
| 733 __ mov(CSP, TMP); |
| 734 __ ret(); |
| 735 } |
| 736 |
| 737 |
| 738 ASSEMBLER_TEST_RUN(AndImmCsp, test) { |
| 739 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 740 EXPECT_EQ(32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 741 } |
| 742 |
| 743 |
| 726 ASSEMBLER_TEST_GENERATE(AndOneImm, assembler) { | 744 ASSEMBLER_TEST_GENERATE(AndOneImm, assembler) { |
| 727 __ movz(R1, Immediate(43), 0); | 745 __ movz(R1, Immediate(43), 0); |
| 728 __ andi(R0, R1, Immediate(1)); | 746 __ andi(R0, R1, Immediate(1)); |
| 729 __ ret(); | 747 __ ret(); |
| 730 } | 748 } |
| 731 | 749 |
| 732 | 750 |
| 733 ASSEMBLER_TEST_RUN(AndOneImm, test) { | 751 ASSEMBLER_TEST_RUN(AndOneImm, test) { |
| 734 typedef int64_t (*Int64Return)() DART_UNUSED; | 752 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 735 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 753 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| (...skipping 946 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1682 static void LeaveTestFrame(Assembler* assembler) { | 1700 static void LeaveTestFrame(Assembler* assembler) { |
| 1683 __ PopAndUntagPP(); | 1701 __ PopAndUntagPP(); |
| 1684 __ Pop(THR); | 1702 __ Pop(THR); |
| 1685 __ Pop(CODE_REG); | 1703 __ Pop(CODE_REG); |
| 1686 __ LeaveFrame(); | 1704 __ LeaveFrame(); |
| 1687 } | 1705 } |
| 1688 | 1706 |
| 1689 | 1707 |
| 1690 // Loading immediate values with the object pool. | 1708 // Loading immediate values with the object pool. |
| 1691 ASSEMBLER_TEST_GENERATE(LoadImmediatePPSmall, assembler) { | 1709 ASSEMBLER_TEST_GENERATE(LoadImmediatePPSmall, assembler) { |
| 1692 __ SetupDartSP(kTestStackSpace); | 1710 __ SetupDartSP(); |
| 1693 EnterTestFrame(assembler); | 1711 EnterTestFrame(assembler); |
| 1694 __ LoadImmediate(R0, 42); | 1712 __ LoadImmediate(R0, 42); |
| 1695 LeaveTestFrame(assembler); | 1713 LeaveTestFrame(assembler); |
| 1696 __ mov(CSP, SP); | 1714 __ RestoreCSP(); |
| 1697 __ ret(); | 1715 __ ret(); |
| 1698 } | 1716 } |
| 1699 | 1717 |
| 1700 | 1718 |
| 1701 ASSEMBLER_TEST_RUN(LoadImmediatePPSmall, test) { | 1719 ASSEMBLER_TEST_RUN(LoadImmediatePPSmall, test) { |
| 1702 EXPECT_EQ(42, test->InvokeWithCodeAndThread<int64_t>()); | 1720 EXPECT_EQ(42, test->InvokeWithCodeAndThread<int64_t>()); |
| 1703 } | 1721 } |
| 1704 | 1722 |
| 1705 | 1723 |
| 1706 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed, assembler) { | 1724 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed, assembler) { |
| 1707 __ SetupDartSP(kTestStackSpace); | 1725 __ SetupDartSP(); |
| 1708 EnterTestFrame(assembler); | 1726 EnterTestFrame(assembler); |
| 1709 __ LoadImmediate(R0, 0xf1234123); | 1727 __ LoadImmediate(R0, 0xf1234123); |
| 1710 LeaveTestFrame(assembler); | 1728 LeaveTestFrame(assembler); |
| 1711 __ mov(CSP, SP); | 1729 __ RestoreCSP(); |
| 1712 __ ret(); | 1730 __ ret(); |
| 1713 } | 1731 } |
| 1714 | 1732 |
| 1715 | 1733 |
| 1716 ASSEMBLER_TEST_RUN(LoadImmediatePPMed, test) { | 1734 ASSEMBLER_TEST_RUN(LoadImmediatePPMed, test) { |
| 1717 EXPECT_EQ(0xf1234123, test->InvokeWithCodeAndThread<int64_t>()); | 1735 EXPECT_EQ(0xf1234123, test->InvokeWithCodeAndThread<int64_t>()); |
| 1718 } | 1736 } |
| 1719 | 1737 |
| 1720 | 1738 |
| 1721 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed2, assembler) { | 1739 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed2, assembler) { |
| 1722 __ SetupDartSP(kTestStackSpace); | 1740 __ SetupDartSP(); |
| 1723 EnterTestFrame(assembler); | 1741 EnterTestFrame(assembler); |
| 1724 __ LoadImmediate(R0, 0x4321f1234124); | 1742 __ LoadImmediate(R0, 0x4321f1234124); |
| 1725 LeaveTestFrame(assembler); | 1743 LeaveTestFrame(assembler); |
| 1726 __ mov(CSP, SP); | 1744 __ RestoreCSP(); |
| 1727 __ ret(); | 1745 __ ret(); |
| 1728 } | 1746 } |
| 1729 | 1747 |
| 1730 | 1748 |
| 1731 ASSEMBLER_TEST_RUN(LoadImmediatePPMed2, test) { | 1749 ASSEMBLER_TEST_RUN(LoadImmediatePPMed2, test) { |
| 1732 EXPECT_EQ(0x4321f1234124, test->InvokeWithCodeAndThread<int64_t>()); | 1750 EXPECT_EQ(0x4321f1234124, test->InvokeWithCodeAndThread<int64_t>()); |
| 1733 } | 1751 } |
| 1734 | 1752 |
| 1735 | 1753 |
| 1736 ASSEMBLER_TEST_GENERATE(LoadImmediatePPLarge, assembler) { | 1754 ASSEMBLER_TEST_GENERATE(LoadImmediatePPLarge, assembler) { |
| 1737 __ SetupDartSP(kTestStackSpace); | 1755 __ SetupDartSP(); |
| 1738 EnterTestFrame(assembler); | 1756 EnterTestFrame(assembler); |
| 1739 __ LoadImmediate(R0, 0x9287436598237465); | 1757 __ LoadImmediate(R0, 0x9287436598237465); |
| 1740 LeaveTestFrame(assembler); | 1758 LeaveTestFrame(assembler); |
| 1741 __ mov(CSP, SP); | 1759 __ RestoreCSP(); |
| 1742 __ ret(); | 1760 __ ret(); |
| 1743 } | 1761 } |
| 1744 | 1762 |
| 1745 | 1763 |
| 1746 ASSEMBLER_TEST_RUN(LoadImmediatePPLarge, test) { | 1764 ASSEMBLER_TEST_RUN(LoadImmediatePPLarge, test) { |
| 1747 EXPECT_EQ(static_cast<int64_t>(0x9287436598237465), | 1765 EXPECT_EQ(static_cast<int64_t>(0x9287436598237465), |
| 1748 test->InvokeWithCodeAndThread<int64_t>()); | 1766 test->InvokeWithCodeAndThread<int64_t>()); |
| 1749 } | 1767 } |
| 1750 | 1768 |
| 1751 | 1769 |
| 1752 // LoadObject null. | 1770 // LoadObject null. |
| 1753 ASSEMBLER_TEST_GENERATE(LoadObjectNull, assembler) { | 1771 ASSEMBLER_TEST_GENERATE(LoadObjectNull, assembler) { |
| 1754 __ SetupDartSP(kTestStackSpace); | 1772 __ SetupDartSP(); |
| 1755 EnterTestFrame(assembler); | 1773 EnterTestFrame(assembler); |
| 1756 __ LoadObject(R0, Object::null_object()); | 1774 __ LoadObject(R0, Object::null_object()); |
| 1757 LeaveTestFrame(assembler); | 1775 LeaveTestFrame(assembler); |
| 1758 __ mov(CSP, SP); | 1776 __ RestoreCSP(); |
| 1759 __ ret(); | 1777 __ ret(); |
| 1760 } | 1778 } |
| 1761 | 1779 |
| 1762 | 1780 |
| 1763 ASSEMBLER_TEST_RUN(LoadObjectNull, test) { | 1781 ASSEMBLER_TEST_RUN(LoadObjectNull, test) { |
| 1764 EXPECT_EQ(Object::null(), test->InvokeWithCodeAndThread<RawObject*>()); | 1782 EXPECT_EQ(Object::null(), test->InvokeWithCodeAndThread<RawObject*>()); |
| 1765 } | 1783 } |
| 1766 | 1784 |
| 1767 | 1785 |
| 1768 ASSEMBLER_TEST_GENERATE(LoadObjectTrue, assembler) { | 1786 ASSEMBLER_TEST_GENERATE(LoadObjectTrue, assembler) { |
| 1769 __ SetupDartSP(kTestStackSpace); | 1787 __ SetupDartSP(); |
| 1770 EnterTestFrame(assembler); | 1788 EnterTestFrame(assembler); |
| 1771 __ LoadObject(R0, Bool::True()); | 1789 __ LoadObject(R0, Bool::True()); |
| 1772 LeaveTestFrame(assembler); | 1790 LeaveTestFrame(assembler); |
| 1773 __ mov(CSP, SP); | 1791 __ RestoreCSP(); |
| 1774 __ ret(); | 1792 __ ret(); |
| 1775 } | 1793 } |
| 1776 | 1794 |
| 1777 | 1795 |
| 1778 ASSEMBLER_TEST_RUN(LoadObjectTrue, test) { | 1796 ASSEMBLER_TEST_RUN(LoadObjectTrue, test) { |
| 1779 EXPECT_EQ(Bool::True().raw(), test->InvokeWithCodeAndThread<RawObject*>()); | 1797 EXPECT_EQ(Bool::True().raw(), test->InvokeWithCodeAndThread<RawObject*>()); |
| 1780 } | 1798 } |
| 1781 | 1799 |
| 1782 | 1800 |
| 1783 ASSEMBLER_TEST_GENERATE(LoadObjectFalse, assembler) { | 1801 ASSEMBLER_TEST_GENERATE(LoadObjectFalse, assembler) { |
| 1784 __ SetupDartSP(kTestStackSpace); | 1802 __ SetupDartSP(); |
| 1785 EnterTestFrame(assembler); | 1803 EnterTestFrame(assembler); |
| 1786 __ LoadObject(R0, Bool::False()); | 1804 __ LoadObject(R0, Bool::False()); |
| 1787 LeaveTestFrame(assembler); | 1805 LeaveTestFrame(assembler); |
| 1788 __ mov(CSP, SP); | 1806 __ RestoreCSP(); |
| 1789 __ ret(); | 1807 __ ret(); |
| 1790 } | 1808 } |
| 1791 | 1809 |
| 1792 | 1810 |
| 1793 ASSEMBLER_TEST_RUN(LoadObjectFalse, test) { | 1811 ASSEMBLER_TEST_RUN(LoadObjectFalse, test) { |
| 1794 EXPECT_EQ(Bool::False().raw(), test->InvokeWithCodeAndThread<RawObject*>()); | 1812 EXPECT_EQ(Bool::False().raw(), test->InvokeWithCodeAndThread<RawObject*>()); |
| 1795 } | 1813 } |
| 1796 | 1814 |
| 1797 | 1815 |
| 1798 ASSEMBLER_TEST_GENERATE(CSelTrue, assembler) { | 1816 ASSEMBLER_TEST_GENERATE(CSelTrue, assembler) { |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1933 } | 1951 } |
| 1934 | 1952 |
| 1935 | 1953 |
| 1936 ASSEMBLER_TEST_RUN(Fmovdr, test) { | 1954 ASSEMBLER_TEST_RUN(Fmovdr, test) { |
| 1937 typedef double (*DoubleReturn)() DART_UNUSED; | 1955 typedef double (*DoubleReturn)() DART_UNUSED; |
| 1938 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1956 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1939 } | 1957 } |
| 1940 | 1958 |
| 1941 | 1959 |
| 1942 ASSEMBLER_TEST_GENERATE(FldrdFstrdPrePostIndex, assembler) { | 1960 ASSEMBLER_TEST_GENERATE(FldrdFstrdPrePostIndex, assembler) { |
| 1943 __ SetupDartSP(kTestStackSpace); | 1961 __ SetupDartSP(); |
| 1944 __ LoadDImmediate(V1, 42.0); | 1962 __ LoadDImmediate(V1, 42.0); |
| 1945 __ fstrd(V1, Address(SP, -1*kWordSize, Address::PreIndex)); | 1963 __ fstrd(V1, Address(SP, -1*kWordSize, Address::PreIndex)); |
| 1946 __ fldrd(V0, Address(SP, 1*kWordSize, Address::PostIndex)); | 1964 __ fldrd(V0, Address(SP, 1*kWordSize, Address::PostIndex)); |
| 1947 __ mov(CSP, SP); | 1965 __ RestoreCSP(); |
| 1948 __ ret(); | 1966 __ ret(); |
| 1949 } | 1967 } |
| 1950 | 1968 |
| 1951 | 1969 |
| 1952 ASSEMBLER_TEST_RUN(FldrdFstrdPrePostIndex, test) { | 1970 ASSEMBLER_TEST_RUN(FldrdFstrdPrePostIndex, test) { |
| 1953 typedef double (*DoubleReturn)() DART_UNUSED; | 1971 typedef double (*DoubleReturn)() DART_UNUSED; |
| 1954 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1972 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1955 } | 1973 } |
| 1956 | 1974 |
| 1957 | 1975 |
| 1958 ASSEMBLER_TEST_GENERATE(FldrsFstrsPrePostIndex, assembler) { | 1976 ASSEMBLER_TEST_GENERATE(FldrsFstrsPrePostIndex, assembler) { |
| 1959 __ SetupDartSP(kTestStackSpace); | 1977 __ SetupDartSP(); |
| 1960 __ LoadDImmediate(V1, 42.0); | 1978 __ LoadDImmediate(V1, 42.0); |
| 1961 __ fcvtsd(V2, V1); | 1979 __ fcvtsd(V2, V1); |
| 1962 __ fstrs(V2, Address(SP, -1*kWordSize, Address::PreIndex)); | 1980 __ fstrs(V2, Address(SP, -1*kWordSize, Address::PreIndex)); |
| 1963 __ fldrs(V3, Address(SP, 1*kWordSize, Address::PostIndex)); | 1981 __ fldrs(V3, Address(SP, 1*kWordSize, Address::PostIndex)); |
| 1964 __ fcvtds(V0, V3); | 1982 __ fcvtds(V0, V3); |
| 1965 __ mov(CSP, SP); | 1983 __ RestoreCSP(); |
| 1966 __ ret(); | 1984 __ ret(); |
| 1967 } | 1985 } |
| 1968 | 1986 |
| 1969 | 1987 |
| 1970 ASSEMBLER_TEST_RUN(FldrsFstrsPrePostIndex, test) { | 1988 ASSEMBLER_TEST_RUN(FldrsFstrsPrePostIndex, test) { |
| 1971 typedef double (*DoubleReturn)() DART_UNUSED; | 1989 typedef double (*DoubleReturn)() DART_UNUSED; |
| 1972 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1990 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1973 } | 1991 } |
| 1974 | 1992 |
| 1975 | 1993 |
| 1976 ASSEMBLER_TEST_GENERATE(FldrqFstrqPrePostIndex, assembler) { | 1994 ASSEMBLER_TEST_GENERATE(FldrqFstrqPrePostIndex, assembler) { |
| 1977 __ SetupDartSP(kTestStackSpace); | 1995 __ SetupDartSP(); |
| 1978 __ LoadDImmediate(V1, 21.0); | 1996 __ LoadDImmediate(V1, 21.0); |
| 1979 __ LoadDImmediate(V2, 21.0); | 1997 __ LoadDImmediate(V2, 21.0); |
| 1980 __ LoadImmediate(R1, 42); | 1998 __ LoadImmediate(R1, 42); |
| 1981 __ Push(R1); | 1999 __ Push(R1); |
| 1982 __ PushDouble(V1); | 2000 __ PushDouble(V1); |
| 1983 __ PushDouble(V2); | 2001 __ PushDouble(V2); |
| 1984 __ fldrq(V3, Address(SP, 2 * kWordSize, Address::PostIndex)); | 2002 __ fldrq(V3, Address(SP, 2 * kWordSize, Address::PostIndex)); |
| 1985 __ Pop(R0); | 2003 __ Pop(R0); |
| 1986 __ fstrq(V3, Address(SP, -2 * kWordSize, Address::PreIndex)); | 2004 __ fstrq(V3, Address(SP, -2 * kWordSize, Address::PreIndex)); |
| 1987 __ PopDouble(V0); | 2005 __ PopDouble(V0); |
| 1988 __ PopDouble(V1); | 2006 __ PopDouble(V1); |
| 1989 __ faddd(V0, V0, V1); | 2007 __ faddd(V0, V0, V1); |
| 1990 __ mov(CSP, SP); | 2008 __ RestoreCSP(); |
| 1991 __ ret(); | 2009 __ ret(); |
| 1992 } | 2010 } |
| 1993 | 2011 |
| 1994 | 2012 |
| 1995 ASSEMBLER_TEST_RUN(FldrqFstrqPrePostIndex, test) { | 2013 ASSEMBLER_TEST_RUN(FldrqFstrqPrePostIndex, test) { |
| 1996 typedef double (*DoubleReturn)() DART_UNUSED; | 2014 typedef double (*DoubleReturn)() DART_UNUSED; |
| 1997 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2015 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1998 } | 2016 } |
| 1999 | 2017 |
| 2000 | 2018 |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2153 } | 2171 } |
| 2154 | 2172 |
| 2155 | 2173 |
| 2156 ASSEMBLER_TEST_RUN(Fsubd, test) { | 2174 ASSEMBLER_TEST_RUN(Fsubd, test) { |
| 2157 typedef double (*DoubleReturn)() DART_UNUSED; | 2175 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2158 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2176 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2159 } | 2177 } |
| 2160 | 2178 |
| 2161 | 2179 |
| 2162 ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) { | 2180 ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) { |
| 2163 __ SetupDartSP(kTestStackSpace); | 2181 __ SetupDartSP(); |
| 2164 __ LoadDImmediate(V0, 43.0); | 2182 __ LoadDImmediate(V0, 43.0); |
| 2165 __ LoadDImmediate(V1, 42.0); | 2183 __ LoadDImmediate(V1, 42.0); |
| 2166 __ AddImmediate(SP, SP, -1 * kWordSize); | 2184 __ AddImmediate(SP, SP, -1 * kWordSize); |
| 2167 __ add(R2, SP, Operand(1)); | 2185 __ add(R2, SP, Operand(1)); |
| 2168 __ fstrd(V1, Address(R2, -1)); | 2186 __ fstrd(V1, Address(R2, -1)); |
| 2169 __ fldrd(V0, Address(R2, -1)); | 2187 __ fldrd(V0, Address(R2, -1)); |
| 2170 __ AddImmediate(SP, SP, 1 * kWordSize); | 2188 __ AddImmediate(SP, SP, 1 * kWordSize); |
| 2171 __ mov(CSP, SP); | 2189 __ RestoreCSP(); |
| 2172 __ ret(); | 2190 __ ret(); |
| 2173 } | 2191 } |
| 2174 | 2192 |
| 2175 | 2193 |
| 2176 ASSEMBLER_TEST_RUN(FldrdFstrdHeapTag, test) { | 2194 ASSEMBLER_TEST_RUN(FldrdFstrdHeapTag, test) { |
| 2177 typedef double (*DoubleReturn)() DART_UNUSED; | 2195 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2178 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2196 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2179 } | 2197 } |
| 2180 | 2198 |
| 2181 | 2199 |
| 2182 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeIndex, assembler) { | 2200 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeIndex, assembler) { |
| 2183 __ SetupDartSP(kTestStackSpace); | 2201 __ SetupDartSP(); |
| 2184 __ LoadDImmediate(V0, 43.0); | 2202 __ LoadDImmediate(V0, 43.0); |
| 2185 __ LoadDImmediate(V1, 42.0); | 2203 __ LoadDImmediate(V1, 42.0); |
| 2186 // Largest negative offset that can fit in the signed 9-bit immediate field. | 2204 // Largest negative offset that can fit in the signed 9-bit immediate field. |
| 2187 __ fstrd(V1, Address(SP, -32*kWordSize, Address::PreIndex)); | 2205 __ fstrd(V1, Address(SP, -32*kWordSize, Address::PreIndex)); |
| 2188 // Largest positive kWordSize aligned offset that we can fit. | 2206 // Largest positive kWordSize aligned offset that we can fit. |
| 2189 __ fldrd(V0, Address(SP, 31*kWordSize, Address::PostIndex)); | 2207 __ fldrd(V0, Address(SP, 31*kWordSize, Address::PostIndex)); |
| 2190 // Correction. | 2208 // Correction. |
| 2191 __ add(SP, SP, Operand(kWordSize)); // Restore SP. | 2209 __ add(SP, SP, Operand(kWordSize)); // Restore SP. |
| 2192 __ mov(CSP, SP); | 2210 __ RestoreCSP(); |
| 2193 __ ret(); | 2211 __ ret(); |
| 2194 } | 2212 } |
| 2195 | 2213 |
| 2196 | 2214 |
| 2197 ASSEMBLER_TEST_RUN(FldrdFstrdLargeIndex, test) { | 2215 ASSEMBLER_TEST_RUN(FldrdFstrdLargeIndex, test) { |
| 2198 typedef double (*DoubleReturn)() DART_UNUSED; | 2216 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2199 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2217 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2200 } | 2218 } |
| 2201 | 2219 |
| 2202 | 2220 |
| 2203 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeOffset, assembler) { | 2221 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeOffset, assembler) { |
| 2204 __ SetupDartSP(kTestStackSpace); | 2222 __ SetupDartSP(); |
| 2205 __ LoadDImmediate(V0, 43.0); | 2223 __ LoadDImmediate(V0, 43.0); |
| 2206 __ LoadDImmediate(V1, 42.0); | 2224 __ LoadDImmediate(V1, 42.0); |
| 2207 __ sub(SP, SP, Operand(512*kWordSize)); | 2225 __ sub(SP, SP, Operand(512*kWordSize)); |
| 2208 __ fstrd(V1, Address(SP, 512*kWordSize, Address::Offset)); | 2226 __ fstrd(V1, Address(SP, 512*kWordSize, Address::Offset)); |
| 2209 __ add(SP, SP, Operand(512*kWordSize)); | 2227 __ add(SP, SP, Operand(512*kWordSize)); |
| 2210 __ fldrd(V0, Address(SP)); | 2228 __ fldrd(V0, Address(SP)); |
| 2211 __ mov(CSP, SP); | 2229 __ RestoreCSP(); |
| 2212 __ ret(); | 2230 __ ret(); |
| 2213 } | 2231 } |
| 2214 | 2232 |
| 2215 | 2233 |
| 2216 ASSEMBLER_TEST_RUN(FldrdFstrdLargeOffset, test) { | 2234 ASSEMBLER_TEST_RUN(FldrdFstrdLargeOffset, test) { |
| 2217 typedef double (*DoubleReturn)() DART_UNUSED; | 2235 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2218 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2236 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2219 } | 2237 } |
| 2220 | 2238 |
| 2221 | 2239 |
| 2222 ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) { | 2240 ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) { |
| 2223 __ SetupDartSP(kTestStackSpace); | 2241 __ SetupDartSP(); |
| 2224 __ LoadDImmediate(V0, 43.0); | 2242 __ LoadDImmediate(V0, 43.0); |
| 2225 __ LoadDImmediate(V1, 42.0); | 2243 __ LoadDImmediate(V1, 42.0); |
| 2226 __ movz(R2, Immediate(0xfff8), 0); | 2244 __ movz(R2, Immediate(0xfff8), 0); |
| 2227 __ movk(R2, Immediate(0xffff), 1); // R2 <- -8 (int32_t). | 2245 __ movk(R2, Immediate(0xffff), 1); // R2 <- -8 (int32_t). |
| 2228 // This should sign extend R2, and add to SP to get address, | 2246 // This should sign extend R2, and add to SP to get address, |
| 2229 // i.e. SP - kWordSize. | 2247 // i.e. SP - kWordSize. |
| 2230 __ fstrd(V1, Address(SP, R2, SXTW)); | 2248 __ fstrd(V1, Address(SP, R2, SXTW)); |
| 2231 __ sub(SP, SP, Operand(kWordSize)); | 2249 __ sub(SP, SP, Operand(kWordSize)); |
| 2232 __ fldrd(V0, Address(SP)); | 2250 __ fldrd(V0, Address(SP)); |
| 2233 __ add(SP, SP, Operand(kWordSize)); | 2251 __ add(SP, SP, Operand(kWordSize)); |
| 2234 __ mov(CSP, SP); | 2252 __ RestoreCSP(); |
| 2235 __ ret(); | 2253 __ ret(); |
| 2236 } | 2254 } |
| 2237 | 2255 |
| 2238 | 2256 |
| 2239 ASSEMBLER_TEST_RUN(FldrdFstrdExtReg, test) { | 2257 ASSEMBLER_TEST_RUN(FldrdFstrdExtReg, test) { |
| 2240 typedef double (*DoubleReturn)() DART_UNUSED; | 2258 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2241 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2259 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2242 } | 2260 } |
| 2243 | 2261 |
| 2244 | 2262 |
| 2245 ASSEMBLER_TEST_GENERATE(FldrdFstrdScaledReg, assembler) { | 2263 ASSEMBLER_TEST_GENERATE(FldrdFstrdScaledReg, assembler) { |
| 2246 __ SetupDartSP(kTestStackSpace); | 2264 __ SetupDartSP(); |
| 2247 __ LoadDImmediate(V0, 43.0); | 2265 __ LoadDImmediate(V0, 43.0); |
| 2248 __ LoadDImmediate(V1, 42.0); | 2266 __ LoadDImmediate(V1, 42.0); |
| 2249 __ movz(R2, Immediate(10), 0); | 2267 __ movz(R2, Immediate(10), 0); |
| 2250 __ sub(SP, SP, Operand(10*kWordSize)); | 2268 __ sub(SP, SP, Operand(10*kWordSize)); |
| 2251 // Store V1 into SP + R2 * kWordSize. | 2269 // Store V1 into SP + R2 * kWordSize. |
| 2252 __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled)); | 2270 __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled)); |
| 2253 __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled)); | 2271 __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled)); |
| 2254 __ add(SP, SP, Operand(10*kWordSize)); | 2272 __ add(SP, SP, Operand(10*kWordSize)); |
| 2255 __ mov(CSP, SP); | 2273 __ RestoreCSP(); |
| 2256 __ ret(); | 2274 __ ret(); |
| 2257 } | 2275 } |
| 2258 | 2276 |
| 2259 | 2277 |
| 2260 ASSEMBLER_TEST_RUN(FldrdFstrdScaledReg, test) { | 2278 ASSEMBLER_TEST_RUN(FldrdFstrdScaledReg, test) { |
| 2261 typedef double (*DoubleReturn)() DART_UNUSED; | 2279 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2262 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2280 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2263 } | 2281 } |
| 2264 | 2282 |
| 2265 | 2283 |
| (...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2700 } | 2718 } |
| 2701 | 2719 |
| 2702 | 2720 |
| 2703 ASSEMBLER_TEST_RUN(Vdivd, test) { | 2721 ASSEMBLER_TEST_RUN(Vdivd, test) { |
| 2704 typedef double (*DoubleReturn)() DART_UNUSED; | 2722 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2705 EXPECT_EQ(2.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2723 EXPECT_EQ(2.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2706 } | 2724 } |
| 2707 | 2725 |
| 2708 | 2726 |
| 2709 ASSEMBLER_TEST_GENERATE(Vdupd, assembler) { | 2727 ASSEMBLER_TEST_GENERATE(Vdupd, assembler) { |
| 2710 __ SetupDartSP(kTestStackSpace); | 2728 __ SetupDartSP(); |
| 2711 __ LoadDImmediate(V0, 21.0); | 2729 __ LoadDImmediate(V0, 21.0); |
| 2712 __ vdupd(V1, V0, 0); | 2730 __ vdupd(V1, V0, 0); |
| 2713 | 2731 |
| 2714 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); | 2732 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); |
| 2715 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 2733 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 2716 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 2734 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 2717 | 2735 |
| 2718 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 2736 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 2719 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 2737 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 2720 | 2738 |
| 2721 __ faddd(V0, V2, V3); | 2739 __ faddd(V0, V2, V3); |
| 2722 __ mov(CSP, SP); | 2740 __ RestoreCSP(); |
| 2723 __ ret(); | 2741 __ ret(); |
| 2724 } | 2742 } |
| 2725 | 2743 |
| 2726 | 2744 |
| 2727 ASSEMBLER_TEST_RUN(Vdupd, test) { | 2745 ASSEMBLER_TEST_RUN(Vdupd, test) { |
| 2728 typedef double (*DoubleReturn)() DART_UNUSED; | 2746 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2729 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2747 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2730 } | 2748 } |
| 2731 | 2749 |
| 2732 | 2750 |
| 2733 ASSEMBLER_TEST_GENERATE(Vdups, assembler) { | 2751 ASSEMBLER_TEST_GENERATE(Vdups, assembler) { |
| 2734 __ SetupDartSP(kTestStackSpace); | 2752 __ SetupDartSP(); |
| 2735 __ LoadDImmediate(V0, 21.0); | 2753 __ LoadDImmediate(V0, 21.0); |
| 2736 __ fcvtsd(V0, V0); | 2754 __ fcvtsd(V0, V0); |
| 2737 __ vdups(V1, V0, 0); | 2755 __ vdups(V1, V0, 0); |
| 2738 | 2756 |
| 2739 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); | 2757 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); |
| 2740 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 2758 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 2741 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 2759 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 2742 | 2760 |
| 2743 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2761 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 2744 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2762 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 2745 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2763 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 2746 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2764 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 2747 | 2765 |
| 2748 __ fcvtds(V0, V0); | 2766 __ fcvtds(V0, V0); |
| 2749 __ fcvtds(V1, V1); | 2767 __ fcvtds(V1, V1); |
| 2750 __ fcvtds(V2, V2); | 2768 __ fcvtds(V2, V2); |
| 2751 __ fcvtds(V3, V3); | 2769 __ fcvtds(V3, V3); |
| 2752 | 2770 |
| 2753 __ faddd(V0, V1, V1); | 2771 __ faddd(V0, V1, V1); |
| 2754 __ faddd(V0, V0, V2); | 2772 __ faddd(V0, V0, V2); |
| 2755 __ faddd(V0, V0, V3); | 2773 __ faddd(V0, V0, V3); |
| 2756 __ mov(CSP, SP); | 2774 __ RestoreCSP(); |
| 2757 __ ret(); | 2775 __ ret(); |
| 2758 } | 2776 } |
| 2759 | 2777 |
| 2760 | 2778 |
| 2761 ASSEMBLER_TEST_RUN(Vdups, test) { | 2779 ASSEMBLER_TEST_RUN(Vdups, test) { |
| 2762 typedef double (*DoubleReturn)() DART_UNUSED; | 2780 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2763 EXPECT_EQ(84.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2781 EXPECT_EQ(84.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2764 } | 2782 } |
| 2765 | 2783 |
| 2766 | 2784 |
| 2767 ASSEMBLER_TEST_GENERATE(Vinsd, assembler) { | 2785 ASSEMBLER_TEST_GENERATE(Vinsd, assembler) { |
| 2768 __ SetupDartSP(kTestStackSpace); | 2786 __ SetupDartSP(); |
| 2769 __ LoadDImmediate(V5, 42.0); | 2787 __ LoadDImmediate(V5, 42.0); |
| 2770 __ vinsd(V1, 1, V5, 0); // V1[1] <- V0[0]. | 2788 __ vinsd(V1, 1, V5, 0); // V1[1] <- V0[0]. |
| 2771 | 2789 |
| 2772 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); | 2790 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); |
| 2773 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 2791 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 2774 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 2792 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 2775 | 2793 |
| 2776 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 2794 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 2777 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 2795 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 2778 | 2796 |
| 2779 __ fmovdd(V0, V3); | 2797 __ fmovdd(V0, V3); |
| 2780 __ mov(CSP, SP); | 2798 __ RestoreCSP(); |
| 2781 __ ret(); | 2799 __ ret(); |
| 2782 } | 2800 } |
| 2783 | 2801 |
| 2784 | 2802 |
| 2785 ASSEMBLER_TEST_RUN(Vinsd, test) { | 2803 ASSEMBLER_TEST_RUN(Vinsd, test) { |
| 2786 typedef double (*DoubleReturn)() DART_UNUSED; | 2804 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2787 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2805 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2788 } | 2806 } |
| 2789 | 2807 |
| 2790 | 2808 |
| 2791 ASSEMBLER_TEST_GENERATE(Vinss, assembler) { | 2809 ASSEMBLER_TEST_GENERATE(Vinss, assembler) { |
| 2792 __ SetupDartSP(kTestStackSpace); | 2810 __ SetupDartSP(); |
| 2793 __ LoadDImmediate(V0, 21.0); | 2811 __ LoadDImmediate(V0, 21.0); |
| 2794 __ fcvtsd(V0, V0); | 2812 __ fcvtsd(V0, V0); |
| 2795 __ vinss(V1, 3, V0, 0); | 2813 __ vinss(V1, 3, V0, 0); |
| 2796 __ vinss(V1, 1, V0, 0); | 2814 __ vinss(V1, 1, V0, 0); |
| 2797 | 2815 |
| 2798 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); | 2816 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); |
| 2799 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 2817 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 2800 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 2818 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 2801 | 2819 |
| 2802 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2820 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 2803 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2821 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 2804 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2822 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 2805 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2823 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 2806 | 2824 |
| 2807 __ fcvtds(V0, V0); | 2825 __ fcvtds(V0, V0); |
| 2808 __ fcvtds(V1, V1); | 2826 __ fcvtds(V1, V1); |
| 2809 __ fcvtds(V2, V2); | 2827 __ fcvtds(V2, V2); |
| 2810 __ fcvtds(V3, V3); | 2828 __ fcvtds(V3, V3); |
| 2811 | 2829 |
| 2812 __ faddd(V0, V0, V1); | 2830 __ faddd(V0, V0, V1); |
| 2813 __ faddd(V0, V0, V2); | 2831 __ faddd(V0, V0, V2); |
| 2814 __ faddd(V0, V0, V3); | 2832 __ faddd(V0, V0, V3); |
| 2815 __ mov(CSP, SP); | 2833 __ RestoreCSP(); |
| 2816 __ ret(); | 2834 __ ret(); |
| 2817 } | 2835 } |
| 2818 | 2836 |
| 2819 | 2837 |
| 2820 ASSEMBLER_TEST_RUN(Vinss, test) { | 2838 ASSEMBLER_TEST_RUN(Vinss, test) { |
| 2821 typedef double (*DoubleReturn)() DART_UNUSED; | 2839 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2822 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2840 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2823 } | 2841 } |
| 2824 | 2842 |
| 2825 | 2843 |
| (...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3594 EXPECT_FLOAT_EQ(1.0/sqrt(147000.0), res, 0.0001); | 3612 EXPECT_FLOAT_EQ(1.0/sqrt(147000.0), res, 0.0001); |
| 3595 } | 3613 } |
| 3596 | 3614 |
| 3597 | 3615 |
| 3598 // Called from assembler_test.cc. | 3616 // Called from assembler_test.cc. |
| 3599 // LR: return address. | 3617 // LR: return address. |
| 3600 // R0: value. | 3618 // R0: value. |
| 3601 // R1: growable array. | 3619 // R1: growable array. |
| 3602 // R2: current thread. | 3620 // R2: current thread. |
| 3603 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { | 3621 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { |
| 3604 __ SetupDartSP(kTestStackSpace); | 3622 __ SetupDartSP(); |
| 3605 __ Push(CODE_REG); | 3623 __ Push(CODE_REG); |
| 3606 __ Push(THR); | 3624 __ Push(THR); |
| 3607 __ Push(LR); | 3625 __ Push(LR); |
| 3608 __ mov(THR, R2); | 3626 __ mov(THR, R2); |
| 3609 __ StoreIntoObject(R1, | 3627 __ StoreIntoObject(R1, |
| 3610 FieldAddress(R1, GrowableObjectArray::data_offset()), | 3628 FieldAddress(R1, GrowableObjectArray::data_offset()), |
| 3611 R0); | 3629 R0); |
| 3612 __ Pop(LR); | 3630 __ Pop(LR); |
| 3613 __ Pop(THR); | 3631 __ Pop(THR); |
| 3614 __ Pop(CODE_REG); | 3632 __ Pop(CODE_REG); |
| 3615 __ mov(CSP, SP); | 3633 __ RestoreCSP(); |
| 3616 __ ret(); | 3634 __ ret(); |
| 3617 } | 3635 } |
| 3618 | 3636 |
| 3619 | 3637 |
| 3620 ASSEMBLER_TEST_GENERATE(ComputeRange, assembler) { | 3638 ASSEMBLER_TEST_GENERATE(ComputeRange, assembler) { |
| 3621 __ SetupDartSP(kTestStackSpace); | 3639 __ SetupDartSP(); |
| 3622 EnterTestFrame(assembler); | 3640 EnterTestFrame(assembler); |
| 3623 Label miss, done; | 3641 Label miss, done; |
| 3624 __ ComputeRange(R0, R2, R3, &miss); | 3642 __ ComputeRange(R0, R2, R3, &miss); |
| 3625 __ b(&done); | 3643 __ b(&done); |
| 3626 | 3644 |
| 3627 __ Bind(&miss); | 3645 __ Bind(&miss); |
| 3628 __ LoadImmediate(R0, -1); | 3646 __ LoadImmediate(R0, -1); |
| 3629 | 3647 |
| 3630 __ Bind(&done); | 3648 __ Bind(&done); |
| 3631 LeaveTestFrame(assembler); | 3649 LeaveTestFrame(assembler); |
| 3632 __ mov(CSP, SP); | 3650 __ RestoreCSP(); |
| 3633 __ ret(); | 3651 __ ret(); |
| 3634 } | 3652 } |
| 3635 | 3653 |
| 3636 | 3654 |
| 3637 ASSEMBLER_TEST_RUN(ComputeRange, test) { | 3655 ASSEMBLER_TEST_RUN(ComputeRange, test) { |
| 3638 #define RANGE_OF(arg_type, v) \ | 3656 #define RANGE_OF(arg_type, v) \ |
| 3639 test->InvokeWithCodeAndThread<intptr_t, arg_type>(v) | 3657 test->InvokeWithCodeAndThread<intptr_t, arg_type>(v) |
| 3640 | 3658 |
| 3641 EXPECT_EQ(ICData::kInt32RangeBit, RANGE_OF(RawSmi*, Smi::New(0))); | 3659 EXPECT_EQ(ICData::kInt32RangeBit, RANGE_OF(RawSmi*, Smi::New(0))); |
| 3642 EXPECT_EQ(ICData::kInt32RangeBit, RANGE_OF(RawSmi*, Smi::New(1))); | 3660 EXPECT_EQ(ICData::kInt32RangeBit, RANGE_OF(RawSmi*, Smi::New(1))); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3674 | 3692 |
| 3675 EXPECT_EQ(-1, RANGE_OF(RawBool*, Bool::True().raw())); | 3693 EXPECT_EQ(-1, RANGE_OF(RawBool*, Bool::True().raw())); |
| 3676 | 3694 |
| 3677 #undef RANGE_OF | 3695 #undef RANGE_OF |
| 3678 } | 3696 } |
| 3679 | 3697 |
| 3680 | 3698 |
| 3681 } // namespace dart | 3699 } // namespace dart |
| 3682 | 3700 |
| 3683 #endif // defined(TARGET_ARCH_ARM64) | 3701 #endif // defined(TARGET_ARCH_ARM64) |
| OLD | NEW |