blob: 27fb9ca4ed7a7abcc21549dea32c24d2ffdca3f4 [file] [log] [blame]
/* { dg-do run } */
/* { dg-options "-O2 --save-temps" } */
double fabs (double);
double
check (double x, double y)
{
return __builtin_copysign (x, y);
}
double
check1 (double x)
{
return __builtin_copysign (x, 1.0);
}
double
check2 (double x)
{
return __builtin_copysign (1.0, x);
}
double
check3 (double x)
{
return -__builtin_copysign (x, 1.0);
}
double
check4 (double x, double y)
{
return x * __builtin_copysign (x, y);
}
double
check5 (double x, double y)
{
return __builtin_copysign (-x, -y);
}
int
main (int argc, char** argv)
{
double x = 2.0;
double y = -5.0;
double epsilon = 0.00001;
double expected = -2.0;
if (fabs (check (x, y) - expected) >= epsilon)
__builtin_abort ();
expected = 2.0;
if (fabs (check1 (x) - expected) >= epsilon)
__builtin_abort ();
expected = 1.0;
if (fabs (check2 (x) - expected) >= epsilon)
__builtin_abort ();
expected = -2.0;
if (fabs (check3 (x) - expected) >= epsilon)
__builtin_abort ();
expected = -4.0;
if (fabs (check4 (x, y) - expected) >= epsilon)
__builtin_abort ();
expected = 2.0;
if (fabs (check5 (x, y) - expected) >= epsilon)
__builtin_abort ();
}
/* { dg-final { scan-assembler-not "copysign\tw" } } */