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