| 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" |
| 11 #include "vm/unit_test.h" | 11 #include "vm/unit_test.h" |
| 12 #include "vm/virtual_memory.h" | 12 #include "vm/virtual_memory.h" |
| 13 | 13 |
| 14 namespace dart { | 14 namespace dart { |
| 15 | 15 |
| 16 #define __ assembler-> | 16 #define __ assembler-> |
| 17 | 17 |
| 18 |
| 19 // Copies the stack pointer to our "SP", actually R15. Also moves the real SP |
| 20 // down so that we can do push and pop in tests. The Linux ABI does not seem |
| 21 // to have a red zone. |
| 22 static void SetUpStackFrame(Assembler* assembler) { |
| 23 __ SetupDartSP(); |
| 24 __ EnterFrame(0); |
| 25 } |
| 26 |
| 27 |
| 28 static void TearDownStackFrame(Assembler* assembler) { |
| 29 __ LeaveFrame(); |
| 30 __ RestoreCSP(); |
| 31 } |
| 32 |
| 33 |
| 18 ASSEMBLER_TEST_GENERATE(Simple, assembler) { | 34 ASSEMBLER_TEST_GENERATE(Simple, assembler) { |
| 19 __ add(R0, ZR, Operand(ZR)); | 35 __ add(R0, ZR, Operand(ZR)); |
| 20 __ add(R0, R0, Operand(42)); | 36 __ add(R0, R0, Operand(42)); |
| 21 __ ret(); | 37 __ ret(); |
| 22 } | 38 } |
| 23 | 39 |
| 24 | 40 |
| 25 ASSEMBLER_TEST_RUN(Simple, test) { | 41 ASSEMBLER_TEST_RUN(Simple, test) { |
| 26 typedef int64_t (*Int64Return)() DART_UNUSED; | 42 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 27 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 43 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| (...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 | 397 |
| 382 | 398 |
| 383 ASSEMBLER_TEST_RUN(WordOverflow, test) { | 399 ASSEMBLER_TEST_RUN(WordOverflow, test) { |
| 384 typedef int64_t (*Int64Return)() DART_UNUSED; | 400 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 385 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 401 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 386 } | 402 } |
| 387 | 403 |
| 388 | 404 |
| 389 // Loads and Stores. | 405 // Loads and Stores. |
| 390 ASSEMBLER_TEST_GENERATE(SimpleLoadStore, assembler) { | 406 ASSEMBLER_TEST_GENERATE(SimpleLoadStore, assembler) { |
| 391 __ SetupDartSP(); | 407 SetUpStackFrame(assembler); |
| 392 __ movz(R0, Immediate(43), 0); | 408 __ movz(R0, Immediate(43), 0); |
| 393 __ movz(R1, Immediate(42), 0); | 409 __ movz(R1, Immediate(42), 0); |
| 394 __ str(R1, Address(SP, -1 * kWordSize, Address::PreIndex)); | 410 __ str(R1, Address(SP, -1 * kWordSize, Address::PreIndex)); |
| 395 __ ldr(R0, Address(SP, 1 * kWordSize, Address::PostIndex)); | 411 __ ldr(R0, Address(SP, 1 * kWordSize, Address::PostIndex)); |
| 396 __ RestoreCSP(); | 412 TearDownStackFrame(assembler); |
| 397 __ ret(); | 413 __ ret(); |
| 398 } | 414 } |
| 399 | 415 |
| 400 | 416 |
| 401 ASSEMBLER_TEST_RUN(SimpleLoadStore, test) { | 417 ASSEMBLER_TEST_RUN(SimpleLoadStore, test) { |
| 402 typedef int64_t (*Int64Return)() DART_UNUSED; | 418 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 403 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 419 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 404 } | 420 } |
| 405 | 421 |
| 406 | 422 |
| 407 ASSEMBLER_TEST_GENERATE(SimpleLoadStoreHeapTag, assembler) { | 423 ASSEMBLER_TEST_GENERATE(SimpleLoadStoreHeapTag, assembler) { |
| 408 __ SetupDartSP(); | 424 SetUpStackFrame(assembler); |
| 409 __ movz(R0, Immediate(43), 0); | 425 __ movz(R0, Immediate(43), 0); |
| 410 __ movz(R1, Immediate(42), 0); | 426 __ movz(R1, Immediate(42), 0); |
| 411 __ add(R2, SP, Operand(1)); | 427 __ add(R2, SP, Operand(1)); |
| 412 __ str(R1, Address(R2, -1)); | 428 __ str(R1, Address(R2, -1)); |
| 413 __ ldr(R0, Address(R2, -1)); | 429 __ ldr(R0, Address(R2, -1)); |
| 414 __ RestoreCSP(); | 430 TearDownStackFrame(assembler); |
| 415 __ ret(); | 431 __ ret(); |
| 416 } | 432 } |
| 417 | 433 |
| 418 | 434 |
| 419 ASSEMBLER_TEST_RUN(SimpleLoadStoreHeapTag, test) { | 435 ASSEMBLER_TEST_RUN(SimpleLoadStoreHeapTag, test) { |
| 420 typedef int64_t (*Int64Return)() DART_UNUSED; | 436 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 421 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 437 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 422 } | 438 } |
| 423 | 439 |
| 424 | 440 |
| 425 ASSEMBLER_TEST_GENERATE(LoadStoreLargeIndex, assembler) { | 441 ASSEMBLER_TEST_GENERATE(LoadStoreLargeIndex, assembler) { |
| 426 __ SetupDartSP(); | 442 SetUpStackFrame(assembler); |
| 427 __ movz(R0, Immediate(43), 0); | 443 __ movz(R0, Immediate(43), 0); |
| 428 __ movz(R1, Immediate(42), 0); | 444 __ movz(R1, Immediate(42), 0); |
| 429 // Largest negative offset that can fit in the signed 9-bit immediate field. | 445 // Largest negative offset that can fit in the signed 9-bit immediate field. |
| 430 __ str(R1, Address(SP, -32 * kWordSize, Address::PreIndex)); | 446 __ str(R1, Address(SP, -32 * kWordSize, Address::PreIndex)); |
| 431 // Largest positive kWordSize aligned offset that we can fit. | 447 // Largest positive kWordSize aligned offset that we can fit. |
| 432 __ ldr(R0, Address(SP, 31 * kWordSize, Address::PostIndex)); | 448 __ ldr(R0, Address(SP, 31 * kWordSize, Address::PostIndex)); |
| 433 // Correction. | 449 // Correction. |
| 434 __ add(SP, SP, Operand(kWordSize)); // Restore SP. | 450 __ add(SP, SP, Operand(kWordSize)); // Restore SP. |
| 435 __ RestoreCSP(); | 451 TearDownStackFrame(assembler); |
| 436 __ ret(); | 452 __ ret(); |
| 437 } | 453 } |
| 438 | 454 |
| 439 | 455 |
| 440 ASSEMBLER_TEST_RUN(LoadStoreLargeIndex, test) { | 456 ASSEMBLER_TEST_RUN(LoadStoreLargeIndex, test) { |
| 441 typedef int64_t (*Int64Return)() DART_UNUSED; | 457 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 442 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 458 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 443 } | 459 } |
| 444 | 460 |
| 445 | 461 |
| 446 ASSEMBLER_TEST_GENERATE(LoadStoreLargeOffset, assembler) { | 462 ASSEMBLER_TEST_GENERATE(LoadStoreLargeOffset, assembler) { |
| 447 __ SetupDartSP(); | 463 SetUpStackFrame(assembler); |
| 448 __ movz(R0, Immediate(43), 0); | 464 __ movz(R0, Immediate(43), 0); |
| 449 __ movz(R1, Immediate(42), 0); | 465 __ movz(R1, Immediate(42), 0); |
| 450 __ sub(SP, SP, Operand(512 * kWordSize)); | 466 __ sub(SP, SP, Operand(512 * kWordSize)); |
| 451 __ str(R1, Address(SP, 512 * kWordSize, Address::Offset)); | 467 __ str(R1, Address(SP, 512 * kWordSize, Address::Offset)); |
| 452 __ add(SP, SP, Operand(512 * kWordSize)); | 468 __ add(SP, SP, Operand(512 * kWordSize)); |
| 453 __ ldr(R0, Address(SP)); | 469 __ ldr(R0, Address(SP)); |
| 454 __ RestoreCSP(); | 470 TearDownStackFrame(assembler); |
| 455 __ ret(); | 471 __ ret(); |
| 456 } | 472 } |
| 457 | 473 |
| 458 | 474 |
| 459 ASSEMBLER_TEST_RUN(LoadStoreLargeOffset, test) { | 475 ASSEMBLER_TEST_RUN(LoadStoreLargeOffset, test) { |
| 460 typedef int64_t (*Int64Return)() DART_UNUSED; | 476 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 461 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 477 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 462 } | 478 } |
| 463 | 479 |
| 464 | 480 |
| 465 ASSEMBLER_TEST_GENERATE(LoadStoreExtReg, assembler) { | 481 ASSEMBLER_TEST_GENERATE(LoadStoreExtReg, assembler) { |
| 466 __ SetupDartSP(); | 482 SetUpStackFrame(assembler); |
| 467 __ movz(R0, Immediate(43), 0); | 483 __ movz(R0, Immediate(43), 0); |
| 468 __ movz(R1, Immediate(42), 0); | 484 __ movz(R1, Immediate(42), 0); |
| 469 __ movz(R2, Immediate(0xfff8), 0); | 485 __ movz(R2, Immediate(0xfff8), 0); |
| 470 __ movk(R2, Immediate(0xffff), 1); // R2 <- -8 (int32_t). | 486 __ movk(R2, Immediate(0xffff), 1); // R2 <- -8 (int32_t). |
| 471 // This should sign extend R2, and add to SP to get address, | 487 // This should sign extend R2, and add to SP to get address, |
| 472 // i.e. SP - kWordSize. | 488 // i.e. SP - kWordSize. |
| 473 __ str(R1, Address(SP, R2, SXTW)); | 489 __ str(R1, Address(SP, R2, SXTW)); |
| 474 __ sub(SP, SP, Operand(kWordSize)); | 490 __ sub(SP, SP, Operand(kWordSize)); |
| 475 __ ldr(R0, Address(SP)); | 491 __ ldr(R0, Address(SP)); |
| 476 __ add(SP, SP, Operand(kWordSize)); | 492 __ add(SP, SP, Operand(kWordSize)); |
| 477 __ RestoreCSP(); | 493 TearDownStackFrame(assembler); |
| 478 __ ret(); | 494 __ ret(); |
| 479 } | 495 } |
| 480 | 496 |
| 481 | 497 |
| 482 ASSEMBLER_TEST_RUN(LoadStoreExtReg, test) { | 498 ASSEMBLER_TEST_RUN(LoadStoreExtReg, test) { |
| 483 typedef int64_t (*Int64Return)() DART_UNUSED; | 499 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 484 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 500 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 485 } | 501 } |
| 486 | 502 |
| 487 | 503 |
| 488 ASSEMBLER_TEST_GENERATE(LoadStoreScaledReg, assembler) { | 504 ASSEMBLER_TEST_GENERATE(LoadStoreScaledReg, assembler) { |
| 489 __ SetupDartSP(); | 505 SetUpStackFrame(assembler); |
| 490 __ movz(R0, Immediate(43), 0); | 506 __ movz(R0, Immediate(43), 0); |
| 491 __ movz(R1, Immediate(42), 0); | 507 __ movz(R1, Immediate(42), 0); |
| 492 __ movz(R2, Immediate(10), 0); | 508 __ movz(R2, Immediate(10), 0); |
| 493 __ sub(SP, SP, Operand(10 * kWordSize)); | 509 __ sub(SP, SP, Operand(10 * kWordSize)); |
| 494 // Store R1 into SP + R2 * kWordSize. | 510 // Store R1 into SP + R2 * kWordSize. |
| 495 __ str(R1, Address(SP, R2, UXTX, Address::Scaled)); | 511 __ str(R1, Address(SP, R2, UXTX, Address::Scaled)); |
| 496 __ ldr(R0, Address(SP, R2, UXTX, Address::Scaled)); | 512 __ ldr(R0, Address(SP, R2, UXTX, Address::Scaled)); |
| 497 __ add(SP, SP, Operand(10 * kWordSize)); | 513 __ add(SP, SP, Operand(10 * kWordSize)); |
| 498 __ RestoreCSP(); | 514 TearDownStackFrame(assembler); |
| 499 __ ret(); | 515 __ ret(); |
| 500 } | 516 } |
| 501 | 517 |
| 502 | 518 |
| 503 ASSEMBLER_TEST_RUN(LoadStoreScaledReg, test) { | 519 ASSEMBLER_TEST_RUN(LoadStoreScaledReg, test) { |
| 504 typedef int64_t (*Int64Return)() DART_UNUSED; | 520 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 505 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 521 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 506 } | 522 } |
| 507 | 523 |
| 508 | 524 |
| 509 ASSEMBLER_TEST_GENERATE(LoadSigned32Bit, assembler) { | 525 ASSEMBLER_TEST_GENERATE(LoadSigned32Bit, assembler) { |
| 510 __ SetupDartSP(); | 526 SetUpStackFrame(assembler); |
| 511 __ LoadImmediate(R1, 0xffffffff); | 527 __ LoadImmediate(R1, 0xffffffff); |
| 512 __ str(R1, Address(SP, -4, Address::PreIndex, kWord), kWord); | 528 __ str(R1, Address(SP, -4, Address::PreIndex, kWord), kWord); |
| 513 __ ldr(R0, Address(SP), kWord); | 529 __ ldr(R0, Address(SP), kWord); |
| 514 __ ldr(R1, Address(SP, 4, Address::PostIndex, kWord), kWord); | 530 __ ldr(R1, Address(SP, 4, Address::PostIndex, kWord), kWord); |
| 515 __ RestoreCSP(); | 531 TearDownStackFrame(assembler); |
| 516 __ ret(); | 532 __ ret(); |
| 517 } | 533 } |
| 518 | 534 |
| 519 | 535 |
| 520 ASSEMBLER_TEST_RUN(LoadSigned32Bit, test) { | 536 ASSEMBLER_TEST_RUN(LoadSigned32Bit, test) { |
| 521 typedef int64_t (*Int64Return)() DART_UNUSED; | 537 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 522 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 538 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 523 } | 539 } |
| 524 | 540 |
| 525 | 541 |
| 526 ASSEMBLER_TEST_GENERATE(SimpleLoadStorePair, assembler) { | 542 ASSEMBLER_TEST_GENERATE(SimpleLoadStorePair, assembler) { |
| 527 __ SetupDartSP(); | 543 SetUpStackFrame(assembler); |
| 528 __ LoadImmediate(R2, 43); | 544 __ LoadImmediate(R2, 43); |
| 529 __ LoadImmediate(R3, 42); | 545 __ LoadImmediate(R3, 42); |
| 530 __ stp(R2, R3, Address(SP, -2 * kWordSize, Address::PairPreIndex)); | 546 __ stp(R2, R3, Address(SP, -2 * kWordSize, Address::PairPreIndex)); |
| 531 __ ldp(R0, R1, Address(SP, 2 * kWordSize, Address::PairPostIndex)); | 547 __ ldp(R0, R1, Address(SP, 2 * kWordSize, Address::PairPostIndex)); |
| 532 __ sub(R0, R0, Operand(R1)); | 548 __ sub(R0, R0, Operand(R1)); |
| 533 __ RestoreCSP(); | 549 TearDownStackFrame(assembler); |
| 534 __ ret(); | 550 __ ret(); |
| 535 } | 551 } |
| 536 | 552 |
| 537 | 553 |
| 538 ASSEMBLER_TEST_RUN(SimpleLoadStorePair, test) { | 554 ASSEMBLER_TEST_RUN(SimpleLoadStorePair, test) { |
| 539 typedef int64_t (*Int64Return)() DART_UNUSED; | 555 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 540 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 556 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 541 } | 557 } |
| 542 | 558 |
| 543 | 559 |
| 544 ASSEMBLER_TEST_GENERATE(LoadStorePairOffset, assembler) { | 560 ASSEMBLER_TEST_GENERATE(LoadStorePairOffset, assembler) { |
| 545 __ SetupDartSP(); | 561 SetUpStackFrame(assembler); |
| 546 __ LoadImmediate(R2, 43); | 562 __ LoadImmediate(R2, 43); |
| 547 __ LoadImmediate(R3, 42); | 563 __ LoadImmediate(R3, 42); |
| 548 __ sub(SP, SP, Operand(4 * kWordSize)); | 564 __ sub(SP, SP, Operand(4 * kWordSize)); |
| 549 __ stp(R2, R3, Address::Pair(SP, 2 * kWordSize)); | 565 __ stp(R2, R3, Address::Pair(SP, 2 * kWordSize)); |
| 550 __ ldp(R0, R1, Address::Pair(SP, 2 * kWordSize)); | 566 __ ldp(R0, R1, Address::Pair(SP, 2 * kWordSize)); |
| 551 __ add(SP, SP, Operand(4 * kWordSize)); | 567 __ add(SP, SP, Operand(4 * kWordSize)); |
| 552 __ sub(R0, R0, Operand(R1)); | 568 __ sub(R0, R0, Operand(R1)); |
| 553 __ RestoreCSP(); | 569 TearDownStackFrame(assembler); |
| 554 __ ret(); | 570 __ ret(); |
| 555 } | 571 } |
| 556 | 572 |
| 557 | 573 |
| 558 ASSEMBLER_TEST_RUN(LoadStorePairOffset, test) { | 574 ASSEMBLER_TEST_RUN(LoadStorePairOffset, test) { |
| 559 typedef int64_t (*Int64Return)() DART_UNUSED; | 575 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 560 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 576 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 561 } | 577 } |
| 562 | 578 |
| 563 | 579 |
| 564 ASSEMBLER_TEST_GENERATE(Semaphore, assembler) { | 580 ASSEMBLER_TEST_GENERATE(Semaphore, assembler) { |
| 565 __ SetupDartSP(); | 581 SetUpStackFrame(assembler); |
| 566 __ movz(R0, Immediate(40), 0); | 582 __ movz(R0, Immediate(40), 0); |
| 567 __ movz(R1, Immediate(42), 0); | 583 __ movz(R1, Immediate(42), 0); |
| 568 __ Push(R0); | 584 __ Push(R0); |
| 569 Label retry; | 585 Label retry; |
| 570 __ Bind(&retry); | 586 __ Bind(&retry); |
| 571 __ ldxr(R0, SP); | 587 __ ldxr(R0, SP); |
| 572 __ stxr(TMP, R1, SP); // IP == 0, success | 588 __ stxr(TMP, R1, SP); // IP == 0, success |
| 573 __ cmp(TMP, Operand(0)); | 589 __ cmp(TMP, Operand(0)); |
| 574 __ b(&retry, NE); // NE if context switch occurred between ldrex and strex. | 590 __ b(&retry, NE); // NE if context switch occurred between ldrex and strex. |
| 575 __ Pop(R0); // 42 | 591 __ Pop(R0); // 42 |
| 576 __ RestoreCSP(); | 592 TearDownStackFrame(assembler); |
| 577 __ ret(); | 593 __ ret(); |
| 578 } | 594 } |
| 579 | 595 |
| 580 | 596 |
| 581 ASSEMBLER_TEST_RUN(Semaphore, test) { | 597 ASSEMBLER_TEST_RUN(Semaphore, test) { |
| 582 EXPECT(test != NULL); | 598 EXPECT(test != NULL); |
| 583 typedef intptr_t (*Semaphore)() DART_UNUSED; | 599 typedef intptr_t (*Semaphore)() DART_UNUSED; |
| 584 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Semaphore, test->entry())); | 600 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Semaphore, test->entry())); |
| 585 } | 601 } |
| 586 | 602 |
| 587 | 603 |
| 588 ASSEMBLER_TEST_GENERATE(FailedSemaphore, assembler) { | 604 ASSEMBLER_TEST_GENERATE(FailedSemaphore, assembler) { |
| 589 __ SetupDartSP(); | 605 SetUpStackFrame(assembler); |
| 590 __ movz(R0, Immediate(40), 0); | 606 __ movz(R0, Immediate(40), 0); |
| 591 __ movz(R1, Immediate(42), 0); | 607 __ movz(R1, Immediate(42), 0); |
| 592 __ Push(R0); | 608 __ Push(R0); |
| 593 __ ldxr(R0, SP); | 609 __ ldxr(R0, SP); |
| 594 __ clrex(); // Simulate a context switch. | 610 __ clrex(); // Simulate a context switch. |
| 595 __ stxr(TMP, R1, SP); // IP == 1, failure | 611 __ stxr(TMP, R1, SP); // IP == 1, failure |
| 596 __ Pop(R0); // 40 | 612 __ Pop(R0); // 40 |
| 597 __ add(R0, R0, Operand(TMP)); | 613 __ add(R0, R0, Operand(TMP)); |
| 598 __ RestoreCSP(); | 614 TearDownStackFrame(assembler); |
| 599 __ ret(); | 615 __ ret(); |
| 600 } | 616 } |
| 601 | 617 |
| 602 | 618 |
| 603 ASSEMBLER_TEST_RUN(FailedSemaphore, test) { | 619 ASSEMBLER_TEST_RUN(FailedSemaphore, test) { |
| 604 EXPECT(test != NULL); | 620 EXPECT(test != NULL); |
| 605 typedef intptr_t (*FailedSemaphore)() DART_UNUSED; | 621 typedef intptr_t (*FailedSemaphore)() DART_UNUSED; |
| 606 EXPECT_EQ(41, EXECUTE_TEST_CODE_INT64(FailedSemaphore, test->entry())); | 622 EXPECT_EQ(41, EXECUTE_TEST_CODE_INT64(FailedSemaphore, test->entry())); |
| 607 } | 623 } |
| 608 | 624 |
| 609 | 625 |
| 610 ASSEMBLER_TEST_GENERATE(Semaphore32, assembler) { | 626 ASSEMBLER_TEST_GENERATE(Semaphore32, assembler) { |
| 611 __ SetupDartSP(); | 627 SetUpStackFrame(assembler); |
| 628 __ EnterFrame(0); |
| 612 __ movz(R0, Immediate(40), 0); | 629 __ movz(R0, Immediate(40), 0); |
| 613 __ add(R0, R0, Operand(R0, LSL, 32)); | 630 __ add(R0, R0, Operand(R0, LSL, 32)); |
| 614 __ Push(R0); | 631 __ Push(R0); |
| 615 | 632 |
| 616 __ movz(R0, Immediate(40), 0); | 633 __ movz(R0, Immediate(40), 0); |
| 617 __ movz(R1, Immediate(42), 0); | 634 __ movz(R1, Immediate(42), 0); |
| 618 | 635 |
| 619 Label retry; | 636 Label retry; |
| 620 __ Bind(&retry); | 637 __ Bind(&retry); |
| 621 __ ldxr(R0, SP, kWord); | 638 __ ldxr(R0, SP, kWord); |
| 622 // 32 bit operation should ignore the high word of R0 that was pushed on the | 639 // 32 bit operation should ignore the high word of R0 that was pushed on the |
| 623 // stack. | 640 // stack. |
| 624 __ stxr(TMP, R1, SP, kWord); // IP == 0, success | 641 __ stxr(TMP, R1, SP, kWord); // IP == 0, success |
| 625 __ cmp(TMP, Operand(0)); | 642 __ cmp(TMP, Operand(0)); |
| 626 __ b(&retry, NE); // NE if context switch occurred between ldrex and strex. | 643 __ b(&retry, NE); // NE if context switch occurred between ldrex and strex. |
| 627 __ Pop(R0); // 42 + 42 * 2**32 | 644 __ Pop(R0); // 42 + 42 * 2**32 |
| 628 __ RestoreCSP(); | 645 TearDownStackFrame(assembler); |
| 629 __ ret(); | 646 __ ret(); |
| 630 } | 647 } |
| 631 | 648 |
| 632 | 649 |
| 633 ASSEMBLER_TEST_RUN(Semaphore32, test) { | 650 ASSEMBLER_TEST_RUN(Semaphore32, test) { |
| 634 EXPECT(test != NULL); | 651 EXPECT(test != NULL); |
| 635 typedef intptr_t (*Semaphore32)() DART_UNUSED; | 652 typedef intptr_t (*Semaphore32)() DART_UNUSED; |
| 636 // Lower word has been atomically switched from 40 to 42k, whereas upper word | 653 // Lower word has been atomically switched from 40 to 42k, whereas upper word |
| 637 // is unchanged at 40. | 654 // is unchanged at 40. |
| 638 EXPECT_EQ(42 + (40l << 32), | 655 EXPECT_EQ(42 + (40l << 32), |
| 639 EXECUTE_TEST_CODE_INT64(Semaphore32, test->entry())); | 656 EXECUTE_TEST_CODE_INT64(Semaphore32, test->entry())); |
| 640 } | 657 } |
| 641 | 658 |
| 642 | 659 |
| 643 ASSEMBLER_TEST_GENERATE(FailedSemaphore32, assembler) { | 660 ASSEMBLER_TEST_GENERATE(FailedSemaphore32, assembler) { |
| 644 __ SetupDartSP(); | 661 SetUpStackFrame(assembler); |
| 662 __ EnterFrame(0); |
| 645 __ movz(R0, Immediate(40), 0); | 663 __ movz(R0, Immediate(40), 0); |
| 646 __ add(R0, R0, Operand(R0, LSL, 32)); | 664 __ add(R0, R0, Operand(R0, LSL, 32)); |
| 647 __ Push(R0); | 665 __ Push(R0); |
| 648 | 666 |
| 649 __ movz(R0, Immediate(40), 0); | 667 __ movz(R0, Immediate(40), 0); |
| 650 __ movz(R1, Immediate(42), 0); | 668 __ movz(R1, Immediate(42), 0); |
| 651 | 669 |
| 652 __ ldxr(R0, SP, kWord); | 670 __ ldxr(R0, SP, kWord); |
| 653 __ clrex(); // Simulate a context switch. | 671 __ clrex(); // Simulate a context switch. |
| 654 __ stxr(TMP, R1, SP, kWord); // IP == 1, failure | 672 __ stxr(TMP, R1, SP, kWord); // IP == 1, failure |
| 655 __ Pop(R0); // 40 | 673 __ Pop(R0); // 40 |
| 656 __ add(R0, R0, Operand(TMP)); | 674 __ add(R0, R0, Operand(TMP)); |
| 657 __ RestoreCSP(); | 675 TearDownStackFrame(assembler); |
| 658 __ ret(); | 676 __ ret(); |
| 659 } | 677 } |
| 660 | 678 |
| 661 | 679 |
| 662 ASSEMBLER_TEST_RUN(FailedSemaphore32, test) { | 680 ASSEMBLER_TEST_RUN(FailedSemaphore32, test) { |
| 663 EXPECT(test != NULL); | 681 EXPECT(test != NULL); |
| 664 typedef intptr_t (*FailedSemaphore32)() DART_UNUSED; | 682 typedef intptr_t (*FailedSemaphore32)() DART_UNUSED; |
| 665 // Lower word has had the failure code (1) added to it. Upper word is | 683 // Lower word has had the failure code (1) added to it. Upper word is |
| 666 // unchanged at 40. | 684 // unchanged at 40. |
| 667 EXPECT_EQ(41 + (40l << 32), | 685 EXPECT_EQ(41 + (40l << 32), |
| (...skipping 1249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1917 static void LeaveTestFrame(Assembler* assembler) { | 1935 static void LeaveTestFrame(Assembler* assembler) { |
| 1918 __ PopAndUntagPP(); | 1936 __ PopAndUntagPP(); |
| 1919 __ Pop(THR); | 1937 __ Pop(THR); |
| 1920 __ Pop(CODE_REG); | 1938 __ Pop(CODE_REG); |
| 1921 __ LeaveFrame(); | 1939 __ LeaveFrame(); |
| 1922 } | 1940 } |
| 1923 | 1941 |
| 1924 | 1942 |
| 1925 // Loading immediate values with the object pool. | 1943 // Loading immediate values with the object pool. |
| 1926 ASSEMBLER_TEST_GENERATE(LoadImmediatePPSmall, assembler) { | 1944 ASSEMBLER_TEST_GENERATE(LoadImmediatePPSmall, assembler) { |
| 1927 __ SetupDartSP(); | 1945 SetUpStackFrame(assembler); |
| 1928 EnterTestFrame(assembler); | 1946 EnterTestFrame(assembler); |
| 1929 __ LoadImmediate(R0, 42); | 1947 __ LoadImmediate(R0, 42); |
| 1930 LeaveTestFrame(assembler); | 1948 LeaveTestFrame(assembler); |
| 1931 __ RestoreCSP(); | 1949 TearDownStackFrame(assembler); |
| 1932 __ ret(); | 1950 __ ret(); |
| 1933 } | 1951 } |
| 1934 | 1952 |
| 1935 | 1953 |
| 1936 ASSEMBLER_TEST_RUN(LoadImmediatePPSmall, test) { | 1954 ASSEMBLER_TEST_RUN(LoadImmediatePPSmall, test) { |
| 1937 EXPECT_EQ(42, test->InvokeWithCodeAndThread<int64_t>()); | 1955 EXPECT_EQ(42, test->InvokeWithCodeAndThread<int64_t>()); |
| 1938 } | 1956 } |
| 1939 | 1957 |
| 1940 | 1958 |
| 1941 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed, assembler) { | 1959 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed, assembler) { |
| 1942 __ SetupDartSP(); | 1960 SetUpStackFrame(assembler); |
| 1943 EnterTestFrame(assembler); | 1961 EnterTestFrame(assembler); |
| 1944 __ LoadImmediate(R0, 0xf1234123); | 1962 __ LoadImmediate(R0, 0xf1234123); |
| 1945 LeaveTestFrame(assembler); | 1963 LeaveTestFrame(assembler); |
| 1946 __ RestoreCSP(); | 1964 TearDownStackFrame(assembler); |
| 1947 __ ret(); | 1965 __ ret(); |
| 1948 } | 1966 } |
| 1949 | 1967 |
| 1950 | 1968 |
| 1951 ASSEMBLER_TEST_RUN(LoadImmediatePPMed, test) { | 1969 ASSEMBLER_TEST_RUN(LoadImmediatePPMed, test) { |
| 1952 EXPECT_EQ(0xf1234123, test->InvokeWithCodeAndThread<int64_t>()); | 1970 EXPECT_EQ(0xf1234123, test->InvokeWithCodeAndThread<int64_t>()); |
| 1953 } | 1971 } |
| 1954 | 1972 |
| 1955 | 1973 |
| 1956 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed2, assembler) { | 1974 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed2, assembler) { |
| 1957 __ SetupDartSP(); | 1975 SetUpStackFrame(assembler); |
| 1958 EnterTestFrame(assembler); | 1976 EnterTestFrame(assembler); |
| 1959 __ LoadImmediate(R0, 0x4321f1234124); | 1977 __ LoadImmediate(R0, 0x4321f1234124); |
| 1960 LeaveTestFrame(assembler); | 1978 LeaveTestFrame(assembler); |
| 1961 __ RestoreCSP(); | 1979 TearDownStackFrame(assembler); |
| 1962 __ ret(); | 1980 __ ret(); |
| 1963 } | 1981 } |
| 1964 | 1982 |
| 1965 | 1983 |
| 1966 ASSEMBLER_TEST_RUN(LoadImmediatePPMed2, test) { | 1984 ASSEMBLER_TEST_RUN(LoadImmediatePPMed2, test) { |
| 1967 EXPECT_EQ(0x4321f1234124, test->InvokeWithCodeAndThread<int64_t>()); | 1985 EXPECT_EQ(0x4321f1234124, test->InvokeWithCodeAndThread<int64_t>()); |
| 1968 } | 1986 } |
| 1969 | 1987 |
| 1970 | 1988 |
| 1971 ASSEMBLER_TEST_GENERATE(LoadImmediatePPLarge, assembler) { | 1989 ASSEMBLER_TEST_GENERATE(LoadImmediatePPLarge, assembler) { |
| 1972 __ SetupDartSP(); | 1990 SetUpStackFrame(assembler); |
| 1973 EnterTestFrame(assembler); | 1991 EnterTestFrame(assembler); |
| 1974 __ LoadImmediate(R0, 0x9287436598237465); | 1992 __ LoadImmediate(R0, 0x9287436598237465); |
| 1975 LeaveTestFrame(assembler); | 1993 LeaveTestFrame(assembler); |
| 1976 __ RestoreCSP(); | 1994 TearDownStackFrame(assembler); |
| 1977 __ ret(); | 1995 __ ret(); |
| 1978 } | 1996 } |
| 1979 | 1997 |
| 1980 | 1998 |
| 1981 ASSEMBLER_TEST_RUN(LoadImmediatePPLarge, test) { | 1999 ASSEMBLER_TEST_RUN(LoadImmediatePPLarge, test) { |
| 1982 EXPECT_EQ(static_cast<int64_t>(0x9287436598237465), | 2000 EXPECT_EQ(static_cast<int64_t>(0x9287436598237465), |
| 1983 test->InvokeWithCodeAndThread<int64_t>()); | 2001 test->InvokeWithCodeAndThread<int64_t>()); |
| 1984 } | 2002 } |
| 1985 | 2003 |
| 1986 | 2004 |
| 1987 // LoadObject null. | 2005 // LoadObject null. |
| 1988 ASSEMBLER_TEST_GENERATE(LoadObjectNull, assembler) { | 2006 ASSEMBLER_TEST_GENERATE(LoadObjectNull, assembler) { |
| 1989 __ SetupDartSP(); | 2007 SetUpStackFrame(assembler); |
| 1990 EnterTestFrame(assembler); | 2008 EnterTestFrame(assembler); |
| 1991 __ LoadObject(R0, Object::null_object()); | 2009 __ LoadObject(R0, Object::null_object()); |
| 1992 LeaveTestFrame(assembler); | 2010 LeaveTestFrame(assembler); |
| 1993 __ RestoreCSP(); | 2011 TearDownStackFrame(assembler); |
| 1994 __ ret(); | 2012 __ ret(); |
| 1995 } | 2013 } |
| 1996 | 2014 |
| 1997 | 2015 |
| 1998 ASSEMBLER_TEST_RUN(LoadObjectNull, test) { | 2016 ASSEMBLER_TEST_RUN(LoadObjectNull, test) { |
| 1999 EXPECT_EQ(Object::null(), test->InvokeWithCodeAndThread<RawObject*>()); | 2017 EXPECT_EQ(Object::null(), test->InvokeWithCodeAndThread<RawObject*>()); |
| 2000 } | 2018 } |
| 2001 | 2019 |
| 2002 | 2020 |
| 2003 ASSEMBLER_TEST_GENERATE(LoadObjectTrue, assembler) { | 2021 ASSEMBLER_TEST_GENERATE(LoadObjectTrue, assembler) { |
| 2004 __ SetupDartSP(); | 2022 SetUpStackFrame(assembler); |
| 2005 EnterTestFrame(assembler); | 2023 EnterTestFrame(assembler); |
| 2006 __ LoadObject(R0, Bool::True()); | 2024 __ LoadObject(R0, Bool::True()); |
| 2007 LeaveTestFrame(assembler); | 2025 LeaveTestFrame(assembler); |
| 2008 __ RestoreCSP(); | 2026 TearDownStackFrame(assembler); |
| 2009 __ ret(); | 2027 __ ret(); |
| 2010 } | 2028 } |
| 2011 | 2029 |
| 2012 | 2030 |
| 2013 ASSEMBLER_TEST_RUN(LoadObjectTrue, test) { | 2031 ASSEMBLER_TEST_RUN(LoadObjectTrue, test) { |
| 2014 EXPECT_EQ(Bool::True().raw(), test->InvokeWithCodeAndThread<RawObject*>()); | 2032 EXPECT_EQ(Bool::True().raw(), test->InvokeWithCodeAndThread<RawObject*>()); |
| 2015 } | 2033 } |
| 2016 | 2034 |
| 2017 | 2035 |
| 2018 ASSEMBLER_TEST_GENERATE(LoadObjectFalse, assembler) { | 2036 ASSEMBLER_TEST_GENERATE(LoadObjectFalse, assembler) { |
| 2019 __ SetupDartSP(); | 2037 SetUpStackFrame(assembler); |
| 2020 EnterTestFrame(assembler); | 2038 EnterTestFrame(assembler); |
| 2021 __ LoadObject(R0, Bool::False()); | 2039 __ LoadObject(R0, Bool::False()); |
| 2022 LeaveTestFrame(assembler); | 2040 LeaveTestFrame(assembler); |
| 2023 __ RestoreCSP(); | 2041 TearDownStackFrame(assembler); |
| 2024 __ ret(); | 2042 __ ret(); |
| 2025 } | 2043 } |
| 2026 | 2044 |
| 2027 | 2045 |
| 2028 ASSEMBLER_TEST_RUN(LoadObjectFalse, test) { | 2046 ASSEMBLER_TEST_RUN(LoadObjectFalse, test) { |
| 2029 EXPECT_EQ(Bool::False().raw(), test->InvokeWithCodeAndThread<RawObject*>()); | 2047 EXPECT_EQ(Bool::False().raw(), test->InvokeWithCodeAndThread<RawObject*>()); |
| 2030 } | 2048 } |
| 2031 | 2049 |
| 2032 | 2050 |
| 2033 ASSEMBLER_TEST_GENERATE(CSelTrue, assembler) { | 2051 ASSEMBLER_TEST_GENERATE(CSelTrue, assembler) { |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2201 | 2219 |
| 2202 ASSEMBLER_TEST_RUN(Fmovsr, test) { | 2220 ASSEMBLER_TEST_RUN(Fmovsr, test) { |
| 2203 typedef int64_t (*Int64Return)() DART_UNUSED; | 2221 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 2204 int64_t result = EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()); | 2222 int64_t result = EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()); |
| 2205 const uint32_t one = bit_cast<uint32_t, float>(1.0f); | 2223 const uint32_t one = bit_cast<uint32_t, float>(1.0f); |
| 2206 EXPECT_EQ(one, static_cast<uint32_t>(result)); | 2224 EXPECT_EQ(one, static_cast<uint32_t>(result)); |
| 2207 } | 2225 } |
| 2208 | 2226 |
| 2209 | 2227 |
| 2210 ASSEMBLER_TEST_GENERATE(FldrdFstrdPrePostIndex, assembler) { | 2228 ASSEMBLER_TEST_GENERATE(FldrdFstrdPrePostIndex, assembler) { |
| 2211 __ SetupDartSP(); | 2229 SetUpStackFrame(assembler); |
| 2212 __ LoadDImmediate(V1, 42.0); | 2230 __ LoadDImmediate(V1, 42.0); |
| 2213 __ fstrd(V1, Address(SP, -1 * kWordSize, Address::PreIndex)); | 2231 __ fstrd(V1, Address(SP, -1 * kWordSize, Address::PreIndex)); |
| 2214 __ fldrd(V0, Address(SP, 1 * kWordSize, Address::PostIndex)); | 2232 __ fldrd(V0, Address(SP, 1 * kWordSize, Address::PostIndex)); |
| 2215 __ RestoreCSP(); | 2233 TearDownStackFrame(assembler); |
| 2216 __ ret(); | 2234 __ ret(); |
| 2217 } | 2235 } |
| 2218 | 2236 |
| 2219 | 2237 |
| 2220 ASSEMBLER_TEST_RUN(FldrdFstrdPrePostIndex, test) { | 2238 ASSEMBLER_TEST_RUN(FldrdFstrdPrePostIndex, test) { |
| 2221 typedef double (*DoubleReturn)() DART_UNUSED; | 2239 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2222 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2240 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2223 } | 2241 } |
| 2224 | 2242 |
| 2225 | 2243 |
| 2226 ASSEMBLER_TEST_GENERATE(FldrsFstrsPrePostIndex, assembler) { | 2244 ASSEMBLER_TEST_GENERATE(FldrsFstrsPrePostIndex, assembler) { |
| 2227 __ SetupDartSP(); | 2245 SetUpStackFrame(assembler); |
| 2228 __ LoadDImmediate(V1, 42.0); | 2246 __ LoadDImmediate(V1, 42.0); |
| 2229 __ fcvtsd(V2, V1); | 2247 __ fcvtsd(V2, V1); |
| 2230 __ fstrs(V2, Address(SP, -1 * kWordSize, Address::PreIndex)); | 2248 __ fstrs(V2, Address(SP, -1 * kWordSize, Address::PreIndex)); |
| 2231 __ fldrs(V3, Address(SP, 1 * kWordSize, Address::PostIndex)); | 2249 __ fldrs(V3, Address(SP, 1 * kWordSize, Address::PostIndex)); |
| 2232 __ fcvtds(V0, V3); | 2250 __ fcvtds(V0, V3); |
| 2233 __ RestoreCSP(); | 2251 TearDownStackFrame(assembler); |
| 2234 __ ret(); | 2252 __ ret(); |
| 2235 } | 2253 } |
| 2236 | 2254 |
| 2237 | 2255 |
| 2238 ASSEMBLER_TEST_RUN(FldrsFstrsPrePostIndex, test) { | 2256 ASSEMBLER_TEST_RUN(FldrsFstrsPrePostIndex, test) { |
| 2239 typedef double (*DoubleReturn)() DART_UNUSED; | 2257 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2240 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2258 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2241 } | 2259 } |
| 2242 | 2260 |
| 2243 | 2261 |
| 2244 ASSEMBLER_TEST_GENERATE(FldrqFstrqPrePostIndex, assembler) { | 2262 ASSEMBLER_TEST_GENERATE(FldrqFstrqPrePostIndex, assembler) { |
| 2245 __ SetupDartSP(); | 2263 SetUpStackFrame(assembler); |
| 2246 __ LoadDImmediate(V1, 21.0); | 2264 __ LoadDImmediate(V1, 21.0); |
| 2247 __ LoadDImmediate(V2, 21.0); | 2265 __ LoadDImmediate(V2, 21.0); |
| 2248 __ LoadImmediate(R1, 42); | 2266 __ LoadImmediate(R1, 42); |
| 2249 __ Push(R1); | 2267 __ Push(R1); |
| 2250 __ PushDouble(V1); | 2268 __ PushDouble(V1); |
| 2251 __ PushDouble(V2); | 2269 __ PushDouble(V2); |
| 2252 __ fldrq(V3, Address(SP, 2 * kWordSize, Address::PostIndex)); | 2270 __ fldrq(V3, Address(SP, 2 * kWordSize, Address::PostIndex)); |
| 2253 __ Pop(R0); | 2271 __ Pop(R0); |
| 2254 __ fstrq(V3, Address(SP, -2 * kWordSize, Address::PreIndex)); | 2272 __ fstrq(V3, Address(SP, -2 * kWordSize, Address::PreIndex)); |
| 2255 __ PopDouble(V0); | 2273 __ PopDouble(V0); |
| 2256 __ PopDouble(V1); | 2274 __ PopDouble(V1); |
| 2257 __ faddd(V0, V0, V1); | 2275 __ faddd(V0, V0, V1); |
| 2258 __ RestoreCSP(); | 2276 TearDownStackFrame(assembler); |
| 2259 __ ret(); | 2277 __ ret(); |
| 2260 } | 2278 } |
| 2261 | 2279 |
| 2262 | 2280 |
| 2263 ASSEMBLER_TEST_RUN(FldrqFstrqPrePostIndex, test) { | 2281 ASSEMBLER_TEST_RUN(FldrqFstrqPrePostIndex, test) { |
| 2264 typedef double (*DoubleReturn)() DART_UNUSED; | 2282 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2265 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2283 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2266 } | 2284 } |
| 2267 | 2285 |
| 2268 | 2286 |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2421 } | 2439 } |
| 2422 | 2440 |
| 2423 | 2441 |
| 2424 ASSEMBLER_TEST_RUN(Fsubd, test) { | 2442 ASSEMBLER_TEST_RUN(Fsubd, test) { |
| 2425 typedef double (*DoubleReturn)() DART_UNUSED; | 2443 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2426 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2444 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2427 } | 2445 } |
| 2428 | 2446 |
| 2429 | 2447 |
| 2430 ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) { | 2448 ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) { |
| 2431 __ SetupDartSP(); | 2449 SetUpStackFrame(assembler); |
| 2432 __ LoadDImmediate(V0, 43.0); | 2450 __ LoadDImmediate(V0, 43.0); |
| 2433 __ LoadDImmediate(V1, 42.0); | 2451 __ LoadDImmediate(V1, 42.0); |
| 2434 __ AddImmediate(SP, SP, -1 * kWordSize); | 2452 __ AddImmediate(SP, SP, -1 * kWordSize); |
| 2435 __ add(R2, SP, Operand(1)); | 2453 __ add(R2, SP, Operand(1)); |
| 2436 __ fstrd(V1, Address(R2, -1)); | 2454 __ fstrd(V1, Address(R2, -1)); |
| 2437 __ fldrd(V0, Address(R2, -1)); | 2455 __ fldrd(V0, Address(R2, -1)); |
| 2438 __ AddImmediate(SP, 1 * kWordSize); | 2456 __ AddImmediate(SP, 1 * kWordSize); |
| 2439 __ RestoreCSP(); | 2457 TearDownStackFrame(assembler); |
| 2440 __ ret(); | 2458 __ ret(); |
| 2441 } | 2459 } |
| 2442 | 2460 |
| 2443 | 2461 |
| 2444 ASSEMBLER_TEST_RUN(FldrdFstrdHeapTag, test) { | 2462 ASSEMBLER_TEST_RUN(FldrdFstrdHeapTag, test) { |
| 2445 typedef double (*DoubleReturn)() DART_UNUSED; | 2463 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2446 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2464 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2447 } | 2465 } |
| 2448 | 2466 |
| 2449 | 2467 |
| 2450 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeIndex, assembler) { | 2468 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeIndex, assembler) { |
| 2451 __ SetupDartSP(); | 2469 SetUpStackFrame(assembler); |
| 2452 __ LoadDImmediate(V0, 43.0); | 2470 __ LoadDImmediate(V0, 43.0); |
| 2453 __ LoadDImmediate(V1, 42.0); | 2471 __ LoadDImmediate(V1, 42.0); |
| 2454 // Largest negative offset that can fit in the signed 9-bit immediate field. | 2472 // Largest negative offset that can fit in the signed 9-bit immediate field. |
| 2455 __ fstrd(V1, Address(SP, -32 * kWordSize, Address::PreIndex)); | 2473 __ fstrd(V1, Address(SP, -32 * kWordSize, Address::PreIndex)); |
| 2456 // Largest positive kWordSize aligned offset that we can fit. | 2474 // Largest positive kWordSize aligned offset that we can fit. |
| 2457 __ fldrd(V0, Address(SP, 31 * kWordSize, Address::PostIndex)); | 2475 __ fldrd(V0, Address(SP, 31 * kWordSize, Address::PostIndex)); |
| 2458 // Correction. | 2476 // Correction. |
| 2459 __ add(SP, SP, Operand(kWordSize)); // Restore SP. | 2477 __ add(SP, SP, Operand(kWordSize)); // Restore SP. |
| 2460 __ RestoreCSP(); | 2478 TearDownStackFrame(assembler); |
| 2461 __ ret(); | 2479 __ ret(); |
| 2462 } | 2480 } |
| 2463 | 2481 |
| 2464 | 2482 |
| 2465 ASSEMBLER_TEST_RUN(FldrdFstrdLargeIndex, test) { | 2483 ASSEMBLER_TEST_RUN(FldrdFstrdLargeIndex, test) { |
| 2466 typedef double (*DoubleReturn)() DART_UNUSED; | 2484 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2467 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2485 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2468 } | 2486 } |
| 2469 | 2487 |
| 2470 | 2488 |
| 2471 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeOffset, assembler) { | 2489 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeOffset, assembler) { |
| 2472 __ SetupDartSP(); | 2490 SetUpStackFrame(assembler); |
| 2473 __ LoadDImmediate(V0, 43.0); | 2491 __ LoadDImmediate(V0, 43.0); |
| 2474 __ LoadDImmediate(V1, 42.0); | 2492 __ LoadDImmediate(V1, 42.0); |
| 2475 __ sub(SP, SP, Operand(512 * kWordSize)); | 2493 __ sub(SP, SP, Operand(512 * kWordSize)); |
| 2476 __ fstrd(V1, Address(SP, 512 * kWordSize, Address::Offset)); | 2494 __ fstrd(V1, Address(SP, 512 * kWordSize, Address::Offset)); |
| 2477 __ add(SP, SP, Operand(512 * kWordSize)); | 2495 __ add(SP, SP, Operand(512 * kWordSize)); |
| 2478 __ fldrd(V0, Address(SP)); | 2496 __ fldrd(V0, Address(SP)); |
| 2479 __ RestoreCSP(); | 2497 TearDownStackFrame(assembler); |
| 2480 __ ret(); | 2498 __ ret(); |
| 2481 } | 2499 } |
| 2482 | 2500 |
| 2483 | 2501 |
| 2484 ASSEMBLER_TEST_RUN(FldrdFstrdLargeOffset, test) { | 2502 ASSEMBLER_TEST_RUN(FldrdFstrdLargeOffset, test) { |
| 2485 typedef double (*DoubleReturn)() DART_UNUSED; | 2503 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2486 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2504 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2487 } | 2505 } |
| 2488 | 2506 |
| 2489 | 2507 |
| 2490 ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) { | 2508 ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) { |
| 2491 __ SetupDartSP(); | 2509 SetUpStackFrame(assembler); |
| 2492 __ LoadDImmediate(V0, 43.0); | 2510 __ LoadDImmediate(V0, 43.0); |
| 2493 __ LoadDImmediate(V1, 42.0); | 2511 __ LoadDImmediate(V1, 42.0); |
| 2494 __ movz(R2, Immediate(0xfff8), 0); | 2512 __ movz(R2, Immediate(0xfff8), 0); |
| 2495 __ movk(R2, Immediate(0xffff), 1); // R2 <- -8 (int32_t). | 2513 __ movk(R2, Immediate(0xffff), 1); // R2 <- -8 (int32_t). |
| 2496 // This should sign extend R2, and add to SP to get address, | 2514 // This should sign extend R2, and add to SP to get address, |
| 2497 // i.e. SP - kWordSize. | 2515 // i.e. SP - kWordSize. |
| 2498 __ fstrd(V1, Address(SP, R2, SXTW)); | 2516 __ fstrd(V1, Address(SP, R2, SXTW)); |
| 2499 __ sub(SP, SP, Operand(kWordSize)); | 2517 __ sub(SP, SP, Operand(kWordSize)); |
| 2500 __ fldrd(V0, Address(SP)); | 2518 __ fldrd(V0, Address(SP)); |
| 2501 __ add(SP, SP, Operand(kWordSize)); | 2519 __ add(SP, SP, Operand(kWordSize)); |
| 2502 __ RestoreCSP(); | 2520 TearDownStackFrame(assembler); |
| 2503 __ ret(); | 2521 __ ret(); |
| 2504 } | 2522 } |
| 2505 | 2523 |
| 2506 | 2524 |
| 2507 ASSEMBLER_TEST_RUN(FldrdFstrdExtReg, test) { | 2525 ASSEMBLER_TEST_RUN(FldrdFstrdExtReg, test) { |
| 2508 typedef double (*DoubleReturn)() DART_UNUSED; | 2526 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2509 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2527 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2510 } | 2528 } |
| 2511 | 2529 |
| 2512 | 2530 |
| 2513 ASSEMBLER_TEST_GENERATE(FldrdFstrdScaledReg, assembler) { | 2531 ASSEMBLER_TEST_GENERATE(FldrdFstrdScaledReg, assembler) { |
| 2514 __ SetupDartSP(); | 2532 SetUpStackFrame(assembler); |
| 2515 __ LoadDImmediate(V0, 43.0); | 2533 __ LoadDImmediate(V0, 43.0); |
| 2516 __ LoadDImmediate(V1, 42.0); | 2534 __ LoadDImmediate(V1, 42.0); |
| 2517 __ movz(R2, Immediate(10), 0); | 2535 __ movz(R2, Immediate(10), 0); |
| 2518 __ sub(SP, SP, Operand(10 * kWordSize)); | 2536 __ sub(SP, SP, Operand(10 * kWordSize)); |
| 2519 // Store V1 into SP + R2 * kWordSize. | 2537 // Store V1 into SP + R2 * kWordSize. |
| 2520 __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled)); | 2538 __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled)); |
| 2521 __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled)); | 2539 __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled)); |
| 2522 __ add(SP, SP, Operand(10 * kWordSize)); | 2540 __ add(SP, SP, Operand(10 * kWordSize)); |
| 2523 __ RestoreCSP(); | 2541 TearDownStackFrame(assembler); |
| 2524 __ ret(); | 2542 __ ret(); |
| 2525 } | 2543 } |
| 2526 | 2544 |
| 2527 | 2545 |
| 2528 ASSEMBLER_TEST_RUN(FldrdFstrdScaledReg, test) { | 2546 ASSEMBLER_TEST_RUN(FldrdFstrdScaledReg, test) { |
| 2529 typedef double (*DoubleReturn)() DART_UNUSED; | 2547 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2530 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2548 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2531 } | 2549 } |
| 2532 | 2550 |
| 2533 | 2551 |
| (...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2968 } | 2986 } |
| 2969 | 2987 |
| 2970 | 2988 |
| 2971 ASSEMBLER_TEST_RUN(Vdivd, test) { | 2989 ASSEMBLER_TEST_RUN(Vdivd, test) { |
| 2972 typedef double (*DoubleReturn)() DART_UNUSED; | 2990 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2973 EXPECT_EQ(2.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2991 EXPECT_EQ(2.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2974 } | 2992 } |
| 2975 | 2993 |
| 2976 | 2994 |
| 2977 ASSEMBLER_TEST_GENERATE(Vdupd, assembler) { | 2995 ASSEMBLER_TEST_GENERATE(Vdupd, assembler) { |
| 2978 __ SetupDartSP(); | 2996 SetUpStackFrame(assembler); |
| 2979 __ LoadDImmediate(V0, 21.0); | 2997 __ LoadDImmediate(V0, 21.0); |
| 2980 __ vdupd(V1, V0, 0); | 2998 __ vdupd(V1, V0, 0); |
| 2981 | 2999 |
| 2982 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); | 3000 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); |
| 2983 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 3001 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 2984 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 3002 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 2985 | 3003 |
| 2986 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 3004 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 2987 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 3005 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 2988 | 3006 |
| 2989 __ faddd(V0, V2, V3); | 3007 __ faddd(V0, V2, V3); |
| 2990 __ RestoreCSP(); | 3008 TearDownStackFrame(assembler); |
| 2991 __ ret(); | 3009 __ ret(); |
| 2992 } | 3010 } |
| 2993 | 3011 |
| 2994 | 3012 |
| 2995 ASSEMBLER_TEST_RUN(Vdupd, test) { | 3013 ASSEMBLER_TEST_RUN(Vdupd, test) { |
| 2996 typedef double (*DoubleReturn)() DART_UNUSED; | 3014 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2997 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 3015 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2998 } | 3016 } |
| 2999 | 3017 |
| 3000 | 3018 |
| 3001 ASSEMBLER_TEST_GENERATE(Vdups, assembler) { | 3019 ASSEMBLER_TEST_GENERATE(Vdups, assembler) { |
| 3002 __ SetupDartSP(); | 3020 SetUpStackFrame(assembler); |
| 3003 __ LoadDImmediate(V0, 21.0); | 3021 __ LoadDImmediate(V0, 21.0); |
| 3004 __ fcvtsd(V0, V0); | 3022 __ fcvtsd(V0, V0); |
| 3005 __ vdups(V1, V0, 0); | 3023 __ vdups(V1, V0, 0); |
| 3006 | 3024 |
| 3007 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); | 3025 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); |
| 3008 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 3026 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 3009 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 3027 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 3010 | 3028 |
| 3011 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 3029 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 3012 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 3030 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 3013 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 3031 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 3014 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 3032 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 3015 | 3033 |
| 3016 __ fcvtds(V0, V0); | 3034 __ fcvtds(V0, V0); |
| 3017 __ fcvtds(V1, V1); | 3035 __ fcvtds(V1, V1); |
| 3018 __ fcvtds(V2, V2); | 3036 __ fcvtds(V2, V2); |
| 3019 __ fcvtds(V3, V3); | 3037 __ fcvtds(V3, V3); |
| 3020 | 3038 |
| 3021 __ faddd(V0, V1, V1); | 3039 __ faddd(V0, V1, V1); |
| 3022 __ faddd(V0, V0, V2); | 3040 __ faddd(V0, V0, V2); |
| 3023 __ faddd(V0, V0, V3); | 3041 __ faddd(V0, V0, V3); |
| 3024 __ RestoreCSP(); | 3042 TearDownStackFrame(assembler); |
| 3025 __ ret(); | 3043 __ ret(); |
| 3026 } | 3044 } |
| 3027 | 3045 |
| 3028 | 3046 |
| 3029 ASSEMBLER_TEST_RUN(Vdups, test) { | 3047 ASSEMBLER_TEST_RUN(Vdups, test) { |
| 3030 typedef double (*DoubleReturn)() DART_UNUSED; | 3048 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3031 EXPECT_EQ(84.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 3049 EXPECT_EQ(84.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 3032 } | 3050 } |
| 3033 | 3051 |
| 3034 | 3052 |
| 3035 ASSEMBLER_TEST_GENERATE(Vinsd, assembler) { | 3053 ASSEMBLER_TEST_GENERATE(Vinsd, assembler) { |
| 3036 __ SetupDartSP(); | 3054 SetUpStackFrame(assembler); |
| 3037 __ LoadDImmediate(V5, 42.0); | 3055 __ LoadDImmediate(V5, 42.0); |
| 3038 __ vinsd(V1, 1, V5, 0); // V1[1] <- V0[0]. | 3056 __ vinsd(V1, 1, V5, 0); // V1[1] <- V0[0]. |
| 3039 | 3057 |
| 3040 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); | 3058 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); |
| 3041 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 3059 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 3042 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 3060 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 3043 | 3061 |
| 3044 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 3062 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 3045 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 3063 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 3046 | 3064 |
| 3047 __ fmovdd(V0, V3); | 3065 __ fmovdd(V0, V3); |
| 3048 __ RestoreCSP(); | 3066 TearDownStackFrame(assembler); |
| 3049 __ ret(); | 3067 __ ret(); |
| 3050 } | 3068 } |
| 3051 | 3069 |
| 3052 | 3070 |
| 3053 ASSEMBLER_TEST_RUN(Vinsd, test) { | 3071 ASSEMBLER_TEST_RUN(Vinsd, test) { |
| 3054 typedef double (*DoubleReturn)() DART_UNUSED; | 3072 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3055 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 3073 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 3056 } | 3074 } |
| 3057 | 3075 |
| 3058 | 3076 |
| 3059 ASSEMBLER_TEST_GENERATE(Vinss, assembler) { | 3077 ASSEMBLER_TEST_GENERATE(Vinss, assembler) { |
| 3060 __ SetupDartSP(); | 3078 SetUpStackFrame(assembler); |
| 3061 __ LoadDImmediate(V0, 21.0); | 3079 __ LoadDImmediate(V0, 21.0); |
| 3062 __ fcvtsd(V0, V0); | 3080 __ fcvtsd(V0, V0); |
| 3063 __ vinss(V1, 3, V0, 0); | 3081 __ vinss(V1, 3, V0, 0); |
| 3064 __ vinss(V1, 1, V0, 0); | 3082 __ vinss(V1, 1, V0, 0); |
| 3065 | 3083 |
| 3066 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); | 3084 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); |
| 3067 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 3085 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 3068 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 3086 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 3069 | 3087 |
| 3070 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 3088 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 3071 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 3089 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 3072 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 3090 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 3073 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 3091 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 3074 | 3092 |
| 3075 __ fcvtds(V0, V0); | 3093 __ fcvtds(V0, V0); |
| 3076 __ fcvtds(V1, V1); | 3094 __ fcvtds(V1, V1); |
| 3077 __ fcvtds(V2, V2); | 3095 __ fcvtds(V2, V2); |
| 3078 __ fcvtds(V3, V3); | 3096 __ fcvtds(V3, V3); |
| 3079 | 3097 |
| 3080 __ faddd(V0, V0, V1); | 3098 __ faddd(V0, V0, V1); |
| 3081 __ faddd(V0, V0, V2); | 3099 __ faddd(V0, V0, V2); |
| 3082 __ faddd(V0, V0, V3); | 3100 __ faddd(V0, V0, V3); |
| 3083 __ RestoreCSP(); | 3101 TearDownStackFrame(assembler); |
| 3084 __ ret(); | 3102 __ ret(); |
| 3085 } | 3103 } |
| 3086 | 3104 |
| 3087 | 3105 |
| 3088 ASSEMBLER_TEST_RUN(Vinss, test) { | 3106 ASSEMBLER_TEST_RUN(Vinss, test) { |
| 3089 typedef double (*DoubleReturn)() DART_UNUSED; | 3107 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3090 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 3108 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 3091 } | 3109 } |
| 3092 | 3110 |
| 3093 | 3111 |
| (...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3869 EXPECT_FLOAT_EQ(1.0 / sqrt(147000.0), res, 0.0001); | 3887 EXPECT_FLOAT_EQ(1.0 / sqrt(147000.0), res, 0.0001); |
| 3870 } | 3888 } |
| 3871 | 3889 |
| 3872 | 3890 |
| 3873 // Called from assembler_test.cc. | 3891 // Called from assembler_test.cc. |
| 3874 // LR: return address. | 3892 // LR: return address. |
| 3875 // R0: value. | 3893 // R0: value. |
| 3876 // R1: growable array. | 3894 // R1: growable array. |
| 3877 // R2: current thread. | 3895 // R2: current thread. |
| 3878 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { | 3896 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { |
| 3879 __ SetupDartSP(); | 3897 SetUpStackFrame(assembler); |
| 3880 __ Push(CODE_REG); | 3898 __ Push(CODE_REG); |
| 3881 __ Push(THR); | 3899 __ Push(THR); |
| 3882 __ Push(LR); | 3900 __ Push(LR); |
| 3883 __ mov(THR, R2); | 3901 __ mov(THR, R2); |
| 3884 __ StoreIntoObject(R1, FieldAddress(R1, GrowableObjectArray::data_offset()), | 3902 __ StoreIntoObject(R1, FieldAddress(R1, GrowableObjectArray::data_offset()), |
| 3885 R0); | 3903 R0); |
| 3886 __ Pop(LR); | 3904 __ Pop(LR); |
| 3887 __ Pop(THR); | 3905 __ Pop(THR); |
| 3888 __ Pop(CODE_REG); | 3906 __ Pop(CODE_REG); |
| 3889 __ RestoreCSP(); | 3907 TearDownStackFrame(assembler); |
| 3890 __ ret(); | 3908 __ ret(); |
| 3891 } | 3909 } |
| 3892 | 3910 |
| 3893 } // namespace dart | 3911 } // namespace dart |
| 3894 | 3912 |
| 3895 #endif // defined(TARGET_ARCH_ARM64) | 3913 #endif // defined(TARGET_ARCH_ARM64) |
| OLD | NEW |