https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111876
--- Comment #5 from Iain Sandoe <iains at gcc dot gnu.org> --- for the record an __fp16 implementation works as expected; * when the target does not support +fp16, the code-gen promotes to float and does the multiply with __mulsc3 * when the target supports +fp16, the code-gen uses __mulhc3 (which is implemented in libgcc) * adding "+bf16" does not affect this. --- So the issue is that __bf16 works when there is no support for a 16b float, (because, like fp16, it gets promoted) - but fails when the target declares support for a different 16 float.