1  /* { dg-do run } */
       2  /* { dg-options "-O2 -fno-math-errno -fno-trapping-math -msse2 -mfpmath=sse" } */
       3  /* { dg-require-effective-target sse2 } */
       4  
       5  #include "sse2-check.h"
       6  
       7  double x[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
       8  	-0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,  /* +-DBL_MAX */
       9  	-0x1p-52, 0x1p-52,				    /* +-DBL_EPSILON */
      10  	/* nextafter/before 0.5, 1.0 and 1.5 */
      11  	0x1.0000000000001p-1, 0x1.fffffffffffffp-2,
      12  	0x1.0000000000001p+0, 0x1.fffffffffffffp-1,
      13  	0x1.8000000000001p+0, 0x1.7ffffffffffffp+0,
      14  	-0x1.0000000000001p-1, -0x1.fffffffffffffp-2,
      15  	-0x1.0000000000001p+0, -0x1.fffffffffffffp-1,
      16  	-0x1.8000000000001p+0, -0x1.7ffffffffffffp+0,
      17  	-0.0, 0.0, -0.5, 0.5, -1.0, 1.0, -1.5, 1.5, -2.0, 2.0,
      18  	-2.5, 2.5 };
      19  #define NUM (sizeof(x)/sizeof(double))
      20  
      21  double expect_round[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
      22  	-0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
      23  	-0.0, 0.0,
      24  	1.0, 0.0, 1.0, 1.0, 2.0, 1.0,
      25  	-1.0, -0.0, -1.0, -1.0, -2.0, -1.0,
      26  	-0.0, 0.0, -1.0, 1.0, -1.0, 1.0, -2.0, 2.0, -2.0, 2.0,
      27  	-3.0, 3.0 };
      28  
      29  double expect_rint[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
      30          -0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
      31          -0.0, 0.0,
      32          1.0, 0.0, 1.0, 1.0, 2.0, 1.0,
      33          -1.0, -0.0, -1.0, -1.0, -2.0, -1.0,
      34          -0.0, 0.0, -0.0, 0.0, -1.0, 1.0, -2.0, 2.0, -2.0, 2.0,
      35          -2.0, 2.0 };
      36  
      37  double expect_floor[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
      38          -0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
      39          -1.0, 0.0,
      40          0.0, 0.0, 1.0, 0.0, 1.0, 1.0,
      41          -1.0, -1.0, -2.0, -1.0, -2.0, -2.0,
      42          -0.0, 0.0, -1.0, 0.0, -1.0, 1.0, -2.0, 1.0, -2.0, 2.0,
      43          -3.0, 2.0 };
      44  
      45  double expect_ceil[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
      46          -0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
      47          -0.0, 1.0,
      48          1.0, 1.0, 2.0, 1.0, 2.0, 2.0,
      49          -0.0, -0.0, -1.0, -0.0, -1.0, -1.0,
      50          -0.0, 0.0, -0.0, 1.0, -1.0, 1.0, -1.0, 2.0, -2.0, 2.0,
      51          -2.0, 3.0 };
      52  
      53  double expect_trunc[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
      54          -0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
      55          -0.0, 0.0,
      56          0.0, 0.0, 1.0, 0.0, 1.0, 1.0,
      57          -0.0, -0.0, -1.0, -0.0, -1.0, -1.0,
      58          -0.0, 0.0, -0.0, 0.0, -1.0, 1.0, -1.0, 1.0, -2.0, 2.0,
      59          -2.0, 2.0 };
      60  
      61  
      62  #define CHECK(fn) \
      63  void check_ ## fn (void) \
      64  { \
      65    int i; \
      66    for (i = 0; i < NUM; ++i) \
      67      { \
      68        double res = __builtin_ ## fn (x[i]); \
      69        if (__builtin_memcmp (&res, &expect_ ## fn [i], sizeof(double)) != 0) \
      70          printf( # fn " [%i]: %.18e %.18e\n", i, expect_ ## fn [i], res), abort (); \
      71      } \
      72  }
      73  
      74  CHECK(round)
      75  CHECK(rint)
      76  CHECK(floor)
      77  CHECK(ceil)
      78  CHECK(trunc)
      79  
      80  static void
      81  sse2_test (void)
      82  {
      83    check_round ();
      84    check_rint ();
      85    check_floor ();
      86    check_ceil ();
      87    check_trunc ();
      88  }