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