PowerPC fp128
-> half
uses __trunctfhf2
but should be __trunckfhf2
· Issue #98126 · llvm/llvm-project (original) (raw)
define half @trunckfhf(fp128 %a) unnamed_addr { start: %_0 = fptrunc fp128 %a to half ret half %_0 }
Output on powerpc64-unknown-linux-gnu
:
trunckfhf: # @trunckfhf .quad .Lfunc_begin0 .quad .TOC.@tocbase .quad 0 .Lfunc_begin0: mflr 0 stdu 1, -112(1) std 0, 128(1) bl __trunctfhf2 nop clrldi 3, 3, 48 bl __gnu_h2f_ieee nop addi 1, 1, 112 ld 0, 16(1) mtlr 0 blr .long 0 .quad 0
Note that this emits __trunctfhf2
. According to https://gcc.gnu.org/wiki/Ieee128PowerPC (second table in section 2.2), tf
is for whatever long double
is in C, which on PPC is usually IBM double double, but kf
is always for IEEE binary128
. So it seems like this should instead emit a symbol named __trunckfhf2
.
This would be consistent with other fptrunc operations for fp128
, which lower to kf
symbols (__trunckfsf2
, __trunckfdf2
).
There is more discussion at this thread #92866. Neither GCC nor LLVM provide this symbol yet in libgcc/compiler-rt, but I don't think that should block correcting the symbol name.
Tested at compiler explorer using 19.0.0git
. Link: https://llvm.godbolt.org/z/7MosczYcr