[Mlir-commits] [mlir] [mlir][arith] Add support for `extf`, `truncf` to `ArithToAPFloat` (PR #169275)
Jakub Kuderski
llvmlistbot at llvm.org
Mon Nov 24 06:53:33 PST 2025
================
@@ -126,6 +138,53 @@ struct BinaryArithOpToAPFloatConversion final : OpRewritePattern<OpTy> {
const char *APFloatName;
};
+template <typename OpTy>
+struct FpToFpConversion final : OpRewritePattern<OpTy> {
+ FpToFpConversion(MLIRContext *context, SymbolOpInterface symTable,
+ PatternBenefit benefit = 1)
+ : OpRewritePattern<OpTy>(context, benefit), symTable(symTable){};
+
+ LogicalResult matchAndRewrite(OpTy op,
+ PatternRewriter &rewriter) const override {
+ // Get APFloat function from runtime library.
+ auto i32Type = IntegerType::get(symTable->getContext(), 32);
+ auto i64Type = IntegerType::get(symTable->getContext(), 64);
+ FailureOr<FuncOp> fn = lookupOrCreateApFloatFn(
+ rewriter, symTable, "convert", {i32Type, i32Type, i64Type});
+ if (failed(fn))
+ return fn;
+
+ rewriter.setInsertionPoint(op);
+ // Cast operands to 64-bit integers.
+ Location loc = op.getLoc();
+ auto inFloatTy = cast<FloatType>(op.getOperand().getType());
+ auto inIntWType = rewriter.getIntegerType(inFloatTy.getWidth());
+ auto int64Type = rewriter.getI64Type();
+ Value operandBits = arith::ExtUIOp::create(
+ rewriter, loc, int64Type,
+ arith::BitcastOp::create(rewriter, loc, inIntWType, op.getOperand()));
+
+ // Call APFloat function.
+ Value inSemValue = getSemanticsValue(rewriter, loc, inFloatTy);
+ auto outFloatTy = cast<FloatType>(op.getType());
+ Value outSemValue = getSemanticsValue(rewriter, loc, outFloatTy);
+ SmallVector<Value> params = {inSemValue, outSemValue, operandBits};
----------------
kuhar wrote:
nit: use a plain array if yo know the size?
https://github.com/llvm/llvm-project/pull/169275
More information about the Mlir-commits
mailing list