Skip to content

Commit

Permalink
[SystemZ/z/OS] Add library names for intrinsics (#68114)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
redstar committed Oct 3, 2023
1 parent c3b01b4 commit 42de2b7
Show file tree
Hide file tree
Showing 3 changed files with 158 additions and 0 deletions.
13 changes: 13 additions & 0 deletions llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -691,6 +691,19 @@ SystemZTargetLowering::SystemZTargetLowering(const TargetMachine &TM,

// Default to having -disable-strictnode-mutation on
IsStrictFPEnabled = true;

if (Subtarget.isTargetzOS()) {
struct RTLibCallMapping {
RTLIB::Libcall Code;
const char *Name;
};
static RTLibCallMapping RTLibCallCommon[] = {
#define HANDLE_LIBCALL(code, name) {RTLIB::code, name},
#include "ZOSLibcallNames.def"
};
for (auto &E : RTLibCallCommon)
setLibcallName(E.Code, E.Name);
}
}

bool SystemZTargetLowering::useSoftFloat() const {
Expand Down
100 changes: 100 additions & 0 deletions llvm/lib/Target/SystemZ/ZOSLibcallNames.def
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
//===-- ZOSLibcallNames.def ----------------------------------- -*- 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
//
//===----------------------------------------------------------------------===//
//
// This file defines all of the runtime library functions on z/OS which can be
// generated during instruction selection.
//
//===----------------------------------------------------------------------===//

#if !defined(HANDLE_LIBCALL)
#error "HANDLE_LIBCALL must be defined"
#endif

HANDLE_LIBCALL(TRUNC_F64, "@@TRNC@B")
HANDLE_LIBCALL(TRUNC_F32, "@@FTRC@B")
HANDLE_LIBCALL(TRUNC_F128, "@@LTRC@B")
HANDLE_LIBCALL(SQRT_F64, "@@WSQT@B")
HANDLE_LIBCALL(SQRT_F32, "@@FSQT@B")
HANDLE_LIBCALL(SQRT_F128, "@@LSQT@B")
HANDLE_LIBCALL(SIN_F64, "@@SSIN@B")
HANDLE_LIBCALL(SIN_F32, "@@FSIN@B")
HANDLE_LIBCALL(SIN_F128, "@@LSIN@B")
HANDLE_LIBCALL(ROUND_F64, "@@ROUN@B")
HANDLE_LIBCALL(ROUND_F32, "@@ROUNFB")
HANDLE_LIBCALL(ROUND_F128, "@@ROUNLB")
HANDLE_LIBCALL(RINT_F64, "@@SRNT@B")
HANDLE_LIBCALL(RINT_F32, "@@RINTFB")
HANDLE_LIBCALL(RINT_F128, "@@RINTLB")
HANDLE_LIBCALL(REM_F64, "@@WFMD@B")
HANDLE_LIBCALL(REM_F32, "@@FFMD@B")
HANDLE_LIBCALL(REM_F128, "@@LFMD@B")
HANDLE_LIBCALL(POW_F64, "@@WPOW@B")
HANDLE_LIBCALL(POW_F32, "@@FPOW@B")
HANDLE_LIBCALL(POW_F128, "@@LPOW@B")
HANDLE_LIBCALL(NEARBYINT_F64, "@@NBYI@B")
HANDLE_LIBCALL(NEARBYINT_F32, "@@NBYIFB")
HANDLE_LIBCALL(NEARBYINT_F128, "@@NBYILB")
HANDLE_LIBCALL(LROUND_F64, "@@ROND@B")
HANDLE_LIBCALL(LROUND_F32, "@@FRND@B")
HANDLE_LIBCALL(LROUND_F128, "@@LRND@B")
HANDLE_LIBCALL(LRINT_F64, "@@LRNT@B")
HANDLE_LIBCALL(LRINT_F32, "@@LRNTFB")
HANDLE_LIBCALL(LRINT_F128, "@@LRNTLB")
HANDLE_LIBCALL(LOG_F64, "@@WLOG@B")
HANDLE_LIBCALL(LOG_F32, "@@FLOG@B")
HANDLE_LIBCALL(LOG_F128, "@@LLOG@B")
HANDLE_LIBCALL(LOG2_F64, "@@LOG2@B")
HANDLE_LIBCALL(LOG2_F32, "@@FLG2@B")
HANDLE_LIBCALL(LOG2_F128, "@@LLG2@B")
HANDLE_LIBCALL(LOG10_F64, "@@WLG1@B")
HANDLE_LIBCALL(LOG10_F32, "@@FLG1@B")
HANDLE_LIBCALL(LOG10_F128, "@@LLG1@B")
HANDLE_LIBCALL(LLROUND_F64, "@@LLRD@B")
HANDLE_LIBCALL(LLROUND_F32, "@@LLRDFB")
HANDLE_LIBCALL(LLROUND_F128, "@@LLRDLB")
HANDLE_LIBCALL(LLRINT_F64, "@@LLRT@B")
HANDLE_LIBCALL(LLRINT_F32, "@@LLRTFB")
HANDLE_LIBCALL(LLRINT_F128, "@@LLRTLB")
HANDLE_LIBCALL(LDEXP_F64, "@@SLXP@B")
HANDLE_LIBCALL(LDEXP_F32, "@@FLXP@B")
HANDLE_LIBCALL(LDEXP_F128, "@@LLXP@B")
HANDLE_LIBCALL(FREXP_F64, "@@SFXP@B")
HANDLE_LIBCALL(FREXP_F32, "@@FFXP@B")
HANDLE_LIBCALL(FREXP_F128, "@@LFXP@B")
HANDLE_LIBCALL(FMIN_F64, "@@FMIN@B")
HANDLE_LIBCALL(FMIN_F32, "@@FMINFB")
HANDLE_LIBCALL(FMIN_F128, "@@FMINLB")
HANDLE_LIBCALL(FMA_F64, "@@FMA@B")
HANDLE_LIBCALL(FMA_F32, "@@FMAFB")
HANDLE_LIBCALL(FMA_F128, "@@FMALB")
HANDLE_LIBCALL(FMAX_F64, "@@FMAX@B")
HANDLE_LIBCALL(FMAX_F32, "@@FMAXFB")
HANDLE_LIBCALL(FMAX_F128, "@@FMAXLB")
HANDLE_LIBCALL(FLOOR_F64, "@@SFLR@B")
HANDLE_LIBCALL(FLOOR_F32, "@@FFLR@B")
HANDLE_LIBCALL(FLOOR_F128, "@@LFLR@B")
HANDLE_LIBCALL(EXP_F64, "@@WEXP@B")
HANDLE_LIBCALL(EXP_F32, "@@FEXP@B")
HANDLE_LIBCALL(EXP_F128, "@@LEXP@B")
HANDLE_LIBCALL(EXP2_F64, "@@EXP2@B")
HANDLE_LIBCALL(EXP2_F32, "@@FXP2@B")
HANDLE_LIBCALL(EXP2_F128, "@@LXP2@B")
HANDLE_LIBCALL(COS_F64, "@@SCOS@B")
HANDLE_LIBCALL(COS_F32, "@@FCOS@B")
HANDLE_LIBCALL(COS_F128, "@@LCOS@B")
HANDLE_LIBCALL(COPYSIGN_F64, "@@DCPY@B")
HANDLE_LIBCALL(COPYSIGN_F32, "@@FCPY@B")
HANDLE_LIBCALL(COPYSIGN_F128, "@@LCPY@B")
HANDLE_LIBCALL(CEIL_F64, "@@SCEL@B")
HANDLE_LIBCALL(CEIL_F32, "@@FCEL@B")
HANDLE_LIBCALL(CEIL_F128, "@@LCEL@B")
HANDLE_LIBCALL(CBRT_F64, "@@SCRT@B")
HANDLE_LIBCALL(CBRT_F32, "@@FCBT@B")
HANDLE_LIBCALL(CBRT_F128, "@@LCBT@B")

#undef HANDLE_LIBCALL
45 changes: 45 additions & 0 deletions llvm/test/CodeGen/SystemZ/zos-intrinsics.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
; RUN: llc -mtriple s390x-zos < %s | FileCheck %s

define float @sqrt_ieee(float %x) {
entry:
%res = call float @llvm.sqrt.f32(float %x)
ret float %res
}

define float @cos_ieee(float %x) {
entry:
%res = call float @llvm.cos.f32(float %x)
ret float %res
}

define double @sin_ieee(double %x) {
entry:
%res = call double @llvm.sin.f64(double %x)
ret double %res
}

define fp128 @exp2_ieee(fp128 %x) {
entry:
%res = call fp128 @llvm.exp2.f128(fp128 %x)
ret fp128 %res
}

declare float @llvm.sqrt.f32(float)
declare float @llvm.cos.f32(float)
declare double @llvm.sin.f64(double)
declare fp128 @llvm.exp2.f128(fp128)

; Check the calls in the ADA.
; CHECK: .section ".ada"

; Check that there is no call to sqrt.
; CHECK-NOT: .quad R(@@WSQT@B)
; CHECK-NOT: .quad V(@@WSQT@B)

; Check that there is the correct library call.
; CHECK: .quad R(@@FCOS@B)
; CHECK-NEXT: .quad V(@@FCOS@B)
; CHECK: .quad R(@@SSIN@B)
; CHECK-NEXT: .quad V(@@SSIN@B)
; CHECK: .quad R(@@LXP2@B)
; CHECK-NEXT: .quad V(@@LXP2@B)

0 comments on commit 42de2b7

Please sign in to comment.