blob: a3f5bc403f35f5131736e2563c91786fe37b3e80 [file] [log] [blame]
sewardj94f53cb2014-03-01 11:27:18 +00001
2#include <stdio.h>
3#include <assert.h>
4#include <malloc.h> // memalign
5#include <string.h> // memset
sewardjd89499b2014-03-02 12:48:34 +00006#include <math.h> // isnormal
sewardj94f53cb2014-03-01 11:27:18 +00007
8typedef unsigned char UChar;
9typedef unsigned short int UShort;
10typedef unsigned int UInt;
11typedef signed int Int;
12typedef unsigned char UChar;
13typedef unsigned long long int ULong;
14
15typedef unsigned char Bool;
16#define False ((Bool)0)
17#define True ((Bool)1)
18
19
sewardjd89499b2014-03-02 12:48:34 +000020#define ITERS 1
21
22
sewardj94f53cb2014-03-01 11:27:18 +000023union _V128 {
sewardjd89499b2014-03-02 12:48:34 +000024 UChar u8[16];
25 UShort u16[8];
26 UInt u32[4];
27 ULong u64[2];
28 float f32[4];
29 double f64[2];
sewardj94f53cb2014-03-01 11:27:18 +000030};
31typedef union _V128 V128;
32
sewardjd89499b2014-03-02 12:48:34 +000033static inline UChar randUChar ( void )
sewardj94f53cb2014-03-01 11:27:18 +000034{
35 static UInt seed = 80021;
36 seed = 1103515245 * seed + 12345;
37 return (seed >> 17) & 0xFF;
38}
39
40static ULong randULong ( void )
41{
42 Int i;
43 ULong r = 0;
44 for (i = 0; i < 8; i++) {
45 r = (r << 8) | (ULong)(0xFF & randUChar());
46 }
47 return r;
48}
49
sewardjd89499b2014-03-02 12:48:34 +000050/* Generates a random V128. Ensures that that it contains normalised
51 FP numbers when viewed as either F32x4 or F64x2, so that it is
52 reasonable to use in FP test cases. */
sewardj94f53cb2014-03-01 11:27:18 +000053static void randV128 ( V128* v )
54{
sewardjd89499b2014-03-02 12:48:34 +000055 static UInt nCalls = 0, nIters = 0;
sewardj94f53cb2014-03-01 11:27:18 +000056 Int i;
sewardjd89499b2014-03-02 12:48:34 +000057 nCalls++;
58 while (1) {
59 nIters++;
60 for (i = 0; i < 16; i++) {
61 v->u8[i] = randUChar();
62 }
63 if (isnormal(v->f32[0]) && isnormal(v->f32[1]) && isnormal(v->f32[2])
64 && isnormal(v->f32[3]) && isnormal(v->f64[0]) && isnormal(v->f64[1]))
65 break;
66 }
67 if (0 == (nCalls & 0xFF))
68 printf("randV128: %u calls, %u iters\n", nCalls, nIters);
sewardj94f53cb2014-03-01 11:27:18 +000069}
70
71static void showV128 ( V128* v )
72{
73 Int i;
74 for (i = 15; i >= 0; i--)
sewardjd89499b2014-03-02 12:48:34 +000075 printf("%02x", (Int)v->u8[i]);
sewardj94f53cb2014-03-01 11:27:18 +000076}
77
78__attribute__((unused))
79static void* memalign16(size_t szB)
80{
81 void* x;
82 x = memalign(16, szB);
83 assert(x);
84 assert(0 == ((16-1) & (unsigned long)x));
85 return x;
86}
87
88
89void test_UMINV ( void )
90{
91 int i;
92 V128 block[2];
93
94 /* -- 4s -- */
95
96 for (i = 0; i < 10; i++) {
97 memset(&block, 0x55, sizeof(block));
98 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +000099 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000100 __asm__ __volatile__(
101 "ldr q7, [%0, #0] ; "
102 "uminv s8, v7.4s ; "
103 "str q8, [%0, #16] "
104 : : "r"(&block[0]) : "memory", "v7", "v8"
105 );
106 printf("UMINV v8, v7.4s ");
107 showV128(&block[0]); printf(" ");
108 showV128(&block[1]); printf("\n");
109 }
110
111 /* -- 8h -- */
112
113 for (i = 0; i < 10; i++) {
114 memset(&block, 0x55, sizeof(block));
115 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +0000116 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000117 __asm__ __volatile__(
118 "ldr q7, [%0, #0] ; "
119 "uminv h8, v7.8h ; "
120 "str q8, [%0, #16] "
121 : : "r"(&block[0]) : "memory", "v7", "v8"
122 );
123 printf("UMINV h8, v7.8h ");
124 showV128(&block[0]); printf(" ");
125 showV128(&block[1]); printf("\n");
126 }
127
128 /* -- 4h -- */
129
130 for (i = 0; i < 10; i++) {
131 memset(&block, 0x55, sizeof(block));
132 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +0000133 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000134 __asm__ __volatile__(
135 "ldr q7, [%0, #0] ; "
136 "uminv h8, v7.4h ; "
137 "str q8, [%0, #16] "
138 : : "r"(&block[0]) : "memory", "v7", "v8"
139 );
140 printf("UMINV h8, v7.4h ");
141 showV128(&block[0]); printf(" ");
142 showV128(&block[1]); printf("\n");
143 }
144
145 /* -- 16b -- */
146
147 for (i = 0; i < 10; i++) {
148 memset(&block, 0x55, sizeof(block));
149 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +0000150 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000151 __asm__ __volatile__(
152 "ldr q7, [%0, #0] ; "
153 "uminv b8, v7.16b ; "
154 "str q8, [%0, #16] "
155 : : "r"(&block[0]) : "memory", "v7", "v8"
156 );
157 printf("UMINV b8, v7.16b ");
158 showV128(&block[0]); printf(" ");
159 showV128(&block[1]); printf("\n");
160 }
161
162 /* -- 8b -- */
163
164 for (i = 0; i < 10; i++) {
165 memset(&block, 0x55, sizeof(block));
166 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +0000167 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000168 __asm__ __volatile__(
169 "ldr q7, [%0, #0] ; "
170 "uminv b8, v7.8b ; "
171 "str q8, [%0, #16] "
172 : : "r"(&block[0]) : "memory", "v7", "v8"
173 );
174 printf("UMINV b8, v7.8b ");
175 showV128(&block[0]); printf(" ");
176 showV128(&block[1]); printf("\n");
177 }
178
179}
180
181
182void test_UMAXV ( void )
183{
184 int i;
185 V128 block[2];
186
187 /* -- 4s -- */
188
189 for (i = 0; i < 10; i++) {
190 memset(&block, 0x55, sizeof(block));
191 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +0000192 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000193 __asm__ __volatile__(
194 "ldr q7, [%0, #0] ; "
195 "umaxv s8, v7.4s ; "
196 "str q8, [%0, #16] "
197 : : "r"(&block[0]) : "memory", "v7", "v8"
198 );
199 printf("UMAXV v8, v7.4s ");
200 showV128(&block[0]); printf(" ");
201 showV128(&block[1]); printf("\n");
202 }
203
204 /* -- 8h -- */
205
206 for (i = 0; i < 10; i++) {
207 memset(&block, 0x55, sizeof(block));
208 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +0000209 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000210 __asm__ __volatile__(
211 "ldr q7, [%0, #0] ; "
212 "umaxv h8, v7.8h ; "
213 "str q8, [%0, #16] "
214 : : "r"(&block[0]) : "memory", "v7", "v8"
215 );
216 printf("UMAXV h8, v7.8h ");
217 showV128(&block[0]); printf(" ");
218 showV128(&block[1]); printf("\n");
219 }
220
221 /* -- 4h -- */
222
223 for (i = 0; i < 10; i++) {
224 memset(&block, 0x55, sizeof(block));
225 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +0000226 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000227 __asm__ __volatile__(
228 "ldr q7, [%0, #0] ; "
229 "umaxv h8, v7.4h ; "
230 "str q8, [%0, #16] "
231 : : "r"(&block[0]) : "memory", "v7", "v8"
232 );
233 printf("UMAXV h8, v7.4h ");
234 showV128(&block[0]); printf(" ");
235 showV128(&block[1]); printf("\n");
236 }
237
238 /* -- 16b -- */
239
240 for (i = 0; i < 10; i++) {
241 memset(&block, 0x55, sizeof(block));
242 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +0000243 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000244 __asm__ __volatile__(
245 "ldr q7, [%0, #0] ; "
246 "umaxv b8, v7.16b ; "
247 "str q8, [%0, #16] "
248 : : "r"(&block[0]) : "memory", "v7", "v8"
249 );
250 printf("UMAXV b8, v7.16b ");
251 showV128(&block[0]); printf(" ");
252 showV128(&block[1]); printf("\n");
253 }
254
255 /* -- 8b -- */
256
257 for (i = 0; i < 10; i++) {
258 memset(&block, 0x55, sizeof(block));
259 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +0000260 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000261 __asm__ __volatile__(
262 "ldr q7, [%0, #0] ; "
263 "umaxv b8, v7.8b ; "
264 "str q8, [%0, #16] "
265 : : "r"(&block[0]) : "memory", "v7", "v8"
266 );
267 printf("UMAXV b8, v7.8b ");
268 showV128(&block[0]); printf(" ");
269 showV128(&block[1]); printf("\n");
270 }
271
272}
273
274
275void test_INS_general ( void )
276{
277 V128 block[3];
278
279 /* -- D[0..1] -- */
280
281 memset(&block, 0x55, sizeof(block));
sewardjd89499b2014-03-02 12:48:34 +0000282 block[1].u64[0] = randULong();
sewardj94f53cb2014-03-01 11:27:18 +0000283 __asm__ __volatile__(
284 "ldr q7, [%0, #0] ; "
285 "ldr x19, [%0, #16] ; "
286 "ins v7.d[0], x19 ; "
287 "str q7, [%0, #32] "
288 : : "r"(&block[0]) : "memory", "x19", "v7"
289 );
sewardjd89499b2014-03-02 12:48:34 +0000290 printf("INS v7.u64[0],x19 ");
291 showV128(&block[0]); printf(" %016llx ", block[1].u64[0]);
sewardj94f53cb2014-03-01 11:27:18 +0000292 showV128(&block[2]); printf("\n");
293
294 memset(&block, 0x55, sizeof(block));
sewardjd89499b2014-03-02 12:48:34 +0000295 block[1].u64[0] = randULong();
sewardj94f53cb2014-03-01 11:27:18 +0000296 __asm__ __volatile__(
297 "ldr q7, [%0, #0] ; "
298 "ldr x19, [%0, #16] ; "
299 "ins v7.d[1], x19 ; "
300 "str q7, [%0, #32] "
301 : : "r"(&block[0]) : "memory", "x19", "v7"
302 );
303 printf("INS v7.d[1],x19 ");
sewardjd89499b2014-03-02 12:48:34 +0000304 showV128(&block[0]); printf(" %016llx ", block[1].u64[0]);
sewardj94f53cb2014-03-01 11:27:18 +0000305 showV128(&block[2]); printf("\n");
306
307 /* -- S[0..3] -- */
308
309 memset(&block, 0x55, sizeof(block));
sewardjd89499b2014-03-02 12:48:34 +0000310 block[1].u64[0] = randULong();
sewardj94f53cb2014-03-01 11:27:18 +0000311 __asm__ __volatile__(
312 "ldr q7, [%0, #0] ; "
313 "ldr x19, [%0, #16] ; "
314 "ins v7.s[0], w19 ; "
315 "str q7, [%0, #32] "
316 : : "r"(&block[0]) : "memory", "x19", "v7"
317 );
318 printf("INS v7.s[0],x19 ");
sewardjd89499b2014-03-02 12:48:34 +0000319 showV128(&block[0]); printf(" %016llx ", block[1].u64[0]);
sewardj94f53cb2014-03-01 11:27:18 +0000320 showV128(&block[2]); printf("\n");
321
322 memset(&block, 0x55, sizeof(block));
sewardjd89499b2014-03-02 12:48:34 +0000323 block[1].u64[0] = randULong();
sewardj94f53cb2014-03-01 11:27:18 +0000324 __asm__ __volatile__(
325 "ldr q7, [%0, #0] ; "
326 "ldr x19, [%0, #16] ; "
327 "ins v7.s[1], w19 ; "
328 "str q7, [%0, #32] "
329 : : "r"(&block[0]) : "memory", "x19", "v7"
330 );
331 printf("INS v7.s[1],x19 ");
sewardjd89499b2014-03-02 12:48:34 +0000332 showV128(&block[0]); printf(" %016llx ", block[1].u64[0]);
sewardj94f53cb2014-03-01 11:27:18 +0000333 showV128(&block[2]); printf("\n");
334
335 memset(&block, 0x55, sizeof(block));
sewardjd89499b2014-03-02 12:48:34 +0000336 block[1].u64[0] = randULong();
sewardj94f53cb2014-03-01 11:27:18 +0000337 __asm__ __volatile__(
338 "ldr q7, [%0, #0] ; "
339 "ldr x19, [%0, #16] ; "
340 "ins v7.s[2], w19 ; "
341 "str q7, [%0, #32] "
342 : : "r"(&block[0]) : "memory", "x19", "v7"
343 );
344 printf("INS v7.s[2],x19 ");
sewardjd89499b2014-03-02 12:48:34 +0000345 showV128(&block[0]); printf(" %016llx ", block[1].u64[0]);
sewardj94f53cb2014-03-01 11:27:18 +0000346 showV128(&block[2]); printf("\n");
347
348 memset(&block, 0x55, sizeof(block));
sewardjd89499b2014-03-02 12:48:34 +0000349 block[1].u64[0] = randULong();
sewardj94f53cb2014-03-01 11:27:18 +0000350 __asm__ __volatile__(
351 "ldr q7, [%0, #0] ; "
352 "ldr x19, [%0, #16] ; "
353 "ins v7.s[3], w19 ; "
354 "str q7, [%0, #32] "
355 : : "r"(&block[0]) : "memory", "x19", "v7"
356 );
357 printf("INS v7.s[3],x19 ");
sewardjd89499b2014-03-02 12:48:34 +0000358 showV128(&block[0]); printf(" %016llx ", block[1].u64[0]);
sewardj94f53cb2014-03-01 11:27:18 +0000359 showV128(&block[2]); printf("\n");
360
361 /* -- H[0..7] -- */
362
363 memset(&block, 0x55, sizeof(block));
sewardjd89499b2014-03-02 12:48:34 +0000364 block[1].u64[0] = randULong();
sewardj94f53cb2014-03-01 11:27:18 +0000365 __asm__ __volatile__(
366 "ldr q7, [%0, #0] ; "
367 "ldr x19, [%0, #16] ; "
368 "ins v7.h[0], w19 ; "
369 "str q7, [%0, #32] "
370 : : "r"(&block[0]) : "memory", "x19", "v7"
371 );
372 printf("INS v7.h[0],x19 ");
sewardjd89499b2014-03-02 12:48:34 +0000373 showV128(&block[0]); printf(" %016llx ", block[1].u64[0]);
sewardj94f53cb2014-03-01 11:27:18 +0000374 showV128(&block[2]); printf("\n");
375
376 memset(&block, 0x55, sizeof(block));
sewardjd89499b2014-03-02 12:48:34 +0000377 block[1].u64[0] = randULong();
sewardj94f53cb2014-03-01 11:27:18 +0000378 __asm__ __volatile__(
379 "ldr q7, [%0, #0] ; "
380 "ldr x19, [%0, #16] ; "
381 "ins v7.h[1], w19 ; "
382 "str q7, [%0, #32] "
383 : : "r"(&block[0]) : "memory", "x19", "v7"
384 );
385 printf("INS v7.h[1],x19 ");
sewardjd89499b2014-03-02 12:48:34 +0000386 showV128(&block[0]); printf(" %016llx ", block[1].u64[0]);
sewardj94f53cb2014-03-01 11:27:18 +0000387 showV128(&block[2]); printf("\n");
388
389 memset(&block, 0x55, sizeof(block));
sewardjd89499b2014-03-02 12:48:34 +0000390 block[1].u64[0] = randULong();
sewardj94f53cb2014-03-01 11:27:18 +0000391 __asm__ __volatile__(
392 "ldr q7, [%0, #0] ; "
393 "ldr x19, [%0, #16] ; "
394 "ins v7.h[2], w19 ; "
395 "str q7, [%0, #32] "
396 : : "r"(&block[0]) : "memory", "x19", "v7"
397 );
398 printf("INS v7.h[2],x19 ");
sewardjd89499b2014-03-02 12:48:34 +0000399 showV128(&block[0]); printf(" %016llx ", block[1].u64[0]);
sewardj94f53cb2014-03-01 11:27:18 +0000400 showV128(&block[2]); printf("\n");
401
402 memset(&block, 0x55, sizeof(block));
sewardjd89499b2014-03-02 12:48:34 +0000403 block[1].u64[0] = randULong();
sewardj94f53cb2014-03-01 11:27:18 +0000404 __asm__ __volatile__(
405 "ldr q7, [%0, #0] ; "
406 "ldr x19, [%0, #16] ; "
407 "ins v7.h[3], w19 ; "
408 "str q7, [%0, #32] "
409 : : "r"(&block[0]) : "memory", "x19", "v7"
410 );
411 printf("INS v7.h[3],x19 ");
sewardjd89499b2014-03-02 12:48:34 +0000412 showV128(&block[0]); printf(" %016llx ", block[1].u64[0]);
sewardj94f53cb2014-03-01 11:27:18 +0000413 showV128(&block[2]); printf("\n");
414
415 memset(&block, 0x55, sizeof(block));
sewardjd89499b2014-03-02 12:48:34 +0000416 block[1].u64[0] = randULong();
sewardj94f53cb2014-03-01 11:27:18 +0000417 __asm__ __volatile__(
418 "ldr q7, [%0, #0] ; "
419 "ldr x19, [%0, #16] ; "
420 "ins v7.h[4], w19 ; "
421 "str q7, [%0, #32] "
422 : : "r"(&block[0]) : "memory", "x19", "v7"
423 );
424 printf("INS v7.h[4],x19 ");
sewardjd89499b2014-03-02 12:48:34 +0000425 showV128(&block[0]); printf(" %016llx ", block[1].u64[0]);
sewardj94f53cb2014-03-01 11:27:18 +0000426 showV128(&block[2]); printf("\n");
427
428 memset(&block, 0x55, sizeof(block));
sewardjd89499b2014-03-02 12:48:34 +0000429 block[1].u64[0] = randULong();
sewardj94f53cb2014-03-01 11:27:18 +0000430 __asm__ __volatile__(
431 "ldr q7, [%0, #0] ; "
432 "ldr x19, [%0, #16] ; "
433 "ins v7.h[5], w19 ; "
434 "str q7, [%0, #32] "
435 : : "r"(&block[0]) : "memory", "x19", "v7"
436 );
437 printf("INS v7.h[5],x19 ");
sewardjd89499b2014-03-02 12:48:34 +0000438 showV128(&block[0]); printf(" %016llx ", block[1].u64[0]);
sewardj94f53cb2014-03-01 11:27:18 +0000439 showV128(&block[2]); printf("\n");
440
441 memset(&block, 0x55, sizeof(block));
sewardjd89499b2014-03-02 12:48:34 +0000442 block[1].u64[0] = randULong();
sewardj94f53cb2014-03-01 11:27:18 +0000443 __asm__ __volatile__(
444 "ldr q7, [%0, #0] ; "
445 "ldr x19, [%0, #16] ; "
446 "ins v7.h[6], w19 ; "
447 "str q7, [%0, #32] "
448 : : "r"(&block[0]) : "memory", "x19", "v7"
449 );
450 printf("INS v7.h[6],x19 ");
sewardjd89499b2014-03-02 12:48:34 +0000451 showV128(&block[0]); printf(" %016llx ", block[1].u64[0]);
sewardj94f53cb2014-03-01 11:27:18 +0000452 showV128(&block[2]); printf("\n");
453
454 memset(&block, 0x55, sizeof(block));
sewardjd89499b2014-03-02 12:48:34 +0000455 block[1].u64[0] = randULong();
sewardj94f53cb2014-03-01 11:27:18 +0000456 __asm__ __volatile__(
457 "ldr q7, [%0, #0] ; "
458 "ldr x19, [%0, #16] ; "
459 "ins v7.h[7], w19 ; "
460 "str q7, [%0, #32] "
461 : : "r"(&block[0]) : "memory", "x19", "v7"
462 );
463 printf("INS v7.h[7],x19 ");
sewardjd89499b2014-03-02 12:48:34 +0000464 showV128(&block[0]); printf(" %016llx ", block[1].u64[0]);
sewardj94f53cb2014-03-01 11:27:18 +0000465 showV128(&block[2]); printf("\n");
466
467 /* -- B[0,15] -- */
468
469 memset(&block, 0x55, sizeof(block));
sewardjd89499b2014-03-02 12:48:34 +0000470 block[1].u64[0] = randULong();
sewardj94f53cb2014-03-01 11:27:18 +0000471 __asm__ __volatile__(
472 "ldr q7, [%0, #0] ; "
473 "ldr x19, [%0, #16] ; "
474 "ins v7.b[0], w19 ; "
475 "str q7, [%0, #32] "
476 : : "r"(&block[0]) : "memory", "x19", "v7"
477 );
478 printf("INS v7.b[0],x19 ");
sewardjd89499b2014-03-02 12:48:34 +0000479 showV128(&block[0]); printf(" %016llx ", block[1].u64[0]);
sewardj94f53cb2014-03-01 11:27:18 +0000480 showV128(&block[2]); printf("\n");
481
482 memset(&block, 0x55, sizeof(block));
sewardjd89499b2014-03-02 12:48:34 +0000483 block[1].u64[0] = randULong();
sewardj94f53cb2014-03-01 11:27:18 +0000484 __asm__ __volatile__(
485 "ldr q7, [%0, #0] ; "
486 "ldr x19, [%0, #16] ; "
487 "ins v7.b[15], w19 ; "
488 "str q7, [%0, #32] "
489 : : "r"(&block[0]) : "memory", "x19", "v7"
490 );
491 printf("INS v7.b[15],x19 ");
sewardjd89499b2014-03-02 12:48:34 +0000492 showV128(&block[0]); printf(" %016llx ", block[1].u64[0]);
sewardj94f53cb2014-03-01 11:27:18 +0000493 showV128(&block[2]); printf("\n");
494}
495
496
497
498void test_SMINV ( void )
499{
500 int i;
501 V128 block[2];
502
503 /* -- 4s -- */
504
505 for (i = 0; i < 10; i++) {
506 memset(&block, 0x55, sizeof(block));
507 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +0000508 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000509 __asm__ __volatile__(
510 "ldr q7, [%0, #0] ; "
511 "sminv s8, v7.4s ; "
512 "str q8, [%0, #16] "
513 : : "r"(&block[0]) : "memory", "v7", "v8"
514 );
515 printf("SMINV v8, v7.4s ");
516 showV128(&block[0]); printf(" ");
517 showV128(&block[1]); printf("\n");
518 }
519
520 /* -- 8h -- */
521
522 for (i = 0; i < 10; i++) {
523 memset(&block, 0x55, sizeof(block));
524 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +0000525 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000526 __asm__ __volatile__(
527 "ldr q7, [%0, #0] ; "
528 "sminv h8, v7.8h ; "
529 "str q8, [%0, #16] "
530 : : "r"(&block[0]) : "memory", "v7", "v8"
531 );
532 printf("SMINV h8, v7.8h ");
533 showV128(&block[0]); printf(" ");
534 showV128(&block[1]); printf("\n");
535 }
536
537 /* -- 4h -- */
538
539 for (i = 0; i < 10; i++) {
540 memset(&block, 0x55, sizeof(block));
541 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +0000542 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000543 __asm__ __volatile__(
544 "ldr q7, [%0, #0] ; "
545 "sminv h8, v7.4h ; "
546 "str q8, [%0, #16] "
547 : : "r"(&block[0]) : "memory", "v7", "v8"
548 );
549 printf("SMINV h8, v7.4h ");
550 showV128(&block[0]); printf(" ");
551 showV128(&block[1]); printf("\n");
552 }
553
554 /* -- 16b -- */
555
556 for (i = 0; i < 10; i++) {
557 memset(&block, 0x55, sizeof(block));
558 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +0000559 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000560 __asm__ __volatile__(
561 "ldr q7, [%0, #0] ; "
562 "sminv b8, v7.16b ; "
563 "str q8, [%0, #16] "
564 : : "r"(&block[0]) : "memory", "v7", "v8"
565 );
566 printf("SMINV b8, v7.16b ");
567 showV128(&block[0]); printf(" ");
568 showV128(&block[1]); printf("\n");
569 }
570
571 /* -- 8b -- */
572
573 for (i = 0; i < 10; i++) {
574 memset(&block, 0x55, sizeof(block));
575 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +0000576 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000577 __asm__ __volatile__(
578 "ldr q7, [%0, #0] ; "
579 "sminv b8, v7.8b ; "
580 "str q8, [%0, #16] "
581 : : "r"(&block[0]) : "memory", "v7", "v8"
582 );
583 printf("SMINV b8, v7.8b ");
584 showV128(&block[0]); printf(" ");
585 showV128(&block[1]); printf("\n");
586 }
587
588}
589
590
591void test_SMAXV ( void )
592{
593 int i;
594 V128 block[2];
595
596 /* -- 4s -- */
597
598 for (i = 0; i < 10; i++) {
599 memset(&block, 0x55, sizeof(block));
600 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +0000601 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000602 __asm__ __volatile__(
603 "ldr q7, [%0, #0] ; "
604 "smaxv s8, v7.4s ; "
605 "str q8, [%0, #16] "
606 : : "r"(&block[0]) : "memory", "v7", "v8"
607 );
608 printf("SMAXV v8, v7.4s ");
609 showV128(&block[0]); printf(" ");
610 showV128(&block[1]); printf("\n");
611 }
612
613 /* -- 8h -- */
614
615 for (i = 0; i < 10; i++) {
616 memset(&block, 0x55, sizeof(block));
617 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +0000618 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000619 __asm__ __volatile__(
620 "ldr q7, [%0, #0] ; "
621 "smaxv h8, v7.8h ; "
622 "str q8, [%0, #16] "
623 : : "r"(&block[0]) : "memory", "v7", "v8"
624 );
625 printf("SMAXV h8, v7.8h ");
626 showV128(&block[0]); printf(" ");
627 showV128(&block[1]); printf("\n");
628 }
629
630 /* -- 4h -- */
631
632 for (i = 0; i < 10; i++) {
633 memset(&block, 0x55, sizeof(block));
634 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +0000635 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000636 __asm__ __volatile__(
637 "ldr q7, [%0, #0] ; "
638 "smaxv h8, v7.4h ; "
639 "str q8, [%0, #16] "
640 : : "r"(&block[0]) : "memory", "v7", "v8"
641 );
642 printf("SMAXV h8, v7.4h ");
643 showV128(&block[0]); printf(" ");
644 showV128(&block[1]); printf("\n");
645 }
646
647 /* -- 16b -- */
648
649 for (i = 0; i < 10; i++) {
650 memset(&block, 0x55, sizeof(block));
651 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +0000652 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000653 __asm__ __volatile__(
654 "ldr q7, [%0, #0] ; "
655 "smaxv b8, v7.16b ; "
656 "str q8, [%0, #16] "
657 : : "r"(&block[0]) : "memory", "v7", "v8"
658 );
659 printf("SMAXV b8, v7.16b ");
660 showV128(&block[0]); printf(" ");
661 showV128(&block[1]); printf("\n");
662 }
663
664 /* -- 8b -- */
665
666 for (i = 0; i < 10; i++) {
667 memset(&block, 0x55, sizeof(block));
668 randV128(&block[0]);
sewardjd89499b2014-03-02 12:48:34 +0000669 randV128(&block[1]);
sewardj94f53cb2014-03-01 11:27:18 +0000670 __asm__ __volatile__(
671 "ldr q7, [%0, #0] ; "
672 "smaxv b8, v7.8b ; "
673 "str q8, [%0, #16] "
674 : : "r"(&block[0]) : "memory", "v7", "v8"
675 );
676 printf("SMAXV b8, v7.8b ");
677 showV128(&block[0]); printf(" ");
678 showV128(&block[1]); printf("\n");
679 }
680
681}
682
sewardj94f53cb2014-03-01 11:27:18 +0000683/* Note this also sets the destination register to a known value (0x55..55)
684 since it can sometimes be an input to the instruction too. */
685#define GEN_BINARY_TEST(INSN,SUFFIX) \
686 __attribute__((noinline)) \
687 static void test_##INSN##_##SUFFIX ( void ) { \
688 Int i; \
689 for (i = 0; i < ITERS; i++) { \
690 V128 block[3]; \
691 memset(block, 0x55, sizeof(block)); \
692 randV128(&block[0]); \
693 randV128(&block[1]); \
sewardjd89499b2014-03-02 12:48:34 +0000694 randV128(&block[2]); \
sewardj94f53cb2014-03-01 11:27:18 +0000695 __asm__ __volatile__( \
696 "ldr q7, [%0, #0] ; " \
697 "ldr q8, [%0, #16] ; " \
698 "ldr q9, [%0, #32] ; " \
699 #INSN " v9." #SUFFIX ", v7." #SUFFIX ", v8." #SUFFIX " ; " \
700 "str q9, [%0, #32] " \
701 : : "r"(&block[0]) : "memory", "v7", "v8", "v9" \
702 ); \
703 printf(#INSN " v9." #SUFFIX ", v7." #SUFFIX ", v8." #SUFFIX " "); \
704 showV128(&block[0]); printf(" "); \
705 showV128(&block[1]); printf(" "); \
706 showV128(&block[2]); printf("\n"); \
707 } \
708 }
709
710
711/* Note this also sets the destination register to a known value (0x55..55)
712 since it can sometimes be an input to the instruction too. */
713#define GEN_SHIFT_TEST(INSN,SUFFIXD,SUFFIXN,AMOUNT) \
714 __attribute__((noinline)) \
715 static void test_##INSN##_##SUFFIXD##_##SUFFIXN##_##AMOUNT ( void ) { \
716 Int i; \
717 for (i = 0; i < ITERS; i++) { \
718 V128 block[2]; \
719 memset(block, 0x55, sizeof(block)); \
720 randV128(&block[0]); \
sewardjd89499b2014-03-02 12:48:34 +0000721 randV128(&block[1]); \
sewardj94f53cb2014-03-01 11:27:18 +0000722 __asm__ __volatile__( \
723 "ldr q7, [%0, #0] ; " \
724 "ldr q8, [%0, #16] ; " \
725 #INSN " v8." #SUFFIXD ", v7." #SUFFIXN ", #" #AMOUNT " ; " \
726 "str q8, [%0, #16] " \
727 : : "r"(&block[0]) : "memory", "v7", "v8" \
728 ); \
729 printf(#INSN " v8." #SUFFIXD ", v7." #SUFFIXN ", #" #AMOUNT " "); \
730 showV128(&block[0]); printf(" "); \
731 showV128(&block[1]); printf("\n"); \
732 } \
733 }
734
735/* Note this also sets the destination register to a known value (0x55..55)
736 since it can sometimes be an input to the instruction too. */
737#define GEN_UNARY_TEST(INSN,SUFFIXD,SUFFIXN) \
738 __attribute__((noinline)) \
739 static void test_##INSN##_##SUFFIXD##_##SUFFIXN ( void ) { \
740 Int i; \
741 for (i = 0; i < ITERS; i++) { \
742 V128 block[2]; \
743 memset(block, 0x55, sizeof(block)); \
744 randV128(&block[0]); \
sewardjd89499b2014-03-02 12:48:34 +0000745 randV128(&block[1]); \
sewardj94f53cb2014-03-01 11:27:18 +0000746 __asm__ __volatile__( \
747 "ldr q7, [%0, #0] ; " \
748 "ldr q8, [%0, #16] ; " \
749 #INSN " v8." #SUFFIXD ", v7." #SUFFIXN " ; " \
750 "str q8, [%0, #16] " \
751 : : "r"(&block[0]) : "memory", "v7", "v8" \
752 ); \
753 printf(#INSN " v8." #SUFFIXD ", v7." #SUFFIXN); \
754 showV128(&block[0]); printf(" "); \
755 showV128(&block[1]); printf("\n"); \
756 } \
757 }
758
759
760GEN_BINARY_TEST(umax, 4s)
761GEN_BINARY_TEST(umax, 8h)
762GEN_BINARY_TEST(umax, 4h)
763GEN_BINARY_TEST(umax, 16b)
764GEN_BINARY_TEST(umax, 8b)
765
766GEN_BINARY_TEST(umin, 4s)
767GEN_BINARY_TEST(umin, 8h)
768GEN_BINARY_TEST(umin, 4h)
769GEN_BINARY_TEST(umin, 16b)
770GEN_BINARY_TEST(umin, 8b)
771
772GEN_BINARY_TEST(smax, 4s)
773GEN_BINARY_TEST(smax, 8h)
774GEN_BINARY_TEST(smax, 4h)
775GEN_BINARY_TEST(smax, 16b)
776GEN_BINARY_TEST(smax, 8b)
777
778GEN_BINARY_TEST(smin, 4s)
779GEN_BINARY_TEST(smin, 8h)
780GEN_BINARY_TEST(smin, 4h)
781GEN_BINARY_TEST(smin, 16b)
782GEN_BINARY_TEST(smin, 8b)
783
784GEN_BINARY_TEST(add, 2d)
785GEN_BINARY_TEST(add, 4s)
786GEN_BINARY_TEST(add, 2s)
787GEN_BINARY_TEST(add, 8h)
788GEN_BINARY_TEST(add, 4h)
789GEN_BINARY_TEST(add, 16b)
790GEN_BINARY_TEST(add, 8b)
791
792GEN_BINARY_TEST(sub, 2d)
793GEN_BINARY_TEST(sub, 4s)
794GEN_BINARY_TEST(sub, 2s)
795GEN_BINARY_TEST(sub, 8h)
796GEN_BINARY_TEST(sub, 4h)
797GEN_BINARY_TEST(sub, 16b)
798GEN_BINARY_TEST(sub, 8b)
799
800GEN_BINARY_TEST(mul, 4s)
801GEN_BINARY_TEST(mul, 2s)
802GEN_BINARY_TEST(mul, 8h)
803GEN_BINARY_TEST(mul, 4h)
804GEN_BINARY_TEST(mul, 16b)
805GEN_BINARY_TEST(mul, 8b)
806
807GEN_BINARY_TEST(mla, 4s)
808GEN_BINARY_TEST(mla, 2s)
809GEN_BINARY_TEST(mla, 8h)
810GEN_BINARY_TEST(mla, 4h)
811GEN_BINARY_TEST(mla, 16b)
812GEN_BINARY_TEST(mla, 8b)
813
814GEN_BINARY_TEST(mls, 4s)
815GEN_BINARY_TEST(mls, 2s)
816GEN_BINARY_TEST(mls, 8h)
817GEN_BINARY_TEST(mls, 4h)
818GEN_BINARY_TEST(mls, 16b)
819GEN_BINARY_TEST(mls, 8b)
820
821GEN_BINARY_TEST(and, 16b)
822GEN_BINARY_TEST(and, 8b)
823
824GEN_BINARY_TEST(bic, 16b)
825GEN_BINARY_TEST(bic, 8b)
826
827GEN_BINARY_TEST(orr, 16b)
828GEN_BINARY_TEST(orr, 8b)
829
830GEN_BINARY_TEST(orn, 16b)
831GEN_BINARY_TEST(orn, 8b)
832
833GEN_BINARY_TEST(eor, 16b)
834GEN_BINARY_TEST(eor, 8b)
835
836GEN_BINARY_TEST(bsl, 16b)
837GEN_BINARY_TEST(bsl, 8b)
838
839GEN_BINARY_TEST(bit, 16b)
840GEN_BINARY_TEST(bit, 8b)
841
842GEN_BINARY_TEST(bif, 16b)
843GEN_BINARY_TEST(bif, 8b)
844
845GEN_BINARY_TEST(cmeq, 2d)
846GEN_BINARY_TEST(cmeq, 4s)
847GEN_BINARY_TEST(cmeq, 2s)
848GEN_BINARY_TEST(cmeq, 8h)
849GEN_BINARY_TEST(cmeq, 4h)
850GEN_BINARY_TEST(cmeq, 16b)
851GEN_BINARY_TEST(cmeq, 8b)
852
853GEN_BINARY_TEST(cmtst, 2d)
854GEN_BINARY_TEST(cmtst, 4s)
855GEN_BINARY_TEST(cmtst, 2s)
856GEN_BINARY_TEST(cmtst, 8h)
857GEN_BINARY_TEST(cmtst, 4h)
858GEN_BINARY_TEST(cmtst, 16b)
859GEN_BINARY_TEST(cmtst, 8b)
860
861GEN_BINARY_TEST(cmhi, 2d)
862GEN_BINARY_TEST(cmhi, 4s)
863GEN_BINARY_TEST(cmhi, 2s)
864GEN_BINARY_TEST(cmhi, 8h)
865GEN_BINARY_TEST(cmhi, 4h)
866GEN_BINARY_TEST(cmhi, 16b)
867GEN_BINARY_TEST(cmhi, 8b)
868
869GEN_BINARY_TEST(cmgt, 2d)
870GEN_BINARY_TEST(cmgt, 4s)
871GEN_BINARY_TEST(cmgt, 2s)
872GEN_BINARY_TEST(cmgt, 8h)
873GEN_BINARY_TEST(cmgt, 4h)
874GEN_BINARY_TEST(cmgt, 16b)
875GEN_BINARY_TEST(cmgt, 8b)
876
877GEN_BINARY_TEST(cmhs, 2d)
878GEN_BINARY_TEST(cmhs, 4s)
879GEN_BINARY_TEST(cmhs, 2s)
880GEN_BINARY_TEST(cmhs, 8h)
881GEN_BINARY_TEST(cmhs, 4h)
882GEN_BINARY_TEST(cmhs, 16b)
883GEN_BINARY_TEST(cmhs, 8b)
884
885GEN_BINARY_TEST(cmge, 2d)
886GEN_BINARY_TEST(cmge, 4s)
887GEN_BINARY_TEST(cmge, 2s)
888GEN_BINARY_TEST(cmge, 8h)
889GEN_BINARY_TEST(cmge, 4h)
890GEN_BINARY_TEST(cmge, 16b)
891GEN_BINARY_TEST(cmge, 8b)
892
893GEN_SHIFT_TEST(ushr, 2d, 2d, 1)
894GEN_SHIFT_TEST(ushr, 2d, 2d, 13)
895GEN_SHIFT_TEST(ushr, 2d, 2d, 63)
896GEN_SHIFT_TEST(sshr, 2d, 2d, 1)
897GEN_SHIFT_TEST(sshr, 2d, 2d, 13)
898GEN_SHIFT_TEST(sshr, 2d, 2d, 63)
sewardjd89499b2014-03-02 12:48:34 +0000899GEN_SHIFT_TEST(shl, 2d, 2d, 1)
900GEN_SHIFT_TEST(shl, 2d, 2d, 13)
901GEN_SHIFT_TEST(shl, 2d, 2d, 63)
sewardj94f53cb2014-03-01 11:27:18 +0000902
903GEN_SHIFT_TEST(ushr, 4s, 4s, 1)
904GEN_SHIFT_TEST(ushr, 4s, 4s, 13)
905GEN_SHIFT_TEST(ushr, 4s, 4s, 31)
906GEN_SHIFT_TEST(sshr, 4s, 4s, 1)
907GEN_SHIFT_TEST(sshr, 4s, 4s, 13)
908GEN_SHIFT_TEST(sshr, 4s, 4s, 31)
sewardjd89499b2014-03-02 12:48:34 +0000909GEN_SHIFT_TEST(shl, 4s, 4s, 1)
910GEN_SHIFT_TEST(shl, 4s, 4s, 13)
911GEN_SHIFT_TEST(shl, 4s, 4s, 31)
sewardj94f53cb2014-03-01 11:27:18 +0000912
913GEN_SHIFT_TEST(ushr, 2s, 2s, 1)
914GEN_SHIFT_TEST(ushr, 2s, 2s, 13)
915GEN_SHIFT_TEST(ushr, 2s, 2s, 31)
916GEN_SHIFT_TEST(sshr, 2s, 2s, 1)
917GEN_SHIFT_TEST(sshr, 2s, 2s, 13)
918GEN_SHIFT_TEST(sshr, 2s, 2s, 31)
sewardjd89499b2014-03-02 12:48:34 +0000919GEN_SHIFT_TEST(shl, 2s, 2s, 1)
920GEN_SHIFT_TEST(shl, 2s, 2s, 13)
921GEN_SHIFT_TEST(shl, 2s, 2s, 31)
sewardj94f53cb2014-03-01 11:27:18 +0000922
923GEN_SHIFT_TEST(ushr, 8h, 8h, 1)
924GEN_SHIFT_TEST(ushr, 8h, 8h, 13)
925GEN_SHIFT_TEST(ushr, 8h, 8h, 15)
926GEN_SHIFT_TEST(sshr, 8h, 8h, 1)
927GEN_SHIFT_TEST(sshr, 8h, 8h, 13)
928GEN_SHIFT_TEST(sshr, 8h, 8h, 15)
sewardjd89499b2014-03-02 12:48:34 +0000929GEN_SHIFT_TEST(shl, 8h, 8h, 1)
930GEN_SHIFT_TEST(shl, 8h, 8h, 13)
931GEN_SHIFT_TEST(shl, 8h, 8h, 15)
sewardj94f53cb2014-03-01 11:27:18 +0000932
933GEN_SHIFT_TEST(ushr, 4h, 4h, 1)
934GEN_SHIFT_TEST(ushr, 4h, 4h, 13)
935GEN_SHIFT_TEST(ushr, 4h, 4h, 15)
936GEN_SHIFT_TEST(sshr, 4h, 4h, 1)
937GEN_SHIFT_TEST(sshr, 4h, 4h, 13)
938GEN_SHIFT_TEST(sshr, 4h, 4h, 15)
sewardjd89499b2014-03-02 12:48:34 +0000939GEN_SHIFT_TEST(shl, 4h, 4h, 1)
940GEN_SHIFT_TEST(shl, 4h, 4h, 13)
941GEN_SHIFT_TEST(shl, 4h, 4h, 15)
sewardj94f53cb2014-03-01 11:27:18 +0000942
943GEN_SHIFT_TEST(ushr, 16b, 16b, 1)
944GEN_SHIFT_TEST(ushr, 16b, 16b, 7)
945GEN_SHIFT_TEST(sshr, 16b, 16b, 1)
946GEN_SHIFT_TEST(sshr, 16b, 16b, 7)
sewardjd89499b2014-03-02 12:48:34 +0000947GEN_SHIFT_TEST(shl, 16b, 16b, 1)
948GEN_SHIFT_TEST(shl, 16b, 16b, 7)
sewardj94f53cb2014-03-01 11:27:18 +0000949
950GEN_SHIFT_TEST(ushr, 8b, 8b, 1)
951GEN_SHIFT_TEST(ushr, 8b, 8b, 7)
952GEN_SHIFT_TEST(sshr, 8b, 8b, 1)
953GEN_SHIFT_TEST(sshr, 8b, 8b, 7)
sewardjd89499b2014-03-02 12:48:34 +0000954GEN_SHIFT_TEST(shl, 8b, 8b, 1)
955GEN_SHIFT_TEST(shl, 8b, 8b, 7)
sewardj94f53cb2014-03-01 11:27:18 +0000956
957GEN_SHIFT_TEST(ushll, 2d, 2s, 0)
958GEN_SHIFT_TEST(ushll, 2d, 2s, 15)
959GEN_SHIFT_TEST(ushll, 2d, 2s, 31)
960GEN_SHIFT_TEST(ushll2, 2d, 4s, 0)
961GEN_SHIFT_TEST(ushll2, 2d, 4s, 15)
962GEN_SHIFT_TEST(ushll2, 2d, 4s, 31)
963
964GEN_SHIFT_TEST(sshll, 2d, 2s, 0)
965GEN_SHIFT_TEST(sshll, 2d, 2s, 15)
966GEN_SHIFT_TEST(sshll, 2d, 2s, 31)
967GEN_SHIFT_TEST(sshll2, 2d, 4s, 0)
968GEN_SHIFT_TEST(sshll2, 2d, 4s, 15)
969GEN_SHIFT_TEST(sshll2, 2d, 4s, 31)
970
971GEN_UNARY_TEST(xtn, 2s, 2d)
972GEN_UNARY_TEST(xtn2, 4s, 2d)
973GEN_UNARY_TEST(xtn, 4h, 4s)
974GEN_UNARY_TEST(xtn2, 8h, 4s)
975
sewardjd89499b2014-03-02 12:48:34 +0000976
977/* Generate a test that involves one integer reg and one vector reg,
978 with no bias as towards which is input or output. */
979#define GEN_ONEINT_ONEVEC_TEST(TESTNAME,INSN,INTREGNO,VECREGNO) \
980 __attribute__((noinline)) \
981 static void test_##TESTNAME ( void ) { \
982 Int i; \
983 for (i = 0; i < ITERS; i++) { \
984 V128 block[4]; \
985 memset(block, 0x55, sizeof(block)); \
986 randV128(&block[0]); \
987 randV128(&block[1]); \
988 randV128(&block[2]); \
989 randV128(&block[3]); \
990 __asm__ __volatile__( \
991 "ldr q"#VECREGNO", [%0, #0] ; " \
992 "ldr x"#INTREGNO", [%0, #16] ; " \
993 INSN " ; " \
994 "str q"#VECREGNO", [%0, #32] ; " \
995 "str x"#INTREGNO", [%0, #48] ; " \
996 : : "r"(&block[0]) : "memory", "v"#VECREGNO, "x"#INTREGNO \
997 ); \
998 printf(INSN " "); \
999 showV128(&block[0]); printf(" "); \
1000 showV128(&block[1]); printf(" "); \
1001 showV128(&block[2]); printf(" "); \
1002 showV128(&block[3]); printf("\n"); \
1003 } \
1004 }
1005
1006GEN_ONEINT_ONEVEC_TEST(umov_01, "umov x9, v10.d[0]", 9, 10)
1007GEN_ONEINT_ONEVEC_TEST(umov_02, "umov x9, v10.d[1]", 9, 10)
1008GEN_ONEINT_ONEVEC_TEST(umov_03, "umov w9, v10.s[0]", 9, 10)
1009GEN_ONEINT_ONEVEC_TEST(umov_04, "umov w9, v10.s[3]", 9, 10)
1010GEN_ONEINT_ONEVEC_TEST(umov_05, "umov w9, v10.h[0]", 9, 10)
1011GEN_ONEINT_ONEVEC_TEST(umov_06, "umov w9, v10.h[7]", 9, 10)
1012GEN_ONEINT_ONEVEC_TEST(umov_07, "umov w9, v10.b[0]", 9, 10)
1013GEN_ONEINT_ONEVEC_TEST(umov_08, "umov w9, v10.b[15]", 9, 10)
1014
1015GEN_ONEINT_ONEVEC_TEST(smov_01, "smov x9, v10.s[0]", 9, 10)
1016GEN_ONEINT_ONEVEC_TEST(smov_02, "smov x9, v10.s[3]", 9, 10)
1017
1018GEN_ONEINT_ONEVEC_TEST(smov_03, "smov x9, v10.h[0]", 9, 10)
1019GEN_ONEINT_ONEVEC_TEST(smov_04, "smov x9, v10.h[7]", 9, 10)
1020GEN_ONEINT_ONEVEC_TEST(smov_05, "smov w9, v10.h[0]", 9, 10)
1021GEN_ONEINT_ONEVEC_TEST(smov_06, "smov w9, v10.h[7]", 9, 10)
1022
1023GEN_ONEINT_ONEVEC_TEST(smov_07, "smov x9, v10.b[0]", 9, 10)
1024GEN_ONEINT_ONEVEC_TEST(smov_08, "smov x9, v10.b[15]", 9, 10)
1025GEN_ONEINT_ONEVEC_TEST(smov_09, "smov w9, v10.b[0]", 9, 10)
1026GEN_ONEINT_ONEVEC_TEST(smov_10, "smov w9, v10.b[15]", 9, 10)
1027
1028/* Generate a test that involves two vector regs,
1029 with no bias as towards which is input or output. */
1030#define GEN_TWOVEC_TEST(TESTNAME,INSN,VECREG1NO,VECREG2NO) \
1031 __attribute__((noinline)) \
1032 static void test_##TESTNAME ( void ) { \
1033 Int i; \
1034 for (i = 0; i < ITERS; i++) { \
1035 V128 block[4]; \
1036 memset(block, 0x55, sizeof(block)); \
1037 randV128(&block[0]); \
1038 randV128(&block[1]); \
1039 randV128(&block[2]); \
1040 randV128(&block[3]); \
1041 __asm__ __volatile__( \
1042 "ldr q"#VECREG1NO", [%0, #0] ; " \
1043 "ldr q"#VECREG2NO", [%0, #16] ; " \
1044 INSN " ; " \
1045 "str q"#VECREG1NO", [%0, #32] ; " \
1046 "str q"#VECREG2NO", [%0, #48] ; " \
1047 : : "r"(&block[0]) : "memory", "v"#VECREG1NO, "v"#VECREG2NO \
1048 ); \
1049 printf(INSN " "); \
1050 showV128(&block[0]); printf(" "); \
1051 showV128(&block[1]); printf(" "); \
1052 showV128(&block[2]); printf(" "); \
1053 showV128(&block[3]); printf("\n"); \
1054 } \
1055 }
1056
1057GEN_TWOVEC_TEST(fcvtn_01, "fcvtn v22.2s, v23.2d", 22, 23)
1058GEN_TWOVEC_TEST(fcvtn_02, "fcvtn2 v22.4s, v23.2d", 22, 23)
1059
1060GEN_UNARY_TEST(neg, 2d, 2d)
1061GEN_UNARY_TEST(neg, 4s, 4s)
1062GEN_UNARY_TEST(neg, 2s, 2s)
1063GEN_UNARY_TEST(neg, 8h, 8h)
1064GEN_UNARY_TEST(neg, 4h, 4h)
1065GEN_UNARY_TEST(neg, 16b, 16b)
1066GEN_UNARY_TEST(neg, 8b, 8b)
1067GEN_BINARY_TEST(fadd, 2d)
1068GEN_BINARY_TEST(fadd, 4s)
1069GEN_BINARY_TEST(fadd, 2s)
1070GEN_BINARY_TEST(fsub, 2d)
1071GEN_BINARY_TEST(fsub, 4s)
1072GEN_BINARY_TEST(fsub, 2s)
1073GEN_BINARY_TEST(fmul, 2d)
1074GEN_BINARY_TEST(fmul, 4s)
1075GEN_BINARY_TEST(fmul, 2s)
1076GEN_BINARY_TEST(fdiv, 2d)
1077GEN_BINARY_TEST(fdiv, 4s)
1078GEN_BINARY_TEST(fdiv, 2s)
1079GEN_BINARY_TEST(fmla, 2d)
1080GEN_BINARY_TEST(fmla, 4s)
1081GEN_BINARY_TEST(fmla, 2s)
1082GEN_BINARY_TEST(fmls, 2d)
1083GEN_BINARY_TEST(fmls, 4s)
1084GEN_BINARY_TEST(fmls, 2s)
1085GEN_BINARY_TEST(fabd, 2d)
1086GEN_BINARY_TEST(fabd, 4s)
1087GEN_BINARY_TEST(fabd, 2s)
1088
1089/* Generate a test that involves three vector regs,
1090 with no bias as towards which is input or output. */
1091#define GEN_THREEVEC_TEST(TESTNAME,INSN,VECREG1NO,VECREG2NO,VECREG3NO) \
1092 __attribute__((noinline)) \
1093 static void test_##TESTNAME ( void ) { \
1094 Int i; \
1095 for (i = 0; i < ITERS; i++) { \
1096 V128 block[6]; \
1097 memset(block, 0x55, sizeof(block)); \
1098 randV128(&block[0]); \
1099 randV128(&block[1]); \
1100 randV128(&block[2]); \
1101 randV128(&block[3]); \
1102 randV128(&block[4]); \
1103 randV128(&block[5]); \
1104 __asm__ __volatile__( \
1105 "ldr q"#VECREG1NO", [%0, #0] ; " \
1106 "ldr q"#VECREG2NO", [%0, #16] ; " \
1107 "ldr q"#VECREG3NO", [%0, #32] ; " \
1108 INSN " ; " \
1109 "str q"#VECREG1NO", [%0, #48] ; " \
1110 "str q"#VECREG2NO", [%0, #64] ; " \
1111 "str q"#VECREG3NO", [%0, #80] ; " \
1112 : : "r"(&block[0]) : "memory", "v"#VECREG1NO, "v"#VECREG2NO, "v"#VECREG3NO \
1113 ); \
1114 printf(INSN " "); \
1115 showV128(&block[0]); printf(" "); \
1116 showV128(&block[1]); printf(" "); \
1117 showV128(&block[2]); printf(" "); \
1118 showV128(&block[3]); printf(" "); \
1119 showV128(&block[4]); printf(" "); \
1120 showV128(&block[5]); printf("\n"); \
1121 } \
1122 }
1123
1124GEN_THREEVEC_TEST(add_d_d_d, "add d21, d22, d23", 21, 22, 23)
1125GEN_THREEVEC_TEST(sub_d_d_d, "sub d21, d22, d23", 21, 22, 23)
1126
1127/* overkill -- don't need two vecs, only one */
1128GEN_TWOVEC_TEST(fmov_scalar_imm_01, "fmov d22, #0.125", 22, 23)
1129GEN_TWOVEC_TEST(fmov_scalar_imm_02, "fmov d22, #-4.0", 22, 23)
1130GEN_TWOVEC_TEST(fmov_scalar_imm_03, "fmov d22, #1.0", 22, 23)
1131GEN_TWOVEC_TEST(fmov_scalar_imm_04, "fmov s22, #0.125", 22, 23)
1132GEN_TWOVEC_TEST(fmov_scalar_imm_05, "fmov s22, #-4.0", 22, 23)
1133GEN_TWOVEC_TEST(fmov_scalar_imm_06, "fmov s22, #-1.0", 22, 23)
1134
1135GEN_ONEINT_ONEVEC_TEST(fmov_gen_01, "fmov s7, w15", 15, 7)
1136GEN_ONEINT_ONEVEC_TEST(fmov_gen_02, "fmov d7, x15", 15, 7)
1137GEN_ONEINT_ONEVEC_TEST(fmov_gen_03, "fmov v7.d[1], x15", 15, 7)
1138GEN_ONEINT_ONEVEC_TEST(fmov_gen_04, "fmov w15, s7", 15, 7)
1139GEN_ONEINT_ONEVEC_TEST(fmov_gen_05, "fmov x15, d7", 15, 7)
1140GEN_ONEINT_ONEVEC_TEST(fmov_gen_06, "fmov x15, v7.d[1]", 15, 7)
1141
1142GEN_TWOVEC_TEST(movi_vector_imm_01, "fmov d22, #0.125", 22, 23)
1143GEN_TWOVEC_TEST(movi_vector_imm_02, "fmov d22, #-4.0", 22, 23)
1144GEN_TWOVEC_TEST(movi_vector_imm_03, "fmov d22, #1.0", 22, 23)
1145GEN_TWOVEC_TEST(movi_vector_imm_04, "fmov v22.2d, #0.125", 22, 23)
1146GEN_TWOVEC_TEST(movi_vector_imm_05, "fmov v22.2d, #-4.0", 22, 23)
1147GEN_TWOVEC_TEST(movi_vector_imm_06, "fmov v22.2d, #1.0", 22, 23)
1148
1149GEN_ONEINT_ONEVEC_TEST(sucvtf_01, "scvtf s7, w15", 15, 7)
1150GEN_ONEINT_ONEVEC_TEST(sucvtf_02, "scvtf d7, w15", 15, 7)
1151GEN_ONEINT_ONEVEC_TEST(sucvtf_03, "scvtf s7, x15", 15, 7)
1152GEN_ONEINT_ONEVEC_TEST(sucvtf_04, "scvtf d7, x15", 15, 7)
1153GEN_ONEINT_ONEVEC_TEST(sucvtf_05, "ucvtf s7, w15", 15, 7)
1154GEN_ONEINT_ONEVEC_TEST(sucvtf_06, "ucvtf d7, w15", 15, 7)
1155GEN_ONEINT_ONEVEC_TEST(sucvtf_07, "ucvtf s7, x15", 15, 7)
1156GEN_ONEINT_ONEVEC_TEST(sucvtf_08, "ucvtf d7, x15", 15, 7)
1157
1158GEN_THREEVEC_TEST(fadd_d, "fadd d2, d11, d29", 2, 11, 29)
1159GEN_THREEVEC_TEST(fadd_s, "fadd s2, s11, s29", 2, 11, 29)
1160GEN_THREEVEC_TEST(fsub_d, "fsub d2, d11, d29", 2, 11, 29)
1161GEN_THREEVEC_TEST(fsub_s, "fsub s2, s11, s29", 2, 11, 29)
1162GEN_THREEVEC_TEST(fmul_d, "fmul d2, d11, d29", 2, 11, 29)
1163GEN_THREEVEC_TEST(fmul_s, "fmul s2, s11, s29", 2, 11, 29)
1164GEN_THREEVEC_TEST(fdiv_d, "fdiv d2, d11, d29", 2, 11, 29)
1165GEN_THREEVEC_TEST(fdiv_s, "fdiv s2, s11, s29", 2, 11, 29)
1166GEN_THREEVEC_TEST(fnmul_d, "fnmul d2, d11, d29", 2, 11, 29)
1167GEN_THREEVEC_TEST(fnmul_s, "fnmul s2, s11, s29", 2, 11, 29)
1168
1169GEN_THREEVEC_TEST(fabd_d, "fabd d2, d11, d29", 2, 11, 29)
1170GEN_THREEVEC_TEST(fabd_s, "fabd s2, s11, s29", 2, 11, 29)
1171
1172GEN_TWOVEC_TEST(fmov_d, "fmov d22, d23", 22, 23)
1173GEN_TWOVEC_TEST(fmov_s, "fmov s22, s23", 22, 23)
1174GEN_TWOVEC_TEST(fabs_d, "fabs d22, d23", 22, 23)
1175GEN_TWOVEC_TEST(fabs_s, "fabs s22, s23", 22, 23)
1176GEN_TWOVEC_TEST(fneg_d, "fneg d22, d23", 22, 23)
1177GEN_TWOVEC_TEST(fneg_s, "fneg s22, s23", 22, 23)
1178GEN_TWOVEC_TEST(fsqrt_d, "fsqrt d22, d23", 22, 23)
1179GEN_TWOVEC_TEST(fsqrt_s, "fsqrt s22, s23", 22, 23)
1180
1181GEN_UNARY_TEST(fneg, 2d, 2d)
1182GEN_UNARY_TEST(fneg, 4s, 4s)
1183GEN_UNARY_TEST(fneg, 2s, 2s)
1184GEN_UNARY_TEST(fabs, 2d, 2d)
1185GEN_UNARY_TEST(fabs, 4s, 4s)
1186GEN_UNARY_TEST(fabs, 2s, 2s)
1187
1188/* IMPORTANT: keep the tests in here in the same order as the
1189 implementations are in guest_arm64_toIR.c. */
sewardj94f53cb2014-03-01 11:27:18 +00001190int main ( void )
1191{
1192 assert(sizeof(V128) == 16);
1193
sewardjd89499b2014-03-02 12:48:34 +00001194 printf("BEGIN: FMOV (general)\n");
1195 test_fmov_gen_01();
1196 test_fmov_gen_02();
1197 test_fmov_gen_03();
1198 test_fmov_gen_04();
1199 test_fmov_gen_05();
1200 test_fmov_gen_06();
1201 printf("END: FMOV (general)\n\n");
sewardj94f53cb2014-03-01 11:27:18 +00001202
sewardjd89499b2014-03-02 12:48:34 +00001203 printf("BEGIN: FMOV (scalar, immediate)\n");
1204 test_fmov_scalar_imm_01();
1205 test_fmov_scalar_imm_02();
1206 test_fmov_scalar_imm_03();
1207 test_fmov_scalar_imm_04();
1208 test_fmov_scalar_imm_05();
1209 test_fmov_scalar_imm_06();
1210 printf("END: FMOV (scalar, immediate)\n\n");
1211
1212 printf("BEGIN: {FMOV,MOVI} (vector, immediate)\n");
1213 test_movi_vector_imm_01();
1214 test_movi_vector_imm_02();
1215 test_movi_vector_imm_03();
1216 test_movi_vector_imm_04();
1217 test_movi_vector_imm_05();
1218 test_movi_vector_imm_06();
1219 printf("END: {FMOV,MOVI} (vector, immediate)\n\n");
1220
1221 printf("BEGIN: {S,U}CVTF (scalar, integer)\n");
1222 test_sucvtf_01();
1223 test_sucvtf_02();
1224 test_sucvtf_03();
1225 test_sucvtf_04();
1226 //test_sucvtf_05();
1227 test_sucvtf_06();
1228 test_sucvtf_07();
1229 test_sucvtf_08();
1230 printf("END: {S,U}CVTF (scalar, integer) (MISSING 1 case of 8)\n\n");
1231
1232 printf("BEGIN: F{ADD,SUB,MUL,DIV,NMUL} (scalar)\n");
1233 test_fadd_d();
1234 test_fadd_s();
1235 test_fsub_d();
1236 test_fsub_s();
1237 test_fmul_d();
1238 test_fmul_s();
1239 test_fdiv_d();
1240 test_fdiv_s();
1241 test_fnmul_d();
1242 test_fnmul_s();
1243 printf("END: F{ADD,SUB,MUL,DIV,NMUL} (scalar)\n\n");
1244
1245 printf("BEGIN: F{MOV,ABS,NEG,SQRT} D/D or S/S\n");
1246 test_fmov_d();
1247 test_fmov_s();
1248 test_fabs_d();
1249 test_fabs_s();
1250 test_fneg_d();
1251 test_fneg_s();
1252 test_fsqrt_d();
1253 test_fsqrt_s();
1254 printf("END: F{MOV,ABS,NEG,SQRT} D/D or S/S\n\n");
1255
1256 printf("BEGIN: F{ABS,NEG} (vector)\n");
1257 test_fabs_2d_2d();
1258 //test_fabs_4s_4s();
1259 //test_fabs_2s_2s();
1260 test_fneg_2d_2d();
1261 //test_fneg_4s_4s();
1262 //test_fneg_2s_2s();
1263 printf("END: F{ABS,NEG} (vector) (MISSING 4s/2s cases)\n\n");
1264
1265 printf("FCMP,FCMPE MISSING\n\n");
1266
1267 printf("F{N}M{ADD,SUB} MISSING\n\n");
1268
1269 printf("FCVT{N,P,M,Z}{S,U} (scalar, integer) MISSING\n\n");
1270
1271 printf("FRINT{I,M,P,Z} (scalar) MISSING\n\n");
1272
1273 printf("FCVT (scalar) MISSING\n\n");
1274
1275 printf("BEGIN: FABD (scalar) MISSING\n");
1276 test_fabd_d();
1277 test_fabd_s();
1278 printf("END: FABD (scalar) MISSING\n\n");
1279
1280 printf("{S,U}CVTF (vector, integer) MISSING\n\n");
1281
1282 printf("BEGIN: F{ADD,SUB,MUL,DIV,MLA,MLS,ABD} (vector)\n");
1283 test_fadd_2d();
1284 test_fadd_4s();
1285 test_fadd_2s();
1286 test_fsub_2d();
1287 test_fsub_4s();
1288 test_fsub_2s();
1289 test_fmul_2d();
1290 test_fmul_4s();
1291 test_fmul_2s();
1292 test_fdiv_2d();
1293 test_fdiv_4s();
1294 test_fdiv_2s();
1295 test_fmla_2d();
1296 test_fmla_4s();
1297 test_fmla_2s();
1298 test_fmls_2d();
1299 test_fmls_4s();
1300 test_fmls_2s();
1301 test_fabd_2d();
1302 //test_fabd_4s();
1303 //test_fabd_2s();
1304 printf("END: F{ADD,SUB,MUL,DIV,MLA,MLS,ABD} (vector) (MISSING fabd 2s/4s)\n\n");
1305
1306 printf("BEGIN: FCVTN (MISSING 16F <- 32F cases)\n");
1307 test_fcvtn_01();
1308 test_fcvtn_02();
1309 printf("END: FCVTN (MISSING 16F <- 32F cases)\n\n");
1310
1311 printf("BEGIN: ADD/SUB (vector)\n");
sewardj94f53cb2014-03-01 11:27:18 +00001312 test_add_2d();
1313 test_add_4s();
1314 test_add_2s();
1315 test_add_8h();
1316 test_add_4h();
1317 //test_add_16b();
1318 //test_add_8b();
1319 test_sub_2d();
1320 test_sub_4s();
1321 test_sub_2s();
1322 test_sub_8h();
1323 test_sub_4h();
1324 //test_sub_16b();
1325 //test_sub_8b();
sewardjd89499b2014-03-02 12:48:34 +00001326 printf("END: ADD/SUB (vector) (MISSING b16/b8 cases)\n\n");
sewardj94f53cb2014-03-01 11:27:18 +00001327
sewardjd89499b2014-03-02 12:48:34 +00001328 printf("BEGIN: ADD/SUB (scalar)\n");
1329 test_add_d_d_d();
1330 test_sub_d_d_d();
1331 printf("END: ADD/SUB (scalar)\n\n");
sewardj94f53cb2014-03-01 11:27:18 +00001332
sewardjd89499b2014-03-02 12:48:34 +00001333 printf("BEGIN: MUL/PMUL/MLA/MLS (vector)\n");
sewardj94f53cb2014-03-01 11:27:18 +00001334 test_mul_4s();
1335 test_mul_2s();
1336 test_mul_8h();
1337 test_mul_4h();
1338 //test_mul_16b();
1339 //test_mul_8b();
1340 test_mla_4s();
1341 test_mla_2s();
1342 test_mla_8h();
1343 test_mla_4h();
1344 //test_mla_16b();
1345 //test_mla_8b();
1346 test_mls_4s();
1347 test_mls_2s();
1348 test_mls_8h();
1349 test_mls_4h();
1350 //test_mls_16b();
1351 //test_mls_8b();
sewardjd89499b2014-03-02 12:48:34 +00001352 printf("END: MUL/PMUL/MLA/MLS (vector) (partly MISSING)\n\n");
sewardj94f53cb2014-03-01 11:27:18 +00001353
sewardjd89499b2014-03-02 12:48:34 +00001354 printf("BEGIN: {S,U}{MIN,MAX} (vector)\n");
sewardj94f53cb2014-03-01 11:27:18 +00001355 test_umax_4s();
1356 test_umax_8h();
1357 test_umax_4h();
1358 test_umax_16b();
1359 test_umax_8b();
1360 test_umin_4s();
1361 test_umin_8h();
1362 test_umin_4h();
1363 test_umin_16b();
1364 test_umin_8b();
1365 test_smax_4s();
1366 test_smax_8h();
1367 test_smax_4h();
1368 test_smax_16b();
1369 test_smax_8b();
1370 test_smin_4s();
1371 test_smin_8h();
1372 test_smin_4h();
1373 test_smin_16b();
1374 test_smin_8b();
sewardjd89499b2014-03-02 12:48:34 +00001375 printf("END: {S,U}{MIN,MAX} (vector)\n\n");
sewardj94f53cb2014-03-01 11:27:18 +00001376
sewardjd89499b2014-03-02 12:48:34 +00001377 printf("BEGIN: {S,U}{MIN,MAX}V\n");
sewardj94f53cb2014-03-01 11:27:18 +00001378 test_UMINV();
1379 test_UMAXV();
1380 test_SMINV();
1381 test_SMAXV();
sewardjd89499b2014-03-02 12:48:34 +00001382 printf("END: {S,U}{MIN,MAX}V\n\n");
sewardj94f53cb2014-03-01 11:27:18 +00001383
sewardjd89499b2014-03-02 12:48:34 +00001384 printf("BEGIN: {AND,BIC,ORR,ORN} (vector)\n");
sewardj94f53cb2014-03-01 11:27:18 +00001385 test_and_16b();
1386 test_and_8b();
1387 test_bic_16b();
1388 test_bic_8b();
1389 test_orr_16b();
1390 test_orr_8b();
1391 test_orn_16b();
1392 test_orn_8b();
sewardjd89499b2014-03-02 12:48:34 +00001393 printf("END: {AND,BIC,ORR,ORN} (vector)\n\n");
sewardj94f53cb2014-03-01 11:27:18 +00001394
sewardjd89499b2014-03-02 12:48:34 +00001395 printf("BEGIN: CM{EQ,HI,HS,GE,GT,TST,LE,LT} (vector)\n\n");
sewardj94f53cb2014-03-01 11:27:18 +00001396 test_cmeq_2d();
1397#if 0
1398 test_cmeq_4s();
1399 test_cmeq_2s();
1400 test_cmeq_8h();
1401 test_cmeq_4h();
1402 test_cmeq_16b();
1403 test_cmeq_8b();
1404 test_cmtst_2d();
1405 test_cmtst_4s();
1406 test_cmtst_2s();
1407 test_cmtst_8h();
1408 test_cmtst_4h();
1409 test_cmtst_16b();
1410 test_cmtst_8b();
1411 test_cmhi_2d();
1412 test_cmhi_4s();
1413 test_cmhi_2s();
1414 test_cmhi_8h();
1415 test_cmhi_4h();
1416 test_cmhi_16b();
1417 test_cmhi_8b();
1418 test_cmgt_2d();
1419 test_cmgt_4s();
1420 test_cmgt_2s();
1421 test_cmgt_8h();
1422 test_cmgt_4h();
1423 test_cmgt_16b();
1424 test_cmgt_8b();
1425 test_cmhs_2d();
1426 test_cmhs_4s();
1427 test_cmhs_2s();
1428 test_cmhs_8h();
1429 test_cmhs_4h();
1430 test_cmhs_16b();
1431 test_cmhs_8b();
1432 test_cmge_2d();
1433 test_cmge_4s();
1434 test_cmge_2s();
1435 test_cmge_8h();
1436 test_cmge_4h();
1437 test_cmge_16b();
1438 test_cmge_8b();
1439#endif
sewardjd89499b2014-03-02 12:48:34 +00001440 printf("END: CM{EQ,HI,HS,GE,GT,TST,LE,LT} (vector) "
1441 "(w/zero and many other cases MISSING)\n\n");
sewardj94f53cb2014-03-01 11:27:18 +00001442
sewardjd89499b2014-03-02 12:48:34 +00001443 printf("BEGIN: {EOR,BSL,BIT,BIF} (vector)\n");
sewardj94f53cb2014-03-01 11:27:18 +00001444 test_eor_16b();
1445 test_eor_8b();
1446 test_bsl_16b();
1447 test_bsl_8b();
1448 test_bit_16b();
1449 test_bit_8b();
1450 test_bif_16b();
1451 test_bif_8b();
sewardjd89499b2014-03-02 12:48:34 +00001452 printf("END: {EOR,BSL,BIT,BIF} (vector)\n\n");
sewardj94f53cb2014-03-01 11:27:18 +00001453
sewardjd89499b2014-03-02 12:48:34 +00001454 printf("BEGIN: {USHR,SSHR,SHL} (vector, immediate)\n");
sewardj94f53cb2014-03-01 11:27:18 +00001455 test_ushr_2d_2d_1();
1456 test_ushr_2d_2d_13();
1457 test_ushr_2d_2d_63();
1458 test_sshr_2d_2d_1();
1459 test_sshr_2d_2d_13();
1460 test_sshr_2d_2d_63();
1461#if 0
sewardjd89499b2014-03-02 12:48:34 +00001462 test_shl_2d_2d_1();
1463 test_shl_2d_2d_13();
1464 test_shl_2d_2d_63();
1465
sewardj94f53cb2014-03-01 11:27:18 +00001466 test_ushr_4s_4s_1();
1467 test_ushr_4s_4s_13();
1468 test_ushr_4s_4s_31();
1469 test_sshr_4s_4s_1();
1470 test_sshr_4s_4s_13();
1471 test_sshr_4s_4s_31();
sewardjd89499b2014-03-02 12:48:34 +00001472#endif
1473 test_shl_4s_4s_1();
1474 test_shl_4s_4s_13();
1475 test_shl_4s_4s_31();
1476#if 0
sewardj94f53cb2014-03-01 11:27:18 +00001477 test_ushr_2s_2s_1();
1478 test_ushr_2s_2s_13();
1479 test_ushr_2s_2s_31();
1480 test_sshr_2s_2s_1();
1481 test_sshr_2s_2s_13();
1482 test_sshr_2s_2s_31();
sewardjd89499b2014-03-02 12:48:34 +00001483 test_shl_2s_2s_1();
1484 test_shl_2s_2s_13();
1485 test_shl_2s_2s_31();
1486
sewardj94f53cb2014-03-01 11:27:18 +00001487 test_ushr_8h_8h_1();
1488 test_ushr_8h_8h_13();
1489 test_ushr_8h_8h_15();
1490 test_sshr_8h_8h_1();
1491 test_sshr_8h_8h_13();
1492 test_sshr_8h_8h_15();
sewardjd89499b2014-03-02 12:48:34 +00001493 test_shl_8h_8h_1();
1494 test_shl_8h_8h_13();
1495 test_shl_8h_8h_15();
1496
sewardj94f53cb2014-03-01 11:27:18 +00001497 test_ushr_4h_4h_1();
1498 test_ushr_4h_4h_13();
1499 test_ushr_4h_4h_15();
1500 test_sshr_4h_4h_1();
1501 test_sshr_4h_4h_13();
1502 test_sshr_4h_4h_15();
sewardjd89499b2014-03-02 12:48:34 +00001503 test_shl_4h_4h_1();
1504 test_shl_4h_4h_13();
1505 test_shl_4h_4h_15();
1506
sewardj94f53cb2014-03-01 11:27:18 +00001507 test_ushr_16b_16b_1();
1508 test_ushr_16b_16b_7();
1509 test_sshr_16b_16b_1();
1510 test_sshr_16b_16b_7();
sewardjd89499b2014-03-02 12:48:34 +00001511 test_shl_16b_16b_1();
1512 test_shl_16b_16b_7();
1513
sewardj94f53cb2014-03-01 11:27:18 +00001514 test_ushr_8b_8b_1();
1515 test_ushr_8b_8b_7();
1516 test_sshr_8b_8b_1();
1517 test_sshr_8b_8b_7();
sewardjd89499b2014-03-02 12:48:34 +00001518 test_shl_8b_8b_1();
1519 test_shl_8b_8b_7();
sewardj94f53cb2014-03-01 11:27:18 +00001520#endif
sewardjd89499b2014-03-02 12:48:34 +00001521 printf("END: {USHR,SSHR,SHL} (vector, immediate) (many cases MISSING)\n\n");
sewardj94f53cb2014-03-01 11:27:18 +00001522
sewardjd89499b2014-03-02 12:48:34 +00001523 printf("BEGIN: {U,S}SHLL{,2}\n");
sewardj94f53cb2014-03-01 11:27:18 +00001524 test_ushll_2d_2s_0();
1525 test_ushll_2d_2s_15();
1526 test_ushll_2d_2s_31();
1527 test_ushll2_2d_4s_0();
1528 test_ushll2_2d_4s_15();
1529 test_ushll2_2d_4s_31();
1530 test_sshll_2d_2s_0();
1531 test_sshll_2d_2s_15();
1532 test_sshll_2d_2s_31();
1533 test_sshll2_2d_4s_0();
1534 test_sshll2_2d_4s_15();
1535 test_sshll2_2d_4s_31();
sewardjd89499b2014-03-02 12:48:34 +00001536 printf("END: {U,S}SHLL{,2} (MISSING h_b and s_h versions)\n\n");
sewardj94f53cb2014-03-01 11:27:18 +00001537
sewardjd89499b2014-03-02 12:48:34 +00001538 printf("BEGIN: XTN{,2}\n");
sewardj94f53cb2014-03-01 11:27:18 +00001539 test_xtn_2s_2d();
1540 test_xtn2_4s_2d();
1541 test_xtn_4h_4s();
1542 test_xtn2_8h_4s();
sewardjd89499b2014-03-02 12:48:34 +00001543 printf("END: XTN{,2} (MISSING b_h versions)\n\n");
sewardj94f53cb2014-03-01 11:27:18 +00001544
sewardjd89499b2014-03-02 12:48:34 +00001545 printf("DUP (element, vector) COMPLETELY MISSING\n\n");
sewardj94f53cb2014-03-01 11:27:18 +00001546
sewardjd89499b2014-03-02 12:48:34 +00001547 printf("DUP (general, vector) COMPLETELY MISSING\n\n");
1548
1549 printf("BEGIN: {S,U}MOV\n");
1550 test_umov_01();
1551 test_umov_02();
1552 test_umov_03();
1553 test_umov_04();
1554 test_umov_05();
1555 test_umov_06();
1556 test_umov_07();
1557 test_umov_08();
1558 test_smov_01();
1559 test_smov_02();
1560 test_smov_03();
1561 test_smov_04();
1562 test_smov_05();
1563 test_smov_06();
1564 test_smov_07();
1565 test_smov_08();
1566 test_smov_09();
1567 test_smov_10();
1568 printf("END: {S,U}MOV\n\n");
1569
1570 printf("BEGIN: INS (general)\n");
sewardj94f53cb2014-03-01 11:27:18 +00001571 test_INS_general();
sewardjd89499b2014-03-02 12:48:34 +00001572 printf("END: INS (general)\n\n");
1573
1574 printf("BEGIN: NEG (vector)\n");
1575 test_neg_2d_2d();
1576 test_neg_4s_4s();
1577 test_neg_2s_2s();
1578 test_neg_8h_8h();
1579 test_neg_4h_4h();
1580 //test_neg_16b_16b();
1581 //test_neg_8b_8b();
1582 printf("END: NEG (vector) (MISSING 8b/16b)\n\n");
sewardj94f53cb2014-03-01 11:27:18 +00001583
1584 return 0;
1585}