2014-10-24 Christophe Lyon <christophe.lyon@linaro.org>
[official-gcc.git] / gcc / testsuite / gcc.target / aarch64 / advsimd-intrinsics / vuzp.c
blob53f875e7aaa76580f1461faeec15aa571030f1e5
1 #include <arm_neon.h>
2 #include "arm-neon-ref.h"
3 #include "compute-ref-data.h"
5 /* Expected results splitted in several chunks. */
6 /* Chunk 0. */
7 VECT_VAR_DECL(expected0,int,8,8) [] = { 0xf0, 0xf1, 0xf2, 0xf3,
8 0xf4, 0xf5, 0xf6, 0xf7 };
9 VECT_VAR_DECL(expected0,int,16,4) [] = { 0xfff0, 0xfff1,
10 0xfff2, 0xfff3 };
11 VECT_VAR_DECL(expected0,int,32,2) [] = { 0xfffffff0, 0xfffffff1 };
12 VECT_VAR_DECL(expected0,int,64,1) [] = { 0x3333333333333333 };
13 VECT_VAR_DECL(expected0,uint,8,8) [] = { 0xf0, 0xf1, 0xf2, 0xf3,
14 0xf4, 0xf5, 0xf6, 0xf7 };
15 VECT_VAR_DECL(expected0,uint,16,4) [] = { 0xfff0, 0xfff1,
16 0xfff2, 0xfff3 };
17 VECT_VAR_DECL(expected0,uint,32,2) [] = { 0xfffffff0,
18 0xfffffff1 };
19 VECT_VAR_DECL(expected0,uint,64,1) [] = { 0x3333333333333333 };
20 VECT_VAR_DECL(expected0,poly,8,8) [] = { 0xf0, 0xf1, 0xf2, 0xf3,
21 0xf4, 0xf5, 0xf6, 0xf7 };
22 VECT_VAR_DECL(expected0,poly,16,4) [] = { 0xfff0, 0xfff1,
23 0xfff2, 0xfff3 };
24 VECT_VAR_DECL(expected0,hfloat,32,2) [] = { 0xc1800000, 0xc1700000 };
25 VECT_VAR_DECL(expected0,int,8,16) [] = { 0xf0, 0xf1, 0xf2, 0xf3,
26 0xf4, 0xf5, 0xf6, 0xf7,
27 0xf8, 0xf9, 0xfa, 0xfb,
28 0xfc, 0xfd, 0xfe, 0xff };
29 VECT_VAR_DECL(expected0,int,16,8) [] = { 0xfff0, 0xfff1,
30 0xfff2, 0xfff3,
31 0xfff4, 0xfff5,
32 0xfff6, 0xfff7 };
33 VECT_VAR_DECL(expected0,int,32,4) [] = { 0xfffffff0, 0xfffffff1,
34 0xfffffff2, 0xfffffff3 };
35 VECT_VAR_DECL(expected0,int,64,2) [] = { 0x3333333333333333,
36 0x3333333333333333 };
37 VECT_VAR_DECL(expected0,uint,8,16) [] = { 0xf0, 0xf1, 0xf2, 0xf3,
38 0xf4, 0xf5, 0xf6, 0xf7,
39 0xf8, 0xf9, 0xfa, 0xfb,
40 0xfc, 0xfd, 0xfe, 0xff };
41 VECT_VAR_DECL(expected0,uint,16,8) [] = { 0xfff0, 0xfff1,
42 0xfff2, 0xfff3,
43 0xfff4, 0xfff5,
44 0xfff6, 0xfff7 };
45 VECT_VAR_DECL(expected0,uint,32,4) [] = { 0xfffffff0, 0xfffffff1,
46 0xfffffff2, 0xfffffff3 };
47 VECT_VAR_DECL(expected0,uint,64,2) [] = { 0x3333333333333333,
48 0x3333333333333333 };
49 VECT_VAR_DECL(expected0,poly,8,16) [] = { 0xf0, 0xf1, 0xf2, 0xf3,
50 0xf4, 0xf5, 0xf6, 0xf7,
51 0xf8, 0xf9, 0xfa, 0xfb,
52 0xfc, 0xfd, 0xfe, 0xff };
53 VECT_VAR_DECL(expected0,poly,16,8) [] = { 0xfff0, 0xfff1,
54 0xfff2, 0xfff3,
55 0xfff4, 0xfff5,
56 0xfff6, 0xfff7 };
57 VECT_VAR_DECL(expected0,hfloat,32,4) [] = { 0xc1800000, 0xc1700000,
58 0xc1600000, 0xc1500000 };
60 /* Chunk 1. */
61 VECT_VAR_DECL(expected1,int,8,8) [] = { 0x11, 0x11, 0x11, 0x11,
62 0x11, 0x11, 0x11, 0x11 };
63 VECT_VAR_DECL(expected1,int,16,4) [] = { 0x22, 0x22, 0x22, 0x22 };
64 VECT_VAR_DECL(expected1,int,32,2) [] = { 0x33, 0x33 };
65 VECT_VAR_DECL(expected1,int,64,1) [] = { 0x3333333333333333 };
66 VECT_VAR_DECL(expected1,uint,8,8) [] = { 0x55, 0x55, 0x55, 0x55,
67 0x55, 0x55, 0x55, 0x55 };
68 VECT_VAR_DECL(expected1,uint,16,4) [] = { 0x66, 0x66, 0x66, 0x66 };
69 VECT_VAR_DECL(expected1,uint,32,2) [] = { 0x77, 0x77 };
70 VECT_VAR_DECL(expected1,uint,64,1) [] = { 0x3333333333333333 };
71 VECT_VAR_DECL(expected1,poly,8,8) [] = { 0x55, 0x55, 0x55, 0x55,
72 0x55, 0x55, 0x55, 0x55 };
73 VECT_VAR_DECL(expected1,poly,16,4) [] = { 0x66, 0x66, 0x66, 0x66 };
74 VECT_VAR_DECL(expected1,hfloat,32,2) [] = { 0x42066666, 0x42066666 };
75 VECT_VAR_DECL(expected1,int,8,16) [] = { 0x11, 0x11, 0x11, 0x11,
76 0x11, 0x11, 0x11, 0x11,
77 0x11, 0x11, 0x11, 0x11,
78 0x11, 0x11, 0x11, 0x11 };
79 VECT_VAR_DECL(expected1,int,16,8) [] = { 0x22, 0x22, 0x22, 0x22,
80 0x22, 0x22, 0x22, 0x22 };
81 VECT_VAR_DECL(expected1,int,32,4) [] = { 0x33, 0x33, 0x33, 0x33 };
82 VECT_VAR_DECL(expected1,int,64,2) [] = { 0x3333333333333333,
83 0x3333333333333333 };
84 VECT_VAR_DECL(expected1,uint,8,16) [] = { 0x55, 0x55, 0x55, 0x55,
85 0x55, 0x55, 0x55, 0x55,
86 0x55, 0x55, 0x55, 0x55,
87 0x55, 0x55, 0x55, 0x55 };
88 VECT_VAR_DECL(expected1,uint,16,8) [] = { 0x66, 0x66, 0x66, 0x66,
89 0x66, 0x66, 0x66, 0x66 };
90 VECT_VAR_DECL(expected1,uint,32,4) [] = { 0x77, 0x77, 0x77, 0x77 };
91 VECT_VAR_DECL(expected1,uint,64,2) [] = { 0x3333333333333333,
92 0x3333333333333333 };
93 VECT_VAR_DECL(expected1,poly,8,16) [] = { 0x55, 0x55, 0x55, 0x55,
94 0x55, 0x55, 0x55, 0x55,
95 0x55, 0x55, 0x55, 0x55,
96 0x55, 0x55, 0x55, 0x55 };
97 VECT_VAR_DECL(expected1,poly,16,8) [] = { 0x66, 0x66, 0x66, 0x66,
98 0x66, 0x66, 0x66, 0x66 };
99 VECT_VAR_DECL(expected1,hfloat,32,4) [] = { 0x42073333, 0x42073333,
100 0x42073333, 0x42073333 };
102 #ifndef INSN_NAME
103 #define INSN_NAME vuzp
104 #define TEST_MSG "VUZP/VUZPQ"
105 #endif
107 #define FNNAME1(NAME) exec_ ## NAME
108 #define FNNAME(NAME) FNNAME1(NAME)
110 void FNNAME (INSN_NAME) (void)
112 /* In this case, output variables are arrays of vectors. */
113 #define DECL_VUZP(T1, W, N) \
114 VECT_ARRAY_TYPE(T1, W, N, 2) VECT_ARRAY_VAR(result_vec, T1, W, N, 2); \
115 VECT_VAR_DECL(result_bis, T1, W, N)[2 * N]
117 /* We need to use a temporary result buffer (result_bis), because
118 the one used for other tests is not large enough. A subset of the
119 result data is moved from result_bis to result, and it is this
120 subset which is used to check the actual behaviour. The next
121 macro enables to move another chunk of data from result_bis to
122 result. */
123 #define TEST_VUZP(INSN, Q, T1, T2, W, N) \
124 VECT_ARRAY_VAR(result_vec, T1, W, N, 2) = \
125 INSN##Q##_##T2##W(VECT_VAR(vector1, T1, W, N), \
126 VECT_VAR(vector2, T1, W, N)); \
127 vst2##Q##_##T2##W(VECT_VAR(result_bis, T1, W, N), \
128 VECT_ARRAY_VAR(result_vec, T1, W, N, 2)); \
129 memcpy(VECT_VAR(result, T1, W, N), VECT_VAR(result_bis, T1, W, N), \
130 sizeof(VECT_VAR(result, T1, W, N)));
132 /* Overwrite "result" with the contents of "result_bis"[X]. */
133 #define TEST_EXTRA_CHUNK(T1, W, N, X) \
134 memcpy(VECT_VAR(result, T1, W, N), &(VECT_VAR(result_bis, T1, W, N)[X*N]), \
135 sizeof(VECT_VAR(result, T1, W, N)));
137 DECL_VARIABLE_ALL_VARIANTS(vector1);
138 DECL_VARIABLE_ALL_VARIANTS(vector2);
140 /* We don't need 64 bits variants. */
141 #define DECL_ALL_VUZP() \
142 DECL_VUZP(int, 8, 8); \
143 DECL_VUZP(int, 16, 4); \
144 DECL_VUZP(int, 32, 2); \
145 DECL_VUZP(uint, 8, 8); \
146 DECL_VUZP(uint, 16, 4); \
147 DECL_VUZP(uint, 32, 2); \
148 DECL_VUZP(poly, 8, 8); \
149 DECL_VUZP(poly, 16, 4); \
150 DECL_VUZP(float, 32, 2); \
151 DECL_VUZP(int, 8, 16); \
152 DECL_VUZP(int, 16, 8); \
153 DECL_VUZP(int, 32, 4); \
154 DECL_VUZP(uint, 8, 16); \
155 DECL_VUZP(uint, 16, 8); \
156 DECL_VUZP(uint, 32, 4); \
157 DECL_VUZP(poly, 8, 16); \
158 DECL_VUZP(poly, 16, 8); \
159 DECL_VUZP(float, 32, 4)
161 DECL_ALL_VUZP();
163 /* Initialize input "vector" from "buffer". */
164 TEST_MACRO_ALL_VARIANTS_2_5(VLOAD, vector1, buffer);
165 VLOAD(vector1, buffer, , float, f, 32, 2);
166 VLOAD(vector1, buffer, q, float, f, 32, 4);
168 /* Choose arbitrary initialization values. */
169 VDUP(vector2, , int, s, 8, 8, 0x11);
170 VDUP(vector2, , int, s, 16, 4, 0x22);
171 VDUP(vector2, , int, s, 32, 2, 0x33);
172 VDUP(vector2, , uint, u, 8, 8, 0x55);
173 VDUP(vector2, , uint, u, 16, 4, 0x66);
174 VDUP(vector2, , uint, u, 32, 2, 0x77);
175 VDUP(vector2, , poly, p, 8, 8, 0x55);
176 VDUP(vector2, , poly, p, 16, 4, 0x66);
177 VDUP(vector2, , float, f, 32, 2, 33.6f);
179 VDUP(vector2, q, int, s, 8, 16, 0x11);
180 VDUP(vector2, q, int, s, 16, 8, 0x22);
181 VDUP(vector2, q, int, s, 32, 4, 0x33);
182 VDUP(vector2, q, uint, u, 8, 16, 0x55);
183 VDUP(vector2, q, uint, u, 16, 8, 0x66);
184 VDUP(vector2, q, uint, u, 32, 4, 0x77);
185 VDUP(vector2, q, poly, p, 8, 16, 0x55);
186 VDUP(vector2, q, poly, p, 16, 8, 0x66);
187 VDUP(vector2, q, float, f, 32, 4, 33.8f);
189 #define TEST_ALL_VUZP(INSN) \
190 TEST_VUZP(INSN, , int, s, 8, 8); \
191 TEST_VUZP(INSN, , int, s, 16, 4); \
192 TEST_VUZP(INSN, , int, s, 32, 2); \
193 TEST_VUZP(INSN, , uint, u, 8, 8); \
194 TEST_VUZP(INSN, , uint, u, 16, 4); \
195 TEST_VUZP(INSN, , uint, u, 32, 2); \
196 TEST_VUZP(INSN, , poly, p, 8, 8); \
197 TEST_VUZP(INSN, , poly, p, 16, 4); \
198 TEST_VUZP(INSN, , float, f, 32, 2); \
199 TEST_VUZP(INSN, q, int, s, 8, 16); \
200 TEST_VUZP(INSN, q, int, s, 16, 8); \
201 TEST_VUZP(INSN, q, int, s, 32, 4); \
202 TEST_VUZP(INSN, q, uint, u, 8, 16); \
203 TEST_VUZP(INSN, q, uint, u, 16, 8); \
204 TEST_VUZP(INSN, q, uint, u, 32, 4); \
205 TEST_VUZP(INSN, q, poly, p, 8, 16); \
206 TEST_VUZP(INSN, q, poly, p, 16, 8); \
207 TEST_VUZP(INSN, q, float, f, 32, 4)
209 #define TEST_ALL_EXTRA_CHUNKS() \
210 TEST_EXTRA_CHUNK(int, 8, 8, 1); \
211 TEST_EXTRA_CHUNK(int, 16, 4, 1); \
212 TEST_EXTRA_CHUNK(int, 32, 2, 1); \
213 TEST_EXTRA_CHUNK(uint, 8, 8, 1); \
214 TEST_EXTRA_CHUNK(uint, 16, 4, 1); \
215 TEST_EXTRA_CHUNK(uint, 32, 2, 1); \
216 TEST_EXTRA_CHUNK(poly, 8, 8, 1); \
217 TEST_EXTRA_CHUNK(poly, 16, 4, 1); \
218 TEST_EXTRA_CHUNK(float, 32, 2, 1); \
219 TEST_EXTRA_CHUNK(int, 8, 16, 1); \
220 TEST_EXTRA_CHUNK(int, 16, 8, 1); \
221 TEST_EXTRA_CHUNK(int, 32, 4, 1); \
222 TEST_EXTRA_CHUNK(uint, 8, 16, 1); \
223 TEST_EXTRA_CHUNK(uint, 16, 8, 1); \
224 TEST_EXTRA_CHUNK(uint, 32, 4, 1); \
225 TEST_EXTRA_CHUNK(poly, 8, 16, 1); \
226 TEST_EXTRA_CHUNK(poly, 16, 8, 1); \
227 TEST_EXTRA_CHUNK(float, 32, 4, 1)
229 clean_results ();
231 /* Execute the tests. */
232 TEST_ALL_VUZP(INSN_NAME);
234 CHECK_RESULTS_NAMED (TEST_MSG, expected0, "(chunk 0)");
236 TEST_ALL_EXTRA_CHUNKS();
237 CHECK_RESULTS_NAMED (TEST_MSG, expected1, "(chunk 1)");
240 int main (void)
242 FNNAME (INSN_NAME) ();
244 return 0;