Skip to content

Commit 28e4aad

Browse files
authored
[X86][BF16] Add libcall for FP128 -> BF16 (#115825)
This is to fix #115710.
1 parent 956361c commit 28e4aad

File tree

5 files changed

+44
-0
lines changed

5 files changed

+44
-0
lines changed

compiler-rt/lib/builtins/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ set(BF16_SOURCES
194194
truncdfbf2.c
195195
truncxfbf2.c
196196
truncsfbf2.c
197+
trunctfbf2.c
197198
)
198199

199200
set(GENERIC_TF_SOURCES

compiler-rt/lib/builtins/trunctfbf2.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//===--------- lib/trunctfbf2.c - quad -> bfloat conversion -------*- C -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
#define QUAD_PRECISION
9+
#include "fp_lib.h"
10+
11+
#if defined(CRT_HAS_TF_MODE) && defined(__x86_64__)
12+
#define SRC_QUAD
13+
#define DST_BFLOAT
14+
#include "fp_trunc_impl.inc"
15+
16+
COMPILER_RT_ABI dst_t __trunctfbf2(src_t a) { return __truncXfYf2__(a); }
17+
18+
#endif

llvm/include/llvm/IR/RuntimeLibcalls.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,7 @@ HANDLE_LIBCALL(FPROUND_PPCF128_F16, "__trunctfhf2")
383383
HANDLE_LIBCALL(FPROUND_F32_BF16, "__truncsfbf2")
384384
HANDLE_LIBCALL(FPROUND_F64_BF16, "__truncdfbf2")
385385
HANDLE_LIBCALL(FPROUND_F80_BF16, "__truncxfbf2")
386+
HANDLE_LIBCALL(FPROUND_F128_BF16, "__trunctfbf2")
386387
HANDLE_LIBCALL(FPROUND_F64_F32, "__truncdfsf2")
387388
HANDLE_LIBCALL(FPROUND_F80_F32, "__truncxfsf2")
388389
HANDLE_LIBCALL(FPROUND_F128_F32, "__trunctfsf2")

llvm/lib/CodeGen/TargetLoweringBase.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,8 @@ RTLIB::Libcall RTLIB::getFPROUND(EVT OpVT, EVT RetVT) {
171171
return FPROUND_F64_BF16;
172172
if (OpVT == MVT::f80)
173173
return FPROUND_F80_BF16;
174+
if (OpVT == MVT::f128)
175+
return FPROUND_F128_BF16;
174176
} else if (RetVT == MVT::f32) {
175177
if (OpVT == MVT::f64)
176178
return FPROUND_F64_F32;

llvm/test/CodeGen/X86/bfloat.ll

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1975,3 +1975,25 @@ define bfloat @PR108936(x86_fp80 %0) nounwind {
19751975
%2 = fptrunc x86_fp80 %0 to bfloat
19761976
ret bfloat %2
19771977
}
1978+
1979+
define bfloat @PR115710(fp128 %0) nounwind {
1980+
; X86-LABEL: PR115710:
1981+
; X86: # %bb.0:
1982+
; X86-NEXT: subl $28, %esp
1983+
; X86-NEXT: vmovaps {{[0-9]+}}(%esp), %xmm0
1984+
; X86-NEXT: vmovups %xmm0, (%esp)
1985+
; X86-NEXT: calll __trunctfbf2
1986+
; X86-NEXT: # kill: def $ax killed $ax def $eax
1987+
; X86-NEXT: vmovw %eax, %xmm0
1988+
; X86-NEXT: addl $28, %esp
1989+
; X86-NEXT: retl
1990+
;
1991+
; CHECK-LABEL: PR115710:
1992+
; CHECK: # %bb.0:
1993+
; CHECK-NEXT: pushq %rax
1994+
; CHECK-NEXT: callq __trunctfbf2@PLT
1995+
; CHECK-NEXT: popq %rax
1996+
; CHECK-NEXT: retq
1997+
%2 = fptrunc fp128 %0 to bfloat
1998+
ret bfloat %2
1999+
}

0 commit comments

Comments
 (0)