New Advanced SIMD intrinsics tests.
[platform/upstream/gcc49.git] / gcc / testsuite / gcc.target / aarch64 / advsimd-intrinsics / vuzp.c
1 #include <arm_neon.h>
2 #include "arm-neon-ref.h"
3 #include "compute-ref-data.h"
4
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 };
59
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 };
101
102 #ifndef INSN_NAME
103 #define INSN_NAME vuzp
104 #define TEST_MSG "VUZP/VUZPQ"
105 #endif
106
107 #define FNNAME1(NAME) exec_ ## NAME
108 #define FNNAME(NAME) FNNAME1(NAME)
109
110 void FNNAME (INSN_NAME) (void)
111 {
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]
116
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)));
131
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)));
136
137   DECL_VARIABLE_ALL_VARIANTS(vector1);
138   DECL_VARIABLE_ALL_VARIANTS(vector2);
139
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)
160
161   DECL_ALL_VUZP();
162
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);
167
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);
178
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);
188
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)
208
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)
228
229   clean_results ();
230
231   /* Execute the tests.  */
232   TEST_ALL_VUZP(INSN_NAME);
233
234   CHECK_RESULTS_NAMED (TEST_MSG, expected0, "(chunk 0)");
235
236   TEST_ALL_EXTRA_CHUNKS();
237   CHECK_RESULTS_NAMED (TEST_MSG, expected1, "(chunk 1)");
238 }
239
240 int main (void)
241 {
242   FNNAME (INSN_NAME) ();
243
244   return 0;
245 }