1/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
2|* *|
3|* Machine Code Emitter *|
4|* *|
5|* Automatically generated file, do not edit! *|
6|* *|
7\*===----------------------------------------------------------------------===*/
8
9uint64_t BPFMCCodeEmitter::getBinaryCodeForInstr(const MCInst &MI,
10 SmallVectorImpl<MCFixup> &Fixups,
11 const MCSubtargetInfo &STI) const {
12 static const uint64_t InstBits[] = {
13 UINT64_C(13763000465539203072), // ADDR_SPACE_CAST
14 UINT64_C(504403158265495552), // ADD_ri
15 UINT64_C(288230376151711744), // ADD_ri_32
16 UINT64_C(1080863910568919040), // ADD_rr
17 UINT64_C(864691128455135232), // ADD_rr_32
18 UINT64_C(6269010681299730432), // AND_ri
19 UINT64_C(6052837899185946624), // AND_ri_32
20 UINT64_C(6845471433603153920), // AND_rr
21 UINT64_C(6629298651489370112), // AND_rr_32
22 UINT64_C(15852670688344145936), // BE16
23 UINT64_C(15852670688344145952), // BE32
24 UINT64_C(15852670688344145984), // BE64
25 UINT64_C(15492382718154506256), // BSWAP16
26 UINT64_C(15492382718154506272), // BSWAP32
27 UINT64_C(15492382718154506304), // BSWAP64
28 UINT64_C(15780613094306218225), // CMPXCHGD
29 UINT64_C(14051230837395947761), // CMPXCHGW32
30 UINT64_C(6917529027641081856), // CORE_LD32
31 UINT64_C(6917529027641081856), // CORE_LD64
32 UINT64_C(7998392938210000896), // CORE_SHIFT
33 UINT64_C(6917529027641081856), // CORE_ST
34 UINT64_C(3963167672086036480), // DIV_ri
35 UINT64_C(3746994889972252672), // DIV_ri_32
36 UINT64_C(4539628424389459968), // DIV_rr
37 UINT64_C(4323455642275676160), // DIV_rr_32
38 UINT64_C(9583660007044415488), // JAL
39 UINT64_C(10160120759347838976), // JALX
40 UINT64_C(16501189034685497344), // JCOND
41 UINT64_C(1513209474796486656), // JEQ_ri
42 UINT64_C(1585267068834414592), // JEQ_ri_32
43 UINT64_C(2089670227099910144), // JEQ_rr
44 UINT64_C(2161727821137838080), // JEQ_rr_32
45 UINT64_C(360287970189639680), // JMP
46 UINT64_C(432345564227567616), // JMPL
47 UINT64_C(6124895493223874560), // JNE_ri
48 UINT64_C(6196953087261802496), // JNE_ri_32
49 UINT64_C(6701356245527298048), // JNE_rr
50 UINT64_C(6773413839565225984), // JNE_rr_32
51 UINT64_C(4971973988617027584), // JSET_ri
52 UINT64_C(5044031582654955520), // JSET_ri_32
53 UINT64_C(5548434740920451072), // JSET_rr
54 UINT64_C(5620492334958379008), // JSET_rr_32
55 UINT64_C(8430738502437568512), // JSGE_ri
56 UINT64_C(8502796096475496448), // JSGE_ri_32
57 UINT64_C(9007199254740992000), // JSGE_rr
58 UINT64_C(9079256848778919936), // JSGE_rr_32
59 UINT64_C(7277816997830721536), // JSGT_ri
60 UINT64_C(7349874591868649472), // JSGT_ri_32
61 UINT64_C(7854277750134145024), // JSGT_rr
62 UINT64_C(7926335344172072960), // JSGT_rr_32
63 UINT64_C(15348267530078650368), // JSLE_ri
64 UINT64_C(15420325124116578304), // JSLE_ri_32
65 UINT64_C(15924728282382073856), // JSLE_rr
66 UINT64_C(15996785876420001792), // JSLE_rr_32
67 UINT64_C(14195346025471803392), // JSLT_ri
68 UINT64_C(14267403619509731328), // JSLT_ri_32
69 UINT64_C(14771806777775226880), // JSLT_rr
70 UINT64_C(14843864371813154816), // JSLT_rr_32
71 UINT64_C(3819052484010180608), // JUGE_ri
72 UINT64_C(3891110078048108544), // JUGE_ri_32
73 UINT64_C(4395513236313604096), // JUGE_rr
74 UINT64_C(4467570830351532032), // JUGE_rr_32
75 UINT64_C(2666130979403333632), // JUGT_ri
76 UINT64_C(2738188573441261568), // JUGT_ri_32
77 UINT64_C(3242591731706757120), // JUGT_rr
78 UINT64_C(3314649325744685056), // JUGT_rr_32
79 UINT64_C(13042424520864956416), // JULE_ri
80 UINT64_C(13114482114902884352), // JULE_ri_32
81 UINT64_C(13618885273168379904), // JULE_rr
82 UINT64_C(13690942867206307840), // JULE_rr_32
83 UINT64_C(11889503016258109440), // JULT_ri
84 UINT64_C(11961560610296037376), // JULT_ri_32
85 UINT64_C(12465963768561532928), // JULT_rr
86 UINT64_C(12538021362599460864), // JULT_rr_32
87 UINT64_C(936748722493063168), // JX
88 UINT64_C(8142508126285856768), // LDB
89 UINT64_C(8142508126285856768), // LDB32
90 UINT64_C(15204152342002794752), // LDBACQ32
91 UINT64_C(10448351135499550720), // LDBSX
92 UINT64_C(8718968878589280256), // LDD
93 UINT64_C(15780613094306218240), // LDDACQ
94 UINT64_C(7566047373982433280), // LDH
95 UINT64_C(7566047373982433280), // LDH32
96 UINT64_C(14627691589699371264), // LDHACQ32
97 UINT64_C(9871890383196127232), // LDHSX
98 UINT64_C(6989586621679009792), // LDW
99 UINT64_C(6989586621679009792), // LDW32
100 UINT64_C(14051230837395947776), // LDWACQ32
101 UINT64_C(9295429630892703744), // LDWSX
102 UINT64_C(3458764513820540928), // LD_ABS_B
103 UINT64_C(2882303761517117440), // LD_ABS_H
104 UINT64_C(2305843009213693952), // LD_ABS_W
105 UINT64_C(5764607523034234880), // LD_IND_B
106 UINT64_C(5188146770730811392), // LD_IND_H
107 UINT64_C(4611686018427387904), // LD_IND_W
108 UINT64_C(1729382256910270464), // LD_imm64
109 UINT64_C(1729382256910270464), // LD_pseudo
110 UINT64_C(15276209936040722448), // LE16
111 UINT64_C(15276209936040722464), // LE32
112 UINT64_C(15276209936040722496), // LE64
113 UINT64_C(10880696699727118336), // MOD_ri
114 UINT64_C(10664523917613334528), // MOD_ri_32
115 UINT64_C(11457157452030541824), // MOD_rr
116 UINT64_C(11240984669916758016), // MOD_rr_32
117 UINT64_C(13763000529963712512), // MOVSX_rr_16
118 UINT64_C(13763000598683189248), // MOVSX_rr_32
119 UINT64_C(13546827747849928704), // MOVSX_rr_32_16
120 UINT64_C(13546827713490190336), // MOVSX_rr_32_8
121 UINT64_C(13763000495603974144), // MOVSX_rr_8
122 UINT64_C(13546827679130451968), // MOV_32_64
123 UINT64_C(13186539708940812288), // MOV_ri
124 UINT64_C(12970366926827028480), // MOV_ri_32
125 UINT64_C(13763000461244235776), // MOV_rr
126 UINT64_C(13546827679130451968), // MOV_rr_32
127 UINT64_C(2810246167479189504), // MUL_ri
128 UINT64_C(2594073385365405696), // MUL_ri_32
129 UINT64_C(3386706919782612992), // MUL_rr
130 UINT64_C(3170534137668829184), // MUL_rr_32
131 UINT64_C(9511602413006487552), // NEG_32
132 UINT64_C(9727775195120271360), // NEG_64
133 UINT64_C(13763000461244235776), // NOP
134 UINT64_C(5116089176692883456), // OR_ri
135 UINT64_C(4899916394579099648), // OR_ri_32
136 UINT64_C(5692549928996306944), // OR_rr
137 UINT64_C(5476377146882523136), // OR_rr_32
138 UINT64_C(10736581511651262464), // RET
139 UINT64_C(3963167676381003776), // SDIV_ri
140 UINT64_C(3746994894267219968), // SDIV_ri_32
141 UINT64_C(4539628428684427264), // SDIV_rr
142 UINT64_C(4323455646570643456), // SDIV_rr_32
143 UINT64_C(7421932185906577408), // SLL_ri
144 UINT64_C(7205759403792793600), // SLL_ri_32
145 UINT64_C(7998392938210000896), // SLL_rr
146 UINT64_C(7782220156096217088), // SLL_rr_32
147 UINT64_C(10880696704022085632), // SMOD_ri
148 UINT64_C(10664523921908301824), // SMOD_ri_32
149 UINT64_C(11457157456325509120), // SMOD_rr
150 UINT64_C(11240984674211725312), // SMOD_rr_32
151 UINT64_C(14339461213547659264), // SRA_ri
152 UINT64_C(14123288431433875456), // SRA_ri_32
153 UINT64_C(14915921965851082752), // SRA_rr
154 UINT64_C(14699749183737298944), // SRA_rr_32
155 UINT64_C(8574853690513424384), // SRL_ri
156 UINT64_C(8358680908399640576), // SRL_ri_32
157 UINT64_C(9151314442816847872), // SRL_rr
158 UINT64_C(8935141660703064064), // SRL_rr_32
159 UINT64_C(8286623314361712640), // STB
160 UINT64_C(8286623314361712640), // STB32
161 UINT64_C(15204152342002794768), // STBREL32
162 UINT64_C(8214565720323784704), // STB_imm
163 UINT64_C(8863084066665136128), // STD
164 UINT64_C(15780613094306218256), // STDREL
165 UINT64_C(8791026472627208192), // STD_imm
166 UINT64_C(7710162562058289152), // STH
167 UINT64_C(7710162562058289152), // STH32
168 UINT64_C(14627691589699371280), // STHREL32
169 UINT64_C(7638104968020361216), // STH_imm
170 UINT64_C(7133701809754865664), // STW
171 UINT64_C(7133701809754865664), // STW32
172 UINT64_C(14051230837395947792), // STWREL32
173 UINT64_C(7061644215716937728), // STW_imm
174 UINT64_C(1657324662872342528), // SUB_ri
175 UINT64_C(1441151880758558720), // SUB_ri_32
176 UINT64_C(2233785415175766016), // SUB_rr
177 UINT64_C(2017612633061982208), // SUB_rr_32
178 UINT64_C(15780613094306217984), // XADDD
179 UINT64_C(14051230837395947520), // XADDW
180 UINT64_C(14051230837395947520), // XADDW32
181 UINT64_C(15780613094306218064), // XANDD
182 UINT64_C(14051230837395947600), // XANDW32
183 UINT64_C(15780613094306218209), // XCHGD
184 UINT64_C(14051230837395947745), // XCHGW32
185 UINT64_C(15780613094306217985), // XFADDD
186 UINT64_C(14051230837395947521), // XFADDW32
187 UINT64_C(15780613094306218065), // XFANDD
188 UINT64_C(14051230837395947601), // XFANDW32
189 UINT64_C(15780613094306218049), // XFORD
190 UINT64_C(14051230837395947585), // XFORW32
191 UINT64_C(15780613094306218145), // XFXORD
192 UINT64_C(14051230837395947681), // XFXORW32
193 UINT64_C(15780613094306218048), // XORD
194 UINT64_C(14051230837395947584), // XORW32
195 UINT64_C(12033618204333965312), // XOR_ri
196 UINT64_C(11817445422220181504), // XOR_ri_32
197 UINT64_C(12610078956637388800), // XOR_rr
198 UINT64_C(12393906174523604992), // XOR_rr_32
199 UINT64_C(15780613094306218144), // XXORD
200 UINT64_C(14051230837395947680), // XXORW32
201 };
202 constexpr unsigned FirstSupportedOpcode = 336;
203
204 const unsigned opcode = MI.getOpcode();
205 if (opcode < FirstSupportedOpcode)
206 reportUnsupportedInst(Inst: MI);
207 unsigned TableIndex = opcode - FirstSupportedOpcode;
208 uint64_t Value = InstBits[TableIndex];
209 uint64_t op = 0;
210 (void)op; // suppress warning
211 switch (opcode) {
212 case BPF::CORE_LD32:
213 case BPF::CORE_LD64:
214 case BPF::CORE_ST:
215 case BPF::NOP:
216 case BPF::RET: {
217 break;
218 }
219 case BPF::JALX: {
220 // op: BrDst
221 op = getMachineOpValue(MI, MO: MI.getOperand(i: 0), Fixups, STI);
222 Value |= (op & 0xf) << 48;
223 break;
224 }
225 case BPF::JCOND:
226 case BPF::JMP: {
227 // op: BrDst
228 op = getMachineOpValue(MI, MO: MI.getOperand(i: 0), Fixups, STI);
229 Value |= (op & 0xffff) << 32;
230 break;
231 }
232 case BPF::JAL:
233 case BPF::JMPL: {
234 // op: BrDst
235 op = getMachineOpValue(MI, MO: MI.getOperand(i: 0), Fixups, STI);
236 Value |= (op & 0xffffffff);
237 break;
238 }
239 case BPF::STB_imm:
240 case BPF::STD_imm:
241 case BPF::STH_imm:
242 case BPF::STW_imm: {
243 // op: addr
244 op = getMemoryOpValue(MI, Op: 1, Fixups, STI);
245 Value |= (op & 0xfffff) << 32;
246 // op: imm
247 op = getMachineOpValue(MI, MO: MI.getOperand(i: 0), Fixups, STI);
248 Value |= (op & 0xffffffff);
249 break;
250 }
251 case BPF::BE16:
252 case BPF::BE32:
253 case BPF::BE64:
254 case BPF::BSWAP16:
255 case BPF::BSWAP32:
256 case BPF::BSWAP64:
257 case BPF::JX:
258 case BPF::LE16:
259 case BPF::LE32:
260 case BPF::LE64:
261 case BPF::NEG_32:
262 case BPF::NEG_64: {
263 // op: dst
264 op = getMachineOpValue(MI, MO: MI.getOperand(i: 0), Fixups, STI);
265 Value |= (op & 0xf) << 48;
266 break;
267 }
268 case BPF::JEQ_ri:
269 case BPF::JEQ_ri_32:
270 case BPF::JNE_ri:
271 case BPF::JNE_ri_32:
272 case BPF::JSET_ri:
273 case BPF::JSET_ri_32:
274 case BPF::JSGE_ri:
275 case BPF::JSGE_ri_32:
276 case BPF::JSGT_ri:
277 case BPF::JSGT_ri_32:
278 case BPF::JSLE_ri:
279 case BPF::JSLE_ri_32:
280 case BPF::JSLT_ri:
281 case BPF::JSLT_ri_32:
282 case BPF::JUGE_ri:
283 case BPF::JUGE_ri_32:
284 case BPF::JUGT_ri:
285 case BPF::JUGT_ri_32:
286 case BPF::JULE_ri:
287 case BPF::JULE_ri_32:
288 case BPF::JULT_ri:
289 case BPF::JULT_ri_32: {
290 // op: dst
291 op = getMachineOpValue(MI, MO: MI.getOperand(i: 0), Fixups, STI);
292 Value |= (op & 0xf) << 48;
293 // op: BrDst
294 op = getMachineOpValue(MI, MO: MI.getOperand(i: 2), Fixups, STI);
295 Value |= (op & 0xffff) << 32;
296 // op: imm
297 op = getMachineOpValue(MI, MO: MI.getOperand(i: 1), Fixups, STI);
298 Value |= (op & 0xffffffff);
299 break;
300 }
301 case BPF::LDB:
302 case BPF::LDB32:
303 case BPF::LDBACQ32:
304 case BPF::LDBSX:
305 case BPF::LDD:
306 case BPF::LDDACQ:
307 case BPF::LDH:
308 case BPF::LDH32:
309 case BPF::LDHACQ32:
310 case BPF::LDHSX:
311 case BPF::LDW:
312 case BPF::LDW32:
313 case BPF::LDWACQ32:
314 case BPF::LDWSX: {
315 // op: dst
316 op = getMachineOpValue(MI, MO: MI.getOperand(i: 0), Fixups, STI);
317 Value |= (op & 0xf) << 48;
318 // op: addr
319 op = getMemoryOpValue(MI, Op: 1, Fixups, STI);
320 Value |= (op & 0xf0000) << 36;
321 Value |= (op & 0xffff) << 32;
322 break;
323 }
324 case BPF::LD_imm64:
325 case BPF::MOV_ri:
326 case BPF::MOV_ri_32: {
327 // op: dst
328 op = getMachineOpValue(MI, MO: MI.getOperand(i: 0), Fixups, STI);
329 Value |= (op & 0xf) << 48;
330 // op: imm
331 op = getMachineOpValue(MI, MO: MI.getOperand(i: 1), Fixups, STI);
332 Value |= (op & 0xffffffff);
333 break;
334 }
335 case BPF::ADD_ri:
336 case BPF::ADD_ri_32:
337 case BPF::AND_ri:
338 case BPF::AND_ri_32:
339 case BPF::DIV_ri:
340 case BPF::DIV_ri_32:
341 case BPF::MOD_ri:
342 case BPF::MOD_ri_32:
343 case BPF::MUL_ri:
344 case BPF::MUL_ri_32:
345 case BPF::OR_ri:
346 case BPF::OR_ri_32:
347 case BPF::SDIV_ri:
348 case BPF::SDIV_ri_32:
349 case BPF::SLL_ri:
350 case BPF::SLL_ri_32:
351 case BPF::SMOD_ri:
352 case BPF::SMOD_ri_32:
353 case BPF::SRA_ri:
354 case BPF::SRA_ri_32:
355 case BPF::SRL_ri:
356 case BPF::SRL_ri_32:
357 case BPF::SUB_ri:
358 case BPF::SUB_ri_32:
359 case BPF::XOR_ri:
360 case BPF::XOR_ri_32: {
361 // op: dst
362 op = getMachineOpValue(MI, MO: MI.getOperand(i: 0), Fixups, STI);
363 Value |= (op & 0xf) << 48;
364 // op: imm
365 op = getMachineOpValue(MI, MO: MI.getOperand(i: 2), Fixups, STI);
366 Value |= (op & 0xffffffff);
367 break;
368 }
369 case BPF::LD_pseudo: {
370 // op: dst
371 op = getMachineOpValue(MI, MO: MI.getOperand(i: 0), Fixups, STI);
372 Value |= (op & 0xf) << 48;
373 // op: imm
374 op = getMachineOpValue(MI, MO: MI.getOperand(i: 2), Fixups, STI);
375 Value |= (op & 0xffffffff);
376 // op: pseudo
377 op = getMachineOpValue(MI, MO: MI.getOperand(i: 1), Fixups, STI);
378 Value |= (op & 0xf) << 52;
379 break;
380 }
381 case BPF::MOVSX_rr_16:
382 case BPF::MOVSX_rr_32:
383 case BPF::MOVSX_rr_32_16:
384 case BPF::MOVSX_rr_32_8:
385 case BPF::MOVSX_rr_8:
386 case BPF::MOV_32_64:
387 case BPF::MOV_rr:
388 case BPF::MOV_rr_32: {
389 // op: dst
390 op = getMachineOpValue(MI, MO: MI.getOperand(i: 0), Fixups, STI);
391 Value |= (op & 0xf) << 48;
392 // op: src
393 op = getMachineOpValue(MI, MO: MI.getOperand(i: 1), Fixups, STI);
394 Value |= (op & 0xf) << 52;
395 break;
396 }
397 case BPF::JEQ_rr:
398 case BPF::JEQ_rr_32:
399 case BPF::JNE_rr:
400 case BPF::JNE_rr_32:
401 case BPF::JSET_rr:
402 case BPF::JSET_rr_32:
403 case BPF::JSGE_rr:
404 case BPF::JSGE_rr_32:
405 case BPF::JSGT_rr:
406 case BPF::JSGT_rr_32:
407 case BPF::JSLE_rr:
408 case BPF::JSLE_rr_32:
409 case BPF::JSLT_rr:
410 case BPF::JSLT_rr_32:
411 case BPF::JUGE_rr:
412 case BPF::JUGE_rr_32:
413 case BPF::JUGT_rr:
414 case BPF::JUGT_rr_32:
415 case BPF::JULE_rr:
416 case BPF::JULE_rr_32:
417 case BPF::JULT_rr:
418 case BPF::JULT_rr_32: {
419 // op: dst
420 op = getMachineOpValue(MI, MO: MI.getOperand(i: 0), Fixups, STI);
421 Value |= (op & 0xf) << 48;
422 // op: src
423 op = getMachineOpValue(MI, MO: MI.getOperand(i: 1), Fixups, STI);
424 Value |= (op & 0xf) << 52;
425 // op: BrDst
426 op = getMachineOpValue(MI, MO: MI.getOperand(i: 2), Fixups, STI);
427 Value |= (op & 0xffff) << 32;
428 break;
429 }
430 case BPF::ADDR_SPACE_CAST: {
431 // op: dst
432 op = getMachineOpValue(MI, MO: MI.getOperand(i: 0), Fixups, STI);
433 Value |= (op & 0xf) << 48;
434 // op: src
435 op = getMachineOpValue(MI, MO: MI.getOperand(i: 1), Fixups, STI);
436 Value |= (op & 0xf) << 52;
437 // op: dst_as
438 op = getMachineOpValue(MI, MO: MI.getOperand(i: 2), Fixups, STI);
439 Value |= (op & 0xffff) << 16;
440 // op: src_as
441 op = getMachineOpValue(MI, MO: MI.getOperand(i: 3), Fixups, STI);
442 Value |= (op & 0xffff);
443 break;
444 }
445 case BPF::ADD_rr:
446 case BPF::ADD_rr_32:
447 case BPF::AND_rr:
448 case BPF::AND_rr_32:
449 case BPF::CORE_SHIFT:
450 case BPF::DIV_rr:
451 case BPF::DIV_rr_32:
452 case BPF::MOD_rr:
453 case BPF::MOD_rr_32:
454 case BPF::MUL_rr:
455 case BPF::MUL_rr_32:
456 case BPF::OR_rr:
457 case BPF::OR_rr_32:
458 case BPF::SDIV_rr:
459 case BPF::SDIV_rr_32:
460 case BPF::SLL_rr:
461 case BPF::SLL_rr_32:
462 case BPF::SMOD_rr:
463 case BPF::SMOD_rr_32:
464 case BPF::SRA_rr:
465 case BPF::SRA_rr_32:
466 case BPF::SRL_rr:
467 case BPF::SRL_rr_32:
468 case BPF::SUB_rr:
469 case BPF::SUB_rr_32:
470 case BPF::XOR_rr:
471 case BPF::XOR_rr_32: {
472 // op: dst
473 op = getMachineOpValue(MI, MO: MI.getOperand(i: 0), Fixups, STI);
474 Value |= (op & 0xf) << 48;
475 // op: src
476 op = getMachineOpValue(MI, MO: MI.getOperand(i: 2), Fixups, STI);
477 Value |= (op & 0xf) << 52;
478 break;
479 }
480 case BPF::XADDD:
481 case BPF::XADDW:
482 case BPF::XADDW32:
483 case BPF::XANDD:
484 case BPF::XANDW32:
485 case BPF::XCHGD:
486 case BPF::XCHGW32:
487 case BPF::XFADDD:
488 case BPF::XFADDW32:
489 case BPF::XFANDD:
490 case BPF::XFANDW32:
491 case BPF::XFORD:
492 case BPF::XFORW32:
493 case BPF::XFXORD:
494 case BPF::XFXORW32:
495 case BPF::XORD:
496 case BPF::XORW32:
497 case BPF::XXORD:
498 case BPF::XXORW32: {
499 // op: dst
500 op = getMachineOpValue(MI, MO: MI.getOperand(i: 0), Fixups, STI);
501 Value |= (op & 0xf) << 52;
502 // op: addr
503 op = getMemoryOpValue(MI, Op: 1, Fixups, STI);
504 Value |= (op & 0xfffff) << 32;
505 break;
506 }
507 case BPF::LD_ABS_B:
508 case BPF::LD_ABS_H:
509 case BPF::LD_ABS_W: {
510 // op: imm
511 op = getMachineOpValue(MI, MO: MI.getOperand(i: 0), Fixups, STI);
512 Value |= (op & 0xffffffff);
513 break;
514 }
515 case BPF::CMPXCHGD:
516 case BPF::CMPXCHGW32: {
517 // op: new
518 op = getMachineOpValue(MI, MO: MI.getOperand(i: 2), Fixups, STI);
519 Value |= (op & 0xf) << 52;
520 // op: addr
521 op = getMemoryOpValue(MI, Op: 0, Fixups, STI);
522 Value |= (op & 0xfffff) << 32;
523 break;
524 }
525 case BPF::STB:
526 case BPF::STB32:
527 case BPF::STBREL32:
528 case BPF::STD:
529 case BPF::STDREL:
530 case BPF::STH:
531 case BPF::STH32:
532 case BPF::STHREL32:
533 case BPF::STW:
534 case BPF::STW32:
535 case BPF::STWREL32: {
536 // op: src
537 op = getMachineOpValue(MI, MO: MI.getOperand(i: 0), Fixups, STI);
538 Value |= (op & 0xf) << 52;
539 // op: addr
540 op = getMemoryOpValue(MI, Op: 1, Fixups, STI);
541 Value |= (op & 0xfffff) << 32;
542 break;
543 }
544 case BPF::LD_IND_B:
545 case BPF::LD_IND_H:
546 case BPF::LD_IND_W: {
547 // op: val
548 op = getMachineOpValue(MI, MO: MI.getOperand(i: 0), Fixups, STI);
549 Value |= (op & 0xf) << 52;
550 break;
551 }
552 default:
553 reportUnsupportedInst(Inst: MI);
554 }
555 return Value;
556}
557
558#ifdef GET_OPERAND_BIT_OFFSET
559#undef GET_OPERAND_BIT_OFFSET
560
561uint32_t BPFMCCodeEmitter::getOperandBitOffset(const MCInst &MI,
562 unsigned OpNum,
563 const MCSubtargetInfo &STI) const {
564 switch (MI.getOpcode()) {
565 case BPF::CORE_LD32:
566 case BPF::CORE_LD64:
567 case BPF::CORE_ST:
568 case BPF::NOP:
569 case BPF::RET: {
570 break;
571 }
572 case BPF::JAL:
573 case BPF::JMPL: {
574 switch (OpNum) {
575 case 0:
576 // op: BrDst
577 return 0;
578 }
579 break;
580 }
581 case BPF::JCOND:
582 case BPF::JMP: {
583 switch (OpNum) {
584 case 0:
585 // op: BrDst
586 return 32;
587 }
588 break;
589 }
590 case BPF::JALX: {
591 switch (OpNum) {
592 case 0:
593 // op: BrDst
594 return 48;
595 }
596 break;
597 }
598 case BPF::LDB:
599 case BPF::LDB32:
600 case BPF::LDBACQ32:
601 case BPF::LDBSX:
602 case BPF::LDD:
603 case BPF::LDDACQ:
604 case BPF::LDH:
605 case BPF::LDH32:
606 case BPF::LDHACQ32:
607 case BPF::LDHSX:
608 case BPF::LDW:
609 case BPF::LDW32:
610 case BPF::LDWACQ32:
611 case BPF::LDWSX: {
612 switch (OpNum) {
613 case 0:
614 // op: dst
615 return 48;
616 case 1:
617 // op: addr
618 return 32;
619 }
620 break;
621 }
622 case BPF::LD_imm64:
623 case BPF::MOV_ri:
624 case BPF::MOV_ri_32: {
625 switch (OpNum) {
626 case 0:
627 // op: dst
628 return 48;
629 case 1:
630 // op: imm
631 return 0;
632 }
633 break;
634 }
635 case BPF::JEQ_rr:
636 case BPF::JEQ_rr_32:
637 case BPF::JNE_rr:
638 case BPF::JNE_rr_32:
639 case BPF::JSET_rr:
640 case BPF::JSET_rr_32:
641 case BPF::JSGE_rr:
642 case BPF::JSGE_rr_32:
643 case BPF::JSGT_rr:
644 case BPF::JSGT_rr_32:
645 case BPF::JSLE_rr:
646 case BPF::JSLE_rr_32:
647 case BPF::JSLT_rr:
648 case BPF::JSLT_rr_32:
649 case BPF::JUGE_rr:
650 case BPF::JUGE_rr_32:
651 case BPF::JUGT_rr:
652 case BPF::JUGT_rr_32:
653 case BPF::JULE_rr:
654 case BPF::JULE_rr_32:
655 case BPF::JULT_rr:
656 case BPF::JULT_rr_32: {
657 switch (OpNum) {
658 case 0:
659 // op: dst
660 return 48;
661 case 1:
662 // op: src
663 return 52;
664 case 2:
665 // op: BrDst
666 return 32;
667 }
668 break;
669 }
670 case BPF::ADDR_SPACE_CAST: {
671 switch (OpNum) {
672 case 0:
673 // op: dst
674 return 48;
675 case 1:
676 // op: src
677 return 52;
678 case 2:
679 // op: dst_as
680 return 16;
681 case 3:
682 // op: src_as
683 return 0;
684 }
685 break;
686 }
687 case BPF::MOVSX_rr_16:
688 case BPF::MOVSX_rr_32:
689 case BPF::MOVSX_rr_32_16:
690 case BPF::MOVSX_rr_32_8:
691 case BPF::MOVSX_rr_8:
692 case BPF::MOV_32_64:
693 case BPF::MOV_rr:
694 case BPF::MOV_rr_32: {
695 switch (OpNum) {
696 case 0:
697 // op: dst
698 return 48;
699 case 1:
700 // op: src
701 return 52;
702 }
703 break;
704 }
705 case BPF::JEQ_ri:
706 case BPF::JEQ_ri_32:
707 case BPF::JNE_ri:
708 case BPF::JNE_ri_32:
709 case BPF::JSET_ri:
710 case BPF::JSET_ri_32:
711 case BPF::JSGE_ri:
712 case BPF::JSGE_ri_32:
713 case BPF::JSGT_ri:
714 case BPF::JSGT_ri_32:
715 case BPF::JSLE_ri:
716 case BPF::JSLE_ri_32:
717 case BPF::JSLT_ri:
718 case BPF::JSLT_ri_32:
719 case BPF::JUGE_ri:
720 case BPF::JUGE_ri_32:
721 case BPF::JUGT_ri:
722 case BPF::JUGT_ri_32:
723 case BPF::JULE_ri:
724 case BPF::JULE_ri_32:
725 case BPF::JULT_ri:
726 case BPF::JULT_ri_32: {
727 switch (OpNum) {
728 case 0:
729 // op: dst
730 return 48;
731 case 2:
732 // op: BrDst
733 return 32;
734 case 1:
735 // op: imm
736 return 0;
737 }
738 break;
739 }
740 case BPF::LD_pseudo: {
741 switch (OpNum) {
742 case 0:
743 // op: dst
744 return 48;
745 case 2:
746 // op: imm
747 return 0;
748 case 1:
749 // op: pseudo
750 return 52;
751 }
752 break;
753 }
754 case BPF::ADD_ri:
755 case BPF::ADD_ri_32:
756 case BPF::AND_ri:
757 case BPF::AND_ri_32:
758 case BPF::DIV_ri:
759 case BPF::DIV_ri_32:
760 case BPF::MOD_ri:
761 case BPF::MOD_ri_32:
762 case BPF::MUL_ri:
763 case BPF::MUL_ri_32:
764 case BPF::OR_ri:
765 case BPF::OR_ri_32:
766 case BPF::SDIV_ri:
767 case BPF::SDIV_ri_32:
768 case BPF::SLL_ri:
769 case BPF::SLL_ri_32:
770 case BPF::SMOD_ri:
771 case BPF::SMOD_ri_32:
772 case BPF::SRA_ri:
773 case BPF::SRA_ri_32:
774 case BPF::SRL_ri:
775 case BPF::SRL_ri_32:
776 case BPF::SUB_ri:
777 case BPF::SUB_ri_32:
778 case BPF::XOR_ri:
779 case BPF::XOR_ri_32: {
780 switch (OpNum) {
781 case 0:
782 // op: dst
783 return 48;
784 case 2:
785 // op: imm
786 return 0;
787 }
788 break;
789 }
790 case BPF::ADD_rr:
791 case BPF::ADD_rr_32:
792 case BPF::AND_rr:
793 case BPF::AND_rr_32:
794 case BPF::CORE_SHIFT:
795 case BPF::DIV_rr:
796 case BPF::DIV_rr_32:
797 case BPF::MOD_rr:
798 case BPF::MOD_rr_32:
799 case BPF::MUL_rr:
800 case BPF::MUL_rr_32:
801 case BPF::OR_rr:
802 case BPF::OR_rr_32:
803 case BPF::SDIV_rr:
804 case BPF::SDIV_rr_32:
805 case BPF::SLL_rr:
806 case BPF::SLL_rr_32:
807 case BPF::SMOD_rr:
808 case BPF::SMOD_rr_32:
809 case BPF::SRA_rr:
810 case BPF::SRA_rr_32:
811 case BPF::SRL_rr:
812 case BPF::SRL_rr_32:
813 case BPF::SUB_rr:
814 case BPF::SUB_rr_32:
815 case BPF::XOR_rr:
816 case BPF::XOR_rr_32: {
817 switch (OpNum) {
818 case 0:
819 // op: dst
820 return 48;
821 case 2:
822 // op: src
823 return 52;
824 }
825 break;
826 }
827 case BPF::BE16:
828 case BPF::BE32:
829 case BPF::BE64:
830 case BPF::BSWAP16:
831 case BPF::BSWAP32:
832 case BPF::BSWAP64:
833 case BPF::JX:
834 case BPF::LE16:
835 case BPF::LE32:
836 case BPF::LE64:
837 case BPF::NEG_32:
838 case BPF::NEG_64: {
839 switch (OpNum) {
840 case 0:
841 // op: dst
842 return 48;
843 }
844 break;
845 }
846 case BPF::XADDD:
847 case BPF::XADDW:
848 case BPF::XADDW32:
849 case BPF::XANDD:
850 case BPF::XANDW32:
851 case BPF::XCHGD:
852 case BPF::XCHGW32:
853 case BPF::XFADDD:
854 case BPF::XFADDW32:
855 case BPF::XFANDD:
856 case BPF::XFANDW32:
857 case BPF::XFORD:
858 case BPF::XFORW32:
859 case BPF::XFXORD:
860 case BPF::XFXORW32:
861 case BPF::XORD:
862 case BPF::XORW32:
863 case BPF::XXORD:
864 case BPF::XXORW32: {
865 switch (OpNum) {
866 case 0:
867 // op: dst
868 return 52;
869 case 1:
870 // op: addr
871 return 32;
872 }
873 break;
874 }
875 case BPF::LD_ABS_B:
876 case BPF::LD_ABS_H:
877 case BPF::LD_ABS_W: {
878 switch (OpNum) {
879 case 0:
880 // op: imm
881 return 0;
882 }
883 break;
884 }
885 case BPF::STB:
886 case BPF::STB32:
887 case BPF::STBREL32:
888 case BPF::STD:
889 case BPF::STDREL:
890 case BPF::STH:
891 case BPF::STH32:
892 case BPF::STHREL32:
893 case BPF::STW:
894 case BPF::STW32:
895 case BPF::STWREL32: {
896 switch (OpNum) {
897 case 0:
898 // op: src
899 return 52;
900 case 1:
901 // op: addr
902 return 32;
903 }
904 break;
905 }
906 case BPF::LD_IND_B:
907 case BPF::LD_IND_H:
908 case BPF::LD_IND_W: {
909 switch (OpNum) {
910 case 0:
911 // op: val
912 return 52;
913 }
914 break;
915 }
916 case BPF::STB_imm:
917 case BPF::STD_imm:
918 case BPF::STH_imm:
919 case BPF::STW_imm: {
920 switch (OpNum) {
921 case 1:
922 // op: addr
923 return 32;
924 case 0:
925 // op: imm
926 return 0;
927 }
928 break;
929 }
930 case BPF::CMPXCHGD:
931 case BPF::CMPXCHGW32: {
932 switch (OpNum) {
933 case 2:
934 // op: new
935 return 52;
936 case 0:
937 // op: addr
938 return 32;
939 }
940 break;
941 }
942 default:
943 reportUnsupportedInst(MI);
944 }
945 reportUnsupportedOperand(MI, OpNum);
946}
947
948#endif // GET_OPERAND_BIT_OFFSET
949
950