[compiler-rt] [builtins][AArch32] Fix __gnu_* functions (PR #137638)

via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 30 07:25:38 PDT 2025


saturn691 wrote:

> What targets in GCC may call __gnu_h2f and friends and what is their expected interface?

```cpp
float h2f(_Float16 x)
{
    return (float)x;
}

int main()
{
    float x = h2f(1.0f16);
    return !(x == 1.0f);
}
```

This is the test I am running.
>From looking at the new generated assembly, it seems we are using the correct interface (u16 -> u32) as defined in libgcc.

```
200000ec <__gnu_h2f_ieee>:
200000ec: e92d4800     	push	{r11, lr}
200000f0: ee000a10     	vmov	s0, r0
200000f4: ebffffe1     	bl	0x20000080 <__extendhfsf2> @ imm = #-0x7c
200000f8: ee100a10     	vmov	r0, s0
200000fc: e8bd8800     	pop	{r11, pc}

20000100 <__aeabi_h2f>:
20000100: e92d4800     	push	{r11, lr}
20000104: ee000a10     	vmov	s0, r0
20000108: ebffffdc     	bl	0x20000080 <__extendhfsf2> @ imm = #-0x90
2000010c: ee100a10     	vmov	r0, s0
20000110: e8bd8800     	pop	{r11, pc}
```

> What targets in LLVM may call __gnu_h2f and friends and what is their expected interface?

LLVM uses __aeabi_h2f instead. Hence why this change is here to standardise the interfaces.

> Can you make sure that the change to compiler-rt works for all of these targets. For example we may need to compile differently for MachO (Darwin) than for ELF.

I've tested it on Linux- it works. It's actually quite hard to write a test case that works for this without inline assembly. Also, in the `.cpp` - it says if Subtarget is not (!) MachO. This change I presume does not affect MachO targets.


https://github.com/llvm/llvm-project/pull/137638


More information about the llvm-commits mailing list