1 //===-- CSKYDisassembler.cpp - Disassembler for CSKY ----------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file implements the CSKYDisassembler class. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "MCTargetDesc/CSKYBaseInfo.h" 14 #include "MCTargetDesc/CSKYMCTargetDesc.h" 15 #include "TargetInfo/CSKYTargetInfo.h" 16 #include "llvm/ADT/DenseMap.h" 17 #include "llvm/MC/MCContext.h" 18 #include "llvm/MC/MCDecoderOps.h" 19 #include "llvm/MC/MCDisassembler/MCDisassembler.h" 20 #include "llvm/MC/MCInst.h" 21 #include "llvm/MC/MCInstrInfo.h" 22 #include "llvm/MC/MCRegisterInfo.h" 23 #include "llvm/MC/MCSubtargetInfo.h" 24 #include "llvm/MC/TargetRegistry.h" 25 #include "llvm/Support/Endian.h" 26 27 using namespace llvm; 28 29 #define DEBUG_TYPE "csky-disassembler" 30 31 typedef MCDisassembler::DecodeStatus DecodeStatus; 32 33 namespace { 34 class CSKYDisassembler : public MCDisassembler { 35 std::unique_ptr<MCInstrInfo const> const MCII; 36 mutable StringRef symbolName; 37 38 DecodeStatus handleCROperand(MCInst &Instr) const; 39 40 public: 41 CSKYDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx, 42 MCInstrInfo const *MCII); 43 44 DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size, 45 ArrayRef<uint8_t> Bytes, uint64_t Address, 46 raw_ostream &CStream) const override; 47 }; 48 } // end anonymous namespace 49 50 CSKYDisassembler::CSKYDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx, 51 MCInstrInfo const *MCII) 52 : MCDisassembler(STI, Ctx), MCII(MCII) {} 53 54 static MCDisassembler *createCSKYDisassembler(const Target &T, 55 const MCSubtargetInfo &STI, 56 MCContext &Ctx) { 57 return new CSKYDisassembler(STI, Ctx, T.createMCInstrInfo()); 58 } 59 60 extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeCSKYDisassembler() { 61 TargetRegistry::RegisterMCDisassembler(getTheCSKYTarget(), 62 createCSKYDisassembler); 63 } 64 65 static const uint16_t GPRDecoderTable[] = { 66 CSKY::R0, CSKY::R1, CSKY::R2, CSKY::R3, CSKY::R4, CSKY::R5, CSKY::R6, 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}; 71 72 static const uint16_t GPRPairDecoderTable[] = { 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}; 80 81 static const uint16_t FPR32DecoderTable[] = { 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}; 89 90 static const uint16_t FPR64DecoderTable[] = { 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}; 98 99 static const uint16_t FPR128DecoderTable[] = { 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}; 107 108 static DecodeStatus DecodeGPRRegisterClass(MCInst &Inst, uint64_t RegNo, 109 uint64_t Address, 110 const MCDisassembler *Decoder) { 111 if (RegNo >= 32) 112 return MCDisassembler::Fail; 113 114 Inst.addOperand(MCOperand::createReg(GPRDecoderTable[RegNo])); 115 return MCDisassembler::Success; 116 } 117 118 static DecodeStatus DecodeFPR32RegisterClass(MCInst &Inst, uint64_t RegNo, 119 uint64_t Address, 120 const MCDisassembler *Decoder) { 121 if (RegNo >= 32) 122 return MCDisassembler::Fail; 123 124 Inst.addOperand(MCOperand::createReg(FPR32DecoderTable[RegNo])); 125 return MCDisassembler::Success; 126 } 127 128 static DecodeStatus DecodesFPR32RegisterClass(MCInst &Inst, uint64_t RegNo, 129 uint64_t Address, 130 const MCDisassembler *Decoder) { 131 if (RegNo >= 16) 132 return MCDisassembler::Fail; 133 134 Inst.addOperand(MCOperand::createReg(FPR32DecoderTable[RegNo])); 135 return MCDisassembler::Success; 136 } 137 138 static DecodeStatus DecodesFPR64RegisterClass(MCInst &Inst, uint64_t RegNo, 139 uint64_t Address, 140 const MCDisassembler *Decoder) { 141 if (RegNo >= 16) 142 return MCDisassembler::Fail; 143 144 Inst.addOperand(MCOperand::createReg(FPR64DecoderTable[RegNo])); 145 return MCDisassembler::Success; 146 } 147 148 static DecodeStatus DecodesFPR64_VRegisterClass(MCInst &Inst, uint64_t RegNo, 149 uint64_t Address, 150 const MCDisassembler *Decoder) { 151 if (RegNo >= 16) 152 return MCDisassembler::Fail; 153 154 Inst.addOperand(MCOperand::createReg(FPR64DecoderTable[RegNo])); 155 return MCDisassembler::Success; 156 } 157 158 static DecodeStatus DecodeFPR64RegisterClass(MCInst &Inst, uint64_t RegNo, 159 uint64_t Address, 160 const MCDisassembler *Decoder) { 161 if (RegNo >= 32) 162 return MCDisassembler::Fail; 163 164 Inst.addOperand(MCOperand::createReg(FPR64DecoderTable[RegNo])); 165 return MCDisassembler::Success; 166 } 167 168 // TODO 169 LLVM_ATTRIBUTE_UNUSED 170 static DecodeStatus DecodesFPR128RegisterClass(MCInst &Inst, uint64_t RegNo, 171 uint64_t Address, 172 const MCDisassembler *Decoder) { 173 if (RegNo >= 16) 174 return MCDisassembler::Fail; 175 176 Inst.addOperand(MCOperand::createReg(FPR128DecoderTable[RegNo])); 177 return MCDisassembler::Success; 178 } 179 180 static DecodeStatus DecodesGPRRegisterClass(MCInst &Inst, uint64_t RegNo, 181 uint64_t Address, 182 const MCDisassembler *Decoder) { 183 if (RegNo >= 16) 184 return MCDisassembler::Fail; 185 186 Inst.addOperand(MCOperand::createReg(GPRDecoderTable[RegNo])); 187 return MCDisassembler::Success; 188 } 189 190 static DecodeStatus DecodemGPRRegisterClass(MCInst &Inst, uint64_t RegNo, 191 uint64_t Address, 192 const MCDisassembler *Decoder) { 193 if (RegNo >= 8) 194 return MCDisassembler::Fail; 195 196 Inst.addOperand(MCOperand::createReg(GPRDecoderTable[RegNo])); 197 return MCDisassembler::Success; 198 } 199 200 // TODO 201 LLVM_ATTRIBUTE_UNUSED 202 static DecodeStatus DecodeGPRSPRegisterClass(MCInst &Inst, uint64_t RegNo, 203 uint64_t Address, 204 const MCDisassembler *Decoder) { 205 if (RegNo != 14) 206 return MCDisassembler::Fail; 207 208 Inst.addOperand(MCOperand::createReg(GPRDecoderTable[RegNo])); 209 return MCDisassembler::Success; 210 } 211 212 static DecodeStatus DecodeGPRPairRegisterClass(MCInst &Inst, uint64_t RegNo, 213 uint64_t Address, 214 const MCDisassembler *Decoder) { 215 const FeatureBitset &FeatureBits = 216 Decoder->getSubtargetInfo().getFeatureBits(); 217 bool hasHighReg = FeatureBits[CSKY::FeatureHighreg]; 218 219 if (RegNo >= 32 || (!hasHighReg && RegNo >= 16)) 220 return MCDisassembler::Fail; 221 222 Inst.addOperand(MCOperand::createReg(GPRPairDecoderTable[RegNo])); 223 return MCDisassembler::Success; 224 } 225 226 template <unsigned N, unsigned S> 227 static DecodeStatus decodeUImmOperand(MCInst &Inst, uint64_t Imm, 228 int64_t Address, 229 const MCDisassembler *Decoder) { 230 assert(isUInt<N>(Imm) && "Invalid immediate"); 231 Inst.addOperand(MCOperand::createImm(Imm << S)); 232 return MCDisassembler::Success; 233 } 234 235 template <unsigned N> 236 static DecodeStatus decodeOImmOperand(MCInst &Inst, uint64_t Imm, 237 int64_t Address, 238 const MCDisassembler *Decoder) { 239 assert(isUInt<N>(Imm) && "Invalid immediate"); 240 Inst.addOperand(MCOperand::createImm(Imm + 1)); 241 return MCDisassembler::Success; 242 } 243 244 static DecodeStatus decodeLRW16Imm8(MCInst &Inst, uint64_t Imm, int64_t Address, 245 const MCDisassembler *Decoder) { 246 assert(isUInt<8>(Imm) && "Invalid immediate"); 247 if ((Imm >> 7) & 0x1) { 248 Inst.addOperand(MCOperand::createImm((Imm & 0x7F) << 2)); 249 } else { 250 uint64_t V = ((Imm ^ 0xFFFFFFFF) & 0xFF); 251 Inst.addOperand(MCOperand::createImm(V << 2)); 252 } 253 254 return MCDisassembler::Success; 255 } 256 257 static DecodeStatus decodeJMPIXImmOperand(MCInst &Inst, uint64_t Imm, 258 int64_t Address, 259 const MCDisassembler *Decoder) { 260 assert(isUInt<2>(Imm) && "Invalid immediate"); 261 262 if (Imm == 0) 263 Inst.addOperand(MCOperand::createImm(16)); 264 else if (Imm == 1) 265 Inst.addOperand(MCOperand::createImm(24)); 266 else if (Imm == 2) 267 Inst.addOperand(MCOperand::createImm(32)); 268 else if (Imm == 3) 269 Inst.addOperand(MCOperand::createImm(40)); 270 else 271 return MCDisassembler::Fail; 272 273 return MCDisassembler::Success; 274 } 275 276 static DecodeStatus DecodeRegSeqOperand(MCInst &Inst, uint64_t Imm, 277 int64_t Address, 278 const MCDisassembler *Decoder) { 279 assert(isUInt<10>(Imm) && "Invalid immediate"); 280 281 auto Imm5 = Imm & 0x1f; 282 auto Ry = (Imm >> 5) & 0x1f; 283 284 if (DecodeGPRRegisterClass(Inst, Ry, Address, Decoder) == 285 MCDisassembler::Fail) 286 return MCDisassembler::Fail; 287 288 Inst.addOperand(MCOperand::createReg(GPRDecoderTable[Ry + Imm5])); 289 290 return MCDisassembler::Success; 291 } 292 293 static DecodeStatus DecodeRegSeqOperandF1(MCInst &Inst, uint64_t Imm, 294 int64_t Address, 295 const MCDisassembler *Decoder) { 296 assert(isUInt<10>(Imm) && "Invalid immediate"); 297 298 auto Imm5 = Imm & 0x1f; 299 auto Ry = (Imm >> 5) & 0x1f; 300 301 if (DecodesFPR32RegisterClass(Inst, Ry, Address, Decoder) == 302 MCDisassembler::Fail) 303 return MCDisassembler::Fail; 304 305 Inst.addOperand(MCOperand::createReg(FPR32DecoderTable[Ry + Imm5])); 306 307 return MCDisassembler::Success; 308 } 309 310 static DecodeStatus DecodeRegSeqOperandD1(MCInst &Inst, uint64_t Imm, 311 int64_t Address, 312 const MCDisassembler *Decoder) { 313 assert(isUInt<10>(Imm) && "Invalid immediate"); 314 315 auto Imm5 = Imm & 0x1f; 316 auto Ry = (Imm >> 5) & 0x1f; 317 318 if (DecodesFPR64RegisterClass(Inst, Ry, Address, Decoder) == 319 MCDisassembler::Fail) 320 return MCDisassembler::Fail; 321 322 Inst.addOperand(MCOperand::createReg(FPR64DecoderTable[Ry + Imm5])); 323 324 return MCDisassembler::Success; 325 } 326 327 static DecodeStatus DecodeRegSeqOperandF2(MCInst &Inst, uint64_t Imm, 328 int64_t Address, 329 const MCDisassembler *Decoder) { 330 assert(isUInt<10>(Imm) && "Invalid immediate"); 331 332 auto Imm5 = Imm & 0x1f; 333 auto Ry = (Imm >> 5) & 0x1f; 334 335 if (DecodeFPR32RegisterClass(Inst, Ry, Address, Decoder) == 336 MCDisassembler::Fail) 337 return MCDisassembler::Fail; 338 339 Inst.addOperand(MCOperand::createReg(FPR32DecoderTable[Ry + Imm5])); 340 341 return MCDisassembler::Success; 342 } 343 344 static DecodeStatus DecodeRegSeqOperandD2(MCInst &Inst, uint64_t Imm, 345 int64_t Address, 346 const MCDisassembler *Decoder) { 347 assert(isUInt<10>(Imm) && "Invalid immediate"); 348 349 auto Imm5 = Imm & 0x1f; 350 auto Ry = (Imm >> 5) & 0x1f; 351 352 if (DecodeFPR64RegisterClass(Inst, Ry, Address, Decoder) == 353 MCDisassembler::Fail) 354 return MCDisassembler::Fail; 355 356 Inst.addOperand(MCOperand::createReg(FPR64DecoderTable[Ry + Imm5])); 357 358 return MCDisassembler::Success; 359 } 360 361 static DecodeStatus decodeImmShiftOpValue(MCInst &Inst, uint64_t Imm, 362 int64_t Address, 363 const MCDisassembler *Decoder) { 364 Inst.addOperand(MCOperand::createImm(Log2_64(Imm))); 365 return MCDisassembler::Success; 366 } 367 368 template <unsigned N, unsigned S> 369 static DecodeStatus decodeSImmOperand(MCInst &Inst, uint64_t Imm, 370 int64_t Address, 371 const MCDisassembler *Decoder) { 372 assert(isUInt<N>(Imm) && "Invalid immediate"); 373 // Sign-extend the number in the bottom N bits of Imm 374 Inst.addOperand(MCOperand::createImm(SignExtend64<N>(Imm) << S)); 375 return MCDisassembler::Success; 376 } 377 378 #include "CSKYGenDisassemblerTables.inc" 379 380 DecodeStatus CSKYDisassembler::handleCROperand(MCInst &MI) const { 381 382 // FIXME: To query instruction info from td file or a table inc file 383 switch (MI.getOpcode()) { 384 default: 385 return MCDisassembler::Success; 386 case CSKY::LD16WSP: 387 case CSKY::ST16WSP: 388 case CSKY::ADDI16ZSP: 389 MI.insert(std::next(MI.begin()), MCOperand::createReg(CSKY::R14)); 390 return MCDisassembler::Success; 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)); 395 return MCDisassembler::Success; 396 case CSKY::FCMPHS_S: 397 case CSKY::FCMPHS_D: 398 case CSKY::FCMPLT_S: 399 case CSKY::FCMPLT_D: 400 case CSKY::FCMPNE_S: 401 case CSKY::FCMPNE_D: 402 case CSKY::FCMPUO_S: 403 case CSKY::FCMPUO_D: 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: 432 433 case CSKY::BT32: 434 case CSKY::BF32: 435 case CSKY::BT16: 436 case CSKY::BF16: 437 case CSKY::CMPNEI32: 438 case CSKY::CMPNEI16: 439 case CSKY::CMPNE32: 440 case CSKY::CMPNE16: 441 case CSKY::CMPHSI32: 442 case CSKY::CMPHSI16: 443 case CSKY::CMPHS32: 444 case CSKY::CMPHS16: 445 case CSKY::CMPLTI32: 446 case CSKY::CMPLTI16: 447 case CSKY::CMPLT32: 448 case CSKY::CMPLT16: 449 case CSKY::BTSTI32: 450 case CSKY::BTSTI16: 451 case CSKY::TSTNBZ32: 452 case CSKY::TSTNBZ16: 453 case CSKY::TST32: 454 case CSKY::TST16: 455 MI.insert(MI.begin(), MCOperand::createReg(CSKY::C)); 456 return MCDisassembler::Success; 457 case CSKY::LSLC32: 458 case CSKY::LSRC32: 459 case CSKY::ASRC32: 460 MI.insert(std::next(MI.begin()), MCOperand::createReg(CSKY::C)); 461 return MCDisassembler::Success; 462 case CSKY::MOVF32: 463 case CSKY::MOVT32: 464 case CSKY::MVC32: 465 case CSKY::MVCV32: 466 case CSKY::MVCV16: 467 case CSKY::INCT32: 468 case CSKY::INCF32: 469 case CSKY::DECT32: 470 case CSKY::DECF32: 471 case CSKY::DECGT32: 472 case CSKY::DECLT32: 473 case CSKY::DECNE32: 474 case CSKY::CLRF32: 475 case CSKY::CLRT32: 476 case CSKY::f2FSEL_S: 477 case CSKY::f2FSEL_D: 478 MI.insert(std::next(MI.begin()), MCOperand::createReg(CSKY::C)); 479 return MCDisassembler::Success; 480 case CSKY::ADDC32: 481 case CSKY::ADDC16: 482 case CSKY::SUBC32: 483 case CSKY::SUBC16: 484 case CSKY::XSR32: 485 MI.insert(std::next(MI.begin()), MCOperand::createReg(CSKY::C)); 486 MI.insert(MI.end(), MCOperand::createReg(CSKY::C)); 487 return MCDisassembler::Success; 488 case CSKY::INS32: 489 MI.getOperand(3).setImm(MI.getOperand(3).getImm() + 490 MI.getOperand(4).getImm()); 491 return MCDisassembler::Success; 492 } 493 } 494 495 static bool decodeFPUV3Instruction(MCInst &MI, uint32_t insn, uint64_t Address, 496 const MCDisassembler *DisAsm, 497 const MCSubtargetInfo &STI) { 498 LLVM_DEBUG(dbgs() << "Trying CSKY 32-bit fpuv3 table :\n"); 499 if (!STI.hasFeature(CSKY::FeatureFPUV3_HF) && 500 !STI.hasFeature(CSKY::FeatureFPUV3_SF) && 501 !STI.hasFeature(CSKY::FeatureFPUV3_DF)) 502 return false; 503 504 DecodeStatus Result = 505 decodeInstruction(DecoderTableFPUV332, MI, insn, Address, DisAsm, STI); 506 507 if (Result == MCDisassembler::Fail) { 508 MI.clear(); 509 return false; 510 } 511 512 return true; 513 } 514 515 DecodeStatus CSKYDisassembler::getInstruction(MCInst &MI, uint64_t &Size, 516 ArrayRef<uint8_t> Bytes, 517 uint64_t Address, 518 raw_ostream &CS) const { 519 520 uint32_t Insn; 521 DecodeStatus Result = MCDisassembler::Fail; 522 523 Insn = support::endian::read16le(Bytes.data()); 524 525 if ((Insn >> 14) == 0x3) { 526 if (Bytes.size() < 4) { 527 Size = 0; 528 return MCDisassembler::Fail; 529 } 530 Insn = (Insn << 16) | support::endian::read16le(&Bytes[2]); 531 532 if (decodeFPUV3Instruction(MI, Insn, Address, this, STI)) 533 Result = MCDisassembler::Success; 534 else { 535 LLVM_DEBUG(dbgs() << "Trying CSKY 32-bit table :\n"); 536 Result = decodeInstruction(DecoderTable32, MI, Insn, Address, this, STI); 537 } 538 539 Size = 4; 540 } else { 541 if (Bytes.size() < 2) { 542 Size = 0; 543 return MCDisassembler::Fail; 544 } 545 LLVM_DEBUG(dbgs() << "Trying CSKY 16-bit table :\n"); 546 Result = decodeInstruction(DecoderTable16, MI, Insn, Address, this, STI); 547 Size = 2; 548 } 549 550 handleCROperand(MI); 551 552 return Result; 553 } 554