Hi Haochen,
on 2022/5/24 16:45, HAO CHEN GUI wrote:
> Hi,
> This patch adds V1TI mode into a new mode iterator used in vector
> comparison and rotation expands. Without the patch, the comparisons
> between two vector __int128 are converted to scalar comparisons. The
> code is suboptimal. The patch fixes the issue. Now all comparisons
> between two vector __int128 generates P10 new comparison instructions.
> Also the relative built-ins generate the same instructions after gimple
> folding. So they're added back to the list.
>
> This patch also merges some vector comparison and rotation expands
> for V1T1 and other vector integer modes as they have the same patterns.
> The expands for V1TI only are removed.
>
> Bootstrapped and tested on ppc64 Linux BE and LE with no regressions.
> Is this okay for trunk? Any recommendations? Thanks a lot.
>
> ChangeLog
> 2022-05-24 Haochen Gui <[email protected]>
>
> gcc/
> PR target/103316
> * config/rs6000/rs6000-builtin.cc (rs6000_gimple_fold_builtin): Enable
> gimple folding for RS6000_BIF_VCMPEQUT, RS6000_BIF_VCMPNET,
> RS6000_BIF_CMPGE_1TI, RS6000_BIF_CMPGE_U1TI, RS6000_BIF_VCMPGTUT,
> RS6000_BIF_VCMPGTST, RS6000_BIF_CMPLE_1TI, RS6000_BIF_CMPLE_U1TI.
> * config/rs6000/vector.md (VEC_IC): Define. Add support for new Power10
> V1TI instructions.
Nit: Maybe "New mode iterator" is better than "Define".
> (vec_cmp<mode><mode>): Set mode iterator to VEC_IC.
> (vec_cmpu<mode><mode>): Likewise.
> (vector_nlt<mode>): Set mode iterator to VEC_IC.
> (vector_nltv1ti): Remove.
> (vector_gtu<mode>): Set mode iterator to VEC_IC.
> (vector_gtuv1ti): Remove.
> (vector_nltu<mode>): Set mode iterator to VEC_IC.
> (vector_nltuv1ti): Remove.
> (vector_geu<mode>): Set mode iterator to VEC_IC.
> (vector_ngt<mode>): Likewise.
> (vector_ngtv1ti): Remove.
> (vector_ngtu<mode>): Set mode iterator to VEC_IC.
> (vector_ngtuv1ti): Remove.
> (vector_gtu_<mode>_p): Set mode iterator to VEC_IC.
> (vector_gtu_v1ti_p): Remove.
> (vrotl<mode>3): Set mode iterator to VEC_IC. Emit insns for V1TI.
> (vrotlv1ti3): Remove.
> (vashr<mode>3): Set mode iterator to VEC_IC. Emit insns for V1TI.
> (vashrv1ti3): Remove.
>
> gcc/testsuite/
> PR target/103316
> * gcc.target/powerpc/pr103316.c: New.
> * gcc.target/powerpc/fold-vec-cmp-int128.c: New.
>
> patch.diff
> diff --git a/gcc/config/rs6000/rs6000-builtin.cc
> b/gcc/config/rs6000/rs6000-builtin.cc
> index e925ba9fad9..b67f4e066a8 100644
> --- a/gcc/config/rs6000/rs6000-builtin.cc
> +++ b/gcc/config/rs6000/rs6000-builtin.cc
> @@ -2000,16 +2000,14 @@ rs6000_gimple_fold_builtin (gimple_stmt_iterator *gsi)
> case RS6000_BIF_VCMPEQUH:
> case RS6000_BIF_VCMPEQUW:
> case RS6000_BIF_VCMPEQUD:
> - /* We deliberately omit RS6000_BIF_VCMPEQUT for now, because gimple
> - folding produces worse code for 128-bit compares. */
> + case RS6000_BIF_VCMPEQUT:
> fold_compare_helper (gsi, EQ_EXPR, stmt);
> return true;
>
> case RS6000_BIF_VCMPNEB:
> case RS6000_BIF_VCMPNEH:
> case RS6000_BIF_VCMPNEW:
> - /* We deliberately omit RS6000_BIF_VCMPNET for now, because gimple
> - folding produces worse code for 128-bit compares. */
> + case RS6000_BIF_VCMPNET:
> fold_compare_helper (gsi, NE_EXPR, stmt);
> return true;
>
> @@ -2021,9 +2019,8 @@ rs6000_gimple_fold_builtin (gimple_stmt_iterator *gsi)
> case RS6000_BIF_CMPGE_U4SI:
> case RS6000_BIF_CMPGE_2DI:
> case RS6000_BIF_CMPGE_U2DI:
> - /* We deliberately omit RS6000_BIF_CMPGE_1TI and RS6000_BIF_CMPGE_U1TI
> - for now, because gimple folding produces worse code for 128-bit
> - compares. */
> + case RS6000_BIF_CMPGE_1TI:
> + case RS6000_BIF_CMPGE_U1TI:
> fold_compare_helper (gsi, GE_EXPR, stmt);
> return true;
>
> @@ -2035,9 +2032,8 @@ rs6000_gimple_fold_builtin (gimple_stmt_iterator *gsi)
> case RS6000_BIF_VCMPGTUW:
> case RS6000_BIF_VCMPGTUD:
> case RS6000_BIF_VCMPGTSD:
> - /* We deliberately omit RS6000_BIF_VCMPGTUT and RS6000_BIF_VCMPGTST
> - for now, because gimple folding produces worse code for 128-bit
> - compares. */
> + case RS6000_BIF_VCMPGTUT:
> + case RS6000_BIF_VCMPGTST:
> fold_compare_helper (gsi, GT_EXPR, stmt);
> return true;
>
> @@ -2049,9 +2045,8 @@ rs6000_gimple_fold_builtin (gimple_stmt_iterator *gsi)
> case RS6000_BIF_CMPLE_U4SI:
> case RS6000_BIF_CMPLE_2DI:
> case RS6000_BIF_CMPLE_U2DI:
> - /* We deliberately omit RS6000_BIF_CMPLE_1TI and RS6000_BIF_CMPLE_U1TI
> - for now, because gimple folding produces worse code for 128-bit
> - compares. */
> + case RS6000_BIF_CMPLE_1TI:
> + case RS6000_BIF_CMPLE_U1TI:
> fold_compare_helper (gsi, LE_EXPR, stmt);
> return true;
>
> diff --git a/gcc/config/rs6000/vector.md b/gcc/config/rs6000/vector.md
> index 4d0797c48f8..3b7a272994f 100644
> --- a/gcc/config/rs6000/vector.md
> +++ b/gcc/config/rs6000/vector.md
> @@ -26,6 +26,9 @@
> ;; Vector int modes
> (define_mode_iterator VEC_I [V16QI V8HI V4SI V2DI])
>
> +;; Vector int modes for comparison
Nit: This comment line doesn't perfectly match the usage below since it's also
used for shift and rotation in this patch. Maybe it's better with:
"Vector int modes for comparison, shift and rotation"
> +(define_mode_iterator VEC_IC [V16QI V8HI V4SI V2DI (V1TI "TARGET_POWER10")])
> +
> ;; 128-bit int modes
> (define_mode_iterator VEC_TI [V1TI TI])
>
> @@ -533,10 +536,10 @@ (define_expand "vcond_mask_<mode><VEC_int>"
>
> ;; For signed integer vectors comparison.
> (define_expand "vec_cmp<mode><mode>"
> - [(set (match_operand:VEC_I 0 "vint_operand")
> + [(set (match_operand:VEC_IC 0 "vint_operand")
> (match_operator 1 "signed_or_equality_comparison_operator"
> - [(match_operand:VEC_I 2 "vint_operand")
> - (match_operand:VEC_I 3 "vint_operand")]))]
> + [(match_operand:VEC_IC 2 "vint_operand")
> + (match_operand:VEC_IC 3 "vint_operand")]))]
> "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
> {
> enum rtx_code code = GET_CODE (operands[1]);
> @@ -573,10 +576,10 @@ (define_expand "vec_cmp<mode><mode>"
>
> ;; For unsigned integer vectors comparison.
> (define_expand "vec_cmpu<mode><mode>"
> - [(set (match_operand:VEC_I 0 "vint_operand")
> + [(set (match_operand:VEC_IC 0 "vint_operand")
> (match_operator 1 "unsigned_or_equality_comparison_operator"
> - [(match_operand:VEC_I 2 "vint_operand")
> - (match_operand:VEC_I 3 "vint_operand")]))]
> + [(match_operand:VEC_IC 2 "vint_operand")
> + (match_operand:VEC_IC 3 "vint_operand")]))]
> "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
> {
> enum rtx_code code = GET_CODE (operands[1]);
> @@ -690,116 +693,65 @@ (define_expand "vector_gt<mode>"
>
> ; >= for integer vectors: swap operands and apply not-greater-than
> (define_expand "vector_nlt<mode>"
> - [(set (match_operand:VEC_I 3 "vlogical_operand")
> - (gt:VEC_I (match_operand:VEC_I 2 "vlogical_operand")
> - (match_operand:VEC_I 1 "vlogical_operand")))
> - (set (match_operand:VEC_I 0 "vlogical_operand")
> - (not:VEC_I (match_dup 3)))]
> + [(set (match_operand:VEC_IC 3 "vlogical_operand")
> + (gt:VEC_IC (match_operand:VEC_IC 2 "vlogical_operand")
> + (match_operand:VEC_IC 1 "vlogical_operand")))
> + (set (match_operand:VEC_IC 0 "vlogical_operand")
> + (not:VEC_IC (match_dup 3)))]
> "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
> {
> operands[3] = gen_reg_rtx_and_attrs (operands[0]);
> })
>
> -(define_expand "vector_nltv1ti"
> - [(set (match_operand:V1TI 3 "vlogical_operand")
> - (gt:V1TI (match_operand:V1TI 2 "vlogical_operand")
> - (match_operand:V1TI 1 "vlogical_operand")))
> - (set (match_operand:V1TI 0 "vlogical_operand")
> - (not:V1TI (match_dup 3)))]
> - "TARGET_POWER10"
> -{
> - operands[3] = gen_reg_rtx_and_attrs (operands[0]);
> -})
> -
> (define_expand "vector_gtu<mode>"
> - [(set (match_operand:VEC_I 0 "vint_operand")
> - (gtu:VEC_I (match_operand:VEC_I 1 "vint_operand")
> - (match_operand:VEC_I 2 "vint_operand")))]
> + [(set (match_operand:VEC_IC 0 "vint_operand")
> + (gtu:VEC_IC (match_operand:VEC_IC 1 "vint_operand")
> + (match_operand:VEC_IC 2 "vint_operand")))]
> "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
> "")
>
> -(define_expand "vector_gtuv1ti"
> - [(set (match_operand:V1TI 0 "altivec_register_operand")
> - (gtu:V1TI (match_operand:V1TI 1 "altivec_register_operand")
> - (match_operand:V1TI 2 "altivec_register_operand")))]
> - "TARGET_POWER10"
> - "")
> -
> ; >= for integer vectors: swap operands and apply not-greater-than
> (define_expand "vector_nltu<mode>"
> - [(set (match_operand:VEC_I 3 "vlogical_operand")
> - (gtu:VEC_I (match_operand:VEC_I 2 "vlogical_operand")
> - (match_operand:VEC_I 1 "vlogical_operand")))
> - (set (match_operand:VEC_I 0 "vlogical_operand")
> - (not:VEC_I (match_dup 3)))]
> + [(set (match_operand:VEC_IC 3 "vlogical_operand")
> + (gtu:VEC_IC (match_operand:VEC_IC 2 "vlogical_operand")
> + (match_operand:VEC_IC 1 "vlogical_operand")))
> + (set (match_operand:VEC_IC 0 "vlogical_operand")
> + (not:VEC_IC (match_dup 3)))]
> "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
> {
> operands[3] = gen_reg_rtx_and_attrs (operands[0]);
> })
>
> -(define_expand "vector_nltuv1ti"
> - [(set (match_operand:V1TI 3 "vlogical_operand")
> - (gtu:V1TI (match_operand:V1TI 2 "vlogical_operand")
> - (match_operand:V1TI 1 "vlogical_operand")))
> - (set (match_operand:V1TI 0 "vlogical_operand")
> - (not:V1TI (match_dup 3)))]
> - "TARGET_POWER10"
> -{
> - operands[3] = gen_reg_rtx_and_attrs (operands[0]);
> -})
> -
> (define_expand "vector_geu<mode>"
> - [(set (match_operand:VEC_I 0 "vint_operand")
> - (geu:VEC_I (match_operand:VEC_I 1 "vint_operand")
> - (match_operand:VEC_I 2 "vint_operand")))]
> + [(set (match_operand:VEC_IC 0 "vint_operand")
> + (geu:VEC_IC (match_operand:VEC_IC 1 "vint_operand")
> + (match_operand:VEC_IC 2 "vint_operand")))]
> "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
> "")
>
> ; <= for integer vectors: apply not-greater-than
> (define_expand "vector_ngt<mode>"
> - [(set (match_operand:VEC_I 3 "vlogical_operand")
> - (gt:VEC_I (match_operand:VEC_I 1 "vlogical_operand")
> - (match_operand:VEC_I 2 "vlogical_operand")))
> - (set (match_operand:VEC_I 0 "vlogical_operand")
> - (not:VEC_I (match_dup 3)))]
> + [(set (match_operand:VEC_IC 3 "vlogical_operand")
> + (gt:VEC_IC (match_operand:VEC_IC 1 "vlogical_operand")
> + (match_operand:VEC_IC 2 "vlogical_operand")))
> + (set (match_operand:VEC_IC 0 "vlogical_operand")
> + (not:VEC_IC (match_dup 3)))]
> "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
> {
> operands[3] = gen_reg_rtx_and_attrs (operands[0]);
> })
>
> -(define_expand "vector_ngtv1ti"
> - [(set (match_operand:V1TI 3 "vlogical_operand")
> - (gt:V1TI (match_operand:V1TI 1 "vlogical_operand")
> - (match_operand:V1TI 2 "vlogical_operand")))
> - (set (match_operand:V1TI 0 "vlogical_operand")
> - (not:V1TI (match_dup 3)))]
> - "TARGET_POWER10"
> -{
> - operands[3] = gen_reg_rtx_and_attrs (operands[0]);
> -})
> -
> (define_expand "vector_ngtu<mode>"
> - [(set (match_operand:VEC_I 3 "vlogical_operand")
> - (gtu:VEC_I (match_operand:VEC_I 1 "vlogical_operand")
> - (match_operand:VEC_I 2 "vlogical_operand")))
> - (set (match_operand:VEC_I 0 "vlogical_operand")
> - (not:VEC_I (match_dup 3)))]
> + [(set (match_operand:VEC_IC 3 "vlogical_operand")
> + (gtu:VEC_IC (match_operand:VEC_IC 1 "vlogical_operand")
> + (match_operand:VEC_IC 2 "vlogical_operand")))
> + (set (match_operand:VEC_IC 0 "vlogical_operand")
> + (not:VEC_IC (match_dup 3)))]
> "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
> {
> operands[3] = gen_reg_rtx_and_attrs (operands[0]);
> })
>
> -(define_expand "vector_ngtuv1ti"
> - [(set (match_operand:V1TI 3 "vlogical_operand")
> - (gtu:V1TI (match_operand:V1TI 1 "vlogical_operand")
> - (match_operand:V1TI 2 "vlogical_operand")))
> - (set (match_operand:V1TI 0 "vlogical_operand")
> - (not:V1TI (match_dup 3)))]
> - "TARGET_POWER10"
> -{
> - operands[3] = gen_reg_rtx_and_attrs (operands[0]);
> -})
> -
> ; There are 14 possible vector FP comparison operators, gt and eq of them
> have
> ; been expanded above, so just support 12 remaining operators here.
>
> @@ -1189,27 +1141,15 @@ (define_expand "vector_ge_<mode>_p"
> (define_expand "vector_gtu_<mode>_p"
> [(parallel
> [(set (reg:CC CR6_REGNO)
> - (unspec:CC [(gtu:CC (match_operand:VEC_I 1 "vint_operand")
> - (match_operand:VEC_I 2 "vint_operand"))]
> + (unspec:CC [(gtu:CC (match_operand:VEC_IC 1 "vint_operand")
> + (match_operand:VEC_IC 2 "vint_operand"))]
> UNSPEC_PREDICATE))
> - (set (match_operand:VEC_I 0 "vlogical_operand")
> - (gtu:VEC_I (match_dup 1)
> - (match_dup 2)))])]
> + (set (match_operand:VEC_IC 0 "vlogical_operand")
> + (gtu:VEC_IC (match_dup 1)
> + (match_dup 2)))])]
> "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
> "")
>
> -(define_expand "vector_gtu_v1ti_p"
> - [(parallel
> - [(set (reg:CC CR6_REGNO)
> - (unspec:CC [(gtu:CC (match_operand:V1TI 1 "altivec_register_operand")
> - (match_operand:V1TI 2
> "altivec_register_operand"))]
> - UNSPEC_PREDICATE))
> - (set (match_operand:V1TI 0 "altivec_register_operand")
> - (gtu:V1TI (match_dup 1)
> - (match_dup 2)))])]
> - "TARGET_POWER10"
> - "")
> -
> ;; AltiVec/VSX predicates.
>
> ;; This expansion is triggered during expansion of predicate built-in
> @@ -1582,25 +1522,21 @@ (define_expand "vec_shr_<mode>"
>
> ;; Expanders for rotate each element in a vector
> (define_expand "vrotl<mode>3"
> - [(set (match_operand:VEC_I 0 "vint_operand")
> - (rotate:VEC_I (match_operand:VEC_I 1 "vint_operand")
> - (match_operand:VEC_I 2 "vint_operand")))]
> + [(set (match_operand:VEC_IC 0 "vint_operand")
> + (rotate:VEC_IC (match_operand:VEC_IC 1 "vint_operand")
> + (match_operand:VEC_IC 2 "vint_operand")))]
> "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
> - "")
> -
> -(define_expand "vrotlv1ti3"
> - [(set (match_operand:V1TI 0 "vsx_register_operand" "=v")
> - (rotate:V1TI (match_operand:V1TI 1 "vsx_register_operand" "v")
> - (match_operand:V1TI 2 "vsx_register_operand" "v")))]
> - "TARGET_POWER10"
> {
> - /* Shift amount in needs to be put in bits[57:63] of 128-bit operand2. */
> - rtx tmp = gen_reg_rtx (V1TImode);
> + /* Shift amount in needs to be put in bits[57:63] of 128-bit operand2. */
> + if (<MODE>mode == V1TImode)
> + {
> + rtx tmp = gen_reg_rtx (V1TImode);
>
> - emit_insn (gen_xxswapd_v1ti (tmp, operands[2]));
> - emit_insn (gen_altivec_vrlq (operands[0], operands[1], tmp));
> - DONE;
> -})
> + emit_insn (gen_xxswapd_v1ti (tmp, operands[2]));
> + emit_insn (gen_altivec_vrlq (operands[0], operands[1], tmp));
> + DONE;
> + }
> + })
>
> ;; Expanders for rotatert to make use of vrotl
> (define_expand "vrotr<mode>3"
> @@ -1663,25 +1599,20 @@ (define_expand "vlshr<mode>3"
>
> ;; Expanders for arithmetic shift right on each vector element
> (define_expand "vashr<mode>3"
> - [(set (match_operand:VEC_I 0 "vint_operand")
> - (ashiftrt:VEC_I (match_operand:VEC_I 1 "vint_operand")
> - (match_operand:VEC_I 2 "vint_operand")))]
> + [(set (match_operand:VEC_IC 0 "vint_operand")
> + (ashiftrt:VEC_IC (match_operand:VEC_IC 1 "vint_operand")
> + (match_operand:VEC_IC 2 "vint_operand")))]
> "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
> - "")
> -
> -;; No immediate version of this 128-bit instruction
> -(define_expand "vashrv1ti3"
> - [(set (match_operand:V1TI 0 "vsx_register_operand" "=v")
> - (ashiftrt:V1TI (match_operand:V1TI 1 "vsx_register_operand" "v")
> - (match_operand:V1TI 2 "vsx_register_operand" "v")))]
> - "TARGET_POWER10"
> {
> - /* Shift amount in needs to be put into bits[57:63] of 128-bit operand2. */
> - rtx tmp = gen_reg_rtx (V1TImode);
> + /* Shift amount in needs to be put in bits[57:63] of 128-bit operand2. */
> + if (<MODE>mode == V1TImode)
> + {
> + rtx tmp = gen_reg_rtx (V1TImode);
>
> - emit_insn (gen_xxswapd_v1ti (tmp, operands[2]));
> - emit_insn (gen_altivec_vsraq (operands[0], operands[1], tmp));
> - DONE;
> + emit_insn (gen_xxswapd_v1ti (tmp, operands[2]));
> + emit_insn (gen_altivec_vsraq (operands[0], operands[1], tmp));
> + DONE;
> + }
> })
>
>
> diff --git a/gcc/testsuite/gcc.target/powerpc/fold-vec-cmp-int128.c
> b/gcc/testsuite/gcc.target/powerpc/fold-vec-cmp-int128.c
> new file mode 100644
> index 00000000000..1a4db0f45d4
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/fold-vec-cmp-int128.c
> @@ -0,0 +1,86 @@
> +/* Verify that overloaded built-ins for vec_cmp with __int128
> + inputs produce the right code. */
> +
> +/* { dg-do compile } */
Need /* { dg-require-effective-target int128 } */
> +/* { dg-require-effective-target power10_ok } */
> +/* { dg-options "-mdejagnu-cpu=power10 -O2" } */
> +
> +#include <altivec.h>
> +
> +vector bool __int128
> +test3_eq (vector signed __int128 x, vector signed __int128 y)
> +{
> + return vec_cmpeq (x, y);
> +}
> +
> +vector bool __int128
> +test6_eq (vector unsigned __int128 x, vector unsigned __int128 y)
> +{
> + return vec_cmpeq (x, y);
> +}
> +
Nit: The function names test6 and test3 seems copied from other cases somewhere.
Maybe it's more meaningful with s/3// (or s/3/s/) and s/6/u/.
> +vector bool __int128
> +test3_ge (vector signed __int128 x, vector signed __int128 y)
> +{
> + return vec_cmpge (x, y);
> +}
> +
> +vector bool __int128
> +test6_ge (vector unsigned __int128 x, vector unsigned __int128 y)
> +{
> + return vec_cmpge (x, y);
> +}
> +
> +vector bool __int128
> +test3_gt (vector signed __int128 x, vector signed __int128 y)
> +{
> + return vec_cmpgt (x, y);
> +}
> +
> +vector bool __int128
> +test6_gt (vector unsigned __int128 x, vector unsigned __int128 y)
> +{
> + return vec_cmpgt (x, y);
> +}
> +
> +vector bool __int128
> +test3_le (vector signed __int128 x, vector signed __int128 y)
> +{
> + return vec_cmple (x, y);
> +}
> +
> +vector bool __int128
> +test6_le (vector unsigned __int128 x, vector unsigned __int128 y)
> +{
> + return vec_cmple (x, y);
> +}
> +
> +vector bool __int128
> +test3_lt (vector signed __int128 x, vector signed __int128 y)
> +{
> + return vec_cmplt (x, y);
> +}
> +
> +vector bool __int128
> +test6_lt (vector unsigned __int128 x, vector unsigned __int128 y)
> +{
> + return vec_cmplt (x, y);
> +}
> +
> +vector bool __int128
> +test3_ne (vector signed __int128 x, vector signed __int128 y)
> +{
> + return vec_cmpne (x, y);
> +}
> +
> +vector bool __int128
> +test6_ne (vector unsigned __int128 x, vector unsigned __int128 y)
> +{
> + return vec_cmpne (x, y);
> +}
> +
> +/* { dg-final { scan-assembler-times "vcmpequq" 4 } } */
> +/* { dg-final { scan-assembler-times "vcmpgtsq" 4 } } */
> +/* { dg-final { scan-assembler-times "vcmpgtuq" 4 } } */
> +/* { dg-final { scan-assembler-times "xxlnor" 6 } } */
> +
> diff --git a/gcc/testsuite/gcc.target/powerpc/pr103316.c
> b/gcc/testsuite/gcc.target/powerpc/pr103316.c
> new file mode 100644
> index 00000000000..02f7dc5ca1b
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/pr103316.c
> @@ -0,0 +1,80 @@
> +/* { dg-do compile } */
> +/* { dg-require-effective-target power10_ok } */
Need /* { dg-require-effective-target int128 } */ too.
BR,
Kewen