summaryrefslogtreecommitdiff
path: root/lib/libm
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2017-10-15 14:02:42 -0400
committerScott Shawcroft <scott@tannewt.org>2017-10-16 12:20:33 -0700
commitdbd3f1516854f8609fe886d83b556b73684fdc6a (patch)
treec16dd7b18414ece9961e2ed9c91f075e006a93cd /lib/libm
parent8f3be0a0371d5e73930a155298804c61fd0ad902 (diff)
1. Use lib/libm for small (non-Express builds) to gain back a lot of flash space.
2. Add flag INTERNAL_LIBM to mpconfigboard.mk files to signal using lib/libm. 3. Fix floating-point warnings in lib/libm 4. Turn off -finline-limit, no longer needed due to 1. 5. Add explicit flags for SPI_FLASH_FILESYSTEM and INTERNAL_FLASH_FILESYSTEM to mpconfigboard.mk files, so they don't need to know the name of the .c file that implements those. Makefile takes care of checking the flags and including the right files.
Diffstat (limited to 'lib/libm')
-rw-r--r--lib/libm/ef_rem_pio2.c5
-rw-r--r--lib/libm/kf_rem_pio2.c6
-rw-r--r--lib/libm/math.c8
-rw-r--r--lib/libm/nearbyintf.c3
-rw-r--r--lib/libm/sf_ldexp.c3
5 files changed, 20 insertions, 5 deletions
diff --git a/lib/libm/ef_rem_pio2.c b/lib/libm/ef_rem_pio2.c
index ca55243fb..601f3bac4 100644
--- a/lib/libm/ef_rem_pio2.c
+++ b/lib/libm/ef_rem_pio2.c
@@ -151,7 +151,7 @@ pio2_3t = 6.1232342629e-17; /* 0x248d3132 */
fn = (float)n;
r = t-fn*pio2_1;
w = fn*pio2_1t; /* 1st round good to 40 bit */
- if(n<32&&(ix&0xffffff00)!=npio2_hw[n-1]) {
+ if(n<32&&(__int32_t)(ix&0xffffff00)!=npio2_hw[n-1]) {
y[0] = r-w; /* quick check no cancellation */
} else {
__uint32_t high;
@@ -195,7 +195,10 @@ pio2_3t = 6.1232342629e-17; /* 0x248d3132 */
}
tx[2] = z;
nx = 3;
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wfloat-equal"
while(tx[nx-1]==zero) nx--; /* skip zero term */
+#pragma GCC diagnostic pop
n = __kernel_rem_pio2f(tx,y,e0,nx,2,two_over_pi);
if(hx<0) {y[0] = -y[0]; y[1] = -y[1]; return -n;}
return n;
diff --git a/lib/libm/kf_rem_pio2.c b/lib/libm/kf_rem_pio2.c
index c7e947957..3b09de5fd 100644
--- a/lib/libm/kf_rem_pio2.c
+++ b/lib/libm/kf_rem_pio2.c
@@ -138,7 +138,10 @@ recompute:
}
/* check if recomputation is needed */
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wfloat-equal"
if(z==zero) {
+#pragma GCC diagnostic pop
j = 0;
for (i=jz-1;i>=jk;i--) j |= iq[i];
if(j==0) { /* need recomputation */
@@ -155,7 +158,10 @@ recompute:
}
/* chop off zero terms */
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wfloat-equal"
if(z==(float)0.0) {
+#pragma GCC diagnostic pop
jz -= 1; q0 -= 8;
while(iq[jz]==0) { jz--; q0-=8;}
} else { /* break z into 8-bit if necessary */
diff --git a/lib/libm/math.c b/lib/libm/math.c
index 984636627..a2313fcea 100644
--- a/lib/libm/math.c
+++ b/lib/libm/math.c
@@ -338,7 +338,7 @@ float powf(float x, float y)
return sn*huge*huge; /* overflow */
} else if ((j&0x7fffffff) > 0x43160000) /* z < -150 */ // FIXME: check should be (uint32_t)j > 0xc3160000
return sn*tiny*tiny; /* underflow */
- else if (j == 0xc3160000) { /* z == -150 */
+ else if (j == (int32_t) 0xc3160000) { /* z == -150 */
if (p_l <= z-p_h)
return sn*tiny*tiny; /* underflow */
}
@@ -585,13 +585,13 @@ float expm1f(float x)
/*****************************************************************************/
/*****************************************************************************/
-/* k is such that k*ln2 has minimal relative error and x - kln2 > log(FLT_MIN) */
-static const int k = 235;
-static const float kln2 = 0x1.45c778p+7f;
/* expf(x)/2 for x >= log(FLT_MAX), slightly better than 0.5f*expf(x/2)*expf(x/2) */
float __expo2f(float x)
{
+ /* k is such that k*ln2 has minimal relative error and x - kln2 > log(FLT_MIN) */
+ static const int k = 235;
+ static const float kln2 = 0x1.45c778p+7f;
float scale;
/* note that k is odd and scale*scale overflows */
diff --git a/lib/libm/nearbyintf.c b/lib/libm/nearbyintf.c
index 1c3545945..1bb44aa46 100644
--- a/lib/libm/nearbyintf.c
+++ b/lib/libm/nearbyintf.c
@@ -15,7 +15,10 @@ float nearbyintf(float x)
y = x - 0x1p23f + 0x1p23f;
else
y = x + 0x1p23f - 0x1p23f;
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wfloat-equal"
if (y == 0)
+#pragma GCC diagnostic pop
return s ? -0.0f : 0.0f;
return y;
}
diff --git a/lib/libm/sf_ldexp.c b/lib/libm/sf_ldexp.c
index 37968d475..75cb8b727 100644
--- a/lib/libm/sf_ldexp.c
+++ b/lib/libm/sf_ldexp.c
@@ -32,7 +32,10 @@
float value; int exp;
#endif
{
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wfloat-equal"
if(!isfinite(value)||value==(float)0.0) return value;
+#pragma GCC diagnostic pop
value = scalbnf(value,exp);
//if(!finitef(value)||value==(float)0.0) errno = ERANGE;
return value;