]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
s390: Tweak s390_isel_amode_wrk
authorFlorian Krohm <flo2030@eich-krohm.de>
Fri, 26 Jun 2026 20:50:44 +0000 (20:50 +0000)
committerFlorian Krohm <flo2030@eich-krohm.de>
Fri, 26 Jun 2026 20:50:44 +0000 (20:50 +0000)
Adjust s390_amode_is_sane accordingly.

VEX/priv/host_s390_defs.c
VEX/priv/host_s390_isel.c

index c4645b8c9cf3aed72ba36688877f7a191385b01c..e2440095c144ae485a4742c806640301f7134a39 100644 (file)
@@ -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) &&
index c29e9d7862265f5a36641cd1d388b994cdfbb034..18bb95af9fb197f507c52e50c859e67e51c8c2b3 100644 (file)
@@ -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;