Message ID | 20250415192515.232910-126-richard.henderson@linaro.org |
---|---|
State | New |
Headers | show |
Series | tcg: Convert to TCGOutOp structures | expand |
On 4/15/25 12:24, Richard Henderson wrote: > Use this in do_add, do_sub, and do_ds, all of which need > add with carry-in and carry-out. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > target/hppa/translate.c | 17 ++++++----------- > 1 file changed, 6 insertions(+), 11 deletions(-) > > diff --git a/target/hppa/translate.c b/target/hppa/translate.c > index 0d0d1bc99b..c92b09bae2 100644 > --- a/target/hppa/translate.c > +++ b/target/hppa/translate.c > @@ -1208,10 +1208,10 @@ static void do_add(DisasContext *ctx, unsigned rt, TCGv_i64 orig_in1, > cb_msb = tcg_temp_new_i64(); > cb = tcg_temp_new_i64(); > > - tcg_gen_add2_i64(dest, cb_msb, in1, ctx->zero, in2, ctx->zero); > if (is_c) { > - tcg_gen_add2_i64(dest, cb_msb, dest, cb_msb, > - get_psw_carry(ctx, d), ctx->zero); > + tcg_gen_addcio_i64(dest, cb_msb, in1, in2, get_psw_carry(ctx, d)); > + } else { > + tcg_gen_add2_i64(dest, cb_msb, in1, ctx->zero, in2, ctx->zero); > } > tcg_gen_xor_i64(cb, in1, in2); > tcg_gen_xor_i64(cb, cb, dest); > @@ -1307,9 +1307,7 @@ static void do_sub(DisasContext *ctx, unsigned rt, TCGv_i64 in1, > if (is_b) { > /* DEST,C = IN1 + ~IN2 + C. */ > tcg_gen_not_i64(cb, in2); > - tcg_gen_add2_i64(dest, cb_msb, in1, ctx->zero, > - get_psw_carry(ctx, d), ctx->zero); > - tcg_gen_add2_i64(dest, cb_msb, dest, cb_msb, cb, ctx->zero); > + tcg_gen_addcio_i64(dest, cb_msb, in1, cb, get_psw_carry(ctx, d)); > tcg_gen_xor_i64(cb, cb, in1); > tcg_gen_xor_i64(cb, cb, dest); > } else { > @@ -3007,9 +3005,7 @@ static bool trans_ds(DisasContext *ctx, arg_rrr_cf *a) > tcg_gen_xor_i64(add2, in2, addc); > tcg_gen_andi_i64(addc, addc, 1); > > - tcg_gen_add2_i64(dest, cpu_psw_cb_msb, add1, ctx->zero, add2, ctx->zero); > - tcg_gen_add2_i64(dest, cpu_psw_cb_msb, dest, cpu_psw_cb_msb, > - addc, ctx->zero); > + tcg_gen_addcio_i64(dest, cpu_psw_cb_msb, add1, add2, addc); > > /* Write back the result register. */ > save_gpr(ctx, a->t, dest); > @@ -3552,8 +3548,7 @@ static bool do_addb(DisasContext *ctx, unsigned r, TCGv_i64 in1, > TCGv_i64 cb = tcg_temp_new_i64(); > TCGv_i64 cb_msb = tcg_temp_new_i64(); > > - tcg_gen_movi_i64(cb_msb, 0); > - tcg_gen_add2_i64(dest, cb_msb, in1, cb_msb, in2, cb_msb); > + tcg_gen_add2_i64(dest, cb_msb, in1, ctx->zero, in2, ctx->zero); > tcg_gen_xor_i64(cb, in1, in2); > tcg_gen_xor_i64(cb, cb, dest); > cb_cond = get_carry(ctx, d, cb, cb_msb); Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
diff --git a/target/hppa/translate.c b/target/hppa/translate.c index 0d0d1bc99b..c92b09bae2 100644 --- a/target/hppa/translate.c +++ b/target/hppa/translate.c @@ -1208,10 +1208,10 @@ static void do_add(DisasContext *ctx, unsigned rt, TCGv_i64 orig_in1, cb_msb = tcg_temp_new_i64(); cb = tcg_temp_new_i64(); - tcg_gen_add2_i64(dest, cb_msb, in1, ctx->zero, in2, ctx->zero); if (is_c) { - tcg_gen_add2_i64(dest, cb_msb, dest, cb_msb, - get_psw_carry(ctx, d), ctx->zero); + tcg_gen_addcio_i64(dest, cb_msb, in1, in2, get_psw_carry(ctx, d)); + } else { + tcg_gen_add2_i64(dest, cb_msb, in1, ctx->zero, in2, ctx->zero); } tcg_gen_xor_i64(cb, in1, in2); tcg_gen_xor_i64(cb, cb, dest); @@ -1307,9 +1307,7 @@ static void do_sub(DisasContext *ctx, unsigned rt, TCGv_i64 in1, if (is_b) { /* DEST,C = IN1 + ~IN2 + C. */ tcg_gen_not_i64(cb, in2); - tcg_gen_add2_i64(dest, cb_msb, in1, ctx->zero, - get_psw_carry(ctx, d), ctx->zero); - tcg_gen_add2_i64(dest, cb_msb, dest, cb_msb, cb, ctx->zero); + tcg_gen_addcio_i64(dest, cb_msb, in1, cb, get_psw_carry(ctx, d)); tcg_gen_xor_i64(cb, cb, in1); tcg_gen_xor_i64(cb, cb, dest); } else { @@ -3007,9 +3005,7 @@ static bool trans_ds(DisasContext *ctx, arg_rrr_cf *a) tcg_gen_xor_i64(add2, in2, addc); tcg_gen_andi_i64(addc, addc, 1); - tcg_gen_add2_i64(dest, cpu_psw_cb_msb, add1, ctx->zero, add2, ctx->zero); - tcg_gen_add2_i64(dest, cpu_psw_cb_msb, dest, cpu_psw_cb_msb, - addc, ctx->zero); + tcg_gen_addcio_i64(dest, cpu_psw_cb_msb, add1, add2, addc); /* Write back the result register. */ save_gpr(ctx, a->t, dest); @@ -3552,8 +3548,7 @@ static bool do_addb(DisasContext *ctx, unsigned r, TCGv_i64 in1, TCGv_i64 cb = tcg_temp_new_i64(); TCGv_i64 cb_msb = tcg_temp_new_i64(); - tcg_gen_movi_i64(cb_msb, 0); - tcg_gen_add2_i64(dest, cb_msb, in1, cb_msb, in2, cb_msb); + tcg_gen_add2_i64(dest, cb_msb, in1, ctx->zero, in2, ctx->zero); tcg_gen_xor_i64(cb, in1, in2); tcg_gen_xor_i64(cb, cb, dest); cb_cond = get_carry(ctx, d, cb, cb_msb);
Use this in do_add, do_sub, and do_ds, all of which need add with carry-in and carry-out. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- target/hppa/translate.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-)