mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-26 17:57:07 +00:00
7a9891c598
The intrinsic computes the sin, cosine values. By default they are lowered to runtime calls to the pgmath library, for llvm lowering they are lowered to llvm intrinsics. The generic and llvm lowering does not lower floating point types with kind greater than 8, the llvm lowering does not support the complex types. This is part of the upstreaming effort from the fir-dev branch in [1]. [1] https://github.com/flang-compiler/f18-llvm-project Reviewed By: clementval Differential Revision: https://reviews.llvm.org/D122320 Co-authored-by: Eric Schweitz <eschweitz@nvidia.com>
219 lines
5.8 KiB
Fortran
219 lines
5.8 KiB
Fortran
! RUN: bbc -emit-fir %s -o - --math-runtime=llvm | FileCheck %s
|
|
|
|
SUBROUTINE POW_WRAPPER(IN, IN2, OUT)
|
|
DOUBLE PRECISION IN, IN2
|
|
OUT = IN ** IN2
|
|
RETURN
|
|
END
|
|
|
|
! CHECK-LABEL: func @_QPpow_wrapper(
|
|
! CHECK-SAME: %{{.*}}: !fir.ref<f64>{{.*}}, %{{.*}}: !fir.ref<f64>{{.*}}, %{{.*}}: !fir.ref<f32>{{.*}}) {
|
|
! CHECK-NEXT: %0 = fir.load %arg0 : !fir.ref<f64>
|
|
! CHECK-NEXT: %1 = fir.load %arg1 : !fir.ref<f64>
|
|
! CHECK-NEXT: %2 = fir.call @llvm.pow.f64(%0, %1) : (f64, f64) -> f64
|
|
|
|
SUBROUTINE POWF_WRAPPER(IN, IN2, OUT)
|
|
REAL IN, IN2
|
|
OUT = IN ** IN2
|
|
RETURN
|
|
END
|
|
|
|
! CHECK-LABEL: func @_QPpowf_wrapper(
|
|
! CHECK-SAME: %{{.*}}: !fir.ref<f32>{{.*}}, %{{.*}}: !fir.ref<f32>{{.*}}, %{{.*}}: !fir.ref<f32>{{.*}}) {
|
|
! CHECK-NEXT: %0 = fir.load %arg0 : !fir.ref<f32>
|
|
! CHECK-NEXT: %1 = fir.load %arg1 : !fir.ref<f32>
|
|
! CHECK-NEXT: %2 = fir.call @llvm.pow.f32(%0, %1) : (f32, f32) -> f32
|
|
|
|
SUBROUTINE ATAN_WRAPPER(IN, OUT)
|
|
DOUBLE PRECISION IN
|
|
OUT = DATAN(IN)
|
|
RETURN
|
|
END
|
|
|
|
! CHECK: func private @fir.atan.f64.f64(%arg0: f64)
|
|
! CHECK-NEXT: %0 = fir.call @atan(%arg0) : (f64) -> f64
|
|
! CHECK-NEXT: return %0 : f64
|
|
! CHECK-NEXT: }
|
|
|
|
SUBROUTINE EXP_WRAPPER(IN, OUT)
|
|
DOUBLE PRECISION IN
|
|
OUT = DEXP(IN)
|
|
RETURN
|
|
END
|
|
|
|
! CHECK: func private @fir.exp.f64.f64(%arg0: f64)
|
|
! CHECK-NEXT: %0 = fir.call @llvm.exp.f64(%arg0) : (f64) -> f64
|
|
! CHECK-NEXT: return %0 : f64
|
|
! CHECK-NEXT: }
|
|
|
|
SUBROUTINE SINH_WRAPPER(IN, OUT)
|
|
DOUBLE PRECISION IN
|
|
OUT = DSINH(IN)
|
|
RETURN
|
|
END
|
|
|
|
! CHECK: func private @fir.sinh.f64.f64(%arg0: f64)
|
|
! CHECK-NEXT: %0 = fir.call @sinh(%arg0) : (f64) -> f64
|
|
! CHECK-NEXT: return %0 : f64
|
|
! CHECK-NEXT: }
|
|
|
|
SUBROUTINE COSH_WRAPPER(IN, OUT)
|
|
DOUBLE PRECISION IN
|
|
OUT = DCOSH(IN)
|
|
RETURN
|
|
END
|
|
|
|
! CHECK: func private @fir.cosh.f64.f64(%arg0: f64)
|
|
! CHECK-NEXT: %0 = fir.call @cosh(%arg0) : (f64) -> f64
|
|
! CHECK-NEXT: return %0 : f64
|
|
! CHECK-NEXT: }
|
|
|
|
|
|
SUBROUTINE ATANF_WRAPPER(IN, OUT)
|
|
REAL IN
|
|
OUT = ATAN(IN)
|
|
RETURN
|
|
END
|
|
|
|
! CHECK: func private @fir.atan.f32.f32(%arg0: f32)
|
|
! CHECK-NEXT: %0 = fir.call @atanf(%arg0) : (f32) -> f32
|
|
! CHECK-NEXT: return %0 : f32
|
|
! CHECK-NEXT: }
|
|
|
|
SUBROUTINE EXPF_WRAPPER(IN, OUT)
|
|
REAL IN
|
|
OUT = EXP(IN)
|
|
RETURN
|
|
END
|
|
|
|
! CHECK: func private @fir.exp.f32.f32(%arg0: f32)
|
|
! CHECK-NEXT: %0 = fir.call @llvm.exp.f32(%arg0) : (f32) -> f32
|
|
! CHECK-NEXT: return %0 : f32
|
|
! CHECK-NEXT: }
|
|
|
|
SUBROUTINE SINHF_WRAPPER(IN, OUT)
|
|
REAL IN
|
|
OUT = SINH(IN)
|
|
RETURN
|
|
END
|
|
|
|
! CHECK: func private @fir.sinh.f32.f32(%arg0: f32)
|
|
! CHECK-NEXT: %0 = fir.call @sinhf(%arg0) : (f32) -> f32
|
|
! CHECK-NEXT: return %0 : f32
|
|
! CHECK-NEXT: }
|
|
|
|
SUBROUTINE COSHF_WRAPPER(IN, OUT)
|
|
REAL IN
|
|
OUT = COSH(IN)
|
|
RETURN
|
|
END
|
|
|
|
! CHECK: func private @fir.cosh.f32.f32(%arg0: f32)
|
|
! CHECK-NEXT: %0 = fir.call @coshf(%arg0) : (f32) -> f32
|
|
! CHECK-NEXT: return %0 : f32
|
|
! CHECK-NEXT: }
|
|
|
|
SUBROUTINE LOG_WRAPPER(IN, OUT)
|
|
DOUBLE PRECISION IN, OUT
|
|
OUT = DLOG(IN)
|
|
RETURN
|
|
END
|
|
|
|
! CHECK: func private @fir.log.f64.f64(%arg0: f64)
|
|
! CHECK-NEXT: %0 = fir.call @llvm.log.f64(%arg0) : (f64) -> f64
|
|
! CHECK-NEXT: return %0 : f64
|
|
! CHECK-NEXT: }
|
|
|
|
SUBROUTINE LOG10_WRAPPER(IN, OUT)
|
|
DOUBLE PRECISION IN, OUT
|
|
OUT = DLOG10(IN)
|
|
RETURN
|
|
END
|
|
|
|
! CHECK: func private @fir.log10.f64.f64(%arg0: f64)
|
|
! CHECK-NEXT: %0 = fir.call @llvm.log10.f64(%arg0) : (f64) -> f64
|
|
! CHECK-NEXT: return %0 : f64
|
|
! CHECK-NEXT: }
|
|
|
|
SUBROUTINE LOGF_WRAPPER(IN, OUT)
|
|
REAL IN, OUT
|
|
OUT = LOG(IN)
|
|
RETURN
|
|
END
|
|
|
|
! CHECK: func private @fir.log.f32.f32(%arg0: f32)
|
|
! CHECK-NEXT: %0 = fir.call @llvm.log.f32(%arg0) : (f32) -> f32
|
|
! CHECK-NEXT: return %0 : f32
|
|
! CHECK-NEXT: }
|
|
|
|
SUBROUTINE LOG10F_WRAPPER(IN, OUT)
|
|
REAL IN, OUT
|
|
OUT = LOG10(IN)
|
|
RETURN
|
|
END
|
|
|
|
! CHECK: func private @fir.log10.f32.f32(%arg0: f32)
|
|
! CHECK-NEXT: %0 = fir.call @llvm.log10.f32(%arg0) : (f32) -> f32
|
|
! CHECK-NEXT: return %0 : f32
|
|
! CHECK-NEXT: }
|
|
|
|
SUBROUTINE SQRT_WRAPPER(IN, OUT)
|
|
REAL :: IN, OUT
|
|
OUT = SQRT(IN)
|
|
END SUBROUTINE
|
|
|
|
! CHECK-LABEL: func private @fir.sqrt.f32.f32(%arg0: f32)
|
|
! CHECK-NEXT: %0 = fir.call @llvm.sqrt.f32(%arg0) : (f32) -> f32
|
|
! CHECK-NEXT: return %0 : f32
|
|
! CHECK-NEXT: }
|
|
|
|
SUBROUTINE SQRTD_WRAPPER(IN, OUT)
|
|
REAL(KIND=8) :: IN, OUT
|
|
OUT = SQRT(IN)
|
|
END SUBROUTINE
|
|
|
|
! CHECK-LABEL: func private @fir.sqrt.f64.f64(%arg0: f64)
|
|
! CHECK-NEXT: %0 = fir.call @llvm.sqrt.f64(%arg0) : (f64) -> f64
|
|
! CHECK-NEXT: return %0 : f64
|
|
! CHECK-NEXT: }
|
|
|
|
SUBROUTINE COS_WRAPPER(IN, OUT)
|
|
REAL :: IN, OUT
|
|
OUT = COS(IN)
|
|
END SUBROUTINE
|
|
|
|
! CHECK-LABEL: func private @fir.cos.f32.f32(%arg0: f32)
|
|
! CHECK-NEXT: %0 = fir.call @llvm.cos.f32(%arg0) : (f32) -> f32
|
|
! CHECK-NEXT: return %0 : f32
|
|
! CHECK-NEXT: }
|
|
|
|
SUBROUTINE COSD_WRAPPER(IN, OUT)
|
|
REAL(KIND=8) :: IN, OUT
|
|
OUT = COS(IN)
|
|
END SUBROUTINE
|
|
|
|
! CHECK-LABEL: func private @fir.cos.f64.f64(%arg0: f64)
|
|
! CHECK-NEXT: %0 = fir.call @llvm.cos.f64(%arg0) : (f64) -> f64
|
|
! CHECK-NEXT: return %0 : f64
|
|
! CHECK-NEXT: }
|
|
|
|
SUBROUTINE SIN_WRAPPER(IN, OUT)
|
|
REAL :: IN, OUT
|
|
OUT = SIN(IN)
|
|
END SUBROUTINE
|
|
|
|
! CHECK-LABEL: func private @fir.sin.f32.f32(%arg0: f32)
|
|
! CHECK-NEXT: %0 = fir.call @llvm.sin.f32(%arg0) : (f32) -> f32
|
|
! CHECK-NEXT: return %0 : f32
|
|
! CHECK-NEXT: }
|
|
|
|
SUBROUTINE SIND_WRAPPER(IN, OUT)
|
|
REAL(KIND=8) :: IN, OUT
|
|
OUT = SIN(IN)
|
|
END SUBROUTINE
|
|
|
|
! CHECK-LABEL: func private @fir.sin.f64.f64(%arg0: f64)
|
|
! CHECK-NEXT: %0 = fir.call @llvm.sin.f64(%arg0) : (f64) -> f64
|
|
! CHECK-NEXT: return %0 : f64
|
|
! CHECK-NEXT: }
|