OSDN Git Service

Commit for Jiangning.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.target / mips / mips32-dsp-run.c
1 /* Test MIPS32 DSP instructions */
2 /* { dg-do run } */
3 /* { dg-options "-mdsp -O2" } */
4
5 #include <stdlib.h>
6 #include <stdio.h>
7
8 typedef signed char v4i8 __attribute__ ((vector_size(4)));
9 typedef short v2q15 __attribute__ ((vector_size(4)));
10
11 typedef int q31;
12 typedef int i32;
13 typedef unsigned int ui32;
14 typedef long long a64;
15
16 NOMIPS16 void test_MIPS_DSP (void);
17
18 char array[100];
19 int little_endian;
20
21 int main ()
22 {
23   int i;
24
25   union { long long ll; int i[2]; } endianness_test;
26   endianness_test.ll = 1;
27   little_endian = endianness_test.i[0];
28
29   for (i = 0; i < 100; i++)
30     array[i] = i;
31
32   test_MIPS_DSP ();
33
34   exit (0);
35 }
36
37 NOMIPS16 v2q15 add_v2q15 (v2q15 a, v2q15 b)
38 {
39   return __builtin_mips_addq_ph (a, b);
40 }
41
42 NOMIPS16 v4i8 add_v4i8 (v4i8 a, v4i8 b)
43 {
44   return __builtin_mips_addu_qb (a, b);
45 }
46
47 NOMIPS16 v2q15 sub_v2q15 (v2q15 a, v2q15 b)
48 {
49   return __builtin_mips_subq_ph (a, b);
50 }
51
52 NOMIPS16 v4i8 sub_v4i8 (v4i8 a, v4i8 b)
53 {
54   return __builtin_mips_subu_qb (a, b);
55 }
56
57 NOMIPS16 void test_MIPS_DSP ()
58 {
59   v4i8 v4i8_a,v4i8_b,v4i8_c,v4i8_r,v4i8_s;
60   v2q15 v2q15_a,v2q15_b,v2q15_c,v2q15_r,v2q15_s;
61   q31 q31_a,q31_b,q31_c,q31_r,q31_s;
62   i32 i32_a,i32_b,i32_c,i32_r,i32_s;
63   ui32 ui32_a,ui32_b,ui32_c;
64   a64 a64_a,a64_b,a64_c,a64_r,a64_s;
65
66   void *ptr_a;
67   int r,s;
68   long long lr,ls;
69
70   v2q15_a = (v2q15) {0x1234, 0x5678};
71   v2q15_b = (v2q15) {0x6f89, 0x1111};
72   v2q15_s = (v2q15) {0x81bd, 0x6789};
73   v2q15_r = add_v2q15 (v2q15_a, v2q15_b);
74   r = (int) v2q15_r;
75   s = (int) v2q15_s;
76   if (r != s)
77     abort ();
78
79   v2q15_a = (v2q15) {0x1234, 0x5678};
80   v2q15_b = (v2q15) {0x6f89, 0x1111};
81   v2q15_s = (v2q15) {0x7fff, 0x6789};
82   v2q15_r = __builtin_mips_addq_s_ph (v2q15_a, v2q15_b);
83   r = (int) v2q15_r;
84   s = (int) v2q15_s;
85   if (r != s)
86     abort ();
87
88   q31_a = 0x70000000;
89   q31_b = 0x71234567;
90   q31_s = 0x7fffffff;
91   q31_r = __builtin_mips_addq_s_w (q31_a, q31_b);
92   if (q31_r != q31_s)
93     abort ();
94
95   v4i8_a = (v4i8) {0xf2, 0x34, 0x56, 0x78};
96   v4i8_b = (v4i8) {0xff, 0x89, 0x11, 0x11};
97   v4i8_s = (v4i8) {0xf1, 0xbd, 0x67, 0x89};
98   v4i8_r = add_v4i8 (v4i8_a, v4i8_b);
99   r = (int) v4i8_r;
100   s = (int) v4i8_s;
101   if (r != s)
102     abort ();
103
104   v4i8_a = (v4i8) {0xf2, 0x34, 0x56, 0x78};
105   v4i8_b = (v4i8) {0xff, 0x89, 0x11, 0x11};
106   v4i8_s = (v4i8) {0xff, 0xbd, 0x67, 0x89};
107   v4i8_r = __builtin_mips_addu_s_qb (v4i8_a, v4i8_b);
108   r = (int) v4i8_r;
109   s = (int) v4i8_s;
110   if (r != s)
111     abort ();
112
113   v2q15_a = (v2q15) {0x1234, 0x5678};
114   v2q15_b = (v2q15) {0x6f89, 0x1111};
115   v2q15_s = (v2q15) {0xa2ab, 0x4567};
116   v2q15_r = sub_v2q15 (v2q15_a, v2q15_b);
117   r = (int) v2q15_r;
118   s = (int) v2q15_s;
119   if (r != s)
120     abort ();
121
122   v2q15_a = (v2q15) {0x8000, 0x5678};
123   v2q15_b = (v2q15) {0x6f89, 0x1111};
124   v2q15_s = (v2q15) {0x8000, 0x4567};
125   v2q15_r = __builtin_mips_subq_s_ph (v2q15_a, v2q15_b);
126   r = (int) v2q15_r;
127   s = (int) v2q15_s;
128   if (r != s)
129     abort ();
130
131   q31_a = 0x70000000;
132   q31_b = 0x71234567;
133   q31_s = 0xfedcba99;
134   q31_r = __builtin_mips_subq_s_w (q31_a, q31_b);
135   if (q31_r != q31_s)
136     abort ();
137
138   v4i8_a = (v4i8) {0xf2, 0x34, 0x56, 0x78};
139   v4i8_b = (v4i8) {0xff, 0x89, 0x11, 0x11};
140   v4i8_s = (v4i8) {0xf3, 0xab, 0x45, 0x67};
141   v4i8_r = sub_v4i8 (v4i8_a, v4i8_b);
142   r = (int) v4i8_r;
143   s = (int) v4i8_s;
144   if (r != s)
145     abort ();
146
147   v4i8_a = (v4i8) {0xf2, 0x34, 0x56, 0x78};
148   v4i8_b = (v4i8) {0xff, 0x89, 0x11, 0x11};
149   v4i8_s = (v4i8) {0x0, 0x0, 0x45, 0x67};
150   v4i8_r = __builtin_mips_subu_s_qb (v4i8_a, v4i8_b);
151   r = (int) v4i8_r;
152   s = (int) v4i8_s;
153   if (r != s)
154     abort ();
155
156   i32_a = 0xf5678900;
157   i32_b = 0x7abcdef0;
158   i32_s = 0x702467f0;
159   i32_r = __builtin_mips_addsc (i32_a, i32_b);
160   if (i32_r != i32_s)
161     abort ();
162
163   i32_a = 0x75678900;
164   i32_b = 0x7abcdef0;
165   i32_s = 0xf02467f1;
166   i32_r = __builtin_mips_addwc (i32_a, i32_b);
167   if (i32_r != i32_s)
168     abort ();
169
170   i32_a = 0;
171   i32_b = 0x00000901;
172   i32_s = 9;
173   i32_r = __builtin_mips_modsub (i32_a, i32_b);
174   if (i32_r != i32_s)
175     abort ();
176
177   v4i8_a = (v4i8) {0xf2, 0x34, 0x56, 0x78};
178   i32_s = 0x1f4;
179   i32_r = __builtin_mips_raddu_w_qb (v4i8_a);
180   if (i32_r != i32_s)
181     abort ();
182
183   v2q15_a = (v2q15) {0x8000, 0x8134};
184   v2q15_s = (v2q15) {0x7fff, 0x7ecc};
185   v2q15_r = __builtin_mips_absq_s_ph (v2q15_a);
186   r = (int) v2q15_r;
187   s = (int) v2q15_s;
188   if (r != s)
189     abort ();
190
191   q31_a = (q31) 0x80000000;
192   q31_s = (q31) 0x7fffffff;
193   q31_r = __builtin_mips_absq_s_w (q31_a);
194   if (q31_r != q31_s)
195     abort ();
196
197   v2q15_a = (v2q15) {0x9999, 0x5612};
198   v2q15_b = (v2q15) {0x5612, 0x3333};
199   if (little_endian)
200     v4i8_s = (v4i8) {0x56, 0x33, 0x99, 0x56};
201   else
202     v4i8_s = (v4i8) {0x99, 0x56, 0x56, 0x33};
203   v4i8_r = __builtin_mips_precrq_qb_ph (v2q15_a, v2q15_b);
204   r = (int) v4i8_r;
205   s = (int) v4i8_s;
206   if (r != s)
207     abort ();
208
209   q31_a = 0x12348678;
210   q31_b = 0x44445555;
211   if (little_endian)
212     v2q15_s = (v2q15) {0x4444, 0x1234};
213   else
214     v2q15_s = (v2q15) {0x1234, 0x4444};
215   v2q15_r = __builtin_mips_precrq_ph_w (q31_a, q31_b);
216   r = (int) v2q15_r;
217   s = (int) v2q15_s;
218   if (r != s)
219     abort ();
220
221   q31_a = 0x12348678;
222   q31_b = 0x44445555;
223   if (little_endian)
224     v2q15_s = (v2q15) {0x4444, 0x1235};
225   else
226     v2q15_s = (v2q15) {0x1235, 0x4444};
227   v2q15_r = __builtin_mips_precrq_rs_ph_w (q31_a, q31_b);
228   r = (int) v2q15_r;
229   s = (int) v2q15_s;
230   if (r != s)
231     abort ();
232
233   v2q15_a = (v2q15) {0x9999, 0x5612};
234   v2q15_b = (v2q15) {0x5612, 0x3333};
235   if (little_endian)
236     v4i8_s = (v4i8) {0xac, 0x66, 0x00, 0xac};
237   else
238     v4i8_s = (v4i8) {0x00, 0xac, 0xac, 0x66};
239   v4i8_r = __builtin_mips_precrqu_s_qb_ph (v2q15_a, v2q15_b);
240   r = (int) v4i8_r;
241   s = (int) v4i8_s;
242   if (r != s)
243     abort ();
244
245   v2q15_a = (v2q15) {0x3589, 0x4444};
246   if (little_endian)
247     q31_s = 0x44440000;
248   else
249     q31_s = 0x35890000;
250   q31_r = __builtin_mips_preceq_w_phl (v2q15_a);
251   if (q31_r != q31_s)
252     abort ();
253
254   v2q15_a = (v2q15) {0x3589, 0x4444};
255   if (little_endian)
256     q31_s = 0x35890000;
257   else
258     q31_s = 0x44440000;
259   q31_r = __builtin_mips_preceq_w_phr (v2q15_a);
260   if (q31_r != q31_s)
261     abort ();
262
263   v4i8_a = (v4i8) {0x12, 0x56, 0x56, 0x33};
264   if (little_endian)
265     v2q15_s = (v2q15) {0x2b00, 0x1980};
266   else
267     v2q15_s = (v2q15) {0x0900, 0x2b00};
268   v2q15_r = __builtin_mips_precequ_ph_qbl (v4i8_a);
269   r = (int) v2q15_r;
270   s = (int) v2q15_s;
271   if (r != s)
272     abort ();
273
274   v4i8_a = (v4i8) {0x12, 0x56, 0x56, 0x33};
275   if (little_endian)
276     v2q15_s = (v2q15) {0x0900, 0x2b00};
277   else
278     v2q15_s = (v2q15) {0x2b00, 0x1980};
279   v2q15_r = __builtin_mips_precequ_ph_qbr (v4i8_a);
280   r = (int) v2q15_r;
281   s = (int) v2q15_s;
282   if (r != s)
283     abort ();
284
285   v4i8_a = (v4i8) {0x12, 0x56, 0x56, 0x33};
286   if (little_endian)
287     v2q15_s = (v2q15) {0x2b00, 0x1980};
288   else
289     v2q15_s = (v2q15) {0x0900, 0x2b00};
290   v2q15_r = __builtin_mips_precequ_ph_qbla (v4i8_a);
291   r = (int) v2q15_r;
292   s = (int) v2q15_s;
293   if (r != s)
294     abort ();
295
296   v4i8_a = (v4i8) {0x12, 0x56, 0x56, 0x33};
297   if (little_endian)
298     v2q15_s = (v2q15) {0x0900, 0x2b00};
299   else
300     v2q15_s = (v2q15) {0x2b00, 0x1980};
301   v2q15_r = __builtin_mips_precequ_ph_qbra (v4i8_a);
302   r = (int) v2q15_r;
303   s = (int) v2q15_s;
304   if (r != s)
305     abort ();
306
307   v4i8_a = (v4i8) {0x12, 0x56, 0x56, 0x33};
308   if (little_endian)
309     v2q15_s = (v2q15) {0x56, 0x33};
310   else
311     v2q15_s = (v2q15) {0x12, 0x56};
312   v2q15_r = __builtin_mips_preceu_ph_qbl (v4i8_a);
313   r = (int) v2q15_r;
314   s = (int) v2q15_s;
315   if (r != s)
316     abort ();
317
318   v4i8_a = (v4i8) {0x12, 0x56, 0x56, 0x33};
319   if (little_endian)
320     v2q15_s = (v2q15) {0x12, 0x56};
321   else
322     v2q15_s = (v2q15) {0x56, 0x33};
323   v2q15_r = __builtin_mips_preceu_ph_qbr (v4i8_a);
324   r = (int) v2q15_r;
325   s = (int) v2q15_s;
326   if (r != s)
327     abort ();
328
329   v4i8_a = (v4i8) {0x12, 0x99, 0x56, 0x33};
330   if (little_endian)
331     v2q15_s = (v2q15) {0x99, 0x33};
332   else
333     v2q15_s = (v2q15) {0x12, 0x56};
334   v2q15_r = __builtin_mips_preceu_ph_qbla (v4i8_a);
335   r = (int) v2q15_r;
336   s = (int) v2q15_s;
337   if (r != s)
338     abort ();
339
340   v4i8_a = (v4i8) {0x12, 0x99, 0x56, 0x33};
341   if (little_endian)
342     v2q15_s = (v2q15) {0x12, 0x56};
343   else
344     v2q15_s = (v2q15) {0x99, 0x33};
345   v2q15_r = __builtin_mips_preceu_ph_qbra (v4i8_a);
346   r = (int) v2q15_r;
347   s = (int) v2q15_s;
348   if (r != s)
349     abort ();
350
351   v4i8_a = (v4i8) {0xf2, 0x34, 0x56, 0x78};
352   v4i8_s = (v4i8) {0xc8, 0xd0, 0x58, 0xe0};
353   v4i8_r = __builtin_mips_shll_qb (v4i8_a, 2);
354   r = (int) v4i8_r;
355   s = (int) v4i8_s;
356   if (r != s)
357     abort ();
358
359   v4i8_a = (v4i8) {0xf2, 0x34, 0x56, 0x78};
360   i32_b = 1;
361   v4i8_s = (v4i8) {0xe4, 0x68, 0xac, 0xf0};
362   v4i8_r = __builtin_mips_shll_qb (v4i8_a, i32_b);
363   r = (int) v4i8_r;
364   s = (int) v4i8_s;
365   if (r != s)
366     abort ();
367
368   v2q15_a = (v2q15) {0x1234, 0x5678};
369   v2q15_s = (v2q15) {0x48d0, 0x59e0};
370   v2q15_r = __builtin_mips_shll_ph (v2q15_a, 2);
371   r = (int) v2q15_r;
372   s = (int) v2q15_s;
373   if (r != s)
374     abort ();
375
376   v2q15_a = (v2q15) {0x1234, 0x5678};
377   i32_b = 1;
378   v2q15_s = (v2q15) {0x2468, 0xacf0};
379   v2q15_r = __builtin_mips_shll_ph (v2q15_a, i32_b);
380   r = (int) v2q15_r;
381   s = (int) v2q15_s;
382   if (r != s)
383     abort ();
384
385   v2q15_a = (v2q15) {0x1234, 0x5678};
386   v2q15_s = (v2q15) {0x48d0, 0x7fff};
387   v2q15_r = __builtin_mips_shll_s_ph (v2q15_a, 2);
388   r = (int) v2q15_r;
389   s = (int) v2q15_s;
390   if (r != s)
391     abort ();
392
393   v2q15_a = (v2q15) {0x1234, 0x5678};
394   i32_b = 1;
395   v2q15_s = (v2q15) {0x2468, 0x7fff};
396   v2q15_r = __builtin_mips_shll_s_ph (v2q15_a, i32_b);
397   r = (int) v2q15_r;
398   s = (int) v2q15_s;
399   if (r != s)
400     abort ();
401
402   q31_a = 0x70000000;
403   q31_s = 0x7fffffff;
404   q31_r = __builtin_mips_shll_s_w (q31_a, 2);
405   if (q31_r != q31_s)
406     abort ();
407
408   q31_a = 0x70000000;
409   i32_b = 1;
410   q31_s = 0x7fffffff;
411   q31_r = __builtin_mips_shll_s_w (q31_a, i32_b);
412   if (q31_r != q31_s)
413     abort ();
414
415   v4i8_a = (v4i8) {0xf2, 0x34, 0x56, 0x78};
416   v4i8_s = (v4i8) {0x3c, 0xd, 0x15, 0x1e};
417   v4i8_r = __builtin_mips_shrl_qb (v4i8_a, 2);
418   r = (int) v4i8_r;
419   s = (int) v4i8_s;
420   if (r != s)
421     abort ();
422
423   v4i8_a = (v4i8) {0xf2, 0x34, 0x56, 0x78};
424   i32_b = 1;
425   v4i8_s = (v4i8) {0x79, 0x1a, 0x2b, 0x3c};
426   v4i8_r = __builtin_mips_shrl_qb (v4i8_a, i32_b);
427   r = (int) v4i8_r;
428   s = (int) v4i8_s;
429   if (r != s)
430     abort ();
431
432   v2q15_a = (v2q15) {0x1234, 0x5678};
433   v2q15_s = (v2q15) {0x48d, 0x159e};
434   v2q15_r = __builtin_mips_shra_ph (v2q15_a, 2);
435   r = (int) v2q15_r;
436   s = (int) v2q15_s;
437   if (r != s)
438     abort ();
439
440   v2q15_a = (v2q15) {0x1234, 0x5678};
441   i32_b = 1;
442   v2q15_s = (v2q15) {0x91a, 0x2b3c};
443   v2q15_r = __builtin_mips_shra_ph (v2q15_a, i32_b);
444   r = (int) v2q15_r;
445   s = (int) v2q15_s;
446   if (r != s)
447     abort ();
448
449   v2q15_a = (v2q15) {0x1234, 0x5678};
450   v2q15_s = (v2q15) {0x48d, 0x159e};
451   v2q15_r = __builtin_mips_shra_r_ph (v2q15_a, 2);
452   r = (int) v2q15_r;
453   s = (int) v2q15_s;
454   if (r != s)
455     abort ();
456
457   v2q15_a = (v2q15) {0x1234, 0x5678};
458   i32_b = 3;
459   v2q15_s = (v2q15) {0x247, 0xacf};
460   v2q15_r = __builtin_mips_shra_r_ph (v2q15_a, i32_b);
461   r = (int) v2q15_r;
462   s = (int) v2q15_s;
463   if (r != s)
464     abort ();
465
466   q31_a = 0x70000000;
467   q31_s = 0x1c000000;
468   q31_r = __builtin_mips_shra_r_w (q31_a, 2);
469   if (q31_r != q31_s)
470     abort ();
471
472   q31_a = 0x70000004;
473   i32_b = 3;
474   q31_s = 0x0e000001;
475   q31_r = __builtin_mips_shra_r_w (q31_a, i32_b);
476   if (q31_r != q31_s)
477     abort ();
478
479   v4i8_a = (v4i8) {0x1, 0x2, 0x3, 0x4};
480   v2q15_b = (v2q15) {0x6f89, 0x1111};
481   if (little_endian)
482     v2q15_s = (v2q15) {0xffff, 0x4444};
483   else
484     v2q15_s = (v2q15) {0x6f89, 0x2222};
485   v2q15_r = __builtin_mips_muleu_s_ph_qbl (v4i8_a, v2q15_b);
486   r = (int) v2q15_r;
487   s = (int) v2q15_s;
488   if (r != s)
489     abort ();
490
491   v4i8_a = (v4i8) {0x1, 0x2, 0x3, 0x4};
492   v2q15_b = (v2q15) {0x6f89, 0x1111};
493   if (little_endian)
494     v2q15_s = (v2q15) {0x6f89, 0x2222};
495   else
496     v2q15_s = (v2q15) {0xffff, 0x4444};
497   v2q15_r = __builtin_mips_muleu_s_ph_qbr (v4i8_a, v2q15_b);
498   r = (int) v2q15_r;
499   s = (int) v2q15_s;
500   if (r != s)
501     abort ();
502
503   v2q15_a = (v2q15) {0x1234, 0x5678};
504   v2q15_b = (v2q15) {0x6f89, 0x1111};
505   v2q15_s = (v2q15) {0x0fdd, 0x0b87};
506   v2q15_r = __builtin_mips_mulq_rs_ph (v2q15_a, v2q15_b);
507   r = (int) v2q15_r;
508   s = (int) v2q15_s;
509   if (r != s)
510     abort ();
511
512   v2q15_a = (v2q15) {0x8000, 0x8000};
513   v2q15_b = (v2q15) {0x8000, 0x8000};
514   q31_s = 0x7fffffff;
515   q31_r = __builtin_mips_muleq_s_w_phl (v2q15_a, v2q15_b);
516   if (q31_r != q31_s)
517     abort ();
518
519   v2q15_a = (v2q15) {0x8000, 0x8000};
520   v2q15_b = (v2q15) {0x8000, 0x8000};
521   q31_s = 0x7fffffff;
522   q31_r = __builtin_mips_muleq_s_w_phr (v2q15_a, v2q15_b);
523   if (q31_r != q31_s)
524     abort ();
525
526 #ifndef __mips64
527   a64_a = 0x22221111;
528   v4i8_b = (v4i8) {0x12, 0x34, 0x56, 0x78};
529   v4i8_c = (v4i8) {0xaa, 0x89, 0x11, 0x34};
530   if (little_endian)
531     a64_s = 0x22222f27;
532   else
533     a64_s = 0x222238d9;
534   a64_r = __builtin_mips_dpau_h_qbl (a64_a, v4i8_b, v4i8_c);
535   if (a64_r != a64_s)
536     abort ();
537
538   a64_a = 0x22221111;
539   v4i8_b = (v4i8) {0x12, 0x34, 0x56, 0x78};
540   v4i8_c = (v4i8) {0xaa, 0x89, 0x11, 0x34};
541   if (little_endian)
542     a64_s = 0x222238d9;
543   else
544     a64_s = 0x22222f27;
545   a64_r = __builtin_mips_dpau_h_qbr (a64_a, v4i8_b, v4i8_c);
546   if (a64_r != a64_s)
547     abort ();
548
549   a64_a = 0x22221111;
550   v4i8_b = (v4i8) {0x12, 0x34, 0x56, 0x78};
551   v4i8_c = (v4i8) {0xaa, 0x89, 0x11, 0x34};
552   if (little_endian)
553     a64_s = 0x2221f2fb;
554   else
555     a64_s = 0x2221e949;
556   a64_r = __builtin_mips_dpsu_h_qbl (a64_a, v4i8_b, v4i8_c);
557   if (a64_r != a64_s)
558     abort ();
559
560   a64_a = 0x22221111;
561   v4i8_b = (v4i8) {0x12, 0x34, 0x56, 0x78};
562   v4i8_c = (v4i8) {0xaa, 0x89, 0x11, 0x34};
563   if (little_endian)
564     a64_s = 0x2221e949;
565   else
566     a64_s = 0x2221f2fb;
567   a64_r = __builtin_mips_dpsu_h_qbr (a64_a, v4i8_b, v4i8_c);
568   if (a64_r != a64_s)
569     abort ();
570
571   a64_a = 0x00001111;
572   v2q15_b = (v2q15) {0x8000, 0x5678};
573   v2q15_c = (v2q15) {0x8000, 0x1111};
574   a64_s = 0x8b877d00;
575   a64_r = __builtin_mips_dpaq_s_w_ph (a64_a, v2q15_b, v2q15_c);
576   if (a64_r != a64_s)
577     abort ();
578
579   a64_a = 0x00001111;
580   v2q15_b = (v2q15) {0x8000, 0x5678};
581   v2q15_c = (v2q15) {0x8000, 0x1111};
582   a64_s = 0xffffffff7478a522LL;
583   a64_r = __builtin_mips_dpsq_s_w_ph (a64_a, v2q15_b, v2q15_c);
584   if (a64_r != a64_s)
585     abort ();
586
587   a64_a = 0x00001111;
588   v2q15_b = (v2q15) {0x8000, 0x5678};
589   v2q15_c = (v2q15) {0x8000, 0x1111};
590   if (little_endian)
591     a64_s = 0xffffffff8b877d02LL;
592   else
593     a64_s = 0x7478a520;
594   a64_r = __builtin_mips_mulsaq_s_w_ph (a64_a, v2q15_b, v2q15_c);
595   if (a64_r != a64_s)
596     abort ();
597
598   a64_a = 0x00001111;
599   q31_b = 0x80000000;
600   q31_c = 0x80000000;
601   a64_s = 0x7fffffffffffffffLL;
602   a64_r = __builtin_mips_dpaq_sa_l_w (a64_a, q31_b, q31_c);
603   if (a64_r != a64_s)
604     abort ();
605
606   a64_a = 0x00001111;
607   q31_b = 0x80000000;
608   q31_c = 0x80000000;
609   a64_s = 0x8000000000001112LL;
610   a64_r = __builtin_mips_dpsq_sa_l_w (a64_a, q31_b, q31_c);
611   if (a64_r != a64_s)
612     abort ();
613
614   a64_a = 0x00001111;
615   v2q15_b = (v2q15) {0x8000, 0x1};
616   v2q15_c = (v2q15) {0x8000, 0x2};
617   if (little_endian)
618     a64_s = 0x1115;
619   else
620     a64_s = 0x80001110;
621   a64_r = __builtin_mips_maq_s_w_phl (a64_a, v2q15_b, v2q15_c);
622   if (a64_r != a64_s)
623     abort ();
624
625   a64_a = 0x00001111;
626   v2q15_b = (v2q15) {0x8000, 0x1};
627   v2q15_c = (v2q15) {0x8000, 0x2};
628   if (little_endian)
629     a64_s = 0x80001110;
630   else
631     a64_s = 0x1115;
632   a64_r = __builtin_mips_maq_s_w_phr (a64_a, v2q15_b, v2q15_c);
633   if (a64_r != a64_s)
634     abort ();
635
636   a64_a = 0x00001111;
637   v2q15_b = (v2q15) {0x8000, 0x1};
638   v2q15_c = (v2q15) {0x8000, 0x2};
639   if (little_endian)
640     a64_s = 0x1115;
641   else
642     a64_s = 0x7fffffff;
643   a64_r = __builtin_mips_maq_sa_w_phl (a64_a, v2q15_b, v2q15_c);
644   if (a64_r != a64_s)
645     abort ();
646
647   a64_a = 0x00001111;
648   v2q15_b = (v2q15) {0x8000, 0x1};
649   v2q15_c = (v2q15) {0x8000, 0x2};
650   if (little_endian)
651     a64_s = 0x7fffffff;
652   else
653     a64_s = 0x1115;
654   a64_r = __builtin_mips_maq_sa_w_phr (a64_a, v2q15_b, v2q15_c);
655   if (a64_r != a64_s)
656     abort ();
657 #endif
658
659   i32_a = 0x12345678;
660   i32_s = 0x00001e6a;
661   i32_r = __builtin_mips_bitrev (i32_a);
662   if (i32_r != i32_s)
663     abort ();
664
665   i32_a = 0x00000208; // pos is 8, size is 4
666   __builtin_mips_wrdsp (i32_a, 31);
667   i32_a = 0x12345678;
668   i32_b = 0x87654321;
669   i32_s = 0x12345178;
670   i32_r = __builtin_mips_insv (i32_a, i32_b);
671   if (i32_r != i32_s)
672     abort ();
673
674   v4i8_s = (v4i8) {1, 1, 1, 1};
675   v4i8_r = __builtin_mips_repl_qb (1);
676   r = (int) v4i8_r;
677   s = (int) v4i8_s;
678   if (r != s)
679     abort ();
680
681   i32_a = 99;
682   v4i8_s = (v4i8) {99, 99, 99, 99};
683   v4i8_r = __builtin_mips_repl_qb (i32_a);
684   r = (int) v4i8_r;
685   s = (int) v4i8_s;
686   if (r != s)
687     abort ();
688
689   v2q15_s = (v2q15) {30, 30};
690   v2q15_r = __builtin_mips_repl_ph (30);
691   r = (int) v2q15_r;
692   s = (int) v2q15_s;
693   if (r != s)
694     abort ();
695
696   i32_a = 0x5612;
697   v2q15_s = (v2q15) {0x5612, 0x5612};
698   v2q15_r = __builtin_mips_repl_ph (i32_a);
699   r = (int) v2q15_r;
700   s = (int) v2q15_s;
701   if (r != s)
702     abort ();
703
704   v4i8_a = (v4i8) {0x12, 0x34, 0x56, 0x78};
705   v4i8_b = (v4i8) {0x12, 0x34, 0x78, 0x56};
706   if (little_endian)
707     i32_s = 0x03000000;
708   else
709     i32_s = 0x0c000000;
710   __builtin_mips_cmpu_eq_qb (v4i8_a, v4i8_b);
711   i32_r = __builtin_mips_rddsp (16);
712   if (i32_r != i32_s)
713     abort ();
714
715   v4i8_a = (v4i8) {0x12, 0x34, 0x56, 0x78};
716   v4i8_b = (v4i8) {0x12, 0x34, 0x78, 0x56};
717   if (little_endian)
718     i32_s = 0x04000000;
719   else
720     i32_s = 0x02000000;
721   __builtin_mips_cmpu_lt_qb (v4i8_a, v4i8_b);
722   i32_r = __builtin_mips_rddsp (16);
723   if (i32_r != i32_s)
724     abort ();
725
726   v4i8_a = (v4i8) {0x12, 0x34, 0x56, 0x78};
727   v4i8_b = (v4i8) {0x12, 0x34, 0x78, 0x56};
728   if (little_endian)
729     i32_s = 0x07000000;
730   else
731     i32_s = 0x0e000000;
732   __builtin_mips_cmpu_le_qb (v4i8_a, v4i8_b);
733   i32_r = __builtin_mips_rddsp (16);
734   if (i32_r != i32_s)
735     abort ();
736
737   v4i8_a = (v4i8) {0x12, 0x34, 0x56, 0x78};
738   v4i8_b = (v4i8) {0x12, 0x34, 0x78, 0x56};
739   if (little_endian)
740     i32_s = 0x3;
741   else
742     i32_s = 0xc;
743   i32_r=__builtin_mips_cmpgu_eq_qb (v4i8_a, v4i8_b);
744   if (i32_r != i32_s)
745     abort ();
746
747   v4i8_a = (v4i8) {0x12, 0x34, 0x56, 0x78};
748   v4i8_b = (v4i8) {0x12, 0x34, 0x78, 0x56};
749   if (little_endian)
750     i32_s = 0x4;
751   else
752     i32_s = 0x2;
753   i32_r = __builtin_mips_cmpgu_lt_qb (v4i8_a, v4i8_b);
754   if (i32_r != i32_s)
755     abort ();
756
757   v4i8_a = (v4i8) {0x12, 0x34, 0x56, 0x78};
758   v4i8_b = (v4i8) {0x12, 0x34, 0x78, 0x56};
759   if (little_endian)
760     i32_s = 0x7;
761   else
762     i32_s = 0xe;
763   i32_r = __builtin_mips_cmpgu_le_qb (v4i8_a, v4i8_b);
764   if (i32_r != i32_s)
765     abort ();
766
767   __builtin_mips_wrdsp (0,31); // Clear all condition code bits.
768   v2q15_a = (v2q15) {0x1234, 0x5678};
769   v2q15_b = (v2q15) {0x1234, 0x7856};
770   if (little_endian)
771     i32_s = 0x01000000;
772   else
773     i32_s = 0x02000000;
774   __builtin_mips_cmp_eq_ph (v2q15_a, v2q15_b);
775   i32_r = __builtin_mips_rddsp (16);
776   if (i32_r != i32_s)
777     abort ();
778
779   v2q15_a = (v2q15) {0x1234, 0x5678};
780   v2q15_b = (v2q15) {0x1234, 0x7856};
781   if (little_endian)
782     i32_s = 0x02000000;
783   else
784     i32_s = 0x01000000;
785   __builtin_mips_cmp_lt_ph (v2q15_a, v2q15_b);
786   i32_r = __builtin_mips_rddsp (16);
787   if (i32_r != i32_s)
788     abort ();
789
790   v2q15_a = (v2q15) {0x1234, 0x5678};
791   v2q15_b = (v2q15) {0x1234, 0x7856};
792   i32_s = 0x03000000;
793   __builtin_mips_cmp_le_ph (v2q15_a, v2q15_b);
794   i32_r = __builtin_mips_rddsp (16);
795   if (i32_r != i32_s)
796     abort ();
797
798   i32_a = 0x0a000000; // cc: 0000 1010
799   __builtin_mips_wrdsp (i32_a, 31);
800   v4i8_a = (v4i8) {0x12, 0x34, 0x56, 0x78};
801   v4i8_b = (v4i8) {0x21, 0x43, 0x65, 0x87};
802   if (little_endian)
803     v4i8_s = (v4i8) {0x21, 0x34, 0x65, 0x78};
804   else
805     v4i8_s = (v4i8) {0x12, 0x43, 0x56, 0x87};
806   v4i8_r = __builtin_mips_pick_qb (v4i8_a, v4i8_b);
807   r = (int) v4i8_r;
808   s = (int) v4i8_s;
809   if (r != s)
810     abort ();
811
812   i32_a = 0x02000000; // cc: 0000 0010
813   __builtin_mips_wrdsp (i32_a, 31);
814   v2q15_a = (v2q15) {0x1234, 0x5678};
815   v2q15_b = (v2q15) {0x2143, 0x6587};
816   if (little_endian)
817     v2q15_s = (v2q15) {0x2143, 0x5678};
818   else
819     v2q15_s = (v2q15) {0x1234, 0x6587};
820   v2q15_r = __builtin_mips_pick_ph (v2q15_a, v2q15_b);
821   r = (int) v2q15_r;
822   s = (int) v2q15_s;
823   if (r != s)
824     abort ();
825
826   v2q15_a = (v2q15) {0x1234, 0x5678};
827   v2q15_b = (v2q15) {0x1234, 0x7856};
828   if (little_endian)
829     v2q15_s = (v2q15) {0x7856, 0x1234};
830   else
831     v2q15_s = (v2q15) {0x5678, 0x1234};
832   v2q15_r = __builtin_mips_packrl_ph (v2q15_a, v2q15_b);
833   r = (int) v2q15_r;
834   s = (int) v2q15_s;
835   if (r != s)
836     abort ();
837
838 #ifndef __mips64
839   a64_a = 0x1234567887654321LL;
840   i32_s = 0x88765432;
841   i32_r = __builtin_mips_extr_w (a64_a, 4);
842   if (i32_r != i32_s)
843     abort ();
844
845   a64_a = 0x1234567887658321LL;
846   i32_s = 0x56788766;
847   i32_r = __builtin_mips_extr_r_w (a64_a, 16);
848   if (i32_r != i32_s)
849     abort ();
850
851   a64_a = 0x12345677fffffff8LL;
852   i32_s = 0x7fffffff;
853   i32_r = __builtin_mips_extr_rs_w (a64_a, 4);
854   if (i32_r != i32_s)
855     abort ();
856
857   a64_a = 0x1234567887658321LL;
858   i32_s = 0x7fff;
859   i32_r = __builtin_mips_extr_s_h (a64_a, 16);
860   if (i32_r != i32_s)
861     abort ();
862
863   a64_a = 0x0000007887658321LL;
864   i32_b = 24;
865   i32_s = 0x7887;
866   i32_r = __builtin_mips_extr_s_h (a64_a, i32_b);
867   if (i32_r != i32_s)
868     abort ();
869
870   a64_a = 0x1234567887654321LL;
871   i32_b = 4;
872   i32_s = 0x88765432;
873   i32_r = __builtin_mips_extr_w (a64_a, i32_b);
874   if (i32_r != i32_s)
875     abort ();
876
877   a64_a = 0x1234567887658321LL;
878   i32_b = 16;
879   i32_s = 0x56788766;
880   i32_r = __builtin_mips_extr_r_w (a64_a, i32_b);
881   if (i32_r != i32_s)
882     abort ();
883
884   a64_a = 0x12345677fffffff8LL;
885   i32_b = 4;
886   i32_s = 0x7fffffff;
887   i32_r = __builtin_mips_extr_rs_w (a64_a, i32_b);
888   if (i32_r != i32_s)
889     abort ();
890
891   i32_a = 0x0000021f; // pos is 31
892   __builtin_mips_wrdsp (i32_a, 31);
893   a64_a = 0x1234567887654321LL;
894   i32_s = 8;
895   i32_r = __builtin_mips_extp (a64_a, 3); // extract 4 bits
896   if (i32_r != i32_s)
897     abort ();
898
899   i32_a = 0x0000021f; // pos is 31
900   __builtin_mips_wrdsp (i32_a, 31);
901   a64_a = 0x1234567887654321LL;
902   i32_b = 7; // size is 8. NOTE!! we should use 7
903   i32_s = 0x87;
904   i32_r = __builtin_mips_extp (a64_a, i32_b);
905   if (i32_r != i32_s)
906     abort ();
907
908   i32_a = 0x0000021f; // pos is 31
909   __builtin_mips_wrdsp (i32_a, 31);
910   a64_a = 0x1234567887654321LL;
911   i32_s = 8;
912   i32_r = __builtin_mips_extpdp (a64_a, 3); // extract 4 bits
913   if (i32_r != i32_s)
914     abort ();
915
916   i32_s = 0x0000021b; // pos is 27
917   i32_r = __builtin_mips_rddsp (31);
918   if (i32_r != i32_s)
919     abort ();
920
921   i32_a = 0x0000021f; // pos is 31
922   __builtin_mips_wrdsp (i32_a, 31);
923   a64_a = 0x1234567887654321LL;
924   i32_b = 11; // size is 12. NOTE!!! We should use 11
925   i32_s = 0x876;
926   i32_r = __builtin_mips_extpdp (a64_a, i32_b);
927   if (i32_r != i32_s)
928     abort ();
929
930   i32_s = 0x00000213; // pos is 19
931   i32_r = __builtin_mips_rddsp (31);
932   if (i32_r != i32_s)
933     abort ();
934
935   a64_a = 0x1234567887654321LL;
936   a64_s = 0x0012345678876543LL;
937   a64_r = __builtin_mips_shilo (a64_a, 8);
938   if (a64_r != a64_s)
939     abort ();
940
941   a64_a = 0x1234567887654321LL;
942   i32_b = -16;
943   a64_s = 0x5678876543210000LL;
944   a64_r = __builtin_mips_shilo (a64_a, i32_b);
945   if (a64_r != a64_s)
946     abort ();
947
948   i32_a = 0x0;
949   __builtin_mips_wrdsp (i32_a, 31);
950   a64_a = 0x1234567887654321LL;
951   i32_b = 0x11112222;
952   a64_s = 0x8765432111112222LL;
953   a64_r = __builtin_mips_mthlip (a64_a, i32_b);
954   if (a64_r != a64_s)
955     abort ();
956   i32_s = 32;
957   i32_r = __builtin_mips_rddsp (31);
958   if (i32_r != i32_s)
959     abort ();
960 #endif
961
962   i32_a = 0x1357a468;
963   __builtin_mips_wrdsp (i32_a, 63);
964   i32_s = 0x03572428;
965   i32_r = __builtin_mips_rddsp (63);
966   if (i32_r != i32_s)
967     abort ();
968
969   ptr_a = &array;
970   i32_b = 37;
971   i32_s = 37;
972   i32_r = __builtin_mips_lbux (ptr_a, i32_b);
973   if (i32_r != i32_s)
974     abort ();
975
976   ptr_a = &array;
977   i32_b = 38;
978   if (little_endian)
979     i32_s = 0x2726;
980   else
981     i32_s = 0x2627;
982   i32_r = __builtin_mips_lhx (ptr_a, i32_b);
983   if (i32_r != i32_s)
984     abort ();
985
986   ptr_a = &array;
987   i32_b = 40;
988   if (little_endian)
989     i32_s = 0x2b2a2928;
990   else
991     i32_s = 0x28292a2b;
992   i32_r = __builtin_mips_lwx (ptr_a, i32_b);
993   if (i32_r != i32_s)
994     abort ();
995
996   i32_a = 0x00000220; // pos is 32, size is 4
997   __builtin_mips_wrdsp (i32_a, 63);
998   i32_s = 1;
999   i32_r = __builtin_mips_bposge32 ();
1000   if (i32_r != i32_s)
1001     abort ();
1002
1003 #ifndef __mips64
1004   a64_a = 0x12345678;
1005   i32_b = 0x80000000;
1006   i32_c = 0x11112222;
1007   a64_s = 0xF7776EEF12345678LL;
1008   a64_r = __builtin_mips_madd (a64_a, i32_b, i32_c);
1009   if (a64_r != a64_s)
1010     abort ();
1011 #endif
1012
1013 #ifndef __mips64
1014   a64_a = 0x12345678;
1015   ui32_b = 0x80000000;
1016   ui32_c = 0x11112222;
1017   a64_s = 0x0888911112345678LL;
1018   a64_r = __builtin_mips_maddu (a64_a, ui32_b, ui32_c);
1019   if (a64_r != a64_s)
1020     abort ();
1021 #endif
1022
1023 #ifndef __mips64
1024   a64_a = 0x12345678;
1025   i32_b = 0x80000000;
1026   i32_c = 0x11112222;
1027   a64_s = 0x0888911112345678LL;
1028   a64_r = __builtin_mips_msub (a64_a, i32_b, i32_c);
1029   if (a64_r != a64_s)
1030     abort ();
1031 #endif
1032
1033 #ifndef __mips64
1034   a64_a = 0x12345678;
1035   ui32_b = 0x80000000;
1036   ui32_c = 0x11112222;
1037   a64_s = 0xF7776EEF12345678LL;
1038   a64_r = __builtin_mips_msubu (a64_a, ui32_b, ui32_c);
1039   if (a64_r != a64_s)
1040     abort ();
1041 #endif
1042
1043 #ifndef __mips64
1044   i32_a = 0x80000000;
1045   i32_b = 0x11112222;
1046   a64_s = 0xF7776EEF00000000LL;
1047   a64_r = __builtin_mips_mult (i32_a, i32_b);
1048   if (a64_r != a64_s)
1049     abort ();
1050 #endif
1051
1052 #ifndef __mips64
1053   ui32_a = 0x80000000;
1054   ui32_b = 0x11112222;
1055   a64_s = 0x888911100000000LL;
1056   a64_r = __builtin_mips_multu (ui32_a, ui32_b);
1057   if (a64_r != a64_s)
1058     abort ();
1059 #endif
1060 }
1061