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) &&
{
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));
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;