On Fri, 12 Mar 2021, Philippe Mathieu-Daudé wrote: > >>> Is there any way we can do this with a distro that isn't Gentoo > >>> so that we can get a container build that is fast enough to be > >>> useful for CI ? > > Using the Debian cross image I get: > > /home/phil/source/qemu/tests/docker/docker.py --engine auto cc --cc > mips64el-linux-gnuabi64-gcc -i qemu/debian-mips64el-cross -s > /home/phil/source/qemu -- -Wall -Werror -O0 -g -fno-strict-aliasing > -mabi=n32 -march=r5900 > /home/phil/source/qemu/tests/tcg/mips/test-r5900-dmult.c -o > test-r5900-dmult -static > cc1: error: unsupported combination: -march=r5900 -mhard-float > -mdouble-float > > No clue what is setting '-mhard-float -mdouble-float' yet.
The R5900 has an FPU that only supports the single floating-point format. It's also not an IEEE 754 format. The Linux kernel ABI does support the double and also the single floating-point format, both compliant with IEEE 754. In the absence of a suitable FPU emulation code included with the kernel will handle the missing instructions (you can use the `nofpu' kernel parameter to force that in the presence of an FPU too). Beware however that a recent change to the Linux kernel made FPU emulation code optional to suit some deeply embedded applications known never to use FPU machine instructions. NB the presence of emulation is always required for MIPS ISA compliance if FPU machine instructions are ever to be used in a given application, because operations are allowed to trap regardless and rely on emulation. I don't know what you are trying to achieve, but your two options to choose from are: 1. Build for the soft-float ABI (`-msoft-float') where any FP calculations are compiled such as to be made by the CPU using integer arithmetic. 2. Build for a generic MIPS ISA, for the R5900/n32 that would be MIPS III (`-march=mips3'), and rely on the kernel FPU emulation. Note that some integer MIPS III operations are missing too from the R5900 and have to be emulated by the kernel for MIPS/Linux n32 psABI compliance (an implementation can be pinched from an old libgcc version that was still under GNU GPLv2 or another algorithm reused, e.g. my `__div64_32' piece easily adapted). HTH, Maciej