[PATCH] D107082: [X86][RFC] Enable `_Float16` type support on X86 following the psABI
Jean Perier via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 6 03:10:12 PDT 2022
jeanPerier added a comment.
Hi @pengfei, I am working on flang, and after this patch, we started to see some bugs in Fortran programs using REAL(2) (which is fp16 in flang). I am not an expert in LLVM codegen and the builtins, but I am wondering if there is not issue with how llvm codegen thinks `__truncsfhf2` returns its value and how the runtime actually does return it.
Here is an llvm IR reproducer for a bug we saw:
define void @bug(ptr %addr, i32 %i) {
%1 = sitofp i32 %i to half
store half %1, ptr %addr, align 2
ret void
}
After this patch the generated assembly on X86 is:
bug: # @bug
push rbx
mov rbx, rdi
cvtsi2ss xmm0, esi
call __truncsfhf2 at PLT
pextrw eax, xmm0, 0
mov word ptr [rbx], ax
pop rbx
ret
When running this from a C program to test integers are casted to floats, I am only seeing the bytes of the passed address being set to zero (regardless of the input). It seems to me that there is an issue around the `__truncsfhf2` interface. The `pextrw eax, xmm0, 0` after the call seems to suggest LLVM codegen is looking for the result in xmm0 register, but it seems that `__truncsfhf2` is only returning it in eax.
Do you have any idea what could be the issue ?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D107082/new/
https://reviews.llvm.org/D107082
More information about the llvm-commits
mailing list