Discussion:
[PATCH] libm fixes for 16-bit targets
j***@beniston.com
2018-08-31 22:30:07 UTC
Permalink
Hi,

Attached are a couple of patches to libm to fix warnings when compiling for
16-bit targets.

The first in e_scalb.c calls scalbln instead of scalbn, as 65000 is out of
range for an 'int'.

+#if INT_MAX == 32767
+ if ( fn > 65000.0) return scalbln(x, 65000);
+ if (-fn > 65000.0) return scalbln(x,-65000);
+#else
if ( fn > 65000.0) return scalbn(x, 65000);
if (-fn > 65000.0) return scalbn(x,-65000);
+#endif

The second in math_config.h (issignalingf_inline) fixes the signed overflow
warning that occurs.

- return 2 * (ix ^ 0x00400000) > 2u * 0x7fc00000;
+ return 2 * (ix ^ 0x00400000) > 0xFF800000u;

Although I hope I'm not missing something subtle with the mixing of the
types there.

Cheers,
Jon
Corinna Vinschen
2018-09-03 07:43:08 UTC
Permalink
Post by j***@beniston.com
Hi,
Attached are a couple of patches to libm to fix warnings when compiling for
16-bit targets.
The first in e_scalb.c calls scalbln instead of scalbn, as 65000 is out of
range for an 'int'.
+#if INT_MAX == 32767
+ if ( fn > 65000.0) return scalbln(x, 65000);
+ if (-fn > 65000.0) return scalbln(x,-65000);
+#else
if ( fn > 65000.0) return scalbn(x, 65000);
if (-fn > 65000.0) return scalbn(x,-65000);
+#endif
The second in math_config.h (issignalingf_inline) fixes the signed overflow
warning that occurs.
- return 2 * (ix ^ 0x00400000) > 2u * 0x7fc00000;
+ return 2 * (ix ^ 0x00400000) > 0xFF800000u;
Although I hope I'm not missing something subtle with the mixing of the
types there.
Cheers,
Jon
Pushed.


Thanks,
Corinna
--
Corinna Vinschen
Cygwin Maintainer
Red Hat
Loading...