| #ifndef ALPHA_MATH_PRIVATE_H |
| #define ALPHA_MATH_PRIVATE_H 1 |
| |
| /* In bits/mathinline.h we define __isnan et al. |
| In sysdeps/alpha/fpu/s_isnan.c we move the identifier out of the way |
| via macro hackery. In both cases, tell math/math_private.h that |
| we have a local copy of the function. */ |
| |
| #ifndef __isnan |
| # define __isnan __isnan |
| #endif |
| #ifndef __isnanf |
| # define __isnanf __isnanf |
| #endif |
| |
| /* Generic code forces values to memory; we don't need to do that. */ |
| #define math_opt_barrier(x) \ |
| ({ __typeof (x) __x = (x); __asm ("" : "+frm" (__x)); __x; }) |
| #define math_force_eval(x) \ |
| ({ __typeof (x) __x = (x); __asm __volatile__ ("" : : "frm" (__x)); }) |
| |
| #include_next <math_private.h> |
| |
| #ifdef __alpha_fix__ |
| extern __always_inline double |
| __ieee754_sqrt (double d) |
| { |
| double ret; |
| # ifdef _IEEE_FP_INEXACT |
| asm ("sqrtt/suid %1,%0" : "=&f"(ret) : "f"(d)); |
| # else |
| asm ("sqrtt/sud %1,%0" : "=&f"(ret) : "f"(d)); |
| # endif |
| return ret; |
| } |
| |
| extern __always_inline float |
| __ieee754_sqrtf (float d) |
| { |
| float ret; |
| # ifdef _IEEE_FP_INEXACT |
| asm ("sqrts/suid %1,%0" : "=&f"(ret) : "f"(d)); |
| # else |
| asm ("sqrts/sud %1,%0" : "=&f"(ret) : "f"(d)); |
| # endif |
| return ret; |
| } |
| #endif /* FIX */ |
| |
| #endif /* ALPHA_MATH_PRIVATE_H */ |