summaryrefslogtreecommitdiffstats
path: root/lib/msun/src
diff options
context:
space:
mode:
Diffstat (limited to 'lib/msun/src')
-rw-r--r--lib/msun/src/e_rem_pio2f.c19
-rw-r--r--lib/msun/src/math_private.h2
-rw-r--r--lib/msun/src/s_cosf.c12
-rw-r--r--lib/msun/src/s_sinf.c12
-rw-r--r--lib/msun/src/s_tanf.c6
5 files changed, 24 insertions, 27 deletions
diff --git a/lib/msun/src/e_rem_pio2f.c b/lib/msun/src/e_rem_pio2f.c
index 2cc4669..4c6ffc8 100644
--- a/lib/msun/src/e_rem_pio2f.c
+++ b/lib/msun/src/e_rem_pio2f.c
@@ -19,8 +19,8 @@ __FBSDID("$FreeBSD$");
/* __ieee754_rem_pio2f(x,y)
*
- * return the remainder of x rem pi/2 in y[0]+y[1]
- * use double precision internally
+ * return the remainder of x rem pi/2 in *y
+ * use double precision for everything except passing x
* use __kernel_rem_pio2() for large x
*/
@@ -42,10 +42,10 @@ pio2_1 = 1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */
pio2_1t = 6.07710050650619224932e-11; /* 0x3DD0B461, 0x1A626331 */
int
-__ieee754_rem_pio2f(float x, float *y)
+__ieee754_rem_pio2f(float x, double *y)
{
double w,r,fn;
- double tx[1],ty[1];
+ double tx[1];
float z;
int32_t e0,n,ix,hx;
@@ -63,23 +63,20 @@ __ieee754_rem_pio2f(float x, float *y)
#endif
r = x-fn*pio2_1;
w = fn*pio2_1t;
- y[0] = r-w;
- y[1] = (r-y[0])-w;
+ *y = r-w;
return n;
}
/*
* all other (large) arguments
*/
if(ix>=0x7f800000) { /* x is inf or NaN */
- y[0]=y[1]=x-x; return 0;
+ *y=x-x; return 0;
}
/* set z = scalbn(|x|,ilogb(|x|)-23) */
e0 = (ix>>23)-150; /* e0 = ilogb(|x|)-23; */
SET_FLOAT_WORD(z, ix - ((int32_t)(e0<<23)));
tx[0] = z;
- n = __kernel_rem_pio2(tx,ty,e0,1,0);
- y[0] = ty[0];
- y[1] = ty[0] - y[0];
- if(hx<0) {y[0] = -y[0]; y[1] = -y[1]; return -n;}
+ n = __kernel_rem_pio2(tx,y,e0,1,0);
+ if(hx<0) {*y = -*y; return -n;}
return n;
}
diff --git a/lib/msun/src/math_private.h b/lib/msun/src/math_private.h
index 27c14bd..1d3b7a1 100644
--- a/lib/msun/src/math_private.h
+++ b/lib/msun/src/math_private.h
@@ -320,7 +320,7 @@ double __kernel_cos(double,double);
double __kernel_tan(double,double,int);
/* float precision kernel functions */
-int __ieee754_rem_pio2f(float,float*);
+int __ieee754_rem_pio2f(float,double*);
float __kernel_sindf(double);
float __kernel_cosdf(double);
float __kernel_tandf(double,int);
diff --git a/lib/msun/src/s_cosf.c b/lib/msun/src/s_cosf.c
index 2d65ee9..3a3b891 100644
--- a/lib/msun/src/s_cosf.c
+++ b/lib/msun/src/s_cosf.c
@@ -34,7 +34,7 @@ c4pio2 = 4*M_PI_2; /* 0x401921FB, 0x54442D18 */
float
cosf(float x)
{
- float y[2];
+ double y;
int32_t n, hx, ix;
GET_FLOAT_WORD(hx,x);
@@ -71,13 +71,13 @@ cosf(float x)
/* general argument reduction needed */
else {
- n = __ieee754_rem_pio2f(x,y);
+ n = __ieee754_rem_pio2f(x,&y);
switch(n&3) {
- case 0: return __kernel_cosdf((double)y[0]+y[1]);
- case 1: return __kernel_sindf(-(double)y[0]-y[1]);
- case 2: return -__kernel_cosdf((double)y[0]+y[1]);
+ case 0: return __kernel_cosdf(y);
+ case 1: return __kernel_sindf(-y);
+ case 2: return -__kernel_cosdf(y);
default:
- return __kernel_sindf((double)y[0]+y[1]);
+ return __kernel_sindf(y);
}
}
}
diff --git a/lib/msun/src/s_sinf.c b/lib/msun/src/s_sinf.c
index 5da246e..69fb384 100644
--- a/lib/msun/src/s_sinf.c
+++ b/lib/msun/src/s_sinf.c
@@ -34,7 +34,7 @@ s4pio2 = 4*M_PI_2; /* 0x401921FB, 0x54442D18 */
float
sinf(float x)
{
- float y[2];
+ double y;
int32_t n, hx, ix;
GET_FLOAT_WORD(hx,x);
@@ -69,13 +69,13 @@ sinf(float x)
/* general argument reduction needed */
else {
- n = __ieee754_rem_pio2f(x,y);
+ n = __ieee754_rem_pio2f(x,&y);
switch(n&3) {
- case 0: return __kernel_sindf((double)y[0]+y[1]);
- case 1: return __kernel_cosdf((double)y[0]+y[1]);
- case 2: return __kernel_sindf(-(double)y[0]-y[1]);
+ case 0: return __kernel_sindf(y);
+ case 1: return __kernel_cosdf(y);
+ case 2: return __kernel_sindf(-y);
default:
- return -__kernel_cosdf((double)y[0]+y[1]);
+ return -__kernel_cosdf(y);
}
}
}
diff --git a/lib/msun/src/s_tanf.c b/lib/msun/src/s_tanf.c
index 24f73a7..3d8ee47 100644
--- a/lib/msun/src/s_tanf.c
+++ b/lib/msun/src/s_tanf.c
@@ -32,7 +32,7 @@ t4pio2 = 4*M_PI_2; /* 0x401921FB, 0x54442D18 */
float
tanf(float x)
{
- float y[2];
+ double y;
int32_t n, hx, ix;
GET_FLOAT_WORD(hx,x);
@@ -61,8 +61,8 @@ tanf(float x)
/* general argument reduction needed */
else {
- n = __ieee754_rem_pio2f(x,y);
+ n = __ieee754_rem_pio2f(x,&y);
/* integer parameter: 1 -- n even; -1 -- n odd */
- return __kernel_tandf((double)y[0]+y[1],1-((n&1)<<1));
+ return __kernel_tandf(y,1-((n&1)<<1));
}
}
OpenPOWER on IntegriCloud