@@ -208,6 +208,7 @@ struct IntrinsicLibrary {
208
208
mlir::Value genCeiling (mlir::Type, llvm::ArrayRef<mlir::Value>);
209
209
mlir::Value genConjg (mlir::Type, llvm::ArrayRef<mlir::Value>);
210
210
mlir::Value genDim (mlir::Type, llvm::ArrayRef<mlir::Value>);
211
+ mlir::Value genDprod (mlir::Type, llvm::ArrayRef<mlir::Value>);
211
212
template <Extremum, ExtremumBehavior>
212
213
mlir::Value genExtremum (mlir::Type, llvm::ArrayRef<mlir::Value>);
213
214
mlir::Value genFloor (mlir::Type, llvm::ArrayRef<mlir::Value>);
@@ -301,6 +302,7 @@ static constexpr IntrinsicHandler handlers[]{
301
302
{" conjg" , &I::genConjg},
302
303
{" dim" , &I::genDim},
303
304
{" dble" , &I::genConversion},
305
+ {" dprod" , &I::genDprod},
304
306
{" floor" , &I::genFloor},
305
307
{" iand" , &I::genIAnd},
306
308
{" ichar" , &I::genIchar},
@@ -1115,6 +1117,17 @@ mlir::Value IntrinsicLibrary::genDim(mlir::Type resultType,
1115
1117
return builder.create <mlir::SelectOp>(loc, cmp, diff, zero);
1116
1118
}
1117
1119
1120
+ // DPROD
1121
+ mlir::Value IntrinsicLibrary::genDprod (mlir::Type resultType,
1122
+ llvm::ArrayRef<mlir::Value> args) {
1123
+ assert (args.size () == 2 );
1124
+ assert (fir::isa_real (resultType) &&
1125
+ " Result must be double precision in DPROD" );
1126
+ auto a = builder.createConvert (loc, resultType, args[0 ]);
1127
+ auto b = builder.createConvert (loc, resultType, args[1 ]);
1128
+ return builder.create <fir::MulfOp>(loc, a, b);
1129
+ }
1130
+
1118
1131
// FLOOR
1119
1132
mlir::Value IntrinsicLibrary::genFloor (mlir::Type resultType,
1120
1133
llvm::ArrayRef<mlir::Value> args) {
0 commit comments