Kewen,
  Thanks so much for your advice. Just one question about effective-target.

  For the test cases, it needs both power10_ok and int128 support. I saw some
existing test cases have these two checks as well. But I wonder if power10_ok
already covers int128 on powerpc targets? Can we save one check then?

On 26/5/2022 上午 11:22, Kewen.Lin wrote:
> 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 <guih...@linux.ibm.com>
>>
>> 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

Reply via email to