[clang] [llvm] [RISCV] Add MC layer support for XSfmm*. (PR #133031)
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 17 11:09:41 PDT 2025
================
@@ -0,0 +1,276 @@
+//===-- RISCVInstrInfoXsfmm.td - SiFive matrix multiply ----*- tablegen -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file describes the Xsfmm* vendor extensions defined by SiFive.
+//
+//===----------------------------------------------------------------------===//
+
+def XSfmmVTypeAsmOperand : AsmOperandClass {
+ let Name = "XSfmmVType";
+ let ParserMethod = "parseXSfmmVType";
+ let DiagnosticType = "InvalidXSfmmVType";
+ let RenderMethod = "addVTypeIOperands";
+}
+
+def XSfmmVTypeOp : RISCVOp {
+ let ParserMatchClass = XSfmmVTypeAsmOperand;
+ let PrintMethod = "printXSfmmVType";
+ let OperandType = "OPERAND_XSFMM_VTYPE";
+ let MCOperandPredicate = [{
+ int64_t Imm;
+ if (!MCOp.evaluateAsConstantImm(Imm))
+ return false;
+ if (!isUInt<32>(Imm))
+ return false;
+ return RISCVVType::isValidXSfmmVType(Imm);
+ }];
+}
+
+let hasSideEffects = 1, mayLoad = 0, mayStore = 0 in
+class RVInstSetSingle<dag outs, dag ins, bits<5> rs2, string opcodestr,
+ string argstr>
+ : RVInst<outs, ins, opcodestr, argstr, [], InstFormatI> {
+ bits<5> rs1;
+ bits<5> rd;
+
+ let Inst{31-25} = 0b1000010;
+ let Inst{24-20} = rs2;
+ let Inst{19-15} = rs1;
+ let Inst{14-12} = OPCFG.Value;
+ let Inst{11-7} = rd;
+ let Inst{6-0} = OPC_OP_V.Value;
+
+ let Defs = [VTYPE, VL];
+}
+
+class RVInstTileMemOp<dag outs, dag ins, bits<3> nf, RISCVOpcode opcode,
+ string opcodestr, string argstr>
+ : RVInst<outs, ins, opcodestr, argstr, [], InstFormatR> {
+ bits<5> rs2;
+ bits<5> rs1;
+
+ let Inst{31-29} = nf;
+ let Inst{28} = 1;
+ let Inst{27-26} = MOPLDUnitStride.Value;
+ let Inst{25} = 1;
+ let Inst{24-20} = rs2;
+ let Inst{19-15} = rs1;
+ let Inst{14-12} = 0b111;
+ let Inst{11-7} = 0b00000;
+ let Inst{6-0} = opcode.Value;
+
+ let Uses = [VTYPE, VL];
+}
+
+let hasSideEffects = 0, mayLoad = 1, mayStore = 0 in
+class RVInstTileLoad<bits<3> nf, string opcodestr>
+ : RVInstTileMemOp<(outs), (ins GPR:$rs2, GPRMemZeroOffset:$rs1), nf,
+ OPC_LOAD_FP, opcodestr, "$rs2, ${rs1}">;
+
+let hasSideEffects = 0, mayLoad = 0, mayStore = 1 in
+class RVInstTileStore<bits<3> nf, string opcodestr>
+ : RVInstTileMemOp<(outs), (ins GPR:$rs2, GPRMemZeroOffset:$rs1), nf,
+ OPC_STORE_FP, opcodestr, "$rs2, ${rs1}">;
+
+let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
+class RVInstTileMoveOp<bits<6> funct6, dag outs, dag ins, string opcodestr,
+ string argstr>
+ : RVInst<outs, ins, opcodestr, argstr, [], InstFormatR> {
+ bits<5> rs2;
+ bits<5> rs1;
+ bits<5> vd;
+
+ let Inst{31-26} = funct6;
+ let Inst{25} = 1;
+ let Inst{24-20} = rs2;
+ let Inst{19-15} = rs1;
+ let Inst{14-12} = OPMVX.Value;
+ let Inst{11-7} = vd;
+ let Inst{6-0} = OPC_OP_V.Value;
+
+ let Uses = [VTYPE, VL];
+}
+
+let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
+class RVInstMatmulF<dag outs, dag ins, string opcodestr, string argstr>
+ : RVInst<outs, ins, opcodestr, argstr, [], InstFormatR> {
+ bits<5> vs2;
+ bits<5> vs1;
+ bits<4> rd;
+
+ let Inst{31-26} = 0b111100;
+ let Inst{25} = 1;
+ let Inst{24-20} = vs2;
+ let Inst{19-15} = vs1;
+ let Inst{14-12} = OPFVV.Value;
+ let Inst{11-9} = rd{3-1};
+ let Inst{8-7} = 0b00;
+ let Inst{6-0} = OPC_OP_VE.Value;
+
+ let Uses = [VTYPE, VL];
+}
+
+let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
+class RVInstMatmulF8<bit a, bit b, dag outs, dag ins,
+ string opcodestr, string argstr>
+ : RVInst<outs, ins, opcodestr, argstr, [], InstFormatR> {
+ bits<5> vs2;
+ bits<5> vs1;
+ bits<4> rd;
+
+ let Inst{31-27} = 0b11111;
+ let Inst{26} = a;
+ let Inst{25} = 1;
+ let Inst{24-20} = vs2;
+ let Inst{19-15} = vs1;
+ let Inst{14-12} = OPFVV.Value;
+ let Inst{11-10} = rd{3-2};
+ let Inst{9-8} = 0b00;
+ let Inst{7} = b;
+ let Inst{6-0} = OPC_OP_VE.Value;
+
+ let Uses = [VTYPE, VL];
+}
+
+
+class F8Encode<bit encoding, string name> {
+ bit Encoding = encoding;
+ string Name = name;
+}
+
+defvar F8Encodes = [F8Encode<0b0, "e5m2">,
+ F8Encode<0b1, "e4m3">];
+
+let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
+class RVInstMatmulI8<bit funct6_1, bit a, bit b, dag outs, dag ins,
+ string opcodestr, string argstr>
+ : RVInst<outs, ins, opcodestr, argstr, [], InstFormatR> {
+ bits<5> vs2;
+ bits<5> vs1;
+ bits<4> rd;
+
+ let Inst{31-28} = 0b1111;
+ let Inst{27} = funct6_1;
+ let Inst{26} = a;
+ let Inst{25} = 1;
+ let Inst{24-20} = vs2;
+ let Inst{19-15} = vs1;
+ let Inst{14-12} = OPIVV.Value;
+ let Inst{11-10} = rd{3-2};
+ let Inst{9-8} = 0b00;
+ let Inst{7} = b;
+ let Inst{6-0} = OPC_OP_VE.Value;
+
+ let Uses = [VTYPE, VL];
+}
+
+class I8Encode<bit encoding, string name> {
+ bit Encoding = encoding;
+ string Name = name;
+}
+
+defvar I8Encodes = [I8Encode<0, "u">,
+ I8Encode<1, "s">];
+
+let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
+class RVInstSetZero<dag outs, dag ins, string opcodestr, string argstr>
+ : RVInst<outs, ins, opcodestr, argstr, [], InstFormatR> {
+ bits<5> vs2;
+ bits<5> vs1;
+ bits<4> rd;
+
+ let Inst{31-26} = 0b010000;
+ let Inst{25} = 1;
+ let Inst{24-20} = 0b11110;
+ let Inst{19-15} = 0b00000;
+ let Inst{14-12} = OPMVX.Value;
+ let Inst{11-8} = rd;
+ let Inst{7} = 0;
+ let Inst{6-0} = OPC_OP_V.Value;
+
+ let Uses = [VTYPE, VL];
+}
+
+let hasSideEffects = 1, mayLoad = 0, mayStore = 0 in
+class RVInstVtDiscard<string opcodestr>
+ : RVInst<(outs), (ins), opcodestr, "", [], InstFormatR> {
+ let Inst{31-26} = 0b010000;
+ let Inst{25} = 1;
+ let Inst{24-20} = 0b11100;
+ let Inst{19-15} = 0b00000;
+ let Inst{14-12} = OPMVX.Value;
+ let Inst{11-7} = 0b00000;
+ let Inst{6-0} = OPC_OP_V.Value;
+}
+
+let Predicates = [HasVendorXSfmmbase] in
+def : InstAlias<"sf.vsettnt $rd, $rs1, $vtypei",
+ (VSETVLI GPR:$rd, GPR:$rs1, XSfmmVTypeOp:$vtypei)>;
+
+let DecoderNamespace = "XSfmm" in {
----------------
preames wrote:
Can this be grouped into one of the existing decode tables? Or does it need to be separate due the non-conforming nature?
https://github.com/llvm/llvm-project/pull/133031
More information about the llvm-commits
mailing list