1 /* { dg-do run { target { powerpc*-*-linux* && lp64 } } } */
2 /* { dg-require-effective-target vsx_hw } */
3 /* { dg-options "-O2 -mvsx" } */
4 
5 #include <stdlib.h>
6 #include <stddef.h>
7 #include <altivec.h>
8 
9 #define ELEMENTS -12345678L, 9L
10 #define SPLAT 0x0123456789ABCDE
11 
12 vector long sv = (vector long) { ELEMENTS };
13 vector long splat = (vector long) { SPLAT, SPLAT };
14 vector long sv_global, sp_global;
15 static vector long sv_static, sp_static;
16 static const int expected[] = { ELEMENTS };
17 
18 extern void check (vector long a)
19   __attribute__((__noinline__));
20 
21 extern void check_splat (vector long a)
22   __attribute__((__noinline__));
23 
24 extern vector long pack_reg (long a, long b)
25   __attribute__((__noinline__));
26 
27 extern vector long pack_from_ptr (long *p_a, long *p_b)
28   __attribute__((__noinline__));
29 
30 extern vector long pack_const (void)
31   __attribute__((__noinline__));
32 
33 extern void pack_ptr (vector long *p, long a, long b)
34   __attribute__((__noinline__));
35 
36 extern void pack_static (long a, long b)
37   __attribute__((__noinline__));
38 
39 extern void pack_global (long a, long b)
40   __attribute__((__noinline__));
41 
42 extern vector long splat_reg (long a)
43   __attribute__((__noinline__));
44 
45 extern vector long splat_from_ptr (long *p)
46   __attribute__((__noinline__));
47 
48 extern vector long splat_const (void)
49   __attribute__((__noinline__));
50 
51 extern void splat_ptr (vector long *p, long a)
52   __attribute__((__noinline__));
53 
54 extern void splat_static (long a)
55   __attribute__((__noinline__));
56 
57 extern void splat_global (long a)
58   __attribute__((__noinline__));
59 
60 void
check(vector long a)61 check (vector long a)
62 {
63   size_t i;
64 
65   for (i = 0; i < 2; i++)
66     if (vec_extract (a, i) != expected[i])
67       abort ();
68 }
69 
70 void
check_splat(vector long a)71 check_splat (vector long a)
72 {
73   size_t i;
74 
75   for (i = 0; i < 2; i++)
76     if (vec_extract (a, i) != SPLAT)
77       abort ();
78 }
79 
80 vector long
pack_reg(long a,long b)81 pack_reg (long a, long b)
82 {
83   return (vector long) { a, b };
84 }
85 
86 vector long
pack_from_ptr(long * p_a,long * p_b)87 pack_from_ptr (long *p_a, long *p_b)
88 {
89   return (vector long) { *p_a, *p_b };
90 }
91 
92 vector long
pack_const(void)93 pack_const (void)
94 {
95   return (vector long) { ELEMENTS };
96 }
97 
98 void
pack_ptr(vector long * p,long a,long b)99 pack_ptr (vector long *p, long a, long b)
100 {
101   *p = (vector long) { a, b };
102 }
103 
104 void
pack_static(long a,long b)105 pack_static (long a, long b)
106 {
107   sv_static = (vector long) { a, b };
108 }
109 
110 void
pack_global(long a,long b)111 pack_global (long a, long b)
112 {
113   sv_global = (vector long) { a, b };
114 }
115 
116 vector long
splat_reg(long a)117 splat_reg (long a)
118 {
119   return (vector long) { a, a };
120 }
121 
122 vector long
splat_from_ptr(long * p)123 splat_from_ptr (long *p)
124 {
125   return (vector long) { *p, *p };
126 }
127 
128 vector long
splat_const(void)129 splat_const (void)
130 {
131   return (vector long) { SPLAT, SPLAT };
132 }
133 
134 void
splat_ptr(vector long * p,long a)135 splat_ptr (vector long *p, long a)
136 {
137   *p = (vector long) { a, a };
138 }
139 
140 void
splat_static(long a)141 splat_static (long a)
142 {
143   sp_static = (vector long) { a, a };
144 }
145 
146 void
splat_global(long a)147 splat_global (long a)
148 {
149   sp_global = (vector long) { a, a };
150 }
151 
main(void)152 int  main (void)
153 {
154   vector long sv2, sv3;
155   long mem = SPLAT;
156   long mem2[2] = { ELEMENTS };
157 
158   check (sv);
159 
160   check (pack_reg (ELEMENTS));
161 
162   check (pack_from_ptr (&mem2[0], &mem2[1]));
163 
164   check (pack_const ());
165 
166   pack_ptr (&sv2, ELEMENTS);
167   check (sv2);
168 
169   pack_static (ELEMENTS);
170   check (sv_static);
171 
172   pack_global (ELEMENTS);
173   check (sv_global);
174 
175   check_splat (splat);
176 
177   check_splat (splat_reg (SPLAT));
178 
179   check_splat (splat_from_ptr (&mem));
180 
181   check_splat (splat_const ());
182 
183   splat_ptr (&sv2, SPLAT);
184   check_splat (sv2);
185 
186   splat_static (SPLAT);
187   check_splat (sp_static);
188 
189   splat_global (SPLAT);
190   check_splat (sp_global);
191 
192   return 0;
193 }
194