! { dg-do run } program main integer igot, iexp, itmp real fgot, fexp, ftmp logical lgot, lexp, ltmp integer, parameter :: N = 32 igot = 0 iexp = N * 2 !$acc parallel copy (igot, itmp) do i = 1, N !$acc atomic capture itmp = igot igot = i + i !$acc end atomic end do !$acc end parallel if (igot /= iexp) call abort if (itmp /= iexp - 2) call abort fgot = 1234.0 fexp = 1266.0 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture ftmp = fgot fgot = fgot + 1.0 !$acc end atomic end do !$acc end parallel loop if (ftmp /= fexp - 1.0) call abort if (fgot /= fexp) call abort fgot = 1.0 fexp = 2.0**32 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture ftmp = fgot fgot = fgot * 2.0 !$acc end atomic end do !$acc end parallel loop if (ftmp /= fexp / 2.0) call abort if (fgot /= fexp) call abort fgot = 32.0 fexp = fgot - N !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture ftmp = fgot fgot = fgot - 1.0 !$acc end atomic end do !$acc end parallel loop if (ftmp /= fexp + 1.0) call abort if (fgot /= fexp) call abort fgot = 2**32.0 fexp = 1.0 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture ftmp = fgot fgot = fgot / 2.0 !$acc end atomic end do !$acc end parallel loop if (ftmp /= fgot * 2.0) call abort if (fgot /= fexp) call abort lgot = .TRUE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture ltmp = lgot lgot = lgot .and. .FALSE. !$acc end atomic !$acc end parallel if (ltmp .neqv. .not. lexp) call abort if (lgot .neqv. lexp) call abort lgot = .FALSE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture ltmp = lgot lgot = lgot .or. .FALSE. !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) call abort if (lgot .neqv. lexp) call abort lgot = .FALSE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture ltmp = lgot lgot = lgot .eqv. .TRUE. !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) call abort if (lgot .neqv. lexp) call abort lgot = .FALSE. lexp = .TRUE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture ltmp = lgot lgot = lgot .neqv. .TRUE. !$acc end atomic !$acc end parallel if (ltmp .neqv. .not. lexp) call abort if (lgot .neqv. lexp) call abort fgot = 1234.0 fexp = 1266.0 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture ftmp = fgot fgot = 1.0 + fgot !$acc end atomic end do !$acc end parallel loop if (ftmp /= fexp - 1.0) call abort if (fgot /= fexp) call abort fgot = 1.0 fexp = 2.0**32 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture ftmp = fgot fgot = 2.0 * fgot !$acc end atomic end do !$acc end parallel loop if (ftmp /= fexp / 2.0) call abort if (fgot /= fexp) call abort fgot = 32.0 fexp = 32.0 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture ftmp = fgot fgot = 2.0 - fgot !$acc end atomic end do !$acc end parallel loop if (ftmp /= 2.0 - fexp) call abort if (fgot /= fexp) call abort fgot = 2.0**16 fexp = 2.0**16 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture ftmp = fgot fgot = 2.0 / fgot !$acc end atomic end do !$acc end parallel loop if (ftmp /= 2.0 / fexp) call abort if (fgot /= fexp) call abort lgot = .TRUE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture ltmp = lgot lgot = .FALSE. .and. lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. .not. lexp) call abort if (lgot .neqv. lexp) call abort lgot = .FALSE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture ltmp = lgot lgot = .FALSE. .or. lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) call abort if (lgot .neqv. lexp) call abort lgot = .FALSE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture ltmp = lgot lgot = .TRUE. .eqv. lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) call abort if (lgot .neqv. lexp) call abort lgot = .FALSE. lexp = .TRUE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture ltmp = lgot lgot = .TRUE. .neqv. lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. .not. lexp) call abort if (lgot .neqv. lexp) call abort igot = 1 iexp = N !$acc parallel loop copy (igot, itmp) do i = 1, N !$acc atomic capture itmp = igot igot = max (igot, i) !$acc end atomic end do !$acc end parallel loop if (itmp /= iexp - 1) call abort if (igot /= iexp) call abort igot = N iexp = 1 !$acc parallel loop copy (igot, itmp) do i = 1, N !$acc atomic capture itmp = igot igot = min (igot, i) !$acc end atomic end do !$acc end parallel loop if (itmp /= iexp) call abort if (igot /= iexp) call abort igot = -1 iexp = 0 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = ibclr (-2, i) !$acc atomic capture itmp = igot igot = iand (igot, iexpr) !$acc end atomic end do !$acc end parallel loop if (itmp /= ibset (iexp, N - 1)) call abort if (igot /= iexp) call abort igot = 0 iexp = -1 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = lshift (1, i) !$acc atomic capture itmp = igot igot = ior (igot, iexpr) !$acc end atomic end do !$acc end parallel loop if (itmp /= ieor (iexp, lshift (1, N - 1))) call abort if (igot /= iexp) call abort igot = -1 iexp = 0 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = lshift (1, i) !$acc atomic capture itmp = igot igot = ieor (igot, iexpr) !$acc end atomic end do !$acc end parallel loop if (itmp /= ior (iexp, lshift (1, N - 1))) call abort if (igot /= iexp) call abort igot = 1 iexp = N !$acc parallel loop copy (igot, itmp) do i = 1, N !$acc atomic capture itmp = igot igot = max (i, igot) !$acc end atomic end do !$acc end parallel loop if (itmp /= iexp - 1) call abort if (igot /= iexp) call abort igot = N iexp = 1 !$acc parallel loop copy (igot, itmp) do i = 1, N !$acc atomic capture itmp = igot igot = min (i, igot) !$acc end atomic end do !$acc end parallel loop if (itmp /= iexp) call abort if (igot /= iexp) call abort igot = -1 iexp = 0 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = ibclr (-2, i) !$acc atomic capture itmp = igot igot = iand (iexpr, igot) !$acc end atomic end do !$acc end parallel loop if (itmp /= ibset (iexp, N - 1)) call abort if (igot /= iexp) call abort igot = 0 iexp = -1 !! !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = lshift (1, i) !$acc atomic capture itmp = igot igot = ior (iexpr, igot) !$acc end atomic end do !$acc end parallel loop if (itmp /= ieor (iexp, lshift (1, N - 1))) call abort if (igot /= iexp) call abort igot = -1 iexp = 0 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = lshift (1, i) !$acc atomic capture itmp = igot igot = ieor (iexpr, igot) !$acc end atomic end do !$acc end parallel loop if (itmp /= ior (iexp, lshift (1, N - 1))) call abort if (igot /= iexp) call abort fgot = 1234.0 fexp = 1266.0 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture fgot = fgot + 1.0 ftmp = fgot !$acc end atomic end do !$acc end parallel loop if (ftmp /= fexp) call abort if (fgot /= fexp) call abort fgot = 1.0 fexp = 2.0**32 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture fgot = fgot * 2.0 ftmp = fgot !$acc end atomic end do !$acc end parallel loop if (ftmp /= fexp) call abort if (fgot /= fexp) call abort fgot = 32.0 fexp = fgot - N !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture fgot = fgot - 1.0 ftmp = fgot !$acc end atomic end do !$acc end parallel loop if (ftmp /= fexp) call abort if (fgot /= fexp) call abort fgot = 2**32.0 fexp = 1.0 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture fgot = fgot / 2.0 ftmp = fgot !$acc end atomic end do !$acc end parallel loop if (ftmp /= fexp) call abort if (fgot /= fexp) call abort lgot = .TRUE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture lgot = lgot .and. .FALSE. ltmp = lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) call abort if (lgot .neqv. lexp) call abort lgot = .FALSE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture lgot = lgot .or. .FALSE. ltmp = lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) call abort if (lgot .neqv. lexp) call abort lgot = .FALSE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture lgot = lgot .eqv. .TRUE. ltmp = lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) call abort if (lgot .neqv. lexp) call abort lgot = .FALSE. lexp = .TRUE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture lgot = lgot .neqv. .TRUE. ltmp = lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) call abort if (lgot .neqv. lexp) call abort fgot = 1234.0 fexp = 1266.0 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture fgot = 1.0 + fgot ftmp = fgot !$acc end atomic end do !$acc end parallel loop if (ftmp /= fexp) call abort if (fgot /= fexp) call abort fgot = 1.0 fexp = 2.0**32 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture fgot = 2.0 * fgot ftmp = fgot !$acc end atomic end do !$acc end parallel loop if (ftmp /= fexp) call abort if (fgot /= fexp) call abort fgot = 32.0 fexp = 32.0 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture fgot = 2.0 - fgot ftmp = fgot !$acc end atomic end do !$acc end parallel loop if (ftmp /= fexp) call abort if (fgot /= fexp) call abort fgot = 2.0**16 fexp = 2.0**16 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture fgot = 2.0 / fgot ftmp = fgot !$acc end atomic end do !$acc end parallel loop if (ftmp /= fexp) call abort if (fgot /= fexp) call abort lgot = .TRUE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture lgot = .FALSE. .and. lgot ltmp = lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) call abort if (lgot .neqv. lexp) call abort lgot = .FALSE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture lgot = .FALSE. .or. lgot ltmp = lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) call abort if (lgot .neqv. lexp) call abort lgot = .FALSE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture lgot = .TRUE. .eqv. lgot ltmp = lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) call abort if (lgot .neqv. lexp) call abort lgot = .FALSE. lexp = .TRUE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture lgot = .TRUE. .neqv. lgot ltmp = lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) call abort if (lgot .neqv. lexp) call abort igot = 1 iexp = N !$acc parallel loop copy (igot, itmp) do i = 1, N !$acc atomic capture igot = max (igot, i) itmp = igot !$acc end atomic end do !$acc end parallel loop if (itmp /= iexp) call abort if (igot /= iexp) call abort igot = N iexp = 1 !$acc parallel loop copy (igot, itmp) do i = 1, N !$acc atomic capture igot = min (igot, i) itmp = igot !$acc end atomic end do !$acc end parallel loop if (itmp /= iexp) call abort if (igot /= iexp) call abort igot = -1 iexp = 0 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = ibclr (-2, i) !$acc atomic capture igot = iand (igot, iexpr) itmp = igot !$acc end atomic end do !$acc end parallel loop if (itmp /= iexp) call abort if (igot /= iexp) call abort igot = 0 iexp = -1 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = lshift (1, i) !$acc atomic capture igot = ior (igot, iexpr) itmp = igot !$acc end atomic end do !$acc end parallel loop if (itmp /= iexp) call abort if (igot /= iexp) call abort igot = -1 iexp = 0 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = lshift (1, i) !$acc atomic capture igot = ieor (igot, iexpr) itmp = igot !$acc end atomic end do !$acc end parallel loop if (itmp /= iexp) call abort if (igot /= iexp) call abort igot = 1 iexp = N !$acc parallel loop copy (igot, itmp) do i = 1, N !$acc atomic capture igot = max (i, igot) itmp = igot !$acc end atomic end do !$acc end parallel loop if (itmp /= iexp) call abort if (igot /= iexp) call abort igot = N iexp = 1 !$acc parallel loop copy (igot, itmp) do i = 1, N !$acc atomic capture igot = min (i, igot) itmp = igot !$acc end atomic end do !$acc end parallel loop if (itmp /= iexp) call abort if (igot /= iexp) call abort igot = -1 iexp = 0 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = ibclr (-2, i) !$acc atomic capture igot = iand (iexpr, igot) itmp = igot !$acc end atomic end do !$acc end parallel loop if (itmp /= iexp) call abort if (igot /= iexp) call abort igot = 0 iexp = -1 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = lshift (1, i) !$acc atomic capture igot = ior (iexpr, igot) itmp = igot !$acc end atomic end do !$acc end parallel loop if (itmp /= iexp) call abort if (igot /= iexp) call abort igot = -1 iexp = 0 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = lshift (1, i) !$acc atomic capture igot = ieor (iexpr, igot) itmp = igot !$acc end atomic end do !$acc end parallel loop if (itmp /= iexp) call abort if (igot /= iexp) call abort end program