diff options
author | Craig Topper <craig.topper@sifive.com> | 2025-05-21 08:26:35 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-21 08:26:35 -0700 |
commit | a0b6cfd9752742ff599364545ca9996cee67ef9b (patch) | |
tree | 73b29cb96b9862631bd3cb98485ce2adcdb1569a /llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp | |
parent | ec9c8e90cc824c45efde9768bbdff0b529d45a34 (diff) | |
download | llvm-a0b6cfd9752742ff599364545ca9996cee67ef9b.zip llvm-a0b6cfd9752742ff599364545ca9996cee67ef9b.tar.gz llvm-a0b6cfd9752742ff599364545ca9996cee67ef9b.tar.bz2 |
[RISCV] Add MC layer support for XSfmm*. (#133031)
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 this is a non-conforming extension as the opcodes used here are in
the standard opcode space in OP-V or OP-VE.
---------
Co-authored-by: Brandon Wu <brandon.wu@sifive.com>
Diffstat (limited to 'llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp')
-rw-r--r-- | llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp index a5e7666..4363e5c 100644 --- a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp +++ b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp @@ -344,6 +344,39 @@ static DecodeStatus DecodeVMV0RegisterClass(MCInst &Inst, uint32_t RegNo, return MCDisassembler::Success; } +static DecodeStatus DecodeTRRegisterClass(MCInst &Inst, uint32_t RegNo, + uint64_t Address, + const MCDisassembler *Decoder) { + if (RegNo > 15) + return MCDisassembler::Fail; + + MCRegister Reg = RISCV::T0 + RegNo; + Inst.addOperand(MCOperand::createReg(Reg)); + return MCDisassembler::Success; +} + +static DecodeStatus DecodeTRM2RegisterClass(MCInst &Inst, uint32_t RegNo, + uint64_t Address, + const MCDisassembler *Decoder) { + if (RegNo > 15 || RegNo % 2) + return MCDisassembler::Fail; + + MCRegister Reg = RISCV::T0 + RegNo; + Inst.addOperand(MCOperand::createReg(Reg)); + return MCDisassembler::Success; +} + +static DecodeStatus DecodeTRM4RegisterClass(MCInst &Inst, uint32_t RegNo, + uint64_t Address, + const MCDisassembler *Decoder) { + if (RegNo > 15 || RegNo % 4) + return MCDisassembler::Fail; + + MCRegister Reg = RISCV::T0 + RegNo; + Inst.addOperand(MCOperand::createReg(Reg)); + return MCDisassembler::Success; +} + static DecodeStatus decodeVMaskReg(MCInst &Inst, uint32_t RegNo, uint64_t Address, const MCDisassembler *Decoder) { @@ -722,9 +755,9 @@ static constexpr FeatureBitset XqciFeatureGroup = { }; static constexpr FeatureBitset XSfVectorGroup = { - RISCV::FeatureVendorXSfvcp, RISCV::FeatureVendorXSfvqmaccdod, - RISCV::FeatureVendorXSfvqmaccqoq, RISCV::FeatureVendorXSfvfwmaccqqq, - RISCV::FeatureVendorXSfvfnrclipxfqf}; + RISCV::FeatureVendorXSfvcp, RISCV::FeatureVendorXSfvqmaccdod, + RISCV::FeatureVendorXSfvqmaccqoq, RISCV::FeatureVendorXSfvfwmaccqqq, + RISCV::FeatureVendorXSfvfnrclipxfqf, RISCV::FeatureVendorXSfmmbase}; static constexpr FeatureBitset XSfSystemGroup = { RISCV::FeatureVendorXSiFivecdiscarddlone, RISCV::FeatureVendorXSiFivecflushdlone, |