Fix namespace issues in sinf, cosf and sincosf
Use const sincos_t for clarity instead of making the typedef const. Use __inv_pi4 and __sincosf_table to avoid namespace issues with static linking.
This commit is contained in:
parent
2805b07fa1
commit
138575c9b9
@ -43,7 +43,7 @@ cosf (float y)
|
|||||||
double x = y;
|
double x = y;
|
||||||
double s;
|
double s;
|
||||||
int n;
|
int n;
|
||||||
sincos_t *p = &sincosf_table[0];
|
const sincos_t *p = &__sincosf_table[0];
|
||||||
|
|
||||||
if (abstop12 (y) < abstop12 (pio4))
|
if (abstop12 (y) < abstop12 (pio4))
|
||||||
{
|
{
|
||||||
@ -62,7 +62,7 @@ cosf (float y)
|
|||||||
s = p->sign[n & 3];
|
s = p->sign[n & 3];
|
||||||
|
|
||||||
if (n & 2)
|
if (n & 2)
|
||||||
p = &sincosf_table[1];
|
p = &__sincosf_table[1];
|
||||||
|
|
||||||
return sinf_poly (x * s, x * x, p, n ^ 1);
|
return sinf_poly (x * s, x * x, p, n ^ 1);
|
||||||
}
|
}
|
||||||
@ -77,7 +77,7 @@ cosf (float y)
|
|||||||
s = p->sign[(n + sign) & 3];
|
s = p->sign[(n + sign) & 3];
|
||||||
|
|
||||||
if ((n + sign) & 2)
|
if ((n + sign) & 2)
|
||||||
p = &sincosf_table[1];
|
p = &__sincosf_table[1];
|
||||||
|
|
||||||
return sinf_poly (x * s, x * x, p, n ^ 1);
|
return sinf_poly (x * s, x * x, p, n ^ 1);
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,7 @@ sincosf (float y, float *sinp, float *cosp)
|
|||||||
double x = y;
|
double x = y;
|
||||||
double s;
|
double s;
|
||||||
int n;
|
int n;
|
||||||
sincos_t *p = &sincosf_table[0];
|
const sincos_t *p = &__sincosf_table[0];
|
||||||
|
|
||||||
if (abstop12 (y) < abstop12 (pio4))
|
if (abstop12 (y) < abstop12 (pio4))
|
||||||
{
|
{
|
||||||
@ -69,7 +69,7 @@ sincosf (float y, float *sinp, float *cosp)
|
|||||||
s = p->sign[n & 3];
|
s = p->sign[n & 3];
|
||||||
|
|
||||||
if (n & 2)
|
if (n & 2)
|
||||||
p = &sincosf_table[1];
|
p = &__sincosf_table[1];
|
||||||
|
|
||||||
sincosf_poly (x * s, x * x, p, n, sinp, cosp);
|
sincosf_poly (x * s, x * x, p, n, sinp, cosp);
|
||||||
}
|
}
|
||||||
@ -84,7 +84,7 @@ sincosf (float y, float *sinp, float *cosp)
|
|||||||
s = p->sign[(n + sign) & 3];
|
s = p->sign[(n + sign) & 3];
|
||||||
|
|
||||||
if ((n + sign) & 2)
|
if ((n + sign) & 2)
|
||||||
p = &sincosf_table[1];
|
p = &__sincosf_table[1];
|
||||||
|
|
||||||
sincosf_poly (x * s, x * x, p, n, sinp, cosp);
|
sincosf_poly (x * s, x * x, p, n, sinp, cosp);
|
||||||
}
|
}
|
||||||
|
@ -33,15 +33,15 @@ static const double pi64 = 0x1.921FB54442D18p-62;
|
|||||||
/* PI / 4. */
|
/* PI / 4. */
|
||||||
static const double pio4 = 0x1.921FB54442D18p-1;
|
static const double pio4 = 0x1.921FB54442D18p-1;
|
||||||
|
|
||||||
typedef const struct
|
typedef struct
|
||||||
{
|
{
|
||||||
double sign[4];
|
double sign[4];
|
||||||
double hpi_inv, hpi, c0, c1, c2, c3, c4, s1, s2, s3;
|
double hpi_inv, hpi, c0, c1, c2, c3, c4, s1, s2, s3;
|
||||||
} sincos_t;
|
} sincos_t;
|
||||||
|
|
||||||
extern sincos_t sincosf_table[2] HIDDEN;
|
extern const sincos_t __sincosf_table[2] HIDDEN;
|
||||||
|
|
||||||
extern const uint32_t inv_pio4[] HIDDEN;
|
extern const uint32_t __inv_pio4[] HIDDEN;
|
||||||
|
|
||||||
/* abstop12 assumes floating point reinterpret is fast by default.
|
/* abstop12 assumes floating point reinterpret is fast by default.
|
||||||
If floating point comparisons are faster, define PREFER_FLOAT_COMPARISON. */
|
If floating point comparisons are faster, define PREFER_FLOAT_COMPARISON. */
|
||||||
@ -63,7 +63,8 @@ abstop12 (float x)
|
|||||||
polynomial P and store the results in SINP and COSP. N is the quadrant,
|
polynomial P and store the results in SINP and COSP. N is the quadrant,
|
||||||
if odd the cosine and sine polynomials are swapped. */
|
if odd the cosine and sine polynomials are swapped. */
|
||||||
static inline void
|
static inline void
|
||||||
sincosf_poly (double x, double x2, sincos_t *p, int n, float *sinp, float *cosp)
|
sincosf_poly (double x, double x2, const sincos_t *p, int n, float *sinp,
|
||||||
|
float *cosp)
|
||||||
{
|
{
|
||||||
double x3, x4, x5, x6, s, c, c1, c2, s1;
|
double x3, x4, x5, x6, s, c, c1, c2, s1;
|
||||||
|
|
||||||
@ -91,7 +92,7 @@ sincosf_poly (double x, double x2, sincos_t *p, int n, float *sinp, float *cosp)
|
|||||||
/* Return the sine of inputs X and X2 (X squared) using the polynomial P.
|
/* Return the sine of inputs X and X2 (X squared) using the polynomial P.
|
||||||
N is the quadrant, and if odd the cosine polynomial is used. */
|
N is the quadrant, and if odd the cosine polynomial is used. */
|
||||||
static inline float
|
static inline float
|
||||||
sinf_poly (double x, double x2, sincos_t *p, int n)
|
sinf_poly (double x, double x2, const sincos_t *p, int n)
|
||||||
{
|
{
|
||||||
double x3, x4, x6, x7, s, c, c1, c2, s1;
|
double x3, x4, x6, x7, s, c, c1, c2, s1;
|
||||||
|
|
||||||
@ -126,7 +127,7 @@ sinf_poly (double x, double x2, sincos_t *p, int n)
|
|||||||
Use round/lround if inlined, otherwise convert to int. To avoid inaccuracies
|
Use round/lround if inlined, otherwise convert to int. To avoid inaccuracies
|
||||||
introduced by truncating negative values, compute the quadrant * 2^24. */
|
introduced by truncating negative values, compute the quadrant * 2^24. */
|
||||||
static inline double
|
static inline double
|
||||||
reduce_fast (double x, sincos_t *p, int *np)
|
reduce_fast (double x, const sincos_t *p, int *np)
|
||||||
{
|
{
|
||||||
double r;
|
double r;
|
||||||
#if TOINT_INTRINSICS
|
#if TOINT_INTRINSICS
|
||||||
@ -151,7 +152,7 @@ reduce_fast (double x, sincos_t *p, int *np)
|
|||||||
static inline double
|
static inline double
|
||||||
reduce_large (uint32_t xi, int *np)
|
reduce_large (uint32_t xi, int *np)
|
||||||
{
|
{
|
||||||
const uint32_t *arr = &inv_pio4[(xi >> 26) & 15];
|
const uint32_t *arr = &__inv_pio4[(xi >> 26) & 15];
|
||||||
int shift = (xi >> 23) & 7;
|
int shift = (xi >> 23) & 7;
|
||||||
uint64_t n, res0, res1, res2;
|
uint64_t n, res0, res1, res2;
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
/* The constants and polynomials for sine and cosine. The 2nd entry
|
/* The constants and polynomials for sine and cosine. The 2nd entry
|
||||||
computes -cos (x) rather than cos (x) to get negation for free. */
|
computes -cos (x) rather than cos (x) to get negation for free. */
|
||||||
sincos_t sincosf_table[2] =
|
const sincos_t __sincosf_table[2] =
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
{ 1.0, -1.0, -1.0, 1.0 },
|
{ 1.0, -1.0, -1.0, 1.0 },
|
||||||
@ -74,7 +74,7 @@ sincos_t sincosf_table[2] =
|
|||||||
|
|
||||||
/* Table with 4/PI to 192 bit precision. To avoid unaligned accesses
|
/* Table with 4/PI to 192 bit precision. To avoid unaligned accesses
|
||||||
only 8 new bits are added per entry, making the table 4 times larger. */
|
only 8 new bits are added per entry, making the table 4 times larger. */
|
||||||
const uint32_t inv_pio4[24] =
|
const uint32_t __inv_pio4[24] =
|
||||||
{
|
{
|
||||||
0xa2, 0xa2f9, 0xa2f983, 0xa2f9836e,
|
0xa2, 0xa2f9, 0xa2f983, 0xa2f9836e,
|
||||||
0xf9836e4e, 0x836e4e44, 0x6e4e4415, 0x4e441529,
|
0xf9836e4e, 0x836e4e44, 0x6e4e4415, 0x4e441529,
|
||||||
|
@ -42,7 +42,7 @@ sinf (float y)
|
|||||||
double x = y;
|
double x = y;
|
||||||
double s;
|
double s;
|
||||||
int n;
|
int n;
|
||||||
sincos_t *p = &sincosf_table[0];
|
const sincos_t *p = &__sincosf_table[0];
|
||||||
|
|
||||||
if (abstop12 (y) < abstop12 (pio4))
|
if (abstop12 (y) < abstop12 (pio4))
|
||||||
{
|
{
|
||||||
@ -66,7 +66,7 @@ sinf (float y)
|
|||||||
s = p->sign[n & 3];
|
s = p->sign[n & 3];
|
||||||
|
|
||||||
if (n & 2)
|
if (n & 2)
|
||||||
p = &sincosf_table[1];
|
p = &__sincosf_table[1];
|
||||||
|
|
||||||
return sinf_poly (x * s, x * x, p, n);
|
return sinf_poly (x * s, x * x, p, n);
|
||||||
}
|
}
|
||||||
@ -81,7 +81,7 @@ sinf (float y)
|
|||||||
s = p->sign[(n + sign) & 3];
|
s = p->sign[(n + sign) & 3];
|
||||||
|
|
||||||
if ((n + sign) & 2)
|
if ((n + sign) & 2)
|
||||||
p = &sincosf_table[1];
|
p = &__sincosf_table[1];
|
||||||
|
|
||||||
return sinf_poly (x * s, x * x, p, n);
|
return sinf_poly (x * s, x * x, p, n);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user