[llvm] 28e4aad - [X86][BF16] Add libcall for FP128 -> BF16 (#115825)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 11 23:54:13 PST 2024
Author: Feng Zou
Date: 2024-11-12T15:54:09+08:00
New Revision: 28e4aad45a64ec893c02f21b9c2afe7efe5f4a2a
URL: https://github.com/llvm/llvm-project/commit/28e4aad45a64ec893c02f21b9c2afe7efe5f4a2a
DIFF: https://github.com/llvm/llvm-project/commit/28e4aad45a64ec893c02f21b9c2afe7efe5f4a2a.diff
LOG: [X86][BF16] Add libcall for FP128 -> BF16 (#115825)
This is to fix #115710.
Added:
compiler-rt/lib/builtins/trunctfbf2.c
Modified:
compiler-rt/lib/builtins/CMakeLists.txt
llvm/include/llvm/IR/RuntimeLibcalls.def
llvm/lib/CodeGen/TargetLoweringBase.cpp
llvm/test/CodeGen/X86/bfloat.ll
Removed:
################################################################################
diff --git a/compiler-rt/lib/builtins/CMakeLists.txt b/compiler-rt/lib/builtins/CMakeLists.txt
index 9a0a50ee7003f1..c8595b97b337db 100644
--- a/compiler-rt/lib/builtins/CMakeLists.txt
+++ b/compiler-rt/lib/builtins/CMakeLists.txt
@@ -194,6 +194,7 @@ set(BF16_SOURCES
truncdfbf2.c
truncxfbf2.c
truncsfbf2.c
+ trunctfbf2.c
)
set(GENERIC_TF_SOURCES
diff --git a/compiler-rt/lib/builtins/trunctfbf2.c b/compiler-rt/lib/builtins/trunctfbf2.c
new file mode 100644
index 00000000000000..3d47b13bdf5c2c
--- /dev/null
+++ b/compiler-rt/lib/builtins/trunctfbf2.c
@@ -0,0 +1,18 @@
+//===--------- lib/trunctfbf2.c - quad -> bfloat conversion -------*- C -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+#define QUAD_PRECISION
+#include "fp_lib.h"
+
+#if defined(CRT_HAS_TF_MODE) && defined(__x86_64__)
+#define SRC_QUAD
+#define DST_BFLOAT
+#include "fp_trunc_impl.inc"
+
+COMPILER_RT_ABI dst_t __trunctfbf2(src_t a) { return __truncXfYf2__(a); }
+
+#endif
\ No newline at end of file
diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.def b/llvm/include/llvm/IR/RuntimeLibcalls.def
index 9c56cf098ff774..13a27b58b9cd78 100644
--- a/llvm/include/llvm/IR/RuntimeLibcalls.def
+++ b/llvm/include/llvm/IR/RuntimeLibcalls.def
@@ -383,6 +383,7 @@ HANDLE_LIBCALL(FPROUND_PPCF128_F16, "__trunctfhf2")
HANDLE_LIBCALL(FPROUND_F32_BF16, "__truncsfbf2")
HANDLE_LIBCALL(FPROUND_F64_BF16, "__truncdfbf2")
HANDLE_LIBCALL(FPROUND_F80_BF16, "__truncxfbf2")
+HANDLE_LIBCALL(FPROUND_F128_BF16, "__trunctfbf2")
HANDLE_LIBCALL(FPROUND_F64_F32, "__truncdfsf2")
HANDLE_LIBCALL(FPROUND_F80_F32, "__truncxfsf2")
HANDLE_LIBCALL(FPROUND_F128_F32, "__trunctfsf2")
diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp
index 231de6bba5e5b8..392cfbdd21273d 100644
--- a/llvm/lib/CodeGen/TargetLoweringBase.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp
@@ -171,6 +171,8 @@ RTLIB::Libcall RTLIB::getFPROUND(EVT OpVT, EVT RetVT) {
return FPROUND_F64_BF16;
if (OpVT == MVT::f80)
return FPROUND_F80_BF16;
+ if (OpVT == MVT::f128)
+ return FPROUND_F128_BF16;
} else if (RetVT == MVT::f32) {
if (OpVT == MVT::f64)
return FPROUND_F64_F32;
diff --git a/llvm/test/CodeGen/X86/bfloat.ll b/llvm/test/CodeGen/X86/bfloat.ll
index 3144fd56d9ccf3..27348dd31958f2 100644
--- a/llvm/test/CodeGen/X86/bfloat.ll
+++ b/llvm/test/CodeGen/X86/bfloat.ll
@@ -1975,3 +1975,25 @@ define bfloat @PR108936(x86_fp80 %0) nounwind {
%2 = fptrunc x86_fp80 %0 to bfloat
ret bfloat %2
}
+
+define bfloat @PR115710(fp128 %0) nounwind {
+; X86-LABEL: PR115710:
+; X86: # %bb.0:
+; X86-NEXT: subl $28, %esp
+; X86-NEXT: vmovaps {{[0-9]+}}(%esp), %xmm0
+; X86-NEXT: vmovups %xmm0, (%esp)
+; X86-NEXT: calll __trunctfbf2
+; X86-NEXT: # kill: def $ax killed $ax def $eax
+; X86-NEXT: vmovw %eax, %xmm0
+; X86-NEXT: addl $28, %esp
+; X86-NEXT: retl
+;
+; CHECK-LABEL: PR115710:
+; CHECK: # %bb.0:
+; CHECK-NEXT: pushq %rax
+; CHECK-NEXT: callq __trunctfbf2 at PLT
+; CHECK-NEXT: popq %rax
+; CHECK-NEXT: retq
+ %2 = fptrunc fp128 %0 to bfloat
+ ret bfloat %2
+}
More information about the llvm-commits
mailing list