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