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