diff options
author | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2018-07-04 17:52:36 +0100 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2018-07-06 10:29:01 +0200 |
commit | 138575c9b939ea6673447073f89ab9ff773f3cd8 (patch) | |
tree | b8f7e47fa20574023e37129b59b6e8f12854e6df | |
parent | 2805b07fa1f54ef001c2ce78618e8efc87155232 (diff) | |
download | newlib-138575c9b939ea6673447073f89ab9ff773f3cd8.zip newlib-138575c9b939ea6673447073f89ab9ff773f3cd8.tar.gz newlib-138575c9b939ea6673447073f89ab9ff773f3cd8.tar.bz2 |
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.
-rw-r--r-- | newlib/libm/common/cosf.c | 6 | ||||
-rw-r--r-- | newlib/libm/common/sincosf.c | 6 | ||||
-rw-r--r-- | newlib/libm/common/sincosf.h | 15 | ||||
-rw-r--r-- | newlib/libm/common/sincosf_data.c | 4 | ||||
-rw-r--r-- | newlib/libm/common/sinf.c | 6 |
5 files changed, 19 insertions, 18 deletions
diff --git a/newlib/libm/common/cosf.c b/newlib/libm/common/cosf.c index aac0a9a..f87186c 100644 --- a/newlib/libm/common/cosf.c +++ b/newlib/libm/common/cosf.c @@ -43,7 +43,7 @@ cosf (float y) double x = y; double s; int n; - sincos_t *p = &sincosf_table[0]; + const sincos_t *p = &__sincosf_table[0]; if (abstop12 (y) < abstop12 (pio4)) { @@ -62,7 +62,7 @@ cosf (float y) s = p->sign[n & 3]; if (n & 2) - p = &sincosf_table[1]; + p = &__sincosf_table[1]; return sinf_poly (x * s, x * x, p, n ^ 1); } @@ -77,7 +77,7 @@ cosf (float y) s = p->sign[(n + sign) & 3]; if ((n + sign) & 2) - p = &sincosf_table[1]; + p = &__sincosf_table[1]; return sinf_poly (x * s, x * x, p, n ^ 1); } diff --git a/newlib/libm/common/sincosf.c b/newlib/libm/common/sincosf.c index 2ead353..65dd05e 100644 --- a/newlib/libm/common/sincosf.c +++ b/newlib/libm/common/sincosf.c @@ -43,7 +43,7 @@ sincosf (float y, float *sinp, float *cosp) double x = y; double s; int n; - sincos_t *p = &sincosf_table[0]; + const sincos_t *p = &__sincosf_table[0]; if (abstop12 (y) < abstop12 (pio4)) { @@ -69,7 +69,7 @@ sincosf (float y, float *sinp, float *cosp) s = p->sign[n & 3]; if (n & 2) - p = &sincosf_table[1]; + p = &__sincosf_table[1]; 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]; if ((n + sign) & 2) - p = &sincosf_table[1]; + p = &__sincosf_table[1]; sincosf_poly (x * s, x * x, p, n, sinp, cosp); } diff --git a/newlib/libm/common/sincosf.h b/newlib/libm/common/sincosf.h index 955a733..27f24ff 100644 --- a/newlib/libm/common/sincosf.h +++ b/newlib/libm/common/sincosf.h @@ -33,15 +33,15 @@ static const double pi64 = 0x1.921FB54442D18p-62; /* PI / 4. */ static const double pio4 = 0x1.921FB54442D18p-1; -typedef const struct +typedef struct { double sign[4]; double hpi_inv, hpi, c0, c1, c2, c3, c4, s1, s2, s3; } 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. 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, if odd the cosine and sine polynomials are swapped. */ 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; @@ -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. N is the quadrant, and if odd the cosine polynomial is used. */ 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; @@ -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 introduced by truncating negative values, compute the quadrant * 2^24. */ static inline double -reduce_fast (double x, sincos_t *p, int *np) +reduce_fast (double x, const sincos_t *p, int *np) { double r; #if TOINT_INTRINSICS @@ -151,7 +152,7 @@ reduce_fast (double x, sincos_t *p, int *np) static inline double 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; uint64_t n, res0, res1, res2; diff --git a/newlib/libm/common/sincosf_data.c b/newlib/libm/common/sincosf_data.c index 069ee7b..47fe960 100644 --- a/newlib/libm/common/sincosf_data.c +++ b/newlib/libm/common/sincosf_data.c @@ -34,7 +34,7 @@ /* The constants and polynomials for sine and cosine. The 2nd entry 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 }, @@ -74,7 +74,7 @@ sincos_t sincosf_table[2] = /* 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. */ -const uint32_t inv_pio4[24] = +const uint32_t __inv_pio4[24] = { 0xa2, 0xa2f9, 0xa2f983, 0xa2f9836e, 0xf9836e4e, 0x836e4e44, 0x6e4e4415, 0x4e441529, diff --git a/newlib/libm/common/sinf.c b/newlib/libm/common/sinf.c index 715bdc8..c2e6103 100644 --- a/newlib/libm/common/sinf.c +++ b/newlib/libm/common/sinf.c @@ -42,7 +42,7 @@ sinf (float y) double x = y; double s; int n; - sincos_t *p = &sincosf_table[0]; + const sincos_t *p = &__sincosf_table[0]; if (abstop12 (y) < abstop12 (pio4)) { @@ -66,7 +66,7 @@ sinf (float y) s = p->sign[n & 3]; if (n & 2) - p = &sincosf_table[1]; + p = &__sincosf_table[1]; return sinf_poly (x * s, x * x, p, n); } @@ -81,7 +81,7 @@ sinf (float y) s = p->sign[(n + sign) & 3]; if ((n + sign) & 2) - p = &sincosf_table[1]; + p = &__sincosf_table[1]; return sinf_poly (x * s, x * x, p, n); } |