1/* This tests for a bug in regstack that was breaking glibc's math library. */
2/* { dg-skip-if "" { ! { i?86-*-* x86_64-*-* } } { "*" } { "" } } */
3
4extern void abort (void);
5
6static __inline double
7minus_zero (void)
8{
9  union { double __d; int __i[2]; } __x;
10  __x.__i[0] = 0x0;
11  __x.__i[1] = 0x80000000;
12  return __x.__d;
13}
14
15static __inline long double
16__atan2l (long double __y, long double __x)
17{
18  register long double __value;
19  __asm __volatile__ ("fpatan\n\t"
20		      : "=t" (__value)
21		      : "0" (__x), "u" (__y)
22		      : "st(1)");
23  return __value;
24}
25
26static __inline long double
27__sqrtl (long double __x)
28{
29  register long double __result;
30  __asm __volatile__ ("fsqrt" : "=t" (__result) : "0" (__x));
31  return __result;
32}
33
34static __inline double
35asin (double __x)
36{
37  return __atan2l (__x, __sqrtl (1.0 - __x * __x));
38}
39
40int
41main (void)
42{
43  double x;
44
45  x = minus_zero();
46  x = asin (x);
47
48  if (x != 0.0) /* actually -0.0, but 0.0 == -0.0 */
49    abort ();
50  return 0;
51}
52