< 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 >