Skip to content

Commit 42de2b7

Browse files
authored
[SystemZ/z/OS] Add library names for intrinsics (#68114)
On z/OS, many library functions have a non-standard name. This change initializes the table of runtime function which results from lowering intrinsics to library calls.
1 parent c3b01b4 commit 42de2b7

File tree

3 files changed

+158
-0
lines changed

3 files changed

+158
-0
lines changed

llvm/lib/Target/SystemZ/SystemZISelLowering.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,19 @@ SystemZTargetLowering::SystemZTargetLowering(const TargetMachine &TM,
691691

692692
// Default to having -disable-strictnode-mutation on
693693
IsStrictFPEnabled = true;
694+
695+
if (Subtarget.isTargetzOS()) {
696+
struct RTLibCallMapping {
697+
RTLIB::Libcall Code;
698+
const char *Name;
699+
};
700+
static RTLibCallMapping RTLibCallCommon[] = {
701+
#define HANDLE_LIBCALL(code, name) {RTLIB::code, name},
702+
#include "ZOSLibcallNames.def"
703+
};
704+
for (auto &E : RTLibCallCommon)
705+
setLibcallName(E.Code, E.Name);
706+
}
694707
}
695708

696709
bool SystemZTargetLowering::useSoftFloat() const {
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
//===-- ZOSLibcallNames.def ----------------------------------- -*- 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+
//
9+
// This file defines all of the runtime library functions on z/OS which can be
10+
// generated during instruction selection.
11+
//
12+
//===----------------------------------------------------------------------===//
13+
14+
#if !defined(HANDLE_LIBCALL)
15+
#error "HANDLE_LIBCALL must be defined"
16+
#endif
17+
18+
HANDLE_LIBCALL(TRUNC_F64, "@@TRNC@B")
19+
HANDLE_LIBCALL(TRUNC_F32, "@@FTRC@B")
20+
HANDLE_LIBCALL(TRUNC_F128, "@@LTRC@B")
21+
HANDLE_LIBCALL(SQRT_F64, "@@WSQT@B")
22+
HANDLE_LIBCALL(SQRT_F32, "@@FSQT@B")
23+
HANDLE_LIBCALL(SQRT_F128, "@@LSQT@B")
24+
HANDLE_LIBCALL(SIN_F64, "@@SSIN@B")
25+
HANDLE_LIBCALL(SIN_F32, "@@FSIN@B")
26+
HANDLE_LIBCALL(SIN_F128, "@@LSIN@B")
27+
HANDLE_LIBCALL(ROUND_F64, "@@ROUN@B")
28+
HANDLE_LIBCALL(ROUND_F32, "@@ROUNFB")
29+
HANDLE_LIBCALL(ROUND_F128, "@@ROUNLB")
30+
HANDLE_LIBCALL(RINT_F64, "@@SRNT@B")
31+
HANDLE_LIBCALL(RINT_F32, "@@RINTFB")
32+
HANDLE_LIBCALL(RINT_F128, "@@RINTLB")
33+
HANDLE_LIBCALL(REM_F64, "@@WFMD@B")
34+
HANDLE_LIBCALL(REM_F32, "@@FFMD@B")
35+
HANDLE_LIBCALL(REM_F128, "@@LFMD@B")
36+
HANDLE_LIBCALL(POW_F64, "@@WPOW@B")
37+
HANDLE_LIBCALL(POW_F32, "@@FPOW@B")
38+
HANDLE_LIBCALL(POW_F128, "@@LPOW@B")
39+
HANDLE_LIBCALL(NEARBYINT_F64, "@@NBYI@B")
40+
HANDLE_LIBCALL(NEARBYINT_F32, "@@NBYIFB")
41+
HANDLE_LIBCALL(NEARBYINT_F128, "@@NBYILB")
42+
HANDLE_LIBCALL(LROUND_F64, "@@ROND@B")
43+
HANDLE_LIBCALL(LROUND_F32, "@@FRND@B")
44+
HANDLE_LIBCALL(LROUND_F128, "@@LRND@B")
45+
HANDLE_LIBCALL(LRINT_F64, "@@LRNT@B")
46+
HANDLE_LIBCALL(LRINT_F32, "@@LRNTFB")
47+
HANDLE_LIBCALL(LRINT_F128, "@@LRNTLB")
48+
HANDLE_LIBCALL(LOG_F64, "@@WLOG@B")
49+
HANDLE_LIBCALL(LOG_F32, "@@FLOG@B")
50+
HANDLE_LIBCALL(LOG_F128, "@@LLOG@B")
51+
HANDLE_LIBCALL(LOG2_F64, "@@LOG2@B")
52+
HANDLE_LIBCALL(LOG2_F32, "@@FLG2@B")
53+
HANDLE_LIBCALL(LOG2_F128, "@@LLG2@B")
54+
HANDLE_LIBCALL(LOG10_F64, "@@WLG1@B")
55+
HANDLE_LIBCALL(LOG10_F32, "@@FLG1@B")
56+
HANDLE_LIBCALL(LOG10_F128, "@@LLG1@B")
57+
HANDLE_LIBCALL(LLROUND_F64, "@@LLRD@B")
58+
HANDLE_LIBCALL(LLROUND_F32, "@@LLRDFB")
59+
HANDLE_LIBCALL(LLROUND_F128, "@@LLRDLB")
60+
HANDLE_LIBCALL(LLRINT_F64, "@@LLRT@B")
61+
HANDLE_LIBCALL(LLRINT_F32, "@@LLRTFB")
62+
HANDLE_LIBCALL(LLRINT_F128, "@@LLRTLB")
63+
HANDLE_LIBCALL(LDEXP_F64, "@@SLXP@B")
64+
HANDLE_LIBCALL(LDEXP_F32, "@@FLXP@B")
65+
HANDLE_LIBCALL(LDEXP_F128, "@@LLXP@B")
66+
HANDLE_LIBCALL(FREXP_F64, "@@SFXP@B")
67+
HANDLE_LIBCALL(FREXP_F32, "@@FFXP@B")
68+
HANDLE_LIBCALL(FREXP_F128, "@@LFXP@B")
69+
HANDLE_LIBCALL(FMIN_F64, "@@FMIN@B")
70+
HANDLE_LIBCALL(FMIN_F32, "@@FMINFB")
71+
HANDLE_LIBCALL(FMIN_F128, "@@FMINLB")
72+
HANDLE_LIBCALL(FMA_F64, "@@FMA@B")
73+
HANDLE_LIBCALL(FMA_F32, "@@FMAFB")
74+
HANDLE_LIBCALL(FMA_F128, "@@FMALB")
75+
HANDLE_LIBCALL(FMAX_F64, "@@FMAX@B")
76+
HANDLE_LIBCALL(FMAX_F32, "@@FMAXFB")
77+
HANDLE_LIBCALL(FMAX_F128, "@@FMAXLB")
78+
HANDLE_LIBCALL(FLOOR_F64, "@@SFLR@B")
79+
HANDLE_LIBCALL(FLOOR_F32, "@@FFLR@B")
80+
HANDLE_LIBCALL(FLOOR_F128, "@@LFLR@B")
81+
HANDLE_LIBCALL(EXP_F64, "@@WEXP@B")
82+
HANDLE_LIBCALL(EXP_F32, "@@FEXP@B")
83+
HANDLE_LIBCALL(EXP_F128, "@@LEXP@B")
84+
HANDLE_LIBCALL(EXP2_F64, "@@EXP2@B")
85+
HANDLE_LIBCALL(EXP2_F32, "@@FXP2@B")
86+
HANDLE_LIBCALL(EXP2_F128, "@@LXP2@B")
87+
HANDLE_LIBCALL(COS_F64, "@@SCOS@B")
88+
HANDLE_LIBCALL(COS_F32, "@@FCOS@B")
89+
HANDLE_LIBCALL(COS_F128, "@@LCOS@B")
90+
HANDLE_LIBCALL(COPYSIGN_F64, "@@DCPY@B")
91+
HANDLE_LIBCALL(COPYSIGN_F32, "@@FCPY@B")
92+
HANDLE_LIBCALL(COPYSIGN_F128, "@@LCPY@B")
93+
HANDLE_LIBCALL(CEIL_F64, "@@SCEL@B")
94+
HANDLE_LIBCALL(CEIL_F32, "@@FCEL@B")
95+
HANDLE_LIBCALL(CEIL_F128, "@@LCEL@B")
96+
HANDLE_LIBCALL(CBRT_F64, "@@SCRT@B")
97+
HANDLE_LIBCALL(CBRT_F32, "@@FCBT@B")
98+
HANDLE_LIBCALL(CBRT_F128, "@@LCBT@B")
99+
100+
#undef HANDLE_LIBCALL
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
; RUN: llc -mtriple s390x-zos < %s | FileCheck %s
2+
3+
define float @sqrt_ieee(float %x) {
4+
entry:
5+
%res = call float @llvm.sqrt.f32(float %x)
6+
ret float %res
7+
}
8+
9+
define float @cos_ieee(float %x) {
10+
entry:
11+
%res = call float @llvm.cos.f32(float %x)
12+
ret float %res
13+
}
14+
15+
define double @sin_ieee(double %x) {
16+
entry:
17+
%res = call double @llvm.sin.f64(double %x)
18+
ret double %res
19+
}
20+
21+
define fp128 @exp2_ieee(fp128 %x) {
22+
entry:
23+
%res = call fp128 @llvm.exp2.f128(fp128 %x)
24+
ret fp128 %res
25+
}
26+
27+
declare float @llvm.sqrt.f32(float)
28+
declare float @llvm.cos.f32(float)
29+
declare double @llvm.sin.f64(double)
30+
declare fp128 @llvm.exp2.f128(fp128)
31+
32+
; Check the calls in the ADA.
33+
; CHECK: .section ".ada"
34+
35+
; Check that there is no call to sqrt.
36+
; CHECK-NOT: .quad R(@@WSQT@B)
37+
; CHECK-NOT: .quad V(@@WSQT@B)
38+
39+
; Check that there is the correct library call.
40+
; CHECK: .quad R(@@FCOS@B)
41+
; CHECK-NEXT: .quad V(@@FCOS@B)
42+
; CHECK: .quad R(@@SSIN@B)
43+
; CHECK-NEXT: .quad V(@@SSIN@B)
44+
; CHECK: .quad R(@@LXP2@B)
45+
; CHECK-NEXT: .quad V(@@LXP2@B)

0 commit comments

Comments
 (0)