@@ -320,6 +320,51 @@ LogicalResult ConvertF32x2ToF4x2Op::verify() {
320320 return success ();
321321}
322322
323+ LogicalResult ConvertF8x2ToF16x2Op::verify () {
324+ mlir::MLIRContext *ctx = getContext ();
325+
326+ if (!llvm::isa<Float8E4M3FNType, Float8E5M2Type>(getSrcType ()))
327+ return emitOpError (" Only " )
328+ << mlir::Float8E4M3FNType::get (ctx) << " and "
329+ << mlir::Float8E5M2Type::get (ctx)
330+ << " types are supported for conversions from f8x2 to f16x2." ;
331+
332+ return success ();
333+ }
334+
335+ LogicalResult ConvertF8x2ToBF16x2Op::verify () {
336+ mlir::MLIRContext *ctx = getContext ();
337+ if (!llvm::isa<Float8E8M0FNUType>(getSrcType ()))
338+ return emitOpError (" Only " )
339+ << mlir::Float8E8M0FNUType::get (ctx)
340+ << " type is supported for conversions from f8x2 to bf16x2." ;
341+
342+ return success ();
343+ }
344+
345+ LogicalResult ConvertF6x2ToF16x2Op::verify () {
346+ mlir::MLIRContext *ctx = getContext ();
347+
348+ if (!llvm::isa<Float6E2M3FNType, Float6E3M2FNType>(getSrcType ()))
349+ return emitOpError (" Only " )
350+ << mlir::Float6E2M3FNType::get (ctx) << " and "
351+ << mlir::Float6E3M2FNType::get (ctx)
352+ << " types are supported for conversions from f6x2 to f16x2." ;
353+
354+ return success ();
355+ }
356+
357+ LogicalResult ConvertF4x2ToF16x2Op::verify () {
358+ mlir::MLIRContext *ctx = getContext ();
359+
360+ if (!llvm::isa<Float4E2M1FNType>(getSrcType ()))
361+ return emitOpError (" Only " )
362+ << mlir::Float4E2M1FNType::get (ctx)
363+ << " type is supported for conversions from f4x2 to f16x2." ;
364+
365+ return success ();
366+ }
367+
323368LogicalResult BulkStoreOp::verify () {
324369 if (getInitVal () != 0 )
325370 return emitOpError (" only 0 is supported for initVal, got " ) << getInitVal ();
@@ -2187,6 +2232,98 @@ ConvertBF16x2ToF8x2Op::getIntrinsicID(NVVM::FPRoundingMode rnd,
21872232 }
21882233}
21892234
2235+ NVVM::IDArgPair ConvertF8x2ToF16x2Op::getIntrinsicIDAndArgs (
2236+ Operation &op, LLVM::ModuleTranslation &mt, llvm::IRBuilderBase &builder) {
2237+ auto curOp = cast<NVVM::ConvertF8x2ToF16x2Op>(op);
2238+
2239+ bool hasRelu = curOp.getRelu ();
2240+
2241+ llvm::Intrinsic::ID intId =
2242+ llvm::TypeSwitch<mlir::Type, llvm::Intrinsic::ID>(curOp.getSrcType ())
2243+ .Case <Float8E4M3FNType>([&](Float8E4M3FNType type) {
2244+ return hasRelu ? llvm::Intrinsic::nvvm_e4m3x2_to_f16x2_rn_relu
2245+ : llvm::Intrinsic::nvvm_e4m3x2_to_f16x2_rn;
2246+ })
2247+ .Case <Float8E5M2Type>([&](Float8E5M2Type type) {
2248+ return hasRelu ? llvm::Intrinsic::nvvm_e5m2x2_to_f16x2_rn_relu
2249+ : llvm::Intrinsic::nvvm_e5m2x2_to_f16x2_rn;
2250+ })
2251+ .Default ([](mlir::Type type) {
2252+ llvm_unreachable (" Invalid type for ConvertF8x2ToF16x2Op" );
2253+ return llvm::Intrinsic::not_intrinsic;
2254+ });
2255+
2256+ llvm::Value *packedI16 =
2257+ builder.CreateBitCast (mt.lookupValue (curOp.getSrc ()),
2258+ llvm::Type::getInt16Ty (builder.getContext ()));
2259+
2260+ return {intId, {packedI16}};
2261+ }
2262+
2263+ NVVM::IDArgPair ConvertF8x2ToBF16x2Op::getIntrinsicIDAndArgs (
2264+ Operation &op, LLVM::ModuleTranslation &mt, llvm::IRBuilderBase &builder) {
2265+ auto curOp = cast<NVVM::ConvertF8x2ToBF16x2Op>(op);
2266+
2267+ llvm::Intrinsic::ID intId = llvm::Intrinsic::nvvm_ue8m0x2_to_bf16x2;
2268+ llvm::Value *packedI16 =
2269+ builder.CreateBitCast (mt.lookupValue (curOp.getSrc ()),
2270+ llvm::Type::getInt16Ty (builder.getContext ()));
2271+
2272+ return {intId, {packedI16}};
2273+ }
2274+
2275+ NVVM::IDArgPair ConvertF6x2ToF16x2Op::getIntrinsicIDAndArgs (
2276+ Operation &op, LLVM::ModuleTranslation &mt, llvm::IRBuilderBase &builder) {
2277+ auto curOp = cast<NVVM::ConvertF6x2ToF16x2Op>(op);
2278+
2279+ bool hasRelu = curOp.getRelu ();
2280+
2281+ llvm::Intrinsic::ID intId =
2282+ llvm::TypeSwitch<mlir::Type, llvm::Intrinsic::ID>(curOp.getSrcType ())
2283+ .Case <Float6E2M3FNType>([&](Float6E2M3FNType type) {
2284+ return hasRelu ? llvm::Intrinsic::nvvm_e2m3x2_to_f16x2_rn_relu
2285+ : llvm::Intrinsic::nvvm_e2m3x2_to_f16x2_rn;
2286+ })
2287+ .Case <Float6E3M2FNType>([&](Float6E3M2FNType type) {
2288+ return hasRelu ? llvm::Intrinsic::nvvm_e3m2x2_to_f16x2_rn_relu
2289+ : llvm::Intrinsic::nvvm_e3m2x2_to_f16x2_rn;
2290+ })
2291+ .Default ([](mlir::Type type) {
2292+ llvm_unreachable (" Invalid type for ConvertF6x2ToF16x2Op" );
2293+ return llvm::Intrinsic::not_intrinsic;
2294+ });
2295+
2296+ llvm::Value *packedI16 =
2297+ builder.CreateBitCast (mt.lookupValue (curOp.getSrc ()),
2298+ llvm::Type::getInt16Ty (builder.getContext ()));
2299+
2300+ return {intId, {packedI16}};
2301+ }
2302+
2303+ NVVM::IDArgPair ConvertF4x2ToF16x2Op::getIntrinsicIDAndArgs (
2304+ Operation &op, LLVM::ModuleTranslation &mt, llvm::IRBuilderBase &builder) {
2305+ auto curOp = cast<NVVM::ConvertF4x2ToF16x2Op>(op);
2306+
2307+ bool hasRelu = curOp.getRelu ();
2308+
2309+ llvm::Intrinsic::ID intId =
2310+ llvm::TypeSwitch<mlir::Type, llvm::Intrinsic::ID>(curOp.getSrcType ())
2311+ .Case <Float4E2M1FNType>([&](Float4E2M1FNType type) {
2312+ return hasRelu ? llvm::Intrinsic::nvvm_e2m1x2_to_f16x2_rn_relu
2313+ : llvm::Intrinsic::nvvm_e2m1x2_to_f16x2_rn;
2314+ })
2315+ .Default ([](mlir::Type type) {
2316+ llvm_unreachable (" Invalid type for ConvertF4x2ToF16x2Op" );
2317+ return llvm::Intrinsic::not_intrinsic;
2318+ });
2319+
2320+ llvm::Value *extendedI16 =
2321+ builder.CreateZExt (mt.lookupValue (curOp.getSrc ()),
2322+ llvm::Type::getInt16Ty (builder.getContext ()));
2323+
2324+ return {intId, {extendedI16}};
2325+ }
2326+
21902327llvm::Intrinsic::ID
21912328Tcgen05AllocOp::getIntrinsicIDAndArgs (Operation &op,
21922329 LLVM::ModuleTranslation &mt,
0 commit comments