1  /* This tests for a bug in regstack that was breaking glibc's math library. */
       2  /* { dg-skip-if "" { ! { i?86-*-* x86_64-*-* } } } */
       3  
       4  extern void abort (void);
       5  
       6  static __inline double
       7  minus_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  
      15  static __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  
      26  static __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  
      34  static __inline double
      35  asin (double __x)
      36  {
      37    return __atan2l (__x, __sqrtl (1.0 - __x * __x));
      38  }
      39  
      40  int
      41  main (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  }