| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/code-generator.h" | 5 #include "src/compiler/code-generator.h" |
| 6 | 6 |
| 7 #include "src/arm64/frames-arm64.h" | 7 #include "src/arm64/frames-arm64.h" |
| 8 #include "src/arm64/macro-assembler-arm64.h" | 8 #include "src/arm64/macro-assembler-arm64.h" |
| 9 #include "src/compiler/code-generator-impl.h" | 9 #include "src/compiler/code-generator-impl.h" |
| 10 #include "src/compiler/gap-resolver.h" | 10 #include "src/compiler/gap-resolver.h" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 } | 34 } |
| 35 | 35 |
| 36 DoubleRegister OutputFloat32Register() { return OutputDoubleRegister().S(); } | 36 DoubleRegister OutputFloat32Register() { return OutputDoubleRegister().S(); } |
| 37 | 37 |
| 38 DoubleRegister OutputFloat64Register() { return OutputDoubleRegister(); } | 38 DoubleRegister OutputFloat64Register() { return OutputDoubleRegister(); } |
| 39 | 39 |
| 40 Register InputRegister32(size_t index) { | 40 Register InputRegister32(size_t index) { |
| 41 return ToRegister(instr_->InputAt(index)).W(); | 41 return ToRegister(instr_->InputAt(index)).W(); |
| 42 } | 42 } |
| 43 | 43 |
| 44 Register InputOrZeroRegister32(size_t index) { |
| 45 DCHECK(instr_->InputAt(index)->IsRegister() || |
| 46 (instr_->InputAt(index)->IsImmediate() && (InputInt32(index) == 0))); |
| 47 if (instr_->InputAt(index)->IsImmediate()) { |
| 48 return wzr; |
| 49 } |
| 50 return InputRegister32(index); |
| 51 } |
| 52 |
| 44 Register InputRegister64(size_t index) { return InputRegister(index); } | 53 Register InputRegister64(size_t index) { return InputRegister(index); } |
| 45 | 54 |
| 55 Register InputOrZeroRegister64(size_t index) { |
| 56 DCHECK(instr_->InputAt(index)->IsRegister() || |
| 57 (instr_->InputAt(index)->IsImmediate() && (InputInt64(index) == 0))); |
| 58 if (instr_->InputAt(index)->IsImmediate()) { |
| 59 return xzr; |
| 60 } |
| 61 return InputRegister64(index); |
| 62 } |
| 63 |
| 46 Operand InputImmediate(size_t index) { | 64 Operand InputImmediate(size_t index) { |
| 47 return ToImmediate(instr_->InputAt(index)); | 65 return ToImmediate(instr_->InputAt(index)); |
| 48 } | 66 } |
| 49 | 67 |
| 50 Operand InputOperand(size_t index) { | 68 Operand InputOperand(size_t index) { |
| 51 return ToOperand(instr_->InputAt(index)); | 69 return ToOperand(instr_->InputAt(index)); |
| 52 } | 70 } |
| 53 | 71 |
| 54 Operand InputOperand64(size_t index) { return InputOperand(index); } | 72 Operand InputOperand64(size_t index) { return InputOperand(index); } |
| 55 | 73 |
| (...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 512 case kArm64Float64RoundTiesAway: | 530 case kArm64Float64RoundTiesAway: |
| 513 __ Frinta(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 531 __ Frinta(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
| 514 break; | 532 break; |
| 515 case kArm64Float64RoundTruncate: | 533 case kArm64Float64RoundTruncate: |
| 516 __ Frintz(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 534 __ Frintz(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
| 517 break; | 535 break; |
| 518 case kArm64Float64RoundUp: | 536 case kArm64Float64RoundUp: |
| 519 __ Frintp(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 537 __ Frintp(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
| 520 break; | 538 break; |
| 521 case kArm64Add: | 539 case kArm64Add: |
| 522 __ Add(i.OutputRegister(), i.InputRegister(0), i.InputOperand2_64(1)); | 540 __ Add(i.OutputRegister(), i.InputOrZeroRegister64(0), |
| 541 i.InputOperand2_64(1)); |
| 523 break; | 542 break; |
| 524 case kArm64Add32: | 543 case kArm64Add32: |
| 525 if (FlagsModeField::decode(opcode) != kFlags_none) { | 544 if (FlagsModeField::decode(opcode) != kFlags_none) { |
| 526 __ Adds(i.OutputRegister32(), i.InputRegister32(0), | 545 __ Adds(i.OutputRegister32(), i.InputOrZeroRegister32(0), |
| 527 i.InputOperand2_32(1)); | 546 i.InputOperand2_32(1)); |
| 528 } else { | 547 } else { |
| 529 __ Add(i.OutputRegister32(), i.InputRegister32(0), | 548 __ Add(i.OutputRegister32(), i.InputOrZeroRegister32(0), |
| 530 i.InputOperand2_32(1)); | 549 i.InputOperand2_32(1)); |
| 531 } | 550 } |
| 532 break; | 551 break; |
| 533 case kArm64And: | 552 case kArm64And: |
| 534 __ And(i.OutputRegister(), i.InputRegister(0), i.InputOperand2_64(1)); | 553 __ And(i.OutputRegister(), i.InputOrZeroRegister64(0), |
| 554 i.InputOperand2_64(1)); |
| 535 break; | 555 break; |
| 536 case kArm64And32: | 556 case kArm64And32: |
| 537 __ And(i.OutputRegister32(), i.InputRegister32(0), i.InputOperand2_32(1)); | 557 __ And(i.OutputRegister32(), i.InputOrZeroRegister32(0), |
| 558 i.InputOperand2_32(1)); |
| 538 break; | 559 break; |
| 539 case kArm64Bic: | 560 case kArm64Bic: |
| 540 __ Bic(i.OutputRegister(), i.InputRegister(0), i.InputOperand2_64(1)); | 561 __ Bic(i.OutputRegister(), i.InputOrZeroRegister64(0), |
| 562 i.InputOperand2_64(1)); |
| 541 break; | 563 break; |
| 542 case kArm64Bic32: | 564 case kArm64Bic32: |
| 543 __ Bic(i.OutputRegister32(), i.InputRegister32(0), i.InputOperand2_32(1)); | 565 __ Bic(i.OutputRegister32(), i.InputOrZeroRegister32(0), |
| 566 i.InputOperand2_32(1)); |
| 544 break; | 567 break; |
| 545 case kArm64Mul: | 568 case kArm64Mul: |
| 546 __ Mul(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1)); | 569 __ Mul(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1)); |
| 547 break; | 570 break; |
| 548 case kArm64Mul32: | 571 case kArm64Mul32: |
| 549 __ Mul(i.OutputRegister32(), i.InputRegister32(0), i.InputRegister32(1)); | 572 __ Mul(i.OutputRegister32(), i.InputRegister32(0), i.InputRegister32(1)); |
| 550 break; | 573 break; |
| 551 case kArm64Smull: | 574 case kArm64Smull: |
| 552 __ Smull(i.OutputRegister(), i.InputRegister32(0), i.InputRegister32(1)); | 575 __ Smull(i.OutputRegister(), i.InputRegister32(0), i.InputRegister32(1)); |
| 553 break; | 576 break; |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 617 __ Msub(i.OutputRegister32(), temp, i.InputRegister32(1), | 640 __ Msub(i.OutputRegister32(), temp, i.InputRegister32(1), |
| 618 i.InputRegister32(0)); | 641 i.InputRegister32(0)); |
| 619 break; | 642 break; |
| 620 } | 643 } |
| 621 case kArm64Not: | 644 case kArm64Not: |
| 622 __ Mvn(i.OutputRegister(), i.InputOperand(0)); | 645 __ Mvn(i.OutputRegister(), i.InputOperand(0)); |
| 623 break; | 646 break; |
| 624 case kArm64Not32: | 647 case kArm64Not32: |
| 625 __ Mvn(i.OutputRegister32(), i.InputOperand32(0)); | 648 __ Mvn(i.OutputRegister32(), i.InputOperand32(0)); |
| 626 break; | 649 break; |
| 627 case kArm64Neg: | |
| 628 __ Neg(i.OutputRegister(), i.InputOperand(0)); | |
| 629 break; | |
| 630 case kArm64Neg32: | |
| 631 __ Neg(i.OutputRegister32(), i.InputOperand32(0)); | |
| 632 break; | |
| 633 case kArm64Or: | 650 case kArm64Or: |
| 634 __ Orr(i.OutputRegister(), i.InputRegister(0), i.InputOperand2_64(1)); | 651 __ Orr(i.OutputRegister(), i.InputOrZeroRegister64(0), |
| 652 i.InputOperand2_64(1)); |
| 635 break; | 653 break; |
| 636 case kArm64Or32: | 654 case kArm64Or32: |
| 637 __ Orr(i.OutputRegister32(), i.InputRegister32(0), i.InputOperand2_32(1)); | 655 __ Orr(i.OutputRegister32(), i.InputOrZeroRegister32(0), |
| 656 i.InputOperand2_32(1)); |
| 638 break; | 657 break; |
| 639 case kArm64Orn: | 658 case kArm64Orn: |
| 640 __ Orn(i.OutputRegister(), i.InputRegister(0), i.InputOperand2_64(1)); | 659 __ Orn(i.OutputRegister(), i.InputOrZeroRegister64(0), |
| 660 i.InputOperand2_64(1)); |
| 641 break; | 661 break; |
| 642 case kArm64Orn32: | 662 case kArm64Orn32: |
| 643 __ Orn(i.OutputRegister32(), i.InputRegister32(0), i.InputOperand2_32(1)); | 663 __ Orn(i.OutputRegister32(), i.InputOrZeroRegister32(0), |
| 664 i.InputOperand2_32(1)); |
| 644 break; | 665 break; |
| 645 case kArm64Eor: | 666 case kArm64Eor: |
| 646 __ Eor(i.OutputRegister(), i.InputRegister(0), i.InputOperand2_64(1)); | 667 __ Eor(i.OutputRegister(), i.InputOrZeroRegister64(0), |
| 668 i.InputOperand2_64(1)); |
| 647 break; | 669 break; |
| 648 case kArm64Eor32: | 670 case kArm64Eor32: |
| 649 __ Eor(i.OutputRegister32(), i.InputRegister32(0), i.InputOperand2_32(1)); | 671 __ Eor(i.OutputRegister32(), i.InputOrZeroRegister32(0), |
| 672 i.InputOperand2_32(1)); |
| 650 break; | 673 break; |
| 651 case kArm64Eon: | 674 case kArm64Eon: |
| 652 __ Eon(i.OutputRegister(), i.InputRegister(0), i.InputOperand2_64(1)); | 675 __ Eon(i.OutputRegister(), i.InputOrZeroRegister64(0), |
| 676 i.InputOperand2_64(1)); |
| 653 break; | 677 break; |
| 654 case kArm64Eon32: | 678 case kArm64Eon32: |
| 655 __ Eon(i.OutputRegister32(), i.InputRegister32(0), i.InputOperand2_32(1)); | 679 __ Eon(i.OutputRegister32(), i.InputOrZeroRegister32(0), |
| 680 i.InputOperand2_32(1)); |
| 656 break; | 681 break; |
| 657 case kArm64Sub: | 682 case kArm64Sub: |
| 658 __ Sub(i.OutputRegister(), i.InputRegister(0), i.InputOperand2_64(1)); | 683 __ Sub(i.OutputRegister(), i.InputOrZeroRegister64(0), |
| 684 i.InputOperand2_64(1)); |
| 659 break; | 685 break; |
| 660 case kArm64Sub32: | 686 case kArm64Sub32: |
| 661 if (FlagsModeField::decode(opcode) != kFlags_none) { | 687 if (FlagsModeField::decode(opcode) != kFlags_none) { |
| 662 __ Subs(i.OutputRegister32(), i.InputRegister32(0), | 688 __ Subs(i.OutputRegister32(), i.InputOrZeroRegister32(0), |
| 663 i.InputOperand2_32(1)); | 689 i.InputOperand2_32(1)); |
| 664 } else { | 690 } else { |
| 665 __ Sub(i.OutputRegister32(), i.InputRegister32(0), | 691 __ Sub(i.OutputRegister32(), i.InputOrZeroRegister32(0), |
| 666 i.InputOperand2_32(1)); | 692 i.InputOperand2_32(1)); |
| 667 } | 693 } |
| 668 break; | 694 break; |
| 669 case kArm64Lsl: | 695 case kArm64Lsl: |
| 670 ASSEMBLE_SHIFT(Lsl, 64); | 696 ASSEMBLE_SHIFT(Lsl, 64); |
| 671 break; | 697 break; |
| 672 case kArm64Lsl32: | 698 case kArm64Lsl32: |
| 673 ASSEMBLE_SHIFT(Lsl, 32); | 699 ASSEMBLE_SHIFT(Lsl, 32); |
| 674 break; | 700 break; |
| 675 case kArm64Lsr: | 701 case kArm64Lsr: |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 740 } | 766 } |
| 741 case kArm64PokePair: { | 767 case kArm64PokePair: { |
| 742 int slot = i.InputInt32(2) - 1; | 768 int slot = i.InputInt32(2) - 1; |
| 743 __ PokePair(i.InputRegister(1), i.InputRegister(0), slot * kPointerSize); | 769 __ PokePair(i.InputRegister(1), i.InputRegister(0), slot * kPointerSize); |
| 744 break; | 770 break; |
| 745 } | 771 } |
| 746 case kArm64Clz32: | 772 case kArm64Clz32: |
| 747 __ Clz(i.OutputRegister32(), i.InputRegister32(0)); | 773 __ Clz(i.OutputRegister32(), i.InputRegister32(0)); |
| 748 break; | 774 break; |
| 749 case kArm64Cmp: | 775 case kArm64Cmp: |
| 750 __ Cmp(i.InputRegister(0), i.InputOperand(1)); | 776 __ Cmp(i.InputOrZeroRegister64(0), i.InputOperand(1)); |
| 751 break; | 777 break; |
| 752 case kArm64Cmp32: | 778 case kArm64Cmp32: |
| 753 __ Cmp(i.InputRegister32(0), i.InputOperand2_32(1)); | 779 __ Cmp(i.InputOrZeroRegister32(0), i.InputOperand2_32(1)); |
| 754 break; | 780 break; |
| 755 case kArm64Cmn: | 781 case kArm64Cmn: |
| 756 __ Cmn(i.InputRegister(0), i.InputOperand(1)); | 782 __ Cmn(i.InputRegister(0), i.InputOperand(1)); |
| 757 break; | 783 break; |
| 758 case kArm64Cmn32: | 784 case kArm64Cmn32: |
| 759 __ Cmn(i.InputRegister32(0), i.InputOperand32(1)); | 785 __ Cmn(i.InputRegister32(0), i.InputOperand32(1)); |
| 760 break; | 786 break; |
| 761 case kArm64Tst: | 787 case kArm64Tst: |
| 762 __ Tst(i.InputRegister(0), i.InputOperand(1)); | 788 __ Tst(i.InputRegister(0), i.InputOperand(1)); |
| 763 break; | 789 break; |
| (...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1418 padding_size -= kInstructionSize; | 1444 padding_size -= kInstructionSize; |
| 1419 } | 1445 } |
| 1420 } | 1446 } |
| 1421 } | 1447 } |
| 1422 | 1448 |
| 1423 #undef __ | 1449 #undef __ |
| 1424 | 1450 |
| 1425 } // namespace compiler | 1451 } // namespace compiler |
| 1426 } // namespace internal | 1452 } // namespace internal |
| 1427 } // namespace v8 | 1453 } // namespace v8 |
| OLD | NEW |