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