
The logic for marking runtime libcalls unavailable currently duplicates essentially the same logic for some random subset of targets, where someone reported an issue and then someone went and fixed the issue for that specific target only. However, the availability for most of these is completely target independent. In particular: * MULO_I128 is never available in libgcc * Various I128 libcalls are not available for 32-bit targets in libgcc * powi is never available in MSVCRT Unify the logic for these, so we don't miss any targets. This fixes https://github.com/llvm/llvm-project/issues/16778 on AArch64, which is one of the targets that was previously missed in this logic.
172 lines
3.8 KiB
LLVM
172 lines
3.8 KiB
LLVM
; RUN: llc < %s -mtriple=xcore | FileCheck %s
|
|
declare double @llvm.cos.f64(double)
|
|
declare double @llvm.exp.f64(double)
|
|
declare double @llvm.exp2.f64(double)
|
|
declare double @llvm.log.f64(double)
|
|
declare double @llvm.log10.f64(double)
|
|
declare double @llvm.log2.f64(double)
|
|
declare double @llvm.pow.f64(double, double)
|
|
declare double @llvm.powi.f64.i32(double, i32)
|
|
declare double @llvm.sin.f64(double)
|
|
declare double @llvm.sqrt.f64(double)
|
|
|
|
define double @cos(double %F) {
|
|
; CHECK-LABEL: cos:
|
|
; CHECK: bl cos
|
|
%result = call double @llvm.cos.f64(double %F)
|
|
ret double %result
|
|
}
|
|
|
|
declare float @llvm.cos.f32(float)
|
|
|
|
; CHECK-LABEL: cosf:
|
|
; CHECK: bl cosf
|
|
define float @cosf(float %F) {
|
|
%result = call float @llvm.cos.f32(float %F)
|
|
ret float %result
|
|
}
|
|
|
|
define double @exp(double %F) {
|
|
; CHECK-LABEL: exp:
|
|
; CHECK: bl exp
|
|
%result = call double @llvm.exp.f64(double %F)
|
|
ret double %result
|
|
}
|
|
|
|
declare float @llvm.exp.f32(float)
|
|
|
|
define float @expf(float %F) {
|
|
; CHECK-LABEL: expf:
|
|
; CHECK: bl expf
|
|
%result = call float @llvm.exp.f32(float %F)
|
|
ret float %result
|
|
}
|
|
|
|
define double @exp2(double %F) {
|
|
; CHECK-LABEL: exp2:
|
|
; CHECK: bl exp2
|
|
%result = call double @llvm.exp2.f64(double %F)
|
|
ret double %result
|
|
}
|
|
|
|
declare float @llvm.exp2.f32(float)
|
|
|
|
define float @exp2f(float %F) {
|
|
; CHECK-LABEL: exp2f:
|
|
; CHECK: bl exp2f
|
|
%result = call float @llvm.exp2.f32(float %F)
|
|
ret float %result
|
|
}
|
|
|
|
define double @log(double %F) {
|
|
; CHECK-LABEL: log:
|
|
; CHECK: bl log
|
|
%result = call double @llvm.log.f64(double %F)
|
|
ret double %result
|
|
}
|
|
|
|
declare float @llvm.log.f32(float)
|
|
|
|
define float @logf(float %F) {
|
|
; CHECK-LABEL: logf:
|
|
; CHECK: bl logf
|
|
%result = call float @llvm.log.f32(float %F)
|
|
ret float %result
|
|
}
|
|
|
|
define double @log10(double %F) {
|
|
; CHECK-LABEL: log10:
|
|
; CHECK: bl log10
|
|
%result = call double @llvm.log10.f64(double %F)
|
|
ret double %result
|
|
}
|
|
|
|
declare float @llvm.log10.f32(float)
|
|
|
|
define float @log10f(float %F) {
|
|
; CHECK-LABEL: log10f:
|
|
; CHECK: bl log10f
|
|
%result = call float @llvm.log10.f32(float %F)
|
|
ret float %result
|
|
}
|
|
|
|
define double @log2(double %F) {
|
|
; CHECK-LABEL: log2:
|
|
; CHECK: bl log2
|
|
%result = call double @llvm.log2.f64(double %F)
|
|
ret double %result
|
|
}
|
|
|
|
declare float @llvm.log2.f32(float)
|
|
|
|
define float @log2f(float %F) {
|
|
; CHECK-LABEL: log2f:
|
|
; CHECK: bl log2f
|
|
%result = call float @llvm.log2.f32(float %F)
|
|
ret float %result
|
|
}
|
|
|
|
define double @pow(double %F, double %power) {
|
|
; CHECK-LABEL: pow:
|
|
; CHECK: bl pow
|
|
%result = call double @llvm.pow.f64(double %F, double %power)
|
|
ret double %result
|
|
}
|
|
|
|
declare float @llvm.pow.f32(float, float)
|
|
|
|
define float @powf(float %F, float %power) {
|
|
; CHECK-LABEL: powf:
|
|
; CHECK: bl powf
|
|
%result = call float @llvm.pow.f32(float %F, float %power)
|
|
ret float %result
|
|
}
|
|
|
|
define double @powi(double %F, i32 %power) {
|
|
; CHECK-LABEL: powi:
|
|
; CHECK: bl __powidf2
|
|
%result = call double @llvm.powi.f64.i32(double %F, i32 %power)
|
|
ret double %result
|
|
}
|
|
|
|
declare float @llvm.powi.f32.i32(float, i32)
|
|
|
|
define float @powif(float %F, i32 %power) {
|
|
; CHECK-LABEL: powif:
|
|
; CHECK: bl __powisf2
|
|
%result = call float @llvm.powi.f32.i32(float %F, i32 %power)
|
|
ret float %result
|
|
}
|
|
|
|
define double @sin(double %F) {
|
|
; CHECK-LABEL: sin:
|
|
; CHECK: bl sin
|
|
%result = call double @llvm.sin.f64(double %F)
|
|
ret double %result
|
|
}
|
|
|
|
declare float @llvm.sin.f32(float)
|
|
|
|
define float @sinf(float %F) {
|
|
; CHECK-LABEL: sinf:
|
|
; CHECK: bl sinf
|
|
%result = call float @llvm.sin.f32(float %F)
|
|
ret float %result
|
|
}
|
|
|
|
define double @sqrt(double %F) {
|
|
; CHECK-LABEL: sqrt:
|
|
; CHECK: bl sqrt
|
|
%result = call double @llvm.sqrt.f64(double %F)
|
|
ret double %result
|
|
}
|
|
|
|
declare float @llvm.sqrt.f32(float)
|
|
|
|
define float @sqrtf(float %F) {
|
|
; CHECK-LABEL: sqrtf:
|
|
; CHECK: bl sqrtf
|
|
%result = call float @llvm.sqrt.f32(float %F)
|
|
ret float %result
|
|
}
|