[compiler-rt] 8bc0bb9 - Add a conversion from double to bf16
Benjamin Kramer via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 15 04:01:19 PDT 2022
Author: Benjamin Kramer
Date: 2022-06-15T12:56:31+02:00
New Revision: 8bc0bb956421e02bc1a1797363e979655dd326d6
URL: https://github.com/llvm/llvm-project/commit/8bc0bb956421e02bc1a1797363e979655dd326d6
DIFF: https://github.com/llvm/llvm-project/commit/8bc0bb956421e02bc1a1797363e979655dd326d6.diff
LOG: Add a conversion from double to bf16
This introduces a new compiler-rt function `__truncdfbf2`.
Added:
compiler-rt/lib/builtins/truncdfbf2.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 007c2725d729..795fe2ab316d 100644
--- a/compiler-rt/lib/builtins/CMakeLists.txt
+++ b/compiler-rt/lib/builtins/CMakeLists.txt
@@ -165,6 +165,7 @@ set(GENERIC_SOURCES
subvsi3.c
subvti3.c
trampoline_setup.c
+ truncdfbf2.c
truncdfhf2.c
truncdfsf2.c
truncsfbf2.c
diff --git a/compiler-rt/lib/builtins/truncdfbf2.c b/compiler-rt/lib/builtins/truncdfbf2.c
new file mode 100644
index 000000000000..dbd54dcd50ca
--- /dev/null
+++ b/compiler-rt/lib/builtins/truncdfbf2.c
@@ -0,0 +1,13 @@
+//===-- lib/truncdfbf2.c - double -> 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 SRC_DOUBLE
+#define DST_BFLOAT
+#include "fp_trunc_impl.inc"
+
+COMPILER_RT_ABI dst_t __truncdfbf2(double a) { return __truncXfYf2__(a); }
diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.def b/llvm/include/llvm/IR/RuntimeLibcalls.def
index b5b9fb498799..39c11771ff41 100644
--- a/llvm/include/llvm/IR/RuntimeLibcalls.def
+++ b/llvm/include/llvm/IR/RuntimeLibcalls.def
@@ -311,6 +311,7 @@ HANDLE_LIBCALL(FPROUND_F80_F16, "__truncxfhf2")
HANDLE_LIBCALL(FPROUND_F128_F16, "__trunctfhf2")
HANDLE_LIBCALL(FPROUND_PPCF128_F16, "__trunctfhf2")
HANDLE_LIBCALL(FPROUND_F32_BF16, "__truncsfbf2")
+HANDLE_LIBCALL(FPROUND_F64_BF16, "__truncdfbf2")
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 ad0f95b06e24..deb209fa4724 100644
--- a/llvm/lib/CodeGen/TargetLoweringBase.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp
@@ -277,6 +277,8 @@ RTLIB::Libcall RTLIB::getFPROUND(EVT OpVT, EVT RetVT) {
} else if (RetVT == MVT::bf16) {
if (OpVT == MVT::f32)
return FPROUND_F32_BF16;
+ if (OpVT == MVT::f64)
+ return FPROUND_F64_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 089506c39dae..ab8c59a81c65 100644
--- a/llvm/test/CodeGen/X86/bfloat.ll
+++ b/llvm/test/CodeGen/X86/bfloat.ll
@@ -26,3 +26,46 @@ define void @add(ptr %pa, ptr %pb, ptr %pc) {
store bfloat %add, ptr %pc
ret void
}
+
+define void @add_double(ptr %pa, ptr %pb, ptr %pc) {
+; CHECK-LABEL: add_double:
+; CHECK: # %bb.0:
+; CHECK-NEXT: pushq %r14
+; CHECK-NEXT: .cfi_def_cfa_offset 16
+; CHECK-NEXT: pushq %rbx
+; CHECK-NEXT: .cfi_def_cfa_offset 24
+; CHECK-NEXT: pushq %rax
+; CHECK-NEXT: .cfi_def_cfa_offset 32
+; CHECK-NEXT: .cfi_offset %rbx, -24
+; CHECK-NEXT: .cfi_offset %r14, -16
+; CHECK-NEXT: movq %rdx, %r14
+; CHECK-NEXT: movq %rsi, %rbx
+; CHECK-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
+; CHECK-NEXT: callq __truncdfbf2 at PLT
+; CHECK-NEXT: # kill: def $ax killed $ax def $eax
+; CHECK-NEXT: shll $16, %eax
+; CHECK-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
+; CHECK-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
+; CHECK-NEXT: callq __truncdfbf2 at PLT
+; CHECK-NEXT: # kill: def $ax killed $ax def $eax
+; CHECK-NEXT: shll $16, %eax
+; CHECK-NEXT: movd %eax, %xmm0
+; CHECK-NEXT: addss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload
+; CHECK-NEXT: cvtss2sd %xmm0, %xmm0
+; CHECK-NEXT: movsd %xmm0, (%r14)
+; CHECK-NEXT: addq $8, %rsp
+; CHECK-NEXT: .cfi_def_cfa_offset 24
+; CHECK-NEXT: popq %rbx
+; CHECK-NEXT: .cfi_def_cfa_offset 16
+; CHECK-NEXT: popq %r14
+; CHECK-NEXT: .cfi_def_cfa_offset 8
+; CHECK-NEXT: retq
+ %la = load double, ptr %pa
+ %a = fptrunc double %la to bfloat
+ %lb = load double, ptr %pb
+ %b = fptrunc double %lb to bfloat
+ %add = fadd bfloat %a, %b
+ %dadd = fpext bfloat %add to double
+ store double %dadd, ptr %pc
+ ret void
+}
More information about the llvm-commits
mailing list