diff options
| author | Dan Halbert <halbert@halwitz.org> | 2017-10-15 14:02:42 -0400 |
|---|---|---|
| committer | Scott Shawcroft <scott@tannewt.org> | 2017-10-16 12:20:33 -0700 |
| commit | dbd3f1516854f8609fe886d83b556b73684fdc6a (patch) | |
| tree | c16dd7b18414ece9961e2ed9c91f075e006a93cd /lib/libm | |
| parent | 8f3be0a0371d5e73930a155298804c61fd0ad902 (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.c | 5 | ||||
| -rw-r--r-- | lib/libm/kf_rem_pio2.c | 6 | ||||
| -rw-r--r-- | lib/libm/math.c | 8 | ||||
| -rw-r--r-- | lib/libm/nearbyintf.c | 3 | ||||
| -rw-r--r-- | lib/libm/sf_ldexp.c | 3 |
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; |
