The intrinsic computes the square root for real and complex numbers. By default they are lowered to runtime calls to libpgmath. With the llvm option, it can be lowered to llvm intrinsics (not all types .eg. complex are supported for llvm lowering). 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: schweitz Differential Revision: https://reviews.llvm.org/D122018 Co-authored-by: Eric Schweitz <eschweitz@nvidia.com> Co-authored-by: Jean Perier <jperier@nvidia.com>
43 lines
923 B
Fortran
43 lines
923 B
Fortran
! RUN: bbc -emit-fir %s -o - | FileCheck %s
|
|
! RUN: %flang_fc1 -emit-fir %s -o - | FileCheck %s
|
|
|
|
! CHECK-LABEL: sqrt_testr
|
|
subroutine sqrt_testr(a, b)
|
|
real :: a, b
|
|
! CHECK: fir.call @fir.sqrt.f32.f32
|
|
b = sqrt(a)
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: sqrt_testd
|
|
subroutine sqrt_testd(a, b)
|
|
real(kind=8) :: a, b
|
|
! CHECK: fir.call @fir.sqrt.f64.f64
|
|
b = sqrt(a)
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: sqrt_testc
|
|
subroutine sqrt_testc(z)
|
|
complex :: z
|
|
! CHECK: fir.call @fir.sqrt.z4.z4
|
|
z = sqrt(z)
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: sqrt_testcd
|
|
subroutine sqrt_testcd(z)
|
|
complex(kind=8) :: z
|
|
! CHECK: fir.call @fir.sqrt.z8.z8
|
|
z = sqrt(z)
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: @fir.sqrt.f32.f32
|
|
! CHECK: fir.call {{.*}}mth_i_sqrt
|
|
|
|
! CHECK-LABEL: @fir.sqrt.f64.f64
|
|
! CHECK: fir.call {{.*}}mth_i_dsqrt
|
|
|
|
! CHECK-LABEL: func private @fir.sqrt.z4.z4
|
|
! CHECK: fir.call {{.*}}fc_sqrt
|
|
|
|
! CHECK-LABEL: @fir.sqrt.z8.z8
|
|
! CHECK: fir.call {{.*}}fz_sqrt
|