Re: [PATCH 0/3] ARM with only 32-bit floats do not have fast 64-bit FMA
Sebastian Huber <[email protected]>
| Newsgroups | gmane.comp.lib.newlib |
|---|---|
| Message-ID | <[email protected]> |
On 01/09/2020 19:21, Sebastian Huber wrote: > On 01/09/2020 18:32, Sebastian Huber wrote: > >> Hello, >> >> with the latest Newlib, I get a linker error in the RTEMS test suite: >> >> >> undefined reference to `fma' >> undefined reference to `fmaf' >> >> The following machine flags are used: >> >> '-march=armv7-a', '-mthumb', '-mfpu=neon', '-mfloat-abi=hard', >> '-mtune=cortex-a9' >> >> It seems to be missing in the corresponding multilib: >> >> nm /build/rtems/6/arm-rtems6/lib/thumb/armv7-a+simd/hard/libm.a | >> grep fma >> lib_a-fmal.o: >> U fma >> 00000000 T fmal >> lib_a-fmaxl.o: >> U fmax >> 00000000 T fmaxl >> lib_a-s_fma.o: >> lib_a-s_fmax.o: >> 00000000 T fmax >> lib_a-sf_fma.o: >> lib_a-sf_fmax.o: >> 00000000 T fmaxf >> > It seems to be present in only some multilibs: > > for i in $(find /build/rtems/6/arm-rtems6/lib -name libm.a); do echo > $i ; nm --defined-only $i | grep 'T.*\<fma\>'; done > /build/rtems/6/arm-rtems6/lib/eb/thumb/armv7-r+fp/hard/libm.a > /build/rtems/6/arm-rtems6/lib/eb/thumb/armv7-r/libm.a > /build/rtems/6/arm-rtems6/lib/libm.a > /build/rtems/6/arm-rtems6/lib/thumb/cortex-m4/hard/libm.a > /build/rtems/6/arm-rtems6/lib/thumb/cortex-m3/libm.a > /build/rtems/6/arm-rtems6/lib/thumb/cortex-m7/hard/libm.a > 00000000 T fma > /build/rtems/6/arm-rtems6/lib/thumb/armv6-m/libm.a > /build/rtems/6/arm-rtems6/lib/thumb/armv7-r+fp/hard/libm.a > /build/rtems/6/arm-rtems6/lib/thumb/armv7-r/libm.a > /build/rtems/6/arm-rtems6/lib/thumb/cortex-m4+nofp/libm.a > /build/rtems/6/arm-rtems6/lib/thumb/libm.a > /build/rtems/6/arm-rtems6/lib/thumb/armv7-a+simd/hard/libm.a > /build/rtems/6/arm-rtems6/lib/thumb/armv7-a/libm.a > /build/rtems/6/arm-rtems6/lib/armv5te+fp/hard/libm.a > > for i in $(find /build/rtems/6/arm-rtems6/lib -name libm.a); do echo > $i ; nm --defined-only $i | grep 'T.*\<fmaf\>'; done > /build/rtems/6/arm-rtems6/lib/eb/thumb/armv7-r+fp/hard/libm.a > /build/rtems/6/arm-rtems6/lib/eb/thumb/armv7-r/libm.a > /build/rtems/6/arm-rtems6/lib/libm.a > /build/rtems/6/arm-rtems6/lib/thumb/cortex-m4/hard/libm.a > 00000000 T fmaf > /build/rtems/6/arm-rtems6/lib/thumb/cortex-m3/libm.a > /build/rtems/6/arm-rtems6/lib/thumb/cortex-m7/hard/libm.a > 00000000 T fmaf > /build/rtems/6/arm-rtems6/lib/thumb/armv6-m/libm.a > /build/rtems/6/arm-rtems6/lib/thumb/armv7-r+fp/hard/libm.a > /build/rtems/6/arm-rtems6/lib/thumb/armv7-r/libm.a > /build/rtems/6/arm-rtems6/lib/thumb/cortex-m4+nofp/libm.a > /build/rtems/6/arm-rtems6/lib/thumb/libm.a > /build/rtems/6/arm-rtems6/lib/thumb/armv7-a+simd/hard/libm.a > /build/rtems/6/arm-rtems6/lib/thumb/armv7-a/libm.a > /build/rtems/6/arm-rtems6/lib/armv5te+fp/hard/libm.a I think the problem is somewhere in the build system: find -name s_fma.c ./newlib/libm/machine/arm/s_fma.c ./newlib/libm/machine/aarch64/s_fma.c ./newlib/libm/machine/riscv/s_fma.c ./newlib/libm/machine/spu/s_fma.c ./newlib/libm/common/s_fma.c I guess the machine-specific file overrides the common file. If the machine-specific file is empty due to pre-processor magic, then the default implementation is still not present.