diff --git a/flang/lib/Lower/IntrinsicCall.cpp b/flang/lib/Lower/IntrinsicCall.cpp index 67c50eb4bbdc6..104fb7e6792f6 100644 --- a/flang/lib/Lower/IntrinsicCall.cpp +++ b/flang/lib/Lower/IntrinsicCall.cpp @@ -509,12 +509,16 @@ struct IntrinsicLibrary { void genRandomSeed(llvm::ArrayRef); fir::ExtendedValue genRepeat(mlir::Type, llvm::ArrayRef); fir::ExtendedValue genReshape(mlir::Type, llvm::ArrayRef); + mlir::Value genRRSpacing(mlir::Type resultType, + llvm::ArrayRef args); mlir::Value genScale(mlir::Type, llvm::ArrayRef); fir::ExtendedValue genScan(mlir::Type, llvm::ArrayRef); mlir::Value genSetExponent(mlir::Type resultType, llvm::ArrayRef args); mlir::Value genSign(mlir::Type, llvm::ArrayRef); fir::ExtendedValue genSize(mlir::Type, llvm::ArrayRef); + mlir::Value genSpacing(mlir::Type resultType, + llvm::ArrayRef args); fir::ExtendedValue genSum(mlir::Type, llvm::ArrayRef); fir::ExtendedValue genSpread(mlir::Type, llvm::ArrayRef); void genSystemClock(llvm::ArrayRef); @@ -820,6 +824,7 @@ static constexpr IntrinsicHandler handlers[]{ {"pad", asBox, handleDynamicOptional}, {"order", asBox, handleDynamicOptional}}}, /*isElemental=*/false}, + {"rrspacing", &I::genRRSpacing}, {"scale", &I::genScale, {{{"x", asValue}, {"i", asValue}}}, @@ -839,6 +844,7 @@ static constexpr IntrinsicHandler handlers[]{ {"dim", asAddr, handleDynamicOptional}, {"kind", asValue}}}, /*isElemental=*/false}, + {"spacing", &I::genSpacing}, {"spread", &I::genSpread, {{{"source", asAddr}, {"dim", asValue}, {"ncopies", asValue}}}, @@ -3015,6 +3021,16 @@ IntrinsicLibrary::genReshape(mlir::Type resultType, "unexpected result for RESHAPE"); } +// RRSPACING +mlir::Value IntrinsicLibrary::genRRSpacing(mlir::Type resultType, + llvm::ArrayRef args) { + assert(args.size() == 1); + + return builder.createConvert( + loc, resultType, + fir::runtime::genRRSpacing(builder, loc, fir::getBase(args[0]))); +} + // SCALE mlir::Value IntrinsicLibrary::genScale(mlir::Type resultType, llvm::ArrayRef args) { @@ -3130,6 +3146,16 @@ mlir::Value IntrinsicLibrary::genSign(mlir::Type resultType, return genRuntimeCall("sign", resultType, args); } +// SPACING +mlir::Value IntrinsicLibrary::genSpacing(mlir::Type resultType, + llvm::ArrayRef args) { + assert(args.size() == 1); + + return builder.createConvert( + loc, resultType, + fir::runtime::genSpacing(builder, loc, fir::getBase(args[0]))); +} + // SIZE fir::ExtendedValue IntrinsicLibrary::genSize(mlir::Type resultType, diff --git a/flang/test/Lower/Intrinsics/rrspacing.f90 b/flang/test/Lower/Intrinsics/rrspacing.f90 new file mode 100644 index 0000000000000..96f60939f8a05 --- /dev/null +++ b/flang/test/Lower/Intrinsics/rrspacing.f90 @@ -0,0 +1,11 @@ +! RUN: bbc -emit-fir %s -o - | FileCheck %s +! RUN: %flang_fc1 -emit-fir %s -o - | FileCheck %s + +! CHECK-LABEL: func @_QPrrspacing_test2( +! CHECK-SAME: %[[x:[^:]+]]: !fir.ref{{.*}}) -> f128 +real*16 function rrspacing_test2(x) + real*16 :: x + rrspacing_test2 = rrspacing(x) +! CHECK: %[[a1:.*]] = fir.load %[[x]] : !fir.ref +! CHECK: %{{.*}} = fir.call @_FortranARRSpacing16(%[[a1]]) : (f128) -> f128 +end function diff --git a/flang/test/Lower/Intrinsics/spacing.f90 b/flang/test/Lower/Intrinsics/spacing.f90 new file mode 100644 index 0000000000000..b6db96d956c63 --- /dev/null +++ b/flang/test/Lower/Intrinsics/spacing.f90 @@ -0,0 +1,20 @@ +! RUN: bbc -emit-fir %s -o - | FileCheck %s +! RUN: %flang_fc1 -emit-fir %s -o - | FileCheck %s + +! CHECK-LABEL: func @_QPspacing_test( +! CHECK-SAME: %[[x:[^:]+]]: !fir.ref{{.*}}) -> f32 +real*4 function spacing_test(x) + real*4 :: x + spacing_test = spacing(x) +! CHECK: %[[a1:.*]] = fir.load %[[x]] : !fir.ref +! CHECK: %{{.*}} = fir.call @_FortranASpacing4(%[[a1]]) : (f32) -> f32 +end function + +! CHECK-LABEL: func @_QPspacing_test2( +! CHECK-SAME: %[[x:[^:]+]]: !fir.ref{{.*}}) -> f80 +real*10 function spacing_test2(x) + real*10 :: x + spacing_test2 = spacing(x) +! CHECK: %[[a1:.*]] = fir.load %[[x]] : !fir.ref +! CHECK: %{{.*}} = fir.call @_FortranASpacing10(%[[a1]]) : (f80) -> f80 +end function