|  | ! { dg-do run } | 
|  | ! { dg-additional-options "-msse2" { target sse2_runtime } } | 
|  | ! { dg-additional-options "-mavx" { target avx_runtime } } | 
|  |  | 
|  | module SIMD5_mod | 
|  | contains | 
|  | subroutine work( a, b, c,  n ) | 
|  | implicit none | 
|  | integer :: i,j,n | 
|  | double precision :: a(n,n), b(n,n), c(n,n), tmp | 
|  |  | 
|  | !$omp do simd collapse(2) private(tmp) | 
|  | do j = 1,n | 
|  | do i = 1,n | 
|  | tmp = a(i,j) + b(i,j) | 
|  | c(i,j) = tmp | 
|  | end do | 
|  | end do | 
|  |  | 
|  | end subroutine work | 
|  |  | 
|  | subroutine work_ref( a, b, c,  n ) | 
|  | implicit none | 
|  | integer :: i,j,n | 
|  | double precision :: a(n,n), b(n,n), c(n,n), tmp | 
|  |  | 
|  | do j = 1,n | 
|  | do i = 1,n | 
|  | tmp = a(i,j) + b(i,j) | 
|  | c(i,j) = tmp | 
|  | end do | 
|  | end do | 
|  |  | 
|  | end subroutine work_ref | 
|  |  | 
|  | subroutine init (a, b, n) | 
|  | integer :: i,j,n,s | 
|  | double precision :: a(n,n), b(n,n) | 
|  |  | 
|  | s = -1 | 
|  |  | 
|  | do j = 1,n | 
|  | do i = 1,n | 
|  | a(i,j) = i*j*s | 
|  | b(i,j) = i+j | 
|  | s = -s | 
|  | end do | 
|  | end do | 
|  |  | 
|  | end subroutine | 
|  |  | 
|  | subroutine check (a, b, n) | 
|  | integer :: i, j, n | 
|  | double precision, parameter :: EPS = 0.0000000000000001 | 
|  | double precision :: diff, a(n,n), b(n,n) | 
|  | do j = 1, n | 
|  | do i = 1, n | 
|  | diff = a(i,j) - b(i,j) | 
|  | if (diff > EPS .or. -diff > EPS) stop 1 | 
|  | end do | 
|  | end do | 
|  | end subroutine | 
|  |  | 
|  | end module | 
|  |  | 
|  | program SIMD5 | 
|  | use SIMD5_mod | 
|  | double precision, dimension(32, 32) :: a, b, c, c_ref | 
|  |  | 
|  | call  init(a, b, 32) | 
|  |  | 
|  | call  work(a, b, c, 32) | 
|  | call  work_ref(a, b, c_ref, 32) | 
|  |  | 
|  | call check(c, c_ref, 32) | 
|  | end program |