| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 #ifndef VM_ASSEMBLER_ARM64_H_ | 5 #ifndef VM_ASSEMBLER_ARM64_H_ |
| 6 #define VM_ASSEMBLER_ARM64_H_ | 6 #define VM_ASSEMBLER_ARM64_H_ |
| 7 | 7 |
| 8 #ifndef VM_ASSEMBLER_H_ | 8 #ifndef VM_ASSEMBLER_H_ |
| 9 #error Do not include assembler_arm64.h directly; use assembler.h instead. | 9 #error Do not include assembler_arm64.h directly; use assembler.h instead. |
| 10 #endif | 10 #endif |
| (...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 void eon(Register rd, Register rn, Operand o) { | 406 void eon(Register rd, Register rn, Operand o) { |
| 407 EmitLogicalShiftOp(EON, rd, rn, o, kDoubleWord); | 407 EmitLogicalShiftOp(EON, rd, rn, o, kDoubleWord); |
| 408 } | 408 } |
| 409 void ands(Register rd, Register rn, Operand o) { | 409 void ands(Register rd, Register rn, Operand o) { |
| 410 EmitLogicalShiftOp(ANDS, rd, rn, o, kDoubleWord); | 410 EmitLogicalShiftOp(ANDS, rd, rn, o, kDoubleWord); |
| 411 } | 411 } |
| 412 void bics(Register rd, Register rn, Operand o) { | 412 void bics(Register rd, Register rn, Operand o) { |
| 413 EmitLogicalShiftOp(BICS, rd, rn, o, kDoubleWord); | 413 EmitLogicalShiftOp(BICS, rd, rn, o, kDoubleWord); |
| 414 } | 414 } |
| 415 | 415 |
| 416 // Misc. arithmetic. |
| 417 void udiv(Register rd, Register rn, Register rm) { |
| 418 EmitMiscDP2Source(UDIV, rd, rn, rm, kDoubleWord); |
| 419 } |
| 420 void sdiv(Register rd, Register rn, Register rm) { |
| 421 EmitMiscDP2Source(SDIV, rd, rn, rm, kDoubleWord); |
| 422 } |
| 423 void lslv(Register rd, Register rn, Register rm) { |
| 424 EmitMiscDP2Source(LSLV, rd, rn, rm, kDoubleWord); |
| 425 } |
| 426 void lsrv(Register rd, Register rn, Register rm) { |
| 427 EmitMiscDP2Source(LSRV, rd, rn, rm, kDoubleWord); |
| 428 } |
| 429 void asrv(Register rd, Register rn, Register rm) { |
| 430 EmitMiscDP2Source(ASRV, rd, rn, rm, kDoubleWord); |
| 431 } |
| 432 void madd(Register rd, Register rn, Register rm, Register ra) { |
| 433 EmitMiscDP3Source(MADD, rd, rn, rm, ra, kDoubleWord); |
| 434 } |
| 435 |
| 416 // Move wide immediate. | 436 // Move wide immediate. |
| 417 void movk(Register rd, int32_t imm, int32_t hw_idx) { | 437 void movk(Register rd, int32_t imm, int32_t hw_idx) { |
| 418 ASSERT(rd != SP); | 438 ASSERT(rd != SP); |
| 419 const Register crd = ConcreteRegister(rd); | 439 const Register crd = ConcreteRegister(rd); |
| 420 EmitMoveWideOp(MOVK, crd, imm, hw_idx, kDoubleWord); | 440 EmitMoveWideOp(MOVK, crd, imm, hw_idx, kDoubleWord); |
| 421 } | 441 } |
| 422 void movn(Register rd, int32_t imm, int32_t hw_idx) { | 442 void movn(Register rd, int32_t imm, int32_t hw_idx) { |
| 423 ASSERT(rd != SP); | 443 ASSERT(rd != SP); |
| 424 const Register crd = ConcreteRegister(rd); | 444 const Register crd = ConcreteRegister(rd); |
| 425 EmitMoveWideOp(MOVN, crd, imm, hw_idx, kDoubleWord); | 445 EmitMoveWideOp(MOVN, crd, imm, hw_idx, kDoubleWord); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 466 void br(Register rn) { | 486 void br(Register rn) { |
| 467 EmitUnconditionalBranchRegOp(BR, rn); | 487 EmitUnconditionalBranchRegOp(BR, rn); |
| 468 } | 488 } |
| 469 void blr(Register rn) { | 489 void blr(Register rn) { |
| 470 EmitUnconditionalBranchRegOp(BLR, rn); | 490 EmitUnconditionalBranchRegOp(BLR, rn); |
| 471 } | 491 } |
| 472 void ret(Register rn = R30) { | 492 void ret(Register rn = R30) { |
| 473 EmitUnconditionalBranchRegOp(RET, rn); | 493 EmitUnconditionalBranchRegOp(RET, rn); |
| 474 } | 494 } |
| 475 | 495 |
| 496 // Aliases. |
| 497 void mov(Register rd, Register rn) { |
| 498 if ((rd == SP) || (rn == SP)) { |
| 499 add(rd, rn, Operand(0)); |
| 500 } else { |
| 501 orr(rd, ZR, Operand(rn)); |
| 502 } |
| 503 } |
| 504 void mvn(Register rd, Register rm) { |
| 505 orr(rd, ZR, Operand(rm)); |
| 506 } |
| 507 void neg(Register rd, Register rm) { |
| 508 sub(rd, ZR, Operand(rm)); |
| 509 } |
| 510 void negs(Register rd, Register rm) { |
| 511 subs(rd, ZR, Operand(rm)); |
| 512 } |
| 513 void mul(Register rd, Register rn, Register rm) { |
| 514 madd(rd, rn, rm, ZR); |
| 515 } |
| 516 |
| 476 private: | 517 private: |
| 477 AssemblerBuffer buffer_; // Contains position independent code. | 518 AssemblerBuffer buffer_; // Contains position independent code. |
| 478 GrowableObjectArray& object_pool_; // Objects and patchable jump targets. | 519 GrowableObjectArray& object_pool_; // Objects and patchable jump targets. |
| 479 int32_t prologue_offset_; | 520 int32_t prologue_offset_; |
| 480 | 521 |
| 481 bool use_far_branches_; | 522 bool use_far_branches_; |
| 482 | 523 |
| 483 class CodeComment : public ZoneAllocated { | 524 class CodeComment : public ZoneAllocated { |
| 484 public: | 525 public: |
| 485 CodeComment(intptr_t pc_offset, const String& comment) | 526 CodeComment(intptr_t pc_offset, const String& comment) |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 668 ASSERT((rd != R31) && (rd != SP)); | 709 ASSERT((rd != R31) && (rd != SP)); |
| 669 const Register crd = ConcreteRegister(rd); | 710 const Register crd = ConcreteRegister(rd); |
| 670 const int32_t loimm = (imm & 0x3) << 29; | 711 const int32_t loimm = (imm & 0x3) << 29; |
| 671 const int32_t hiimm = ((imm >> 2) & kImm19Mask) << kImm19Shift; | 712 const int32_t hiimm = ((imm >> 2) & kImm19Mask) << kImm19Shift; |
| 672 const int32_t encoding = | 713 const int32_t encoding = |
| 673 op | loimm | hiimm | | 714 op | loimm | hiimm | |
| 674 (static_cast<int32_t>(crd) << kRdShift); | 715 (static_cast<int32_t>(crd) << kRdShift); |
| 675 Emit(encoding); | 716 Emit(encoding); |
| 676 } | 717 } |
| 677 | 718 |
| 719 void EmitMiscDP2Source(MiscDP2SourceOp op, |
| 720 Register rd, Register rn, Register rm, |
| 721 OperandSize sz) { |
| 722 ASSERT((rd != SP) && (rn != SP) && (rm != SP)); |
| 723 const Register crd = ConcreteRegister(rd); |
| 724 const Register crn = ConcreteRegister(rn); |
| 725 const Register crm = ConcreteRegister(rm); |
| 726 const int32_t size = (sz == kDoubleWord) ? B31 : 0; |
| 727 const int32_t encoding = |
| 728 op | size | |
| 729 (static_cast<int32_t>(crd) << kRdShift) | |
| 730 (static_cast<int32_t>(crn) << kRnShift) | |
| 731 (static_cast<int32_t>(crm) << kRmShift); |
| 732 Emit(encoding); |
| 733 } |
| 734 |
| 735 void EmitMiscDP3Source(MiscDP3SourceOp op, |
| 736 Register rd, Register rn, Register rm, Register ra, |
| 737 OperandSize sz) { |
| 738 ASSERT((rd != SP) && (rn != SP) && (rm != SP) && (ra != SP)); |
| 739 const Register crd = ConcreteRegister(rd); |
| 740 const Register crn = ConcreteRegister(rn); |
| 741 const Register crm = ConcreteRegister(rm); |
| 742 const Register cra = ConcreteRegister(ra); |
| 743 const int32_t size = (sz == kDoubleWord) ? B31 : 0; |
| 744 const int32_t encoding = |
| 745 op | size | |
| 746 (static_cast<int32_t>(crd) << kRdShift) | |
| 747 (static_cast<int32_t>(crn) << kRnShift) | |
| 748 (static_cast<int32_t>(crm) << kRmShift) | |
| 749 (static_cast<int32_t>(cra) << kRaShift); |
| 750 Emit(encoding); |
| 751 } |
| 752 |
| 678 DISALLOW_ALLOCATION(); | 753 DISALLOW_ALLOCATION(); |
| 679 DISALLOW_COPY_AND_ASSIGN(Assembler); | 754 DISALLOW_COPY_AND_ASSIGN(Assembler); |
| 680 }; | 755 }; |
| 681 | 756 |
| 682 } // namespace dart | 757 } // namespace dart |
| 683 | 758 |
| 684 #endif // VM_ASSEMBLER_ARM64_H_ | 759 #endif // VM_ASSEMBLER_ARM64_H_ |
| OLD | NEW |