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-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "flang/Optimizer/Builder/Runtime/Numeric.h" |
10 | #include "RuntimeCallTestBase.h" |
11 | #include "gtest/gtest.h" |
12 | |
13 | using namespace mlir; |
14 | |
15 | void testGenExponent(fir::FirOpBuilder &builder, mlir::Type resultType, |
16 | mlir::Type xType, llvm::StringRef fctName) { |
17 | auto loc = builder.getUnknownLoc(); |
18 | mlir::Value x = builder.create<fir::UndefOp>(loc, xType); |
19 | mlir::Value exp = fir::runtime::genExponent(builder, loc, resultType, x); |
20 | checkCallOp(exp.getDefiningOp(), fctName, 1, /*addLocArg=*/false); |
21 | } |
22 | |
23 | TEST_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 | |
34 | void 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 = builder.create<fir::UndefOp>(loc, xType); |
39 | mlir::Value val = genFct(builder, loc, x); |
40 | checkCallOp(val.getDefiningOp(), fctName, 1, /*addLocArg=*/false); |
41 | } |
42 | |
43 | TEST_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 | |
52 | void testGenNearest(fir::FirOpBuilder &builder, mlir::Type xType, |
53 | mlir::Type sType, llvm::StringRef fctName) { |
54 | auto loc = builder.getUnknownLoc(); |
55 | mlir::Value x = builder.create<fir::UndefOp>(loc, xType); |
56 | mlir::Value s = builder.create<fir::UndefOp>(loc, sType); |
57 | mlir::Value nearest = fir::runtime::genNearest(builder, loc, x, s); |
58 | checkCallOp(nearest.getDefiningOp(), fctName, 2, /*addLocArg=*/false); |
59 | } |
60 | |
61 | TEST_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 | |
68 | TEST_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 | |
79 | void 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 = builder.create<fir::UndefOp>(loc, xType); |
85 | mlir::Value i = builder.create<fir::UndefOp>(loc, iType); |
86 | mlir::Value val = genFct(builder, loc, x, i); |
87 | checkCallOp(val.getDefiningOp(), fctName, 2, /*addLocArg=*/false); |
88 | } |
89 | |
90 | TEST_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 | |
101 | TEST_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 | |
112 | TEST_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 | |