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