@@ -47,34 +47,100 @@ LLVMInitializeLanaiDisassembler() {
4747LanaiDisassembler::LanaiDisassembler (const MCSubtargetInfo &STI, MCContext &Ctx)
4848 : MCDisassembler(STI, Ctx) {}
4949
50- // Forward declare because the autogenerated code will reference this.
51- // Definition is further down.
52- static DecodeStatus DecodeGPRRegisterClass (MCInst &Inst, unsigned RegNo,
53- uint64_t Address,
54- const MCDisassembler *Decoder);
50+ // clang-format off
51+ static const unsigned GPRDecoderTable[] = {
52+ Lanai::R0, Lanai::R1, Lanai::PC, Lanai::R3, Lanai::SP, Lanai::FP,
53+ Lanai::R6, Lanai::R7, Lanai::RV, Lanai::R9, Lanai::RR1, Lanai::RR2,
54+ Lanai::R12, Lanai::R13, Lanai::R14, Lanai::RCA, Lanai::R16, Lanai::R17,
55+ Lanai::R18, Lanai::R19, Lanai::R20, Lanai::R21, Lanai::R22, Lanai::R23,
56+ Lanai::R24, Lanai::R25, Lanai::R26, Lanai::R27, Lanai::R28, Lanai::R29,
57+ Lanai::R30, Lanai::R31
58+ };
59+ // clang-format on
60+
61+ DecodeStatus DecodeGPRRegisterClass (MCInst &Inst, unsigned RegNo,
62+ uint64_t /* Address*/ ,
63+ const MCDisassembler * /* Decoder*/ ) {
64+ if (RegNo > 31 )
65+ return MCDisassembler::Fail;
66+
67+ unsigned Reg = GPRDecoderTable[RegNo];
68+ Inst.addOperand (MCOperand::createReg (Reg));
69+ return MCDisassembler::Success;
70+ }
5571
5672static DecodeStatus decodeRiMemoryValue (MCInst &Inst, unsigned Insn,
5773 uint64_t Address,
58- const MCDisassembler *Decoder);
74+ const MCDisassembler *Decoder) {
75+ // RI memory values encoded using 23 bits:
76+ // 5 bit register, 16 bit constant
77+ unsigned Register = (Insn >> 18 ) & 0x1f ;
78+ Inst.addOperand (MCOperand::createReg (GPRDecoderTable[Register]));
79+ unsigned Offset = (Insn & 0xffff );
80+ Inst.addOperand (MCOperand::createImm (SignExtend32<16 >(Offset)));
81+
82+ return MCDisassembler::Success;
83+ }
5984
6085static DecodeStatus decodeRrMemoryValue (MCInst &Inst, unsigned Insn,
6186 uint64_t Address,
62- const MCDisassembler *Decoder);
87+ const MCDisassembler *Decoder) {
88+ // RR memory values encoded using 20 bits:
89+ // 5 bit register, 5 bit register, 2 bit PQ, 3 bit ALU operator, 5 bit JJJJJ
90+ unsigned Register = (Insn >> 15 ) & 0x1f ;
91+ Inst.addOperand (MCOperand::createReg (GPRDecoderTable[Register]));
92+ Register = (Insn >> 10 ) & 0x1f ;
93+ Inst.addOperand (MCOperand::createReg (GPRDecoderTable[Register]));
94+
95+ return MCDisassembler::Success;
96+ }
6397
6498static DecodeStatus decodeSplsValue (MCInst &Inst, unsigned Insn,
6599 uint64_t Address,
66- const MCDisassembler *Decoder);
100+ const MCDisassembler *Decoder) {
101+ // RI memory values encoded using 17 bits:
102+ // 5 bit register, 10 bit constant
103+ unsigned Register = (Insn >> 12 ) & 0x1f ;
104+ Inst.addOperand (MCOperand::createReg (GPRDecoderTable[Register]));
105+ unsigned Offset = (Insn & 0x3ff );
106+ Inst.addOperand (MCOperand::createImm (SignExtend32<10 >(Offset)));
67107
68- static DecodeStatus decodeBranch (MCInst &Inst, unsigned Insn, uint64_t Address,
69- const MCDisassembler *Decoder);
108+ return MCDisassembler::Success;
109+ }
70110
71- static DecodeStatus decodePredicateOperand (MCInst &Inst, unsigned Val,
72- uint64_t Address,
73- const MCDisassembler *Decoder);
111+ static bool tryAddingSymbolicOperand (int64_t Value, bool IsBranch,
112+ uint64_t Address, uint64_t Offset,
113+ uint64_t Width, MCInst &MI,
114+ const MCDisassembler *Decoder) {
115+ return Decoder->tryAddingSymbolicOperand (MI, Value, Address, IsBranch, Offset,
116+ Width, /* InstSize=*/ 0 );
117+ }
118+
119+ static DecodeStatus decodeBranch (MCInst &MI, unsigned Insn, uint64_t Address,
120+ const MCDisassembler *Decoder) {
121+ if (!tryAddingSymbolicOperand (Insn + Address, false , Address, 2 , 23 , MI,
122+ Decoder))
123+ MI.addOperand (MCOperand::createImm (Insn));
124+ return MCDisassembler::Success;
125+ }
74126
75127static DecodeStatus decodeShiftImm (MCInst &Inst, unsigned Insn,
76128 uint64_t Address,
77- const MCDisassembler *Decoder);
129+ const MCDisassembler *Decoder) {
130+ unsigned Offset = (Insn & 0xffff );
131+ Inst.addOperand (MCOperand::createImm (SignExtend32<16 >(Offset)));
132+
133+ return MCDisassembler::Success;
134+ }
135+
136+ static DecodeStatus decodePredicateOperand (MCInst &Inst, unsigned Val,
137+ uint64_t Address,
138+ const MCDisassembler *Decoder) {
139+ if (Val >= LPCC::UNKNOWN)
140+ return MCDisassembler::Fail;
141+ Inst.addOperand (MCOperand::createImm (Val));
142+ return MCDisassembler::Success;
143+ }
78144
79145#include " LanaiGenDisassemblerTables.inc"
80146
@@ -157,95 +223,3 @@ LanaiDisassembler::getInstruction(MCInst &Instr, uint64_t &Size,
157223
158224 return MCDisassembler::Fail;
159225}
160-
161- static const unsigned GPRDecoderTable[] = {
162- Lanai::R0, Lanai::R1, Lanai::PC, Lanai::R3, Lanai::SP, Lanai::FP,
163- Lanai::R6, Lanai::R7, Lanai::RV, Lanai::R9, Lanai::RR1, Lanai::RR2,
164- Lanai::R12, Lanai::R13, Lanai::R14, Lanai::RCA, Lanai::R16, Lanai::R17,
165- Lanai::R18, Lanai::R19, Lanai::R20, Lanai::R21, Lanai::R22, Lanai::R23,
166- Lanai::R24, Lanai::R25, Lanai::R26, Lanai::R27, Lanai::R28, Lanai::R29,
167- Lanai::R30, Lanai::R31};
168-
169- DecodeStatus DecodeGPRRegisterClass (MCInst &Inst, unsigned RegNo,
170- uint64_t /* Address*/ ,
171- const MCDisassembler * /* Decoder*/ ) {
172- if (RegNo > 31 )
173- return MCDisassembler::Fail;
174-
175- unsigned Reg = GPRDecoderTable[RegNo];
176- Inst.addOperand (MCOperand::createReg (Reg));
177- return MCDisassembler::Success;
178- }
179-
180- static DecodeStatus decodeRiMemoryValue (MCInst &Inst, unsigned Insn,
181- uint64_t Address,
182- const MCDisassembler *Decoder) {
183- // RI memory values encoded using 23 bits:
184- // 5 bit register, 16 bit constant
185- unsigned Register = (Insn >> 18 ) & 0x1f ;
186- Inst.addOperand (MCOperand::createReg (GPRDecoderTable[Register]));
187- unsigned Offset = (Insn & 0xffff );
188- Inst.addOperand (MCOperand::createImm (SignExtend32<16 >(Offset)));
189-
190- return MCDisassembler::Success;
191- }
192-
193- static DecodeStatus decodeRrMemoryValue (MCInst &Inst, unsigned Insn,
194- uint64_t Address,
195- const MCDisassembler *Decoder) {
196- // RR memory values encoded using 20 bits:
197- // 5 bit register, 5 bit register, 2 bit PQ, 3 bit ALU operator, 5 bit JJJJJ
198- unsigned Register = (Insn >> 15 ) & 0x1f ;
199- Inst.addOperand (MCOperand::createReg (GPRDecoderTable[Register]));
200- Register = (Insn >> 10 ) & 0x1f ;
201- Inst.addOperand (MCOperand::createReg (GPRDecoderTable[Register]));
202-
203- return MCDisassembler::Success;
204- }
205-
206- static DecodeStatus decodeSplsValue (MCInst &Inst, unsigned Insn,
207- uint64_t Address,
208- const MCDisassembler *Decoder) {
209- // RI memory values encoded using 17 bits:
210- // 5 bit register, 10 bit constant
211- unsigned Register = (Insn >> 12 ) & 0x1f ;
212- Inst.addOperand (MCOperand::createReg (GPRDecoderTable[Register]));
213- unsigned Offset = (Insn & 0x3ff );
214- Inst.addOperand (MCOperand::createImm (SignExtend32<10 >(Offset)));
215-
216- return MCDisassembler::Success;
217- }
218-
219- static bool tryAddingSymbolicOperand (int64_t Value, bool IsBranch,
220- uint64_t Address, uint64_t Offset,
221- uint64_t Width, MCInst &MI,
222- const MCDisassembler *Decoder) {
223- return Decoder->tryAddingSymbolicOperand (MI, Value, Address, IsBranch, Offset,
224- Width, /* InstSize=*/ 0 );
225- }
226-
227- static DecodeStatus decodeBranch (MCInst &MI, unsigned Insn, uint64_t Address,
228- const MCDisassembler *Decoder) {
229- if (!tryAddingSymbolicOperand (Insn + Address, false , Address, 2 , 23 , MI,
230- Decoder))
231- MI.addOperand (MCOperand::createImm (Insn));
232- return MCDisassembler::Success;
233- }
234-
235- static DecodeStatus decodeShiftImm (MCInst &Inst, unsigned Insn,
236- uint64_t Address,
237- const MCDisassembler *Decoder) {
238- unsigned Offset = (Insn & 0xffff );
239- Inst.addOperand (MCOperand::createImm (SignExtend32<16 >(Offset)));
240-
241- return MCDisassembler::Success;
242- }
243-
244- static DecodeStatus decodePredicateOperand (MCInst &Inst, unsigned Val,
245- uint64_t Address,
246- const MCDisassembler *Decoder) {
247- if (Val >= LPCC::UNKNOWN)
248- return MCDisassembler::Fail;
249- Inst.addOperand (MCOperand::createImm (Val));
250- return MCDisassembler::Success;
251- }
0 commit comments