| 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 1071 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1682 static void LeaveTestFrame(Assembler* assembler) { | 1682 static void LeaveTestFrame(Assembler* assembler) { |
| 1683 __ PopAndUntagPP(); | 1683 __ PopAndUntagPP(); |
| 1684 __ Pop(THR); | 1684 __ Pop(THR); |
| 1685 __ Pop(CODE_REG); | 1685 __ Pop(CODE_REG); |
| 1686 __ LeaveFrame(); | 1686 __ LeaveFrame(); |
| 1687 } | 1687 } |
| 1688 | 1688 |
| 1689 | 1689 |
| 1690 // Loading immediate values with the object pool. | 1690 // Loading immediate values with the object pool. |
| 1691 ASSEMBLER_TEST_GENERATE(LoadImmediatePPSmall, assembler) { | 1691 ASSEMBLER_TEST_GENERATE(LoadImmediatePPSmall, assembler) { |
| 1692 __ SetupDartSP(kTestStackSpace); | 1692 __ SetupDartSP(); |
| 1693 EnterTestFrame(assembler); | 1693 EnterTestFrame(assembler); |
| 1694 __ LoadImmediate(R0, 42); | 1694 __ LoadImmediate(R0, 42); |
| 1695 LeaveTestFrame(assembler); | 1695 LeaveTestFrame(assembler); |
| 1696 __ mov(CSP, SP); | 1696 __ RestoreCSP(); |
| 1697 __ ret(); | 1697 __ ret(); |
| 1698 } | 1698 } |
| 1699 | 1699 |
| 1700 | 1700 |
| 1701 ASSEMBLER_TEST_RUN(LoadImmediatePPSmall, test) { | 1701 ASSEMBLER_TEST_RUN(LoadImmediatePPSmall, test) { |
| 1702 EXPECT_EQ(42, test->InvokeWithCodeAndThread<int64_t>()); | 1702 EXPECT_EQ(42, test->InvokeWithCodeAndThread<int64_t>()); |
| 1703 } | 1703 } |
| 1704 | 1704 |
| 1705 | 1705 |
| 1706 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed, assembler) { | 1706 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed, assembler) { |
| 1707 __ SetupDartSP(kTestStackSpace); | 1707 __ SetupDartSP(); |
| 1708 EnterTestFrame(assembler); | 1708 EnterTestFrame(assembler); |
| 1709 __ LoadImmediate(R0, 0xf1234123); | 1709 __ LoadImmediate(R0, 0xf1234123); |
| 1710 LeaveTestFrame(assembler); | 1710 LeaveTestFrame(assembler); |
| 1711 __ mov(CSP, SP); | 1711 __ RestoreCSP(); |
| 1712 __ ret(); | 1712 __ ret(); |
| 1713 } | 1713 } |
| 1714 | 1714 |
| 1715 | 1715 |
| 1716 ASSEMBLER_TEST_RUN(LoadImmediatePPMed, test) { | 1716 ASSEMBLER_TEST_RUN(LoadImmediatePPMed, test) { |
| 1717 EXPECT_EQ(0xf1234123, test->InvokeWithCodeAndThread<int64_t>()); | 1717 EXPECT_EQ(0xf1234123, test->InvokeWithCodeAndThread<int64_t>()); |
| 1718 } | 1718 } |
| 1719 | 1719 |
| 1720 | 1720 |
| 1721 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed2, assembler) { | 1721 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed2, assembler) { |
| 1722 __ SetupDartSP(kTestStackSpace); | 1722 __ SetupDartSP(); |
| 1723 EnterTestFrame(assembler); | 1723 EnterTestFrame(assembler); |
| 1724 __ LoadImmediate(R0, 0x4321f1234124); | 1724 __ LoadImmediate(R0, 0x4321f1234124); |
| 1725 LeaveTestFrame(assembler); | 1725 LeaveTestFrame(assembler); |
| 1726 __ mov(CSP, SP); | 1726 __ RestoreCSP(); |
| 1727 __ ret(); | 1727 __ ret(); |
| 1728 } | 1728 } |
| 1729 | 1729 |
| 1730 | 1730 |
| 1731 ASSEMBLER_TEST_RUN(LoadImmediatePPMed2, test) { | 1731 ASSEMBLER_TEST_RUN(LoadImmediatePPMed2, test) { |
| 1732 EXPECT_EQ(0x4321f1234124, test->InvokeWithCodeAndThread<int64_t>()); | 1732 EXPECT_EQ(0x4321f1234124, test->InvokeWithCodeAndThread<int64_t>()); |
| 1733 } | 1733 } |
| 1734 | 1734 |
| 1735 | 1735 |
| 1736 ASSEMBLER_TEST_GENERATE(LoadImmediatePPLarge, assembler) { | 1736 ASSEMBLER_TEST_GENERATE(LoadImmediatePPLarge, assembler) { |
| 1737 __ SetupDartSP(kTestStackSpace); | 1737 __ SetupDartSP(); |
| 1738 EnterTestFrame(assembler); | 1738 EnterTestFrame(assembler); |
| 1739 __ LoadImmediate(R0, 0x9287436598237465); | 1739 __ LoadImmediate(R0, 0x9287436598237465); |
| 1740 LeaveTestFrame(assembler); | 1740 LeaveTestFrame(assembler); |
| 1741 __ mov(CSP, SP); | 1741 __ RestoreCSP(); |
| 1742 __ ret(); | 1742 __ ret(); |
| 1743 } | 1743 } |
| 1744 | 1744 |
| 1745 | 1745 |
| 1746 ASSEMBLER_TEST_RUN(LoadImmediatePPLarge, test) { | 1746 ASSEMBLER_TEST_RUN(LoadImmediatePPLarge, test) { |
| 1747 EXPECT_EQ(static_cast<int64_t>(0x9287436598237465), | 1747 EXPECT_EQ(static_cast<int64_t>(0x9287436598237465), |
| 1748 test->InvokeWithCodeAndThread<int64_t>()); | 1748 test->InvokeWithCodeAndThread<int64_t>()); |
| 1749 } | 1749 } |
| 1750 | 1750 |
| 1751 | 1751 |
| 1752 // LoadObject null. | 1752 // LoadObject null. |
| 1753 ASSEMBLER_TEST_GENERATE(LoadObjectNull, assembler) { | 1753 ASSEMBLER_TEST_GENERATE(LoadObjectNull, assembler) { |
| 1754 __ SetupDartSP(kTestStackSpace); | 1754 __ SetupDartSP(); |
| 1755 EnterTestFrame(assembler); | 1755 EnterTestFrame(assembler); |
| 1756 __ LoadObject(R0, Object::null_object()); | 1756 __ LoadObject(R0, Object::null_object()); |
| 1757 LeaveTestFrame(assembler); | 1757 LeaveTestFrame(assembler); |
| 1758 __ mov(CSP, SP); | 1758 __ RestoreCSP(); |
| 1759 __ ret(); | 1759 __ ret(); |
| 1760 } | 1760 } |
| 1761 | 1761 |
| 1762 | 1762 |
| 1763 ASSEMBLER_TEST_RUN(LoadObjectNull, test) { | 1763 ASSEMBLER_TEST_RUN(LoadObjectNull, test) { |
| 1764 EXPECT_EQ(Object::null(), test->InvokeWithCodeAndThread<RawObject*>()); | 1764 EXPECT_EQ(Object::null(), test->InvokeWithCodeAndThread<RawObject*>()); |
| 1765 } | 1765 } |
| 1766 | 1766 |
| 1767 | 1767 |
| 1768 ASSEMBLER_TEST_GENERATE(LoadObjectTrue, assembler) { | 1768 ASSEMBLER_TEST_GENERATE(LoadObjectTrue, assembler) { |
| 1769 __ SetupDartSP(kTestStackSpace); | 1769 __ SetupDartSP(); |
| 1770 EnterTestFrame(assembler); | 1770 EnterTestFrame(assembler); |
| 1771 __ LoadObject(R0, Bool::True()); | 1771 __ LoadObject(R0, Bool::True()); |
| 1772 LeaveTestFrame(assembler); | 1772 LeaveTestFrame(assembler); |
| 1773 __ mov(CSP, SP); | 1773 __ RestoreCSP(); |
| 1774 __ ret(); | 1774 __ ret(); |
| 1775 } | 1775 } |
| 1776 | 1776 |
| 1777 | 1777 |
| 1778 ASSEMBLER_TEST_RUN(LoadObjectTrue, test) { | 1778 ASSEMBLER_TEST_RUN(LoadObjectTrue, test) { |
| 1779 EXPECT_EQ(Bool::True().raw(), test->InvokeWithCodeAndThread<RawObject*>()); | 1779 EXPECT_EQ(Bool::True().raw(), test->InvokeWithCodeAndThread<RawObject*>()); |
| 1780 } | 1780 } |
| 1781 | 1781 |
| 1782 | 1782 |
| 1783 ASSEMBLER_TEST_GENERATE(LoadObjectFalse, assembler) { | 1783 ASSEMBLER_TEST_GENERATE(LoadObjectFalse, assembler) { |
| 1784 __ SetupDartSP(kTestStackSpace); | 1784 __ SetupDartSP(); |
| 1785 EnterTestFrame(assembler); | 1785 EnterTestFrame(assembler); |
| 1786 __ LoadObject(R0, Bool::False()); | 1786 __ LoadObject(R0, Bool::False()); |
| 1787 LeaveTestFrame(assembler); | 1787 LeaveTestFrame(assembler); |
| 1788 __ mov(CSP, SP); | 1788 __ RestoreCSP(); |
| 1789 __ ret(); | 1789 __ ret(); |
| 1790 } | 1790 } |
| 1791 | 1791 |
| 1792 | 1792 |
| 1793 ASSEMBLER_TEST_RUN(LoadObjectFalse, test) { | 1793 ASSEMBLER_TEST_RUN(LoadObjectFalse, test) { |
| 1794 EXPECT_EQ(Bool::False().raw(), test->InvokeWithCodeAndThread<RawObject*>()); | 1794 EXPECT_EQ(Bool::False().raw(), test->InvokeWithCodeAndThread<RawObject*>()); |
| 1795 } | 1795 } |
| 1796 | 1796 |
| 1797 | 1797 |
| 1798 ASSEMBLER_TEST_GENERATE(CSelTrue, assembler) { | 1798 ASSEMBLER_TEST_GENERATE(CSelTrue, assembler) { |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1933 } | 1933 } |
| 1934 | 1934 |
| 1935 | 1935 |
| 1936 ASSEMBLER_TEST_RUN(Fmovdr, test) { | 1936 ASSEMBLER_TEST_RUN(Fmovdr, test) { |
| 1937 typedef double (*DoubleReturn)() DART_UNUSED; | 1937 typedef double (*DoubleReturn)() DART_UNUSED; |
| 1938 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1938 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1939 } | 1939 } |
| 1940 | 1940 |
| 1941 | 1941 |
| 1942 ASSEMBLER_TEST_GENERATE(FldrdFstrdPrePostIndex, assembler) { | 1942 ASSEMBLER_TEST_GENERATE(FldrdFstrdPrePostIndex, assembler) { |
| 1943 __ SetupDartSP(kTestStackSpace); | 1943 __ SetupDartSP(); |
| 1944 __ LoadDImmediate(V1, 42.0); | 1944 __ LoadDImmediate(V1, 42.0); |
| 1945 __ fstrd(V1, Address(SP, -1*kWordSize, Address::PreIndex)); | 1945 __ fstrd(V1, Address(SP, -1*kWordSize, Address::PreIndex)); |
| 1946 __ fldrd(V0, Address(SP, 1*kWordSize, Address::PostIndex)); | 1946 __ fldrd(V0, Address(SP, 1*kWordSize, Address::PostIndex)); |
| 1947 __ mov(CSP, SP); | 1947 __ RestoreCSP(); |
| 1948 __ ret(); | 1948 __ ret(); |
| 1949 } | 1949 } |
| 1950 | 1950 |
| 1951 | 1951 |
| 1952 ASSEMBLER_TEST_RUN(FldrdFstrdPrePostIndex, test) { | 1952 ASSEMBLER_TEST_RUN(FldrdFstrdPrePostIndex, test) { |
| 1953 typedef double (*DoubleReturn)() DART_UNUSED; | 1953 typedef double (*DoubleReturn)() DART_UNUSED; |
| 1954 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1954 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1955 } | 1955 } |
| 1956 | 1956 |
| 1957 | 1957 |
| 1958 ASSEMBLER_TEST_GENERATE(FldrsFstrsPrePostIndex, assembler) { | 1958 ASSEMBLER_TEST_GENERATE(FldrsFstrsPrePostIndex, assembler) { |
| 1959 __ SetupDartSP(kTestStackSpace); | 1959 __ SetupDartSP(); |
| 1960 __ LoadDImmediate(V1, 42.0); | 1960 __ LoadDImmediate(V1, 42.0); |
| 1961 __ fcvtsd(V2, V1); | 1961 __ fcvtsd(V2, V1); |
| 1962 __ fstrs(V2, Address(SP, -1*kWordSize, Address::PreIndex)); | 1962 __ fstrs(V2, Address(SP, -1*kWordSize, Address::PreIndex)); |
| 1963 __ fldrs(V3, Address(SP, 1*kWordSize, Address::PostIndex)); | 1963 __ fldrs(V3, Address(SP, 1*kWordSize, Address::PostIndex)); |
| 1964 __ fcvtds(V0, V3); | 1964 __ fcvtds(V0, V3); |
| 1965 __ mov(CSP, SP); | 1965 __ RestoreCSP(); |
| 1966 __ ret(); | 1966 __ ret(); |
| 1967 } | 1967 } |
| 1968 | 1968 |
| 1969 | 1969 |
| 1970 ASSEMBLER_TEST_RUN(FldrsFstrsPrePostIndex, test) { | 1970 ASSEMBLER_TEST_RUN(FldrsFstrsPrePostIndex, test) { |
| 1971 typedef double (*DoubleReturn)() DART_UNUSED; | 1971 typedef double (*DoubleReturn)() DART_UNUSED; |
| 1972 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1972 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1973 } | 1973 } |
| 1974 | 1974 |
| 1975 | 1975 |
| 1976 ASSEMBLER_TEST_GENERATE(FldrqFstrqPrePostIndex, assembler) { | 1976 ASSEMBLER_TEST_GENERATE(FldrqFstrqPrePostIndex, assembler) { |
| 1977 __ SetupDartSP(kTestStackSpace); | 1977 __ SetupDartSP(); |
| 1978 __ LoadDImmediate(V1, 21.0); | 1978 __ LoadDImmediate(V1, 21.0); |
| 1979 __ LoadDImmediate(V2, 21.0); | 1979 __ LoadDImmediate(V2, 21.0); |
| 1980 __ LoadImmediate(R1, 42); | 1980 __ LoadImmediate(R1, 42); |
| 1981 __ Push(R1); | 1981 __ Push(R1); |
| 1982 __ PushDouble(V1); | 1982 __ PushDouble(V1); |
| 1983 __ PushDouble(V2); | 1983 __ PushDouble(V2); |
| 1984 __ fldrq(V3, Address(SP, 2 * kWordSize, Address::PostIndex)); | 1984 __ fldrq(V3, Address(SP, 2 * kWordSize, Address::PostIndex)); |
| 1985 __ Pop(R0); | 1985 __ Pop(R0); |
| 1986 __ fstrq(V3, Address(SP, -2 * kWordSize, Address::PreIndex)); | 1986 __ fstrq(V3, Address(SP, -2 * kWordSize, Address::PreIndex)); |
| 1987 __ PopDouble(V0); | 1987 __ PopDouble(V0); |
| 1988 __ PopDouble(V1); | 1988 __ PopDouble(V1); |
| 1989 __ faddd(V0, V0, V1); | 1989 __ faddd(V0, V0, V1); |
| 1990 __ mov(CSP, SP); | 1990 __ RestoreCSP(); |
| 1991 __ ret(); | 1991 __ ret(); |
| 1992 } | 1992 } |
| 1993 | 1993 |
| 1994 | 1994 |
| 1995 ASSEMBLER_TEST_RUN(FldrqFstrqPrePostIndex, test) { | 1995 ASSEMBLER_TEST_RUN(FldrqFstrqPrePostIndex, test) { |
| 1996 typedef double (*DoubleReturn)() DART_UNUSED; | 1996 typedef double (*DoubleReturn)() DART_UNUSED; |
| 1997 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1997 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1998 } | 1998 } |
| 1999 | 1999 |
| 2000 | 2000 |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2153 } | 2153 } |
| 2154 | 2154 |
| 2155 | 2155 |
| 2156 ASSEMBLER_TEST_RUN(Fsubd, test) { | 2156 ASSEMBLER_TEST_RUN(Fsubd, test) { |
| 2157 typedef double (*DoubleReturn)() DART_UNUSED; | 2157 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2158 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2158 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2159 } | 2159 } |
| 2160 | 2160 |
| 2161 | 2161 |
| 2162 ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) { | 2162 ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) { |
| 2163 __ SetupDartSP(kTestStackSpace); | 2163 __ SetupDartSP(); |
| 2164 __ LoadDImmediate(V0, 43.0); | 2164 __ LoadDImmediate(V0, 43.0); |
| 2165 __ LoadDImmediate(V1, 42.0); | 2165 __ LoadDImmediate(V1, 42.0); |
| 2166 __ AddImmediate(SP, SP, -1 * kWordSize); | 2166 __ AddImmediate(SP, SP, -1 * kWordSize); |
| 2167 __ add(R2, SP, Operand(1)); | 2167 __ add(R2, SP, Operand(1)); |
| 2168 __ fstrd(V1, Address(R2, -1)); | 2168 __ fstrd(V1, Address(R2, -1)); |
| 2169 __ fldrd(V0, Address(R2, -1)); | 2169 __ fldrd(V0, Address(R2, -1)); |
| 2170 __ AddImmediate(SP, SP, 1 * kWordSize); | 2170 __ AddImmediate(SP, SP, 1 * kWordSize); |
| 2171 __ mov(CSP, SP); | 2171 __ RestoreCSP(); |
| 2172 __ ret(); | 2172 __ ret(); |
| 2173 } | 2173 } |
| 2174 | 2174 |
| 2175 | 2175 |
| 2176 ASSEMBLER_TEST_RUN(FldrdFstrdHeapTag, test) { | 2176 ASSEMBLER_TEST_RUN(FldrdFstrdHeapTag, test) { |
| 2177 typedef double (*DoubleReturn)() DART_UNUSED; | 2177 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2178 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2178 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2179 } | 2179 } |
| 2180 | 2180 |
| 2181 | 2181 |
| 2182 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeIndex, assembler) { | 2182 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeIndex, assembler) { |
| 2183 __ SetupDartSP(kTestStackSpace); | 2183 __ SetupDartSP(); |
| 2184 __ LoadDImmediate(V0, 43.0); | 2184 __ LoadDImmediate(V0, 43.0); |
| 2185 __ LoadDImmediate(V1, 42.0); | 2185 __ LoadDImmediate(V1, 42.0); |
| 2186 // Largest negative offset that can fit in the signed 9-bit immediate field. | 2186 // Largest negative offset that can fit in the signed 9-bit immediate field. |
| 2187 __ fstrd(V1, Address(SP, -32*kWordSize, Address::PreIndex)); | 2187 __ fstrd(V1, Address(SP, -32*kWordSize, Address::PreIndex)); |
| 2188 // Largest positive kWordSize aligned offset that we can fit. | 2188 // Largest positive kWordSize aligned offset that we can fit. |
| 2189 __ fldrd(V0, Address(SP, 31*kWordSize, Address::PostIndex)); | 2189 __ fldrd(V0, Address(SP, 31*kWordSize, Address::PostIndex)); |
| 2190 // Correction. | 2190 // Correction. |
| 2191 __ add(SP, SP, Operand(kWordSize)); // Restore SP. | 2191 __ add(SP, SP, Operand(kWordSize)); // Restore SP. |
| 2192 __ mov(CSP, SP); | 2192 __ RestoreCSP(); |
| 2193 __ ret(); | 2193 __ ret(); |
| 2194 } | 2194 } |
| 2195 | 2195 |
| 2196 | 2196 |
| 2197 ASSEMBLER_TEST_RUN(FldrdFstrdLargeIndex, test) { | 2197 ASSEMBLER_TEST_RUN(FldrdFstrdLargeIndex, test) { |
| 2198 typedef double (*DoubleReturn)() DART_UNUSED; | 2198 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2199 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2199 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2200 } | 2200 } |
| 2201 | 2201 |
| 2202 | 2202 |
| 2203 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeOffset, assembler) { | 2203 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeOffset, assembler) { |
| 2204 __ SetupDartSP(kTestStackSpace); | 2204 __ SetupDartSP(); |
| 2205 __ LoadDImmediate(V0, 43.0); | 2205 __ LoadDImmediate(V0, 43.0); |
| 2206 __ LoadDImmediate(V1, 42.0); | 2206 __ LoadDImmediate(V1, 42.0); |
| 2207 __ sub(SP, SP, Operand(512*kWordSize)); | 2207 __ sub(SP, SP, Operand(512*kWordSize)); |
| 2208 __ fstrd(V1, Address(SP, 512*kWordSize, Address::Offset)); | 2208 __ fstrd(V1, Address(SP, 512*kWordSize, Address::Offset)); |
| 2209 __ add(SP, SP, Operand(512*kWordSize)); | 2209 __ add(SP, SP, Operand(512*kWordSize)); |
| 2210 __ fldrd(V0, Address(SP)); | 2210 __ fldrd(V0, Address(SP)); |
| 2211 __ mov(CSP, SP); | 2211 __ RestoreCSP(); |
| 2212 __ ret(); | 2212 __ ret(); |
| 2213 } | 2213 } |
| 2214 | 2214 |
| 2215 | 2215 |
| 2216 ASSEMBLER_TEST_RUN(FldrdFstrdLargeOffset, test) { | 2216 ASSEMBLER_TEST_RUN(FldrdFstrdLargeOffset, test) { |
| 2217 typedef double (*DoubleReturn)() DART_UNUSED; | 2217 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2218 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2218 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2219 } | 2219 } |
| 2220 | 2220 |
| 2221 | 2221 |
| 2222 ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) { | 2222 ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) { |
| 2223 __ SetupDartSP(kTestStackSpace); | 2223 __ SetupDartSP(); |
| 2224 __ LoadDImmediate(V0, 43.0); | 2224 __ LoadDImmediate(V0, 43.0); |
| 2225 __ LoadDImmediate(V1, 42.0); | 2225 __ LoadDImmediate(V1, 42.0); |
| 2226 __ movz(R2, Immediate(0xfff8), 0); | 2226 __ movz(R2, Immediate(0xfff8), 0); |
| 2227 __ movk(R2, Immediate(0xffff), 1); // R2 <- -8 (int32_t). | 2227 __ movk(R2, Immediate(0xffff), 1); // R2 <- -8 (int32_t). |
| 2228 // This should sign extend R2, and add to SP to get address, | 2228 // This should sign extend R2, and add to SP to get address, |
| 2229 // i.e. SP - kWordSize. | 2229 // i.e. SP - kWordSize. |
| 2230 __ fstrd(V1, Address(SP, R2, SXTW)); | 2230 __ fstrd(V1, Address(SP, R2, SXTW)); |
| 2231 __ sub(SP, SP, Operand(kWordSize)); | 2231 __ sub(SP, SP, Operand(kWordSize)); |
| 2232 __ fldrd(V0, Address(SP)); | 2232 __ fldrd(V0, Address(SP)); |
| 2233 __ add(SP, SP, Operand(kWordSize)); | 2233 __ add(SP, SP, Operand(kWordSize)); |
| 2234 __ mov(CSP, SP); | 2234 __ RestoreCSP(); |
| 2235 __ ret(); | 2235 __ ret(); |
| 2236 } | 2236 } |
| 2237 | 2237 |
| 2238 | 2238 |
| 2239 ASSEMBLER_TEST_RUN(FldrdFstrdExtReg, test) { | 2239 ASSEMBLER_TEST_RUN(FldrdFstrdExtReg, test) { |
| 2240 typedef double (*DoubleReturn)() DART_UNUSED; | 2240 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2241 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2241 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2242 } | 2242 } |
| 2243 | 2243 |
| 2244 | 2244 |
| 2245 ASSEMBLER_TEST_GENERATE(FldrdFstrdScaledReg, assembler) { | 2245 ASSEMBLER_TEST_GENERATE(FldrdFstrdScaledReg, assembler) { |
| 2246 __ SetupDartSP(kTestStackSpace); | 2246 __ SetupDartSP(); |
| 2247 __ LoadDImmediate(V0, 43.0); | 2247 __ LoadDImmediate(V0, 43.0); |
| 2248 __ LoadDImmediate(V1, 42.0); | 2248 __ LoadDImmediate(V1, 42.0); |
| 2249 __ movz(R2, Immediate(10), 0); | 2249 __ movz(R2, Immediate(10), 0); |
| 2250 __ sub(SP, SP, Operand(10*kWordSize)); | 2250 __ sub(SP, SP, Operand(10*kWordSize)); |
| 2251 // Store V1 into SP + R2 * kWordSize. | 2251 // Store V1 into SP + R2 * kWordSize. |
| 2252 __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled)); | 2252 __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled)); |
| 2253 __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled)); | 2253 __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled)); |
| 2254 __ add(SP, SP, Operand(10*kWordSize)); | 2254 __ add(SP, SP, Operand(10*kWordSize)); |
| 2255 __ mov(CSP, SP); | 2255 __ RestoreCSP(); |
| 2256 __ ret(); | 2256 __ ret(); |
| 2257 } | 2257 } |
| 2258 | 2258 |
| 2259 | 2259 |
| 2260 ASSEMBLER_TEST_RUN(FldrdFstrdScaledReg, test) { | 2260 ASSEMBLER_TEST_RUN(FldrdFstrdScaledReg, test) { |
| 2261 typedef double (*DoubleReturn)() DART_UNUSED; | 2261 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2262 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2262 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2263 } | 2263 } |
| 2264 | 2264 |
| 2265 | 2265 |
| (...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2700 } | 2700 } |
| 2701 | 2701 |
| 2702 | 2702 |
| 2703 ASSEMBLER_TEST_RUN(Vdivd, test) { | 2703 ASSEMBLER_TEST_RUN(Vdivd, test) { |
| 2704 typedef double (*DoubleReturn)() DART_UNUSED; | 2704 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2705 EXPECT_EQ(2.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2705 EXPECT_EQ(2.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2706 } | 2706 } |
| 2707 | 2707 |
| 2708 | 2708 |
| 2709 ASSEMBLER_TEST_GENERATE(Vdupd, assembler) { | 2709 ASSEMBLER_TEST_GENERATE(Vdupd, assembler) { |
| 2710 __ SetupDartSP(kTestStackSpace); | 2710 __ SetupDartSP(); |
| 2711 __ LoadDImmediate(V0, 21.0); | 2711 __ LoadDImmediate(V0, 21.0); |
| 2712 __ vdupd(V1, V0, 0); | 2712 __ vdupd(V1, V0, 0); |
| 2713 | 2713 |
| 2714 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); | 2714 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); |
| 2715 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 2715 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 2716 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 2716 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 2717 | 2717 |
| 2718 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 2718 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 2719 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 2719 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 2720 | 2720 |
| 2721 __ faddd(V0, V2, V3); | 2721 __ faddd(V0, V2, V3); |
| 2722 __ mov(CSP, SP); | 2722 __ RestoreCSP(); |
| 2723 __ ret(); | 2723 __ ret(); |
| 2724 } | 2724 } |
| 2725 | 2725 |
| 2726 | 2726 |
| 2727 ASSEMBLER_TEST_RUN(Vdupd, test) { | 2727 ASSEMBLER_TEST_RUN(Vdupd, test) { |
| 2728 typedef double (*DoubleReturn)() DART_UNUSED; | 2728 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2729 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2729 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2730 } | 2730 } |
| 2731 | 2731 |
| 2732 | 2732 |
| 2733 ASSEMBLER_TEST_GENERATE(Vdups, assembler) { | 2733 ASSEMBLER_TEST_GENERATE(Vdups, assembler) { |
| 2734 __ SetupDartSP(kTestStackSpace); | 2734 __ SetupDartSP(); |
| 2735 __ LoadDImmediate(V0, 21.0); | 2735 __ LoadDImmediate(V0, 21.0); |
| 2736 __ fcvtsd(V0, V0); | 2736 __ fcvtsd(V0, V0); |
| 2737 __ vdups(V1, V0, 0); | 2737 __ vdups(V1, V0, 0); |
| 2738 | 2738 |
| 2739 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); | 2739 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); |
| 2740 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 2740 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 2741 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 2741 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 2742 | 2742 |
| 2743 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2743 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 2744 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2744 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 2745 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2745 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 2746 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2746 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 2747 | 2747 |
| 2748 __ fcvtds(V0, V0); | 2748 __ fcvtds(V0, V0); |
| 2749 __ fcvtds(V1, V1); | 2749 __ fcvtds(V1, V1); |
| 2750 __ fcvtds(V2, V2); | 2750 __ fcvtds(V2, V2); |
| 2751 __ fcvtds(V3, V3); | 2751 __ fcvtds(V3, V3); |
| 2752 | 2752 |
| 2753 __ faddd(V0, V1, V1); | 2753 __ faddd(V0, V1, V1); |
| 2754 __ faddd(V0, V0, V2); | 2754 __ faddd(V0, V0, V2); |
| 2755 __ faddd(V0, V0, V3); | 2755 __ faddd(V0, V0, V3); |
| 2756 __ mov(CSP, SP); | 2756 __ RestoreCSP(); |
| 2757 __ ret(); | 2757 __ ret(); |
| 2758 } | 2758 } |
| 2759 | 2759 |
| 2760 | 2760 |
| 2761 ASSEMBLER_TEST_RUN(Vdups, test) { | 2761 ASSEMBLER_TEST_RUN(Vdups, test) { |
| 2762 typedef double (*DoubleReturn)() DART_UNUSED; | 2762 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2763 EXPECT_EQ(84.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2763 EXPECT_EQ(84.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2764 } | 2764 } |
| 2765 | 2765 |
| 2766 | 2766 |
| 2767 ASSEMBLER_TEST_GENERATE(Vinsd, assembler) { | 2767 ASSEMBLER_TEST_GENERATE(Vinsd, assembler) { |
| 2768 __ SetupDartSP(kTestStackSpace); | 2768 __ SetupDartSP(); |
| 2769 __ LoadDImmediate(V5, 42.0); | 2769 __ LoadDImmediate(V5, 42.0); |
| 2770 __ vinsd(V1, 1, V5, 0); // V1[1] <- V0[0]. | 2770 __ vinsd(V1, 1, V5, 0); // V1[1] <- V0[0]. |
| 2771 | 2771 |
| 2772 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); | 2772 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); |
| 2773 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 2773 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 2774 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 2774 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 2775 | 2775 |
| 2776 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 2776 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 2777 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 2777 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 2778 | 2778 |
| 2779 __ fmovdd(V0, V3); | 2779 __ fmovdd(V0, V3); |
| 2780 __ mov(CSP, SP); | 2780 __ RestoreCSP(); |
| 2781 __ ret(); | 2781 __ ret(); |
| 2782 } | 2782 } |
| 2783 | 2783 |
| 2784 | 2784 |
| 2785 ASSEMBLER_TEST_RUN(Vinsd, test) { | 2785 ASSEMBLER_TEST_RUN(Vinsd, test) { |
| 2786 typedef double (*DoubleReturn)() DART_UNUSED; | 2786 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2787 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2787 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2788 } | 2788 } |
| 2789 | 2789 |
| 2790 | 2790 |
| 2791 ASSEMBLER_TEST_GENERATE(Vinss, assembler) { | 2791 ASSEMBLER_TEST_GENERATE(Vinss, assembler) { |
| 2792 __ SetupDartSP(kTestStackSpace); | 2792 __ SetupDartSP(); |
| 2793 __ LoadDImmediate(V0, 21.0); | 2793 __ LoadDImmediate(V0, 21.0); |
| 2794 __ fcvtsd(V0, V0); | 2794 __ fcvtsd(V0, V0); |
| 2795 __ vinss(V1, 3, V0, 0); | 2795 __ vinss(V1, 3, V0, 0); |
| 2796 __ vinss(V1, 1, V0, 0); | 2796 __ vinss(V1, 1, V0, 0); |
| 2797 | 2797 |
| 2798 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); | 2798 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); |
| 2799 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 2799 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 2800 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 2800 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 2801 | 2801 |
| 2802 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2802 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 2803 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2803 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 2804 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2804 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 2805 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2805 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 2806 | 2806 |
| 2807 __ fcvtds(V0, V0); | 2807 __ fcvtds(V0, V0); |
| 2808 __ fcvtds(V1, V1); | 2808 __ fcvtds(V1, V1); |
| 2809 __ fcvtds(V2, V2); | 2809 __ fcvtds(V2, V2); |
| 2810 __ fcvtds(V3, V3); | 2810 __ fcvtds(V3, V3); |
| 2811 | 2811 |
| 2812 __ faddd(V0, V0, V1); | 2812 __ faddd(V0, V0, V1); |
| 2813 __ faddd(V0, V0, V2); | 2813 __ faddd(V0, V0, V2); |
| 2814 __ faddd(V0, V0, V3); | 2814 __ faddd(V0, V0, V3); |
| 2815 __ mov(CSP, SP); | 2815 __ RestoreCSP(); |
| 2816 __ ret(); | 2816 __ ret(); |
| 2817 } | 2817 } |
| 2818 | 2818 |
| 2819 | 2819 |
| 2820 ASSEMBLER_TEST_RUN(Vinss, test) { | 2820 ASSEMBLER_TEST_RUN(Vinss, test) { |
| 2821 typedef double (*DoubleReturn)() DART_UNUSED; | 2821 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2822 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2822 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2823 } | 2823 } |
| 2824 | 2824 |
| 2825 | 2825 |
| (...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); | 3594 EXPECT_FLOAT_EQ(1.0/sqrt(147000.0), res, 0.0001); |
| 3595 } | 3595 } |
| 3596 | 3596 |
| 3597 | 3597 |
| 3598 // Called from assembler_test.cc. | 3598 // Called from assembler_test.cc. |
| 3599 // LR: return address. | 3599 // LR: return address. |
| 3600 // R0: value. | 3600 // R0: value. |
| 3601 // R1: growable array. | 3601 // R1: growable array. |
| 3602 // R2: current thread. | 3602 // R2: current thread. |
| 3603 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { | 3603 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { |
| 3604 __ SetupDartSP(kTestStackSpace); | 3604 __ SetupDartSP(); |
| 3605 __ Push(CODE_REG); | 3605 __ Push(CODE_REG); |
| 3606 __ Push(THR); | 3606 __ Push(THR); |
| 3607 __ Push(LR); | 3607 __ Push(LR); |
| 3608 __ mov(THR, R2); | 3608 __ mov(THR, R2); |
| 3609 __ StoreIntoObject(R1, | 3609 __ StoreIntoObject(R1, |
| 3610 FieldAddress(R1, GrowableObjectArray::data_offset()), | 3610 FieldAddress(R1, GrowableObjectArray::data_offset()), |
| 3611 R0); | 3611 R0); |
| 3612 __ Pop(LR); | 3612 __ Pop(LR); |
| 3613 __ Pop(THR); | 3613 __ Pop(THR); |
| 3614 __ Pop(CODE_REG); | 3614 __ Pop(CODE_REG); |
| 3615 __ mov(CSP, SP); | 3615 __ RestoreCSP(); |
| 3616 __ ret(); | 3616 __ ret(); |
| 3617 } | 3617 } |
| 3618 | 3618 |
| 3619 | 3619 |
| 3620 ASSEMBLER_TEST_GENERATE(ComputeRange, assembler) { | 3620 ASSEMBLER_TEST_GENERATE(ComputeRange, assembler) { |
| 3621 __ SetupDartSP(kTestStackSpace); | 3621 __ SetupDartSP(); |
| 3622 EnterTestFrame(assembler); | 3622 EnterTestFrame(assembler); |
| 3623 Label miss, done; | 3623 Label miss, done; |
| 3624 __ ComputeRange(R0, R2, R3, &miss); | 3624 __ ComputeRange(R0, R2, R3, &miss); |
| 3625 __ b(&done); | 3625 __ b(&done); |
| 3626 | 3626 |
| 3627 __ Bind(&miss); | 3627 __ Bind(&miss); |
| 3628 __ LoadImmediate(R0, -1); | 3628 __ LoadImmediate(R0, -1); |
| 3629 | 3629 |
| 3630 __ Bind(&done); | 3630 __ Bind(&done); |
| 3631 LeaveTestFrame(assembler); | 3631 LeaveTestFrame(assembler); |
| 3632 __ mov(CSP, SP); | 3632 __ RestoreCSP(); |
| 3633 __ ret(); | 3633 __ ret(); |
| 3634 } | 3634 } |
| 3635 | 3635 |
| 3636 | 3636 |
| 3637 ASSEMBLER_TEST_RUN(ComputeRange, test) { | 3637 ASSEMBLER_TEST_RUN(ComputeRange, test) { |
| 3638 #define RANGE_OF(arg_type, v) \ | 3638 #define RANGE_OF(arg_type, v) \ |
| 3639 test->InvokeWithCodeAndThread<intptr_t, arg_type>(v) | 3639 test->InvokeWithCodeAndThread<intptr_t, arg_type>(v) |
| 3640 | 3640 |
| 3641 EXPECT_EQ(ICData::kInt32RangeBit, RANGE_OF(RawSmi*, Smi::New(0))); | 3641 EXPECT_EQ(ICData::kInt32RangeBit, RANGE_OF(RawSmi*, Smi::New(0))); |
| 3642 EXPECT_EQ(ICData::kInt32RangeBit, RANGE_OF(RawSmi*, Smi::New(1))); | 3642 EXPECT_EQ(ICData::kInt32RangeBit, RANGE_OF(RawSmi*, Smi::New(1))); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3674 | 3674 |
| 3675 EXPECT_EQ(-1, RANGE_OF(RawBool*, Bool::True().raw())); | 3675 EXPECT_EQ(-1, RANGE_OF(RawBool*, Bool::True().raw())); |
| 3676 | 3676 |
| 3677 #undef RANGE_OF | 3677 #undef RANGE_OF |
| 3678 } | 3678 } |
| 3679 | 3679 |
| 3680 | 3680 |
| 3681 } // namespace dart | 3681 } // namespace dart |
| 3682 | 3682 |
| 3683 #endif // defined(TARGET_ARCH_ARM64) | 3683 #endif // defined(TARGET_ARCH_ARM64) |
| OLD | NEW |