1  /* { dg-do compile { target { powerpc*-*-* } } } */
       2  /* { dg-skip-if "" { powerpc*-*-darwin* } } */
       3  /* { dg-require-effective-target powerpc_p8vector_ok } */
       4  /* { dg-options "-mdejagnu-cpu=power8 -O3 -ftree-vectorize -fvect-cost-model=dynamic" } */
       5  
       6  #include <altivec.h>
       7  
       8  typedef vector long long		vll_sign;
       9  typedef vector unsigned long long	vll_uns;
      10  typedef vector bool long long		vll_bool;
      11  
      12  typedef vector int			vi_sign;
      13  typedef vector unsigned int		vi_uns;
      14  typedef vector bool int			vi_bool;
      15  
      16  typedef vector short			vs_sign;
      17  typedef vector unsigned short		vs_uns;
      18  typedef vector bool short		vs_bool;
      19  
      20  typedef vector signed char		vc_sign;
      21  typedef vector unsigned char		vc_uns;
      22  typedef vector bool char		vc_bool;
      23  
      24  
      25  vi_sign vi_pack_1 (vll_sign a, vll_sign b)
      26  {
      27    return __builtin_altivec_vpkudum (a, b);
      28  }
      29  
      30  vi_sign vi_pack_2 (vll_sign a, vll_sign b)
      31  {
      32    return vec_pack (a, b);
      33  }
      34  
      35  vi_uns vi_pack_3 (vll_uns a, vll_uns b)
      36  {
      37    return vec_pack (a, b);
      38  }
      39  
      40  vi_sign vi_pack_4 (vll_sign a, vll_sign b)
      41  {
      42    return vec_vpkudum (a, b);
      43  }
      44  
      45  vs_sign vs_pack_1 (vi_sign a, vi_sign b)
      46  {
      47    return __builtin_altivec_vpkuwum (a, b);
      48  }
      49  
      50  vs_sign vs_pack_2 (vi_sign a, vi_sign b)
      51  {
      52    return vec_pack (a, b);
      53  }
      54  
      55  vs_sign vs_pack_3 (vi_sign a, vi_sign b)
      56  {
      57    return vec_vpkuwum (a, b);
      58  }
      59  
      60  vc_sign vc_pack_1 (vs_sign a, vs_sign b)
      61  {
      62    return __builtin_altivec_vpkuhum (a, b);
      63  }
      64  
      65  vc_sign vc_pack_2 (vs_sign a, vs_sign b)
      66  {
      67    return vec_pack (a, b);
      68  }
      69  
      70  vc_sign vc_pack_3 (vs_sign a, vs_sign b)
      71  {
      72    return vec_vpkuhum (a, b);
      73  }
      74  
      75  vll_sign vll_unpack_hi_1 (vi_sign a)
      76  {
      77    return __builtin_altivec_vupkhsw (a);
      78  }
      79  
      80  vll_sign vll_unpack_hi_2 (vi_sign a)
      81  {
      82    return vec_unpackh (a);
      83  }
      84  
      85  vll_sign vll_unpack_hi_3 (vi_sign a)
      86  {
      87    return __builtin_vec_vupkhsw (a);
      88  }
      89  
      90  vll_sign vll_unpack_lo_1 (vi_sign a)
      91  {
      92    return vec_vupklsw (a);
      93  }
      94  
      95  vll_sign vll_unpack_lo_2 (vi_sign a)
      96  {
      97    return vec_unpackl (a);
      98  }
      99  
     100  vll_sign vll_unpack_lo_3 (vi_sign a)
     101  {
     102    return vec_vupklsw (a);
     103  }
     104  
     105  /* { dg-final { scan-assembler-times "vpkudum" 4 } } */
     106  /* { dg-final { scan-assembler-times "vpkuwum" 3 } } */
     107  /* { dg-final { scan-assembler-times "vpkuhum" 3 } } */
     108  /* { dg-final { scan-assembler-times "vupklsw" 3 } } */
     109  /* { dg-final { scan-assembler-times "vupkhsw" 3 } } */