1  /* Test vadd works correctly.  */
       2  /* { dg-do run } */
       3  /* { dg-options "--save-temps" } */
       4  
       5  #include <arm_neon.h>
       6  
       7  #define TESTA0 0.33333
       8  #define TESTA1 -1.7777
       9  #define TESTA2 0
      10  #define TESTA3 1.23456
      11  /* 2^54, double has 53 significand bits
      12     according to Double-precision floating-point format.  */
      13  #define TESTA4 18014398509481984
      14  #define TESTA5 (1.0 / TESTA4)
      15  
      16  #define TESTB0 0.66667
      17  #define TESTB1 2
      18  #define TESTB2 0
      19  #define TESTB3 -2
      20  #define TESTB4 1.0
      21  #define TESTB5 2.0
      22  
      23  #define ANSW0 1
      24  #define ANSW1 0.2223
      25  #define ANSW2 0
      26  #define ANSW3 -0.76544
      27  #define ANSW4 TESTA4
      28  #define ANSW5 2.0
      29  
      30  extern void abort (void);
      31  
      32  #define EPSILON __DBL_EPSILON__
      33  #define ABS(a) __builtin_fabs (a)
      34  #define ISNAN(a) __builtin_isnan (a)
      35  #define FP_equals(a, b, epsilon)			\
      36    (							\
      37     ((a) == (b))						\
      38      || (ISNAN (a) && ISNAN (b))				\
      39      || (ABS (a - b) < epsilon)				\
      40     )
      41  
      42  #define TEST(N)					\
      43  int						\
      44  test_vadd_f64_##N ()				\
      45  {						\
      46    float64x1_t a = { TESTA##N };			\
      47    float64x1_t b = { TESTB##N };			\
      48    float64x1_t c = { ANSW##N };			\
      49  						\
      50    a = vadd_f64 (a, b);				\
      51    return !FP_equals (a[0], c[0], EPSILON);	\
      52  }
      53  
      54  TEST (0)
      55  TEST (1)
      56  TEST (2)
      57  TEST (3)
      58  TEST (4)
      59  TEST (5)
      60  
      61  /* { dg-final { scan-assembler-times "fadd\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 6 } } */
      62  
      63  int
      64  main (int argc, char **argv)
      65  {
      66    if (test_vadd_f64_0 ())
      67      abort ();
      68    if (test_vadd_f64_1 ())
      69      abort ();
      70    if (test_vadd_f64_2 ())
      71      abort ();
      72    if (test_vadd_f64_3 ())
      73      abort ();
      74    if (test_vadd_f64_4 ())
      75      abort ();
      76    if (test_vadd_f64_5 ())
      77      abort ();
      78  
      79    return 0;
      80  }
      81