Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(296)

Side by Side Diff: runtime/vm/assembler_arm64_test.cc

Issue 2953803002: VM: Fix ARM64 assembler tests that assumed there was a stack red zone (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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)
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698