299d193437
From-SVN: r26430
51 lines
917 B
C
51 lines
917 B
C
/* This tests for a bug in regstack that was breaking glibc's math library. */
|
|
|
|
extern void abort (void);
|
|
|
|
static __inline double
|
|
minus_zero (void)
|
|
{
|
|
union { double __d; int __i[2]; } __x;
|
|
__x.__i[0] = 0x0;
|
|
__x.__i[1] = 0x80000000;
|
|
return __x.__d;
|
|
}
|
|
|
|
static __inline long double
|
|
__atan2l (long double __y, long double __x)
|
|
{
|
|
register long double __value;
|
|
__asm __volatile__ ("fpatan\n\t"
|
|
: "=t" (__value)
|
|
: "0" (__x), "u" (__y)
|
|
: "st(1)");
|
|
return __value;
|
|
}
|
|
|
|
static __inline long double
|
|
__sqrtl (long double __x)
|
|
{
|
|
register long double __result;
|
|
__asm __volatile__ ("fsqrt" : "=t" (__result) : "0" (__x));
|
|
return __result;
|
|
}
|
|
|
|
static __inline double
|
|
asin (double __x)
|
|
{
|
|
return __atan2l (__x, __sqrtl (1.0 - __x * __x));
|
|
}
|
|
|
|
int
|
|
main (void)
|
|
{
|
|
double x;
|
|
|
|
x = minus_zero();
|
|
x = asin (x);
|
|
|
|
if (x != 0.0) /* actually -0.0, but 0.0 == -0.0 */
|
|
abort ();
|
|
return 0;
|
|
}
|