The Difference Between HardFP and SoftFP

Raspberry Pi 4 main chip is Broadcom BCM2711, and it's a SoC (System-on-Chip). This SoC includes CPU, GPU and RAM. CPU is ARM Cortex-A72 1.5 GHz processor, capable of doing floating point math in hardware, including VFP extensions (Vector Floating Point), somewhat similar to x86 SIMD called SSE2.

But hardware floating point on ARM architecture at large is optional feature, so there is a default ABI (Application Binary Interface) between applications and C runtime library assuming that there's no floating point support in hardware. All floating point math is emulated in software, so it works slow, but widely complatible among ARM chips and Linux kernels. This ABI is called SoftFP. Some GNU/Linux distributions for Raspberry Pi are using this slow SoftFP ABI.

HardFP-enabled GNU/Linux distributions like Raspberry Pi OS work much faster when it comes to intensive floating-point computations, like games, but they require specially configured gcc and glibc, capable of producing binaries tied to HardFP loader (ld-linux-armhf.so.3) instead of SoftFP loader (ld-linux.so.3).

When it comes to cross-compiling for Raspberry Pi, there's a requirement to build SoftFP toolchain in order to support non-accelerated GNU/Linux distributions without ld-linux-armhf.so.3 and in order to fall back to software emulation if something related to the HardFP ABI goes wrong.

Summary:

  SoftFP ABI HardFP ABI
CPU supports floating point instructions YesYes
Floating point instructions are emitted by GCC NoYes
Games and other computationally intensive software is SlowFast
Register calling convention for libc and other *.so functions arm-linux-gnueabiarm-linux-gnueabihf
Dynamic loader ld-linux.so.3ld-linux-armhf.so.3
GCC configuration options --with-float=soft--with-float=hard
--with-fpu=vfp


>> Read next section or buy already prepared cross-compiler (€10) to save your time.