This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
[PATCH] Fix namespace issues in sinf, cosf and sincosf
- From: Szabolcs Nagy <szabolcs dot nagy at arm dot com>
- To: newlib at sourceware dot org
- Cc: nd at arm dot com
- Date: Wed, 4 Jul 2018 18:09:13 +0100
- Subject: [PATCH] Fix namespace issues in sinf, cosf and sincosf
- References: <35741653-f732-0c8d-e89c-799c6ccf20c0@arm.com>
On 04/07/18 16:49, Szabolcs Nagy wrote:
There are some modifications and bug fixes in the Arm Optimized
Routines repo and i'd like to sync newlib with it.
Szabolcs Nagy (3):
Fix code style and comments of new math code
Change the return type of converttoint and document the semantics
Fix large ulp error in pow without fma very near 1.0
sorry i forgot to add this one when sending out the cover letter.
>From 9af28fe277fb5123916a60d89e72c5f01ddc6cc6 Mon Sep 17 00:00:00 2001
From: Szabolcs Nagy <szabolcs.nagy@arm.com>
Date: Wed, 4 Jul 2018 17:52:36 +0100
Subject: [PATCH] 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.
---
newlib/libm/common/cosf.c | 6 +++---
newlib/libm/common/sincosf.c | 6 +++---
newlib/libm/common/sincosf.h | 15 ++++++++-------
newlib/libm/common/sincosf_data.c | 4 ++--
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 aac0a9aee..f87186c68 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 2ead353e8..65dd05e6e 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 955a73312..27f24ffe3 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 069ee7bf6..47fe960c1 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 715bdc8d0..c2e61039b 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);
}
--
2.14.1