@@ -47,34 +47,100 @@ LLVMInitializeLanaiDisassembler() {
47
47
LanaiDisassembler::LanaiDisassembler (const MCSubtargetInfo &STI, MCContext &Ctx)
48
48
: MCDisassembler(STI, Ctx) {}
49
49
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
+ }
55
71
56
72
static DecodeStatus decodeRiMemoryValue (MCInst &Inst, unsigned Insn,
57
73
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
+ }
59
84
60
85
static DecodeStatus decodeRrMemoryValue (MCInst &Inst, unsigned Insn,
61
86
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
+ }
63
97
64
98
static DecodeStatus decodeSplsValue (MCInst &Inst, unsigned Insn,
65
99
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)));
67
107
68
- static DecodeStatus decodeBranch (MCInst &Inst, unsigned Insn, uint64_t Address,
69
- const MCDisassembler *Decoder);
108
+ return MCDisassembler::Success;
109
+ }
70
110
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
+ }
74
126
75
127
static DecodeStatus decodeShiftImm (MCInst &Inst, unsigned Insn,
76
128
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
+ }
78
144
79
145
#include " LanaiGenDisassemblerTables.inc"
80
146
@@ -157,95 +223,3 @@ LanaiDisassembler::getInstruction(MCInst &Instr, uint64_t &Size,
157
223
158
224
return MCDisassembler::Fail;
159
225
}
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