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 
vi_pack_1(vll_sign a,vll_sign b)25 vi_sign vi_pack_1 (vll_sign a, vll_sign b)
26 {
27   return __builtin_altivec_vpkudum (a, b);
28 }
29 
vi_pack_2(vll_sign a,vll_sign b)30 vi_sign vi_pack_2 (vll_sign a, vll_sign b)
31 {
32   return vec_pack (a, b);
33 }
34 
vi_pack_3(vll_uns a,vll_uns b)35 vi_uns vi_pack_3 (vll_uns a, vll_uns b)
36 {
37   return vec_pack (a, b);
38 }
39 
vi_pack_4(vll_sign a,vll_sign b)40 vi_sign vi_pack_4 (vll_sign a, vll_sign b)
41 {
42   return vec_vpkudum (a, b);
43 }
44 
vs_pack_1(vi_sign a,vi_sign b)45 vs_sign vs_pack_1 (vi_sign a, vi_sign b)
46 {
47   return __builtin_altivec_vpkuwum (a, b);
48 }
49 
vs_pack_2(vi_sign a,vi_sign b)50 vs_sign vs_pack_2 (vi_sign a, vi_sign b)
51 {
52   return vec_pack (a, b);
53 }
54 
vs_pack_3(vi_sign a,vi_sign b)55 vs_sign vs_pack_3 (vi_sign a, vi_sign b)
56 {
57   return vec_vpkuwum (a, b);
58 }
59 
vc_pack_1(vs_sign a,vs_sign b)60 vc_sign vc_pack_1 (vs_sign a, vs_sign b)
61 {
62   return __builtin_altivec_vpkuhum (a, b);
63 }
64 
vc_pack_2(vs_sign a,vs_sign b)65 vc_sign vc_pack_2 (vs_sign a, vs_sign b)
66 {
67   return vec_pack (a, b);
68 }
69 
vc_pack_3(vs_sign a,vs_sign b)70 vc_sign vc_pack_3 (vs_sign a, vs_sign b)
71 {
72   return vec_vpkuhum (a, b);
73 }
74 
vll_unpack_hi_1(vi_sign a)75 vll_sign vll_unpack_hi_1 (vi_sign a)
76 {
77   return __builtin_altivec_vupkhsw (a);
78 }
79 
vll_unpack_hi_2(vi_sign a)80 vll_sign vll_unpack_hi_2 (vi_sign a)
81 {
82   return vec_unpackh (a);
83 }
84 
vll_unpack_hi_3(vi_sign a)85 vll_sign vll_unpack_hi_3 (vi_sign a)
86 {
87   return __builtin_vec_vupkhsw (a);
88 }
89 
vll_unpack_lo_1(vi_sign a)90 vll_sign vll_unpack_lo_1 (vi_sign a)
91 {
92   return vec_vupklsw (a);
93 }
94 
vll_unpack_lo_2(vi_sign a)95 vll_sign vll_unpack_lo_2 (vi_sign a)
96 {
97   return vec_unpackl (a);
98 }
99 
vll_unpack_lo_3(vi_sign a)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 } } */
110