1 //===------ PPCDisassembler.cpp - Disassembler for PowerPC ------*- C++ -*-===// 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 #include "MCTargetDesc/PPCMCTargetDesc.h" 10 #include "TargetInfo/PowerPCTargetInfo.h" 11 #include "llvm/MC/MCDisassembler/MCDisassembler.h" 12 #include "llvm/MC/MCFixedLenDisassembler.h" 13 #include "llvm/MC/MCInst.h" 14 #include "llvm/MC/MCSubtargetInfo.h" 15 #include "llvm/Support/Endian.h" 16 #include "llvm/Support/TargetRegistry.h" 17 18 using namespace llvm; 19 20 DEFINE_PPC_REGCLASSES; 21 22 #define DEBUG_TYPE "ppc-disassembler" 23 24 typedef MCDisassembler::DecodeStatus DecodeStatus; 25 26 namespace { 27 class PPCDisassembler : public MCDisassembler { 28 bool IsLittleEndian; 29 30 public: 31 PPCDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx, 32 bool IsLittleEndian) 33 : MCDisassembler(STI, Ctx), IsLittleEndian(IsLittleEndian) {} 34 35 DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size, 36 ArrayRef<uint8_t> Bytes, uint64_t Address, 37 raw_ostream &CStream) const override; 38 }; 39 } // end anonymous namespace 40 41 static MCDisassembler *createPPCDisassembler(const Target &T, 42 const MCSubtargetInfo &STI, 43 MCContext &Ctx) { 44 return new PPCDisassembler(STI, Ctx, /*IsLittleEndian=*/false); 45 } 46 47 static MCDisassembler *createPPCLEDisassembler(const Target &T, 48 const MCSubtargetInfo &STI, 49 MCContext &Ctx) { 50 return new PPCDisassembler(STI, Ctx, /*IsLittleEndian=*/true); 51 } 52 53 extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializePowerPCDisassembler() { 54 // Register the disassembler for each target. 55 TargetRegistry::RegisterMCDisassembler(getThePPC32Target(), 56 createPPCDisassembler); 57 TargetRegistry::RegisterMCDisassembler(getThePPC64Target(), 58 createPPCDisassembler); 59 TargetRegistry::RegisterMCDisassembler(getThePPC64LETarget(), 60 createPPCLEDisassembler); 61 } 62 63 static DecodeStatus DecodePCRel24BranchTarget(MCInst &Inst, unsigned Imm, 64 uint64_t Addr, 65 const void *Decoder) { 66 int32_t Offset = SignExtend32<24>(Imm); 67 Inst.addOperand(MCOperand::createImm(Offset)); 68 return MCDisassembler::Success; 69 } 70 71 // FIXME: These can be generated by TableGen from the existing register 72 // encoding values! 73 74 template <std::size_t N> 75 static DecodeStatus decodeRegisterClass(MCInst &Inst, uint64_t RegNo, 76 const MCPhysReg (&Regs)[N]) { 77 assert(RegNo < N && "Invalid register number"); 78 Inst.addOperand(MCOperand::createReg(Regs[RegNo])); 79 return MCDisassembler::Success; 80 } 81 82 static DecodeStatus DecodeCRRCRegisterClass(MCInst &Inst, uint64_t RegNo, 83 uint64_t Address, 84 const void *Decoder) { 85 return decodeRegisterClass(Inst, RegNo, CRRegs); 86 } 87 88 static DecodeStatus DecodeCRBITRCRegisterClass(MCInst &Inst, uint64_t RegNo, 89 uint64_t Address, 90 const void *Decoder) { 91 return decodeRegisterClass(Inst, RegNo, CRBITRegs); 92 } 93 94 static DecodeStatus DecodeF4RCRegisterClass(MCInst &Inst, uint64_t RegNo, 95 uint64_t Address, 96 const void *Decoder) { 97 return decodeRegisterClass(Inst, RegNo, FRegs); 98 } 99 100 static DecodeStatus DecodeF8RCRegisterClass(MCInst &Inst, uint64_t RegNo, 101 uint64_t Address, 102 const void *Decoder) { 103 return decodeRegisterClass(Inst, RegNo, FRegs); 104 } 105 106 static DecodeStatus DecodeVFRCRegisterClass(MCInst &Inst, uint64_t RegNo, 107 uint64_t Address, 108 const void *Decoder) { 109 return decodeRegisterClass(Inst, RegNo, VFRegs); 110 } 111 112 static DecodeStatus DecodeVRRCRegisterClass(MCInst &Inst, uint64_t RegNo, 113 uint64_t Address, 114 const void *Decoder) { 115 return decodeRegisterClass(Inst, RegNo, VRegs); 116 } 117 118 static DecodeStatus DecodeVSRCRegisterClass(MCInst &Inst, uint64_t RegNo, 119 uint64_t Address, 120 const void *Decoder) { 121 return decodeRegisterClass(Inst, RegNo, VSRegs); 122 } 123 124 static DecodeStatus DecodeVSFRCRegisterClass(MCInst &Inst, uint64_t RegNo, 125 uint64_t Address, 126 const void *Decoder) { 127 return decodeRegisterClass(Inst, RegNo, VSFRegs); 128 } 129 130 static DecodeStatus DecodeVSSRCRegisterClass(MCInst &Inst, uint64_t RegNo, 131 uint64_t Address, 132 const void *Decoder) { 133 return decodeRegisterClass(Inst, RegNo, VSSRegs); 134 } 135 136 static DecodeStatus DecodeGPRCRegisterClass(MCInst &Inst, uint64_t RegNo, 137 uint64_t Address, 138 const void *Decoder) { 139 return decodeRegisterClass(Inst, RegNo, RRegs); 140 } 141 142 static DecodeStatus DecodeGPRC_NOR0RegisterClass(MCInst &Inst, uint64_t RegNo, 143 uint64_t Address, 144 const void *Decoder) { 145 return decodeRegisterClass(Inst, RegNo, RRegsNoR0); 146 } 147 148 static DecodeStatus DecodeG8RCRegisterClass(MCInst &Inst, uint64_t RegNo, 149 uint64_t Address, 150 const void *Decoder) { 151 return decodeRegisterClass(Inst, RegNo, XRegs); 152 } 153 154 static DecodeStatus DecodeG8RC_NOX0RegisterClass(MCInst &Inst, uint64_t RegNo, 155 uint64_t Address, 156 const void *Decoder) { 157 return decodeRegisterClass(Inst, RegNo, XRegsNoX0); 158 } 159 160 #define DecodePointerLikeRegClass0 DecodeGPRCRegisterClass 161 #define DecodePointerLikeRegClass1 DecodeGPRC_NOR0RegisterClass 162 163 static DecodeStatus DecodeQFRCRegisterClass(MCInst &Inst, uint64_t RegNo, 164 uint64_t Address, 165 const void *Decoder) { 166 return decodeRegisterClass(Inst, RegNo, QFRegs); 167 } 168 169 static DecodeStatus DecodeSPERCRegisterClass(MCInst &Inst, uint64_t RegNo, 170 uint64_t Address, 171 const void *Decoder) { 172 return decodeRegisterClass(Inst, RegNo, SPERegs); 173 } 174 175 #define DecodeQSRCRegisterClass DecodeQFRCRegisterClass 176 #define DecodeQBRCRegisterClass DecodeQFRCRegisterClass 177 178 template<unsigned N> 179 static DecodeStatus decodeUImmOperand(MCInst &Inst, uint64_t Imm, 180 int64_t Address, const void *Decoder) { 181 assert(isUInt<N>(Imm) && "Invalid immediate"); 182 Inst.addOperand(MCOperand::createImm(Imm)); 183 return MCDisassembler::Success; 184 } 185 186 template<unsigned N> 187 static DecodeStatus decodeSImmOperand(MCInst &Inst, uint64_t Imm, 188 int64_t Address, const void *Decoder) { 189 assert(isUInt<N>(Imm) && "Invalid immediate"); 190 Inst.addOperand(MCOperand::createImm(SignExtend64<N>(Imm))); 191 return MCDisassembler::Success; 192 } 193 194 static DecodeStatus decodeImmZeroOperand(MCInst &Inst, uint64_t Imm, 195 int64_t Address, const void *Decoder) { 196 if (Imm != 0) 197 return MCDisassembler::Fail; 198 Inst.addOperand(MCOperand::createImm(Imm)); 199 return MCDisassembler::Success; 200 } 201 202 static DecodeStatus decodeMemRIOperands(MCInst &Inst, uint64_t Imm, 203 int64_t Address, const void *Decoder) { 204 // Decode the memri field (imm, reg), which has the low 16-bits as the 205 // displacement and the next 5 bits as the register #. 206 207 uint64_t Base = Imm >> 16; 208 uint64_t Disp = Imm & 0xFFFF; 209 210 assert(Base < 32 && "Invalid base register"); 211 212 switch (Inst.getOpcode()) { 213 default: break; 214 case PPC::LBZU: 215 case PPC::LHAU: 216 case PPC::LHZU: 217 case PPC::LWZU: 218 case PPC::LFSU: 219 case PPC::LFDU: 220 // Add the tied output operand. 221 Inst.addOperand(MCOperand::createReg(RRegsNoR0[Base])); 222 break; 223 case PPC::STBU: 224 case PPC::STHU: 225 case PPC::STWU: 226 case PPC::STFSU: 227 case PPC::STFDU: 228 Inst.insert(Inst.begin(), MCOperand::createReg(RRegsNoR0[Base])); 229 break; 230 } 231 232 Inst.addOperand(MCOperand::createImm(SignExtend64<16>(Disp))); 233 Inst.addOperand(MCOperand::createReg(RRegsNoR0[Base])); 234 return MCDisassembler::Success; 235 } 236 237 static DecodeStatus decodeMemRIXOperands(MCInst &Inst, uint64_t Imm, 238 int64_t Address, const void *Decoder) { 239 // Decode the memrix field (imm, reg), which has the low 14-bits as the 240 // displacement and the next 5 bits as the register #. 241 242 uint64_t Base = Imm >> 14; 243 uint64_t Disp = Imm & 0x3FFF; 244 245 assert(Base < 32 && "Invalid base register"); 246 247 if (Inst.getOpcode() == PPC::LDU) 248 // Add the tied output operand. 249 Inst.addOperand(MCOperand::createReg(RRegsNoR0[Base])); 250 else if (Inst.getOpcode() == PPC::STDU) 251 Inst.insert(Inst.begin(), MCOperand::createReg(RRegsNoR0[Base])); 252 253 Inst.addOperand(MCOperand::createImm(SignExtend64<16>(Disp << 2))); 254 Inst.addOperand(MCOperand::createReg(RRegsNoR0[Base])); 255 return MCDisassembler::Success; 256 } 257 258 static DecodeStatus decodeMemRIX16Operands(MCInst &Inst, uint64_t Imm, 259 int64_t Address, const void *Decoder) { 260 // Decode the memrix16 field (imm, reg), which has the low 12-bits as the 261 // displacement with 16-byte aligned, and the next 5 bits as the register #. 262 263 uint64_t Base = Imm >> 12; 264 uint64_t Disp = Imm & 0xFFF; 265 266 assert(Base < 32 && "Invalid base register"); 267 268 Inst.addOperand(MCOperand::createImm(SignExtend64<16>(Disp << 4))); 269 Inst.addOperand(MCOperand::createReg(RRegsNoR0[Base])); 270 return MCDisassembler::Success; 271 } 272 273 static DecodeStatus decodeSPE8Operands(MCInst &Inst, uint64_t Imm, 274 int64_t Address, const void *Decoder) { 275 // Decode the spe8disp field (imm, reg), which has the low 5-bits as the 276 // displacement with 8-byte aligned, and the next 5 bits as the register #. 277 278 uint64_t Base = Imm >> 5; 279 uint64_t Disp = Imm & 0x1F; 280 281 assert(Base < 32 && "Invalid base register"); 282 283 Inst.addOperand(MCOperand::createImm(Disp << 3)); 284 Inst.addOperand(MCOperand::createReg(RRegsNoR0[Base])); 285 return MCDisassembler::Success; 286 } 287 288 static DecodeStatus decodeSPE4Operands(MCInst &Inst, uint64_t Imm, 289 int64_t Address, const void *Decoder) { 290 // Decode the spe4disp field (imm, reg), which has the low 5-bits as the 291 // displacement with 4-byte aligned, and the next 5 bits as the register #. 292 293 uint64_t Base = Imm >> 5; 294 uint64_t Disp = Imm & 0x1F; 295 296 assert(Base < 32 && "Invalid base register"); 297 298 Inst.addOperand(MCOperand::createImm(Disp << 2)); 299 Inst.addOperand(MCOperand::createReg(RRegsNoR0[Base])); 300 return MCDisassembler::Success; 301 } 302 303 static DecodeStatus decodeSPE2Operands(MCInst &Inst, uint64_t Imm, 304 int64_t Address, const void *Decoder) { 305 // Decode the spe2disp field (imm, reg), which has the low 5-bits as the 306 // displacement with 2-byte aligned, and the next 5 bits as the register #. 307 308 uint64_t Base = Imm >> 5; 309 uint64_t Disp = Imm & 0x1F; 310 311 assert(Base < 32 && "Invalid base register"); 312 313 Inst.addOperand(MCOperand::createImm(Disp << 1)); 314 Inst.addOperand(MCOperand::createReg(RRegsNoR0[Base])); 315 return MCDisassembler::Success; 316 } 317 318 static DecodeStatus decodeCRBitMOperand(MCInst &Inst, uint64_t Imm, 319 int64_t Address, const void *Decoder) { 320 // The cr bit encoding is 0x80 >> cr_reg_num. 321 322 unsigned Zeros = countTrailingZeros(Imm); 323 assert(Zeros < 8 && "Invalid CR bit value"); 324 325 Inst.addOperand(MCOperand::createReg(CRRegs[7 - Zeros])); 326 return MCDisassembler::Success; 327 } 328 329 #include "PPCGenDisassemblerTables.inc" 330 331 DecodeStatus PPCDisassembler::getInstruction(MCInst &MI, uint64_t &Size, 332 ArrayRef<uint8_t> Bytes, 333 uint64_t Address, 334 raw_ostream &CS) const { 335 auto *ReadFunc = IsLittleEndian ? support::endian::read32le 336 : support::endian::read32be; 337 338 // If this is an 8-byte prefixed instruction, handle it here. 339 // Note: prefixed instructions aren't technically 8-byte entities - the prefix 340 // appears in memory at an address 4 bytes prior to that of the base 341 // instruction regardless of endianness. So we read the two pieces and 342 // rebuild the 8-byte instruction. 343 // TODO: In this function we call decodeInstruction several times with 344 // different decoder tables. It may be possible to only call once by 345 // looking at the top 6 bits of the instruction. 346 if (STI.getFeatureBits()[PPC::FeaturePrefixInstrs] && Bytes.size() >= 8) { 347 uint32_t Prefix = ReadFunc(Bytes.data()); 348 uint32_t BaseInst = ReadFunc(Bytes.data() + 4); 349 uint64_t Inst = BaseInst | (uint64_t)Prefix << 32; 350 DecodeStatus result = decodeInstruction(DecoderTable64, MI, Inst, Address, 351 this, STI); 352 if (result != MCDisassembler::Fail) { 353 Size = 8; 354 return result; 355 } 356 } 357 358 // Get the four bytes of the instruction. 359 Size = 4; 360 if (Bytes.size() < 4) { 361 Size = 0; 362 return MCDisassembler::Fail; 363 } 364 365 // Read the instruction in the proper endianness. 366 uint64_t Inst = ReadFunc(Bytes.data()); 367 368 if (STI.getFeatureBits()[PPC::FeatureQPX]) { 369 DecodeStatus result = 370 decodeInstruction(DecoderTableQPX32, MI, Inst, Address, this, STI); 371 if (result != MCDisassembler::Fail) 372 return result; 373 } else if (STI.getFeatureBits()[PPC::FeatureSPE]) { 374 DecodeStatus result = 375 decodeInstruction(DecoderTableSPE32, MI, Inst, Address, this, STI); 376 if (result != MCDisassembler::Fail) 377 return result; 378 } 379 380 return decodeInstruction(DecoderTable32, MI, Inst, Address, this, STI); 381 } 382