/* { dg-do run } */
|
/* { dg-do run } */
|
/* { dg-options "-O2 -fno-math-errno -fno-trapping-math -msse2 -mfpmath=sse" } */
|
/* { dg-options "-O2 -fno-math-errno -fno-trapping-math -msse2 -mfpmath=sse" } */
|
/* { dg-require-effective-target sse2 } */
|
/* { dg-require-effective-target sse2 } */
|
|
|
#include "sse2-check.h"
|
#include "sse2-check.h"
|
|
|
double x[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
|
double x[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
|
-0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023, /* +-DBL_MAX */
|
-0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023, /* +-DBL_MAX */
|
-0x1p-52, 0x1p-52, /* +-DBL_EPSILON */
|
-0x1p-52, 0x1p-52, /* +-DBL_EPSILON */
|
/* nextafter/before 0.5, 1.0 and 1.5 */
|
/* nextafter/before 0.5, 1.0 and 1.5 */
|
0x1.0000000000001p-1, 0x1.fffffffffffffp-2,
|
0x1.0000000000001p-1, 0x1.fffffffffffffp-2,
|
0x1.0000000000001p+0, 0x1.fffffffffffffp-1,
|
0x1.0000000000001p+0, 0x1.fffffffffffffp-1,
|
0x1.8000000000001p+0, 0x1.7ffffffffffffp+0,
|
0x1.8000000000001p+0, 0x1.7ffffffffffffp+0,
|
-0.0, 0.0, -0.5, 0.5, -1.0, 1.0, -1.5, 1.5, -2.0, 2.0,
|
-0.0, 0.0, -0.5, 0.5, -1.0, 1.0, -1.5, 1.5, -2.0, 2.0,
|
-2.5, 2.5 };
|
-2.5, 2.5 };
|
#define NUM (sizeof(x)/sizeof(double))
|
#define NUM (sizeof(x)/sizeof(double))
|
|
|
double expect_round[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
|
double expect_round[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
|
-0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
|
-0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
|
-0.0, 0.0,
|
-0.0, 0.0,
|
1.0, 0.0, 1.0, 1.0, 2.0, 1.0,
|
1.0, 0.0, 1.0, 1.0, 2.0, 1.0,
|
-0.0, 0.0, -1.0, 1.0, -1.0, 1.0, -2.0, 2.0, -2.0, 2.0,
|
-0.0, 0.0, -1.0, 1.0, -1.0, 1.0, -2.0, 2.0, -2.0, 2.0,
|
-3.0, 3.0 };
|
-3.0, 3.0 };
|
|
|
double expect_rint[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
|
double expect_rint[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
|
-0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
|
-0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
|
-0.0, 0.0,
|
-0.0, 0.0,
|
1.0, 0.0, 1.0, 1.0, 2.0, 1.0,
|
1.0, 0.0, 1.0, 1.0, 2.0, 1.0,
|
-0.0, 0.0, -0.0, 0.0, -1.0, 1.0, -2.0, 2.0, -2.0, 2.0,
|
-0.0, 0.0, -0.0, 0.0, -1.0, 1.0, -2.0, 2.0, -2.0, 2.0,
|
-2.0, 2.0 };
|
-2.0, 2.0 };
|
|
|
double expect_floor[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
|
double expect_floor[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
|
-0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
|
-0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
|
-1.0, 0.0,
|
-1.0, 0.0,
|
0.0, 0.0, 1.0, 0.0, 1.0, 1.0,
|
0.0, 0.0, 1.0, 0.0, 1.0, 1.0,
|
-0.0, 0.0, -1.0, 0.0, -1.0, 1.0, -2.0, 1.0, -2.0, 2.0,
|
-0.0, 0.0, -1.0, 0.0, -1.0, 1.0, -2.0, 1.0, -2.0, 2.0,
|
-3.0, 2.0 };
|
-3.0, 2.0 };
|
|
|
double expect_ceil[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
|
double expect_ceil[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
|
-0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
|
-0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
|
-0.0, 1.0,
|
-0.0, 1.0,
|
1.0, 1.0, 2.0, 1.0, 2.0, 2.0,
|
1.0, 1.0, 2.0, 1.0, 2.0, 2.0,
|
-0.0, 0.0, -0.0, 1.0, -1.0, 1.0, -1.0, 2.0, -2.0, 2.0,
|
-0.0, 0.0, -0.0, 1.0, -1.0, 1.0, -1.0, 2.0, -2.0, 2.0,
|
-2.0, 3.0 };
|
-2.0, 3.0 };
|
|
|
double expect_trunc[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
|
double expect_trunc[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
|
-0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
|
-0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
|
-0.0, 0.0,
|
-0.0, 0.0,
|
0.0, 0.0, 1.0, 0.0, 1.0, 1.0,
|
0.0, 0.0, 1.0, 0.0, 1.0, 1.0,
|
-0.0, 0.0, -0.0, 0.0, -1.0, 1.0, -1.0, 1.0, -2.0, 2.0,
|
-0.0, 0.0, -0.0, 0.0, -1.0, 1.0, -1.0, 1.0, -2.0, 2.0,
|
-2.0, 2.0 };
|
-2.0, 2.0 };
|
|
|
|
|
#define CHECK(fn) \
|
#define CHECK(fn) \
|
void check_ ## fn (void) \
|
void check_ ## fn (void) \
|
{ \
|
{ \
|
int i; \
|
int i; \
|
for (i = 0; i < NUM; ++i) \
|
for (i = 0; i < NUM; ++i) \
|
{ \
|
{ \
|
double res = __builtin_ ## fn (x[i]); \
|
double res = __builtin_ ## fn (x[i]); \
|
if (__builtin_memcmp (&res, &expect_ ## fn [i], sizeof(double)) != 0) \
|
if (__builtin_memcmp (&res, &expect_ ## fn [i], sizeof(double)) != 0) \
|
printf( # fn " [%i]: %.18e %.18e\n", i, expect_ ## fn [i], res), abort (); \
|
printf( # fn " [%i]: %.18e %.18e\n", i, expect_ ## fn [i], res), abort (); \
|
} \
|
} \
|
}
|
}
|
|
|
CHECK(round)
|
CHECK(round)
|
CHECK(rint)
|
CHECK(rint)
|
CHECK(floor)
|
CHECK(floor)
|
CHECK(ceil)
|
CHECK(ceil)
|
CHECK(trunc)
|
CHECK(trunc)
|
|
|
static void
|
static void
|
sse2_test (void)
|
sse2_test (void)
|
{
|
{
|
check_round ();
|
check_round ();
|
check_rint ();
|
check_rint ();
|
check_floor ();
|
check_floor ();
|
check_ceil ();
|
check_ceil ();
|
check_trunc ();
|
check_trunc ();
|
}
|
}
|
|
|