1 /* { dg-do run } */
2
3 #include <stdlib.h>
4
5 int
main(int argc,char ** argv)6 main(int argc, char **argv)
7 {
8 int iexp, igot;
9 long long lexp, lgot;
10 int N = 32;
11 int idata[N];
12 long long ldata[N];
13 float fexp, fgot;
14 float fdata[N];
15 int i;
16
17 igot = 0;
18 iexp = 32;
19
20 #pragma acc data copy (igot, idata[0:N])
21 {
22 #pragma acc parallel loop
23 for (i = 0; i < N; i++)
24 {
25 #pragma acc atomic capture
26 idata[i] = igot++;
27 }
28 }
29
30 if (iexp != igot)
31 abort ();
32
33 igot = 32;
34 iexp = 0;
35
36 #pragma acc data copy (igot, idata[0:N])
37 {
38 #pragma acc parallel loop
39 for (i = 0; i < N; i++)
40 {
41 #pragma acc atomic capture
42 idata[i] = igot--;
43 }
44 }
45
46 if (iexp != igot)
47 abort ();
48
49 igot = 0;
50 iexp = 32;
51
52 #pragma acc data copy (igot, idata[0:N])
53 {
54 #pragma acc parallel loop
55 for (i = 0; i < N; i++)
56 {
57 #pragma acc atomic capture
58 idata[i] = ++igot;
59 }
60 }
61
62 if (iexp != igot)
63 abort ();
64
65 igot = 32;
66 iexp = 0;
67
68 #pragma acc data copy (igot, idata[0:N])
69 {
70 #pragma acc parallel loop
71 for (i = 0; i < N; i++)
72 {
73 #pragma acc atomic capture
74 idata[i] = --igot;
75 }
76 }
77
78 /* BINOP = + */
79 igot = 0;
80 iexp = 32;
81
82 #pragma acc data copy (igot, idata[0:N])
83 {
84 #pragma acc parallel loop
85 for (i = 0; i < N; i++)
86 {
87 int expr = 1;
88
89 #pragma acc atomic capture
90 idata[i] = igot += expr;
91 }
92 }
93
94 if (iexp != igot)
95 abort ();
96
97 igot = 0;
98 iexp = 32;
99
100 #pragma acc data copy (igot, idata[0:N])
101 {
102 #pragma acc parallel loop
103 for (i = 0; i < N; i++)
104 {
105 int expr = 1;
106
107 #pragma acc atomic capture
108 idata[i] = igot = igot + expr;
109 }
110 }
111
112 if (iexp != igot)
113 abort ();
114
115 igot = 0;
116 iexp = 32;
117
118 #pragma acc data copy (igot, idata[0:N])
119 {
120 #pragma acc parallel loop
121 for (i = 0; i < N; i++)
122 {
123 int expr = 1;
124
125 #pragma acc atomic capture
126 idata[i] = igot = expr + igot;
127 }
128 }
129
130 if (iexp != igot)
131 abort ();
132
133 /* BINOP = * */
134 lgot = 1LL;
135 lexp = 1LL << N;
136
137 #pragma acc data copy (lgot, ldata[0:N])
138 {
139 #pragma acc parallel loop
140 for (i = 0; i < N; i++)
141 {
142 long long expr = 2LL;
143
144 #pragma acc atomic capture
145 ldata[i] = lgot *= expr;
146 }
147 }
148
149 if (lexp != lgot)
150 abort ();
151
152 lgot = 1LL;
153 lexp = 1LL << N;
154
155 #pragma acc data copy (lgot, ldata[0:N])
156 {
157 #pragma acc parallel loop
158 for (i = 0; i < N; i++)
159 {
160 long long expr = 2LL;
161
162 #pragma acc atomic capture
163 ldata[i] = lgot = lgot * expr;
164 }
165 }
166
167 if (lexp != lgot)
168 abort ();
169
170 lgot = 1LL;
171 lexp = 1LL << N;
172
173 #pragma acc data copy (lgot, ldata[0:N])
174 {
175 #pragma acc parallel loop
176 for (i = 0; i < N; i++)
177 {
178 long long expr = 2LL;
179
180 #pragma acc atomic capture
181 ldata[i] = lgot = expr * lgot;
182 }
183 }
184
185 if (lexp != lgot)
186 abort ();
187
188 /* BINOP = - */
189 igot = 32;
190 iexp = 0;
191
192 #pragma acc data copy (igot, idata[0:N])
193 {
194 #pragma acc parallel loop
195 for (i = 0; i < N; i++)
196 {
197 int expr = 1;
198
199 #pragma acc atomic capture
200 idata[i] = igot -= expr;
201 }
202 }
203
204 if (iexp != igot)
205 abort ();
206
207 igot = 32;
208 iexp = 0;
209
210 #pragma acc data copy (igot, idata[0:N])
211 {
212 #pragma acc parallel loop
213 for (i = 0; i < N; i++)
214 {
215 int expr = 1;
216
217 #pragma acc atomic capture
218 idata[i] = igot = igot - expr;
219 }
220 }
221
222 if (iexp != igot)
223 abort ();
224
225 igot = 32;
226 iexp = 32;
227
228 #pragma acc data copy (igot, idata[0:N])
229 {
230 #pragma acc parallel loop
231 for (i = 0; i < N; i++)
232 {
233 int expr = 1;
234
235 #pragma acc atomic capture
236 idata[i] = igot = expr - igot;
237 }
238 }
239
240 if (iexp != igot)
241 abort ();
242
243
244 /* BINOP = / */
245 lgot = 1LL << 32;
246 lexp = 1LL;
247
248 #pragma acc data copy (lgot, ldata[0:N])
249 {
250 #pragma acc parallel loop
251 for (i = 0; i < N; i++)
252 {
253 long long expr = 2LL;
254
255 #pragma acc atomic capture
256 ldata[i] = lgot /= expr;
257 }
258 }
259
260 if (lexp != lgot)
261 abort ();
262
263 lgot = 1LL << 32;
264 lexp = 1LL;
265
266 #pragma acc data copy (lgot, ldata[0:N])
267 {
268 #pragma acc parallel loop
269 for (i = 0; i < N; i++)
270 {
271 long long expr = 2LL;
272
273 #pragma acc atomic capture
274 ldata[i] = lgot = lgot / expr;
275 }
276 }
277
278 if (lexp != lgot)
279 abort ();
280
281 lgot = 2LL;
282 lexp = 2LL;
283
284 #pragma acc data copy (lgot, ldata[0:N])
285 {
286 #pragma acc parallel loop
287 for (i = 0; i < N; i++)
288 {
289 long long expr = 1LL << N;
290
291 #pragma acc atomic capture
292 ldata[i] = lgot = expr / lgot;
293 }
294 }
295
296 if (lexp != lgot)
297 abort ();
298
299 /* BINOP = & */
300 igot = ~0;
301 iexp = 0;
302
303 #pragma acc data copy (igot, idata[0:N])
304 {
305 #pragma acc parallel loop
306 for (i = 0; i < N; i++)
307 {
308 int expr = 1 << i;
309
310 #pragma acc atomic capture
311 idata[i] = igot &= expr;
312 }
313 }
314
315 if (iexp != igot)
316 abort ();
317
318 igot = ~0;
319 iexp = 0;
320
321 #pragma acc data copy (igot, idata[0:N])
322 {
323 #pragma acc parallel loop
324 for (i = 0; i < N; i++)
325 {
326 int expr = 1 << i;
327
328 #pragma acc atomic capture
329 idata[i] = igot = igot & expr;
330 }
331 }
332
333 if (iexp != igot)
334 abort ();
335
336 igot = ~0;
337 iexp = 0;
338
339 #pragma acc data copy (igot, idata[0:N])
340 {
341 #pragma acc parallel loop
342 for (i = 0; i < N; i++)
343 {
344 int expr = 1 << i;
345
346 #pragma acc atomic capture
347 idata[i] = igot = expr & igot;
348 }
349 }
350
351 if (iexp != igot)
352 abort ();
353
354 /* BINOP = ^ */
355 igot = ~0;
356 iexp = 0;
357
358 #pragma acc data copy (igot, idata[0:N])
359 {
360 #pragma acc parallel loop
361 for (i = 0; i < N; i++)
362 {
363 int expr = 1 << i;
364
365 #pragma acc atomic capture
366 idata[i] = igot ^= expr;
367 }
368 }
369
370 if (iexp != igot)
371 abort ();
372
373 igot = ~0;
374 iexp = 0;
375
376 #pragma acc data copy (igot, idata[0:N])
377 {
378 #pragma acc parallel loop
379 for (i = 0; i < N; i++)
380 {
381 int expr = 1 << i;
382
383 #pragma acc atomic capture
384 idata[i] = igot = igot ^ expr;
385 }
386 }
387
388 if (iexp != igot)
389 abort ();
390
391 igot = ~0;
392 iexp = 0;
393
394 #pragma acc data copy (igot, idata[0:N])
395 {
396 #pragma acc parallel loop
397 for (i = 0; i < N; i++)
398 {
399 int expr = 1 << i;
400
401 #pragma acc atomic capture
402 idata[i] = igot = expr ^ igot;
403 }
404 }
405
406 if (iexp != igot)
407 abort ();
408
409 /* BINOP = | */
410 igot = 0;
411 iexp = ~0;
412
413 #pragma acc data copy (igot, idata[0:N])
414 {
415 #pragma acc parallel loop
416 for (i = 0; i < N; i++)
417 {
418 int expr = 1 << i;
419
420 #pragma acc atomic capture
421 idata[i] = igot |= expr;
422 }
423 }
424
425 if (iexp != igot)
426 abort ();
427
428 igot = 0;
429 iexp = ~0;
430
431 #pragma acc data copy (igot, idata[0:N])
432 {
433 #pragma acc parallel loop
434 for (i = 0; i < N; i++)
435 {
436 int expr = 1 << i;
437
438 #pragma acc atomic capture
439 idata[i] = igot = igot | expr;
440 }
441 }
442
443 if (iexp != igot)
444 abort ();
445
446 igot = 0;
447 iexp = ~0;
448
449 #pragma acc data copy (igot, idata[0:N])
450 {
451 #pragma acc parallel loop
452 for (i = 0; i < N; i++)
453 {
454 int expr = 1 << i;
455
456 #pragma acc atomic capture
457 idata[i] = igot = expr | igot;
458 }
459 }
460
461 if (iexp != igot)
462 abort ();
463
464 /* BINOP = << */
465 lgot = 1LL;
466 lexp = 1LL << N;
467
468 #pragma acc data copy (lgot, ldata[0:N])
469 {
470 #pragma acc parallel loop
471 for (i = 0; i < N; i++)
472 {
473 int expr = 1;
474
475 #pragma acc atomic capture
476 ldata[i] = lgot <<= expr;
477 }
478 }
479
480 if (lexp != lgot)
481 abort ();
482
483 lgot = 1LL;
484 lexp = 1LL << N;
485
486 #pragma acc data copy (lgot, ldata[0:N])
487 {
488 #pragma acc parallel loop
489 for (i = 0; i < N; i++)
490 {
491 int expr = 1;
492
493 #pragma acc atomic capture
494 idata[i] = lgot = lgot << expr;
495 }
496 }
497
498 if (lexp != lgot)
499 abort ();
500
501 lgot = 1LL;
502 lexp = 2LL;
503
504 #pragma acc data copy (lgot, ldata[0:N])
505 {
506 #pragma acc parallel
507 {
508 long long expr = 1LL;
509
510 #pragma acc atomic capture
511 ldata[0] = lgot = expr << lgot;
512 }
513 }
514
515 if (lexp != lgot)
516 abort ();
517
518 /* BINOP = >> */
519 lgot = 1LL << N;
520 lexp = 1LL;
521
522 #pragma acc data copy (lgot, ldata[0:N])
523 {
524 #pragma acc parallel loop
525 for (i = 0; i < N; i++)
526 {
527 long long expr = 1LL;
528
529 #pragma acc atomic capture
530 ldata[i] = lgot >>= expr;
531 }
532 }
533
534 if (lexp != lgot)
535 abort ();
536
537 lgot = 1LL << N;
538 lexp = 1LL;
539
540 #pragma acc data copy (lgot, ldata[0:N])
541 {
542 #pragma acc parallel loop
543 for (i = 0; i < N; i++)
544 {
545 int expr = 1;
546
547 #pragma acc atomic capture
548 ldata[i] = lgot = lgot >> expr;
549 }
550 }
551
552 if (lexp != lgot)
553 abort ();
554
555 lgot = 1LL << 63;
556 lexp = 1LL << 32;
557
558 #pragma acc data copy (lgot, ldata[0:N])
559 {
560 #pragma acc parallel
561 {
562 long long expr = 1LL << 32;
563
564 #pragma acc atomic capture
565 ldata[0] = lgot = expr >> lgot;
566 }
567 }
568
569 if (lexp != lgot)
570 abort ();
571
572 fgot = 0.0;
573 fexp = 32.0;
574
575 #pragma acc data copy (fgot, fdata[0:N])
576 {
577 #pragma acc parallel loop
578 for (i = 0; i < N; i++)
579 {
580 #pragma acc atomic capture
581 fdata[i] = fgot++;
582 }
583 }
584
585 if (fexp != fgot)
586 abort ();
587
588 fgot = 32.0;
589 fexp = 0.0;
590
591 #pragma acc data copy (fgot, fdata[0:N])
592 {
593 #pragma acc parallel loop
594 for (i = 0; i < N; i++)
595 {
596 #pragma acc atomic capture
597 fdata[i] = fgot--;
598 }
599 }
600
601 if (fexp != fgot)
602 abort ();
603
604 fgot = 0.0;
605 fexp = 32.0;
606
607 #pragma acc data copy (fgot, fdata[0:N])
608 {
609 #pragma acc parallel loop
610 for (i = 0; i < N; i++)
611 {
612 #pragma acc atomic capture
613 fdata[i] = ++fgot;
614 }
615 }
616
617 if (fexp != fgot)
618 abort ();
619
620 fgot = 32.0;
621 fexp = 0.0;
622
623 #pragma acc data copy (fgot, fdata[0:N])
624 {
625 #pragma acc parallel loop
626 for (i = 0; i < N; i++)
627 {
628 #pragma acc atomic capture
629 fdata[i] = --fgot;
630 }
631 }
632
633 if (fexp != fgot)
634 abort ();
635
636 /* BINOP = + */
637 fgot = 0.0;
638 fexp = 32.0;
639
640 #pragma acc data copy (fgot, fdata[0:N])
641 {
642 #pragma acc parallel loop
643 for (i = 0; i < N; i++)
644 {
645 float expr = 1.0;
646
647 #pragma acc atomic capture
648 fdata[i] = fgot += expr;
649 }
650 }
651
652 if (fexp != fgot)
653 abort ();
654
655 fgot = 0.0;
656 fexp = 32.0;
657
658 #pragma acc data copy (fgot, fdata[0:N])
659 {
660 #pragma acc parallel loop
661 for (i = 0; i < N; i++)
662 {
663 float expr = 1.0;
664
665 #pragma acc atomic capture
666 fdata[i] = fgot = fgot + expr;
667 }
668 }
669
670 if (fexp != fgot)
671 abort ();
672
673 fgot = 0.0;
674 fexp = 32.0;
675
676 #pragma acc data copy (fgot, fdata[0:N])
677 {
678 #pragma acc parallel loop
679 for (i = 0; i < N; i++)
680 {
681 float expr = 1.0;
682
683 #pragma acc atomic capture
684 fdata[i] = fgot = expr + fgot;
685 }
686 }
687
688 if (fexp != fgot)
689 abort ();
690
691 /* BINOP = * */
692 fgot = 1.0;
693 fexp = 8192.0*8192.0*64.0;
694
695 #pragma acc data copy (fgot, fdata[0:N])
696 {
697 #pragma acc parallel loop
698 for (i = 0; i < N; i++)
699 {
700 float expr = 2.0;
701
702 #pragma acc atomic capture
703 fdata[i] = fgot *= expr;
704 }
705 }
706
707 if (fexp != fgot)
708 abort ();
709
710 fgot = 1.0;
711 fexp = 8192.0*8192.0*64.0;
712
713 #pragma acc data copy (fgot, fdata[0:N])
714 {
715 #pragma acc parallel loop
716 for (i = 0; i < N; i++)
717 {
718 long long expr = 2LL;
719
720 #pragma acc atomic capture
721 fdata[i] = fgot = fgot * expr;
722 }
723 }
724
725 if (fexp != fgot)
726 abort ();
727
728 fgot = 1.0;
729 fexp = 8192.0*8192.0*64.0;
730
731 #pragma acc data copy (fgot, fdata[0:N])
732 {
733 #pragma acc parallel loop
734 for (i = 0; i < N; i++)
735 {
736 float expr = 2.0;
737
738 #pragma acc atomic capture
739 fdata[i] = fgot = expr * fgot;
740 }
741 }
742
743 if (fexp != fgot)
744 abort ();
745
746 /* BINOP = - */
747 fgot = 32.0;
748 fexp = 0.0;
749
750 #pragma acc data copy (fgot, fdata[0:N])
751 {
752 #pragma acc parallel loop
753 for (i = 0; i < N; i++)
754 {
755 float expr = 1.0;
756
757 #pragma acc atomic capture
758 fdata[i] = fgot -= expr;
759 }
760 }
761
762 if (fexp != fgot)
763 abort ();
764
765 fgot = 32.0;
766 fexp = 0.0;
767
768 #pragma acc data copy (fgot, fdata[0:N])
769 {
770 #pragma acc parallel loop
771 for (i = 0; i < N; i++)
772 {
773 float expr = 1.0;
774
775 #pragma acc atomic capture
776 fdata[i] = fgot = fgot - expr;
777 }
778 }
779
780 if (fexp != fgot)
781 abort ();
782
783 fgot = 1.0;
784 fexp = 0.0;
785
786 #pragma acc data copy (fgot, fdata[0:N])
787 {
788 #pragma acc parallel loop
789 for (i = 0; i < N; i++)
790 {
791 float expr = 32.0;
792
793 #pragma acc atomic capture
794 fdata[i] = fgot = expr - fgot;
795 }
796 }
797
798 int ones = 0, thirtyones = 0;
799
800 for (i = 0; i < N; i++)
801 if (fdata[i] == 31.0)
802 thirtyones++;
803 else if (fdata[i] == 1.0)
804 ones++;
805
806 if (ones != N / 2 || thirtyones != N / 2)
807 abort ();
808
809
810 /* BINOP = / */
811 fexp = 1.0;
812 fgot = 8192.0*8192.0*64.0;
813
814 #pragma acc data copy (fgot, fdata[0:N])
815 {
816 #pragma acc parallel loop
817 for (i = 0; i < N; i++)
818 {
819 float expr = 2.0;
820
821 #pragma acc atomic capture
822 fdata[i] = fgot /= expr;
823 }
824 }
825
826 if (fexp != fgot)
827 abort ();
828
829 fexp = 1.0;
830 fgot = 8192.0*8192.0*64.0;
831
832 #pragma acc data copy (fgot, fdata[0:N])
833 {
834 #pragma acc parallel loop
835 for (i = 0; i < N; i++)
836 {
837 float expr = 2.0;
838
839 #pragma acc atomic capture
840 fdata[i] = fgot = fgot / expr;
841 }
842 }
843
844 if (fexp != fgot)
845 abort ();
846
847 fexp = 1.0;
848 fgot = 8192.0*8192.0*64.0;
849
850 #pragma acc data copy (fgot, fdata[0:N])
851 {
852 #pragma acc parallel
853 {
854 float expr = 8192.0*8192.0*64.0;
855
856 #pragma acc atomic capture
857 fdata[0] = fgot = expr / fgot;
858 }
859 }
860
861 if (fexp != fgot)
862 abort ();
863
864 return 0;
865 }
866