29 #define DEBUG_TYPE "csky-disassembler"
35 std::unique_ptr<MCInstrInfo const>
const MCII;
57 return new CSKYDisassembler(STI, Ctx,
T.createMCInstrInfo());
67 CSKY::R7, CSKY::R8, CSKY::R9, CSKY::R10, CSKY::R11, CSKY::R12, CSKY::R13,
68 CSKY::R14, CSKY::R15, CSKY::R16, CSKY::R17, CSKY::R18, CSKY::R19, CSKY::R20,
69 CSKY::R21, CSKY::R22, CSKY::R23, CSKY::R24, CSKY::R25, CSKY::R26, CSKY::R27,
70 CSKY::R28, CSKY::R29, CSKY::R30, CSKY::R31};
73 CSKY::R0_R1, CSKY::R1_R2, CSKY::R2_R3, CSKY::R3_R4, CSKY::R4_R5,
74 CSKY::R5_R6, CSKY::R6_R7, CSKY::R7_R8, CSKY::R8_R9, CSKY::R9_R10,
75 CSKY::R10_R11, CSKY::R11_R12, CSKY::R12_R13, CSKY::R13_R14, CSKY::R14_R15,
76 CSKY::R15_R16, CSKY::R16_R17, CSKY::R17_R18, CSKY::R18_R19, CSKY::R19_R20,
77 CSKY::R20_R21, CSKY::R21_R22, CSKY::R22_R23, CSKY::R23_R24, CSKY::R24_R25,
78 CSKY::R25_R26, CSKY::R26_R27, CSKY::R27_R28, CSKY::R28_R29, CSKY::R29_R30,
79 CSKY::R30_R31, CSKY::R31_R32};
82 CSKY::F0_32, CSKY::F1_32, CSKY::F2_32, CSKY::F3_32, CSKY::F4_32,
83 CSKY::F5_32, CSKY::F6_32, CSKY::F7_32, CSKY::F8_32, CSKY::F9_32,
84 CSKY::F10_32, CSKY::F11_32, CSKY::F12_32, CSKY::F13_32, CSKY::F14_32,
85 CSKY::F15_32, CSKY::F16_32, CSKY::F17_32, CSKY::F18_32, CSKY::F19_32,
86 CSKY::F20_32, CSKY::F21_32, CSKY::F22_32, CSKY::F23_32, CSKY::F24_32,
87 CSKY::F25_32, CSKY::F26_32, CSKY::F27_32, CSKY::F28_32, CSKY::F29_32,
88 CSKY::F30_32, CSKY::F31_32};
91 CSKY::F0_64, CSKY::F1_64, CSKY::F2_64, CSKY::F3_64, CSKY::F4_64,
92 CSKY::F5_64, CSKY::F6_64, CSKY::F7_64, CSKY::F8_64, CSKY::F9_64,
93 CSKY::F10_64, CSKY::F11_64, CSKY::F12_64, CSKY::F13_64, CSKY::F14_64,
94 CSKY::F15_64, CSKY::F16_64, CSKY::F17_64, CSKY::F18_64, CSKY::F19_64,
95 CSKY::F20_64, CSKY::F21_64, CSKY::F22_64, CSKY::F23_64, CSKY::F24_64,
96 CSKY::F25_64, CSKY::F26_64, CSKY::F27_64, CSKY::F28_64, CSKY::F29_64,
97 CSKY::F30_64, CSKY::F31_64};
100 CSKY::F0_128, CSKY::F1_128, CSKY::F2_128, CSKY::F3_128, CSKY::F4_128,
101 CSKY::F5_128, CSKY::F6_128, CSKY::F7_128, CSKY::F8_128, CSKY::F9_128,
102 CSKY::F10_128, CSKY::F11_128, CSKY::F12_128, CSKY::F13_128, CSKY::F14_128,
103 CSKY::F15_128, CSKY::F16_128, CSKY::F17_128, CSKY::F18_128, CSKY::F19_128,
104 CSKY::F20_128, CSKY::F21_128, CSKY::F22_128, CSKY::F23_128, CSKY::F24_128,
105 CSKY::F25_128, CSKY::F26_128, CSKY::F27_128, CSKY::F28_128, CSKY::F29_128,
106 CSKY::F30_128, CSKY::F31_128};
217 bool hasHighReg = FeatureBits[CSKY::FeatureHighreg];
219 if (RegNo >= 32 || (!hasHighReg && RegNo >= 16))
226 template <
unsigned N,
unsigned S>
230 assert(isUInt<N>(
Imm) &&
"Invalid immediate");
235 template <
unsigned N>
239 assert(isUInt<N>(
Imm) &&
"Invalid immediate");
247 if ((
Imm >> 7) & 0x1) {
251 Inst.
addOperand(MCOperand::createImm(V << 2));
260 assert(isUInt<2>(
Imm) &&
"Invalid immediate");
279 assert(isUInt<10>(
Imm) &&
"Invalid immediate");
281 auto Imm5 =
Imm & 0x1f;
282 auto Ry = (
Imm >> 5) & 0x1f;
296 assert(isUInt<10>(
Imm) &&
"Invalid immediate");
298 auto Imm5 =
Imm & 0x1f;
299 auto Ry = (
Imm >> 5) & 0x1f;
313 assert(isUInt<10>(
Imm) &&
"Invalid immediate");
315 auto Imm5 =
Imm & 0x1f;
316 auto Ry = (
Imm >> 5) & 0x1f;
330 assert(isUInt<10>(
Imm) &&
"Invalid immediate");
332 auto Imm5 =
Imm & 0x1f;
333 auto Ry = (
Imm >> 5) & 0x1f;
347 assert(isUInt<10>(
Imm) &&
"Invalid immediate");
349 auto Imm5 =
Imm & 0x1f;
350 auto Ry = (
Imm >> 5) & 0x1f;
368 template <
unsigned N,
unsigned S>
372 assert(isUInt<N>(
Imm) &&
"Invalid immediate");
378 #include "CSKYGenDisassemblerTables.inc"
383 switch (
MI.getOpcode()) {
388 case CSKY::ADDI16ZSP:
389 MI.insert(std::next(
MI.begin()), MCOperand::createReg(CSKY::R14));
391 case CSKY::ADDI16SPSP:
392 case CSKY::SUBI16SPSP:
393 MI.insert(
MI.begin(), MCOperand::createReg(CSKY::R14));
394 MI.insert(
MI.begin(), MCOperand::createReg(CSKY::R14));
404 case CSKY::FCMPZHS_S:
405 case CSKY::FCMPZHS_D:
406 case CSKY::FCMPZLS_S:
407 case CSKY::FCMPZLS_D:
408 case CSKY::FCMPZNE_S:
409 case CSKY::FCMPZNE_D:
410 case CSKY::FCMPZUO_S:
411 case CSKY::FCMPZUO_D:
412 case CSKY::f2FCMPHS_S:
413 case CSKY::f2FCMPHS_D:
414 case CSKY::f2FCMPLT_S:
415 case CSKY::f2FCMPLT_D:
416 case CSKY::f2FCMPNE_S:
417 case CSKY::f2FCMPNE_D:
418 case CSKY::f2FCMPUO_S:
419 case CSKY::f2FCMPUO_D:
420 case CSKY::f2FCMPHSZ_S:
421 case CSKY::f2FCMPHSZ_D:
422 case CSKY::f2FCMPHZ_S:
423 case CSKY::f2FCMPHZ_D:
424 case CSKY::f2FCMPLSZ_S:
425 case CSKY::f2FCMPLSZ_D:
426 case CSKY::f2FCMPLTZ_S:
427 case CSKY::f2FCMPLTZ_D:
428 case CSKY::f2FCMPNEZ_S:
429 case CSKY::f2FCMPNEZ_D:
430 case CSKY::f2FCMPUOZ_S:
431 case CSKY::f2FCMPUOZ_D:
455 MI.insert(
MI.begin(), MCOperand::createReg(
CSKY::C));
460 MI.insert(std::next(
MI.begin()), MCOperand::createReg(
CSKY::C));
478 MI.insert(std::next(
MI.begin()), MCOperand::createReg(
CSKY::C));
485 MI.insert(std::next(
MI.begin()), MCOperand::createReg(
CSKY::C));
486 MI.insert(
MI.end(), MCOperand::createReg(
CSKY::C));
489 MI.getOperand(3).setImm(
MI.getOperand(3).getImm() +
490 MI.getOperand(4).getImm());
505 decodeInstruction(DecoderTableFPUV332,
MI, insn, Address, DisAsm, STI);
525 if ((
Insn >> 14) == 0
x3) {
526 if (Bytes.
size() < 4) {
536 Result = decodeInstruction(DecoderTable32,
MI,
Insn, Address,
this, STI);
541 if (Bytes.
size() < 2) {
546 Result = decodeInstruction(DecoderTable16,
MI,
Insn, Address,
this, STI);