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)
CHECK(rint)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 }
89