Index: src/mips/macro-assembler-mips.cc |
diff --git a/src/mips/macro-assembler-mips.cc b/src/mips/macro-assembler-mips.cc |
index 272f8147b94185aac05ed5dd75d18940e2fb7e03..4a5a386fa0f7cbf09eb0324bad52521f127c74c0 100644 |
--- a/src/mips/macro-assembler-mips.cc |
+++ b/src/mips/macro-assembler-mips.cc |
@@ -2094,270 +2094,273 @@ bool MacroAssembler::BranchShortHelperR6(int32_t offset, Label* L, |
// Be careful to always use shifted_branch_offset only just before the |
// branch instruction, as the location will be remember for patching the |
// target. |
- BlockTrampolinePoolScope block_trampoline_pool(this); |
- switch (cond) { |
- case cc_always: |
- bits = OffsetSize::kOffset26; |
- if (!is_near(L, bits)) return false; |
- offset = GetOffset(offset, L, bits); |
- bc(offset); |
- break; |
- case eq: |
- if (rs.code() == rt.rm_.reg_code) { |
- // Pre R6 beq is used here to make the code patchable. Otherwise bc |
- // should be used which has no condition field so is not patchable. |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- offset = GetOffset(offset, L, bits); |
- beq(rs, scratch, offset); |
- nop(); |
- } else if (IsZero(rt)) { |
- bits = OffsetSize::kOffset21; |
- if (!is_near(L, bits)) return false; |
- offset = GetOffset(offset, L, bits); |
- beqzc(rs, offset); |
- } else { |
- // We don't want any other register but scratch clobbered. |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- offset = GetOffset(offset, L, bits); |
- beqc(rs, scratch, offset); |
- } |
- break; |
- case ne: |
- if (rs.code() == rt.rm_.reg_code) { |
- // Pre R6 bne is used here to make the code patchable. Otherwise we |
- // should not generate any instruction. |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- offset = GetOffset(offset, L, bits); |
- bne(rs, scratch, offset); |
- nop(); |
- } else if (IsZero(rt)) { |
- bits = OffsetSize::kOffset21; |
- if (!is_near(L, bits)) return false; |
- offset = GetOffset(offset, L, bits); |
- bnezc(rs, offset); |
- } else { |
- // We don't want any other register but scratch clobbered. |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- offset = GetOffset(offset, L, bits); |
- bnec(rs, scratch, offset); |
- } |
- break; |
- |
- // Signed comparison. |
- case greater: |
- // rs > rt |
- if (rs.code() == rt.rm_.reg_code) { |
- break; // No code needs to be emitted. |
- } else if (rs.is(zero_reg)) { |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- offset = GetOffset(offset, L, bits); |
- bltzc(scratch, offset); |
- } else if (IsZero(rt)) { |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- offset = GetOffset(offset, L, bits); |
- bgtzc(rs, offset); |
- } else { |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- DCHECK(!rs.is(scratch)); |
- offset = GetOffset(offset, L, bits); |
- bltc(scratch, rs, offset); |
- } |
- break; |
- case greater_equal: |
- // rs >= rt |
- if (rs.code() == rt.rm_.reg_code) { |
- bits = OffsetSize::kOffset26; |
- if (!is_near(L, bits)) return false; |
- offset = GetOffset(offset, L, bits); |
- bc(offset); |
- } else if (rs.is(zero_reg)) { |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- offset = GetOffset(offset, L, bits); |
- blezc(scratch, offset); |
- } else if (IsZero(rt)) { |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- offset = GetOffset(offset, L, bits); |
- bgezc(rs, offset); |
- } else { |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- DCHECK(!rs.is(scratch)); |
- offset = GetOffset(offset, L, bits); |
- bgec(rs, scratch, offset); |
- } |
- break; |
- case less: |
- // rs < rt |
- if (rs.code() == rt.rm_.reg_code) { |
- break; // No code needs to be emitted. |
- } else if (rs.is(zero_reg)) { |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- offset = GetOffset(offset, L, bits); |
- bgtzc(scratch, offset); |
- } else if (IsZero(rt)) { |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- offset = GetOffset(offset, L, bits); |
- bltzc(rs, offset); |
- } else { |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- DCHECK(!rs.is(scratch)); |
- offset = GetOffset(offset, L, bits); |
- bltc(rs, scratch, offset); |
- } |
- break; |
- case less_equal: |
- // rs <= rt |
- if (rs.code() == rt.rm_.reg_code) { |
+ { |
+ BlockTrampolinePoolScope block_trampoline_pool(this); |
+ switch (cond) { |
+ case cc_always: |
bits = OffsetSize::kOffset26; |
if (!is_near(L, bits)) return false; |
offset = GetOffset(offset, L, bits); |
bc(offset); |
- } else if (rs.is(zero_reg)) { |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- offset = GetOffset(offset, L, bits); |
- bgezc(scratch, offset); |
- } else if (IsZero(rt)) { |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- offset = GetOffset(offset, L, bits); |
- blezc(rs, offset); |
- } else { |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- DCHECK(!rs.is(scratch)); |
- offset = GetOffset(offset, L, bits); |
- bgec(scratch, rs, offset); |
- } |
- break; |
+ break; |
+ case eq: |
+ if (rs.code() == rt.rm_.reg_code) { |
+ // Pre R6 beq is used here to make the code patchable. Otherwise bc |
+ // should be used which has no condition field so is not patchable. |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ offset = GetOffset(offset, L, bits); |
+ beq(rs, scratch, offset); |
+ nop(); |
+ } else if (IsZero(rt)) { |
+ bits = OffsetSize::kOffset21; |
+ if (!is_near(L, bits)) return false; |
+ offset = GetOffset(offset, L, bits); |
+ beqzc(rs, offset); |
+ } else { |
+ // We don't want any other register but scratch clobbered. |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ offset = GetOffset(offset, L, bits); |
+ beqc(rs, scratch, offset); |
+ } |
+ break; |
+ case ne: |
+ if (rs.code() == rt.rm_.reg_code) { |
+ // Pre R6 bne is used here to make the code patchable. Otherwise we |
+ // should not generate any instruction. |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ offset = GetOffset(offset, L, bits); |
+ bne(rs, scratch, offset); |
+ nop(); |
+ } else if (IsZero(rt)) { |
+ bits = OffsetSize::kOffset21; |
+ if (!is_near(L, bits)) return false; |
+ offset = GetOffset(offset, L, bits); |
+ bnezc(rs, offset); |
+ } else { |
+ // We don't want any other register but scratch clobbered. |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ offset = GetOffset(offset, L, bits); |
+ bnec(rs, scratch, offset); |
+ } |
+ break; |
- // Unsigned comparison. |
- case Ugreater: |
- // rs > rt |
- if (rs.code() == rt.rm_.reg_code) { |
- break; // No code needs to be emitted. |
- } else if (rs.is(zero_reg)) { |
- bits = OffsetSize::kOffset21; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- offset = GetOffset(offset, L, bits); |
- bnezc(scratch, offset); |
- } else if (IsZero(rt)) { |
- bits = OffsetSize::kOffset21; |
- if (!is_near(L, bits)) return false; |
- offset = GetOffset(offset, L, bits); |
- bnezc(rs, offset); |
- } else { |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- DCHECK(!rs.is(scratch)); |
- offset = GetOffset(offset, L, bits); |
- bltuc(scratch, rs, offset); |
- } |
- break; |
- case Ugreater_equal: |
- // rs >= rt |
- if (rs.code() == rt.rm_.reg_code) { |
- bits = OffsetSize::kOffset26; |
- if (!is_near(L, bits)) return false; |
- offset = GetOffset(offset, L, bits); |
- bc(offset); |
- } else if (rs.is(zero_reg)) { |
- bits = OffsetSize::kOffset21; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- offset = GetOffset(offset, L, bits); |
- beqzc(scratch, offset); |
- } else if (IsZero(rt)) { |
- bits = OffsetSize::kOffset26; |
- if (!is_near(L, bits)) return false; |
- offset = GetOffset(offset, L, bits); |
- bc(offset); |
- } else { |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- DCHECK(!rs.is(scratch)); |
- offset = GetOffset(offset, L, bits); |
- bgeuc(rs, scratch, offset); |
- } |
- break; |
- case Uless: |
- // rs < rt |
- if (rs.code() == rt.rm_.reg_code) { |
- break; // No code needs to be emitted. |
- } else if (rs.is(zero_reg)) { |
- bits = OffsetSize::kOffset21; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- offset = GetOffset(offset, L, bits); |
- bnezc(scratch, offset); |
- } else if (IsZero(rt)) { |
- break; // No code needs to be emitted. |
- } else { |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- DCHECK(!rs.is(scratch)); |
- offset = GetOffset(offset, L, bits); |
- bltuc(rs, scratch, offset); |
- } |
- break; |
- case Uless_equal: |
- // rs <= rt |
- if (rs.code() == rt.rm_.reg_code) { |
- bits = OffsetSize::kOffset26; |
- if (!is_near(L, bits)) return false; |
- offset = GetOffset(offset, L, bits); |
- bc(offset); |
- } else if (rs.is(zero_reg)) { |
- bits = OffsetSize::kOffset26; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- offset = GetOffset(offset, L, bits); |
- bc(offset); |
- } else if (IsZero(rt)) { |
- bits = OffsetSize::kOffset21; |
- if (!is_near(L, bits)) return false; |
- offset = GetOffset(offset, L, bits); |
- beqzc(rs, offset); |
- } else { |
- bits = OffsetSize::kOffset16; |
- if (!is_near(L, bits)) return false; |
- scratch = GetRtAsRegisterHelper(rt, scratch); |
- DCHECK(!rs.is(scratch)); |
- offset = GetOffset(offset, L, bits); |
- bgeuc(scratch, rs, offset); |
- } |
- break; |
- default: |
- UNREACHABLE(); |
+ // Signed comparison. |
+ case greater: |
+ // rs > rt |
+ if (rs.code() == rt.rm_.reg_code) { |
+ break; // No code needs to be emitted. |
+ } else if (rs.is(zero_reg)) { |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ offset = GetOffset(offset, L, bits); |
+ bltzc(scratch, offset); |
+ } else if (IsZero(rt)) { |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ offset = GetOffset(offset, L, bits); |
+ bgtzc(rs, offset); |
+ } else { |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ DCHECK(!rs.is(scratch)); |
+ offset = GetOffset(offset, L, bits); |
+ bltc(scratch, rs, offset); |
+ } |
+ break; |
+ case greater_equal: |
+ // rs >= rt |
+ if (rs.code() == rt.rm_.reg_code) { |
+ bits = OffsetSize::kOffset26; |
+ if (!is_near(L, bits)) return false; |
+ offset = GetOffset(offset, L, bits); |
+ bc(offset); |
+ } else if (rs.is(zero_reg)) { |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ offset = GetOffset(offset, L, bits); |
+ blezc(scratch, offset); |
+ } else if (IsZero(rt)) { |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ offset = GetOffset(offset, L, bits); |
+ bgezc(rs, offset); |
+ } else { |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ DCHECK(!rs.is(scratch)); |
+ offset = GetOffset(offset, L, bits); |
+ bgec(rs, scratch, offset); |
+ } |
+ break; |
+ case less: |
+ // rs < rt |
+ if (rs.code() == rt.rm_.reg_code) { |
+ break; // No code needs to be emitted. |
+ } else if (rs.is(zero_reg)) { |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ offset = GetOffset(offset, L, bits); |
+ bgtzc(scratch, offset); |
+ } else if (IsZero(rt)) { |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ offset = GetOffset(offset, L, bits); |
+ bltzc(rs, offset); |
+ } else { |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ DCHECK(!rs.is(scratch)); |
+ offset = GetOffset(offset, L, bits); |
+ bltc(rs, scratch, offset); |
+ } |
+ break; |
+ case less_equal: |
+ // rs <= rt |
+ if (rs.code() == rt.rm_.reg_code) { |
+ bits = OffsetSize::kOffset26; |
+ if (!is_near(L, bits)) return false; |
+ offset = GetOffset(offset, L, bits); |
+ bc(offset); |
+ } else if (rs.is(zero_reg)) { |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ offset = GetOffset(offset, L, bits); |
+ bgezc(scratch, offset); |
+ } else if (IsZero(rt)) { |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ offset = GetOffset(offset, L, bits); |
+ blezc(rs, offset); |
+ } else { |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ DCHECK(!rs.is(scratch)); |
+ offset = GetOffset(offset, L, bits); |
+ bgec(scratch, rs, offset); |
+ } |
+ break; |
+ |
+ // Unsigned comparison. |
+ case Ugreater: |
+ // rs > rt |
+ if (rs.code() == rt.rm_.reg_code) { |
+ break; // No code needs to be emitted. |
+ } else if (rs.is(zero_reg)) { |
+ bits = OffsetSize::kOffset21; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ offset = GetOffset(offset, L, bits); |
+ bnezc(scratch, offset); |
+ } else if (IsZero(rt)) { |
+ bits = OffsetSize::kOffset21; |
+ if (!is_near(L, bits)) return false; |
+ offset = GetOffset(offset, L, bits); |
+ bnezc(rs, offset); |
+ } else { |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ DCHECK(!rs.is(scratch)); |
+ offset = GetOffset(offset, L, bits); |
+ bltuc(scratch, rs, offset); |
+ } |
+ break; |
+ case Ugreater_equal: |
+ // rs >= rt |
+ if (rs.code() == rt.rm_.reg_code) { |
+ bits = OffsetSize::kOffset26; |
+ if (!is_near(L, bits)) return false; |
+ offset = GetOffset(offset, L, bits); |
+ bc(offset); |
+ } else if (rs.is(zero_reg)) { |
+ bits = OffsetSize::kOffset21; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ offset = GetOffset(offset, L, bits); |
+ beqzc(scratch, offset); |
+ } else if (IsZero(rt)) { |
+ bits = OffsetSize::kOffset26; |
+ if (!is_near(L, bits)) return false; |
+ offset = GetOffset(offset, L, bits); |
+ bc(offset); |
+ } else { |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ DCHECK(!rs.is(scratch)); |
+ offset = GetOffset(offset, L, bits); |
+ bgeuc(rs, scratch, offset); |
+ } |
+ break; |
+ case Uless: |
+ // rs < rt |
+ if (rs.code() == rt.rm_.reg_code) { |
+ break; // No code needs to be emitted. |
+ } else if (rs.is(zero_reg)) { |
+ bits = OffsetSize::kOffset21; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ offset = GetOffset(offset, L, bits); |
+ bnezc(scratch, offset); |
+ } else if (IsZero(rt)) { |
+ break; // No code needs to be emitted. |
+ } else { |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ DCHECK(!rs.is(scratch)); |
+ offset = GetOffset(offset, L, bits); |
+ bltuc(rs, scratch, offset); |
+ } |
+ break; |
+ case Uless_equal: |
+ // rs <= rt |
+ if (rs.code() == rt.rm_.reg_code) { |
+ bits = OffsetSize::kOffset26; |
+ if (!is_near(L, bits)) return false; |
+ offset = GetOffset(offset, L, bits); |
+ bc(offset); |
+ } else if (rs.is(zero_reg)) { |
+ bits = OffsetSize::kOffset26; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ offset = GetOffset(offset, L, bits); |
+ bc(offset); |
+ } else if (IsZero(rt)) { |
+ bits = OffsetSize::kOffset21; |
+ if (!is_near(L, bits)) return false; |
+ offset = GetOffset(offset, L, bits); |
+ beqzc(rs, offset); |
+ } else { |
+ bits = OffsetSize::kOffset16; |
+ if (!is_near(L, bits)) return false; |
+ scratch = GetRtAsRegisterHelper(rt, scratch); |
+ DCHECK(!rs.is(scratch)); |
+ offset = GetOffset(offset, L, bits); |
+ bgeuc(scratch, rs, offset); |
+ } |
+ break; |
+ default: |
+ UNREACHABLE(); |
+ } |
} |
+ CheckTrampolinePoolQuick(1); |
return true; |
} |