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
7double 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	-0.0, 0.0, -0.5, 0.5, -1.0, 1.0, -1.5, 1.5, -2.0, 2.0,
15	-2.5, 2.5 };
16#define NUM (sizeof(x)/sizeof(double))
17
18double expect_round[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
19	-0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
20	-0.0, 0.0,
21	1.0, 0.0, 1.0, 1.0, 2.0, 1.0,
22	-0.0, 0.0, -1.0, 1.0, -1.0, 1.0, -2.0, 2.0, -2.0, 2.0,
23	-3.0, 3.0 };
24
25double expect_rint[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
26        -0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
27        -0.0, 0.0,
28        1.0, 0.0, 1.0, 1.0, 2.0, 1.0,
29        -0.0, 0.0, -0.0, 0.0, -1.0, 1.0, -2.0, 2.0, -2.0, 2.0,
30        -2.0, 2.0 };
31
32double expect_floor[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
33        -0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
34        -1.0, 0.0,
35        0.0, 0.0, 1.0, 0.0, 1.0, 1.0,
36        -0.0, 0.0, -1.0, 0.0, -1.0, 1.0, -2.0, 1.0, -2.0, 2.0,
37        -3.0, 2.0 };
38
39double expect_ceil[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
40        -0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
41        -0.0, 1.0,
42        1.0, 1.0, 2.0, 1.0, 2.0, 2.0,
43        -0.0, 0.0, -0.0, 1.0, -1.0, 1.0, -1.0, 2.0, -2.0, 2.0,
44        -2.0, 3.0 };
45
46double expect_trunc[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
47        -0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
48        -0.0, 0.0,
49        0.0, 0.0, 1.0, 0.0, 1.0, 1.0,
50        -0.0, 0.0, -0.0, 0.0, -1.0, 1.0, -1.0, 1.0, -2.0, 2.0,
51        -2.0, 2.0 };
52
53
54#define CHECK(fn) \
55void check_ ## fn (void) \
56{ \
57  int i; \
58  for (i = 0; i < NUM; ++i) \
59    { \
60      double res = __builtin_ ## fn (x[i]); \
61      if (__builtin_memcmp (&res, &expect_ ## fn [i], sizeof(double)) != 0) \
62        printf( # fn " [%i]: %.18e %.18e\n", i, expect_ ## fn [i], res), abort (); \
63    } \
64}
65
66CHECK(round)
67CHECK(rint)
68CHECK(floor)
69CHECK(ceil)
70CHECK(trunc)
71
72static void
73sse2_test (void)
74{
75  check_round ();
76  check_rint ();
77  check_floor ();
78  check_ceil ();
79  check_trunc ();
80}
81