@@ -588,6 +588,26 @@ class LLVM_CastOpWithOverflowFlag<string mnemonic, string instName, Type type,
588588 }];
589589}
590590
591+ class LLVM_CastOpWithFastMathFlag<string mnemonic, string instName, Type type,
592+ Type resultType, list<Trait> traits = []> :
593+ LLVM_Op<mnemonic, !listconcat([Pure], [DeclareOpInterfaceMethods<FastmathFlagsInterface>], traits)>,
594+ LLVM_Builder<"$res = builder.Create" # instName # "($arg, $_resultType);"> {
595+ let arguments = (
596+ ins type:$arg,
597+ DefaultValuedAttr<LLVM_FastmathFlagsAttr, "{}">:$fastmathFlags);
598+ let results = (outs resultType:$res);
599+ let builders = [LLVM_OneResultOpBuilder];
600+ let assemblyFormat = "$arg (`fastmath` `` $fastmathFlags^)? "
601+ "attr-dict `:` type($arg) `to` type($res)";
602+ string llvmInstName = instName;
603+ string mlirBuilder = [{
604+ auto op = $_qualCppClassName::create($_builder,
605+ $_location, $_resultType, $arg);
606+ moduleImport.setFastmathFlagsAttr(inst, op);
607+ $res = op;
608+ }];
609+ }
610+
591611class LLVM_DereferenceableCastOp<string mnemonic, string instName, Type type,
592612 Type resultType, list<Trait> traits = []> :
593613 LLVM_Op<mnemonic, !listconcat([Pure], [DeclareOpInterfaceMethods<DereferenceableOpInterface>], traits)> {
@@ -699,10 +719,10 @@ def LLVM_FPToSIOp : LLVM_CastOp<"fptosi", "FPToSI",
699719def LLVM_FPToUIOp : LLVM_CastOp<"fptoui", "FPToUI",
700720 LLVM_ScalarOrVectorOf<LLVM_AnyFloat>,
701721 LLVM_ScalarOrVectorOf<AnySignlessInteger>>;
702- def LLVM_FPExtOp : LLVM_CastOp <"fpext", "FPExt",
722+ def LLVM_FPExtOp : LLVM_CastOpWithFastMathFlag <"fpext", "FPExt",
703723 LLVM_ScalarOrVectorOf<LLVM_AnyFloat>,
704724 LLVM_ScalarOrVectorOf<LLVM_AnyFloat>>;
705- def LLVM_FPTruncOp : LLVM_CastOp <"fptrunc", "FPTrunc",
725+ def LLVM_FPTruncOp : LLVM_CastOpWithFastMathFlag <"fptrunc", "FPTrunc",
706726 LLVM_ScalarOrVectorOf<LLVM_AnyFloat>,
707727 LLVM_ScalarOrVectorOf<LLVM_AnyFloat>>;
708728
0 commit comments