@@ -449,6 +449,7 @@ struct IntrinsicLibrary {
449
449
// / in the llvm::ArrayRef.
450
450
mlir::Value genIand (mlir::Type, llvm::ArrayRef<mlir::Value>);
451
451
mlir::Value genIbits (mlir::Type, llvm::ArrayRef<mlir::Value>);
452
+ mlir::Value genIbset (mlir::Type, llvm::ArrayRef<mlir::Value>);
452
453
fir::ExtendedValue genLbound (mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
453
454
fir::ExtendedValue genNull (mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
454
455
fir::ExtendedValue genLen (mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
@@ -595,6 +596,7 @@ static constexpr IntrinsicHandler handlers[]{
595
596
/* isElemental=*/ false },
596
597
{" iand" , &I::genIand},
597
598
{" ibits" , &I::genIbits},
599
+ {" ibset" , &I::genIbset},
598
600
{" len" ,
599
601
&I::genLen,
600
602
{{{" string" , asInquired}, {" kind" , asValue}}},
@@ -1682,6 +1684,20 @@ mlir::Value IntrinsicLibrary::genIbits(mlir::Type resultType,
1682
1684
return builder.create <mlir::arith::SelectOp>(loc, lenIsZero, zero, res2);
1683
1685
}
1684
1686
1687
+ // IBSET
1688
+ mlir::Value IntrinsicLibrary::genIbset (mlir::Type resultType,
1689
+ llvm::ArrayRef<mlir::Value> args) {
1690
+ // A conformant IBSET(I,POS) call satisfies:
1691
+ // POS >= 0
1692
+ // POS < BIT_SIZE(I)
1693
+ // Return: I | (1 << POS)
1694
+ assert (args.size () == 2 );
1695
+ mlir::Value pos = builder.createConvert (loc, resultType, args[1 ]);
1696
+ mlir::Value one = builder.createIntegerConstant (loc, resultType, 1 );
1697
+ auto mask = builder.create <mlir::arith::ShLIOp>(loc, one, pos);
1698
+ return builder.create <mlir::arith::OrIOp>(loc, args[0 ], mask);
1699
+ }
1700
+
1685
1701
// LEN
1686
1702
// Note that this is only used for an unrestricted intrinsic LEN call.
1687
1703
// Other uses of LEN are rewritten as descriptor inquiries by the front-end.
0 commit comments