Skip to content

Commit

Permalink
improve branch condition code. (#94201)
Browse files Browse the repository at this point in the history
  • Loading branch information
saitama951 committed Oct 31, 2023
1 parent 80b08ed commit f45c788
Show file tree
Hide file tree
Showing 4 changed files with 148 additions and 65 deletions.
18 changes: 18 additions & 0 deletions src/mono/mono/arch/s390x/s390x-codegen.h
Original file line number Diff line number Diff line change
Expand Up @@ -1408,8 +1408,26 @@ typedef struct {
#define s390_lnr(c, r1, r2) S390_RR(c, 0x11, r1, r2)
#define s390_loc(c, r, m, b, d) S390_RSY_2(c, 0xebf2, r, m, b, d)
#define s390_locg(c, r, m, b, d) S390_RSY_2(c, 0xebe2, r, m, b, d)
#define s390_lochi(c, r1, i, m) S390_RIE_1(c, 0xec42, r1, m, i)
#define s390_locghi(c, r1, i, m) S390_RIE_1(c, 0xec46, r1, m, i)
#define s390_locghile(c, r1, i) s390_locghi(c, r1, i, S390_CC_LT|S390_CC_EQ)
#define s390_locghihe(c, r1, i) s390_locghi(c, r1, i, S390_CC_GT|S390_CC_EQ)
#define s390_locghine(c, r1, i) s390_locghi(c, r1, i, S390_CC_NZ)
#define s390_locghiho(c, r1, i) s390_locghi(c, r1, i, S390_CC_GT|S390_CC_OV)
#define s390_locghih(c, r1, i) s390_locghi(c, r1, i, S390_CC_GT)
#define s390_locghilo(c, r1, i) s390_locghi(c, r1, i, S390_CC_LT|S390_CC_OV)
#define s390_locghil(c, r1, i) s390_locghi(c, r1, i, S390_CC_LT)
#define s390_locghiz(c, r1, i) s390_locghi(c, r1, i, S390_CC_ZR)
#define s390_locr(c, r1, m, r2) S390_RRF_2(c, 0xb9f2, r1, m, r2)
#define s390_locgr(c, r1, m, r2) S390_RRF_2(c, 0xb9e2, r1, m, r2)
#define s390_locgrle(c, r1, r2) s390_locgr(c, r1, S390_CC_LT|S390_CC_EQ, r2)
#define s390_locgrhe(c, r1, r2) s390_locgr(c, r1, S390_CC_GT|S390_CC_EQ, r2)
#define s390_locgrne(c, r1, r2) s390_locgr(c, r1, S390_CC_NZ, r2)
#define s390_locgrho(c, r1, r2) s390_locgr(c, r1, S390_CC_GT|S390_CC_OV, r2)
#define s390_locgrh(c, r1, r2) s390_locgr(c, r1, S390_CC_GT, r2)
#define s390_locgrlo(c, r1, r2) s390_locgr(c, r1, S390_CC_LT|S390_CC_OV, r2)
#define s390_locgrl(c, r1, r2) s390_locgr(c, r1, S390_CC_LT, r2)
#define s390_locgrz(c, r1, r2) s390_locgr(c, r1, S390_CC_ZR, r2)
#define s390_locfh(c, r, n, b, d) S390_RRF_2(c, 0xebe0, r, m, b, d)
#define s390_locfhr(c, r1, m, r2) S390_RRF_2(c, 0xb9e0, r1, m, r2)
#define s390_lpdbr(c, r1, r2) S390_RRE(c, 0xb310, r1, r2)
Expand Down
193 changes: 128 additions & 65 deletions src/mono/mono/mini/mini-s390x.c
Original file line number Diff line number Diff line change
Expand Up @@ -3933,75 +3933,138 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
}
break;
case OP_CEQ:
case OP_ICEQ:
case OP_LCEQ: {
s390_lghi(code, ins->dreg, 1);
s390_jz (code, 4);
s390_lghi(code, ins->dreg, 0);
}
break;
case OP_CLT:
case OP_ICLT:
case OP_LCLT: {
s390_lghi(code, ins->dreg, 1);
s390_jl (code, 4);
s390_lghi(code, ins->dreg, 0);
}
break;
case OP_CLT_UN:
case OP_ICLT_UN:
case OP_LCLT_UN: {
s390_lghi(code, ins->dreg, 1);
s390_jlo (code, 4);
s390_lghi(code, ins->dreg, 0);
}
break;
case OP_ICEQ:
case OP_LCEQ: {
if (mono_hwcap_s390x_has_lsoc2) {
s390_lghi (code, ins->dreg, 0);
s390_locghiz(code, ins->dreg, 1);
} else if (mono_hwcap_s390x_has_mlt) {
s390_lghi (code, ins->dreg, 0);
s390_lghi (code, s390_r13, 1);
s390_locgrz(code, ins->dreg, s390_r13);
} else {
s390_lghi(code, ins->dreg, 1);
s390_jz (code, 4);
s390_lghi(code, ins->dreg, 0);
}
}
break;
case OP_CLT:
case OP_ICLT:
case OP_LCLT: {
if (mono_hwcap_s390x_has_lsoc2) {
s390_lghi (code, ins->dreg, 0);
s390_locghil(code, ins->dreg, 1);
} else if (mono_hwcap_s390x_has_mlt) {
s390_lghi (code, ins->dreg, 0);
s390_lghi (code, s390_r13, 1);
s390_locgrl(code, ins->dreg, s390_r13);
} else {
s390_lghi(code, ins->dreg, 1);
s390_jl (code, 4);
s390_lghi(code, ins->dreg, 0);
}
}
break;
case OP_CLT_UN:
case OP_ICLT_UN:
case OP_LCLT_UN: {
if (mono_hwcap_s390x_has_lsoc2) {
s390_lghi (code, ins->dreg, 0);
s390_locghilo(code, ins->dreg, 1);
} else if (mono_hwcap_s390x_has_mlt) {
s390_lghi (code, ins->dreg, 0);
s390_lghi (code, s390_r13, 1);
s390_locgrlo(code, ins->dreg, s390_r13);
} else {
s390_lghi(code, ins->dreg, 1);
s390_jlo (code, 4);
s390_lghi(code, ins->dreg, 0);
}
}
break;
case OP_CGT:
case OP_ICGT:
case OP_LCGT: {
s390_lghi(code, ins->dreg, 1);
s390_jh (code, 4);
s390_lghi(code, ins->dreg, 0);
case OP_ICGT:
case OP_LCGT: {
if (mono_hwcap_s390x_has_lsoc2) {
s390_lghi (code, ins->dreg, 0);
s390_locghih(code, ins->dreg, 1);
} else if (mono_hwcap_s390x_has_mlt) {
s390_lghi (code, ins->dreg, 0);
s390_lghi (code, s390_r13, 1);
s390_locgrh(code, ins->dreg, s390_r13);
} else {
s390_lghi(code, ins->dreg, 1);
s390_jh (code, 4);
s390_lghi(code, ins->dreg, 0);
}
}
break;
case OP_CGT_UN:
case OP_ICGT_UN:
case OP_LCGT_UN: {
s390_lghi(code, ins->dreg, 1);
s390_jho (code, 4);
s390_lghi(code, ins->dreg, 0);
}
break;
case OP_ICNEQ: {
s390_lghi(code, ins->dreg, 1);
s390_jne (code, 4);
s390_lghi(code, ins->dreg, 0);
}
break;
case OP_ICGE: {
s390_lghi(code, ins->dreg, 1);
s390_jhe (code, 4);
s390_lghi(code, ins->dreg, 0);
}
break;
case OP_ICLE: {
s390_lghi(code, ins->dreg, 1);
s390_jle (code, 4);
s390_lghi(code, ins->dreg, 0);
}
break;
case OP_ICGE_UN: {
s390_lghi(code, ins->dreg, 1);
s390_jhe (code, 4);
s390_lghi(code, ins->dreg, 0);
}
break;
case OP_ICLE_UN: {
s390_lghi(code, ins->dreg, 1);
s390_jle (code, 4);
s390_lghi(code, ins->dreg, 0);
}
break;
case OP_ICGT_UN:
case OP_LCGT_UN: {
if (mono_hwcap_s390x_has_lsoc2) {
s390_lghi (code, ins->dreg, 0);
s390_locghiho(code, ins->dreg, 1);
} else if (mono_hwcap_s390x_has_mlt) {
s390_lghi (code, ins->dreg, 0);
s390_lghi (code, s390_r13, 1);
s390_locgrho(code, ins->dreg, s390_r13);
} else {
s390_lghi(code, ins->dreg, 1);
s390_jho (code, 4);
s390_lghi(code, ins->dreg, 0);
}
}
break;
case OP_ICNEQ: {
if (mono_hwcap_s390x_has_lsoc2) {
s390_lghi (code, ins->dreg, 0);
s390_locghine(code, ins->dreg, 1);
} else if (mono_hwcap_s390x_has_mlt) {
s390_lghi (code, ins->dreg, 0);
s390_lghi (code, s390_r13, 1);
s390_locgrne(code, ins->dreg, s390_r13);
} else {
s390_lghi(code, ins->dreg, 1);
s390_jne (code, 4);
s390_lghi(code, ins->dreg, 0);
}
}
break;
case OP_ICLE_UN:
case OP_ICLE: {
if (mono_hwcap_s390x_has_lsoc2) {
s390_lghi (code, ins->dreg, 0);
s390_locghile(code, ins->dreg, 1);
} else if (mono_hwcap_s390x_has_mlt) {
s390_lghi (code, ins->dreg, 0);
s390_lghi (code, s390_r13, 1);
s390_locgrle(code, ins->dreg, s390_r13);
} else {
s390_lghi(code, ins->dreg, 1);
s390_jle (code, 4);
s390_lghi(code, ins->dreg, 0);
}
}
break;
case OP_ICGE:
case OP_ICGE_UN: {
if (mono_hwcap_s390x_has_lsoc2) {
s390_lghi (code, ins->dreg, 0);
s390_locghihe(code, ins->dreg, 1);

} else if (mono_hwcap_s390x_has_mlt) {
s390_lghi (code, ins->dreg, 0);
s390_lghi (code, s390_r13, 1);
s390_locgrhe(code, ins->dreg, s390_r13);
} else {
s390_lghi(code, ins->dreg, 1);
s390_jhe (code, 4);
s390_lghi(code, ins->dreg, 0);
}
}
break;
case OP_COND_EXC_EQ:
case OP_COND_EXC_IEQ:
EMIT_COND_SYSTEM_EXCEPTION (S390_CC_EQ, ins->inst_p1);
Expand Down
1 change: 1 addition & 0 deletions src/mono/mono/utils/mono-hwcap-s390x.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,4 +165,5 @@ mono_hwcap_arch_init (void)
mono_hwcap_s390x_has_gs = facs.gs;
mono_hwcap_s390x_has_vef2 = facs.vef2;
mono_hwcap_s390x_has_eif = facs.eif;
mono_hwcap_s390x_has_lsoc2 = facs.lsoc2;
}
1 change: 1 addition & 0 deletions src/mono/mono/utils/mono-hwcap-vars.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ MONO_HWCAP_VAR(s390x_has_mie3)
MONO_HWCAP_VAR(s390x_has_gs)
MONO_HWCAP_VAR(s390x_has_vef2)
MONO_HWCAP_VAR(s390x_has_eif)
MONO_HWCAP_VAR(s390x_has_lsoc2)

#elif defined (TARGET_X86) || defined (TARGET_AMD64)

Expand Down

0 comments on commit f45c788

Please sign in to comment.