diff options
Diffstat (limited to 'REORG.TODO/sysdeps/alpha/fpu/math_private.h')
-rw-r--r-- | REORG.TODO/sysdeps/alpha/fpu/math_private.h | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/REORG.TODO/sysdeps/alpha/fpu/math_private.h b/REORG.TODO/sysdeps/alpha/fpu/math_private.h new file mode 100644 index 0000000000..1e97c867c3 --- /dev/null +++ b/REORG.TODO/sysdeps/alpha/fpu/math_private.h @@ -0,0 +1,50 @@ +#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 */ |