From: Florian Krohm Date: Fri, 26 Jun 2026 20:50:44 +0000 (+0000) Subject: s390: Tweak s390_isel_amode_wrk X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dcfabf9cb419698951e6b9a181dfeaf04bf5e154;p=thirdparty%2Fvalgrind.git s390: Tweak s390_isel_amode_wrk Adjust s390_amode_is_sane accordingly. --- diff --git a/VEX/priv/host_s390_defs.c b/VEX/priv/host_s390_defs.c index c4645b8c9..e2440095c 100644 --- a/VEX/priv/host_s390_defs.c +++ b/VEX/priv/host_s390_defs.c @@ -380,7 +380,8 @@ s390_amode_is_sane(const s390_amode *am) fits_unsigned_12bit(am->d); case S390_AMODE_B20: - return is_virtual_gpr(am->b) && fits_signed_20bit(am->d); + return (is_virtual_gpr(am->b) || sameHReg(am->b, s390_hreg_gpr(0))) && + fits_signed_20bit(am->d); case S390_AMODE_BX12: return is_virtual_gpr(am->b) && is_virtual_gpr(am->x) && diff --git a/VEX/priv/host_s390_isel.c b/VEX/priv/host_s390_isel.c index c29e9d786..18bb95af9 100644 --- a/VEX/priv/host_s390_isel.c +++ b/VEX/priv/host_s390_isel.c @@ -324,6 +324,7 @@ s390_isel_amode_wrk(ISelEnv *env, IRExpr *expr, { if (expr->tag == Iex_Unop && expr->Iex.Unop.op == Iop_8Uto64 && expr->Iex.Unop.arg->tag == Iex_Const) { + /* This actually does occur (look for Iop_8Uto64 in this file). */ UChar value = expr->Iex.Unop.arg->Iex.Const.con->Ico.U8; return s390_amode_b12((Int)value, s390_hreg_gpr(0)); @@ -332,6 +333,9 @@ s390_isel_amode_wrk(ISelEnv *env, IRExpr *expr, if (ulong_fits_unsigned_12bit(value)) { return s390_amode_b12((Int)value, s390_hreg_gpr(0)); } + if (!short_displacement && ulong_fits_signed_20bit(value)) { + return s390_amode_b20((Int)value, s390_hreg_gpr(0)); + } } else if (expr->tag == Iex_Binop && expr->Iex.Binop.op == Iop_Add64) { IRExpr *arg1 = expr->Iex.Binop.arg1;