Message ID | 20250415192515.232910-139-richard.henderson@linaro.org |
---|---|
State | New |
Headers | show |
Series | tcg: Convert to TCGOutOp structures | expand |
On 4/15/25 12:24, Richard Henderson wrote: > We have replaced this with support for add/sub carry. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > tcg/ppc/tcg-target-con-set.h | 2 -- > tcg/ppc/tcg-target-has.h | 11 +++---- > tcg/ppc/tcg-target.c.inc | 60 ------------------------------------ > 3 files changed, 4 insertions(+), 69 deletions(-) > > diff --git a/tcg/ppc/tcg-target-con-set.h b/tcg/ppc/tcg-target-con-set.h > index 9ea26c40ae..da7a383bff 100644 > --- a/tcg/ppc/tcg-target-con-set.h > +++ b/tcg/ppc/tcg-target-con-set.h > @@ -41,5 +41,3 @@ C_O1_I4(r, r, r, rU, rC) > C_O2_I1(r, r, r) > C_N1O1_I1(o, m, r) > C_O2_I2(r, r, r, r) > -C_O2_I4(r, r, rI, rZM, r, r) > -C_O2_I4(r, r, r, r, rI, rZM) > diff --git a/tcg/ppc/tcg-target-has.h b/tcg/ppc/tcg-target-has.h > index 8d832ce99c..4dda668706 100644 > --- a/tcg/ppc/tcg-target-has.h > +++ b/tcg/ppc/tcg-target-has.h > @@ -18,16 +18,13 @@ > > /* optional instructions */ > #define TCG_TARGET_HAS_qemu_st8_i32 0 > - > -#if TCG_TARGET_REG_BITS == 64 > #define TCG_TARGET_HAS_add2_i32 0 > #define TCG_TARGET_HAS_sub2_i32 0 > + > +#if TCG_TARGET_REG_BITS == 64 > #define TCG_TARGET_HAS_extr_i64_i32 0 > -#define TCG_TARGET_HAS_add2_i64 1 > -#define TCG_TARGET_HAS_sub2_i64 1 > -#else > -#define TCG_TARGET_HAS_add2_i32 1 > -#define TCG_TARGET_HAS_sub2_i32 1 > +#define TCG_TARGET_HAS_add2_i64 0 > +#define TCG_TARGET_HAS_sub2_i64 0 > #endif > > #define TCG_TARGET_HAS_qemu_ldst_i128 \ > diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc > index 0b151db0e4..91df9610ec 100644 > --- a/tcg/ppc/tcg-target.c.inc > +++ b/tcg/ppc/tcg-target.c.inc > @@ -3663,8 +3663,6 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, > const TCGArg args[TCG_MAX_OP_ARGS], > const int const_args[TCG_MAX_OP_ARGS]) > { > - TCGArg a0, a1; > - > switch (opc) { > case INDEX_op_goto_ptr: > tcg_out32(s, MTSPR | RS(args[0]) | CTR); > @@ -3760,57 +3758,6 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, > tcg_out_qemu_ldst_i128(s, args[0], args[1], args[2], args[3], false); > break; > > -#if TCG_TARGET_REG_BITS == 64 > - case INDEX_op_add2_i64: > -#else > - case INDEX_op_add2_i32: > -#endif > - /* Note that the CA bit is defined based on the word size of the > - environment. So in 64-bit mode it's always carry-out of bit 63. > - The fallback code using deposit works just as well for 32-bit. */ > - a0 = args[0], a1 = args[1]; > - if (a0 == args[3] || (!const_args[5] && a0 == args[5])) { > - a0 = TCG_REG_R0; > - } > - if (const_args[4]) { > - tcg_out32(s, ADDIC | TAI(a0, args[2], args[4])); > - } else { > - tcg_out32(s, ADDC | TAB(a0, args[2], args[4])); > - } > - if (const_args[5]) { > - tcg_out32(s, (args[5] ? ADDME : ADDZE) | RT(a1) | RA(args[3])); > - } else { > - tcg_out32(s, ADDE | TAB(a1, args[3], args[5])); > - } > - if (a0 != args[0]) { > - tcg_out_mov(s, TCG_TYPE_REG, args[0], a0); > - } > - break; > - > -#if TCG_TARGET_REG_BITS == 64 > - case INDEX_op_sub2_i64: > -#else > - case INDEX_op_sub2_i32: > -#endif > - a0 = args[0], a1 = args[1]; > - if (a0 == args[5] || (!const_args[3] && a0 == args[3])) { > - a0 = TCG_REG_R0; > - } > - if (const_args[2]) { > - tcg_out32(s, SUBFIC | TAI(a0, args[4], args[2])); > - } else { > - tcg_out32(s, SUBFC | TAB(a0, args[4], args[2])); > - } > - if (const_args[3]) { > - tcg_out32(s, (args[3] ? SUBFME : SUBFZE) | RT(a1) | RA(args[5])); > - } else { > - tcg_out32(s, SUBFE | TAB(a1, args[5], args[3])); > - } > - if (a0 != args[0]) { > - tcg_out_mov(s, TCG_TYPE_REG, args[0], a0); > - } > - break; > - > case INDEX_op_mb: > tcg_out_mb(s, args[0]); > break; > @@ -4456,13 +4403,6 @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) > case INDEX_op_st_i64: > return C_O0_I2(r, r); > > - case INDEX_op_add2_i64: > - case INDEX_op_add2_i32: > - return C_O2_I4(r, r, r, r, rI, rZM); > - case INDEX_op_sub2_i64: > - case INDEX_op_sub2_i32: > - return C_O2_I4(r, r, rI, rZM, r, r); > - > case INDEX_op_qemu_ld_i32: > return C_O1_I1(r, r); > case INDEX_op_qemu_ld_i64: Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
diff --git a/tcg/ppc/tcg-target-con-set.h b/tcg/ppc/tcg-target-con-set.h index 9ea26c40ae..da7a383bff 100644 --- a/tcg/ppc/tcg-target-con-set.h +++ b/tcg/ppc/tcg-target-con-set.h @@ -41,5 +41,3 @@ C_O1_I4(r, r, r, rU, rC) C_O2_I1(r, r, r) C_N1O1_I1(o, m, r) C_O2_I2(r, r, r, r) -C_O2_I4(r, r, rI, rZM, r, r) -C_O2_I4(r, r, r, r, rI, rZM) diff --git a/tcg/ppc/tcg-target-has.h b/tcg/ppc/tcg-target-has.h index 8d832ce99c..4dda668706 100644 --- a/tcg/ppc/tcg-target-has.h +++ b/tcg/ppc/tcg-target-has.h @@ -18,16 +18,13 @@ /* optional instructions */ #define TCG_TARGET_HAS_qemu_st8_i32 0 - -#if TCG_TARGET_REG_BITS == 64 #define TCG_TARGET_HAS_add2_i32 0 #define TCG_TARGET_HAS_sub2_i32 0 + +#if TCG_TARGET_REG_BITS == 64 #define TCG_TARGET_HAS_extr_i64_i32 0 -#define TCG_TARGET_HAS_add2_i64 1 -#define TCG_TARGET_HAS_sub2_i64 1 -#else -#define TCG_TARGET_HAS_add2_i32 1 -#define TCG_TARGET_HAS_sub2_i32 1 +#define TCG_TARGET_HAS_add2_i64 0 +#define TCG_TARGET_HAS_sub2_i64 0 #endif #define TCG_TARGET_HAS_qemu_ldst_i128 \ diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc index 0b151db0e4..91df9610ec 100644 --- a/tcg/ppc/tcg-target.c.inc +++ b/tcg/ppc/tcg-target.c.inc @@ -3663,8 +3663,6 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, const TCGArg args[TCG_MAX_OP_ARGS], const int const_args[TCG_MAX_OP_ARGS]) { - TCGArg a0, a1; - switch (opc) { case INDEX_op_goto_ptr: tcg_out32(s, MTSPR | RS(args[0]) | CTR); @@ -3760,57 +3758,6 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, tcg_out_qemu_ldst_i128(s, args[0], args[1], args[2], args[3], false); break; -#if TCG_TARGET_REG_BITS == 64 - case INDEX_op_add2_i64: -#else - case INDEX_op_add2_i32: -#endif - /* Note that the CA bit is defined based on the word size of the - environment. So in 64-bit mode it's always carry-out of bit 63. - The fallback code using deposit works just as well for 32-bit. */ - a0 = args[0], a1 = args[1]; - if (a0 == args[3] || (!const_args[5] && a0 == args[5])) { - a0 = TCG_REG_R0; - } - if (const_args[4]) { - tcg_out32(s, ADDIC | TAI(a0, args[2], args[4])); - } else { - tcg_out32(s, ADDC | TAB(a0, args[2], args[4])); - } - if (const_args[5]) { - tcg_out32(s, (args[5] ? ADDME : ADDZE) | RT(a1) | RA(args[3])); - } else { - tcg_out32(s, ADDE | TAB(a1, args[3], args[5])); - } - if (a0 != args[0]) { - tcg_out_mov(s, TCG_TYPE_REG, args[0], a0); - } - break; - -#if TCG_TARGET_REG_BITS == 64 - case INDEX_op_sub2_i64: -#else - case INDEX_op_sub2_i32: -#endif - a0 = args[0], a1 = args[1]; - if (a0 == args[5] || (!const_args[3] && a0 == args[3])) { - a0 = TCG_REG_R0; - } - if (const_args[2]) { - tcg_out32(s, SUBFIC | TAI(a0, args[4], args[2])); - } else { - tcg_out32(s, SUBFC | TAB(a0, args[4], args[2])); - } - if (const_args[3]) { - tcg_out32(s, (args[3] ? SUBFME : SUBFZE) | RT(a1) | RA(args[5])); - } else { - tcg_out32(s, SUBFE | TAB(a1, args[5], args[3])); - } - if (a0 != args[0]) { - tcg_out_mov(s, TCG_TYPE_REG, args[0], a0); - } - break; - case INDEX_op_mb: tcg_out_mb(s, args[0]); break; @@ -4456,13 +4403,6 @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) case INDEX_op_st_i64: return C_O0_I2(r, r); - case INDEX_op_add2_i64: - case INDEX_op_add2_i32: - return C_O2_I4(r, r, r, r, rI, rZM); - case INDEX_op_sub2_i64: - case INDEX_op_sub2_i32: - return C_O2_I4(r, r, rI, rZM, r, r); - case INDEX_op_qemu_ld_i32: return C_O1_I1(r, r); case INDEX_op_qemu_ld_i64:
We have replaced this with support for add/sub carry. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- tcg/ppc/tcg-target-con-set.h | 2 -- tcg/ppc/tcg-target-has.h | 11 +++---- tcg/ppc/tcg-target.c.inc | 60 ------------------------------------ 3 files changed, 4 insertions(+), 69 deletions(-)