OSDN Git Service

* gcc.target/mips/octeon-exts-2.c: Compile it with -meb.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.target / mips / loongson-simd.c
1 /* Test cases for ST Microelectronics Loongson-2E/2F SIMD intrinsics.
2    Copyright (C) 2008 Free Software Foundation, Inc.
3    Contributed by CodeSourcery.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20
21 /* { dg-do run } */
22 /* { dg-require-effective-target mips_loongson } */
23
24 #include "loongson.h"
25 #include <stdio.h>
26 #include <stdint.h>
27 #include <assert.h>
28 #include <limits.h>
29
30 typedef union { int32x2_t v; int32_t a[2]; } int32x2_encap_t;
31 typedef union { int16x4_t v; int16_t a[4]; } int16x4_encap_t;
32 typedef union { int8x8_t v; int8_t a[8]; } int8x8_encap_t;
33 typedef union { uint32x2_t v; uint32_t a[2]; } uint32x2_encap_t;
34 typedef union { uint16x4_t v; uint16_t a[4]; } uint16x4_encap_t;
35 typedef union { uint8x8_t v; uint8_t a[8]; } uint8x8_encap_t;
36
37 #define UINT16x4_MAX USHRT_MAX
38 #define UINT8x8_MAX UCHAR_MAX
39 #define INT8x8_MAX SCHAR_MAX
40 #define INT16x4_MAX SHRT_MAX
41 #define INT32x2_MAX INT_MAX
42
43 static void test_packsswh (void)
44 {
45   int32x2_encap_t s, t;
46   int16x4_encap_t r;
47   s.a[0] = INT16x4_MAX - 2;
48   s.a[1] = INT16x4_MAX - 1;
49   t.a[0] = INT16x4_MAX;
50   t.a[1] = INT16x4_MAX + 1;
51   r.v = packsswh (s.v, t.v);
52   assert (r.a[0] == INT16x4_MAX - 2);
53   assert (r.a[1] == INT16x4_MAX - 1);
54   assert (r.a[2] == INT16x4_MAX);
55   assert (r.a[3] == INT16x4_MAX);
56 }
57
58 static void test_packsshb (void)
59 {
60   int16x4_encap_t s, t;
61   int8x8_encap_t r;
62   s.a[0] = INT8x8_MAX - 6;
63   s.a[1] = INT8x8_MAX - 5;
64   s.a[2] = INT8x8_MAX - 4;
65   s.a[3] = INT8x8_MAX - 3;
66   t.a[0] = INT8x8_MAX - 2;
67   t.a[1] = INT8x8_MAX - 1;
68   t.a[2] = INT8x8_MAX;
69   t.a[3] = INT8x8_MAX + 1;
70   r.v = packsshb (s.v, t.v);
71   assert (r.a[0] == INT8x8_MAX - 6);
72   assert (r.a[1] == INT8x8_MAX - 5);
73   assert (r.a[2] == INT8x8_MAX - 4);
74   assert (r.a[3] == INT8x8_MAX - 3);
75   assert (r.a[4] == INT8x8_MAX - 2);
76   assert (r.a[5] == INT8x8_MAX - 1);
77   assert (r.a[6] == INT8x8_MAX);
78   assert (r.a[7] == INT8x8_MAX);
79 }
80
81 static void test_packushb (void)
82 {
83   uint16x4_encap_t s, t;
84   uint8x8_encap_t r;
85   s.a[0] = UINT8x8_MAX - 6;
86   s.a[1] = UINT8x8_MAX - 5;
87   s.a[2] = UINT8x8_MAX - 4;
88   s.a[3] = UINT8x8_MAX - 3;
89   t.a[0] = UINT8x8_MAX - 2;
90   t.a[1] = UINT8x8_MAX - 1;
91   t.a[2] = UINT8x8_MAX;
92   t.a[3] = UINT8x8_MAX + 1;
93   r.v = packushb (s.v, t.v);
94   assert (r.a[0] == UINT8x8_MAX - 6);
95   assert (r.a[1] == UINT8x8_MAX - 5);
96   assert (r.a[2] == UINT8x8_MAX - 4);
97   assert (r.a[3] == UINT8x8_MAX - 3);
98   assert (r.a[4] == UINT8x8_MAX - 2);
99   assert (r.a[5] == UINT8x8_MAX - 1);
100   assert (r.a[6] == UINT8x8_MAX);
101   assert (r.a[7] == UINT8x8_MAX);
102 }
103
104 static void test_paddw_u (void)
105 {
106   uint32x2_encap_t s, t;
107   uint32x2_encap_t r;
108   s.a[0] = 1;
109   s.a[1] = 2;
110   t.a[0] = 3;
111   t.a[1] = 4;
112   r.v = paddw_u (s.v, t.v);
113   assert (r.a[0] == 4);
114   assert (r.a[1] == 6);
115 }
116
117 static void test_paddw_s (void)
118 {
119   int32x2_encap_t s, t;
120   int32x2_encap_t r;
121   s.a[0] = -2;
122   s.a[1] = -1;
123   t.a[0] = 3;
124   t.a[1] = 4;
125   r.v = paddw_s (s.v, t.v);
126   assert (r.a[0] == 1);
127   assert (r.a[1] == 3);
128 }
129
130 static void test_paddh_u (void)
131 {
132   uint16x4_encap_t s, t;
133   uint16x4_encap_t r;
134   s.a[0] = 1;
135   s.a[1] = 2;
136   s.a[2] = 3;
137   s.a[3] = 4;
138   t.a[0] = 5;
139   t.a[1] = 6;
140   t.a[2] = 7;
141   t.a[3] = 8;
142   r.v = paddh_u (s.v, t.v);
143   assert (r.a[0] == 6);
144   assert (r.a[1] == 8);
145   assert (r.a[2] == 10);
146   assert (r.a[3] == 12);
147 }
148
149 static void test_paddh_s (void)
150 {
151   int16x4_encap_t s, t;
152   int16x4_encap_t r;
153   s.a[0] = -10;
154   s.a[1] = -20;
155   s.a[2] = -30;
156   s.a[3] = -40;
157   t.a[0] = 1;
158   t.a[1] = 2;
159   t.a[2] = 3;
160   t.a[3] = 4;
161   r.v = paddh_s (s.v, t.v);
162   assert (r.a[0] == -9);
163   assert (r.a[1] == -18);
164   assert (r.a[2] == -27);
165   assert (r.a[3] == -36);
166 }
167
168 static void test_paddb_u (void)
169 {
170   uint8x8_encap_t s, t;
171   uint8x8_encap_t r;
172   s.a[0] = 1;
173   s.a[1] = 2;
174   s.a[2] = 3;
175   s.a[3] = 4;
176   s.a[4] = 5;
177   s.a[5] = 6;
178   s.a[6] = 7;
179   s.a[7] = 8;
180   t.a[0] = 9;
181   t.a[1] = 10;
182   t.a[2] = 11;
183   t.a[3] = 12;
184   t.a[4] = 13;
185   t.a[5] = 14;
186   t.a[6] = 15;
187   t.a[7] = 16;
188   r.v = paddb_u (s.v, t.v);
189   assert (r.a[0] == 10);
190   assert (r.a[1] == 12);
191   assert (r.a[2] == 14);
192   assert (r.a[3] == 16);
193   assert (r.a[4] == 18);
194   assert (r.a[5] == 20);
195   assert (r.a[6] == 22);
196   assert (r.a[7] == 24);
197 }
198
199 static void test_paddb_s (void)
200 {
201   int8x8_encap_t s, t;
202   int8x8_encap_t r;
203   s.a[0] = -10;
204   s.a[1] = -20;
205   s.a[2] = -30;
206   s.a[3] = -40;
207   s.a[4] = -50;
208   s.a[5] = -60;
209   s.a[6] = -70;
210   s.a[7] = -80;
211   t.a[0] = 1;
212   t.a[1] = 2;
213   t.a[2] = 3;
214   t.a[3] = 4;
215   t.a[4] = 5;
216   t.a[5] = 6;
217   t.a[6] = 7;
218   t.a[7] = 8;
219   r.v = paddb_s (s.v, t.v);
220   assert (r.a[0] == -9);
221   assert (r.a[1] == -18);
222   assert (r.a[2] == -27);
223   assert (r.a[3] == -36);
224   assert (r.a[4] == -45);
225   assert (r.a[5] == -54);
226   assert (r.a[6] == -63);
227   assert (r.a[7] == -72);
228 }
229
230 static void test_paddd_u (void)
231 {
232   uint64_t d = 123456;
233   uint64_t e = 789012;
234   uint64_t r;
235   r = paddd_u (d, e);
236   assert (r == 912468);
237 }
238
239 static void test_paddd_s (void)
240 {
241   int64_t d = 123456;
242   int64_t e = -789012;
243   int64_t r;
244   r = paddd_s (d, e);
245   assert (r == -665556);
246 }
247
248 static void test_paddsh (void)
249 {
250   int16x4_encap_t s, t;
251   int16x4_encap_t r;
252   s.a[0] = -1;
253   s.a[1] = 0;
254   s.a[2] = 1;
255   s.a[3] = 2;
256   t.a[0] = INT16x4_MAX;
257   t.a[1] = INT16x4_MAX;
258   t.a[2] = INT16x4_MAX;
259   t.a[3] = INT16x4_MAX;
260   r.v = paddsh (s.v, t.v);
261   assert (r.a[0] == INT16x4_MAX - 1);
262   assert (r.a[1] == INT16x4_MAX);
263   assert (r.a[2] == INT16x4_MAX);
264   assert (r.a[3] == INT16x4_MAX);
265 }
266
267 static void test_paddsb (void)
268 {
269   int8x8_encap_t s, t;
270   int8x8_encap_t r;
271   s.a[0] = -6;
272   s.a[1] = -5;
273   s.a[2] = -4;
274   s.a[3] = -3;
275   s.a[4] = -2;
276   s.a[5] = -1;
277   s.a[6] = 0;
278   s.a[7] = 1;
279   t.a[0] = INT8x8_MAX;
280   t.a[1] = INT8x8_MAX;
281   t.a[2] = INT8x8_MAX;
282   t.a[3] = INT8x8_MAX;
283   t.a[4] = INT8x8_MAX;
284   t.a[5] = INT8x8_MAX;
285   t.a[6] = INT8x8_MAX;
286   t.a[7] = INT8x8_MAX;
287   r.v = paddsb (s.v, t.v);
288   assert (r.a[0] == INT8x8_MAX - 6);
289   assert (r.a[1] == INT8x8_MAX - 5);
290   assert (r.a[2] == INT8x8_MAX - 4);
291   assert (r.a[3] == INT8x8_MAX - 3);
292   assert (r.a[4] == INT8x8_MAX - 2);
293   assert (r.a[5] == INT8x8_MAX - 1);
294   assert (r.a[6] == INT8x8_MAX);
295   assert (r.a[7] == INT8x8_MAX);
296 }
297
298 static void test_paddush (void)
299 {
300   uint16x4_encap_t s, t;
301   uint16x4_encap_t r;
302   s.a[0] = 0;
303   s.a[1] = 1;
304   s.a[2] = 0;
305   s.a[3] = 1;
306   t.a[0] = UINT16x4_MAX;
307   t.a[1] = UINT16x4_MAX;
308   t.a[2] = UINT16x4_MAX;
309   t.a[3] = UINT16x4_MAX;
310   r.v = paddush (s.v, t.v);
311   assert (r.a[0] == UINT16x4_MAX);
312   assert (r.a[1] == UINT16x4_MAX);
313   assert (r.a[2] == UINT16x4_MAX);
314   assert (r.a[3] == UINT16x4_MAX);
315 }
316
317 static void test_paddusb (void)
318 {
319   uint8x8_encap_t s, t;
320   uint8x8_encap_t r;
321   s.a[0] = 0;
322   s.a[1] = 1;
323   s.a[2] = 0;
324   s.a[3] = 1;
325   s.a[4] = 0;
326   s.a[5] = 1;
327   s.a[6] = 0;
328   s.a[7] = 1;
329   t.a[0] = UINT8x8_MAX;
330   t.a[1] = UINT8x8_MAX;
331   t.a[2] = UINT8x8_MAX;
332   t.a[3] = UINT8x8_MAX;
333   t.a[4] = UINT8x8_MAX;
334   t.a[5] = UINT8x8_MAX;
335   t.a[6] = UINT8x8_MAX;
336   t.a[7] = UINT8x8_MAX;
337   r.v = paddusb (s.v, t.v);
338   assert (r.a[0] == UINT8x8_MAX);
339   assert (r.a[1] == UINT8x8_MAX);
340   assert (r.a[2] == UINT8x8_MAX);
341   assert (r.a[3] == UINT8x8_MAX);
342   assert (r.a[4] == UINT8x8_MAX);
343   assert (r.a[5] == UINT8x8_MAX);
344   assert (r.a[6] == UINT8x8_MAX);
345   assert (r.a[7] == UINT8x8_MAX);
346 }
347
348 static void test_pandn_ud (void)
349 {
350   uint64_t d1 = 0x0000ffff0000ffffull;
351   uint64_t d2 = 0x0000ffff0000ffffull;
352   uint64_t r;
353   r = pandn_ud (d1, d2);
354   assert (r == 0);
355 }
356
357 static void test_pandn_sd (void)
358 {
359   int64_t d1 = (int64_t) 0x0000000000000000ull;
360   int64_t d2 = (int64_t) 0xfffffffffffffffeull;
361   int64_t r;
362   r = pandn_sd (d1, d2);
363   assert (r == -2);
364 }
365
366 static void test_pandn_uw (void)
367 {
368   uint32x2_encap_t s, t;
369   uint32x2_encap_t r;
370   s.a[0] = 0xffffffff;
371   s.a[1] = 0x00000000;
372   t.a[0] = 0x00000000;
373   t.a[1] = 0xffffffff;
374   r.v = pandn_uw (s.v, t.v);
375   assert (r.a[0] == 0x00000000);
376   assert (r.a[1] == 0xffffffff);
377 }
378
379 static void test_pandn_sw (void)
380 {
381   int32x2_encap_t s, t;
382   int32x2_encap_t r;
383   s.a[0] = 0xffffffff;
384   s.a[1] = 0x00000000;
385   t.a[0] = 0xffffffff;
386   t.a[1] = 0xfffffffe;
387   r.v = pandn_sw (s.v, t.v);
388   assert (r.a[0] == 0);
389   assert (r.a[1] == -2);
390 }
391
392 static void test_pandn_uh (void)
393 {
394   uint16x4_encap_t s, t;
395   uint16x4_encap_t r;
396   s.a[0] = 0xffff;
397   s.a[1] = 0x0000;
398   s.a[2] = 0xffff;
399   s.a[3] = 0x0000;
400   t.a[0] = 0x0000;
401   t.a[1] = 0xffff;
402   t.a[2] = 0x0000;
403   t.a[3] = 0xffff;
404   r.v = pandn_uh (s.v, t.v);
405   assert (r.a[0] == 0x0000);
406   assert (r.a[1] == 0xffff);
407   assert (r.a[2] == 0x0000);
408   assert (r.a[3] == 0xffff);
409 }
410
411 static void test_pandn_sh (void)
412 {
413   int16x4_encap_t s, t;
414   int16x4_encap_t r;
415   s.a[0] = 0xffff;
416   s.a[1] = 0x0000;
417   s.a[2] = 0xffff;
418   s.a[3] = 0x0000;
419   t.a[0] = 0xffff;
420   t.a[1] = 0xfffe;
421   t.a[2] = 0xffff;
422   t.a[3] = 0xfffe;
423   r.v = pandn_sh (s.v, t.v);
424   assert (r.a[0] == 0);
425   assert (r.a[1] == -2);
426   assert (r.a[2] == 0);
427   assert (r.a[3] == -2);
428 }
429
430 static void test_pandn_ub (void)
431 {
432   uint8x8_encap_t s, t;
433   uint8x8_encap_t r;
434   s.a[0] = 0xff;
435   s.a[1] = 0x00;
436   s.a[2] = 0xff;
437   s.a[3] = 0x00;
438   s.a[4] = 0xff;
439   s.a[5] = 0x00;
440   s.a[6] = 0xff;
441   s.a[7] = 0x00;
442   t.a[0] = 0x00;
443   t.a[1] = 0xff;
444   t.a[2] = 0x00;
445   t.a[3] = 0xff;
446   t.a[4] = 0x00;
447   t.a[5] = 0xff;
448   t.a[6] = 0x00;
449   t.a[7] = 0xff;
450   r.v = pandn_ub (s.v, t.v);
451   assert (r.a[0] == 0x00);
452   assert (r.a[1] == 0xff);
453   assert (r.a[2] == 0x00);
454   assert (r.a[3] == 0xff);
455   assert (r.a[4] == 0x00);
456   assert (r.a[5] == 0xff);
457   assert (r.a[6] == 0x00);
458   assert (r.a[7] == 0xff);
459 }
460
461 static void test_pandn_sb (void)
462 {
463   int8x8_encap_t s, t;
464   int8x8_encap_t r;
465   s.a[0] = 0xff;
466   s.a[1] = 0x00;
467   s.a[2] = 0xff;
468   s.a[3] = 0x00;
469   s.a[4] = 0xff;
470   s.a[5] = 0x00;
471   s.a[6] = 0xff;
472   s.a[7] = 0x00;
473   t.a[0] = 0xff;
474   t.a[1] = 0xfe;
475   t.a[2] = 0xff;
476   t.a[3] = 0xfe;
477   t.a[4] = 0xff;
478   t.a[5] = 0xfe;
479   t.a[6] = 0xff;
480   t.a[7] = 0xfe;
481   r.v = pandn_sb (s.v, t.v);
482   assert (r.a[0] == 0);
483   assert (r.a[1] == -2);
484   assert (r.a[2] == 0);
485   assert (r.a[3] == -2);
486   assert (r.a[4] == 0);
487   assert (r.a[5] == -2);
488   assert (r.a[6] == 0);
489   assert (r.a[7] == -2);
490 }
491
492 static void test_pavgh (void)
493 {
494   uint16x4_encap_t s, t;
495   uint16x4_encap_t r;
496   s.a[0] = 1;
497   s.a[1] = 2;
498   s.a[2] = 3;
499   s.a[3] = 4;
500   t.a[0] = 5;
501   t.a[1] = 6;
502   t.a[2] = 7;
503   t.a[3] = 8;
504   r.v = pavgh (s.v, t.v);
505   assert (r.a[0] == 3);
506   assert (r.a[1] == 4);
507   assert (r.a[2] == 5);
508   assert (r.a[3] == 6);
509 }
510
511 static void test_pavgb (void)
512 {
513   uint8x8_encap_t s, t;
514   uint8x8_encap_t r;
515   s.a[0] = 1;
516   s.a[1] = 2;
517   s.a[2] = 3;
518   s.a[3] = 4;
519   s.a[4] = 1;
520   s.a[5] = 2;
521   s.a[6] = 3;
522   s.a[7] = 4;
523   t.a[0] = 5;
524   t.a[1] = 6;
525   t.a[2] = 7;
526   t.a[3] = 8;
527   t.a[4] = 5;
528   t.a[5] = 6;
529   t.a[6] = 7;
530   t.a[7] = 8;
531   r.v = pavgb (s.v, t.v);
532   assert (r.a[0] == 3);
533   assert (r.a[1] == 4);
534   assert (r.a[2] == 5);
535   assert (r.a[3] == 6);
536   assert (r.a[4] == 3);
537   assert (r.a[5] == 4);
538   assert (r.a[6] == 5);
539   assert (r.a[7] == 6);
540 }
541
542 static void test_pcmpeqw_u (void)
543 {
544   uint32x2_encap_t s, t;
545   uint32x2_encap_t r;
546   s.a[0] = 42;
547   s.a[1] = 43;
548   t.a[0] = 43;
549   t.a[1] = 43;
550   r.v = pcmpeqw_u (s.v, t.v);
551   assert (r.a[0] == 0x00000000);
552   assert (r.a[1] == 0xffffffff);
553 }
554
555 static void test_pcmpeqh_u (void)
556 {
557   uint16x4_encap_t s, t;
558   uint16x4_encap_t r;
559   s.a[0] = 42;
560   s.a[1] = 43;
561   s.a[2] = 42;
562   s.a[3] = 43;
563   t.a[0] = 43;
564   t.a[1] = 43;
565   t.a[2] = 43;
566   t.a[3] = 43;
567   r.v = pcmpeqh_u (s.v, t.v);
568   assert (r.a[0] == 0x0000);
569   assert (r.a[1] == 0xffff);
570   assert (r.a[2] == 0x0000);
571   assert (r.a[3] == 0xffff);
572 }
573
574 static void test_pcmpeqb_u (void)
575 {
576   uint8x8_encap_t s, t;
577   uint8x8_encap_t r;
578   s.a[0] = 42;
579   s.a[1] = 43;
580   s.a[2] = 42;
581   s.a[3] = 43;
582   s.a[4] = 42;
583   s.a[5] = 43;
584   s.a[6] = 42;
585   s.a[7] = 43;
586   t.a[0] = 43;
587   t.a[1] = 43;
588   t.a[2] = 43;
589   t.a[3] = 43;
590   t.a[4] = 43;
591   t.a[5] = 43;
592   t.a[6] = 43;
593   t.a[7] = 43;
594   r.v = pcmpeqb_u (s.v, t.v);
595   assert (r.a[0] == 0x00);
596   assert (r.a[1] == 0xff);
597   assert (r.a[2] == 0x00);
598   assert (r.a[3] == 0xff);
599   assert (r.a[4] == 0x00);
600   assert (r.a[5] == 0xff);
601   assert (r.a[6] == 0x00);
602   assert (r.a[7] == 0xff);
603 }
604
605 static void test_pcmpeqw_s (void)
606 {
607   int32x2_encap_t s, t;
608   int32x2_encap_t r;
609   s.a[0] = -42;
610   s.a[1] = -42;
611   t.a[0] = 42;
612   t.a[1] = -42;
613   r.v = pcmpeqw_s (s.v, t.v);
614   assert (r.a[0] == 0);
615   assert (r.a[1] == -1);
616 }
617
618 static void test_pcmpeqh_s (void)
619 {
620   int16x4_encap_t s, t;
621   int16x4_encap_t r;
622   s.a[0] = -42;
623   s.a[1] = -42;
624   s.a[2] = -42;
625   s.a[3] = -42;
626   t.a[0] = 42;
627   t.a[1] = -42;
628   t.a[2] = 42;
629   t.a[3] = -42;
630   r.v = pcmpeqh_s (s.v, t.v);
631   assert (r.a[0] == 0);
632   assert (r.a[1] == -1);
633   assert (r.a[2] == 0);
634   assert (r.a[3] == -1);
635 }
636
637 static void test_pcmpeqb_s (void)
638 {
639   int8x8_encap_t s, t;
640   int8x8_encap_t r;
641   s.a[0] = -42;
642   s.a[1] = -42;
643   s.a[2] = -42;
644   s.a[3] = -42;
645   s.a[4] = -42;
646   s.a[5] = -42;
647   s.a[6] = -42;
648   s.a[7] = -42;
649   t.a[0] = 42;
650   t.a[1] = -42;
651   t.a[2] = 42;
652   t.a[3] = -42;
653   t.a[4] = 42;
654   t.a[5] = -42;
655   t.a[6] = 42;
656   t.a[7] = -42;
657   r.v = pcmpeqb_s (s.v, t.v);
658   assert (r.a[0] == 0);
659   assert (r.a[1] == -1);
660   assert (r.a[2] == 0);
661   assert (r.a[3] == -1);
662   assert (r.a[4] == 0);
663   assert (r.a[5] == -1);
664   assert (r.a[6] == 0);
665   assert (r.a[7] == -1);
666 }
667
668 static void test_pcmpgtw_u (void)
669 {
670   uint32x2_encap_t s, t;
671   uint32x2_encap_t r;
672   s.a[0] = 42;
673   s.a[1] = 43;
674   t.a[0] = 43;
675   t.a[1] = 42;
676   r.v = pcmpgtw_u (s.v, t.v);
677   assert (r.a[0] == 0x00000000);
678   assert (r.a[1] == 0xffffffff);
679 }
680
681 static void test_pcmpgth_u (void)
682 {
683   uint16x4_encap_t s, t;
684   uint16x4_encap_t r;
685   s.a[0] = 40;
686   s.a[1] = 41;
687   s.a[2] = 42;
688   s.a[3] = 43;
689   t.a[0] = 40;
690   t.a[1] = 41;
691   t.a[2] = 43;
692   t.a[3] = 42;
693   r.v = pcmpgth_u (s.v, t.v);
694   assert (r.a[0] == 0x0000);
695   assert (r.a[1] == 0x0000);
696   assert (r.a[2] == 0x0000);
697   assert (r.a[3] == 0xffff);
698 }
699
700 static void test_pcmpgtb_u (void)
701 {
702   uint8x8_encap_t s, t;
703   uint8x8_encap_t r;
704   s.a[0] = 40;
705   s.a[1] = 41;
706   s.a[2] = 42;
707   s.a[3] = 43;
708   s.a[4] = 44;
709   s.a[5] = 45;
710   s.a[6] = 46;
711   s.a[7] = 47;
712   t.a[0] = 48;
713   t.a[1] = 47;
714   t.a[2] = 46;
715   t.a[3] = 45;
716   t.a[4] = 44;
717   t.a[5] = 43;
718   t.a[6] = 42;
719   t.a[7] = 41;
720   r.v = pcmpgtb_u (s.v, t.v);
721   assert (r.a[0] == 0x00);
722   assert (r.a[1] == 0x00);
723   assert (r.a[2] == 0x00);
724   assert (r.a[3] == 0x00);
725   assert (r.a[4] == 0x00);
726   assert (r.a[5] == 0xff);
727   assert (r.a[6] == 0xff);
728   assert (r.a[7] == 0xff);
729 }
730
731 static void test_pcmpgtw_s (void)
732 {
733   int32x2_encap_t s, t;
734   int32x2_encap_t r;
735   s.a[0] = 42;
736   s.a[1] = -42;
737   t.a[0] = -42;
738   t.a[1] = -42;
739   r.v = pcmpgtw_s (s.v, t.v);
740   assert (r.a[0] == -1);
741   assert (r.a[1] == 0);
742 }
743
744 static void test_pcmpgth_s (void)
745 {
746   int16x4_encap_t s, t;
747   int16x4_encap_t r;
748   s.a[0] = -42;
749   s.a[1] = -42;
750   s.a[2] = -42;
751   s.a[3] = -42;
752   t.a[0] = 42;
753   t.a[1] = 43;
754   t.a[2] = 44;
755   t.a[3] = -43;
756   r.v = pcmpgth_s (s.v, t.v);
757   assert (r.a[0] == 0);
758   assert (r.a[1] == 0);
759   assert (r.a[2] == 0);
760   assert (r.a[3] == -1);
761 }
762
763 static void test_pcmpgtb_s (void)
764 {
765   int8x8_encap_t s, t;
766   int8x8_encap_t r;
767   s.a[0] = -42;
768   s.a[1] = -42;
769   s.a[2] = -42;
770   s.a[3] = -42;
771   s.a[4] = 42;
772   s.a[5] = 42;
773   s.a[6] = 42;
774   s.a[7] = 42;
775   t.a[0] = -45;
776   t.a[1] = -44;
777   t.a[2] = -43;
778   t.a[3] = -42;
779   t.a[4] = 42;
780   t.a[5] = 43;
781   t.a[6] = 41;
782   t.a[7] = 40;
783   r.v = pcmpgtb_s (s.v, t.v);
784   assert (r.a[0] == -1);
785   assert (r.a[1] == -1);
786   assert (r.a[2] == -1);
787   assert (r.a[3] == 0);
788   assert (r.a[4] == 0);
789   assert (r.a[5] == 0);
790   assert (r.a[6] == -1);
791   assert (r.a[7] == -1);
792 }
793
794 static void test_pextrh_u (void)
795 {
796   uint16x4_encap_t s;
797   uint16x4_encap_t r;
798   s.a[0] = 40;
799   s.a[1] = 41;
800   s.a[2] = 42;
801   s.a[3] = 43;
802   r.v = pextrh_u (s.v, 1);
803   assert (r.a[0] == 41);
804   assert (r.a[1] == 0);
805   assert (r.a[2] == 0);
806   assert (r.a[3] == 0);
807 }
808
809 static void test_pextrh_s (void)
810 {
811   int16x4_encap_t s;
812   int16x4_encap_t r;
813   s.a[0] = -40;
814   s.a[1] = -41;
815   s.a[2] = -42;
816   s.a[3] = -43;
817   r.v = pextrh_s (s.v, 2);
818   assert (r.a[0] == -42);
819   assert (r.a[1] == 0);
820   assert (r.a[2] == 0);
821   assert (r.a[3] == 0);
822 }
823
824 static void test_pinsrh_0123_u (void)
825 {
826   uint16x4_encap_t s, t;
827   uint16x4_encap_t r;
828   s.a[0] = 42;
829   s.a[1] = 0;
830   s.a[2] = 0;
831   s.a[3] = 0;
832   t.a[0] = 0;
833   t.a[1] = 0;
834   t.a[2] = 0;
835   t.a[3] = 0;
836   r.v = pinsrh_0_u (t.v, s.v);
837   r.v = pinsrh_1_u (r.v, s.v);
838   r.v = pinsrh_2_u (r.v, s.v);
839   r.v = pinsrh_3_u (r.v, s.v);
840   assert (r.a[0] == 42);
841   assert (r.a[1] == 42);
842   assert (r.a[2] == 42);
843   assert (r.a[3] == 42);
844 }
845
846 static void test_pinsrh_0123_s (void)
847 {
848   int16x4_encap_t s, t;
849   int16x4_encap_t r;
850   s.a[0] = -42;
851   s.a[1] = 0;
852   s.a[2] = 0;
853   s.a[3] = 0;
854   t.a[0] = 0;
855   t.a[1] = 0;
856   t.a[2] = 0;
857   t.a[3] = 0;
858   r.v = pinsrh_0_s (t.v, s.v);
859   r.v = pinsrh_1_s (r.v, s.v);
860   r.v = pinsrh_2_s (r.v, s.v);
861   r.v = pinsrh_3_s (r.v, s.v);
862   assert (r.a[0] == -42);
863   assert (r.a[1] == -42);
864   assert (r.a[2] == -42);
865   assert (r.a[3] == -42);
866 }
867
868 static void test_pmaddhw (void)
869 {
870   int16x4_encap_t s, t;
871   int32x2_encap_t r;
872   s.a[0] = -5;
873   s.a[1] = -4;
874   s.a[2] = -3;
875   s.a[3] = -2;
876   t.a[0] = 10;
877   t.a[1] = 11;
878   t.a[2] = 12;
879   t.a[3] = 13;
880   r.v = pmaddhw (s.v, t.v);
881   assert (r.a[0] == (-5*10 + -4*11));
882   assert (r.a[1] == (-3*12 + -2*13));
883 }
884
885 static void test_pmaxsh (void)
886 {
887   int16x4_encap_t s, t;
888   int16x4_encap_t r;
889   s.a[0] = -20;
890   s.a[1] = 40;
891   s.a[2] = -10;
892   s.a[3] = 50;
893   t.a[0] = 20;
894   t.a[1] = -40;
895   t.a[2] = 10;
896   t.a[3] = -50;
897   r.v = pmaxsh (s.v, t.v);
898   assert (r.a[0] == 20);
899   assert (r.a[1] == 40);
900   assert (r.a[2] == 10);
901   assert (r.a[3] == 50);
902 }
903
904 static void test_pmaxub (void)
905 {
906   uint8x8_encap_t s, t;
907   uint8x8_encap_t r;
908   s.a[0] = 10;
909   s.a[1] = 20;
910   s.a[2] = 30;
911   s.a[3] = 40;
912   s.a[4] = 50;
913   s.a[5] = 60;
914   s.a[6] = 70;
915   s.a[7] = 80;
916   t.a[0] = 80;
917   t.a[1] = 70;
918   t.a[2] = 60;
919   t.a[3] = 50;
920   t.a[4] = 40;
921   t.a[5] = 30;
922   t.a[6] = 20;
923   t.a[7] = 10;
924   r.v = pmaxub (s.v, t.v);
925   assert (r.a[0] == 80);
926   assert (r.a[1] == 70);
927   assert (r.a[2] == 60);
928   assert (r.a[3] == 50);
929   assert (r.a[4] == 50);
930   assert (r.a[5] == 60);
931   assert (r.a[6] == 70);
932   assert (r.a[7] == 80);
933 }
934
935 static void test_pminsh (void)
936 {
937   int16x4_encap_t s, t;
938   int16x4_encap_t r;
939   s.a[0] = -20;
940   s.a[1] = 40;
941   s.a[2] = -10;
942   s.a[3] = 50;
943   t.a[0] = 20;
944   t.a[1] = -40;
945   t.a[2] = 10;
946   t.a[3] = -50;
947   r.v = pminsh (s.v, t.v);
948   assert (r.a[0] == -20);
949   assert (r.a[1] == -40);
950   assert (r.a[2] == -10);
951   assert (r.a[3] == -50);
952 }
953
954 static void test_pminub (void)
955 {
956   uint8x8_encap_t s, t;
957   uint8x8_encap_t r;
958   s.a[0] = 10;
959   s.a[1] = 20;
960   s.a[2] = 30;
961   s.a[3] = 40;
962   s.a[4] = 50;
963   s.a[5] = 60;
964   s.a[6] = 70;
965   s.a[7] = 80;
966   t.a[0] = 80;
967   t.a[1] = 70;
968   t.a[2] = 60;
969   t.a[3] = 50;
970   t.a[4] = 40;
971   t.a[5] = 30;
972   t.a[6] = 20;
973   t.a[7] = 10;
974   r.v = pminub (s.v, t.v);
975   assert (r.a[0] == 10);
976   assert (r.a[1] == 20);
977   assert (r.a[2] == 30);
978   assert (r.a[3] == 40);
979   assert (r.a[4] == 40);
980   assert (r.a[5] == 30);
981   assert (r.a[6] == 20);
982   assert (r.a[7] == 10);
983 }
984
985 static void test_pmovmskb_u (void)
986 {
987   uint8x8_encap_t s;
988   uint8x8_encap_t r;
989   s.a[0] = 0xf0;
990   s.a[1] = 0x40;
991   s.a[2] = 0xf0;
992   s.a[3] = 0x40;
993   s.a[4] = 0xf0;
994   s.a[5] = 0x40;
995   s.a[6] = 0xf0;
996   s.a[7] = 0x40;
997   r.v = pmovmskb_u (s.v);
998   assert (r.a[0] == 0x55);
999   assert (r.a[1] == 0);
1000   assert (r.a[2] == 0);
1001   assert (r.a[3] == 0);
1002   assert (r.a[4] == 0);
1003   assert (r.a[5] == 0);
1004   assert (r.a[6] == 0);
1005   assert (r.a[7] == 0);
1006 }
1007
1008 static void test_pmovmskb_s (void)
1009 {
1010   int8x8_encap_t s;
1011   int8x8_encap_t r;
1012   s.a[0] = -1;
1013   s.a[1] = 1;
1014   s.a[2] = -1;
1015   s.a[3] = 1;
1016   s.a[4] = -1;
1017   s.a[5] = 1;
1018   s.a[6] = -1;
1019   s.a[7] = 1;
1020   r.v = pmovmskb_s (s.v);
1021   assert (r.a[0] == 0x55);
1022   assert (r.a[1] == 0);
1023   assert (r.a[2] == 0);
1024   assert (r.a[3] == 0);
1025   assert (r.a[4] == 0);
1026   assert (r.a[5] == 0);
1027   assert (r.a[6] == 0);
1028   assert (r.a[7] == 0);
1029 }
1030
1031 static void test_pmulhuh (void)
1032 {
1033   uint16x4_encap_t s, t;
1034   uint16x4_encap_t r;
1035   s.a[0] = 0xff00;
1036   s.a[1] = 0xff00;
1037   s.a[2] = 0xff00;
1038   s.a[3] = 0xff00;
1039   t.a[0] = 16;
1040   t.a[1] = 16;
1041   t.a[2] = 16;
1042   t.a[3] = 16;
1043   r.v = pmulhuh (s.v, t.v);
1044   assert (r.a[0] == 0x000f);
1045   assert (r.a[1] == 0x000f);
1046   assert (r.a[2] == 0x000f);
1047   assert (r.a[3] == 0x000f);
1048 }
1049
1050 static void test_pmulhh (void)
1051 {
1052   int16x4_encap_t s, t;
1053   int16x4_encap_t r;
1054   s.a[0] = 0x0ff0;
1055   s.a[1] = 0x0ff0;
1056   s.a[2] = 0x0ff0;
1057   s.a[3] = 0x0ff0;
1058   t.a[0] = -16*16;
1059   t.a[1] = -16*16;
1060   t.a[2] = -16*16;
1061   t.a[3] = -16*16;
1062   r.v = pmulhh (s.v, t.v);
1063   assert (r.a[0] == -16);
1064   assert (r.a[1] == -16);
1065   assert (r.a[2] == -16);
1066   assert (r.a[3] == -16);
1067 }
1068
1069 static void test_pmullh (void)
1070 {
1071   int16x4_encap_t s, t;
1072   int16x4_encap_t r;
1073   s.a[0] = 0x0ff0;
1074   s.a[1] = 0x0ff0;
1075   s.a[2] = 0x0ff0;
1076   s.a[3] = 0x0ff0;
1077   t.a[0] = -16*16;
1078   t.a[1] = -16*16;
1079   t.a[2] = -16*16;
1080   t.a[3] = -16*16;
1081   r.v = pmullh (s.v, t.v);
1082   assert (r.a[0] == 4096);
1083   assert (r.a[1] == 4096);
1084   assert (r.a[2] == 4096);
1085   assert (r.a[3] == 4096);
1086 }
1087
1088 static void test_pmuluw (void)
1089 {
1090   uint32x2_encap_t s, t;
1091   uint64_t r;
1092   s.a[0] = 0xdeadbeef;
1093   s.a[1] = 0;
1094   t.a[0] = 0x0f00baaa;
1095   t.a[1] = 0;
1096   r = pmuluw (s.v, t.v);
1097   assert (r == 0xd0cd08e1d1a70b6ull);
1098 }
1099
1100 static void test_pasubub (void)
1101 {
1102   uint8x8_encap_t s, t;
1103   uint8x8_encap_t r;
1104   s.a[0] = 10;
1105   s.a[1] = 20;
1106   s.a[2] = 30;
1107   s.a[3] = 40;
1108   s.a[4] = 50;
1109   s.a[5] = 60;
1110   s.a[6] = 70;
1111   s.a[7] = 80;
1112   t.a[0] = 80;
1113   t.a[1] = 70;
1114   t.a[2] = 60;
1115   t.a[3] = 50;
1116   t.a[4] = 40;
1117   t.a[5] = 30;
1118   t.a[6] = 20;
1119   t.a[7] = 10;
1120   r.v = pasubub (s.v, t.v);
1121   assert (r.a[0] == 70);
1122   assert (r.a[1] == 50);
1123   assert (r.a[2] == 30);
1124   assert (r.a[3] == 10);
1125   assert (r.a[4] == 10);
1126   assert (r.a[5] == 30);
1127   assert (r.a[6] == 50);
1128   assert (r.a[7] == 70);
1129 }
1130
1131 static void test_biadd (void)
1132 {
1133   uint8x8_encap_t s;
1134   uint16x4_encap_t r;
1135   s.a[0] = 10;
1136   s.a[1] = 20;
1137   s.a[2] = 30;
1138   s.a[3] = 40;
1139   s.a[4] = 50;
1140   s.a[5] = 60;
1141   s.a[6] = 70;
1142   s.a[7] = 80;
1143   r.v = biadd (s.v);
1144   assert (r.a[0] == 360);
1145   assert (r.a[1] == 0);
1146   assert (r.a[2] == 0);
1147   assert (r.a[3] == 0);
1148 }
1149
1150 static void test_psadbh (void)
1151 {
1152   uint8x8_encap_t s, t;
1153   uint16x4_encap_t r;
1154   s.a[0] = 10;
1155   s.a[1] = 20;
1156   s.a[2] = 30;
1157   s.a[3] = 40;
1158   s.a[4] = 50;
1159   s.a[5] = 60;
1160   s.a[6] = 70;
1161   s.a[7] = 80;
1162   t.a[0] = 80;
1163   t.a[1] = 70;
1164   t.a[2] = 60;
1165   t.a[3] = 50;
1166   t.a[4] = 40;
1167   t.a[5] = 30;
1168   t.a[6] = 20;
1169   t.a[7] = 10;
1170   r.v = psadbh (s.v, t.v);
1171   assert (r.a[0] == 0x0140);
1172   assert (r.a[1] == 0);
1173   assert (r.a[2] == 0);
1174   assert (r.a[3] == 0);
1175 }
1176
1177 static void test_pshufh_u (void)
1178 {
1179   uint16x4_encap_t s;
1180   uint16x4_encap_t r;
1181   s.a[0] = 1;
1182   s.a[1] = 2;
1183   s.a[2] = 3;
1184   s.a[3] = 4;
1185   r.a[0] = 0;
1186   r.a[1] = 0;
1187   r.a[2] = 0;
1188   r.a[3] = 0;
1189   r.v = pshufh_u (r.v, s.v, 0xe5);
1190   assert (r.a[0] == 2);
1191   assert (r.a[1] == 2);
1192   assert (r.a[2] == 3);
1193   assert (r.a[3] == 4);
1194 }
1195
1196 static void test_pshufh_s (void)
1197 {
1198   int16x4_encap_t s;
1199   int16x4_encap_t r;
1200   s.a[0] = -1;
1201   s.a[1] = 2;
1202   s.a[2] = -3;
1203   s.a[3] = 4;
1204   r.a[0] = 0;
1205   r.a[1] = 0;
1206   r.a[2] = 0;
1207   r.a[3] = 0;
1208   r.v = pshufh_s (r.v, s.v, 0xe5);
1209   assert (r.a[0] == 2);
1210   assert (r.a[1] == 2);
1211   assert (r.a[2] == -3);
1212   assert (r.a[3] == 4);
1213 }
1214
1215 static void test_psllh_u (void)
1216 {
1217   uint16x4_encap_t s;
1218   uint16x4_encap_t r;
1219   s.a[0] = 0xffff;
1220   s.a[1] = 0xffff;
1221   s.a[2] = 0xffff;
1222   s.a[3] = 0xffff;
1223   r.v = psllh_u (s.v, 1);
1224   assert (r.a[0] == 0xfffe);
1225   assert (r.a[1] == 0xfffe);
1226   assert (r.a[2] == 0xfffe);
1227   assert (r.a[3] == 0xfffe);
1228 }
1229
1230 static void test_psllw_u (void)
1231 {
1232   uint32x2_encap_t s;
1233   uint32x2_encap_t r;
1234   s.a[0] = 0xffffffff;
1235   s.a[1] = 0xffffffff;
1236   r.v = psllw_u (s.v, 2);
1237   assert (r.a[0] == 0xfffffffc);
1238   assert (r.a[1] == 0xfffffffc);
1239 }
1240
1241 static void test_psllh_s (void)
1242 {
1243   int16x4_encap_t s;
1244   int16x4_encap_t r;
1245   s.a[0] = -1;
1246   s.a[1] = -1;
1247   s.a[2] = -1;
1248   s.a[3] = -1;
1249   r.v = psllh_s (s.v, 1);
1250   assert (r.a[0] == -2);
1251   assert (r.a[1] == -2);
1252   assert (r.a[2] == -2);
1253   assert (r.a[3] == -2);
1254 }
1255
1256 static void test_psllw_s (void)
1257 {
1258   int32x2_encap_t s;
1259   int32x2_encap_t r;
1260   s.a[0] = -1;
1261   s.a[1] = -1;
1262   r.v = psllw_s (s.v, 2);
1263   assert (r.a[0] == -4);
1264   assert (r.a[1] == -4);
1265 }
1266
1267 static void test_psrah_u (void)
1268 {
1269   uint16x4_encap_t s;
1270   uint16x4_encap_t r;
1271   s.a[0] = 0xffef;
1272   s.a[1] = 0xffef;
1273   s.a[2] = 0xffef;
1274   s.a[3] = 0xffef;
1275   r.v = psrah_u (s.v, 1);
1276   assert (r.a[0] == 0xfff7);
1277   assert (r.a[1] == 0xfff7);
1278   assert (r.a[2] == 0xfff7);
1279   assert (r.a[3] == 0xfff7);
1280 }
1281
1282 static void test_psraw_u (void)
1283 {
1284   uint32x2_encap_t s;
1285   uint32x2_encap_t r;
1286   s.a[0] = 0xffffffef;
1287   s.a[1] = 0xffffffef;
1288   r.v = psraw_u (s.v, 1);
1289   assert (r.a[0] == 0xfffffff7);
1290   assert (r.a[1] == 0xfffffff7);
1291 }
1292
1293 static void test_psrah_s (void)
1294 {
1295   int16x4_encap_t s;
1296   int16x4_encap_t r;
1297   s.a[0] = -2;
1298   s.a[1] = -2;
1299   s.a[2] = -2;
1300   s.a[3] = -2;
1301   r.v = psrah_s (s.v, 1);
1302   assert (r.a[0] == -1);
1303   assert (r.a[1] == -1);
1304   assert (r.a[2] == -1);
1305   assert (r.a[3] == -1);
1306 }
1307
1308 static void test_psraw_s (void)
1309 {
1310   int32x2_encap_t s;
1311   int32x2_encap_t r;
1312   s.a[0] = -2;
1313   s.a[1] = -2;
1314   r.v = psraw_s (s.v, 1);
1315   assert (r.a[0] == -1);
1316   assert (r.a[1] == -1);
1317 }
1318
1319 static void test_psrlh_u (void)
1320 {
1321   uint16x4_encap_t s;
1322   uint16x4_encap_t r;
1323   s.a[0] = 0xffef;
1324   s.a[1] = 0xffef;
1325   s.a[2] = 0xffef;
1326   s.a[3] = 0xffef;
1327   r.v = psrlh_u (s.v, 1);
1328   assert (r.a[0] == 0x7ff7);
1329   assert (r.a[1] == 0x7ff7);
1330   assert (r.a[2] == 0x7ff7);
1331   assert (r.a[3] == 0x7ff7);
1332 }
1333
1334 static void test_psrlw_u (void)
1335 {
1336   uint32x2_encap_t s;
1337   uint32x2_encap_t r;
1338   s.a[0] = 0xffffffef;
1339   s.a[1] = 0xffffffef;
1340   r.v = psrlw_u (s.v, 1);
1341   assert (r.a[0] == 0x7ffffff7);
1342   assert (r.a[1] == 0x7ffffff7);
1343 }
1344
1345 static void test_psrlh_s (void)
1346 {
1347   int16x4_encap_t s;
1348   int16x4_encap_t r;
1349   s.a[0] = -1;
1350   s.a[1] = -1;
1351   s.a[2] = -1;
1352   s.a[3] = -1;
1353   r.v = psrlh_s (s.v, 1);
1354   assert (r.a[0] == INT16x4_MAX);
1355   assert (r.a[1] == INT16x4_MAX);
1356   assert (r.a[2] == INT16x4_MAX);
1357   assert (r.a[3] == INT16x4_MAX);
1358 }
1359
1360 static void test_psrlw_s (void)
1361 {
1362   int32x2_encap_t s;
1363   int32x2_encap_t r;
1364   s.a[0] = -1;
1365   s.a[1] = -1;
1366   r.v = psrlw_s (s.v, 1);
1367   assert (r.a[0] == INT32x2_MAX);
1368   assert (r.a[1] == INT32x2_MAX);
1369 }
1370
1371 static void test_psubw_u (void)
1372 {
1373   uint32x2_encap_t s, t;
1374   uint32x2_encap_t r;
1375   s.a[0] = 3;
1376   s.a[1] = 4;
1377   t.a[0] = 2;
1378   t.a[1] = 1;
1379   r.v = psubw_u (s.v, t.v);
1380   assert (r.a[0] == 1);
1381   assert (r.a[1] == 3);
1382 }
1383
1384 static void test_psubw_s (void)
1385 {
1386   int32x2_encap_t s, t;
1387   int32x2_encap_t r;
1388   s.a[0] = -2;
1389   s.a[1] = -1;
1390   t.a[0] = 3;
1391   t.a[1] = -4;
1392   r.v = psubw_s (s.v, t.v);
1393   assert (r.a[0] == -5);
1394   assert (r.a[1] == 3);
1395 }
1396
1397 static void test_psubh_u (void)
1398 {
1399   uint16x4_encap_t s, t;
1400   uint16x4_encap_t r;
1401   s.a[0] = 5;
1402   s.a[1] = 6;
1403   s.a[2] = 7;
1404   s.a[3] = 8;
1405   t.a[0] = 1;
1406   t.a[1] = 2;
1407   t.a[2] = 3;
1408   t.a[3] = 4;
1409   r.v = psubh_u (s.v, t.v);
1410   assert (r.a[0] == 4);
1411   assert (r.a[1] == 4);
1412   assert (r.a[2] == 4);
1413   assert (r.a[3] == 4);
1414 }
1415
1416 static void test_psubh_s (void)
1417 {
1418   int16x4_encap_t s, t;
1419   int16x4_encap_t r;
1420   s.a[0] = -10;
1421   s.a[1] = -20;
1422   s.a[2] = -30;
1423   s.a[3] = -40;
1424   t.a[0] = 1;
1425   t.a[1] = 2;
1426   t.a[2] = 3;
1427   t.a[3] = 4;
1428   r.v = psubh_s (s.v, t.v);
1429   assert (r.a[0] == -11);
1430   assert (r.a[1] == -22);
1431   assert (r.a[2] == -33);
1432   assert (r.a[3] == -44);
1433 }
1434
1435 static void test_psubb_u (void)
1436 {
1437   uint8x8_encap_t s, t;
1438   uint8x8_encap_t r;
1439   s.a[0] = 10;
1440   s.a[1] = 11;
1441   s.a[2] = 12;
1442   s.a[3] = 13;
1443   s.a[4] = 14;
1444   s.a[5] = 15;
1445   s.a[6] = 16;
1446   s.a[7] = 17;
1447   t.a[0] = 1;
1448   t.a[1] = 2;
1449   t.a[2] = 3;
1450   t.a[3] = 4;
1451   t.a[4] = 5;
1452   t.a[5] = 6;
1453   t.a[6] = 7;
1454   t.a[7] = 8;
1455   r.v = psubb_u (s.v, t.v);
1456   assert (r.a[0] == 9);
1457   assert (r.a[1] == 9);
1458   assert (r.a[2] == 9);
1459   assert (r.a[3] == 9);
1460   assert (r.a[4] == 9);
1461   assert (r.a[5] == 9);
1462   assert (r.a[6] == 9);
1463   assert (r.a[7] == 9);
1464 }
1465
1466 static void test_psubb_s (void)
1467 {
1468   int8x8_encap_t s, t;
1469   int8x8_encap_t r;
1470   s.a[0] = -10;
1471   s.a[1] = -20;
1472   s.a[2] = -30;
1473   s.a[3] = -40;
1474   s.a[4] = -50;
1475   s.a[5] = -60;
1476   s.a[6] = -70;
1477   s.a[7] = -80;
1478   t.a[0] = 1;
1479   t.a[1] = 2;
1480   t.a[2] = 3;
1481   t.a[3] = 4;
1482   t.a[4] = 5;
1483   t.a[5] = 6;
1484   t.a[6] = 7;
1485   t.a[7] = 8;
1486   r.v = psubb_s (s.v, t.v);
1487   assert (r.a[0] == -11);
1488   assert (r.a[1] == -22);
1489   assert (r.a[2] == -33);
1490   assert (r.a[3] == -44);
1491   assert (r.a[4] == -55);
1492   assert (r.a[5] == -66);
1493   assert (r.a[6] == -77);
1494   assert (r.a[7] == -88);
1495 }
1496
1497 static void test_psubd_u (void)
1498 {
1499   uint64_t d = 789012;
1500   uint64_t e = 123456;
1501   uint64_t r;
1502   r = psubd_u (d, e);
1503   assert (r == 665556);
1504 }
1505
1506 static void test_psubd_s (void)
1507 {
1508   int64_t d = 123456;
1509   int64_t e = -789012;
1510   int64_t r;
1511   r = psubd_s (d, e);
1512   assert (r == 912468);
1513 }
1514
1515 static void test_psubsh (void)
1516 {
1517   int16x4_encap_t s, t;
1518   int16x4_encap_t r;
1519   s.a[0] = -1;
1520   s.a[1] = 0;
1521   s.a[2] = 1;
1522   s.a[3] = 2;
1523   t.a[0] = -INT16x4_MAX;
1524   t.a[1] = -INT16x4_MAX;
1525   t.a[2] = -INT16x4_MAX;
1526   t.a[3] = -INT16x4_MAX;
1527   r.v = psubsh (s.v, t.v);
1528   assert (r.a[0] == INT16x4_MAX - 1);
1529   assert (r.a[1] == INT16x4_MAX);
1530   assert (r.a[2] == INT16x4_MAX);
1531   assert (r.a[3] == INT16x4_MAX);
1532 }
1533
1534 static void test_psubsb (void)
1535 {
1536   int8x8_encap_t s, t;
1537   int8x8_encap_t r;
1538   s.a[0] = -6;
1539   s.a[1] = -5;
1540   s.a[2] = -4;
1541   s.a[3] = -3;
1542   s.a[4] = -2;
1543   s.a[5] = -1;
1544   s.a[6] = 0;
1545   s.a[7] = 1;
1546   t.a[0] = -INT8x8_MAX;
1547   t.a[1] = -INT8x8_MAX;
1548   t.a[2] = -INT8x8_MAX;
1549   t.a[3] = -INT8x8_MAX;
1550   t.a[4] = -INT8x8_MAX;
1551   t.a[5] = -INT8x8_MAX;
1552   t.a[6] = -INT8x8_MAX;
1553   t.a[7] = -INT8x8_MAX;
1554   r.v = psubsb (s.v, t.v);
1555   assert (r.a[0] == INT8x8_MAX - 6);
1556   assert (r.a[1] == INT8x8_MAX - 5);
1557   assert (r.a[2] == INT8x8_MAX - 4);
1558   assert (r.a[3] == INT8x8_MAX - 3);
1559   assert (r.a[4] == INT8x8_MAX - 2);
1560   assert (r.a[5] == INT8x8_MAX - 1);
1561   assert (r.a[6] == INT8x8_MAX);
1562   assert (r.a[7] == INT8x8_MAX);
1563 }
1564
1565 static void test_psubush (void)
1566 {
1567   uint16x4_encap_t s, t;
1568   uint16x4_encap_t r;
1569   s.a[0] = 0;
1570   s.a[1] = 1;
1571   s.a[2] = 2;
1572   s.a[3] = 3;
1573   t.a[0] = 1;
1574   t.a[1] = 1;
1575   t.a[2] = 3;
1576   t.a[3] = 3;
1577   r.v = psubush (s.v, t.v);
1578   assert (r.a[0] == 0);
1579   assert (r.a[1] == 0);
1580   assert (r.a[2] == 0);
1581   assert (r.a[3] == 0);
1582 }
1583
1584 static void test_psubusb (void)
1585 {
1586   uint8x8_encap_t s, t;
1587   uint8x8_encap_t r;
1588   s.a[0] = 0;
1589   s.a[1] = 1;
1590   s.a[2] = 2;
1591   s.a[3] = 3;
1592   s.a[4] = 4;
1593   s.a[5] = 5;
1594   s.a[6] = 6;
1595   s.a[7] = 7;
1596   t.a[0] = 1;
1597   t.a[1] = 1;
1598   t.a[2] = 3;
1599   t.a[3] = 3;
1600   t.a[4] = 5;
1601   t.a[5] = 5;
1602   t.a[6] = 7;
1603   t.a[7] = 7;
1604   r.v = psubusb (s.v, t.v);
1605   assert (r.a[0] == 0);
1606   assert (r.a[1] == 0);
1607   assert (r.a[2] == 0);
1608   assert (r.a[3] == 0);
1609   assert (r.a[4] == 0);
1610   assert (r.a[5] == 0);
1611   assert (r.a[6] == 0);
1612   assert (r.a[7] == 0);
1613 }
1614
1615 static void test_punpckhbh_s (void)
1616 {
1617   int8x8_encap_t s, t;
1618   int8x8_encap_t r;
1619   s.a[0] = -1;
1620   s.a[1] = -3;
1621   s.a[2] = -5;
1622   s.a[3] = -7;
1623   s.a[4] = -9;
1624   s.a[5] = -11;
1625   s.a[6] = -13;
1626   s.a[7] = -15;
1627   t.a[0] = 2;
1628   t.a[1] = 4;
1629   t.a[2] = 6;
1630   t.a[3] = 8;
1631   t.a[4] = 10;
1632   t.a[5] = 12;
1633   t.a[6] = 14;
1634   t.a[7] = 16;
1635   r.v = punpckhbh_s (s.v, t.v);
1636   assert (r.a[0] == -9);
1637   assert (r.a[1] == 10);
1638   assert (r.a[2] == -11);
1639   assert (r.a[3] == 12);
1640   assert (r.a[4] == -13);
1641   assert (r.a[5] == 14);
1642   assert (r.a[6] == -15);
1643   assert (r.a[7] == 16);
1644 }
1645
1646 static void test_punpckhbh_u (void)
1647 {
1648   uint8x8_encap_t s, t;
1649   uint8x8_encap_t r;
1650   s.a[0] = 1;
1651   s.a[1] = 3;
1652   s.a[2] = 5;
1653   s.a[3] = 7;
1654   s.a[4] = 9;
1655   s.a[5] = 11;
1656   s.a[6] = 13;
1657   s.a[7] = 15;
1658   t.a[0] = 2;
1659   t.a[1] = 4;
1660   t.a[2] = 6;
1661   t.a[3] = 8;
1662   t.a[4] = 10;
1663   t.a[5] = 12;
1664   t.a[6] = 14;
1665   t.a[7] = 16;
1666   r.v = punpckhbh_u (s.v, t.v);
1667   assert (r.a[0] == 9);
1668   assert (r.a[1] == 10);
1669   assert (r.a[2] == 11);
1670   assert (r.a[3] == 12);
1671   assert (r.a[4] == 13);
1672   assert (r.a[5] == 14);
1673   assert (r.a[6] == 15);
1674   assert (r.a[7] == 16);
1675 }
1676
1677 static void test_punpckhhw_s (void)
1678 {
1679   int16x4_encap_t s, t;
1680   int16x4_encap_t r;
1681   s.a[0] = -1;
1682   s.a[1] = 3;
1683   s.a[2] = -5;
1684   s.a[3] = 7;
1685   t.a[0] = -2;
1686   t.a[1] = 4;
1687   t.a[2] = -6;
1688   t.a[3] = 8;
1689   r.v = punpckhhw_s (s.v, t.v);
1690   assert (r.a[0] == -5);
1691   assert (r.a[1] == -6);
1692   assert (r.a[2] == 7);
1693   assert (r.a[3] == 8);
1694 }
1695
1696 static void test_punpckhhw_u (void)
1697 {
1698   uint16x4_encap_t s, t;
1699   uint16x4_encap_t r;
1700   s.a[0] = 1;
1701   s.a[1] = 3;
1702   s.a[2] = 5;
1703   s.a[3] = 7;
1704   t.a[0] = 2;
1705   t.a[1] = 4;
1706   t.a[2] = 6;
1707   t.a[3] = 8;
1708   r.v = punpckhhw_u (s.v, t.v);
1709   assert (r.a[0] == 5);
1710   assert (r.a[1] == 6);
1711   assert (r.a[2] == 7);
1712   assert (r.a[3] == 8);
1713 }
1714
1715 static void test_punpckhwd_s (void)
1716 {
1717   int32x2_encap_t s, t;
1718   int32x2_encap_t r;
1719   s.a[0] = 1;
1720   s.a[1] = 3;
1721   t.a[0] = 2;
1722   t.a[1] = -4;
1723   r.v = punpckhwd_s (s.v, t.v);
1724   assert (r.a[0] == 3);
1725   assert (r.a[1] == -4);
1726 }
1727
1728 static void test_punpckhwd_u (void)
1729 {
1730   uint32x2_encap_t s, t;
1731   uint32x2_encap_t r;
1732   s.a[0] = 1;
1733   s.a[1] = 3;
1734   t.a[0] = 2;
1735   t.a[1] = 4;
1736   r.v = punpckhwd_u (s.v, t.v);
1737   assert (r.a[0] == 3);
1738   assert (r.a[1] == 4);
1739 }
1740
1741 static void test_punpcklbh_s (void)
1742 {
1743   int8x8_encap_t s, t;
1744   int8x8_encap_t r;
1745   s.a[0] = -1;
1746   s.a[1] = -3;
1747   s.a[2] = -5;
1748   s.a[3] = -7;
1749   s.a[4] = -9;
1750   s.a[5] = -11;
1751   s.a[6] = -13;
1752   s.a[7] = -15;
1753   t.a[0] = 2;
1754   t.a[1] = 4;
1755   t.a[2] = 6;
1756   t.a[3] = 8;
1757   t.a[4] = 10;
1758   t.a[5] = 12;
1759   t.a[6] = 14;
1760   t.a[7] = 16;
1761   r.v = punpcklbh_s (s.v, t.v);
1762   assert (r.a[0] == -1);
1763   assert (r.a[1] == 2);
1764   assert (r.a[2] == -3);
1765   assert (r.a[3] == 4);
1766   assert (r.a[4] == -5);
1767   assert (r.a[5] == 6);
1768   assert (r.a[6] == -7);
1769   assert (r.a[7] == 8);
1770 }
1771
1772 static void test_punpcklbh_u (void)
1773 {
1774   uint8x8_encap_t s, t;
1775   uint8x8_encap_t r;
1776   s.a[0] = 1;
1777   s.a[1] = 3;
1778   s.a[2] = 5;
1779   s.a[3] = 7;
1780   s.a[4] = 9;
1781   s.a[5] = 11;
1782   s.a[6] = 13;
1783   s.a[7] = 15;
1784   t.a[0] = 2;
1785   t.a[1] = 4;
1786   t.a[2] = 6;
1787   t.a[3] = 8;
1788   t.a[4] = 10;
1789   t.a[5] = 12;
1790   t.a[6] = 14;
1791   t.a[7] = 16;
1792   r.v = punpcklbh_u (s.v, t.v);
1793   assert (r.a[0] == 1);
1794   assert (r.a[1] == 2);
1795   assert (r.a[2] == 3);
1796   assert (r.a[3] == 4);
1797   assert (r.a[4] == 5);
1798   assert (r.a[5] == 6);
1799   assert (r.a[6] == 7);
1800   assert (r.a[7] == 8);
1801 }
1802
1803 static void test_punpcklhw_s (void)
1804 {
1805   int16x4_encap_t s, t;
1806   int16x4_encap_t r;
1807   s.a[0] = -1;
1808   s.a[1] = 3;
1809   s.a[2] = -5;
1810   s.a[3] = 7;
1811   t.a[0] = -2;
1812   t.a[1] = 4;
1813   t.a[2] = -6;
1814   t.a[3] = 8;
1815   r.v = punpcklhw_s (s.v, t.v);
1816   assert (r.a[0] == -1);
1817   assert (r.a[1] == -2);
1818   assert (r.a[2] == 3);
1819   assert (r.a[3] == 4);
1820 }
1821
1822 static void test_punpcklhw_u (void)
1823 {
1824   uint16x4_encap_t s, t;
1825   uint16x4_encap_t r;
1826   s.a[0] = 1;
1827   s.a[1] = 3;
1828   s.a[2] = 5;
1829   s.a[3] = 7;
1830   t.a[0] = 2;
1831   t.a[1] = 4;
1832   t.a[2] = 6;
1833   t.a[3] = 8;
1834   r.v = punpcklhw_u (s.v, t.v);
1835   assert (r.a[0] == 1);
1836   assert (r.a[1] == 2);
1837   assert (r.a[2] == 3);
1838   assert (r.a[3] == 4);
1839 }
1840
1841 static void test_punpcklwd_s (void)
1842 {
1843   int32x2_encap_t s, t;
1844   int32x2_encap_t r;
1845   s.a[0] = 1;
1846   s.a[1] = 3;
1847   t.a[0] = -2;
1848   t.a[1] = 4;
1849   r.v = punpcklwd_s (s.v, t.v);
1850   assert (r.a[0] == 1);
1851   assert (r.a[1] == -2);
1852 }
1853
1854 static void test_punpcklwd_u (void)
1855 {
1856   uint32x2_encap_t s, t;
1857   uint32x2_encap_t r;
1858   s.a[0] = 1;
1859   s.a[1] = 3;
1860   t.a[0] = 2;
1861   t.a[1] = 4;
1862   r.v = punpcklwd_u (s.v, t.v);
1863   assert (r.a[0] == 1);
1864   assert (r.a[1] == 2);
1865 }
1866
1867 int main (void)
1868 {
1869   test_packsswh ();
1870   test_packsshb ();
1871   test_packushb ();
1872   test_paddw_u ();
1873   test_paddw_s ();
1874   test_paddh_u ();
1875   test_paddh_s ();
1876   test_paddb_u ();
1877   test_paddb_s ();
1878   test_paddd_u ();
1879   test_paddd_s ();
1880   test_paddsh ();
1881   test_paddsb ();
1882   test_paddush ();
1883   test_paddusb ();
1884   test_pandn_ud ();
1885   test_pandn_sd ();
1886   test_pandn_uw ();
1887   test_pandn_sw ();
1888   test_pandn_uh ();
1889   test_pandn_sh ();
1890   test_pandn_ub ();
1891   test_pandn_sb ();
1892   test_pavgh ();
1893   test_pavgb ();
1894   test_pcmpeqw_u ();
1895   test_pcmpeqh_u ();
1896   test_pcmpeqb_u ();
1897   test_pcmpeqw_s ();
1898   test_pcmpeqh_s ();
1899   test_pcmpeqb_s ();
1900   test_pcmpgtw_u ();
1901   test_pcmpgth_u ();
1902   test_pcmpgtb_u ();
1903   test_pcmpgtw_s ();
1904   test_pcmpgth_s ();
1905   test_pcmpgtb_s ();
1906   test_pextrh_u ();
1907   test_pextrh_s ();
1908   test_pinsrh_0123_u ();
1909   test_pinsrh_0123_s ();
1910   test_pmaddhw ();
1911   test_pmaxsh ();
1912   test_pmaxub ();
1913   test_pminsh ();
1914   test_pminub ();
1915   test_pmovmskb_u ();
1916   test_pmovmskb_s ();
1917   test_pmulhuh ();
1918   test_pmulhh ();
1919   test_pmullh ();
1920   test_pmuluw ();
1921   test_pasubub ();
1922   test_biadd ();
1923   test_psadbh ();
1924   test_pshufh_u ();
1925   test_pshufh_s ();
1926   test_psllh_u ();
1927   test_psllw_u ();
1928   test_psllh_s ();
1929   test_psllw_s ();
1930   test_psrah_u ();
1931   test_psraw_u ();
1932   test_psrah_s ();
1933   test_psraw_s ();
1934   test_psrlh_u ();
1935   test_psrlw_u ();
1936   test_psrlh_s ();
1937   test_psrlw_s ();
1938   test_psubw_u ();
1939   test_psubw_s ();
1940   test_psubh_u ();
1941   test_psubh_s ();
1942   test_psubb_u ();
1943   test_psubb_s ();
1944   test_psubd_u ();
1945   test_psubd_s ();
1946   test_psubsh ();
1947   test_psubsb ();
1948   test_psubush ();
1949   test_psubusb ();
1950   test_punpckhbh_s ();
1951   test_punpckhbh_u ();
1952   test_punpckhhw_s ();
1953   test_punpckhhw_u ();
1954   test_punpckhwd_s ();
1955   test_punpckhwd_u ();
1956   test_punpcklbh_s ();
1957   test_punpcklbh_u ();
1958   test_punpcklhw_s ();
1959   test_punpcklhw_u ();
1960   test_punpcklwd_s ();
1961   test_punpcklwd_u ();
1962   return 0;
1963 }