@@ -73,8 +73,50 @@ static DecodeStatus DecodeARRegisterClass(MCInst &Inst, uint64_t RegNo,
7373 return MCDisassembler::Success;
7474}
7575
76+ static const MCPhysReg MRDecoderTable[] = {Xtensa::M0, Xtensa::M1, Xtensa::M2,
77+ Xtensa::M3};
78+
79+ static DecodeStatus DecodeMRRegisterClass (MCInst &Inst, uint64_t RegNo,
80+ uint64_t Address,
81+ const void *Decoder) {
82+ if (RegNo >= std::size (MRDecoderTable))
83+ return MCDisassembler::Fail;
84+
85+ MCPhysReg Reg = MRDecoderTable[RegNo];
86+ Inst.addOperand (MCOperand::createReg (Reg));
87+ return MCDisassembler::Success;
88+ }
89+
90+ static const MCPhysReg MR01DecoderTable[] = {Xtensa::M0, Xtensa::M1};
91+
92+ static DecodeStatus DecodeMR01RegisterClass (MCInst &Inst, uint64_t RegNo,
93+ uint64_t Address,
94+ const void *Decoder) {
95+ if (RegNo > 2 )
96+ return MCDisassembler::Fail;
97+
98+ MCPhysReg Reg = MR01DecoderTable[RegNo];
99+ Inst.addOperand (MCOperand::createReg (Reg));
100+ return MCDisassembler::Success;
101+ }
102+
103+ static const MCPhysReg MR23DecoderTable[] = {Xtensa::M2, Xtensa::M3};
104+
105+ static DecodeStatus DecodeMR23RegisterClass (MCInst &Inst, uint64_t RegNo,
106+ uint64_t Address,
107+ const void *Decoder) {
108+ if (RegNo != 2 && RegNo != 3 )
109+ return MCDisassembler::Fail;
110+
111+ MCPhysReg Reg = MR23DecoderTable[RegNo - 2 ];
112+ Inst.addOperand (MCOperand::createReg (Reg));
113+ return MCDisassembler::Success;
114+ }
115+
76116const MCPhysReg SRDecoderTable[] = {
77- Xtensa::SAR, 3 , Xtensa::WINDOWBASE, 72 , Xtensa::WINDOWSTART, 73 };
117+ Xtensa::SAR, 3 , Xtensa::ACCLO, 16 , Xtensa::ACCHI, 17 ,
118+ Xtensa::M0, 32 , Xtensa::M1, 33 , Xtensa::M2, 34 ,
119+ Xtensa::M3, 35 , Xtensa::WINDOWBASE, 72 , Xtensa::WINDOWSTART, 73 };
78120
79121static DecodeStatus DecodeSRRegisterClass (MCInst &Inst, uint64_t RegNo,
80122 uint64_t Address,
0 commit comments