Mess up the "kernel" float trig function .c files with ifdefs so that
they can be #included in other .c files to give inline functions, and use them to inline the functions in most callers (not in e_lgammaf_r.c). __kernel_tanf() is too large and complicated for gcc to inline very well. An athlons, this gives a speed increase under favourable pipeline conditions of about 10% overall (larger for AXP, smaller for A64). E.g., on AXP, sinf() on uniformly distributed args in [-2Pi, 2Pi] now takes 30-56 cycles; it used to take 45-61 cycles; hardware fsin takes 65-129.
This commit is contained in:
parent
9e5e0f978e
commit
4ce5120952
@ -14,9 +14,11 @@
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
#ifndef INLINE_KERNEL_COSF
|
||||
#ifndef lint
|
||||
static char rcsid[] = "$FreeBSD$";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "math.h"
|
||||
#include "math_private.h"
|
||||
@ -28,6 +30,9 @@ C1 = 0xaaaaa5.0p-28, /* 0.041666645557 */
|
||||
C2 = -0xb60615.0p-33, /* -0.0013887310633 */
|
||||
C3 = 0xccf47d.0p-39; /* 0.000024432542887 */
|
||||
|
||||
#ifdef INLINE_KERNEL_COSF
|
||||
extern inline
|
||||
#endif
|
||||
float
|
||||
__kernel_cosf(float x, float y)
|
||||
{
|
||||
|
@ -14,9 +14,11 @@
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
#ifndef INLINE_KERNEL_SINF
|
||||
#ifndef lint
|
||||
static char rcsid[] = "$FreeBSD$";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "math.h"
|
||||
#include "math_private.h"
|
||||
@ -29,6 +31,9 @@ S2 = 0x8888bb.0p-30, /* 0.0083333803341 */
|
||||
S3 = -0xd02de1.0p-36, /* -0.00019853517006 */
|
||||
S4 = 0xbe6dbe.0p-42; /* 0.0000028376084629 */
|
||||
|
||||
#ifdef INLINE_KERNEL_SINF
|
||||
extern inline
|
||||
#endif
|
||||
float
|
||||
__kernel_sinf(float x, float y, int iy)
|
||||
{
|
||||
|
@ -12,9 +12,11 @@
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
#ifndef INLINE_KERNEL_TANF
|
||||
#ifndef lint
|
||||
static char rcsid[] = "$FreeBSD$";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "math.h"
|
||||
#include "math_private.h"
|
||||
@ -32,6 +34,9 @@ T[] = {
|
||||
0xeaf97e.0p-31, /* 0.0071708550677 */
|
||||
};
|
||||
|
||||
#ifdef INLINE_KERNEL_TANF
|
||||
extern inline
|
||||
#endif
|
||||
float
|
||||
__kernel_tanf(float x, float y, int iy)
|
||||
{
|
||||
|
@ -18,7 +18,11 @@ static char rcsid[] = "$FreeBSD$";
|
||||
#endif
|
||||
|
||||
#include "math.h"
|
||||
#define INLINE_KERNEL_COSF
|
||||
#define INLINE_KERNEL_SINF
|
||||
#include "math_private.h"
|
||||
#include "k_cosf.c"
|
||||
#include "k_sinf.c"
|
||||
|
||||
/* Small multiples of pi/2 rounded to double precision. */
|
||||
static const double
|
||||
|
@ -18,7 +18,11 @@ static char rcsid[] = "$FreeBSD$";
|
||||
#endif
|
||||
|
||||
#include "math.h"
|
||||
#define INLINE_KERNEL_COSF
|
||||
#define INLINE_KERNEL_SINF
|
||||
#include "math_private.h"
|
||||
#include "k_cosf.c"
|
||||
#include "k_sinf.c"
|
||||
|
||||
/* Small multiples of pi/2 rounded to double precision. */
|
||||
static const double
|
||||
|
@ -18,7 +18,9 @@ static char rcsid[] = "$FreeBSD$";
|
||||
#endif
|
||||
|
||||
#include "math.h"
|
||||
#define INLINE_KERNEL_TANF
|
||||
#include "math_private.h"
|
||||
#include "k_tanf.c"
|
||||
|
||||
/* Small multiples of pi/2 rounded to double precision. */
|
||||
static const double
|
||||
|
Loading…
Reference in New Issue
Block a user