LLVM: lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

19

20using namespace llvm;

22

24

25#define DEBUG_TYPE "ppc-disassembler"

26

28

29namespace {

31 bool IsLittleEndian;

32

33public:

35 bool IsLittleEndian)

36 : MCDisassembler(STI, Ctx), IsLittleEndian(IsLittleEndian) {}

37

41};

42}

43

47 return new PPCDisassembler(STI, Ctx, false);

48}

49

53 return new PPCDisassembler(STI, Ctx, true);

54}

55

68

75

83

84

85

86

87template <std::size_t N>

95

101

107

113

119

123 if (RegNo > 30 || (RegNo & 1))

126}

127

133

139

145

151

157

163

169

175

181

187

193

199

202 const void *Decoder) {

204}

205

208 const void *Decoder) {

210}

211

212

213

216 const void *Decoder) {

218}

219

222 const void *Decoder) {

224}

225

228 const void *Decoder) {

230}

231

232

233

235 uint64_t Address, const void *Decoder) {

237}

238

244

245#define DecodeQSRCRegisterClass DecodeQFRCRegisterClass

246#define DecodeQBRCRegisterClass DecodeQFRCRegisterClass

247

248template

250 int64_t Address,

256}

257

258template

260 int64_t Address,

266}

267

269 int64_t Address,

271 if (Imm != 0)

275}

276

285

287 int64_t Address,

289

292}

293

295 int64_t Address,

297

298

299

300

301 const int64_t Disp = SignExtend64<7>((Imm & 0x3F) + 64) * 8;

302

305}

306

308 int64_t Address,

310

313}

314

316 int64_t Address,

318

319

321

324}

325

327 int64_t Address,

329

330

332

335}

336

338 int64_t Address,

340

341

345}

346

348 int64_t Address,

350

351

353 if (Zeros >= 8)

355

358}

359

360#include "PPCGenDisassemblerTables.inc"

361

368

369

370

371

372

373

374

375

376

377 if (STI.hasFeature(PPC::FeaturePrefixInstrs) && Bytes.size() >= 8) {

378 uint32_t Prefix = ReadFunc(Bytes.data());

379 uint32_t BaseInst = ReadFunc(Bytes.data() + 4);

380 uint64_t Inst = BaseInst | (uint64_t)Prefix << 32;

382 this, STI);

385 return result;

386 }

387 }

388

389

391 if (Bytes.size() < 4) {

394 }

395

396

397 uint64_t Inst = ReadFunc(Bytes.data());

398

399 if (STI.hasFeature(PPC::FeatureSPE)) {

401 decodeInstruction(DecoderTableSPE32, MI, Inst, Address, this, STI);

403 return result;

404 }

405

406 return decodeInstruction(DecoderTable32, MI, Inst, Address, this, STI);

407}

MCDisassembler::DecodeStatus DecodeStatus

#define LLVM_EXTERNAL_VISIBILITY

static DecodeStatus decodeRegisterClass(MCInst &Inst, uint64_t RegNo, const MCPhysReg(&Regs)[N])

Definition PPCDisassembler.cpp:88

static DecodeStatus decodeVSRpEvenOperands(MCInst &Inst, uint64_t RegNo, uint64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:277

static DecodeStatus DecodeVSFRCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:146

static DecodeStatus decodeDispSPE4Operand(MCInst &Inst, uint64_t Imm, int64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:326

static DecodeStatus DecodeDMRRCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)

Definition PPCDisassembler.cpp:226

static DecodeStatus decodeCRBitMOperand(MCInst &Inst, uint64_t Imm, int64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:347

DecodeStatus DecodeDMRpRCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)

Definition PPCDisassembler.cpp:234

static DecodeStatus decodeImmZeroOperand(MCInst &Inst, uint64_t Imm, int64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:268

LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializePowerPCDisassembler()

Definition PPCDisassembler.cpp:57

static DecodeStatus DecodeCRBITRCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:102

static DecodeStatus DecodeGPRC_NOR0RegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:165

static DecodeStatus DecodeG8pRCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:176

static DecodeStatus decodeDispRIHashOperand(MCInst &Inst, uint64_t Imm, int64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:294

static DecodeStatus DecodeGPRCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:158

static DecodeStatus DecodeFpRCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:120

static MCDisassembler * createPPCDisassembler(const Target &T, const MCSubtargetInfo &STI, MCContext &Ctx)

Definition PPCDisassembler.cpp:44

static DecodeStatus decodeDispSPE2Operand(MCInst &Inst, uint64_t Imm, int64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:337

static DecodeStatus decodeSImmOperand(MCInst &Inst, uint64_t Imm, int64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:259

static DecodeStatus DecodeVSRCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:140

static DecodeStatus decodeCondBrTarget(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *)

Definition PPCDisassembler.cpp:69

static DecodeStatus decodeDispSPE8Operand(MCInst &Inst, uint64_t Imm, int64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:315

static DecodeStatus DecodeVRRCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:134

static MCDisassembler * createPPCLEDisassembler(const Target &T, const MCSubtargetInfo &STI, MCContext &Ctx)

Definition PPCDisassembler.cpp:50

static DecodeStatus decodeDispRIX16Operand(MCInst &Inst, uint64_t Imm, int64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:307

static DecodeStatus DecodeCRRCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:96

static DecodeStatus decodeUImmOperand(MCInst &Inst, uint64_t Imm, int64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:249

static DecodeStatus DecodeG8RC_NOX0RegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:183

static DecodeStatus DecodeACCRCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:194

static DecodeStatus DecodeVSSRCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:152

static DecodeStatus DecodeWACC_HIRCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)

Definition PPCDisassembler.cpp:206

static DecodeStatus DecodeVFRCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:128

static DecodeStatus DecodeF8RCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:114

static DecodeStatus DecodeSPERCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:188

DecodeStatus DecodeDMRROWRCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)

Definition PPCDisassembler.cpp:214

static DecodeStatus DecodeWACCRCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)

Definition PPCDisassembler.cpp:200

static DecodeStatus DecodeG8RCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:170

static DecodeStatus DecodeDMRROWpRCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)

Definition PPCDisassembler.cpp:220

static DecodeStatus decodeDispRIXOperand(MCInst &Inst, uint64_t Imm, int64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:286

static DecodeStatus DecodeF4RCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:108

static DecodeStatus DecodeVSRpRCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const MCDisassembler *Decoder)

Definition PPCDisassembler.cpp:239

static DecodeStatus decodeDirectBrTarget(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *)

Definition PPCDisassembler.cpp:76

#define DEFINE_PPC_REGCLASSES

ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...

size_t size() const

size - Get the array size.

Context object for machine code objects.

Superclass for all disassemblers.

DecodeStatus

Ternary decode status.

Instances of this class represent a single low-level machine instruction.

void addOperand(const MCOperand Op)

static MCOperand createReg(MCRegister Reg)

static MCOperand createImm(int64_t Val)

Generic base class for all target subtargets.

Target - Wrapper for Target specific information.

This class implements an extremely fast bulk output stream that can only output to a stream.

uint32_t read32be(const void *P)

uint32_t read32le(const void *P)

This is an optimization pass for GlobalISel generic memory operations.

Target & getThePPC64LETarget()

Target & getThePPC32Target()

int countr_zero(T Val)

Count number of 0's from the least significant bit to the most stopping at the first 1.

constexpr bool isUInt(uint64_t x)

Checks if an unsigned integer fits into the given bit width.

Target & getThePPC64Target()

uint16_t MCPhysReg

An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...

constexpr int32_t SignExtend32(uint32_t X)

Sign-extend the number in the bottom B bits of X to a 32-bit integer.

Target & getThePPC32LETarget()

constexpr int64_t SignExtend64(uint64_t x)

Sign-extend the number in the bottom B bits of X to a 64-bit integer.

static void RegisterMCDisassembler(Target &T, Target::MCDisassemblerCtorTy Fn)

RegisterMCDisassembler - Register a MCDisassembler implementation for the given target.