aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/libgomp/testsuite/libgomp.fortran/simd2.f90
blob: 9b90bcdd019bccc96b02c50a1f1d9df2af2593e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
! { dg-do run }
! { dg-additional-options "-msse2" { target sse2_runtime } }
! { dg-additional-options "-mavx" { target avx_runtime } }

  integer :: a(1024), b(1024), k, m, i, s, t
  k = 4
  m = 2
  t = 1
  do i = 1, 1024
    a(i) = i - 513
    b(i) = modulo (i - 52, 39)
    if (i.lt.52.and.b(i).ne.0) b(i) = b(i) - 39
  end do
  s = foo (b)
  do i = 1, 1024
    if (a(i).ne.((i - 513) * b(i))) call abort
    if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
      if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort
    else
      if (b(i).ne.(modulo (i - 52, 39))) call abort
    end if
    a(i) = i - 513
  end do
  if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort
  k = 4
  m = 2
  t = 1
  s = bar (b)
  do i = 1, 1024
    if (a(i).ne.((i - 513) * b(i))) call abort
    if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
      if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort
    else
      if (b(i).ne.(modulo (i - 52, 39))) call abort
    end if
    a(i) = i - 513
  end do
  if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort
  k = 4
  m = 2
  t = 1
  s = baz (b)
  do i = 1, 1024
    if (a(i).ne.((i - 513) * b(i))) call abort
    if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
      if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort
    else
      if (b(i).ne.(modulo (i - 52, 39))) call abort
    end if
  end do
  if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort
contains
  function foo (p)
    integer :: p(1024), u, v, i, s, foo
    s = 0
    !$omp simd linear(k : m + 1) reduction(+: s) lastprivate(u, v)
    do i = 1, 1024
      a(i) = a(i) * p(i)
      u = p(i) + k
      k = k + m + 1
      v = p(i) + k
      s = s + p(i) + k
    end do
    !$omp end simd
    if (i.ne.1025) call abort
    if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort
    foo = s
  end function foo
  function bar (p)
    integer :: p(1024), u, v, i, s, bar
    s = 0
    !$omp simd linear(k : m + 1) reduction(+: s) lastprivate(u, v)
    do i = 1, 1024, t
      a(i) = a(i) * p(i)
      u = p(i) + k
      k = k + m + 1
      v = p(i) + k
      s = s + p(i) + k
    end do
    !$omp end simd
    if (i.ne.1025) call abort
    if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort
    bar = s
  end function bar
  function baz (p)
    integer :: p(1024), u, v, i, s, baz
    s = 0
    !$omp simd linear(k : m + 1) reduction(+: s) lastprivate(u, v) &
    !$omp & linear(i : t)
    do i = 1, 1024, t
      a(i) = a(i) * p(i)
      u = p(i) + k
      k = k + m + 1
      v = p(i) + k
      s = s + p(i) + k
    end do
    if (i.ne.1025) call abort
    if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort
    baz = s
  end function baz
end