1 /* { dg-do compile { target { powerpc*-*-* } } } */
2 /* { dg-require-effective-target powerpc_vsx_ok } */
3 /* { dg-skip-if "" { powerpc*-*-darwin* } } */
4 /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
5 /* { dg-options "-mcpu=power7 -O2" } */
6
7 /* Test to make sure double values are allocated to the Altivec registers as
8 well as the traditional FPR registers. */
9
10 #ifndef TYPE
11 #define TYPE double
12 #endif
13
14 #ifndef MASK_TYPE
15 #define MASK_TYPE unsigned long long
16 #endif
17
18 #define MASK_ONE ((MASK_TYPE)1)
19 #define ZERO ((TYPE) 0.0)
20
21 TYPE
test_add(const MASK_TYPE * add_mask,const TYPE * add_values,const MASK_TYPE * sub_mask,const TYPE * sub_values,const MASK_TYPE * mul_mask,const TYPE * mul_values,const MASK_TYPE * div_mask,const TYPE * div_values,const MASK_TYPE * eq0_mask,int * eq0_ptr)22 test_add (const MASK_TYPE *add_mask, const TYPE *add_values,
23 const MASK_TYPE *sub_mask, const TYPE *sub_values,
24 const MASK_TYPE *mul_mask, const TYPE *mul_values,
25 const MASK_TYPE *div_mask, const TYPE *div_values,
26 const MASK_TYPE *eq0_mask, int *eq0_ptr)
27 {
28 TYPE value;
29 TYPE value00 = ZERO;
30 TYPE value01 = ZERO;
31 TYPE value02 = ZERO;
32 TYPE value03 = ZERO;
33 TYPE value04 = ZERO;
34 TYPE value05 = ZERO;
35 TYPE value06 = ZERO;
36 TYPE value07 = ZERO;
37 TYPE value08 = ZERO;
38 TYPE value09 = ZERO;
39 TYPE value10 = ZERO;
40 TYPE value11 = ZERO;
41 TYPE value12 = ZERO;
42 TYPE value13 = ZERO;
43 TYPE value14 = ZERO;
44 TYPE value15 = ZERO;
45 TYPE value16 = ZERO;
46 TYPE value17 = ZERO;
47 TYPE value18 = ZERO;
48 TYPE value19 = ZERO;
49 TYPE value20 = ZERO;
50 TYPE value21 = ZERO;
51 TYPE value22 = ZERO;
52 TYPE value23 = ZERO;
53 TYPE value24 = ZERO;
54 TYPE value25 = ZERO;
55 TYPE value26 = ZERO;
56 TYPE value27 = ZERO;
57 TYPE value28 = ZERO;
58 TYPE value29 = ZERO;
59 TYPE value30 = ZERO;
60 TYPE value31 = ZERO;
61 TYPE value32 = ZERO;
62 TYPE value33 = ZERO;
63 TYPE value34 = ZERO;
64 TYPE value35 = ZERO;
65 TYPE value36 = ZERO;
66 TYPE value37 = ZERO;
67 TYPE value38 = ZERO;
68 TYPE value39 = ZERO;
69 MASK_TYPE mask;
70 int eq0;
71
72 while ((mask = *add_mask++) != 0)
73 {
74 value = *add_values++;
75
76 __asm__ (" #reg %0" : "+d" (value));
77
78 if ((mask & (MASK_ONE << 0)) != 0)
79 value00 += value;
80
81 if ((mask & (MASK_ONE << 1)) != 0)
82 value01 += value;
83
84 if ((mask & (MASK_ONE << 2)) != 0)
85 value02 += value;
86
87 if ((mask & (MASK_ONE << 3)) != 0)
88 value03 += value;
89
90 if ((mask & (MASK_ONE << 4)) != 0)
91 value04 += value;
92
93 if ((mask & (MASK_ONE << 5)) != 0)
94 value05 += value;
95
96 if ((mask & (MASK_ONE << 6)) != 0)
97 value06 += value;
98
99 if ((mask & (MASK_ONE << 7)) != 0)
100 value07 += value;
101
102 if ((mask & (MASK_ONE << 8)) != 0)
103 value08 += value;
104
105 if ((mask & (MASK_ONE << 9)) != 0)
106 value09 += value;
107
108 if ((mask & (MASK_ONE << 10)) != 0)
109 value10 += value;
110
111 if ((mask & (MASK_ONE << 11)) != 0)
112 value11 += value;
113
114 if ((mask & (MASK_ONE << 12)) != 0)
115 value12 += value;
116
117 if ((mask & (MASK_ONE << 13)) != 0)
118 value13 += value;
119
120 if ((mask & (MASK_ONE << 14)) != 0)
121 value14 += value;
122
123 if ((mask & (MASK_ONE << 15)) != 0)
124 value15 += value;
125
126 if ((mask & (MASK_ONE << 16)) != 0)
127 value16 += value;
128
129 if ((mask & (MASK_ONE << 17)) != 0)
130 value17 += value;
131
132 if ((mask & (MASK_ONE << 18)) != 0)
133 value18 += value;
134
135 if ((mask & (MASK_ONE << 19)) != 0)
136 value19 += value;
137
138 if ((mask & (MASK_ONE << 20)) != 0)
139 value20 += value;
140
141 if ((mask & (MASK_ONE << 21)) != 0)
142 value21 += value;
143
144 if ((mask & (MASK_ONE << 22)) != 0)
145 value22 += value;
146
147 if ((mask & (MASK_ONE << 23)) != 0)
148 value23 += value;
149
150 if ((mask & (MASK_ONE << 24)) != 0)
151 value24 += value;
152
153 if ((mask & (MASK_ONE << 25)) != 0)
154 value25 += value;
155
156 if ((mask & (MASK_ONE << 26)) != 0)
157 value26 += value;
158
159 if ((mask & (MASK_ONE << 27)) != 0)
160 value27 += value;
161
162 if ((mask & (MASK_ONE << 28)) != 0)
163 value28 += value;
164
165 if ((mask & (MASK_ONE << 29)) != 0)
166 value29 += value;
167
168 if ((mask & (MASK_ONE << 30)) != 0)
169 value30 += value;
170
171 if ((mask & (MASK_ONE << 31)) != 0)
172 value31 += value;
173
174 if ((mask & (MASK_ONE << 32)) != 0)
175 value32 += value;
176
177 if ((mask & (MASK_ONE << 33)) != 0)
178 value33 += value;
179
180 if ((mask & (MASK_ONE << 34)) != 0)
181 value34 += value;
182
183 if ((mask & (MASK_ONE << 35)) != 0)
184 value35 += value;
185
186 if ((mask & (MASK_ONE << 36)) != 0)
187 value36 += value;
188
189 if ((mask & (MASK_ONE << 37)) != 0)
190 value37 += value;
191
192 if ((mask & (MASK_ONE << 38)) != 0)
193 value38 += value;
194
195 if ((mask & (MASK_ONE << 39)) != 0)
196 value39 += value;
197 }
198
199 while ((mask = *sub_mask++) != 0)
200 {
201 value = *sub_values++;
202
203 __asm__ (" #reg %0" : "+d" (value));
204
205 if ((mask & (MASK_ONE << 0)) != 0)
206 value00 -= value;
207
208 if ((mask & (MASK_ONE << 1)) != 0)
209 value01 -= value;
210
211 if ((mask & (MASK_ONE << 2)) != 0)
212 value02 -= value;
213
214 if ((mask & (MASK_ONE << 3)) != 0)
215 value03 -= value;
216
217 if ((mask & (MASK_ONE << 4)) != 0)
218 value04 -= value;
219
220 if ((mask & (MASK_ONE << 5)) != 0)
221 value05 -= value;
222
223 if ((mask & (MASK_ONE << 6)) != 0)
224 value06 -= value;
225
226 if ((mask & (MASK_ONE << 7)) != 0)
227 value07 -= value;
228
229 if ((mask & (MASK_ONE << 8)) != 0)
230 value08 -= value;
231
232 if ((mask & (MASK_ONE << 9)) != 0)
233 value09 -= value;
234
235 if ((mask & (MASK_ONE << 10)) != 0)
236 value10 -= value;
237
238 if ((mask & (MASK_ONE << 11)) != 0)
239 value11 -= value;
240
241 if ((mask & (MASK_ONE << 12)) != 0)
242 value12 -= value;
243
244 if ((mask & (MASK_ONE << 13)) != 0)
245 value13 -= value;
246
247 if ((mask & (MASK_ONE << 14)) != 0)
248 value14 -= value;
249
250 if ((mask & (MASK_ONE << 15)) != 0)
251 value15 -= value;
252
253 if ((mask & (MASK_ONE << 16)) != 0)
254 value16 -= value;
255
256 if ((mask & (MASK_ONE << 17)) != 0)
257 value17 -= value;
258
259 if ((mask & (MASK_ONE << 18)) != 0)
260 value18 -= value;
261
262 if ((mask & (MASK_ONE << 19)) != 0)
263 value19 -= value;
264
265 if ((mask & (MASK_ONE << 20)) != 0)
266 value20 -= value;
267
268 if ((mask & (MASK_ONE << 21)) != 0)
269 value21 -= value;
270
271 if ((mask & (MASK_ONE << 22)) != 0)
272 value22 -= value;
273
274 if ((mask & (MASK_ONE << 23)) != 0)
275 value23 -= value;
276
277 if ((mask & (MASK_ONE << 24)) != 0)
278 value24 -= value;
279
280 if ((mask & (MASK_ONE << 25)) != 0)
281 value25 -= value;
282
283 if ((mask & (MASK_ONE << 26)) != 0)
284 value26 -= value;
285
286 if ((mask & (MASK_ONE << 27)) != 0)
287 value27 -= value;
288
289 if ((mask & (MASK_ONE << 28)) != 0)
290 value28 -= value;
291
292 if ((mask & (MASK_ONE << 29)) != 0)
293 value29 -= value;
294
295 if ((mask & (MASK_ONE << 30)) != 0)
296 value30 -= value;
297
298 if ((mask & (MASK_ONE << 31)) != 0)
299 value31 -= value;
300
301 if ((mask & (MASK_ONE << 32)) != 0)
302 value32 -= value;
303
304 if ((mask & (MASK_ONE << 33)) != 0)
305 value33 -= value;
306
307 if ((mask & (MASK_ONE << 34)) != 0)
308 value34 -= value;
309
310 if ((mask & (MASK_ONE << 35)) != 0)
311 value35 -= value;
312
313 if ((mask & (MASK_ONE << 36)) != 0)
314 value36 -= value;
315
316 if ((mask & (MASK_ONE << 37)) != 0)
317 value37 -= value;
318
319 if ((mask & (MASK_ONE << 38)) != 0)
320 value38 -= value;
321
322 if ((mask & (MASK_ONE << 39)) != 0)
323 value39 -= value;
324 }
325
326 while ((mask = *mul_mask++) != 0)
327 {
328 value = *mul_values++;
329
330 __asm__ (" #reg %0" : "+d" (value));
331
332 if ((mask & (MASK_ONE << 0)) != 0)
333 value00 *= value;
334
335 if ((mask & (MASK_ONE << 1)) != 0)
336 value01 *= value;
337
338 if ((mask & (MASK_ONE << 2)) != 0)
339 value02 *= value;
340
341 if ((mask & (MASK_ONE << 3)) != 0)
342 value03 *= value;
343
344 if ((mask & (MASK_ONE << 4)) != 0)
345 value04 *= value;
346
347 if ((mask & (MASK_ONE << 5)) != 0)
348 value05 *= value;
349
350 if ((mask & (MASK_ONE << 6)) != 0)
351 value06 *= value;
352
353 if ((mask & (MASK_ONE << 7)) != 0)
354 value07 *= value;
355
356 if ((mask & (MASK_ONE << 8)) != 0)
357 value08 *= value;
358
359 if ((mask & (MASK_ONE << 9)) != 0)
360 value09 *= value;
361
362 if ((mask & (MASK_ONE << 10)) != 0)
363 value10 *= value;
364
365 if ((mask & (MASK_ONE << 11)) != 0)
366 value11 *= value;
367
368 if ((mask & (MASK_ONE << 12)) != 0)
369 value12 *= value;
370
371 if ((mask & (MASK_ONE << 13)) != 0)
372 value13 *= value;
373
374 if ((mask & (MASK_ONE << 14)) != 0)
375 value14 *= value;
376
377 if ((mask & (MASK_ONE << 15)) != 0)
378 value15 *= value;
379
380 if ((mask & (MASK_ONE << 16)) != 0)
381 value16 *= value;
382
383 if ((mask & (MASK_ONE << 17)) != 0)
384 value17 *= value;
385
386 if ((mask & (MASK_ONE << 18)) != 0)
387 value18 *= value;
388
389 if ((mask & (MASK_ONE << 19)) != 0)
390 value19 *= value;
391
392 if ((mask & (MASK_ONE << 20)) != 0)
393 value20 *= value;
394
395 if ((mask & (MASK_ONE << 21)) != 0)
396 value21 *= value;
397
398 if ((mask & (MASK_ONE << 22)) != 0)
399 value22 *= value;
400
401 if ((mask & (MASK_ONE << 23)) != 0)
402 value23 *= value;
403
404 if ((mask & (MASK_ONE << 24)) != 0)
405 value24 *= value;
406
407 if ((mask & (MASK_ONE << 25)) != 0)
408 value25 *= value;
409
410 if ((mask & (MASK_ONE << 26)) != 0)
411 value26 *= value;
412
413 if ((mask & (MASK_ONE << 27)) != 0)
414 value27 *= value;
415
416 if ((mask & (MASK_ONE << 28)) != 0)
417 value28 *= value;
418
419 if ((mask & (MASK_ONE << 29)) != 0)
420 value29 *= value;
421
422 if ((mask & (MASK_ONE << 30)) != 0)
423 value30 *= value;
424
425 if ((mask & (MASK_ONE << 31)) != 0)
426 value31 *= value;
427
428 if ((mask & (MASK_ONE << 32)) != 0)
429 value32 *= value;
430
431 if ((mask & (MASK_ONE << 33)) != 0)
432 value33 *= value;
433
434 if ((mask & (MASK_ONE << 34)) != 0)
435 value34 *= value;
436
437 if ((mask & (MASK_ONE << 35)) != 0)
438 value35 *= value;
439
440 if ((mask & (MASK_ONE << 36)) != 0)
441 value36 *= value;
442
443 if ((mask & (MASK_ONE << 37)) != 0)
444 value37 *= value;
445
446 if ((mask & (MASK_ONE << 38)) != 0)
447 value38 *= value;
448
449 if ((mask & (MASK_ONE << 39)) != 0)
450 value39 *= value;
451 }
452
453 while ((mask = *div_mask++) != 0)
454 {
455 value = *div_values++;
456
457 __asm__ (" #reg %0" : "+d" (value));
458
459 if ((mask & (MASK_ONE << 0)) != 0)
460 value00 /= value;
461
462 if ((mask & (MASK_ONE << 1)) != 0)
463 value01 /= value;
464
465 if ((mask & (MASK_ONE << 2)) != 0)
466 value02 /= value;
467
468 if ((mask & (MASK_ONE << 3)) != 0)
469 value03 /= value;
470
471 if ((mask & (MASK_ONE << 4)) != 0)
472 value04 /= value;
473
474 if ((mask & (MASK_ONE << 5)) != 0)
475 value05 /= value;
476
477 if ((mask & (MASK_ONE << 6)) != 0)
478 value06 /= value;
479
480 if ((mask & (MASK_ONE << 7)) != 0)
481 value07 /= value;
482
483 if ((mask & (MASK_ONE << 8)) != 0)
484 value08 /= value;
485
486 if ((mask & (MASK_ONE << 9)) != 0)
487 value09 /= value;
488
489 if ((mask & (MASK_ONE << 10)) != 0)
490 value10 /= value;
491
492 if ((mask & (MASK_ONE << 11)) != 0)
493 value11 /= value;
494
495 if ((mask & (MASK_ONE << 12)) != 0)
496 value12 /= value;
497
498 if ((mask & (MASK_ONE << 13)) != 0)
499 value13 /= value;
500
501 if ((mask & (MASK_ONE << 14)) != 0)
502 value14 /= value;
503
504 if ((mask & (MASK_ONE << 15)) != 0)
505 value15 /= value;
506
507 if ((mask & (MASK_ONE << 16)) != 0)
508 value16 /= value;
509
510 if ((mask & (MASK_ONE << 17)) != 0)
511 value17 /= value;
512
513 if ((mask & (MASK_ONE << 18)) != 0)
514 value18 /= value;
515
516 if ((mask & (MASK_ONE << 19)) != 0)
517 value19 /= value;
518
519 if ((mask & (MASK_ONE << 20)) != 0)
520 value20 /= value;
521
522 if ((mask & (MASK_ONE << 21)) != 0)
523 value21 /= value;
524
525 if ((mask & (MASK_ONE << 22)) != 0)
526 value22 /= value;
527
528 if ((mask & (MASK_ONE << 23)) != 0)
529 value23 /= value;
530
531 if ((mask & (MASK_ONE << 24)) != 0)
532 value24 /= value;
533
534 if ((mask & (MASK_ONE << 25)) != 0)
535 value25 /= value;
536
537 if ((mask & (MASK_ONE << 26)) != 0)
538 value26 /= value;
539
540 if ((mask & (MASK_ONE << 27)) != 0)
541 value27 /= value;
542
543 if ((mask & (MASK_ONE << 28)) != 0)
544 value28 /= value;
545
546 if ((mask & (MASK_ONE << 29)) != 0)
547 value29 /= value;
548
549 if ((mask & (MASK_ONE << 30)) != 0)
550 value30 /= value;
551
552 if ((mask & (MASK_ONE << 31)) != 0)
553 value31 /= value;
554
555 if ((mask & (MASK_ONE << 32)) != 0)
556 value32 /= value;
557
558 if ((mask & (MASK_ONE << 33)) != 0)
559 value33 /= value;
560
561 if ((mask & (MASK_ONE << 34)) != 0)
562 value34 /= value;
563
564 if ((mask & (MASK_ONE << 35)) != 0)
565 value35 /= value;
566
567 if ((mask & (MASK_ONE << 36)) != 0)
568 value36 /= value;
569
570 if ((mask & (MASK_ONE << 37)) != 0)
571 value37 /= value;
572
573 if ((mask & (MASK_ONE << 38)) != 0)
574 value38 /= value;
575
576 if ((mask & (MASK_ONE << 39)) != 0)
577 value39 /= value;
578 }
579
580 while ((mask = *eq0_mask++) != 0)
581 {
582 eq0 = 0;
583
584 if ((mask & (MASK_ONE << 0)) != 0)
585 eq0 |= (value00 == ZERO);
586
587 if ((mask & (MASK_ONE << 1)) != 0)
588 eq0 |= (value01 == ZERO);
589
590 if ((mask & (MASK_ONE << 2)) != 0)
591 eq0 |= (value02 == ZERO);
592
593 if ((mask & (MASK_ONE << 3)) != 0)
594 eq0 |= (value03 == ZERO);
595
596 if ((mask & (MASK_ONE << 4)) != 0)
597 eq0 |= (value04 == ZERO);
598
599 if ((mask & (MASK_ONE << 5)) != 0)
600 eq0 |= (value05 == ZERO);
601
602 if ((mask & (MASK_ONE << 6)) != 0)
603 eq0 |= (value06 == ZERO);
604
605 if ((mask & (MASK_ONE << 7)) != 0)
606 eq0 |= (value07 == ZERO);
607
608 if ((mask & (MASK_ONE << 8)) != 0)
609 eq0 |= (value08 == ZERO);
610
611 if ((mask & (MASK_ONE << 9)) != 0)
612 eq0 |= (value09 == ZERO);
613
614 if ((mask & (MASK_ONE << 10)) != 0)
615 eq0 |= (value10 == ZERO);
616
617 if ((mask & (MASK_ONE << 11)) != 0)
618 eq0 |= (value11 == ZERO);
619
620 if ((mask & (MASK_ONE << 12)) != 0)
621 eq0 |= (value12 == ZERO);
622
623 if ((mask & (MASK_ONE << 13)) != 0)
624 eq0 |= (value13 == ZERO);
625
626 if ((mask & (MASK_ONE << 14)) != 0)
627 eq0 |= (value14 == ZERO);
628
629 if ((mask & (MASK_ONE << 15)) != 0)
630 eq0 |= (value15 == ZERO);
631
632 if ((mask & (MASK_ONE << 16)) != 0)
633 eq0 |= (value16 == ZERO);
634
635 if ((mask & (MASK_ONE << 17)) != 0)
636 eq0 |= (value17 == ZERO);
637
638 if ((mask & (MASK_ONE << 18)) != 0)
639 eq0 |= (value18 == ZERO);
640
641 if ((mask & (MASK_ONE << 19)) != 0)
642 eq0 |= (value19 == ZERO);
643
644 if ((mask & (MASK_ONE << 20)) != 0)
645 eq0 |= (value20 == ZERO);
646
647 if ((mask & (MASK_ONE << 21)) != 0)
648 eq0 |= (value21 == ZERO);
649
650 if ((mask & (MASK_ONE << 22)) != 0)
651 eq0 |= (value22 == ZERO);
652
653 if ((mask & (MASK_ONE << 23)) != 0)
654 eq0 |= (value23 == ZERO);
655
656 if ((mask & (MASK_ONE << 24)) != 0)
657 eq0 |= (value24 == ZERO);
658
659 if ((mask & (MASK_ONE << 25)) != 0)
660 eq0 |= (value25 == ZERO);
661
662 if ((mask & (MASK_ONE << 26)) != 0)
663 eq0 |= (value26 == ZERO);
664
665 if ((mask & (MASK_ONE << 27)) != 0)
666 eq0 |= (value27 == ZERO);
667
668 if ((mask & (MASK_ONE << 28)) != 0)
669 eq0 |= (value28 == ZERO);
670
671 if ((mask & (MASK_ONE << 29)) != 0)
672 eq0 |= (value29 == ZERO);
673
674 if ((mask & (MASK_ONE << 30)) != 0)
675 eq0 |= (value30 == ZERO);
676
677 if ((mask & (MASK_ONE << 31)) != 0)
678 eq0 |= (value31 == ZERO);
679
680 if ((mask & (MASK_ONE << 32)) != 0)
681 eq0 |= (value32 == ZERO);
682
683 if ((mask & (MASK_ONE << 33)) != 0)
684 eq0 |= (value33 == ZERO);
685
686 if ((mask & (MASK_ONE << 34)) != 0)
687 eq0 |= (value34 == ZERO);
688
689 if ((mask & (MASK_ONE << 35)) != 0)
690 eq0 |= (value35 == ZERO);
691
692 if ((mask & (MASK_ONE << 36)) != 0)
693 eq0 |= (value36 == ZERO);
694
695 if ((mask & (MASK_ONE << 37)) != 0)
696 eq0 |= (value37 == ZERO);
697
698 if ((mask & (MASK_ONE << 38)) != 0)
699 eq0 |= (value38 == ZERO);
700
701 if ((mask & (MASK_ONE << 39)) != 0)
702 eq0 |= (value39 == ZERO);
703
704 *eq0_ptr++ = eq0;
705 }
706
707 return ( value00 + value01 + value02 + value03 + value04
708 + value05 + value06 + value07 + value08 + value09
709 + value10 + value11 + value12 + value13 + value14
710 + value15 + value16 + value17 + value18 + value19
711 + value20 + value21 + value22 + value23 + value24
712 + value25 + value26 + value27 + value28 + value29
713 + value30 + value31 + value32 + value33 + value34
714 + value35 + value36 + value37 + value38 + value39);
715 }
716
717 /* { dg-final { scan-assembler "fadd" } } */
718 /* { dg-final { scan-assembler "fsub" } } */
719 /* { dg-final { scan-assembler "fmul" } } */
720 /* { dg-final { scan-assembler "fdiv" } } */
721 /* { dg-final { scan-assembler "fcmpu" } } */
722 /* { dg-final { scan-assembler "xsadddp" } } */
723 /* { dg-final { scan-assembler "xssubdp" } } */
724 /* { dg-final { scan-assembler "xsmuldp" } } */
725 /* { dg-final { scan-assembler "xsdivdp" } } */
726 /* { dg-final { scan-assembler "xscmpudp" } } */
727