| ! { dg-do run } |
| ! |
| use iso_fortran_env, only: atomic_int_kind, atomic_logical_kind |
| implicit none |
| |
| intrinsic :: atomic_define |
| intrinsic :: atomic_ref |
| intrinsic :: atomic_cas |
| intrinsic :: atomic_add |
| intrinsic :: atomic_and |
| intrinsic :: atomic_or |
| intrinsic :: atomic_xor |
| intrinsic :: atomic_fetch_add |
| intrinsic :: atomic_fetch_and |
| intrinsic :: atomic_fetch_or |
| intrinsic :: atomic_fetch_xor |
| integer(atomic_int_kind) :: caf[*], var, var3 |
| logical(atomic_logical_kind) :: caf_log[*], var2 |
| integer :: stat, i |
| |
| caf = 0 |
| caf_log = .false. |
| sync all |
| |
| if (this_image() == 1) then |
| call atomic_define(caf[num_images()], 5, stat=stat) |
| if (stat /= 0) STOP 1 |
| call atomic_define(caf_log[num_images()], .true., stat=stat) |
| if (stat /= 0) STOP 2 |
| end if |
| sync all |
| |
| if (this_image() == num_images()) then |
| if (caf /= 5) STOP 3 |
| if (.not. caf_log) STOP 4 |
| var = 99 |
| call atomic_ref(var, caf, stat=stat) |
| if (stat /= 0 .or. var /= 5) STOP 5 |
| var2 = .false. |
| call atomic_ref(var2, caf_log, stat=stat) |
| if (stat /= 0 .or. .not. var2) STOP 6 |
| end if |
| call atomic_ref(var, caf[num_images()], stat=stat) |
| if (stat /= 0 .or. var /= 5) STOP 7 |
| call atomic_ref(var2, caf_log[num_images()], stat=stat) |
| if (stat /= 0 .or. .not. var2) STOP 8 |
| sync all |
| |
| ! ADD |
| caf = 0 |
| sync all |
| |
| call atomic_add(caf, this_image(), stat=stat) |
| if (stat /= 0) STOP 9 |
| do i = 1, num_images() |
| call atomic_add(caf[i], 1, stat=stat) |
| if (stat /= 0) STOP 10 |
| call atomic_ref(var, caf, stat=stat) |
| if (stat /= 0 .or. var < this_image()) STOP 11 |
| end do |
| sync all |
| |
| call atomic_ref(var, caf[num_images()], stat=stat) |
| if (stat /= 0 .or. var /= num_images() + this_image()) STOP 12 |
| do i = 1, num_images() |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= num_images() + i) STOP 13 |
| end do |
| sync all |
| |
| ! AND(1) |
| caf = 0 |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = this_image(), min(num_images(), storage_size(caf)-2) |
| call atomic_and(caf[i], shiftl(1, this_image()), stat=stat) |
| if (stat /= 0) STOP 14 |
| end do |
| end if |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| var3 = 0 |
| do i = 1, min(num_images(), storage_size(caf)-2) |
| var3 = iand(var3, shiftl(1, i)) |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 15 |
| if (i == this_image()) then |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 16 |
| end if |
| end do |
| end if |
| sync all |
| |
| ! AND(2) |
| caf = -1 |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = this_image(), min(num_images(), storage_size(caf)-2) |
| call atomic_and(caf[i], shiftl(1, this_image()), stat=stat) |
| if (stat /= 0) STOP 17 |
| end do |
| end if |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| var3 = -1 |
| do i = 1, min(num_images(), storage_size(caf)-2) |
| var3 = iand(var3, shiftl(1, i)) |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 18 |
| if (i == this_image()) then |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 19 |
| end if |
| end do |
| end if |
| sync all |
| |
| ! AND(3) |
| caf = 0 |
| do i = 1, storage_size(caf)-2, 2 |
| caf = shiftl(1, i) |
| var3 = shiftl(1, i) |
| end do |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = this_image(), min(num_images(), storage_size(caf)-2) |
| call atomic_and(caf[i], shiftl(1, this_image()), stat=stat) |
| if (stat /= 0) STOP 20 |
| end do |
| end if |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = 1, min(num_images(), storage_size(caf)-2) |
| var3 = iand(var3, shiftl(1, i)) |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 21 |
| if (i == this_image()) then |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 22 |
| end if |
| end do |
| end if |
| sync all |
| |
| ! OR(1) |
| caf = 0 |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = this_image(), min(num_images(), storage_size(caf)-2) |
| call atomic_or(caf[i], shiftl(1, this_image()), stat=stat) |
| if (stat /= 0) STOP 23 |
| end do |
| end if |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| var3 = 0 |
| do i = 1, min(num_images(), storage_size(caf)-2) |
| var3 = ior(var3, shiftl(1, i)) |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 24 |
| if (i == this_image()) then |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 25 |
| end if |
| end do |
| end if |
| sync all |
| |
| ! OR(2) |
| caf = -1 |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = this_image(), min(num_images(), storage_size(caf)-2) |
| call atomic_or(caf[i], shiftl(1, this_image()), stat=stat) |
| if (stat /= 0) STOP 26 |
| end do |
| end if |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| var3 = -1 |
| do i = 1, min(num_images(), storage_size(caf)-2) |
| var3 = ior(var3, shiftl(1, i)) |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 27 |
| if (i == this_image()) then |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 28 |
| end if |
| end do |
| end if |
| sync all |
| |
| ! OR(3) |
| caf = 0 |
| do i = 1, storage_size(caf)-2, 2 |
| caf = shiftl(1, i) |
| var3 = shiftl(1, i) |
| end do |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = this_image(), min(num_images(), storage_size(caf)-2) |
| call atomic_or(caf[i], shiftl(1, this_image()), stat=stat) |
| if (stat /= 0) STOP 29 |
| end do |
| end if |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = 1, min(num_images(), storage_size(caf)-2) |
| var3 = ior(var3, shiftl(1, i)) |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 30 |
| if (i == this_image()) then |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 31 |
| end if |
| end do |
| end if |
| sync all |
| |
| ! XOR(1) |
| caf = 0 |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = this_image(), min(num_images(), storage_size(caf)-2) |
| call atomic_xor(caf[i], shiftl(1, this_image()), stat=stat) |
| if (stat /= 0) STOP 32 |
| end do |
| end if |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| var3 = 0 |
| do i = 1, min(num_images(), storage_size(caf)-2) |
| var3 = ieor(var3, shiftl(1, i)) |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 33 |
| if (i == this_image()) then |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 34 |
| end if |
| end do |
| end if |
| sync all |
| |
| ! XOR(2) |
| caf = -1 |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = this_image(), min(num_images(), storage_size(caf)-2) |
| call atomic_xor(caf[i], shiftl(1, this_image()), stat=stat) |
| if (stat /= 0) STOP 35 |
| end do |
| end if |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| var3 = -1 |
| do i = 1, min(num_images(), storage_size(caf)-2) |
| var3 = ieor(var3, shiftl(1, i)) |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 36 |
| if (i == this_image()) then |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 37 |
| end if |
| end do |
| end if |
| sync all |
| |
| ! XOR(3) |
| caf = 0 |
| do i = 1, storage_size(caf)-2, 2 |
| caf = shiftl(1, i) |
| var3 = shiftl(1, i) |
| end do |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = this_image(), min(num_images(), storage_size(caf)-2) |
| call atomic_xor(caf[i], shiftl(1, this_image()), stat=stat) |
| if (stat /= 0) STOP 38 |
| end do |
| end if |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = 1, min(num_images(), storage_size(caf)-2) |
| var3 = ieor(var3, shiftl(1, i)) |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 39 |
| if (i == this_image()) then |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 40 |
| end if |
| end do |
| end if |
| sync all |
| |
| ! ADD |
| caf = 0 |
| sync all |
| var = -99 |
| call atomic_fetch_add(caf, this_image(), var, stat=stat) |
| if (stat /= 0 .or. var < 0) STOP 41 |
| if (num_images() == 1 .and. var /= 0) STOP 42 |
| do i = 1, num_images() |
| var = -99 |
| call atomic_fetch_add(caf[i], 1, var, stat=stat) |
| if (stat /= 0 .or. var < 0) STOP 43 |
| call atomic_ref(var, caf, stat=stat) |
| if (stat /= 0 .or. var < this_image()) STOP 44 |
| end do |
| sync all |
| |
| call atomic_ref(var, caf[num_images()], stat=stat) |
| if (stat /= 0 .or. var /= num_images() + this_image()) STOP 45 |
| do i = 1, num_images() |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= num_images() + i) STOP 46 |
| end do |
| sync all |
| |
| |
| ! AND(1) |
| caf = 0 |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = this_image(), min(num_images(), storage_size(caf)-2) |
| var = 99 |
| call atomic_fetch_and(caf[i], shiftl(1, this_image()), var, stat=stat) |
| if (stat /= 0 .or. var /= 0) STOP 47 |
| end do |
| end if |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| var3 = 0 |
| do i = 1, min(num_images(), storage_size(caf)-2) |
| var3 = iand(var3, shiftl(1, i)) |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 48 |
| if (i == this_image()) then |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 49 |
| end if |
| end do |
| end if |
| sync all |
| |
| ! AND(2) |
| caf = -1 |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = this_image(), min(num_images(), storage_size(caf)-2) |
| var = -99 |
| call atomic_fetch_and(caf[i], shiftl(1, this_image()), var, stat=stat) |
| if (stat /= 0 .or. var == shiftl(1, this_image())) STOP 50 |
| end do |
| end if |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| var3 = -1 |
| do i = 1, min(num_images(), storage_size(caf)-2) |
| var3 = iand(var3, shiftl(1, i)) |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 51 |
| if (i == this_image()) then |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 52 |
| end if |
| end do |
| end if |
| sync all |
| |
| ! AND(3) |
| caf = 0 |
| var3 = 0 |
| do i = 1, storage_size(caf)-2, 2 |
| caf = ior(shiftl(1, i), caf) |
| var3 = ior(shiftl(1, i), var3) |
| end do |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = this_image(), min(num_images(), storage_size(caf)-2) |
| var = -99 |
| call atomic_fetch_and(caf[i], shiftl(1, this_image()), var, stat=stat) |
| if (stat /= 0 .or. var <= 0) STOP 53 |
| end do |
| end if |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = 1, min(num_images(), storage_size(caf)-2) |
| var3 = iand(var3, shiftl(1, i)) |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 54 |
| if (i == this_image()) then |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 55 |
| end if |
| end do |
| end if |
| sync all |
| |
| |
| |
| ! OR(1) |
| caf = 0 |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = this_image(), min(num_images(), storage_size(caf)-2) |
| var = -99 |
| call atomic_fetch_or(caf[i], shiftl(1, this_image()), var, stat=stat) |
| if (stat /= 0 .or. var < 0 .or. var == shiftl(1, this_image())) STOP 56 |
| end do |
| end if |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| var3 = 0 |
| do i = 1, min(num_images(), storage_size(caf)-2) |
| var3 = ior(var3, shiftl(1, i)) |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 57 |
| if (i == this_image()) then |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 58 |
| end if |
| end do |
| end if |
| sync all |
| |
| ! OR(2) |
| caf = -1 |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = this_image(), min(num_images(), storage_size(caf)-2) |
| var = -99 |
| call atomic_fetch_or(caf[i], shiftl(1, this_image()), var, stat=stat) |
| if (stat /= 0 .or. (var < 0 .and. var /= -1)) STOP 59 |
| end do |
| end if |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| var3 = -1 |
| do i = 1, min(num_images(), storage_size(caf)-2) |
| var3 = ior(var3, shiftl(1, i)) |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 60 |
| if (i == this_image()) then |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 61 |
| end if |
| end do |
| end if |
| sync all |
| |
| ! OR(3) |
| caf = 0 |
| var3 = 0 |
| do i = 1, storage_size(caf)-2, 2 |
| caf = ior(shiftl(1, i), caf) |
| var3 = ior(shiftl(1, i), var3) |
| end do |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = this_image(), min(num_images(), storage_size(caf)-2) |
| var = -99 |
| call atomic_fetch_or(caf[i], shiftl(1, this_image()), var, stat=stat) |
| if (stat /= 0 .or. var <= 0) STOP 62 |
| end do |
| end if |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = 1, min(num_images(), storage_size(caf)-2) |
| var3 = ior(var3, shiftl(1, i)) |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 63 |
| if (i == this_image()) then |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 64 |
| end if |
| end do |
| end if |
| sync all |
| |
| |
| ! XOR(1) |
| caf = 0 |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = this_image(), min(num_images(), storage_size(caf)-2) |
| var = -99 |
| call atomic_fetch_xor(caf[i], shiftl(1, this_image()), var, stat=stat) |
| if (stat /= 0 .or. var < 0 .or. var == shiftl(1, this_image())) STOP 65 |
| end do |
| end if |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| var3 = 0 |
| do i = 1, min(num_images(), storage_size(caf)-2) |
| var3 = ieor(var3, shiftl(1, i)) |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 66 |
| if (i == this_image()) then |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 67 |
| end if |
| end do |
| end if |
| sync all |
| |
| ! XOR(2) |
| caf = -1 |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = this_image(), min(num_images(), storage_size(caf)-2) |
| var = -99 |
| call atomic_fetch_xor(caf[i], shiftl(1, this_image()), var, stat=stat) |
| if (stat /= 0 .or. (var < 0 .and. var /= -1)) STOP 68 |
| end do |
| end if |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| var3 = -1 |
| do i = 1, min(num_images(), storage_size(caf)-2) |
| var3 = ieor(var3, shiftl(1, i)) |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 69 |
| if (i == this_image()) then |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 70 |
| end if |
| end do |
| end if |
| sync all |
| |
| ! XOR(3) |
| caf = 0 |
| var3 = 0 |
| do i = 1, storage_size(caf)-2, 2 |
| caf = ior(shiftl(1, i), caf) |
| var3 = ior(shiftl(1, i), var3) |
| end do |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = this_image(), min(num_images(), storage_size(caf)-2) |
| var = -99 |
| call atomic_fetch_xor(caf[i], shiftl(1, this_image()), var, stat=stat) |
| if (stat /= 0 .or. var <= 0) STOP 71 |
| end do |
| end if |
| sync all |
| |
| if (this_image() < storage_size(caf)-2) then |
| do i = 1, min(num_images(), storage_size(caf)-2) |
| var3 = ieor(var3, shiftl(1, i)) |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 72 |
| if (i == this_image()) then |
| call atomic_ref(var, caf[i], stat=stat) |
| if (stat /= 0 .or. var /= var3) STOP 73 |
| end if |
| end do |
| end if |
| sync all |
| |
| ! CAS |
| caf = 9 |
| caf_log = .true. |
| sync all |
| |
| if (this_image() == 1) then |
| call atomic_cas(caf[num_images()], compare=5, new=3, old=var, stat=stat) |
| if (stat /= 0 .or. var /= 9) STOP 74 |
| call atomic_ref(var, caf[num_images()], stat=stat) |
| if (stat /= 0 .or. var /= 9) STOP 75 |
| end if |
| sync all |
| |
| if (this_image() == num_images() .and. caf /= 9) STOP 76 |
| call atomic_ref(var, caf[num_images()], stat=stat) |
| if (stat /= 0 .or. var /= 9) STOP 77 |
| sync all |
| |
| if (this_image() == 1) then |
| call atomic_cas(caf[num_images()], compare=9, new=3, old=var, stat=stat) |
| if (stat /= 0 .or. var /= 9) STOP 78 |
| call atomic_ref(var, caf[num_images()], stat=stat) |
| if (stat /= 0 .or. var /= 3) STOP 79 |
| end if |
| sync all |
| |
| if (this_image() == num_images() .and. caf /= 3) STOP 80 |
| call atomic_ref(var, caf[num_images()], stat=stat) |
| if (stat /= 0 .or. var /= 3) STOP 81 |
| sync all |
| |
| |
| if (this_image() == 1) then |
| call atomic_cas(caf_log[num_images()], compare=.false., new=.false., old=var2, stat=stat) |
| if (stat /= 0 .or. var2 .neqv. .true.) STOP 82 |
| call atomic_ref(var2, caf_log[num_images()], stat=stat) |
| if (stat /= 0 .or. var2 .neqv. .true.) STOP 83 |
| end if |
| sync all |
| |
| if (this_image() == num_images() .and. caf_log .neqv. .true.) STOP 84 |
| call atomic_ref(var2, caf_log[num_images()], stat=stat) |
| if (stat /= 0 .or. var2 .neqv. .true.) STOP 85 |
| sync all |
| |
| if (this_image() == 1) then |
| call atomic_cas(caf_log[num_images()], compare=.true., new=.false., old=var2, stat=stat) |
| if (stat /= 0 .or. var2 .neqv. .true.) STOP 86 |
| call atomic_ref(var2, caf_log[num_images()], stat=stat) |
| if (stat /= 0 .or. var2 .neqv. .false.) STOP 87 |
| end if |
| sync all |
| |
| if (this_image() == num_images() .and. caf_log .neqv. .false.) STOP 88 |
| call atomic_ref(var2, caf_log[num_images()], stat=stat) |
| if (stat /= 0 .or. var2 .neqv. .false.) STOP 89 |
| end |