[committed] Fix previously latent bug in reorg affecting cris port
[official-gcc.git] / gcc / testsuite / gcc.target / powerpc / vec-init-8.c
blobd3c2a33eb4981e554e361eacc7596bb2705fa23a
1 /* { dg-do run } */
2 /* { dg-require-effective-target vsx_hw } */
3 /* { dg-options "-O2 -mvsx" } */
5 #include <stdlib.h>
6 #include <stddef.h>
7 #include <altivec.h>
9 #define ELEMENTS -1.0f, 2.0f, 0.0f, -1234.0f
10 #define SPLAT 2345.0f
12 vector float sv = (vector float) { ELEMENTS };
13 vector float splat = (vector float) { SPLAT, SPLAT, SPLAT, SPLAT };
14 vector float sv_global, sp_global;
15 static vector float sv_static, sp_static;
16 static const float expected[] = { ELEMENTS };
18 extern void check (vector float a)
19 __attribute__((__noinline__));
21 extern void check_splat (vector float a)
22 __attribute__((__noinline__));
24 extern vector float pack_reg (float a, float b, float c, float d)
25 __attribute__((__noinline__));
27 extern vector float pack_from_ptr (float *p_a, float *p_b,
28 float *p_c, float *p_d)
29 __attribute__((__noinline__));
31 extern vector float pack_const (void)
32 __attribute__((__noinline__));
34 extern void pack_ptr (vector float *p, float a, float b, float c, float d)
35 __attribute__((__noinline__));
37 extern void pack_static (float a, float b, float c, float d)
38 __attribute__((__noinline__));
40 extern void pack_global (float a, float b, float c, float d)
41 __attribute__((__noinline__));
43 extern vector float splat_reg (float a)
44 __attribute__((__noinline__));
46 extern vector float splat_from_ptr (float *p)
47 __attribute__((__noinline__));
49 extern vector float splat_const (void)
50 __attribute__((__noinline__));
52 extern void splat_ptr (vector float *p, float a)
53 __attribute__((__noinline__));
55 extern void splat_static (float a)
56 __attribute__((__noinline__));
58 extern void splat_global (float a)
59 __attribute__((__noinline__));
61 void
62 check (vector float a)
64 size_t i;
66 for (i = 0; i < 4; i++)
67 if (vec_extract (a, i) != expected[i])
68 abort ();
71 void
72 check_splat (vector float a)
74 size_t i;
76 for (i = 0; i < 4; i++)
77 if (vec_extract (a, i) != SPLAT)
78 abort ();
81 vector float
82 pack_reg (float a, float b, float c, float d)
84 return (vector float) { a, b, c, d };
87 vector float
88 pack_from_ptr (float *p_a, float *p_b, float *p_c, float *p_d)
90 return (vector float) { *p_a, *p_b, *p_c, *p_d };
93 vector float
94 pack_const (void)
96 return (vector float) { ELEMENTS };
99 void
100 pack_ptr (vector float *p, float a, float b, float c, float d)
102 *p = (vector float) { a, b, c, d };
105 void
106 pack_static (float a, float b, float c, float d)
108 sv_static = (vector float) { a, b, c, d };
111 void
112 pack_global (float a, float b, float c, float d)
114 sv_global = (vector float) { a, b, c, d };
117 vector float
118 splat_reg (float a)
120 return (vector float) { a, a, a, a };
123 vector float
124 splat_from_ptr (float *p)
126 return (vector float) { *p, *p, *p, *p };
129 vector float
130 splat_const (void)
132 return (vector float) { SPLAT, SPLAT, SPLAT, SPLAT };
135 void
136 splat_ptr (vector float *p, float a)
138 *p = (vector float) { a, a, a, a };
141 void
142 splat_static (float a)
144 sp_static = (vector float) { a, a, a, a };
147 void
148 splat_global (float a)
150 sp_global = (vector float) { a, a, a, a };
153 int main (void)
155 vector float sv2, sv3;
156 float mem = SPLAT;
157 float mem2[4] = { ELEMENTS };
159 check (sv);
161 check (pack_reg (ELEMENTS));
163 check (pack_from_ptr (&mem2[0], &mem2[1], &mem2[2], &mem2[3]));
165 check (pack_const ());
167 pack_ptr (&sv2, ELEMENTS);
168 check (sv2);
170 pack_static (ELEMENTS);
171 check (sv_static);
173 pack_global (ELEMENTS);
174 check (sv_global);
176 check_splat (splat);
178 check_splat (splat_reg (SPLAT));
180 check_splat (splat_from_ptr (&mem));
182 check_splat (splat_const ());
184 splat_ptr (&sv2, SPLAT);
185 check_splat (sv2);
187 splat_static (SPLAT);
188 check_splat (sp_static);
190 splat_global (SPLAT);
191 check_splat (sp_global);
193 return 0;