(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
aarch64/
vsub_f64.c
       1  /* Test vsub works correctly.  */
       2  /* { dg-do run } */
       3  /* { dg-options "--save-temps" } */
       4  
       5  #include <arm_neon.h>
       6  
       7  #define TESTA0 1
       8  #define TESTA1 0.2223
       9  #define TESTA2 0
      10  #define TESTA3 -0.76544
      11  /* 2^54, double has 53 significand bits
      12     according to Double-precision floating-point format.  */
      13  #define TESTA4 18014398509481984
      14  #define TESTA5 2.0
      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 (1.0 / TESTA4)
      22  
      23  #define ANSW0 0.33333
      24  #define ANSW1 -1.7777
      25  #define ANSW2 0
      26  #define ANSW3 1.23456
      27  #define ANSW4 TESTA4
      28  #define ANSW5 2.0
      29  
      30  extern void abort (void);
      31  
      32  #define EPSILON __DBL_EPSILON__
      33  #define ISNAN(a) __builtin_isnan (a)
      34  /* FP_equals is implemented like this to execute subtraction
      35     exectly once during a single test run.  */
      36  #define FP_equals(a, b, epsilon)		\
      37  (						\
      38   ((a) == (b))					\
      39   || (ISNAN (a) && ISNAN (b))			\
      40   || (((a > b) && (a < (b + epsilon)))		\
      41       || ((b > a) && (b < (a + epsilon))))	\
      42  )
      43  
      44  #define TEST(N)					\
      45  int						\
      46  test_vsub_f64_##N ()				\
      47  {						\
      48    float64x1_t a = { TESTA##N };			\
      49    float64x1_t b = { TESTB##N };			\
      50    float64x1_t c = { ANSW##N };			\
      51  						\
      52    a = vsub_f64 (a, b);				\
      53    return !FP_equals (a[0], c[0], EPSILON);	\
      54  }
      55  
      56  TEST (0)
      57  TEST (1)
      58  TEST (2)
      59  TEST (3)
      60  TEST (4)
      61  TEST (5)
      62  
      63  /* { dg-final { scan-assembler-times "fsub\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 6 } } */
      64  
      65  int
      66  main (int argc, char **argv)
      67  {
      68    if (test_vsub_f64_0 ())
      69      abort ();
      70    if (test_vsub_f64_1 ())
      71      abort ();
      72    if (test_vsub_f64_2 ())
      73      abort ();
      74    if (test_vsub_f64_3 ())
      75      abort ();
      76    if (test_vsub_f64_4 ())
      77      abort ();
      78    if (test_vsub_f64_5 ())
      79      abort ();
      80  
      81    return 0;
      82  }
      83