//===----------------------------------------------------------------------===// // // This file describes the RISC-V SPACEMIT RVV extension instruction formats. // //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // RISC-V SPACEMIT RVV class templates //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // Operand definitions. //===----------------------------------------------------------------------===// class SMTVDotOpcode val> { bits<7> Value = val; } def OPMMA : SMTVDotOpcode<0b1110001>; def OPMMA_SLIDE : SMTVDotOpcode<0b1110011>; //===----------------------------------------------------------------------===// // Vector Dot-Product Sign Encoding // Defines the signed/unsigned mixing modes for vector dot-product operations. // Encoding format: [1:0] bits // 00: UU (Unsigned x Unsigned) // 01: US (Unsigned x Signed) // 10: SU (Signed x Unsigned) // 11: SS (Signed x Signed) //===----------------------------------------------------------------------===// class VTypeEncode encoding, string name> { bits<2> Encoding = encoding; string Name = name; } defvar VTypeEncodes = [VTypeEncode<0b00, "u">, VTypeEncode<0b01, "us">, VTypeEncode<0b10, "su">, VTypeEncode<0b11, "">]; //===----------------------------------------------------------------------===// // Vector Dot-Product Sliding Window Modes // Encoding format: [1:0] bits // 00: Slide1 (1-element sliding stride) // 01: Slide2 (2-element sliding stride) // 10: Slide3 (3-element sliding stride) // 11: Reserved // // Used in sliding-window dot-product operations: // vd = vs1 • vs2.slide{1|2|3} // • = dot product //===----------------------------------------------------------------------===// class SlideEncode encoding, string name> { bits<2> Encoding = encoding; string Name = name; } defvar SlideEncodes = [SlideEncode<0b00, "1">, SlideEncode<0b01, "2">, SlideEncode<0b10, "3">]; //===----------------------------------------------------------------------===// // Instruction formats //===----------------------------------------------------------------------===// let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in { // Base vector dot product (no slide) format. class SMTVMADot sign, string opcodestr, bit EarlyClobber = 0> : RVInst<(outs VRM2:$vd_wb), (ins VRM2:$vd, VR:$vs1, VR:$vs2), opcodestr, "$vd, $vs1, $vs2", [], InstFormatR> { bits<5> vd; bits<5> vs1; bits<5> vs2; let Inst{31-25} = OPMMA.Value; let Inst{24-20} = vs2; let Inst{19-15} = vs1; let Inst{14} = 0b0; let Inst{13-12} = sign; let Inst{11-7} = vd; let Inst{6-0} = OPC_CUSTOM_1.Value; let Constraints = !if(EarlyClobber, "@earlyclobber $vd_wb, $vd = $vd_wb", "$vd = $vd_wb"); let UseNamedOperandTable = true; } // Sliding-window vector dot product format. class SMTVMADotSlide funct2, bits<2> sign, string opcodestr, bit EarlyClobber = 0> : RVInst<(outs VRM2:$vd_wb), (ins VRM2:$vd, VRM2:$vs1, VR:$vs2), opcodestr, "$vd, $vs1, $vs2", [], InstFormatR> { bits<5> vd; bits<5> vs1; bits<5> vs2; let Inst{31-25} = OPMMA_SLIDE.Value; let Inst{24-20} = vs2; let Inst{19-16} = vs1{4-1}; let Inst{15-14} = funct2; let Inst{13-12} = sign; let Inst{11-7} = vd; let Inst{6-0} = OPC_CUSTOM_1.Value; let Constraints = !if(EarlyClobber, "@earlyclobber $vd_wb, $vd = $vd_wb", "$vd = $vd_wb"); let UseNamedOperandTable = true; } }