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

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

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