Skip to content

Commit

Permalink
* sysdeps/alpha/fpu/s_ceil.c: Rewrite without branches.
Browse files Browse the repository at this point in the history
* sysdeps/alpha/fpu/s_ceilf.c: Likewise. 
* sysdeps/alpha/fpu/s_floor.c: Likewise. 
* sysdeps/alpha/fpu/s_floorf.c: Likewise. 
* sysdeps/alpha/fpu/s_rint.c: Likewise. 
* sysdeps/alpha/fpu/s_rintf.c: Likewise.
	* sysdeps/alpha/fpu/s_fmax.S: New file.
	* sysdeps/alpha/fpu/s_fmaxf.S: New file.
	* sysdeps/alpha/fpu/s_fmin.S: New file.
	* sysdeps/alpha/fpu/s_fminf.S: New file.
	* sysdeps/alpha/fpu/s_isnan.c: New file.
	* sysdeps/alpha/fpu/s_isnanf.c: New file.
	* sysdeps/alpha/fpu/s_llrint.c: New file.
	* sysdeps/alpha/fpu/s_llrintf.c: New file.
	* sysdeps/alpha/fpu/s_lrint.c: New file.
	* sysdeps/alpha/fpu/s_lrintf.c: New file.
	* sysdeps/alpha/fpu/s_nearbyint.c: New file.
	* sysdeps/alpha/fpu/s_nearbyintf.c: New file.

	* sysdeps/alpha/fpu/bits/mathinline.h (__floorf, __floor): Remove.
	(__fdimf, fdimf, __fdim, fdim): Remove.
	(__signbitf, __signbit, __signbitl): Use gcc builtin if available.
	(__isnanf, __isnan, __isnanl): New.
2007-03-14  Richard Henderson  <rth@redhat.com>

	* sysdeps/alpha/fpu/s_ceil.c: Rewrite without branches.
	* sysdeps/alpha/fpu/s_ceilf.c: Likewise.
	* sysdeps/alpha/fpu/s_floor.c: Likewise.
	* sysdeps/alpha/fpu/s_floorf.c: Likewise.
	* sysdeps/alpha/fpu/s_rint.c: Likewise.
	* sysdeps/alpha/fpu/s_rintf.c: Likewise.

	* sysdeps/alpha/fpu/s_fmax.S: New file.
	* sysdeps/alpha/fpu/s_fmaxf.S: New file.
	* sysdeps/alpha/fpu/s_fmin.S: New file.
	* sysdeps/alpha/fpu/s_fminf.S: New file.
	* sysdeps/alpha/fpu/s_isnan.c: New file.
	* sysdeps/alpha/fpu/s_isnanf.c: New file.
	* sysdeps/alpha/fpu/s_llrint.c: New file.
	* sysdeps/alpha/fpu/s_llrintf.c: New file.
	* sysdeps/alpha/fpu/s_lrint.c: New file.
	* sysdeps/alpha/fpu/s_lrintf.c: New file.
	* sysdeps/alpha/fpu/s_nearbyint.c: New file.
	* sysdeps/alpha/fpu/s_nearbyintf.c: New file.

	* sysdeps/alpha/fpu/bits/mathinline.h (__floorf, __floor): Remove.
	(__fdimf, fdimf, __fdim, fdim): Remove.
	(__signbitf, __signbit, __signbitl): Use gcc builtin if available.
	(__isnanf, __isnan, __isnanl): New.
  • Loading branch information
Richard Henderson committed Mar 14, 2007
1 parent 9e43b50 commit aea1d19
Show file tree
Hide file tree
Showing 20 changed files with 484 additions and 201 deletions.
27 changes: 27 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,30 @@
2007-03-14 Richard Henderson <rth@redhat.com>

* sysdeps/alpha/fpu/s_ceil.c: Rewrite without branches.
* sysdeps/alpha/fpu/s_ceilf.c: Likewise.
* sysdeps/alpha/fpu/s_floor.c: Likewise.
* sysdeps/alpha/fpu/s_floorf.c: Likewise.
* sysdeps/alpha/fpu/s_rint.c: Likewise.
* sysdeps/alpha/fpu/s_rintf.c: Likewise.

* sysdeps/alpha/fpu/s_fmax.S: New file.
* sysdeps/alpha/fpu/s_fmaxf.S: New file.
* sysdeps/alpha/fpu/s_fmin.S: New file.
* sysdeps/alpha/fpu/s_fminf.S: New file.
* sysdeps/alpha/fpu/s_isnan.c: New file.
* sysdeps/alpha/fpu/s_isnanf.c: New file.
* sysdeps/alpha/fpu/s_llrint.c: New file.
* sysdeps/alpha/fpu/s_llrintf.c: New file.
* sysdeps/alpha/fpu/s_lrint.c: New file.
* sysdeps/alpha/fpu/s_lrintf.c: New file.
* sysdeps/alpha/fpu/s_nearbyint.c: New file.
* sysdeps/alpha/fpu/s_nearbyintf.c: New file.

* sysdeps/alpha/fpu/bits/mathinline.h (__floorf, __floor): Remove.
(__fdimf, fdimf, __fdim, fdim): Remove.
(__signbitf, __signbit, __signbitl): Use gcc builtin if available.
(__isnanf, __isnan, __isnanl): New.

2007-03-13 Richard Henderson <rth@redhat.com>

* sysdeps/ieee754/ldbl-128/Makefile: New file.
Expand Down
112 changes: 33 additions & 79 deletions sysdeps/alpha/fpu/bits/mathinline.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/* Inline math functions for Alpha.
Copyright (C) 1996, 1997, 1999-2001, 2004 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1999-2001, 2004, 2007
Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David Mosberger-Tang.
Expand Down Expand Up @@ -83,111 +84,64 @@ __inline_fabs (fabs, double)
# undef __inline_fabs
#endif


/* Use the -inf rounding mode conversion instructions to implement
floor. We note when the exponent is large enough that the value
must be integral, as this avoids unpleasant integer overflows. */

__MATH_INLINE float
__NTH (__floorf (float __x))
{
/* Check not zero since floor(-0) == -0. */
if (__x != 0 && fabsf (__x) < 16777216.0f) /* 1 << FLT_MANT_DIG */
{
/* Note that Alpha S_Floating is stored in registers in a
restricted T_Floating format, so we don't even need to
convert back to S_Floating in the end. The initial
conversion to T_Floating is needed to handle denormals. */

float __tmp1, __tmp2;

__asm ("cvtst/s %3,%2\n\t"
#ifdef _IEEE_FP_INEXACT
"cvttq/svim %2,%1\n\t"
#else
"cvttq/svm %2,%1\n\t"
#endif
"cvtqt/m %1,%0\n\t"
: "=f"(__x), "=&f"(__tmp1), "=&f"(__tmp2)
: "f"(__x));
}
return __x;
}

__MATH_INLINE double
__NTH (__floor (double __x))
{
if (__x != 0 && fabs (__x) < 9007199254740992.0) /* 1 << DBL_MANT_DIG */
{
double __tmp1;
__asm (
#ifdef _IEEE_FP_INEXACT
"cvttq/svim %2,%1\n\t"
#else
"cvttq/svm %2,%1\n\t"
#endif
"cvtqt/m %1,%0\n\t"
: "=f"(__x), "=&f"(__tmp1)
: "f"(__x));
}
return __x;
}

__MATH_INLINE float __NTH (floorf (float __x)) { return __floorf(__x); }
__MATH_INLINE double __NTH (floor (double __x)) { return __floor(__x); }


#ifdef __USE_ISOC99

__MATH_INLINE float
__NTH (__fdimf (float __x, float __y))
{
return __x <= __y ? 0.0f : __x - __y;
}

__MATH_INLINE float
__NTH (fdimf (float __x, float __y))
{
return __x <= __y ? 0.0f : __x - __y;
}

__MATH_INLINE double
__NTH (__fdim (double __x, double __y))
{
return __x <= __y ? 0.0 : __x - __y;
}

__MATH_INLINE double
__NTH (fdim (double __x, double __y))
{
return __x <= __y ? 0.0 : __x - __y;
}

/* Test for negative number. Used in the signbit() macro. */
__MATH_INLINE int
__NTH (__signbitf (float __x))
{
#if !__GNUC_PREREQ (4, 0)
__extension__ union { float __f; int __i; } __u = { __f: __x };
return __u.__i < 0;
#else
return __builtin_signbitf (__x);
#endif
}

__MATH_INLINE int
__NTH (__signbit (double __x))
{
#if !__GNUC_PREREQ (4, 0)
__extension__ union { double __d; long __i; } __u = { __d: __x };
return __u.__i < 0;
#else
return __builtin_signbit (__x);
#endif
}

__MATH_INLINE int
__NTH (__signbitl (long double __x))
{
#if !__GNUC_PREREQ (4, 0)
__extension__ union {
long double __d;
long __i[sizeof(long double)/sizeof(long)];
} __u = { __d: __x };
return __u.__i[sizeof(long double)/sizeof(long) - 1] < 0;
#else
return __builtin_signbitl (__x);
#endif
}

/* Test for NaN. Used in the isnan() macro. */

__MATH_INLINE int
__NTH (__isnanf (float __x))
{
return isunordered (__x, __x);
}

__MATH_INLINE int
__NTH (__isnan (double __x))
{
return isunordered (__x, __x);
}

__MATH_INLINE int
__NTH (__isnanl (long double __x))
{
return isunordered (__x, __x);
}
#endif /* C99 */

#endif /* __NO_MATH_INLINES */
29 changes: 12 additions & 17 deletions sysdeps/alpha/fpu/s_ceil.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright (C) 1998, 2000, 2006 Free Software Foundation, Inc.
/* Copyright (C) 1998, 2000, 2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Richard Henderson.
Expand Down Expand Up @@ -27,25 +27,20 @@
double
__ceil (double x)
{
if (isless (fabs (x), 9007199254740992.0)) /* 1 << DBL_MANT_DIG */
{
double tmp1, new_x;

new_x = -x;
__asm (
double two52 = copysign (0x1.0p52, x);
double r, tmp;

__asm (
#ifdef _IEEE_FP_INEXACT
"cvttq/svim %2,%1\n\t"
"addt/suim %2, %3, %1\n\tsubt/suim %1, %3, %0"
#else
"cvttq/svm %2,%1\n\t"
"addt/sum %2, %3, %1\n\tsubt/sum %1, %3, %0"
#endif
"cvtqt/m %1,%0\n\t"
: "=f"(new_x), "=&f"(tmp1)
: "f"(new_x));

/* Fix up the negation we did above, as well as handling -0 properly. */
x = copysign(new_x, x);
}
return x;
: "=&f"(r), "=&f"(tmp)
: "f"(-x), "f"(-two52));

/* Fix up the negation we did above, as well as handling -0 properly. */
return copysign (r, x);
}

weak_alias (__ceil, ceil)
Expand Down
34 changes: 12 additions & 22 deletions sysdeps/alpha/fpu/s_ceilf.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright (C) 1998, 2000 Free Software Foundation, Inc.
/* Copyright (C) 1998, 2000, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Richard Henderson.
Expand Down Expand Up @@ -26,30 +26,20 @@
float
__ceilf (float x)
{
if (isless (fabsf (x), 16777216.0f)) /* 1 << FLT_MANT_DIG */
{
/* Note that Alpha S_Floating is stored in registers in a
restricted T_Floating format, so we don't even need to
convert back to S_Floating in the end. The initial
conversion to T_Floating is needed to handle denormals. */

float tmp1, tmp2, new_x;

new_x = -x;
__asm ("cvtst/s %3,%2\n\t"
float two23 = copysignf (0x1.0p23, x);
float r, tmp;

__asm (
#ifdef _IEEE_FP_INEXACT
"cvttq/svim %2,%1\n\t"
"adds/suim %2, %3, %1\n\tsubs/suim %1, %3, %0"
#else
"cvttq/svm %2,%1\n\t"
"adds/sum %2, %3, %1\n\tsubs/sum %1, %3, %0"
#endif
"cvtqt/m %1,%0\n\t"
: "=f"(new_x), "=&f"(tmp1), "=&f"(tmp2)
: "f"(new_x));

/* Fix up the negation we did above, as well as handling -0 properly. */
x = copysignf(new_x, x);
}
return x;
: "=&f"(r), "=&f"(tmp)
: "f"(-x), "f"(-two23));

/* Fix up the negation we did above, as well as handling -0 properly. */
return copysignf (r, x);
}

weak_alias (__ceilf, ceilf)
30 changes: 13 additions & 17 deletions sysdeps/alpha/fpu/s_floor.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright (C) 1998, 1999, 2000, 2006 Free Software Foundation, Inc.
/* Copyright (C) 1998, 1999, 2000, 2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Richard Henderson.
Expand Down Expand Up @@ -28,25 +28,21 @@
double
__floor (double x)
{
if (isless (fabs (x), 9007199254740992.0)) /* 1 << DBL_MANT_DIG */
{
double tmp1, new_x;

__asm (
double two52 = copysign (0x1.0p52, x);
double r, tmp;

__asm (
#ifdef _IEEE_FP_INEXACT
"cvttq/svim %2,%1\n\t"
"addt/suim %2, %3, %1\n\tsubt/suim %1, %3, %0"
#else
"cvttq/svm %2,%1\n\t"
"addt/sum %2, %3, %1\n\tsubt/sum %1, %3, %0"
#endif
"cvtqt/m %1,%0\n\t"
: "=f"(new_x), "=&f"(tmp1)
: "f"(x));

/* floor(-0) == -0, and in general we'll always have the same
sign as our input. */
x = copysign(new_x, x);
}
return x;
: "=&f"(r), "=&f"(tmp)
: "f"(x), "f"(two52));

/* floor(-0) == -0, and in general we'll always have the same
sign as our input. */
return copysign (r, x);
}

weak_alias (__floor, floor)
Expand Down
35 changes: 13 additions & 22 deletions sysdeps/alpha/fpu/s_floorf.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
/* Copyright (C) 1998, 1999, 2000, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Richard Henderson.
Expand Down Expand Up @@ -27,30 +27,21 @@
float
__floorf (float x)
{
if (isless (fabsf (x), 16777216.0f)) /* 1 << FLT_MANT_DIG */
{
/* Note that Alpha S_Floating is stored in registers in a
restricted T_Floating format, so we don't even need to
convert back to S_Floating in the end. The initial
conversion to T_Floating is needed to handle denormals. */

float tmp1, tmp2, new_x;

__asm ("cvtst/s %3,%2\n\t"
float two23 = copysignf (0x1.0p23, x);
float r, tmp;

__asm (
#ifdef _IEEE_FP_INEXACT
"cvttq/svim %2,%1\n\t"
"adds/suim %2, %3, %1\n\tsubs/suim %1, %3, %0"
#else
"cvttq/svm %2,%1\n\t"
"adds/sum %2, %3, %1\n\tsubs/sum %1, %3, %0"
#endif
"cvtqt/m %1,%0\n\t"
: "=f"(new_x), "=&f"(tmp1), "=&f"(tmp2)
: "f"(x));

/* floor(-0) == -0, and in general we'll always have the same
sign as our input. */
x = copysignf(new_x, x);
}
return x;
: "=&f"(r), "=&f"(tmp)
: "f"(x), "f"(two23));

/* floor(-0) == -0, and in general we'll always have the same
sign as our input. */
return copysignf (r, x);
}

weak_alias (__floorf, floorf)
Loading

0 comments on commit aea1d19

Please sign in to comment.