< prev index next >

src/cpu/s390/vm/macroAssembler_s390.cpp

Print this page
rev 12485 : 8173465: Introduce NearLabel for branches known to be short.

*** 1614,1623 **** --- 1614,1625 ---- // an assertion fires at patch time. void MacroAssembler::branch_optimized(Assembler::branch_condition cond, Label& branch_target) { if (branch_target.is_bound()) { address branch_addr = target(branch_target); branch_optimized(cond, branch_addr); + } else if (branch_target.is_near()) { + z_brc(cond, branch_target); // Caller assures that the target will be in range for z_brc. } else { z_brcl(cond, branch_target); // Let's hope target is in range. Otherwise, we will abort at patch time. } }
*** 1672,1682 **** Label& branch_target, bool len64, bool has_sign) { address branch_origin = pc(); bool x2_imm8 = (has_sign && Immediate::is_simm8(x2)) || (!has_sign && Immediate::is_uimm8(x2)); ! bool is_RelAddr16 = (branch_target.is_bound() && RelAddr::is_in_range_of_RelAddr16(target(branch_target), branch_origin)); unsigned int casenum = (len64?2:0)+(has_sign?0:1); if (VM_Version::has_CompareBranch() && is_RelAddr16 && x2_imm8) { switch (casenum) { --- 1674,1685 ---- Label& branch_target, bool len64, bool has_sign) { address branch_origin = pc(); bool x2_imm8 = (has_sign && Immediate::is_simm8(x2)) || (!has_sign && Immediate::is_uimm8(x2)); ! bool is_RelAddr16 = branch_target.is_near() || ! (branch_target.is_bound() && RelAddr::is_in_range_of_RelAddr16(target(branch_target), branch_origin)); unsigned int casenum = (len64?2:0)+(has_sign?0:1); if (VM_Version::has_CompareBranch() && is_RelAddr16 && x2_imm8) { switch (casenum) {
*** 1742,1758 **** Register r2, Assembler::branch_condition cond, Label& branch_target, bool len64, bool has_sign) { ! unsigned int casenum = (len64?2:0)+(has_sign?0:1); if (branch_target.is_bound()) { address branch_addr = target(branch_target); compare_and_branch_optimized(r1, r2, cond, branch_addr, len64, has_sign); } else { ! { switch (casenum) { case 0: z_cr( r1, r2); break; case 1: z_clr(r1, r2); break; case 2: z_cgr(r1, r2); break; case 3: z_clgr(r1, r2); break; --- 1745,1769 ---- Register r2, Assembler::branch_condition cond, Label& branch_target, bool len64, bool has_sign) { ! unsigned int casenum = (len64 ? 2 : 0) + (has_sign ? 0 : 1); if (branch_target.is_bound()) { address branch_addr = target(branch_target); compare_and_branch_optimized(r1, r2, cond, branch_addr, len64, has_sign); } else { ! if (VM_Version::has_CompareBranch() && branch_target.is_near()) { ! switch (casenum) { ! case 0: z_crj( r1, r2, cond, branch_target); break; ! case 1: z_clrj( r1, r2, cond, branch_target); break; ! case 2: z_cgrj( r1, r2, cond, branch_target); break; ! case 3: z_clgrj(r1, r2, cond, branch_target); break; ! default: ShouldNotReachHere(); break; ! } ! } else { switch (casenum) { case 0: z_cr( r1, r2); break; case 1: z_clr(r1, r2); break; case 2: z_cgr(r1, r2); break; case 3: z_clgr(r1, r2); break;
< prev index next >