1  /* { dg-do compile } */
       2  /* { dg-skip-if "" { powerpc*-*-darwin* } } */
       3  /* { dg-require-effective-target powerpc_p8vector_ok } */
       4  /* { dg-require-effective-target int128 } */
       5  /* { dg-options "-mdejagnu-cpu=power8 -O3" } */
       6  
       7  #include <altivec.h>
       8  
       9  #ifndef TYPE
      10  #define TYPE vector __int128_t
      11  #endif
      12  
      13  TYPE
      14  do_addcuq (TYPE p, TYPE q)
      15  {
      16    return __builtin_vec_vaddcuq (p, q);
      17  }
      18  
      19  TYPE
      20  do_adduqm (TYPE p, TYPE q)
      21  {
      22    return __builtin_vec_add (p, q);
      23  }
      24  
      25  TYPE
      26  do_addeuqm (TYPE p, TYPE q, TYPE r)
      27  {
      28    return __builtin_vec_vaddeuqm (p, q, r);
      29  }
      30  
      31  TYPE
      32  do_addecuq (TYPE p, TYPE q, TYPE r)
      33  {
      34    return __builtin_vec_vaddecuq (p, q, r);
      35  }
      36  
      37  TYPE
      38  do_subeuqm (TYPE p, TYPE q, TYPE r)
      39  {
      40    return __builtin_vec_vsubeuqm (p, q, r);
      41  }
      42  
      43  TYPE
      44  do_subecuq (TYPE p, TYPE q, TYPE r)
      45  {
      46    return __builtin_vec_vsubecuq (p, q, r);
      47  }
      48  
      49  TYPE
      50  do_subcuq (TYPE p, TYPE q)
      51  {
      52    return __builtin_vec_vsubcuq (p, q);
      53  }
      54  
      55  TYPE
      56  do_subuqm (TYPE p, TYPE q)
      57  {
      58    return __builtin_vec_vsubuqm (p, q);
      59  }
      60  
      61  TYPE
      62  do_zero (void)
      63  {
      64    return (TYPE) { 0 };
      65  }
      66  
      67  TYPE
      68  do_minus_one (void)
      69  {
      70    return (TYPE) { -1 };
      71  }
      72  
      73  /* { dg-final { scan-assembler	   "vaddcuq"   } } */
      74  /* { dg-final { scan-assembler	   "vadduqm"   } } */
      75  /* { dg-final { scan-assembler	   "vaddecuq"  } } */
      76  /* { dg-final { scan-assembler	   "vaddeuqm"  } } */
      77  /* { dg-final { scan-assembler	   "vsubecuq"  } } */
      78  /* { dg-final { scan-assembler	   "vsubeuqm"  } } */
      79  /* { dg-final { scan-assembler	   "vsubcuq"   } } */
      80  /* { dg-final { scan-assembler	   "vsubuqm"   } } */
      81  /* { dg-final { scan-assembler-not "mtvsrd"    } } */
      82  /* { dg-final { scan-assembler-not "mfvsrd"    } } */
      83  /* { dg-final { scan-assembler-not "ori 2,2,0" } } */
      84  /* { dg-final { scan-assembler-not "xxpermdi"  } } */
      85  /* { dg-final { scan-assembler-not "stxvd2x"   } } */
      86  /* { dg-final { scan-assembler-not "stxvw4x"   } } */