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

Side by Side Diff: src/mips64/macro-assembler-mips64.cc

Issue 1830133002: MIPS64: Replace JR/JALR with JIC/JIALC for r6. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 8 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 | « src/mips64/macro-assembler-mips64.h ('k') | 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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 <limits.h> // For LONG_MIN, LONG_MAX. 5 #include <limits.h> // For LONG_MIN, LONG_MAX.
6 6
7 #if V8_TARGET_ARCH_MIPS64 7 #if V8_TARGET_ARCH_MIPS64
8 8
9 #include "src/base/division-by-constant.h" 9 #include "src/base/division-by-constant.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 3502 matching lines...) Expand 10 before | Expand all | Expand 10 after
3513 return false; 3513 return false;
3514 } 3514 }
3515 3515
3516 3516
3517 void MacroAssembler::Jump(Register target, 3517 void MacroAssembler::Jump(Register target,
3518 Condition cond, 3518 Condition cond,
3519 Register rs, 3519 Register rs,
3520 const Operand& rt, 3520 const Operand& rt,
3521 BranchDelaySlot bd) { 3521 BranchDelaySlot bd) {
3522 BlockTrampolinePoolScope block_trampoline_pool(this); 3522 BlockTrampolinePoolScope block_trampoline_pool(this);
3523 if (cond == cc_always) { 3523 if (kArchVariant == kMips64r6 && bd == PROTECT) {
3524 jr(target); 3524 if (cond == cc_always) {
3525 jic(target, 0);
3526 } else {
3527 BRANCH_ARGS_CHECK(cond, rs, rt);
3528 Branch(2, NegateCondition(cond), rs, rt);
3529 jic(target, 0);
3530 }
3525 } else { 3531 } else {
3526 BRANCH_ARGS_CHECK(cond, rs, rt); 3532 if (cond == cc_always) {
3527 Branch(2, NegateCondition(cond), rs, rt); 3533 jr(target);
3528 jr(target); 3534 } else {
3535 BRANCH_ARGS_CHECK(cond, rs, rt);
3536 Branch(2, NegateCondition(cond), rs, rt);
3537 jr(target);
3538 }
3539 // Emit a nop in the branch delay slot if required.
3540 if (bd == PROTECT) nop();
3529 } 3541 }
3530 // Emit a nop in the branch delay slot if required.
3531 if (bd == PROTECT)
3532 nop();
3533 } 3542 }
3534 3543
3535 3544
3536 void MacroAssembler::Jump(intptr_t target, 3545 void MacroAssembler::Jump(intptr_t target,
3537 RelocInfo::Mode rmode, 3546 RelocInfo::Mode rmode,
3538 Condition cond, 3547 Condition cond,
3539 Register rs, 3548 Register rs,
3540 const Operand& rt, 3549 const Operand& rt,
3541 BranchDelaySlot bd) { 3550 BranchDelaySlot bd) {
3542 Label skip; 3551 Label skip;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
3580 const Operand& rt, 3589 const Operand& rt,
3581 BranchDelaySlot bd) { 3590 BranchDelaySlot bd) {
3582 int size = 0; 3591 int size = 0;
3583 3592
3584 if (cond == cc_always) { 3593 if (cond == cc_always) {
3585 size += 1; 3594 size += 1;
3586 } else { 3595 } else {
3587 size += 3; 3596 size += 3;
3588 } 3597 }
3589 3598
3590 if (bd == PROTECT) 3599 if (bd == PROTECT && kArchVariant != kMips64r6) size += 1;
3591 size += 1;
3592 3600
3593 return size * kInstrSize; 3601 return size * kInstrSize;
3594 } 3602 }
3595 3603
3596 3604
3597 // Note: To call gcc-compiled C code on mips, you must call thru t9. 3605 // Note: To call gcc-compiled C code on mips, you must call thru t9.
3598 void MacroAssembler::Call(Register target, 3606 void MacroAssembler::Call(Register target,
3599 Condition cond, 3607 Condition cond,
3600 Register rs, 3608 Register rs,
3601 const Operand& rt, 3609 const Operand& rt,
3602 BranchDelaySlot bd) { 3610 BranchDelaySlot bd) {
3603 #ifdef DEBUG 3611 #ifdef DEBUG
3604 int size = IsPrevInstrCompactBranch() ? kInstrSize : 0; 3612 int size = IsPrevInstrCompactBranch() ? kInstrSize : 0;
3605 #endif 3613 #endif
3606 3614
3607 BlockTrampolinePoolScope block_trampoline_pool(this); 3615 BlockTrampolinePoolScope block_trampoline_pool(this);
3608 Label start; 3616 Label start;
3609 bind(&start); 3617 bind(&start);
3610 if (cond == cc_always) { 3618 if (kArchVariant == kMips64r6 && bd == PROTECT) {
3611 jalr(target); 3619 if (cond == cc_always) {
3620 jialc(target, 0);
3621 } else {
3622 BRANCH_ARGS_CHECK(cond, rs, rt);
3623 Branch(2, NegateCondition(cond), rs, rt);
3624 jialc(target, 0);
3625 }
3612 } else { 3626 } else {
3613 BRANCH_ARGS_CHECK(cond, rs, rt); 3627 if (cond == cc_always) {
3614 Branch(2, NegateCondition(cond), rs, rt); 3628 jalr(target);
3615 jalr(target); 3629 } else {
3630 BRANCH_ARGS_CHECK(cond, rs, rt);
3631 Branch(2, NegateCondition(cond), rs, rt);
3632 jalr(target);
3633 }
3634 // Emit a nop in the branch delay slot if required.
3635 if (bd == PROTECT) nop();
3616 } 3636 }
3617 // Emit a nop in the branch delay slot if required.
3618 if (bd == PROTECT)
3619 nop();
3620 3637
3621 #ifdef DEBUG 3638 #ifdef DEBUG
3622 CHECK_EQ(size + CallSize(target, cond, rs, rt, bd), 3639 CHECK_EQ(size + CallSize(target, cond, rs, rt, bd),
3623 SizeOfCodeGeneratedSince(&start)); 3640 SizeOfCodeGeneratedSince(&start));
3624 #endif 3641 #endif
3625 } 3642 }
3626 3643
3627 3644
3628 int MacroAssembler::CallSize(Address target, 3645 int MacroAssembler::CallSize(Address target,
3629 RelocInfo::Mode rmode, 3646 RelocInfo::Mode rmode,
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
3732 // until associated instructions are emitted and available to be patched. 3749 // until associated instructions are emitted and available to be patched.
3733 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED); 3750 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED);
3734 jal(L); 3751 jal(L);
3735 } 3752 }
3736 // Emit a nop in the branch delay slot if required. 3753 // Emit a nop in the branch delay slot if required.
3737 if (bdslot == PROTECT) nop(); 3754 if (bdslot == PROTECT) nop();
3738 } 3755 }
3739 } 3756 }
3740 3757
3741 3758
3742 void MacroAssembler::Jr(Label* L, BranchDelaySlot bdslot) {
3743 BlockTrampolinePoolScope block_trampoline_pool(this);
3744
3745 uint64_t imm64;
3746 imm64 = jump_address(L);
3747 { BlockGrowBufferScope block_buf_growth(this);
3748 // Buffer growth (and relocation) must be blocked for internal references
3749 // until associated instructions are emitted and available to be patched.
3750 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED);
3751 li(at, Operand(imm64), ADDRESS_LOAD);
3752 }
3753 jr(at);
3754
3755 // Emit a nop in the branch delay slot if required.
3756 if (bdslot == PROTECT)
3757 nop();
3758 }
3759
3760
3761 void MacroAssembler::Jalr(Label* L, BranchDelaySlot bdslot) {
3762 BlockTrampolinePoolScope block_trampoline_pool(this);
3763
3764 uint64_t imm64;
3765 imm64 = jump_address(L);
3766 { BlockGrowBufferScope block_buf_growth(this);
3767 // Buffer growth (and relocation) must be blocked for internal references
3768 // until associated instructions are emitted and available to be patched.
3769 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED);
3770 li(at, Operand(imm64), ADDRESS_LOAD);
3771 }
3772 jalr(at);
3773
3774 // Emit a nop in the branch delay slot if required.
3775 if (bdslot == PROTECT)
3776 nop();
3777 }
3778
3779
3780 void MacroAssembler::DropAndRet(int drop) { 3759 void MacroAssembler::DropAndRet(int drop) {
3781 DCHECK(is_int16(drop * kPointerSize)); 3760 DCHECK(is_int16(drop * kPointerSize));
3782 Ret(USE_DELAY_SLOT); 3761 Ret(USE_DELAY_SLOT);
3783 daddiu(sp, sp, drop * kPointerSize); 3762 daddiu(sp, sp, drop * kPointerSize);
3784 } 3763 }
3785 3764
3786 void MacroAssembler::DropAndRet(int drop, 3765 void MacroAssembler::DropAndRet(int drop,
3787 Condition cond, 3766 Condition cond,
3788 Register r1, 3767 Register r1,
3789 const Operand& r2) { 3768 const Operand& r2) {
(...skipping 2913 matching lines...) Expand 10 before | Expand all | Expand 10 after
6703 if (mag.shift > 0) sra(result, result, mag.shift); 6682 if (mag.shift > 0) sra(result, result, mag.shift);
6704 srl(at, dividend, 31); 6683 srl(at, dividend, 31);
6705 Addu(result, result, Operand(at)); 6684 Addu(result, result, Operand(at));
6706 } 6685 }
6707 6686
6708 6687
6709 } // namespace internal 6688 } // namespace internal
6710 } // namespace v8 6689 } // namespace v8
6711 6690
6712 #endif // V8_TARGET_ARCH_MIPS64 6691 #endif // V8_TARGET_ARCH_MIPS64
OLDNEW
« no previous file with comments | « src/mips64/macro-assembler-mips64.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698