1 /* { dg-do compile { target { powerpc*-*-* } } } */
2 /* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
3 /* { dg-require-effective-target powerpc_p8vector_ok } */
4 /* { dg-options "-mcpu=power8 -O3 -ftree-vectorize -fvect-cost-model" } */
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_sign a,vll_sign b)35 vi_sign vi_pack_3 (vll_sign a, vll_sign b)
36 {
37   return vec_vpkudum (a, b);
38 }
39 
vs_pack_1(vi_sign a,vi_sign b)40 vs_sign vs_pack_1 (vi_sign a, vi_sign b)
41 {
42   return __builtin_altivec_vpkuwum (a, b);
43 }
44 
vs_pack_2(vi_sign a,vi_sign b)45 vs_sign vs_pack_2 (vi_sign a, vi_sign b)
46 {
47   return vec_pack (a, b);
48 }
49 
vs_pack_3(vi_sign a,vi_sign b)50 vs_sign vs_pack_3 (vi_sign a, vi_sign b)
51 {
52   return vec_vpkuwum (a, b);
53 }
54 
vc_pack_1(vs_sign a,vs_sign b)55 vc_sign vc_pack_1 (vs_sign a, vs_sign b)
56 {
57   return __builtin_altivec_vpkuhum (a, b);
58 }
59 
vc_pack_2(vs_sign a,vs_sign b)60 vc_sign vc_pack_2 (vs_sign a, vs_sign b)
61 {
62   return vec_pack (a, b);
63 }
64 
vc_pack_3(vs_sign a,vs_sign b)65 vc_sign vc_pack_3 (vs_sign a, vs_sign b)
66 {
67   return vec_vpkuhum (a, b);
68 }
69 
vll_unpack_hi_1(vi_sign a)70 vll_sign vll_unpack_hi_1 (vi_sign a)
71 {
72   return __builtin_altivec_vupkhsw (a);
73 }
74 
vll_unpack_hi_2(vi_sign a)75 vll_sign vll_unpack_hi_2 (vi_sign a)
76 {
77   return vec_unpackh (a);
78 }
79 
vll_unpack_hi_3(vi_sign a)80 vll_sign vll_unpack_hi_3 (vi_sign a)
81 {
82   return __builtin_vec_vupkhsw (a);
83 }
84 
vll_unpack_lo_1(vi_sign a)85 vll_sign vll_unpack_lo_1 (vi_sign a)
86 {
87   return vec_vupklsw (a);
88 }
89 
vll_unpack_lo_2(vi_sign a)90 vll_sign vll_unpack_lo_2 (vi_sign a)
91 {
92   return vec_unpackl (a);
93 }
94 
vll_unpack_lo_3(vi_sign a)95 vll_sign vll_unpack_lo_3 (vi_sign a)
96 {
97   return vec_vupklsw (a);
98 }
99 
100 /* { dg-final { scan-assembler-times "vpkudum" 3 } } */
101 /* { dg-final { scan-assembler-times "vpkuwum" 3 } } */
102 /* { dg-final { scan-assembler-times "vpkuhum" 3 } } */
103 /* { dg-final { scan-assembler-times "vupklsw" 3 } } */
104 /* { dg-final { scan-assembler-times "vupkhsw" 3 } } */
105