blob: 045bd2f709a665c916b59b7bcde21e8014698ef7 [file] [log] [blame]
#include <stdio.h>
#include <math.h>
// test copysign of 0
int __attribute__((noinline,noclone))
copysign_bug (double x)
{
if (x != 0.0 && (x * 0.5 == x)) {
printf("1\n");
return 1;
}
printf("f: %f\n", x);
if (__builtin_copysign(1.0, x) < 0.0) {
printf("2\n");
return 2;
} else {
printf("3\n");
return 3;
}
}
int main() {
#define TEST(x, y) printf("%.2f, %.2f ==> %.2f\n", x, y, copysign(x, y));
TEST(5.0f, 5.0f);
TEST(5.0f, -5.0f);
TEST(-5.0f, 5.0f);
TEST(-5.0f, -5.0f);
TEST(5.0f, 4.0f);
TEST(5.0f, -4.0f);
TEST(-5.0f, 4.0f);
TEST(-5.0f, -4.0f);
TEST(0.0f, 5.0f);
TEST(0.0f, -5.0f);
TEST(-0.0f, 5.0f);
TEST(-0.0f, -5.0f);
TEST(5.0f, 0.0f);
TEST(5.0f, -0.0f);
TEST(-5.0f, 0.0f);
TEST(-5.0f, -0.0f);
TEST(0.0f, 0.0f);
TEST(0.0f, -0.0f);
TEST(-0.0f, 0.0f);
TEST(-0.0f, -0.0f);
double x = -0.0;
if (copysign_bug (x) != 2)
__builtin_abort ();
return 0;
}