1529d0942SValentin Clement //===- NumericTest.cpp -- Numeric intrinsic runtime builder unit tests ----===// 2529d0942SValentin Clement // 3529d0942SValentin Clement // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4529d0942SValentin Clement // See https://llvm.org/LICENSE.txt for license information. 5529d0942SValentin Clement // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6529d0942SValentin Clement // 7529d0942SValentin Clement //===----------------------------------------------------------------------===// 8529d0942SValentin Clement 9529d0942SValentin Clement #include "flang/Optimizer/Builder/Runtime/Numeric.h" 10529d0942SValentin Clement #include "RuntimeCallTestBase.h" 11529d0942SValentin Clement #include "gtest/gtest.h" 12529d0942SValentin Clement 13*092601d4SAndrzej Warzynski using namespace mlir; 14*092601d4SAndrzej Warzynski 15529d0942SValentin Clement void testGenExponent(fir::FirOpBuilder &builder, mlir::Type resultType, 16529d0942SValentin Clement mlir::Type xType, llvm::StringRef fctName) { 17529d0942SValentin Clement auto loc = builder.getUnknownLoc(); 18529d0942SValentin Clement mlir::Value x = builder.create<fir::UndefOp>(loc, xType); 19529d0942SValentin Clement mlir::Value exp = fir::runtime::genExponent(builder, loc, resultType, x); 20529d0942SValentin Clement checkCallOp(exp.getDefiningOp(), fctName, 1, /*addLocArg=*/false); 21529d0942SValentin Clement } 22529d0942SValentin Clement 23529d0942SValentin Clement TEST_F(RuntimeCallTest, genExponentTest) { 24529d0942SValentin Clement testGenExponent(*firBuilder, i32Ty, f32Ty, "_FortranAExponent4_4"); 25529d0942SValentin Clement testGenExponent(*firBuilder, i64Ty, f32Ty, "_FortranAExponent4_8"); 26529d0942SValentin Clement testGenExponent(*firBuilder, i32Ty, f64Ty, "_FortranAExponent8_4"); 27529d0942SValentin Clement testGenExponent(*firBuilder, i64Ty, f64Ty, "_FortranAExponent8_8"); 28529d0942SValentin Clement testGenExponent(*firBuilder, i32Ty, f80Ty, "_FortranAExponent10_4"); 29529d0942SValentin Clement testGenExponent(*firBuilder, i64Ty, f80Ty, "_FortranAExponent10_8"); 30529d0942SValentin Clement testGenExponent(*firBuilder, i32Ty, f128Ty, "_FortranAExponent16_4"); 31529d0942SValentin Clement testGenExponent(*firBuilder, i64Ty, f128Ty, "_FortranAExponent16_8"); 32529d0942SValentin Clement } 33529d0942SValentin Clement 34529d0942SValentin Clement void testGenX(fir::FirOpBuilder &builder, mlir::Type xType, 35529d0942SValentin Clement mlir::Value (*genFct)(fir::FirOpBuilder &, Location, mlir::Value), 36529d0942SValentin Clement llvm::StringRef fctName) { 37529d0942SValentin Clement auto loc = builder.getUnknownLoc(); 38529d0942SValentin Clement mlir::Value x = builder.create<fir::UndefOp>(loc, xType); 39529d0942SValentin Clement mlir::Value val = genFct(builder, loc, x); 40529d0942SValentin Clement checkCallOp(val.getDefiningOp(), fctName, 1, /*addLocArg=*/false); 41529d0942SValentin Clement } 42529d0942SValentin Clement 43529d0942SValentin Clement TEST_F(RuntimeCallTest, genFractionTest) { 44529d0942SValentin Clement testGenX(*firBuilder, f32Ty, fir::runtime::genFraction, "_FortranAFraction4"); 45529d0942SValentin Clement testGenX(*firBuilder, f64Ty, fir::runtime::genFraction, "_FortranAFraction8"); 46529d0942SValentin Clement testGenX( 47529d0942SValentin Clement *firBuilder, f80Ty, fir::runtime::genFraction, "_FortranAFraction10"); 48529d0942SValentin Clement testGenX( 49529d0942SValentin Clement *firBuilder, f128Ty, fir::runtime::genFraction, "_FortranAFraction16"); 50529d0942SValentin Clement } 51529d0942SValentin Clement 52529d0942SValentin Clement void testGenNearest(fir::FirOpBuilder &builder, mlir::Type xType, 53529d0942SValentin Clement mlir::Type sType, llvm::StringRef fctName) { 54529d0942SValentin Clement auto loc = builder.getUnknownLoc(); 55529d0942SValentin Clement mlir::Value x = builder.create<fir::UndefOp>(loc, xType); 56529d0942SValentin Clement mlir::Value s = builder.create<fir::UndefOp>(loc, sType); 57529d0942SValentin Clement mlir::Value nearest = fir::runtime::genNearest(builder, loc, x, s); 58529d0942SValentin Clement checkCallOp(nearest.getDefiningOp(), fctName, 2, /*addLocArg=*/false); 59529d0942SValentin Clement } 60529d0942SValentin Clement 61529d0942SValentin Clement TEST_F(RuntimeCallTest, genNearestTest) { 62529d0942SValentin Clement testGenNearest(*firBuilder, f32Ty, f32Ty, "_FortranANearest4"); 63529d0942SValentin Clement testGenNearest(*firBuilder, f64Ty, f32Ty, "_FortranANearest8"); 64529d0942SValentin Clement testGenNearest(*firBuilder, f80Ty, f32Ty, "_FortranANearest10"); 65529d0942SValentin Clement testGenNearest(*firBuilder, f128Ty, f32Ty, "_FortranANearest16"); 66529d0942SValentin Clement } 67529d0942SValentin Clement 68529d0942SValentin Clement TEST_F(RuntimeCallTest, genRRSpacingTest) { 69529d0942SValentin Clement testGenX( 70529d0942SValentin Clement *firBuilder, f32Ty, fir::runtime::genRRSpacing, "_FortranARRSpacing4"); 71529d0942SValentin Clement testGenX( 72529d0942SValentin Clement *firBuilder, f64Ty, fir::runtime::genRRSpacing, "_FortranARRSpacing8"); 73529d0942SValentin Clement testGenX( 74529d0942SValentin Clement *firBuilder, f80Ty, fir::runtime::genRRSpacing, "_FortranARRSpacing10"); 75529d0942SValentin Clement testGenX( 76529d0942SValentin Clement *firBuilder, f128Ty, fir::runtime::genRRSpacing, "_FortranARRSpacing16"); 77529d0942SValentin Clement } 78529d0942SValentin Clement 79529d0942SValentin Clement void testGenXI(fir::FirOpBuilder &builder, mlir::Type xType, mlir::Type iType, 80529d0942SValentin Clement mlir::Value (*genFct)( 81529d0942SValentin Clement fir::FirOpBuilder &, Location, mlir::Value, mlir::Value), 82529d0942SValentin Clement llvm::StringRef fctName) { 83529d0942SValentin Clement auto loc = builder.getUnknownLoc(); 84529d0942SValentin Clement mlir::Value x = builder.create<fir::UndefOp>(loc, xType); 85529d0942SValentin Clement mlir::Value i = builder.create<fir::UndefOp>(loc, iType); 86529d0942SValentin Clement mlir::Value val = genFct(builder, loc, x, i); 87529d0942SValentin Clement checkCallOp(val.getDefiningOp(), fctName, 2, /*addLocArg=*/false); 88529d0942SValentin Clement } 89529d0942SValentin Clement 90529d0942SValentin Clement TEST_F(RuntimeCallTest, genScaleTest) { 91529d0942SValentin Clement testGenXI( 92529d0942SValentin Clement *firBuilder, f32Ty, f32Ty, fir::runtime::genScale, "_FortranAScale4"); 93529d0942SValentin Clement testGenXI( 94529d0942SValentin Clement *firBuilder, f64Ty, f32Ty, fir::runtime::genScale, "_FortranAScale8"); 95529d0942SValentin Clement testGenXI( 96529d0942SValentin Clement *firBuilder, f80Ty, f32Ty, fir::runtime::genScale, "_FortranAScale10"); 97529d0942SValentin Clement testGenXI( 98529d0942SValentin Clement *firBuilder, f128Ty, f32Ty, fir::runtime::genScale, "_FortranAScale16"); 99529d0942SValentin Clement } 100529d0942SValentin Clement 101529d0942SValentin Clement TEST_F(RuntimeCallTest, genSetExponentTest) { 102529d0942SValentin Clement testGenXI(*firBuilder, f32Ty, f32Ty, fir::runtime::genSetExponent, 103529d0942SValentin Clement "_FortranASetExponent4"); 104529d0942SValentin Clement testGenXI(*firBuilder, f64Ty, f32Ty, fir::runtime::genSetExponent, 105529d0942SValentin Clement "_FortranASetExponent8"); 106529d0942SValentin Clement testGenXI(*firBuilder, f80Ty, f32Ty, fir::runtime::genSetExponent, 107529d0942SValentin Clement "_FortranASetExponent10"); 108529d0942SValentin Clement testGenXI(*firBuilder, f128Ty, f32Ty, fir::runtime::genSetExponent, 109529d0942SValentin Clement "_FortranASetExponent16"); 110529d0942SValentin Clement } 111529d0942SValentin Clement 112529d0942SValentin Clement TEST_F(RuntimeCallTest, genSpacingTest) { 113529d0942SValentin Clement testGenX(*firBuilder, f32Ty, fir::runtime::genSpacing, "_FortranASpacing4"); 114529d0942SValentin Clement testGenX(*firBuilder, f64Ty, fir::runtime::genSpacing, "_FortranASpacing8"); 115529d0942SValentin Clement testGenX(*firBuilder, f80Ty, fir::runtime::genSpacing, "_FortranASpacing10"); 116529d0942SValentin Clement testGenX(*firBuilder, f128Ty, fir::runtime::genSpacing, "_FortranASpacing16"); 117529d0942SValentin Clement } 118