[gcc]
[official-gcc.git] / gcc / testsuite / gcc.target / powerpc / pr65849-2.c
blob83f8b8e52a27fe2a8f9132ab45d2c6d70fe1037c
1 /* { dg-do compile { target { powerpc*-*-* } } } */
2 /* { dg-require-effective-target powerpc_p8vector_ok } */
3 /* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
4 /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
5 /* { dg-options "-mcpu=power8 -O2 -mno-upper-regs-sf" } */
7 /* Test whether we can enable the -mupper-regs-sf with target pragmas. Make
8 sure float values are allocated to the Altivec registers as well as the
9 traditional FPR registers. */
11 #ifndef TYPE
12 #define TYPE float
13 #endif
15 #ifndef MASK_TYPE
16 #define MASK_TYPE unsigned long long
17 #endif
19 #define MASK_ONE ((MASK_TYPE)1)
20 #define ZERO ((TYPE) 0.0)
22 #pragma GCC target ("upper-regs-sf")
23 TYPE
24 test_add (const MASK_TYPE *add_mask, const TYPE *add_values,
25 const MASK_TYPE *sub_mask, const TYPE *sub_values,
26 const MASK_TYPE *mul_mask, const TYPE *mul_values,
27 const MASK_TYPE *div_mask, const TYPE *div_values,
28 const MASK_TYPE *eq0_mask, int *eq0_ptr)
30 TYPE value;
31 TYPE value00 = ZERO;
32 TYPE value01 = ZERO;
33 TYPE value02 = ZERO;
34 TYPE value03 = ZERO;
35 TYPE value04 = ZERO;
36 TYPE value05 = ZERO;
37 TYPE value06 = ZERO;
38 TYPE value07 = ZERO;
39 TYPE value08 = ZERO;
40 TYPE value09 = ZERO;
41 TYPE value10 = ZERO;
42 TYPE value11 = ZERO;
43 TYPE value12 = ZERO;
44 TYPE value13 = ZERO;
45 TYPE value14 = ZERO;
46 TYPE value15 = ZERO;
47 TYPE value16 = ZERO;
48 TYPE value17 = ZERO;
49 TYPE value18 = ZERO;
50 TYPE value19 = ZERO;
51 TYPE value20 = ZERO;
52 TYPE value21 = ZERO;
53 TYPE value22 = ZERO;
54 TYPE value23 = ZERO;
55 TYPE value24 = ZERO;
56 TYPE value25 = ZERO;
57 TYPE value26 = ZERO;
58 TYPE value27 = ZERO;
59 TYPE value28 = ZERO;
60 TYPE value29 = ZERO;
61 TYPE value30 = ZERO;
62 TYPE value31 = ZERO;
63 TYPE value32 = ZERO;
64 TYPE value33 = ZERO;
65 TYPE value34 = ZERO;
66 TYPE value35 = ZERO;
67 TYPE value36 = ZERO;
68 TYPE value37 = ZERO;
69 TYPE value38 = ZERO;
70 TYPE value39 = ZERO;
71 MASK_TYPE mask;
72 int eq0;
74 while ((mask = *add_mask++) != 0)
76 value = *add_values++;
78 __asm__ (" #reg %0" : "+d" (value));
80 if ((mask & (MASK_ONE << 0)) != 0)
81 value00 += value;
83 if ((mask & (MASK_ONE << 1)) != 0)
84 value01 += value;
86 if ((mask & (MASK_ONE << 2)) != 0)
87 value02 += value;
89 if ((mask & (MASK_ONE << 3)) != 0)
90 value03 += value;
92 if ((mask & (MASK_ONE << 4)) != 0)
93 value04 += value;
95 if ((mask & (MASK_ONE << 5)) != 0)
96 value05 += value;
98 if ((mask & (MASK_ONE << 6)) != 0)
99 value06 += value;
101 if ((mask & (MASK_ONE << 7)) != 0)
102 value07 += value;
104 if ((mask & (MASK_ONE << 8)) != 0)
105 value08 += value;
107 if ((mask & (MASK_ONE << 9)) != 0)
108 value09 += value;
110 if ((mask & (MASK_ONE << 10)) != 0)
111 value10 += value;
113 if ((mask & (MASK_ONE << 11)) != 0)
114 value11 += value;
116 if ((mask & (MASK_ONE << 12)) != 0)
117 value12 += value;
119 if ((mask & (MASK_ONE << 13)) != 0)
120 value13 += value;
122 if ((mask & (MASK_ONE << 14)) != 0)
123 value14 += value;
125 if ((mask & (MASK_ONE << 15)) != 0)
126 value15 += value;
128 if ((mask & (MASK_ONE << 16)) != 0)
129 value16 += value;
131 if ((mask & (MASK_ONE << 17)) != 0)
132 value17 += value;
134 if ((mask & (MASK_ONE << 18)) != 0)
135 value18 += value;
137 if ((mask & (MASK_ONE << 19)) != 0)
138 value19 += value;
140 if ((mask & (MASK_ONE << 20)) != 0)
141 value20 += value;
143 if ((mask & (MASK_ONE << 21)) != 0)
144 value21 += value;
146 if ((mask & (MASK_ONE << 22)) != 0)
147 value22 += value;
149 if ((mask & (MASK_ONE << 23)) != 0)
150 value23 += value;
152 if ((mask & (MASK_ONE << 24)) != 0)
153 value24 += value;
155 if ((mask & (MASK_ONE << 25)) != 0)
156 value25 += value;
158 if ((mask & (MASK_ONE << 26)) != 0)
159 value26 += value;
161 if ((mask & (MASK_ONE << 27)) != 0)
162 value27 += value;
164 if ((mask & (MASK_ONE << 28)) != 0)
165 value28 += value;
167 if ((mask & (MASK_ONE << 29)) != 0)
168 value29 += value;
170 if ((mask & (MASK_ONE << 30)) != 0)
171 value30 += value;
173 if ((mask & (MASK_ONE << 31)) != 0)
174 value31 += value;
176 if ((mask & (MASK_ONE << 32)) != 0)
177 value32 += value;
179 if ((mask & (MASK_ONE << 33)) != 0)
180 value33 += value;
182 if ((mask & (MASK_ONE << 34)) != 0)
183 value34 += value;
185 if ((mask & (MASK_ONE << 35)) != 0)
186 value35 += value;
188 if ((mask & (MASK_ONE << 36)) != 0)
189 value36 += value;
191 if ((mask & (MASK_ONE << 37)) != 0)
192 value37 += value;
194 if ((mask & (MASK_ONE << 38)) != 0)
195 value38 += value;
197 if ((mask & (MASK_ONE << 39)) != 0)
198 value39 += value;
201 while ((mask = *sub_mask++) != 0)
203 value = *sub_values++;
205 __asm__ (" #reg %0" : "+d" (value));
207 if ((mask & (MASK_ONE << 0)) != 0)
208 value00 -= value;
210 if ((mask & (MASK_ONE << 1)) != 0)
211 value01 -= value;
213 if ((mask & (MASK_ONE << 2)) != 0)
214 value02 -= value;
216 if ((mask & (MASK_ONE << 3)) != 0)
217 value03 -= value;
219 if ((mask & (MASK_ONE << 4)) != 0)
220 value04 -= value;
222 if ((mask & (MASK_ONE << 5)) != 0)
223 value05 -= value;
225 if ((mask & (MASK_ONE << 6)) != 0)
226 value06 -= value;
228 if ((mask & (MASK_ONE << 7)) != 0)
229 value07 -= value;
231 if ((mask & (MASK_ONE << 8)) != 0)
232 value08 -= value;
234 if ((mask & (MASK_ONE << 9)) != 0)
235 value09 -= value;
237 if ((mask & (MASK_ONE << 10)) != 0)
238 value10 -= value;
240 if ((mask & (MASK_ONE << 11)) != 0)
241 value11 -= value;
243 if ((mask & (MASK_ONE << 12)) != 0)
244 value12 -= value;
246 if ((mask & (MASK_ONE << 13)) != 0)
247 value13 -= value;
249 if ((mask & (MASK_ONE << 14)) != 0)
250 value14 -= value;
252 if ((mask & (MASK_ONE << 15)) != 0)
253 value15 -= value;
255 if ((mask & (MASK_ONE << 16)) != 0)
256 value16 -= value;
258 if ((mask & (MASK_ONE << 17)) != 0)
259 value17 -= value;
261 if ((mask & (MASK_ONE << 18)) != 0)
262 value18 -= value;
264 if ((mask & (MASK_ONE << 19)) != 0)
265 value19 -= value;
267 if ((mask & (MASK_ONE << 20)) != 0)
268 value20 -= value;
270 if ((mask & (MASK_ONE << 21)) != 0)
271 value21 -= value;
273 if ((mask & (MASK_ONE << 22)) != 0)
274 value22 -= value;
276 if ((mask & (MASK_ONE << 23)) != 0)
277 value23 -= value;
279 if ((mask & (MASK_ONE << 24)) != 0)
280 value24 -= value;
282 if ((mask & (MASK_ONE << 25)) != 0)
283 value25 -= value;
285 if ((mask & (MASK_ONE << 26)) != 0)
286 value26 -= value;
288 if ((mask & (MASK_ONE << 27)) != 0)
289 value27 -= value;
291 if ((mask & (MASK_ONE << 28)) != 0)
292 value28 -= value;
294 if ((mask & (MASK_ONE << 29)) != 0)
295 value29 -= value;
297 if ((mask & (MASK_ONE << 30)) != 0)
298 value30 -= value;
300 if ((mask & (MASK_ONE << 31)) != 0)
301 value31 -= value;
303 if ((mask & (MASK_ONE << 32)) != 0)
304 value32 -= value;
306 if ((mask & (MASK_ONE << 33)) != 0)
307 value33 -= value;
309 if ((mask & (MASK_ONE << 34)) != 0)
310 value34 -= value;
312 if ((mask & (MASK_ONE << 35)) != 0)
313 value35 -= value;
315 if ((mask & (MASK_ONE << 36)) != 0)
316 value36 -= value;
318 if ((mask & (MASK_ONE << 37)) != 0)
319 value37 -= value;
321 if ((mask & (MASK_ONE << 38)) != 0)
322 value38 -= value;
324 if ((mask & (MASK_ONE << 39)) != 0)
325 value39 -= value;
328 while ((mask = *mul_mask++) != 0)
330 value = *mul_values++;
332 __asm__ (" #reg %0" : "+d" (value));
334 if ((mask & (MASK_ONE << 0)) != 0)
335 value00 *= value;
337 if ((mask & (MASK_ONE << 1)) != 0)
338 value01 *= value;
340 if ((mask & (MASK_ONE << 2)) != 0)
341 value02 *= value;
343 if ((mask & (MASK_ONE << 3)) != 0)
344 value03 *= value;
346 if ((mask & (MASK_ONE << 4)) != 0)
347 value04 *= value;
349 if ((mask & (MASK_ONE << 5)) != 0)
350 value05 *= value;
352 if ((mask & (MASK_ONE << 6)) != 0)
353 value06 *= value;
355 if ((mask & (MASK_ONE << 7)) != 0)
356 value07 *= value;
358 if ((mask & (MASK_ONE << 8)) != 0)
359 value08 *= value;
361 if ((mask & (MASK_ONE << 9)) != 0)
362 value09 *= value;
364 if ((mask & (MASK_ONE << 10)) != 0)
365 value10 *= value;
367 if ((mask & (MASK_ONE << 11)) != 0)
368 value11 *= value;
370 if ((mask & (MASK_ONE << 12)) != 0)
371 value12 *= value;
373 if ((mask & (MASK_ONE << 13)) != 0)
374 value13 *= value;
376 if ((mask & (MASK_ONE << 14)) != 0)
377 value14 *= value;
379 if ((mask & (MASK_ONE << 15)) != 0)
380 value15 *= value;
382 if ((mask & (MASK_ONE << 16)) != 0)
383 value16 *= value;
385 if ((mask & (MASK_ONE << 17)) != 0)
386 value17 *= value;
388 if ((mask & (MASK_ONE << 18)) != 0)
389 value18 *= value;
391 if ((mask & (MASK_ONE << 19)) != 0)
392 value19 *= value;
394 if ((mask & (MASK_ONE << 20)) != 0)
395 value20 *= value;
397 if ((mask & (MASK_ONE << 21)) != 0)
398 value21 *= value;
400 if ((mask & (MASK_ONE << 22)) != 0)
401 value22 *= value;
403 if ((mask & (MASK_ONE << 23)) != 0)
404 value23 *= value;
406 if ((mask & (MASK_ONE << 24)) != 0)
407 value24 *= value;
409 if ((mask & (MASK_ONE << 25)) != 0)
410 value25 *= value;
412 if ((mask & (MASK_ONE << 26)) != 0)
413 value26 *= value;
415 if ((mask & (MASK_ONE << 27)) != 0)
416 value27 *= value;
418 if ((mask & (MASK_ONE << 28)) != 0)
419 value28 *= value;
421 if ((mask & (MASK_ONE << 29)) != 0)
422 value29 *= value;
424 if ((mask & (MASK_ONE << 30)) != 0)
425 value30 *= value;
427 if ((mask & (MASK_ONE << 31)) != 0)
428 value31 *= value;
430 if ((mask & (MASK_ONE << 32)) != 0)
431 value32 *= value;
433 if ((mask & (MASK_ONE << 33)) != 0)
434 value33 *= value;
436 if ((mask & (MASK_ONE << 34)) != 0)
437 value34 *= value;
439 if ((mask & (MASK_ONE << 35)) != 0)
440 value35 *= value;
442 if ((mask & (MASK_ONE << 36)) != 0)
443 value36 *= value;
445 if ((mask & (MASK_ONE << 37)) != 0)
446 value37 *= value;
448 if ((mask & (MASK_ONE << 38)) != 0)
449 value38 *= value;
451 if ((mask & (MASK_ONE << 39)) != 0)
452 value39 *= value;
455 while ((mask = *div_mask++) != 0)
457 value = *div_values++;
459 __asm__ (" #reg %0" : "+d" (value));
461 if ((mask & (MASK_ONE << 0)) != 0)
462 value00 /= value;
464 if ((mask & (MASK_ONE << 1)) != 0)
465 value01 /= value;
467 if ((mask & (MASK_ONE << 2)) != 0)
468 value02 /= value;
470 if ((mask & (MASK_ONE << 3)) != 0)
471 value03 /= value;
473 if ((mask & (MASK_ONE << 4)) != 0)
474 value04 /= value;
476 if ((mask & (MASK_ONE << 5)) != 0)
477 value05 /= value;
479 if ((mask & (MASK_ONE << 6)) != 0)
480 value06 /= value;
482 if ((mask & (MASK_ONE << 7)) != 0)
483 value07 /= value;
485 if ((mask & (MASK_ONE << 8)) != 0)
486 value08 /= value;
488 if ((mask & (MASK_ONE << 9)) != 0)
489 value09 /= value;
491 if ((mask & (MASK_ONE << 10)) != 0)
492 value10 /= value;
494 if ((mask & (MASK_ONE << 11)) != 0)
495 value11 /= value;
497 if ((mask & (MASK_ONE << 12)) != 0)
498 value12 /= value;
500 if ((mask & (MASK_ONE << 13)) != 0)
501 value13 /= value;
503 if ((mask & (MASK_ONE << 14)) != 0)
504 value14 /= value;
506 if ((mask & (MASK_ONE << 15)) != 0)
507 value15 /= value;
509 if ((mask & (MASK_ONE << 16)) != 0)
510 value16 /= value;
512 if ((mask & (MASK_ONE << 17)) != 0)
513 value17 /= value;
515 if ((mask & (MASK_ONE << 18)) != 0)
516 value18 /= value;
518 if ((mask & (MASK_ONE << 19)) != 0)
519 value19 /= value;
521 if ((mask & (MASK_ONE << 20)) != 0)
522 value20 /= value;
524 if ((mask & (MASK_ONE << 21)) != 0)
525 value21 /= value;
527 if ((mask & (MASK_ONE << 22)) != 0)
528 value22 /= value;
530 if ((mask & (MASK_ONE << 23)) != 0)
531 value23 /= value;
533 if ((mask & (MASK_ONE << 24)) != 0)
534 value24 /= value;
536 if ((mask & (MASK_ONE << 25)) != 0)
537 value25 /= value;
539 if ((mask & (MASK_ONE << 26)) != 0)
540 value26 /= value;
542 if ((mask & (MASK_ONE << 27)) != 0)
543 value27 /= value;
545 if ((mask & (MASK_ONE << 28)) != 0)
546 value28 /= value;
548 if ((mask & (MASK_ONE << 29)) != 0)
549 value29 /= value;
551 if ((mask & (MASK_ONE << 30)) != 0)
552 value30 /= value;
554 if ((mask & (MASK_ONE << 31)) != 0)
555 value31 /= value;
557 if ((mask & (MASK_ONE << 32)) != 0)
558 value32 /= value;
560 if ((mask & (MASK_ONE << 33)) != 0)
561 value33 /= value;
563 if ((mask & (MASK_ONE << 34)) != 0)
564 value34 /= value;
566 if ((mask & (MASK_ONE << 35)) != 0)
567 value35 /= value;
569 if ((mask & (MASK_ONE << 36)) != 0)
570 value36 /= value;
572 if ((mask & (MASK_ONE << 37)) != 0)
573 value37 /= value;
575 if ((mask & (MASK_ONE << 38)) != 0)
576 value38 /= value;
578 if ((mask & (MASK_ONE << 39)) != 0)
579 value39 /= value;
582 while ((mask = *eq0_mask++) != 0)
584 eq0 = 0;
586 if ((mask & (MASK_ONE << 0)) != 0)
587 eq0 |= (value00 == ZERO);
589 if ((mask & (MASK_ONE << 1)) != 0)
590 eq0 |= (value01 == ZERO);
592 if ((mask & (MASK_ONE << 2)) != 0)
593 eq0 |= (value02 == ZERO);
595 if ((mask & (MASK_ONE << 3)) != 0)
596 eq0 |= (value03 == ZERO);
598 if ((mask & (MASK_ONE << 4)) != 0)
599 eq0 |= (value04 == ZERO);
601 if ((mask & (MASK_ONE << 5)) != 0)
602 eq0 |= (value05 == ZERO);
604 if ((mask & (MASK_ONE << 6)) != 0)
605 eq0 |= (value06 == ZERO);
607 if ((mask & (MASK_ONE << 7)) != 0)
608 eq0 |= (value07 == ZERO);
610 if ((mask & (MASK_ONE << 8)) != 0)
611 eq0 |= (value08 == ZERO);
613 if ((mask & (MASK_ONE << 9)) != 0)
614 eq0 |= (value09 == ZERO);
616 if ((mask & (MASK_ONE << 10)) != 0)
617 eq0 |= (value10 == ZERO);
619 if ((mask & (MASK_ONE << 11)) != 0)
620 eq0 |= (value11 == ZERO);
622 if ((mask & (MASK_ONE << 12)) != 0)
623 eq0 |= (value12 == ZERO);
625 if ((mask & (MASK_ONE << 13)) != 0)
626 eq0 |= (value13 == ZERO);
628 if ((mask & (MASK_ONE << 14)) != 0)
629 eq0 |= (value14 == ZERO);
631 if ((mask & (MASK_ONE << 15)) != 0)
632 eq0 |= (value15 == ZERO);
634 if ((mask & (MASK_ONE << 16)) != 0)
635 eq0 |= (value16 == ZERO);
637 if ((mask & (MASK_ONE << 17)) != 0)
638 eq0 |= (value17 == ZERO);
640 if ((mask & (MASK_ONE << 18)) != 0)
641 eq0 |= (value18 == ZERO);
643 if ((mask & (MASK_ONE << 19)) != 0)
644 eq0 |= (value19 == ZERO);
646 if ((mask & (MASK_ONE << 20)) != 0)
647 eq0 |= (value20 == ZERO);
649 if ((mask & (MASK_ONE << 21)) != 0)
650 eq0 |= (value21 == ZERO);
652 if ((mask & (MASK_ONE << 22)) != 0)
653 eq0 |= (value22 == ZERO);
655 if ((mask & (MASK_ONE << 23)) != 0)
656 eq0 |= (value23 == ZERO);
658 if ((mask & (MASK_ONE << 24)) != 0)
659 eq0 |= (value24 == ZERO);
661 if ((mask & (MASK_ONE << 25)) != 0)
662 eq0 |= (value25 == ZERO);
664 if ((mask & (MASK_ONE << 26)) != 0)
665 eq0 |= (value26 == ZERO);
667 if ((mask & (MASK_ONE << 27)) != 0)
668 eq0 |= (value27 == ZERO);
670 if ((mask & (MASK_ONE << 28)) != 0)
671 eq0 |= (value28 == ZERO);
673 if ((mask & (MASK_ONE << 29)) != 0)
674 eq0 |= (value29 == ZERO);
676 if ((mask & (MASK_ONE << 30)) != 0)
677 eq0 |= (value30 == ZERO);
679 if ((mask & (MASK_ONE << 31)) != 0)
680 eq0 |= (value31 == ZERO);
682 if ((mask & (MASK_ONE << 32)) != 0)
683 eq0 |= (value32 == ZERO);
685 if ((mask & (MASK_ONE << 33)) != 0)
686 eq0 |= (value33 == ZERO);
688 if ((mask & (MASK_ONE << 34)) != 0)
689 eq0 |= (value34 == ZERO);
691 if ((mask & (MASK_ONE << 35)) != 0)
692 eq0 |= (value35 == ZERO);
694 if ((mask & (MASK_ONE << 36)) != 0)
695 eq0 |= (value36 == ZERO);
697 if ((mask & (MASK_ONE << 37)) != 0)
698 eq0 |= (value37 == ZERO);
700 if ((mask & (MASK_ONE << 38)) != 0)
701 eq0 |= (value38 == ZERO);
703 if ((mask & (MASK_ONE << 39)) != 0)
704 eq0 |= (value39 == ZERO);
706 *eq0_ptr++ = eq0;
709 return ( value00 + value01 + value02 + value03 + value04
710 + value05 + value06 + value07 + value08 + value09
711 + value10 + value11 + value12 + value13 + value14
712 + value15 + value16 + value17 + value18 + value19
713 + value20 + value21 + value22 + value23 + value24
714 + value25 + value26 + value27 + value28 + value29
715 + value30 + value31 + value32 + value33 + value34
716 + value35 + value36 + value37 + value38 + value39);
719 /* { dg-final { scan-assembler "fadds" } } */
720 /* { dg-final { scan-assembler "fsubs" } } */
721 /* { dg-final { scan-assembler "fmuls" } } */
722 /* { dg-final { scan-assembler "fdivs" } } */
723 /* { dg-final { scan-assembler "fcmpu" } } */
724 /* { dg-final { scan-assembler "xsaddsp" } } */
725 /* { dg-final { scan-assembler "xssubsp" } } */
726 /* { dg-final { scan-assembler "xsmulsp" } } */
727 /* { dg-final { scan-assembler "xsdivsp" } } */
728 /* { dg-final { scan-assembler "xscmpudp" } } */