1 //===- SparcDisassembler.cpp - Disassembler for Sparc -----------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file is part of the Sparc Disassembler. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "Sparc.h" 15 #include "SparcRegisterInfo.h" 16 #include "SparcSubtarget.h" 17 #include "llvm/MC/MCDisassembler/MCDisassembler.h" 18 #include "llvm/MC/MCFixedLenDisassembler.h" 19 #include "llvm/MC/MCInst.h" 20 #include "llvm/MC/MCContext.h" 21 #include "llvm/MC/MCAsmInfo.h" 22 #include "llvm/Support/TargetRegistry.h" 23 24 using namespace llvm; 25 26 #define DEBUG_TYPE "sparc-disassembler" 27 28 typedef MCDisassembler::DecodeStatus DecodeStatus; 29 30 namespace { 31 32 /// A disassembler class for Sparc. 33 class SparcDisassembler : public MCDisassembler { 34 public: 35 SparcDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx) 36 : MCDisassembler(STI, Ctx) {} 37 virtual ~SparcDisassembler() {} 38 39 DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size, 40 ArrayRef<uint8_t> Bytes, uint64_t Address, 41 raw_ostream &VStream, 42 raw_ostream &CStream) const override; 43 }; 44 } 45 46 namespace llvm { 47 extern Target TheSparcTarget, TheSparcV9Target, TheSparcelTarget; 48 } 49 50 static MCDisassembler *createSparcDisassembler(const Target &T, 51 const MCSubtargetInfo &STI, 52 MCContext &Ctx) { 53 return new SparcDisassembler(STI, Ctx); 54 } 55 56 57 extern "C" void LLVMInitializeSparcDisassembler() { 58 // Register the disassembler. 59 TargetRegistry::RegisterMCDisassembler(TheSparcTarget, 60 createSparcDisassembler); 61 TargetRegistry::RegisterMCDisassembler(TheSparcV9Target, 62 createSparcDisassembler); 63 TargetRegistry::RegisterMCDisassembler(TheSparcelTarget, 64 createSparcDisassembler); 65 } 66 67 static const unsigned IntRegDecoderTable[] = { 68 SP::G0, SP::G1, SP::G2, SP::G3, 69 SP::G4, SP::G5, SP::G6, SP::G7, 70 SP::O0, SP::O1, SP::O2, SP::O3, 71 SP::O4, SP::O5, SP::O6, SP::O7, 72 SP::L0, SP::L1, SP::L2, SP::L3, 73 SP::L4, SP::L5, SP::L6, SP::L7, 74 SP::I0, SP::I1, SP::I2, SP::I3, 75 SP::I4, SP::I5, SP::I6, SP::I7 }; 76 77 static const unsigned FPRegDecoderTable[] = { 78 SP::F0, SP::F1, SP::F2, SP::F3, 79 SP::F4, SP::F5, SP::F6, SP::F7, 80 SP::F8, SP::F9, SP::F10, SP::F11, 81 SP::F12, SP::F13, SP::F14, SP::F15, 82 SP::F16, SP::F17, SP::F18, SP::F19, 83 SP::F20, SP::F21, SP::F22, SP::F23, 84 SP::F24, SP::F25, SP::F26, SP::F27, 85 SP::F28, SP::F29, SP::F30, SP::F31 }; 86 87 static const unsigned DFPRegDecoderTable[] = { 88 SP::D0, SP::D16, SP::D1, SP::D17, 89 SP::D2, SP::D18, SP::D3, SP::D19, 90 SP::D4, SP::D20, SP::D5, SP::D21, 91 SP::D6, SP::D22, SP::D7, SP::D23, 92 SP::D8, SP::D24, SP::D9, SP::D25, 93 SP::D10, SP::D26, SP::D11, SP::D27, 94 SP::D12, SP::D28, SP::D13, SP::D29, 95 SP::D14, SP::D30, SP::D15, SP::D31 }; 96 97 static const unsigned QFPRegDecoderTable[] = { 98 SP::Q0, SP::Q8, ~0U, ~0U, 99 SP::Q1, SP::Q9, ~0U, ~0U, 100 SP::Q2, SP::Q10, ~0U, ~0U, 101 SP::Q3, SP::Q11, ~0U, ~0U, 102 SP::Q4, SP::Q12, ~0U, ~0U, 103 SP::Q5, SP::Q13, ~0U, ~0U, 104 SP::Q6, SP::Q14, ~0U, ~0U, 105 SP::Q7, SP::Q15, ~0U, ~0U } ; 106 107 static const unsigned FCCRegDecoderTable[] = { 108 SP::FCC0, SP::FCC1, SP::FCC2, SP::FCC3 }; 109 110 static const unsigned ASRRegDecoderTable[] = { 111 SP::Y, SP::ASR1, SP::ASR2, SP::ASR3, 112 SP::ASR4, SP::ASR5, SP::ASR6, SP::ASR7, 113 SP::ASR8, SP::ASR9, SP::ASR10, SP::ASR11, 114 SP::ASR12, SP::ASR13, SP::ASR14, SP::ASR15, 115 SP::ASR16, SP::ASR17, SP::ASR18, SP::ASR19, 116 SP::ASR20, SP::ASR21, SP::ASR22, SP::ASR23, 117 SP::ASR24, SP::ASR25, SP::ASR26, SP::ASR27, 118 SP::ASR28, SP::ASR29, SP::ASR30, SP::ASR31}; 119 120 static const unsigned PRRegDecoderTable[] = { 121 SP::TPC, SP::TNPC, SP::TSTATE, SP::TT, SP::TICK, SP::TBA, SP::PSTATE, 122 SP::TL, SP::PIL, SP::CWP, SP::CANSAVE, SP::CANRESTORE, SP::CLEANWIN, 123 SP::OTHERWIN, SP::WSTATE 124 }; 125 126 static const uint16_t IntPairDecoderTable[] = { 127 SP::G0_G1, SP::G2_G3, SP::G4_G5, SP::G6_G7, 128 SP::O0_O1, SP::O2_O3, SP::O4_O5, SP::O6_O7, 129 SP::L0_L1, SP::L2_L3, SP::L4_L5, SP::L6_L7, 130 SP::I0_I1, SP::I2_I3, SP::I4_I5, SP::I6_I7, 131 }; 132 133 static const unsigned CPRegDecoderTable[] = { 134 SP::C0, SP::C1, SP::C2, SP::C3, 135 SP::C4, SP::C5, SP::C6, SP::C7, 136 SP::C8, SP::C9, SP::C10, SP::C11, 137 SP::C12, SP::C13, SP::C14, SP::C15, 138 SP::C16, SP::C17, SP::C18, SP::C19, 139 SP::C20, SP::C21, SP::C22, SP::C23, 140 SP::C24, SP::C25, SP::C26, SP::C27, 141 SP::C28, SP::C29, SP::C30, SP::C31 142 }; 143 144 145 static const uint16_t CPPairDecoderTable[] = { 146 SP::C0_C1, SP::C2_C3, SP::C4_C5, SP::C6_C7, 147 SP::C8_C9, SP::C10_C11, SP::C12_C13, SP::C14_C15, 148 SP::C16_C17, SP::C18_C19, SP::C20_C21, SP::C22_C23, 149 SP::C24_C25, SP::C26_C27, SP::C28_C29, SP::C30_C31 150 }; 151 152 static DecodeStatus DecodeIntRegsRegisterClass(MCInst &Inst, 153 unsigned RegNo, 154 uint64_t Address, 155 const void *Decoder) { 156 if (RegNo > 31) 157 return MCDisassembler::Fail; 158 unsigned Reg = IntRegDecoderTable[RegNo]; 159 Inst.addOperand(MCOperand::createReg(Reg)); 160 return MCDisassembler::Success; 161 } 162 163 static DecodeStatus DecodeI64RegsRegisterClass(MCInst &Inst, 164 unsigned RegNo, 165 uint64_t Address, 166 const void *Decoder) { 167 if (RegNo > 31) 168 return MCDisassembler::Fail; 169 unsigned Reg = IntRegDecoderTable[RegNo]; 170 Inst.addOperand(MCOperand::createReg(Reg)); 171 return MCDisassembler::Success; 172 } 173 174 175 static DecodeStatus DecodeFPRegsRegisterClass(MCInst &Inst, 176 unsigned RegNo, 177 uint64_t Address, 178 const void *Decoder) { 179 if (RegNo > 31) 180 return MCDisassembler::Fail; 181 unsigned Reg = FPRegDecoderTable[RegNo]; 182 Inst.addOperand(MCOperand::createReg(Reg)); 183 return MCDisassembler::Success; 184 } 185 186 187 static DecodeStatus DecodeDFPRegsRegisterClass(MCInst &Inst, 188 unsigned RegNo, 189 uint64_t Address, 190 const void *Decoder) { 191 if (RegNo > 31) 192 return MCDisassembler::Fail; 193 unsigned Reg = DFPRegDecoderTable[RegNo]; 194 Inst.addOperand(MCOperand::createReg(Reg)); 195 return MCDisassembler::Success; 196 } 197 198 199 static DecodeStatus DecodeQFPRegsRegisterClass(MCInst &Inst, 200 unsigned RegNo, 201 uint64_t Address, 202 const void *Decoder) { 203 if (RegNo > 31) 204 return MCDisassembler::Fail; 205 206 unsigned Reg = QFPRegDecoderTable[RegNo]; 207 if (Reg == ~0U) 208 return MCDisassembler::Fail; 209 Inst.addOperand(MCOperand::createReg(Reg)); 210 return MCDisassembler::Success; 211 } 212 213 static DecodeStatus DecodeCPRegsRegisterClass(MCInst &Inst, 214 unsigned RegNo, 215 uint64_t Address, 216 const void *Decoder) { 217 if (RegNo > 31) 218 return MCDisassembler::Fail; 219 unsigned Reg = CPRegDecoderTable[RegNo]; 220 Inst.addOperand(MCOperand::createReg(Reg)); 221 return MCDisassembler::Success; 222 } 223 224 static DecodeStatus DecodeFCCRegsRegisterClass(MCInst &Inst, unsigned RegNo, 225 uint64_t Address, 226 const void *Decoder) { 227 if (RegNo > 3) 228 return MCDisassembler::Fail; 229 Inst.addOperand(MCOperand::createReg(FCCRegDecoderTable[RegNo])); 230 return MCDisassembler::Success; 231 } 232 233 static DecodeStatus DecodeASRRegsRegisterClass(MCInst &Inst, unsigned RegNo, 234 uint64_t Address, 235 const void *Decoder) { 236 if (RegNo > 31) 237 return MCDisassembler::Fail; 238 Inst.addOperand(MCOperand::createReg(ASRRegDecoderTable[RegNo])); 239 return MCDisassembler::Success; 240 } 241 242 static DecodeStatus DecodePRRegsRegisterClass(MCInst &Inst, unsigned RegNo, 243 uint64_t Address, 244 const void *Decoder) { 245 if (RegNo >= array_lengthof(PRRegDecoderTable)) 246 return MCDisassembler::Fail; 247 Inst.addOperand(MCOperand::createReg(PRRegDecoderTable[RegNo])); 248 return MCDisassembler::Success; 249 } 250 251 static DecodeStatus DecodeIntPairRegisterClass(MCInst &Inst, unsigned RegNo, 252 uint64_t Address, const void *Decoder) { 253 DecodeStatus S = MCDisassembler::Success; 254 255 if (RegNo > 31) 256 return MCDisassembler::Fail; 257 258 if ((RegNo & 1)) 259 S = MCDisassembler::SoftFail; 260 261 unsigned RegisterPair = IntPairDecoderTable[RegNo/2]; 262 Inst.addOperand(MCOperand::createReg(RegisterPair)); 263 return S; 264 } 265 266 static DecodeStatus DecodeCPPairRegisterClass(MCInst &Inst, unsigned RegNo, 267 uint64_t Address, const void *Decoder) { 268 if (RegNo > 31) 269 return MCDisassembler::Fail; 270 271 unsigned RegisterPair = CPPairDecoderTable[RegNo/2]; 272 Inst.addOperand(MCOperand::createReg(RegisterPair)); 273 return MCDisassembler::Success; 274 } 275 276 static DecodeStatus DecodeLoadInt(MCInst &Inst, unsigned insn, uint64_t Address, 277 const void *Decoder); 278 static DecodeStatus DecodeLoadIntPair(MCInst &Inst, unsigned insn, uint64_t Address, 279 const void *Decoder); 280 static DecodeStatus DecodeLoadFP(MCInst &Inst, unsigned insn, uint64_t Address, 281 const void *Decoder); 282 static DecodeStatus DecodeLoadDFP(MCInst &Inst, unsigned insn, uint64_t Address, 283 const void *Decoder); 284 static DecodeStatus DecodeLoadQFP(MCInst &Inst, unsigned insn, uint64_t Address, 285 const void *Decoder); 286 static DecodeStatus DecodeLoadCP(MCInst &Inst, unsigned insn, uint64_t Address, 287 const void *Decoder); 288 static DecodeStatus DecodeLoadCPPair(MCInst &Inst, unsigned insn, uint64_t Address, 289 const void *Decoder); 290 static DecodeStatus DecodeStoreInt(MCInst &Inst, unsigned insn, 291 uint64_t Address, const void *Decoder); 292 static DecodeStatus DecodeStoreIntPair(MCInst &Inst, unsigned insn, 293 uint64_t Address, const void *Decoder); 294 static DecodeStatus DecodeStoreFP(MCInst &Inst, unsigned insn, 295 uint64_t Address, const void *Decoder); 296 static DecodeStatus DecodeStoreDFP(MCInst &Inst, unsigned insn, 297 uint64_t Address, const void *Decoder); 298 static DecodeStatus DecodeStoreQFP(MCInst &Inst, unsigned insn, 299 uint64_t Address, const void *Decoder); 300 static DecodeStatus DecodeStoreCP(MCInst &Inst, unsigned insn, 301 uint64_t Address, const void *Decoder); 302 static DecodeStatus DecodeStoreCPPair(MCInst &Inst, unsigned insn, 303 uint64_t Address, const void *Decoder); 304 static DecodeStatus DecodeCall(MCInst &Inst, unsigned insn, 305 uint64_t Address, const void *Decoder); 306 static DecodeStatus DecodeSIMM13(MCInst &Inst, unsigned insn, 307 uint64_t Address, const void *Decoder); 308 static DecodeStatus DecodeJMPL(MCInst &Inst, unsigned insn, uint64_t Address, 309 const void *Decoder); 310 static DecodeStatus DecodeReturn(MCInst &MI, unsigned insn, uint64_t Address, 311 const void *Decoder); 312 static DecodeStatus DecodeSWAP(MCInst &Inst, unsigned insn, uint64_t Address, 313 const void *Decoder); 314 static DecodeStatus DecodeTRAP(MCInst &Inst, unsigned insn, uint64_t Address, 315 const void *Decoder); 316 317 #include "SparcGenDisassemblerTables.inc" 318 319 /// Read four bytes from the ArrayRef and return 32 bit word. 320 static DecodeStatus readInstruction32(ArrayRef<uint8_t> Bytes, uint64_t Address, 321 uint64_t &Size, uint32_t &Insn, 322 bool IsLittleEndian) { 323 // We want to read exactly 4 Bytes of data. 324 if (Bytes.size() < 4) { 325 Size = 0; 326 return MCDisassembler::Fail; 327 } 328 329 Insn = IsLittleEndian 330 ? (Bytes[0] << 0) | (Bytes[1] << 8) | (Bytes[2] << 16) | 331 (Bytes[3] << 24) 332 : (Bytes[3] << 0) | (Bytes[2] << 8) | (Bytes[1] << 16) | 333 (Bytes[0] << 24); 334 335 return MCDisassembler::Success; 336 } 337 338 DecodeStatus SparcDisassembler::getInstruction(MCInst &Instr, uint64_t &Size, 339 ArrayRef<uint8_t> Bytes, 340 uint64_t Address, 341 raw_ostream &VStream, 342 raw_ostream &CStream) const { 343 uint32_t Insn; 344 bool isLittleEndian = getContext().getAsmInfo()->isLittleEndian(); 345 DecodeStatus Result = 346 readInstruction32(Bytes, Address, Size, Insn, isLittleEndian); 347 if (Result == MCDisassembler::Fail) 348 return MCDisassembler::Fail; 349 350 // Calling the auto-generated decoder function. 351 352 if (STI.getFeatureBits()[Sparc::FeatureV9]) 353 { 354 Result = decodeInstruction(DecoderTableSparcV932, Instr, Insn, Address, this, STI); 355 } 356 else 357 { 358 Result = decodeInstruction(DecoderTableSparcV832, Instr, Insn, Address, this, STI); 359 } 360 if (Result != MCDisassembler::Fail) 361 return Result; 362 363 Result = 364 decodeInstruction(DecoderTableSparc32, Instr, Insn, Address, this, STI); 365 366 if (Result != MCDisassembler::Fail) { 367 Size = 4; 368 return Result; 369 } 370 371 return MCDisassembler::Fail; 372 } 373 374 375 typedef DecodeStatus (*DecodeFunc)(MCInst &MI, unsigned insn, uint64_t Address, 376 const void *Decoder); 377 378 static DecodeStatus DecodeMem(MCInst &MI, unsigned insn, uint64_t Address, 379 const void *Decoder, 380 bool isLoad, DecodeFunc DecodeRD) { 381 unsigned rd = fieldFromInstruction(insn, 25, 5); 382 unsigned rs1 = fieldFromInstruction(insn, 14, 5); 383 bool isImm = fieldFromInstruction(insn, 13, 1); 384 bool hasAsi = fieldFromInstruction(insn, 23, 1); // (in op3 field) 385 unsigned asi = fieldFromInstruction(insn, 5, 8); 386 unsigned rs2 = 0; 387 unsigned simm13 = 0; 388 if (isImm) 389 simm13 = SignExtend32<13>(fieldFromInstruction(insn, 0, 13)); 390 else 391 rs2 = fieldFromInstruction(insn, 0, 5); 392 393 DecodeStatus status; 394 if (isLoad) { 395 status = DecodeRD(MI, rd, Address, Decoder); 396 if (status != MCDisassembler::Success) 397 return status; 398 } 399 400 // Decode rs1. 401 status = DecodeIntRegsRegisterClass(MI, rs1, Address, Decoder); 402 if (status != MCDisassembler::Success) 403 return status; 404 405 // Decode imm|rs2. 406 if (isImm) 407 MI.addOperand(MCOperand::createImm(simm13)); 408 else { 409 status = DecodeIntRegsRegisterClass(MI, rs2, Address, Decoder); 410 if (status != MCDisassembler::Success) 411 return status; 412 } 413 414 if (hasAsi) 415 MI.addOperand(MCOperand::createImm(asi)); 416 417 if (!isLoad) { 418 status = DecodeRD(MI, rd, Address, Decoder); 419 if (status != MCDisassembler::Success) 420 return status; 421 } 422 return MCDisassembler::Success; 423 } 424 425 static DecodeStatus DecodeLoadInt(MCInst &Inst, unsigned insn, uint64_t Address, 426 const void *Decoder) { 427 return DecodeMem(Inst, insn, Address, Decoder, true, 428 DecodeIntRegsRegisterClass); 429 } 430 431 static DecodeStatus DecodeLoadIntPair(MCInst &Inst, unsigned insn, uint64_t Address, 432 const void *Decoder) { 433 return DecodeMem(Inst, insn, Address, Decoder, true, 434 DecodeIntPairRegisterClass); 435 } 436 437 static DecodeStatus DecodeLoadFP(MCInst &Inst, unsigned insn, uint64_t Address, 438 const void *Decoder) { 439 return DecodeMem(Inst, insn, Address, Decoder, true, 440 DecodeFPRegsRegisterClass); 441 } 442 443 static DecodeStatus DecodeLoadDFP(MCInst &Inst, unsigned insn, uint64_t Address, 444 const void *Decoder) { 445 return DecodeMem(Inst, insn, Address, Decoder, true, 446 DecodeDFPRegsRegisterClass); 447 } 448 449 static DecodeStatus DecodeLoadQFP(MCInst &Inst, unsigned insn, uint64_t Address, 450 const void *Decoder) { 451 return DecodeMem(Inst, insn, Address, Decoder, true, 452 DecodeQFPRegsRegisterClass); 453 } 454 455 static DecodeStatus DecodeLoadCP(MCInst &Inst, unsigned insn, uint64_t Address, 456 const void *Decoder) { 457 return DecodeMem(Inst, insn, Address, Decoder, true, 458 DecodeCPRegsRegisterClass); 459 } 460 461 static DecodeStatus DecodeLoadCPPair(MCInst &Inst, unsigned insn, uint64_t Address, 462 const void *Decoder) { 463 return DecodeMem(Inst, insn, Address, Decoder, true, 464 DecodeCPPairRegisterClass); 465 } 466 467 static DecodeStatus DecodeStoreInt(MCInst &Inst, unsigned insn, 468 uint64_t Address, const void *Decoder) { 469 return DecodeMem(Inst, insn, Address, Decoder, false, 470 DecodeIntRegsRegisterClass); 471 } 472 473 static DecodeStatus DecodeStoreIntPair(MCInst &Inst, unsigned insn, 474 uint64_t Address, const void *Decoder) { 475 return DecodeMem(Inst, insn, Address, Decoder, false, 476 DecodeIntPairRegisterClass); 477 } 478 479 static DecodeStatus DecodeStoreFP(MCInst &Inst, unsigned insn, uint64_t Address, 480 const void *Decoder) { 481 return DecodeMem(Inst, insn, Address, Decoder, false, 482 DecodeFPRegsRegisterClass); 483 } 484 485 static DecodeStatus DecodeStoreDFP(MCInst &Inst, unsigned insn, 486 uint64_t Address, const void *Decoder) { 487 return DecodeMem(Inst, insn, Address, Decoder, false, 488 DecodeDFPRegsRegisterClass); 489 } 490 491 static DecodeStatus DecodeStoreQFP(MCInst &Inst, unsigned insn, 492 uint64_t Address, const void *Decoder) { 493 return DecodeMem(Inst, insn, Address, Decoder, false, 494 DecodeQFPRegsRegisterClass); 495 } 496 497 static DecodeStatus DecodeStoreCP(MCInst &Inst, unsigned insn, 498 uint64_t Address, const void *Decoder) { 499 return DecodeMem(Inst, insn, Address, Decoder, false, 500 DecodeCPRegsRegisterClass); 501 } 502 503 static DecodeStatus DecodeStoreCPPair(MCInst &Inst, unsigned insn, 504 uint64_t Address, const void *Decoder) { 505 return DecodeMem(Inst, insn, Address, Decoder, false, 506 DecodeCPPairRegisterClass); 507 } 508 509 static bool tryAddingSymbolicOperand(int64_t Value, bool isBranch, 510 uint64_t Address, uint64_t Offset, 511 uint64_t Width, MCInst &MI, 512 const void *Decoder) { 513 const MCDisassembler *Dis = static_cast<const MCDisassembler*>(Decoder); 514 return Dis->tryAddingSymbolicOperand(MI, Value, Address, isBranch, 515 Offset, Width); 516 } 517 518 static DecodeStatus DecodeCall(MCInst &MI, unsigned insn, 519 uint64_t Address, const void *Decoder) { 520 unsigned tgt = fieldFromInstruction(insn, 0, 30); 521 tgt <<= 2; 522 if (!tryAddingSymbolicOperand(tgt+Address, false, Address, 523 0, 30, MI, Decoder)) 524 MI.addOperand(MCOperand::createImm(tgt)); 525 return MCDisassembler::Success; 526 } 527 528 static DecodeStatus DecodeSIMM13(MCInst &MI, unsigned insn, 529 uint64_t Address, const void *Decoder) { 530 unsigned tgt = SignExtend32<13>(fieldFromInstruction(insn, 0, 13)); 531 MI.addOperand(MCOperand::createImm(tgt)); 532 return MCDisassembler::Success; 533 } 534 535 static DecodeStatus DecodeJMPL(MCInst &MI, unsigned insn, uint64_t Address, 536 const void *Decoder) { 537 538 unsigned rd = fieldFromInstruction(insn, 25, 5); 539 unsigned rs1 = fieldFromInstruction(insn, 14, 5); 540 unsigned isImm = fieldFromInstruction(insn, 13, 1); 541 unsigned rs2 = 0; 542 unsigned simm13 = 0; 543 if (isImm) 544 simm13 = SignExtend32<13>(fieldFromInstruction(insn, 0, 13)); 545 else 546 rs2 = fieldFromInstruction(insn, 0, 5); 547 548 // Decode RD. 549 DecodeStatus status = DecodeIntRegsRegisterClass(MI, rd, Address, Decoder); 550 if (status != MCDisassembler::Success) 551 return status; 552 553 // Decode RS1. 554 status = DecodeIntRegsRegisterClass(MI, rs1, Address, Decoder); 555 if (status != MCDisassembler::Success) 556 return status; 557 558 // Decode RS1 | SIMM13. 559 if (isImm) 560 MI.addOperand(MCOperand::createImm(simm13)); 561 else { 562 status = DecodeIntRegsRegisterClass(MI, rs2, Address, Decoder); 563 if (status != MCDisassembler::Success) 564 return status; 565 } 566 return MCDisassembler::Success; 567 } 568 569 static DecodeStatus DecodeReturn(MCInst &MI, unsigned insn, uint64_t Address, 570 const void *Decoder) { 571 572 unsigned rs1 = fieldFromInstruction(insn, 14, 5); 573 unsigned isImm = fieldFromInstruction(insn, 13, 1); 574 unsigned rs2 = 0; 575 unsigned simm13 = 0; 576 if (isImm) 577 simm13 = SignExtend32<13>(fieldFromInstruction(insn, 0, 13)); 578 else 579 rs2 = fieldFromInstruction(insn, 0, 5); 580 581 // Decode RS1. 582 DecodeStatus status = DecodeIntRegsRegisterClass(MI, rs1, Address, Decoder); 583 if (status != MCDisassembler::Success) 584 return status; 585 586 // Decode RS2 | SIMM13. 587 if (isImm) 588 MI.addOperand(MCOperand::createImm(simm13)); 589 else { 590 status = DecodeIntRegsRegisterClass(MI, rs2, Address, Decoder); 591 if (status != MCDisassembler::Success) 592 return status; 593 } 594 return MCDisassembler::Success; 595 } 596 597 static DecodeStatus DecodeSWAP(MCInst &MI, unsigned insn, uint64_t Address, 598 const void *Decoder) { 599 600 unsigned rd = fieldFromInstruction(insn, 25, 5); 601 unsigned rs1 = fieldFromInstruction(insn, 14, 5); 602 unsigned isImm = fieldFromInstruction(insn, 13, 1); 603 bool hasAsi = fieldFromInstruction(insn, 23, 1); // (in op3 field) 604 unsigned asi = fieldFromInstruction(insn, 5, 8); 605 unsigned rs2 = 0; 606 unsigned simm13 = 0; 607 if (isImm) 608 simm13 = SignExtend32<13>(fieldFromInstruction(insn, 0, 13)); 609 else 610 rs2 = fieldFromInstruction(insn, 0, 5); 611 612 // Decode RD. 613 DecodeStatus status = DecodeIntRegsRegisterClass(MI, rd, Address, Decoder); 614 if (status != MCDisassembler::Success) 615 return status; 616 617 // Decode RS1. 618 status = DecodeIntRegsRegisterClass(MI, rs1, Address, Decoder); 619 if (status != MCDisassembler::Success) 620 return status; 621 622 // Decode RS1 | SIMM13. 623 if (isImm) 624 MI.addOperand(MCOperand::createImm(simm13)); 625 else { 626 status = DecodeIntRegsRegisterClass(MI, rs2, Address, Decoder); 627 if (status != MCDisassembler::Success) 628 return status; 629 } 630 631 if (hasAsi) 632 MI.addOperand(MCOperand::createImm(asi)); 633 634 return MCDisassembler::Success; 635 } 636 637 static DecodeStatus DecodeTRAP(MCInst &MI, unsigned insn, uint64_t Address, 638 const void *Decoder) { 639 640 unsigned rs1 = fieldFromInstruction(insn, 14, 5); 641 unsigned isImm = fieldFromInstruction(insn, 13, 1); 642 unsigned cc =fieldFromInstruction(insn, 25, 4); 643 unsigned rs2 = 0; 644 unsigned imm7 = 0; 645 if (isImm) 646 imm7 = fieldFromInstruction(insn, 0, 7); 647 else 648 rs2 = fieldFromInstruction(insn, 0, 5); 649 650 // Decode RS1. 651 DecodeStatus status = DecodeIntRegsRegisterClass(MI, rs1, Address, Decoder); 652 if (status != MCDisassembler::Success) 653 return status; 654 655 // Decode RS1 | IMM7. 656 if (isImm) 657 MI.addOperand(MCOperand::createImm(imm7)); 658 else { 659 status = DecodeIntRegsRegisterClass(MI, rs2, Address, Decoder); 660 if (status != MCDisassembler::Success) 661 return status; 662 } 663 664 // Decode CC 665 MI.addOperand(MCOperand::createImm(cc)); 666 667 return MCDisassembler::Success; 668 } 669