(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
s390/
vector/
vec-copysign-execute.c
       1  /* { dg-do run } */
       2  /* { dg-options "-O2 -ftree-vectorize -mzarch -march=z13" } */
       3  
       4  #include <math.h>
       5  #include <assert.h>
       6  
       7  #define N 20
       8  
       9  double a[N] = {-0.1, -3.2, -6.3, -9.4, -12.5, -15.6, -18.7, -21.8, 24.9,
      10      27.1, 30.2, 33.3, 36.4, 39.5, 42.6, nan("123"), __DBL_MIN__ / 2.0,
      11      -nan ("1"), __DBL_MAX__ * 2.0, -__DBL_MAX__ * 1e199};
      12  double b[N] = {-1.2, 3.4, -5.6, 7.8, -9.0, 1.0, -2.0, 3.0, -4.0, -5.0, 6.0,
      13      7.0, -8.0, -9.0, 10.0, -11.0, -1., 0., -0., 1.3};
      14  double r[N];
      15  double r2[N];
      16  
      17  void
      18  foo (void)
      19  {
      20    for (int i = 0; i < N; i++)
      21      r[i] = copysign (a[i], b[i]);
      22  }
      23  
      24  __attribute__((optimize("no-tree-vectorize")))
      25  void
      26  check (void)
      27  {
      28    for (int i = 0; i < N; i++)
      29      {
      30        r2[i] = copysign (a[i], b[i]);
      31        assert (r[i] == r2[i]
      32  	      || (isnan (r[i]) && isnan (r2[i])
      33  		  && signbit (r[i]) == signbit (r2[i])));
      34      }
      35  }
      36  
      37  float af[N] = {-0.1, -3.2, -6.3, -9.4, -12.5, -15.6, -18.7, -21.8, 24.9,
      38      27.1, 30.2, 33.3, 36.4, 39.5, 42.6, nan("123"), __DBL_MIN__ / 2.0,
      39      -nan ("1"), __DBL_MAX__ * 2.0, -__DBL_MAX__ * 1e199};
      40  float bf[N] = {-1.2, 3.4, -5.6, 7.8, -9.0, 1.0, -2.0, 3.0, -4.0, -5.0, 6.0,
      41      7.0, -8.0, -9.0, 10.0, -11.0, -1., 0., -0., 1.3};
      42  float rf[N];
      43  float rf2[N];
      44  
      45  __attribute__ ((__target__ ("arch=z14")))
      46  void
      47  foof (void)
      48  {
      49    for (int i = 0; i < N; i++)
      50      rf[i] = copysignf (af[i], bf[i]);
      51  }
      52  
      53  __attribute__((optimize("no-tree-vectorize")))
      54  void
      55  checkf (void)
      56  {
      57    for (int i = 0; i < N; i++)
      58      {
      59        rf2[i] = copysignf (af[i], bf[i]);
      60        assert (rf[i] == rf2[i]
      61  	      || (isnan (rf[i]) && isnan (rf2[i])
      62  		  && signbit (rf[i]) == signbit (rf2[i])));
      63      }
      64  }
      65  
      66  int main()
      67  {
      68    foo ();
      69    check ();
      70  
      71    foof ();
      72    checkf ();
      73    return r[0];
      74  }