118 lines · cpp
1//===- NumericTest.cpp -- Numeric intrinsic runtime builder unit tests ----===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "flang/Optimizer/Builder/Runtime/Numeric.h"10#include "RuntimeCallTestBase.h"11#include "gtest/gtest.h"12 13using namespace mlir;14 15void testGenExponent(fir::FirOpBuilder &builder, mlir::Type resultType,16 mlir::Type xType, llvm::StringRef fctName) {17 auto loc = builder.getUnknownLoc();18 mlir::Value x = fir::UndefOp::create(builder, loc, xType);19 mlir::Value exp = fir::runtime::genExponent(builder, loc, resultType, x);20 checkCallOp(exp.getDefiningOp(), fctName, 1, /*addLocArg=*/false);21}22 23TEST_F(RuntimeCallTest, genExponentTest) {24 testGenExponent(*firBuilder, i32Ty, f32Ty, "_FortranAExponent4_4");25 testGenExponent(*firBuilder, i64Ty, f32Ty, "_FortranAExponent4_8");26 testGenExponent(*firBuilder, i32Ty, f64Ty, "_FortranAExponent8_4");27 testGenExponent(*firBuilder, i64Ty, f64Ty, "_FortranAExponent8_8");28 testGenExponent(*firBuilder, i32Ty, f80Ty, "_FortranAExponent10_4");29 testGenExponent(*firBuilder, i64Ty, f80Ty, "_FortranAExponent10_8");30 testGenExponent(*firBuilder, i32Ty, f128Ty, "_FortranAExponent16_4");31 testGenExponent(*firBuilder, i64Ty, f128Ty, "_FortranAExponent16_8");32}33 34void testGenX(fir::FirOpBuilder &builder, mlir::Type xType,35 mlir::Value (*genFct)(fir::FirOpBuilder &, Location, mlir::Value),36 llvm::StringRef fctName) {37 auto loc = builder.getUnknownLoc();38 mlir::Value x = fir::UndefOp::create(builder, loc, xType);39 mlir::Value val = genFct(builder, loc, x);40 checkCallOp(val.getDefiningOp(), fctName, 1, /*addLocArg=*/false);41}42 43TEST_F(RuntimeCallTest, genFractionTest) {44 testGenX(*firBuilder, f32Ty, fir::runtime::genFraction, "_FortranAFraction4");45 testGenX(*firBuilder, f64Ty, fir::runtime::genFraction, "_FortranAFraction8");46 testGenX(47 *firBuilder, f80Ty, fir::runtime::genFraction, "_FortranAFraction10");48 testGenX(49 *firBuilder, f128Ty, fir::runtime::genFraction, "_FortranAFraction16");50}51 52void testGenNearest(fir::FirOpBuilder &builder, mlir::Type xType,53 mlir::Type sType, llvm::StringRef fctName) {54 auto loc = builder.getUnknownLoc();55 mlir::Value x = fir::UndefOp::create(builder, loc, xType);56 mlir::Value s = fir::UndefOp::create(builder, loc, sType);57 mlir::Value nearest = fir::runtime::genNearest(builder, loc, x, s);58 checkCallOp(nearest.getDefiningOp(), fctName, 2, /*addLocArg=*/false);59}60 61TEST_F(RuntimeCallTest, genNearestTest) {62 testGenNearest(*firBuilder, f32Ty, f32Ty, "_FortranANearest4");63 testGenNearest(*firBuilder, f64Ty, f32Ty, "_FortranANearest8");64 testGenNearest(*firBuilder, f80Ty, f32Ty, "_FortranANearest10");65 testGenNearest(*firBuilder, f128Ty, f32Ty, "_FortranANearest16");66}67 68TEST_F(RuntimeCallTest, genRRSpacingTest) {69 testGenX(70 *firBuilder, f32Ty, fir::runtime::genRRSpacing, "_FortranARRSpacing4");71 testGenX(72 *firBuilder, f64Ty, fir::runtime::genRRSpacing, "_FortranARRSpacing8");73 testGenX(74 *firBuilder, f80Ty, fir::runtime::genRRSpacing, "_FortranARRSpacing10");75 testGenX(76 *firBuilder, f128Ty, fir::runtime::genRRSpacing, "_FortranARRSpacing16");77}78 79void testGenXI(fir::FirOpBuilder &builder, mlir::Type xType, mlir::Type iType,80 mlir::Value (*genFct)(81 fir::FirOpBuilder &, Location, mlir::Value, mlir::Value),82 llvm::StringRef fctName) {83 auto loc = builder.getUnknownLoc();84 mlir::Value x = fir::UndefOp::create(builder, loc, xType);85 mlir::Value i = fir::UndefOp::create(builder, loc, iType);86 mlir::Value val = genFct(builder, loc, x, i);87 checkCallOp(val.getDefiningOp(), fctName, 2, /*addLocArg=*/false);88}89 90TEST_F(RuntimeCallTest, genScaleTest) {91 testGenXI(92 *firBuilder, f32Ty, f32Ty, fir::runtime::genScale, "_FortranAScale4");93 testGenXI(94 *firBuilder, f64Ty, f32Ty, fir::runtime::genScale, "_FortranAScale8");95 testGenXI(96 *firBuilder, f80Ty, f32Ty, fir::runtime::genScale, "_FortranAScale10");97 testGenXI(98 *firBuilder, f128Ty, f32Ty, fir::runtime::genScale, "_FortranAScale16");99}100 101TEST_F(RuntimeCallTest, genSetExponentTest) {102 testGenXI(*firBuilder, f32Ty, f32Ty, fir::runtime::genSetExponent,103 "_FortranASetExponent4");104 testGenXI(*firBuilder, f64Ty, f32Ty, fir::runtime::genSetExponent,105 "_FortranASetExponent8");106 testGenXI(*firBuilder, f80Ty, f32Ty, fir::runtime::genSetExponent,107 "_FortranASetExponent10");108 testGenXI(*firBuilder, f128Ty, f32Ty, fir::runtime::genSetExponent,109 "_FortranASetExponent16");110}111 112TEST_F(RuntimeCallTest, genSpacingTest) {113 testGenX(*firBuilder, f32Ty, fir::runtime::genSpacing, "_FortranASpacing4");114 testGenX(*firBuilder, f64Ty, fir::runtime::genSpacing, "_FortranASpacing8");115 testGenX(*firBuilder, f80Ty, fir::runtime::genSpacing, "_FortranASpacing10");116 testGenX(*firBuilder, f128Ty, fir::runtime::genSpacing, "_FortranASpacing16");117}118