================ @@ -219,6 +219,37 @@ class SME2_Tile_Movaz_Pat<string name, SDPatternOperator intrinsic, ValueType ou : Pat<(out_vt (intrinsic tile_imm:$tile, (i32 (tileslice MatrixIndexGPR32Op12_15:$base, index_ty:$offset)))), (!cast<Instruction>(name # _PSEUDO) $tile, $base, $offset)>; + +// FP8 SME FDOT instructions + +// Selection DAG patterns - map to first level of pseudo-instructions (xxx_PSEUDO) +class SME2_FP8_FMLA_FDOT_Index_VG1x2_Pat<string name, SDPatternOperator intrinsic, + ComplexPattern tileslice, Operand offset_ty, Operand imm_ty, + ValueType vt = nxv16i8> + : Pat<(intrinsic (i32 (tileslice MatrixIndexGPR32Op8_11:$base, offset_ty:$offset)), + vt:$Zn1, vt:$Zn2, vt:$Zm, (i32 imm_ty:$i)), + (!cast<Instruction>(name # _PSEUDO) $base, $offset, + (REG_SEQUENCE ZPR2Mul2, vt:$Zn1, zsub0, vt:$Zn2, zsub1), + ZPR4b8:$Zm, imm_ty:$i)>; + +class SME2_FP8_FMLA_FDOT_Index_VG1x4_Pat<string name, SDPatternOperator intrinsic, + ComplexPattern tileslice, Operand offset_ty, Operand imm_ty, + ValueType vt = nxv16i8> + : Pat<(intrinsic (i32 (tileslice MatrixIndexGPR32Op8_11:$base, offset_ty:$offset)), + vt:$Zn1, vt:$Zn2, vt:$Zn3, vt:$Zn4, + vt:$Zm, (i32 imm_ty:$i)), + (!cast<Instruction>(name # _PSEUDO) $base, $offset, + (REG_SEQUENCE ZPR4Mul4, vt:$Zn1, zsub0, vt:$Zn2, zsub1, vt:$Zn3, zsub2, vt:$Zn4, zsub3), + ZPR4b8:$Zm, imm_ty:$i)>; ---------------- SpencerAbson wrote:
I'm not sure we need to introduce new pattern classes here, we can use the existing `SME2_ZA_TwoOp_VG{2,4}_Multi_Index_Pat` For example, `def : SME2_ZA_TwoOp_VG2_Multi_Index_Pat<NAME, intrinsic, sme_elm_idx0_7, ZPR4b8, nxv16i8, VectorIndexH32b_timm, tileslice16>;` https://github.com/llvm/llvm-project/pull/118492 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits