@@ -433,6 +433,116 @@ multiclass sme_f16_outer_product<bits<3> opc, string mnemonic, SDPatternOperator
433433 def : SME_ZA_Tile_TwoPred_TwoVec_Pat<NAME, op, timm32_0_3, nxv8i1, nxv8f16>;
434434}
435435
436+ class sme_quarter_outer_product_i64<bits<2> zn_u_pair, bits<2> zm_u_pair, bit subtr, RegisterOperand zn_ty, RegisterOperand zm_ty, string mnemonic>
437+ : I<(outs TileOp64:$ZAda),
438+ (ins TileOp64:$_ZAda, zn_ty:$Zn, zm_ty:$Zm),
439+ mnemonic, "\t$ZAda, $Zn, $Zm",
440+ "", []>,
441+ Sched<[]> {
442+ bits<3> ZAda;
443+ bits<3> Zn;
444+ bits<3> Zm;
445+ let Inst{31-25} = 0b1010000;
446+ let Inst{24} = zn_u_pair{1}; // u0
447+ let Inst{23-22} = 0b11;
448+ let Inst{21} = zm_u_pair{1}; // u1
449+ let Inst{20} = zm_u_pair{0}; // M
450+ let Inst{19-17} = Zm;
451+ let Inst{16-10} = 0b0000000;
452+ let Inst{9} = zn_u_pair{0}; // N
453+ let Inst{8-6} = Zn;
454+ let Inst{5} = 0;
455+ let Inst{4} = subtr;
456+ let Inst{3} = 0b1;
457+ let Inst{2-0} = ZAda;
458+
459+ let Constraints = "$ZAda = $_ZAda";
460+ }
461+
462+ class sme_quarter_outer_product_i8_i32<bits<2> zn_u_pair, bits<2> zm_u_pair, bit subtr, RegisterOperand zn_ty, RegisterOperand zm_ty, string mnemonic>
463+ : I<(outs TileOp32:$ZAda),
464+ (ins TileOp32:$_ZAda, zn_ty:$Zn, zm_ty:$Zm),
465+ mnemonic, "\t$ZAda, $Zn, $Zm",
466+ "", []>,
467+ Sched<[]> {
468+ bits<2> ZAda;
469+ bits<3> Zn;
470+ bits<3> Zm;
471+ let Inst{31-25} = 0b1000000;
472+ let Inst{24} = zn_u_pair{1}; // u0
473+ let Inst{23-22} = 0b00;
474+ let Inst{21} = zm_u_pair{1}; // u1
475+ let Inst{20} = zm_u_pair{0}; // M
476+ let Inst{19-17} = Zm;
477+ let Inst{16-10} = 0b0100000;
478+ let Inst{9} = zn_u_pair{0}; // N
479+ let Inst{8-6} = Zn;
480+ let Inst{5} = 0;
481+ let Inst{4} = subtr;
482+ let Inst{3-2} = 0b00;
483+ let Inst{1-0} = ZAda;
484+
485+ let Constraints = "$ZAda = $_ZAda";
486+ }
487+
488+ class sme_quarter_outer_product_i16_i32<bit u0, bit N, bit M, bit subtr, RegisterOperand zn_ty, RegisterOperand zm_ty, string mnemonic>
489+ : I<(outs TileOp32:$ZAda),
490+ (ins TileOp32:$_ZAda, zn_ty:$Zn, zm_ty:$Zm),
491+ mnemonic, "\t$ZAda, $Zn, $Zm",
492+ "", []>,
493+ Sched<[]> {
494+ bits<2> ZAda;
495+ bits<3> Zn;
496+ bits<3> Zm;
497+ let Inst{31-25} = 0b1000000;
498+ let Inst{24} = u0;
499+ let Inst{23-21} = 0b000;
500+ let Inst{20} = M;
501+ let Inst{19-17} = Zm;
502+ let Inst{16-10} = 0b0100000;
503+ let Inst{9} = N;
504+ let Inst{8-6} = Zn;
505+ let Inst{5} = 0;
506+ let Inst{4} = subtr;
507+ let Inst{3-2} = 0b10;
508+ let Inst{1-0} = ZAda;
509+
510+ let Constraints = "$ZAda = $_ZAda";
511+ }
512+
513+ multiclass sme_quarter_outer_product_i8_i32<bit zn_u, bit zm_u, bit subtr, string mnemonic>{
514+ def _MZZ_BToS : sme_quarter_outer_product_i8_i32<{zn_u, 0}, {zm_u, 0}, subtr,
515+ ZPR8Mul2_Lo, ZPR8Mul2_Hi, mnemonic>;
516+ def _M2ZZ_BToS : sme_quarter_outer_product_i8_i32<{zn_u, 1}, {zm_u, 0}, subtr,
517+ ZZ_b_mul_r_Lo, ZPR8Mul2_Hi, mnemonic>;
518+ def _MZ2Z_BToS : sme_quarter_outer_product_i8_i32<{zn_u, 0}, {zm_u, 1}, subtr,
519+ ZPR8Mul2_Lo, ZZ_b_mul_r_Hi, mnemonic>;
520+ def _M2Z2Z_BToS : sme_quarter_outer_product_i8_i32<{zn_u, 1}, {zm_u, 1}, subtr,
521+ ZZ_b_mul_r_Lo, ZZ_b_mul_r_Hi, mnemonic>;
522+ }
523+
524+ multiclass sme_quarter_outer_product_i16_i32<bit unsigned, bit subtr, string mnemonic>{
525+ def _MZZ_HToS : sme_quarter_outer_product_i16_i32<unsigned, 0b0, 0b0, subtr,
526+ ZPR16Mul2_Lo, ZPR16Mul2_Hi, mnemonic>;
527+ def _M2ZZ_HToS : sme_quarter_outer_product_i16_i32<unsigned, 0b1, 0b0, subtr,
528+ ZZ_h_mul_r_Lo, ZPR16Mul2_Hi, mnemonic>;
529+ def _MZ2Z_HToS : sme_quarter_outer_product_i16_i32<unsigned, 0b0, 0b1, subtr,
530+ ZPR16Mul2_Lo, ZZ_h_mul_r_Hi, mnemonic>;
531+ def _M2Z2Z_HToS : sme_quarter_outer_product_i16_i32<unsigned, 0b1, 0b1, subtr,
532+ ZZ_h_mul_r_Lo, ZZ_h_mul_r_Hi, mnemonic>;
533+ }
534+
535+ multiclass sme_quarter_outer_product_i64<bit zn_u, bit zm_u, bit subtr, string mnemonic>{
536+ def _MZZ_HtoD : sme_quarter_outer_product_i64<{zn_u, 0}, {zm_u, 0}, subtr,
537+ ZPR16Mul2_Lo, ZPR16Mul2_Hi, mnemonic>;
538+ def _M2ZZ_HtoD : sme_quarter_outer_product_i64<{zn_u, 1}, {zm_u, 0}, subtr,
539+ ZZ_h_mul_r_Lo, ZPR16Mul2_Hi, mnemonic>;
540+ def _MZ2Z_HtoD : sme_quarter_outer_product_i64<{zn_u, 0}, {zm_u, 1}, subtr,
541+ ZPR16Mul2_Lo, ZZ_h_mul_r_Hi, mnemonic>;
542+ def _M2Z2Z_HtoD : sme_quarter_outer_product_i64<{zn_u, 1}, {zm_u, 1}, subtr,
543+ ZZ_h_mul_r_Lo, ZZ_h_mul_r_Hi, mnemonic>;
544+ }
545+
436546//===----------------------------------------------------------------------===//
437547// SME Add Vector to Tile
438548//===----------------------------------------------------------------------===//
0 commit comments