(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c/
examples-4/
simd-4.c
       1  /* { dg-do run } */
       2  /* { dg-additional-options "-msse2" { target sse2_runtime } } */
       3  /* { dg-additional-options "-mavx" { target avx_runtime } } */
       4  
       5  #define N 128
       6  #define M 16
       7  #define EPS 0.0000000000000001
       8  #define SAFELEN 16
       9  
      10  #include <stdlib.h>
      11  
      12  void init(double *a, double *b, int n)
      13  {
      14    int i, s = -1;
      15    for ( i = 0; i < n; i++ )
      16    {
      17      a[i] = i*i*s;
      18      b[i] = a[i];
      19      s = -s;
      20    }
      21  }
      22  
      23  void work( double *b, int n, int m )
      24  {
      25     int i;
      26     #pragma omp simd safelen(SAFELEN)
      27     for (i = m; i < n; i++)
      28        b[i] = b[i-m] - 1.0f;
      29  }
      30  
      31  void work_ref( double *b, int n, int m )
      32  {
      33     int i;
      34     for (i = m; i < n; i++)
      35        b[i] = b[i-m] - 1.0f;
      36  }
      37  
      38  void check (double *a, double *b)
      39  {
      40    int i;
      41    for (i = 0; i < N; i++)
      42      if (a[i] - b[i] > EPS || b[i] - a[i] > EPS)
      43        abort ();
      44  }
      45  
      46  int main ()
      47  {
      48    double b[N], b_ref[N];
      49  
      50    init(b, b_ref, N);
      51  
      52    work(b, N, M);
      53    work(b_ref, N, M);
      54  
      55    check(b, b_ref);
      56  
      57    return 0;
      58  }