Gcc builtin review: isinf, insnan ...
Joseph Myers
joseph@codesourcery.com
Sat May 30 19:14:00 GMT 2015
On Fri, 29 May 2015, Wilco Dijkstra wrote:
> Note another issue is that GCC tends to use FP arithmetic with -ffast-math
> for FP related built-ins (even when it uses integer arithmetic with -O2/-O3),
> presumably on the assumption that FP calculations are faster. This is not true
> on most CPUs but it spectacularly backfires when using software floating point...
>
> int test(double x)
> {
> return __builtin_signbit (x);
> }
>
> -O3 -mfloat-abi=soft:
> and r0, r1, #-2147483648
> bx lr
>
> -Ofast -mfloat-abi=soft:
> push {r3, lr}
> movs r2, #0
> movs r3, #0
> bl __aeabi_dcmplt
> adds r0, r0, #0
> it ne
> movne r0, #1
> pop {r3, pc}
GCC bug report number? I don't think this is an assumption that FP
calculations are faster; it seems a simple inconsistency between tree
folding (prefers expanding to a comparison when no signed zeroes) and RTL
expansion (prefers bit manipulation whenever a read-only sign bit is
available, which it always is for all currently-supported floating-point
formats).
> Agreed, I'd much prefer the GCC builtins doing the right thing. However what
> to do when they don't? Assuming we agree to just support inline functions in
> headers from GCC4.0 onwards, given the built-ins in GCC are not good enough,
> we still need explicit optimized implementations for all of signbit, isinf etc
> even if they were fixed in GCC6.
Well, if you want a -ffast-math version of signbit (commented to be
working around a particular, preferably fixed, GCC bug, with __GNUC_PREREQ
conditionals) - if that's considered sufficiently important - at least it
ought to be architecture-independent (maybe one bits/ header per
floating-point format) rather than duplicated per-architecture.
--
Joseph S. Myers
joseph@codesourcery.com
More information about the Libc-alpha
mailing list