alpha: Use dynamic rounding with sqrt insn

This commit is contained in:
Richard Henderson 2012-05-30 15:49:01 -07:00
parent 6863adc8f9
commit 268f6dda11
4 changed files with 37 additions and 6 deletions

View file

@ -1,5 +1,10 @@
2012-05-30 Richard Henderson <rth@twiddle.net>
* sysdeps/alpha/alphaev6/fpu/e_sqrt.S: Use dynamic rounding.
* sysdeps/alpha/alphaev6/fpu/e_sqrtf.S: Likewise.
* sysdeps/alpha/fpu/math_private.h (__ieee754_sqrt): New.
(__ieee754_sqrtf): New.
* sysdeps/unix/sysv/linux/alpha/nptl/pthread_once.c: Replace
_internal alias by hidden_def.

View file

@ -1,4 +1,4 @@
/* Copyright (C) 2000 Free Software Foundation, Inc.
/* Copyright (C) 2000-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -33,9 +33,9 @@ ENTRY(__ieee754_sqrt)
.align 4
#ifdef _IEEE_FP_INEXACT
sqrtt/sui $f16, $f0
sqrtt/suid $f16, $f0
#else
sqrtt/su $f16, $f0
sqrtt/sud $f16, $f0
#endif
ret
nop

View file

@ -1,4 +1,4 @@
/* Copyright (C) 2000 Free Software Foundation, Inc.
/* Copyright (C) 2000-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -33,9 +33,9 @@ ENTRY(__ieee754_sqrtf)
.align 4
#ifdef _IEEE_FP_INEXACT
sqrts/sui $f16, $f0
sqrts/suid $f16, $f0
#else
sqrts/su $f16, $f0
sqrts/sud $f16, $f0
#endif
ret
nop

View file

@ -18,4 +18,30 @@
#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 */