Skip to content

Commit

Permalink
Reland "[X86][BF16] Add libcall for F80 -> BF16 (#109116)" (#109143)
Browse files Browse the repository at this point in the history
This reverts commit ababfee.

Add X86 FP80 check.
  • Loading branch information
phoebewang authored Sep 19, 2024
1 parent dc6876f commit c18be32
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 0 deletions.
1 change: 1 addition & 0 deletions compiler-rt/lib/builtins/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@ set(GENERIC_SOURCES
set(BF16_SOURCES
extendbfsf2.c
truncdfbf2.c
truncxfbf2.c
truncsfbf2.c
)

Expand Down
12 changes: 12 additions & 0 deletions compiler-rt/lib/builtins/fp_trunc.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,18 @@ static const int srcSigFracBits = 52;
// srcBits - srcSigFracBits - 1
static const int srcExpBits = 11;

#elif defined SRC_80
typedef xf_float src_t;
typedef __uint128_t src_rep_t;
#define SRC_REP_C (__uint128_t)
// sign bit, exponent and significand occupy the lower 80 bits.
static const int srcBits = 80;
static const int srcSigFracBits = 63;
// -1 accounts for the sign bit.
// -1 accounts for the explicitly stored integer bit.
// srcBits - srcSigFracBits - 1 - 1
static const int srcExpBits = 15;

#elif defined SRC_QUAD
typedef tf_float src_t;
typedef __uint128_t src_rep_t;
Expand Down
16 changes: 16 additions & 0 deletions compiler-rt/lib/builtins/truncxfbf2.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//===-- lib/truncxfbf2.c - long 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
//
//===----------------------------------------------------------------------===//

#if defined(CRT_HAS_TF_MODE) && __LDBL_MANT_DIG__ == 64 && defined(__x86_64__)
#define SRC_80
#define DST_BFLOAT
#include "fp_trunc_impl.inc"

COMPILER_RT_ABI dst_t __truncxfbf2(long double a) { return __truncXfYf2__(a); }

#endif
1 change: 1 addition & 0 deletions llvm/include/llvm/IR/RuntimeLibcalls.def
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,7 @@ 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_F80_BF16, "__truncxfbf2")
HANDLE_LIBCALL(FPROUND_F64_F32, "__truncdfsf2")
HANDLE_LIBCALL(FPROUND_F80_F32, "__truncxfsf2")
HANDLE_LIBCALL(FPROUND_F128_F32, "__trunctfsf2")
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/CodeGen/TargetLoweringBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,8 @@ RTLIB::Libcall RTLIB::getFPROUND(EVT OpVT, EVT RetVT) {
return FPROUND_F32_BF16;
if (OpVT == MVT::f64)
return FPROUND_F64_BF16;
if (OpVT == MVT::f80)
return FPROUND_F80_BF16;
} else if (RetVT == MVT::f32) {
if (OpVT == MVT::f64)
return FPROUND_F64_F32;
Expand Down
22 changes: 22 additions & 0 deletions llvm/test/CodeGen/X86/bfloat.ll
Original file line number Diff line number Diff line change
Expand Up @@ -1953,3 +1953,25 @@ define void @PR92471(ptr %0, ptr %1) nounwind {
store <7 x float> %4, ptr %1, align 4
ret void
}

define bfloat @PR108936(x86_fp80 %0) nounwind {
; X86-LABEL: PR108936:
; X86: # %bb.0:
; X86-NEXT: subl $12, %esp
; X86-NEXT: fldt {{[0-9]+}}(%esp)
; X86-NEXT: fstpt (%esp)
; X86-NEXT: calll __truncxfbf2
; X86-NEXT: addl $12, %esp
; X86-NEXT: retl
;
; CHECK-LABEL: PR108936:
; CHECK: # %bb.0:
; CHECK-NEXT: subq $24, %rsp
; CHECK-NEXT: fldt {{[0-9]+}}(%rsp)
; CHECK-NEXT: fstpt (%rsp)
; CHECK-NEXT: callq __truncxfbf2@PLT
; CHECK-NEXT: addq $24, %rsp
; CHECK-NEXT: retq
%2 = fptrunc x86_fp80 %0 to bfloat
ret bfloat %2
}

0 comments on commit c18be32

Please sign in to comment.