Skip to content

Commit bb123ff

Browse files
topperc4vtomat
andcommitted
[RISCV] Add MC layer support for XSfmm*.
This adds assembler/disassembler support for XSfmmbase 0.6 and related SiFive matrix multiplication extensions based on the spec here https://www.sifive.com/document-file/xsfmm-matrix-extensions-specification Functionality-wise, this is the same as the Zvma extension proposal that SiFive shared with the Attached Matrix Extension Task Group. The extension names and instruction mnemonics have been changed to use vendor prefixes. Note the opcodes used here are in the standard opcode space in OP-V or OP-VE. Co-authored-by: Brandon Wu <[email protected]>
1 parent bff94d7 commit bb123ff

File tree

21 files changed

+1012
-2
lines changed

21 files changed

+1012
-2
lines changed

clang/test/Driver/print-supported-extensions-riscv.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,18 @@
164164
// CHECK-NEXT: xmipscmove 1.0 'XMIPSCMove' (MIPS conditional move instruction(s) (ccmov))
165165
// CHECK-NEXT: xmipslsp 1.0 'XMIPSLSP' (MIPS optimization for hardware load-store bonding)
166166
// CHECK-NEXT: xsfcease 1.0 'XSfcease' (SiFive sf.cease Instruction)
167+
// CHECK-NEXT: xsfmm128t 0.6 'XSfmm128t' (TE=128 configuration)
168+
// CHECK-NEXT: xsfmm16t 0.6 'XSfmm16t' (TE=16 configuration)
169+
// CHECK-NEXT: xsfmm32a 0.6 'XSfmm32a' (TEW=32-bit accumulation, operands - int: 8b; float: fp16, bf16, fp32)
170+
// CHECK-NEXT: xsfmm32a16f 0.6 'XSfmm32a16f' (TEW=32-bit accumulation, operands - float: 16b, widen=2 (IEEE, BF))
171+
// CHECK-NEXT: xsfmm32a32f 0.6 'XSfmm32a32f' (TEW=32-bit accumulation, operands - float: 32b)
172+
// CHECK-NEXT: xsfmm32a4i 0.6 'XSfmm32a4i' (TEW=32-bit accumulation, operands - int: 4b (packed))
173+
// CHECK-NEXT: xsfmm32a8f 0.6 'XSfmm32a8f' (TEW=32-bit accumulation, operands - float: fp8)
174+
// CHECK-NEXT: xsfmm32a8i 0.6 'XSfmm32a8i' (TEW=32-bit accumulation, operands - int: 8b)
175+
// CHECK-NEXT: xsfmm32t 0.6 'XSfmm32t' (TE=32 configuration)
176+
// CHECK-NEXT: xsfmm64a64f 0.6 'XSfmm64a64f' (TEW=64-bit accumulation, operands - float: fp64)
177+
// CHECK-NEXT: xsfmm64t 0.6 'XSfmm64t' (TE=64 configuration)
178+
// CHECK-NEXT: xsfmmbase 0.6 'XSfmmbase' (All non arithmetic instructions for all TEWs and sf.vtzero)
167179
// CHECK-NEXT: xsfvcp 1.0 'XSfvcp' (SiFive Custom Vector Coprocessor Interface Instructions)
168180
// CHECK-NEXT: xsfvfnrclipxfqf 1.0 'XSfvfnrclipxfqf' (SiFive FP32-to-int8 Ranged Clip Instructions)
169181
// CHECK-NEXT: xsfvfwmaccqqq 1.0 'XSfvfwmaccqqq' (SiFive Matrix Multiply Accumulate Instruction and 4-by-4))
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
// RUN: %clang --target=riscv32 \
2+
// RUN: -march=rv32i_zve32x_xsfmm128t -x c -E -dM %s \
3+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM128T %s
4+
// RUN: %clang --target=riscv64 \
5+
// RUN: -march=rv64i_zve32x_xsfmm128t -x c -E -dM %s \
6+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM128T %s
7+
// CHECK-XSFMM128T: __riscv_xsfmm128t 6000{{$}}
8+
//
9+
// RUN: %clang --target=riscv32 \
10+
// RUN: -march=rv32i_zve32x_xsfmm16t -x c -E -dM %s \
11+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM16T %s
12+
// RUN: %clang --target=riscv64 \
13+
// RUN: -march=rv64i_zve32x_xsfmm16t -x c -E -dM %s \
14+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM16T %s
15+
// CHECK-XSFMM16T: __riscv_xsfmm16t 6000{{$}}
16+
17+
// RUN: %clang --target=riscv32 \
18+
// RUN: -march=rv32i_zve32x_xsfmm32a -x c -E -dM %s \
19+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM32A %s
20+
// RUN: %clang --target=riscv64 \
21+
// RUN: -march=rv64i_zve32x_xsfmm32a -x c -E -dM %s \
22+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM32A %s
23+
// CHECK-XSFMM32A: __riscv_xsfmm32a 6000{{$}}
24+
25+
// RUN: %clang --target=riscv32 \
26+
// RUN: -march=rv32i_zve32x_xsfmm32a4i -x c -E -dM %s \
27+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM32A4I %s
28+
// RUN: %clang --target=riscv64 \
29+
// RUN: -march=rv64i_zve32x_xsfmm32a4i -x c -E -dM %s \
30+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM32A4I %s
31+
// CHECK-XSFMM32A4I: __riscv_xsfmm32a4i 6000{{$}}
32+
33+
// RUN: %clang --target=riscv32 \
34+
// RUN: -march=rv32i_zve32x_xsfmm32a8i -x c -E -dM %s \
35+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM32a8I %s
36+
// RUN: %clang --target=riscv64 \
37+
// RUN: -march=rv64i_zve32x_xsfmm32a8i -x c -E -dM %s \
38+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM32a8I %s
39+
// CHECK-XSFMM32a8I: __riscv_xsfmm32a8i 6000{{$}}
40+
41+
// RUN: %clang --target=riscv32 \
42+
// RUN: -march=rv32i_zve32x_xsfmm32a8f -x c -E -dM %s \
43+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM32A8F %s
44+
// RUN: %clang --target=riscv64 \
45+
// RUN: -march=rv64i_zve32x_xsfmm32a8f -x c -E -dM %s \
46+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM32A8F %s
47+
// CHECK-XSFMM32A8F: __riscv_xsfmm32a8f 6000{{$}}
48+
49+
// RUN: %clang --target=riscv32 \
50+
// RUN: -march=rv32i_zve32x_xsfmm32a16f -x c -E -dM %s \
51+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM32a16F %s
52+
// RUN: %clang --target=riscv64 \
53+
// RUN: -march=rv64i_zve32x_xsfmm32a16f -x c -E -dM %s \
54+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM32a16F %s
55+
// CHECK-XSFMM32a16F: __riscv_xsfmm32a16f 6000{{$}}
56+
57+
// RUN: %clang --target=riscv32 \
58+
// RUN: -march=rv32i_zve32x_xsfmm32a32f -x c -E -dM %s \
59+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM32a32F %s
60+
// RUN: %clang --target=riscv64 \
61+
// RUN: -march=rv64i_zve32x_xsfmm32a32f -x c -E -dM %s \
62+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM32a32F %s
63+
// CHECK-XSFMM32a32F: __riscv_xsfmm32a32f 6000{{$}}
64+
65+
// RUN: %clang --target=riscv32 \
66+
// RUN: -march=rv32i_zve32x_xsfmm32t -x c -E -dM %s \
67+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM32T %s
68+
// RUN: %clang --target=riscv64 \
69+
// RUN: -march=rv64i_zve32x_xsfmm32t -x c -E -dM %s \
70+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM32T %s
71+
// CHECK-XSFMM32T: __riscv_xsfmm32t 6000{{$}}
72+
73+
// RUN: %clang --target=riscv32 \
74+
// RUN: -march=rv32i_zve32x_xsfmm64a64f -x c -E -dM %s \
75+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM64a64f %s
76+
// RUN: %clang --target=riscv64 \
77+
// RUN: -march=rv64i_zve32x_xsfmm64a64f -x c -E -dM %s \
78+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM64a64f %s
79+
// CHECK-XSFMM64a64f: __riscv_xsfmm64a64f 6000{{$}}
80+
81+
// RUN: %clang --target=riscv32 \
82+
// RUN: -march=rv32i_zve32x_xsfmm64t -x c -E -dM %s \
83+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM64T %s
84+
// RUN: %clang --target=riscv64 \
85+
// RUN: -march=rv64i_zve32x_xsfmm64t -x c -E -dM %s \
86+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMM64T %s
87+
// CHECK-XSFMM64T: __riscv_xsfmm64t 6000{{$}}
88+
89+
// RUN: %clang --target=riscv32 \
90+
// RUN: -march=rv32i_zve32x_xsfmmbase -x c -E -dM %s \
91+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMMBASE %s
92+
// RUN: %clang --target=riscv64 \
93+
// RUN: -march=rv64i_zve32x_xsfmmbase -x c -E -dM %s \
94+
// RUN: -o - | FileCheck --check-prefix=CHECK-XSFMMBASE %s
95+
// CHECK-XSFMMBASE: __riscv_xsfmmbase 6000{{$}}

llvm/docs/RISCVUsage.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,9 @@ The current vendor extensions supported are:
389389
``XVentanaCondOps``
390390
LLVM implements `version 1.0.0 of the VTx-family custom instructions specification <https://github.com/ventanamicro/ventana-custom-extensions/releases/download/v1.0.0/ventana-custom-extensions-v1.0.0.pdf>`__ by Ventana Micro Systems. All instructions are prefixed with `vt.` as described in the specification, and the riscv-toolchain-convention document linked above. These instructions are only available for riscv64 at this time.
391391

392+
``Xsfmm*``
393+
LLVM implements `version 0.6 of the Xsfmm Family of Attached Matrix Extensions Specification <https://www.sifive.com/document-file/xsfmm-matrix-extensions-specification>`__ by SiFive. All instructions are prefixed with `sf.` as described in the specification.
394+
392395
``XSfvcp``
393396
LLVM implements `version 1.1.0 of the SiFive Vector Coprocessor Interface (VCIX) Software Specification <https://sifive.cdn.prismic.io/sifive/Zn3m1R5LeNNTwnLS_vcix-spec-software-v1p1.pdf>`__ by SiFive. All instructions are prefixed with `sf.vc.` as described in the specification, and the riscv-toolchain-convention document linked above.
394397

llvm/docs/ReleaseNotes.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ Changes to the RISC-V Backend
152152
handlers.
153153
* When the experimental extension `Xqcili` is enabled, `qc.e.li` and `qc.li` may
154154
now be used to materialize immediates.
155+
* Adds experimental assembler support for the SiFive Xsfmm* Attached Matrix
156+
Extensions.
155157

156158
Changes to the WebAssembly Backend
157159
----------------------------------

llvm/include/llvm/TargetParser/RISCVTargetParser.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ inline static bool isValidLMUL(unsigned LMUL, bool Fractional) {
9797
unsigned encodeVTYPE(VLMUL VLMUL, unsigned SEW, bool TailAgnostic,
9898
bool MaskAgnostic);
9999

100+
unsigned encodeXSfmmVType(unsigned SEW, unsigned Widen, bool AltFmt);
101+
100102
inline static VLMUL getVLMUL(unsigned VType) {
101103
unsigned VLMul = VType & 0x7;
102104
return static_cast<VLMUL>(VLMul);
@@ -126,10 +128,36 @@ inline static unsigned getSEW(unsigned VType) {
126128
return decodeVSEW(VSEW);
127129
}
128130

131+
inline static unsigned decodeTWiden(unsigned TWiden) {
132+
assert((TWiden == 1 || TWiden == 2 || TWiden == 3) &&
133+
"Unexpected TWiden value");
134+
return 1 << (TWiden - 1);
135+
}
136+
137+
inline static bool hasXSfmmWiden(unsigned VType) {
138+
unsigned TWiden = (VType >> 9) & 0x3;
139+
return TWiden != 0;
140+
}
141+
142+
inline static unsigned getXSfmmWiden(unsigned VType) {
143+
unsigned TWiden = (VType >> 9) & 0x3;
144+
assert(TWiden != 0 && "Invalid widen value");
145+
return 1 << (TWiden - 1);
146+
}
147+
148+
inline static bool getXSfmmAltFmt(unsigned VType) { return (VType >> 8) & 1; }
149+
150+
static inline bool isValidXSfmmVType(unsigned VTypeI) {
151+
return (VTypeI & ~0x738) == 0 && RISCVVType::hasXSfmmWiden(VTypeI) &&
152+
RISCVVType::getSEW(VTypeI) * RISCVVType::getXSfmmWiden(VTypeI) <= 64;
153+
}
154+
129155
inline static bool isTailAgnostic(unsigned VType) { return VType & 0x40; }
130156

131157
inline static bool isMaskAgnostic(unsigned VType) { return VType & 0x80; }
132158

159+
inline static bool isAltFmt(unsigned VType) { return VType & 0x100; }
160+
133161
void printVType(unsigned VType, raw_ostream &OS);
134162

135163
unsigned getSEWLMULRatio(unsigned SEW, VLMUL VLMul);

llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,12 @@ class RISCVAsmParser : public MCTargetAsmParser {
7777
VTypeState_Done,
7878
};
7979

80+
enum WWEEState {
81+
WWEEState_Widen,
82+
WWEEState_SEW,
83+
WWEEState_Done,
84+
};
85+
8086
SmallVector<FeatureBitset, 4> FeatureBitStack;
8187

8288
SmallVector<ParserOptionsSet, 4> ParserOptionsStack;
@@ -125,6 +131,9 @@ class RISCVAsmParser : public MCTargetAsmParser {
125131
bool &MaskAgnostic);
126132
bool generateVTypeError(SMLoc ErrorLoc);
127133

134+
bool parseXSfmmVTypeToken(const AsmToken &Tok, WWEEState &State, unsigned &WW,
135+
unsigned &EE, bool &AltFmt);
136+
bool generateXSfmmVTypeError(SMLoc ErrorLoc);
128137
// Helper to actually emit an instruction to the MCStreamer. Also, when
129138
// possible, compression of the instruction is performed.
130139
void emitToStreamer(MCStreamer &S, const MCInst &Inst);
@@ -217,6 +226,7 @@ class RISCVAsmParser : public MCTargetAsmParser {
217226
ParseStatus parseFenceArg(OperandVector &Operands);
218227
ParseStatus parseReglist(OperandVector &Operands);
219228
ParseStatus parseRegReg(OperandVector &Operands);
229+
ParseStatus parseXSfmmVType(OperandVector &Operands);
220230
ParseStatus parseRetval(OperandVector &Operands);
221231
ParseStatus parseZcmpStackAdj(OperandVector &Operands,
222232
bool ExpectNegative = false);
@@ -622,6 +632,10 @@ struct RISCVOperand final : public MCParsedAsmOperand {
622632
return Kind == KindTy::VType;
623633
}
624634

635+
bool isXSfmmVType() const {
636+
return Kind == KindTy::VType && RISCVVType::isValidXSfmmVType(VType.Val);
637+
}
638+
625639
/// Return true if the operand is a valid for the fence instruction e.g.
626640
/// ('iorw').
627641
bool isFenceArg() const { return Kind == KindTy::Fence; }
@@ -2489,6 +2503,81 @@ bool RISCVAsmParser::generateVTypeError(SMLoc ErrorLoc) {
24892503
"e[8|16|32|64],m[1|2|4|8|f2|f4|f8],[ta|tu],[ma|mu]");
24902504
}
24912505

2506+
bool RISCVAsmParser::parseXSfmmVTypeToken(const AsmToken &Tok, WWEEState &State,
2507+
unsigned &WW, unsigned &EE,
2508+
bool &AltFmt) {
2509+
if (getLexer().isNot(AsmToken::Identifier))
2510+
return true;
2511+
2512+
StringRef Identifier = getTok().getIdentifier();
2513+
2514+
switch (State) {
2515+
case WWEEState_SEW:
2516+
if (!Identifier.consume_front("e"))
2517+
break;
2518+
if (Identifier.getAsInteger(10, EE)) {
2519+
if (Identifier != "16alt")
2520+
break;
2521+
2522+
AltFmt = true;
2523+
EE = 16;
2524+
}
2525+
if (!RISCVVType::isValidSEW(EE))
2526+
break;
2527+
State = WWEEState_Widen;
2528+
return false;
2529+
case WWEEState_Widen:
2530+
if (!Identifier.consume_front("w"))
2531+
break;
2532+
if (Identifier.getAsInteger(10, WW))
2533+
break;
2534+
if (WW != 1 && WW != 2 && WW != 4)
2535+
break;
2536+
State = WWEEState_Done;
2537+
return false;
2538+
case WWEEState_Done:
2539+
// Extra token?
2540+
break;
2541+
}
2542+
2543+
return true;
2544+
}
2545+
2546+
ParseStatus RISCVAsmParser::parseXSfmmVType(OperandVector &Operands) {
2547+
SMLoc S = getLoc();
2548+
2549+
unsigned Widen = 0;
2550+
unsigned SEW = 0;
2551+
bool AltFmt = false;
2552+
2553+
WWEEState State = WWEEState_SEW;
2554+
2555+
if (parseXSfmmVTypeToken(getTok(), State, Widen, SEW, AltFmt))
2556+
return generateXSfmmVTypeError(S);
2557+
2558+
getLexer().Lex();
2559+
2560+
if (!parseOptionalToken(AsmToken::Comma))
2561+
return generateXSfmmVTypeError(S);
2562+
2563+
if (parseXSfmmVTypeToken(getTok(), State, Widen, SEW, AltFmt))
2564+
return generateXSfmmVTypeError(S);
2565+
2566+
getLexer().Lex();
2567+
2568+
if (getLexer().is(AsmToken::EndOfStatement) && State == WWEEState_Done) {
2569+
Operands.push_back(RISCVOperand::createVType(
2570+
RISCVVType::encodeXSfmmVType(SEW, Widen, AltFmt), S));
2571+
return ParseStatus::Success;
2572+
}
2573+
2574+
return generateXSfmmVTypeError(S);
2575+
}
2576+
2577+
bool RISCVAsmParser::generateXSfmmVTypeError(SMLoc ErrorLoc) {
2578+
return Error(ErrorLoc, "operand must be e[8|16|16alt|32|64],w[1|2|4]");
2579+
}
2580+
24922581
ParseStatus RISCVAsmParser::parseMaskReg(OperandVector &Operands) {
24932582
if (getLexer().isNot(AsmToken::Identifier))
24942583
return ParseStatus::NoMatch;

llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,39 @@ static DecodeStatus DecodeVMV0RegisterClass(MCInst &Inst, uint32_t RegNo,
323323
return MCDisassembler::Success;
324324
}
325325

326+
static DecodeStatus DecodeTRRegisterClass(MCInst &Inst, uint32_t RegNo,
327+
uint64_t Address,
328+
const MCDisassembler *Decoder) {
329+
if (RegNo > 15)
330+
return MCDisassembler::Fail;
331+
332+
MCRegister Reg = RISCV::T0 + RegNo;
333+
Inst.addOperand(MCOperand::createReg(Reg));
334+
return MCDisassembler::Success;
335+
}
336+
337+
static DecodeStatus DecodeTRM2RegisterClass(MCInst &Inst, uint32_t RegNo,
338+
uint64_t Address,
339+
const MCDisassembler *Decoder) {
340+
if (RegNo > 15 || RegNo % 2)
341+
return MCDisassembler::Fail;
342+
343+
MCRegister Reg = RISCV::T0 + RegNo;
344+
Inst.addOperand(MCOperand::createReg(Reg));
345+
return MCDisassembler::Success;
346+
}
347+
348+
static DecodeStatus DecodeTRM4RegisterClass(MCInst &Inst, uint32_t RegNo,
349+
uint64_t Address,
350+
const MCDisassembler *Decoder) {
351+
if (RegNo > 15 || RegNo % 4)
352+
return MCDisassembler::Fail;
353+
354+
MCRegister Reg = RISCV::T0 + RegNo;
355+
Inst.addOperand(MCOperand::createReg(Reg));
356+
return MCDisassembler::Success;
357+
}
358+
326359
static DecodeStatus decodeVMaskReg(MCInst &Inst, uint32_t RegNo,
327360
uint64_t Address,
328361
const MCDisassembler *Decoder) {
@@ -707,6 +740,7 @@ static constexpr DecoderListEntry DecoderList32[]{
707740
"XVentanaCondOps"},
708741
{DecoderTableXTHead32, XTHeadGroup, "T-Head extensions"},
709742
{DecoderTableXSfvector32, XSfVectorGroup, "SiFive vector extensions"},
743+
{DecoderTableXSfmm32, {RISCV::FeatureVendorXSfmmbase}, "SiFive XSfmm"},
710744
{DecoderTableXSfsystem32, XSfSystemGroup, "SiFive system extensions"},
711745
{DecoderTableXSfcease32, {RISCV::FeatureVendorXSfcease}, "SiFive sf.cease"},
712746
{DecoderTableXmipslsp32, {RISCV::FeatureVendorXMIPSLSP}, "MIPS mips.lsp"},

llvm/lib/Target/RISCV/MCTargetDesc/RISCVInstPrinter.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,20 @@ void RISCVInstPrinter::printVTypeI(const MCInst *MI, unsigned OpNo,
219219
RISCVVType::printVType(Imm, O);
220220
}
221221

222+
void RISCVInstPrinter::printXSfmmVType(const MCInst *MI, unsigned OpNo,
223+
const MCSubtargetInfo &STI,
224+
raw_ostream &O) {
225+
unsigned Imm = MI->getOperand(OpNo).getImm();
226+
assert(RISCVVType::isValidXSfmmVType(Imm));
227+
unsigned SEW = RISCVVType::getSEW(Imm);
228+
O << "e" << SEW;
229+
bool AltFmt = RISCVVType::getXSfmmAltFmt(Imm);
230+
if (AltFmt)
231+
O << "alt";
232+
unsigned Widen = RISCVVType::getXSfmmWiden(Imm);
233+
O << ", w" << Widen;
234+
}
235+
222236
// Print a Zcmp RList. If we are printing architectural register names rather
223237
// than ABI register names, we need to print "{x1, x8-x9, x18-x27}" for all
224238
// registers. Otherwise, we print "{ra, s0-s11}".

llvm/lib/Target/RISCV/MCTargetDesc/RISCVInstPrinter.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ class RISCVInstPrinter : public MCInstPrinter {
4848
const MCSubtargetInfo &STI, raw_ostream &O);
4949
void printVTypeI(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
5050
raw_ostream &O);
51+
void printXSfmmVType(const MCInst *MI, unsigned OpNo,
52+
const MCSubtargetInfo &STI, raw_ostream &O);
5153
void printVMaskReg(const MCInst *MI, unsigned OpNo,
5254
const MCSubtargetInfo &STI, raw_ostream &O);
5355
void printRlist(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,

0 commit comments

Comments
 (0)