52#define GET_INSTRINFO_MC_DESC
53#define ENABLE_INSTR_PREDICATE_VERIFIER
54#include "PPCGenInstrInfo.inc"
56#define GET_SUBTARGETINFO_MC_DESC
57#include "PPCGenSubtargetInfo.inc"
59#define GET_REGINFO_MC_DESC
60#include "PPCGenRegisterInfo.inc"
124 int16_t regClass =
Desc.operands()[OpNo].RegClass;
128 case PPC::VSSRCRegClassID:
129 case PPC::VSFRCRegClassID:
131 return PPC::VSX32 + (Reg - PPC::VF0);
135 case PPC::VSRCRegClassID:
137 return PPC::VSX32 + (Reg - PPC::V0);
153 InitPPCMCInstrInfo(
X);
160 unsigned Flavour = isPPC64 ? 0 : 1;
161 unsigned RA = isPPC64 ? PPC::LR8 : PPC::LR;
164 InitPPCMCRegisterInfo(
X,
RA, Flavour, Flavour);
171 std::string FullFS = std::string(FS);
175 FullFS =
"+aix," + FullFS;
180 return createPPCMCSubtargetInfoImpl(TT, CPU, CPU, FullFS);
196 unsigned Reg = isPPC64 ? PPC::X1 : PPC::R1;
207 formatted_raw_ostream &OS;
210 PPCTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS)
211 : PPCTargetStreamer(S), OS(OS) {}
215 MCSymbolXCOFF *TCSym =
216 static_cast<const MCSectionXCOFF *
>(Streamer.getCurrentSectionOnly())
217 ->getQualNameSymbol();
229 <<
getContext().getAsmInfo()->getSpecifierName(Kind) <<
'\n';
241 void emitMachine(StringRef CPU)
override {
242 const Triple &
TT = Streamer.getContext().getTargetTriple();
243 if (
TT.isOSBinFormatXCOFF())
244 OS <<
"\t.machine\t" <<
'\"' << CPU <<
'\"' <<
'\n';
246 OS <<
"\t.machine " << CPU <<
'\n';
249 void emitAbiVersion(
int AbiVersion)
override {
250 OS <<
"\t.abiversion " << AbiVersion <<
'\n';
253 void emitLocalEntry(MCSymbolELF *S,
const MCExpr *LocalOffset)
override {
254 const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo();
256 OS <<
"\t.localentry\t";
266 PPCTargetELFStreamer(MCStreamer &S) : PPCTargetStreamer(S) {}
268 MCELFStreamer &getStreamer() {
269 return static_cast<MCELFStreamer &
>(Streamer);
274 Streamer.emitValueToAlignment(
Align(8));
275 Streamer.emitSymbolValue(&S, 8);
278 void emitMachine(StringRef CPU)
override {
283 void emitAbiVersion(
int AbiVersion)
override {
284 ELFObjectWriter &
W = getStreamer().getWriter();
285 unsigned Flags =
W.getELFHeaderEFlags();
286 Flags &= ~ELF::EF_PPC64_ABI;
288 W.setELFHeaderEFlags(Flags);
291 void emitLocalEntry(MCSymbolELF *S,
const MCExpr *LocalOffset)
override {
295 unsigned Encoded = encodePPC64LocalEntryOffset(LocalOffset);
298 Other &= ~ELF::STO_PPC64_LOCAL_MASK;
304 ELFObjectWriter &
W = getStreamer().getWriter();
305 unsigned Flags =
W.getELFHeaderEFlags();
307 W.setELFHeaderEFlags(Flags | 2);
310 void emitAssignment(MCSymbol *S,
const MCExpr *
Value)
override {
311 auto *
Symbol =
static_cast<MCSymbolELF *
>(S);
315 if (copyLocalEntry(Symbol,
Value))
316 UpdateOther.insert(Symbol);
318 UpdateOther.erase(Symbol);
321 void finish()
override {
322 for (
auto *Sym : UpdateOther)
323 if (Sym->isVariable())
324 copyLocalEntry(Sym, Sym->getVariableValue());
332 SmallPtrSet<MCSymbolELF *, 32> UpdateOther;
334 bool copyLocalEntry(MCSymbolELF *
D,
const MCExpr *S) {
338 auto &RhsSym =
static_cast<const MCSymbolELF &
>(
Ref->getSymbol());
339 unsigned Other =
D->getOther();
340 Other &= ~ELF::STO_PPC64_LOCAL_MASK;
346 unsigned encodePPC64LocalEntryOffset(
const MCExpr *LocalOffset) {
347 MCAssembler &MCA = getStreamer().getAssembler();
349 if (!LocalOffset->evaluateAsAbsolute(
Offset, MCA))
351 ".localentry expression must be absolute");
356 LocalOffset->
getLoc(),
".localentry expression must be a power of 2");
374 PPCTargetMachOStreamer(MCStreamer &S) : PPCTargetStreamer(S) {}
380 void emitMachine(StringRef CPU)
override {
385 void emitAbiVersion(
int AbiVersion)
override {
389 void emitLocalEntry(MCSymbolELF *S,
const MCExpr *LocalOffset)
override {
396 PPCTargetXCOFFStreamer(MCStreamer &S) : PPCTargetStreamer(S) {}
399 const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo();
401 Streamer.emitValueToAlignment(
Align(PointerSize));
406 void emitMachine(StringRef CPU)
override {
407 static_cast<XCOFFObjectWriter &
>(Streamer.getAssemblerPtr()->getWriter())
411 void emitAbiVersion(
int AbiVersion)
override {
415 void emitLocalEntry(MCSymbolELF *S,
const MCExpr *LocalOffset)
override {
425 return new PPCTargetAsmStreamer(S, OS);
435 if (TT.isOSBinFormatELF())
436 return new PPCTargetELFStreamer(S);
437 if (TT.isOSBinFormatXCOFF())
438 return new PPCTargetXCOFFStreamer(S);
439 return new PPCTargetMachOStreamer(S);
443 unsigned SyntaxVariant,
454 explicit PPCMCInstrAnalysis(
const MCInstrInfo *
Info)
455 : MCInstrAnalysis(
Info) {}
457 bool evaluateBranch(
const MCInst &Inst, uint64_t Addr, uint64_t
Size,
458 uint64_t &Target)
const override {
472 return new PPCMCInstrAnalysis(
Info);
unsigned const MachineRegisterInfo * MRI
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
Analysis containing CSE Info
#define LLVM_EXTERNAL_VISIBILITY
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
static MCTargetStreamer * createNullTargetStreamer(MCStreamer &S)
static MCTargetStreamer * createAsmTargetStreamer(MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter *InstPrint)
static MCInstPrinter * createPPCMCInstPrinter(const Triple &T, unsigned SyntaxVariant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI)
static MCTargetStreamer * createObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializePowerPCTargetMC()
static MCInstrAnalysis * createPPCMCInstrAnalysis(const MCInstrInfo *Info)
static MCAsmInfo * createPPCMCAsmInfo(const MCRegisterInfo &MRI, const Triple &TheTriple, const MCTargetOptions &Options)
static MCSubtargetInfo * createPPCMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS)
static MCRegisterInfo * createPPCMCRegisterInfo(const Triple &TT)
static MCInstrInfo * createPPCMCInstrInfo()
SI optimize exec mask operations pre RA
This file defines the SmallPtrSet class.
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
This class is intended to be used as a base class for asm properties and features specific to the tar...
void addInitialFrameState(const MCCFIInstruction &Inst)
void printExpr(raw_ostream &, const MCExpr &) const
unsigned getCodePointerSize() const
Get the code pointer size in bytes.
MCContext & getContext() const
static MCCFIInstruction cfiDefCfa(MCSymbol *L, unsigned Register, int64_t Offset, SMLoc Loc={})
.cfi_def_cfa defines a rule for computing CFA as: take address from Register and add Offset to it.
LLVM_ABI void reportError(SMLoc L, const Twine &Msg)
This is an instance of a target assembly language printer that converts an MCInst to valid target ass...
unsigned getNumOperands() const
unsigned getOpcode() const
const MCOperand & getOperand(unsigned i) const
Describe properties that are true of each instruction in the target description file.
Interface to description of machine instruction set.
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
Wrapper class representing physical registers. Should be passed by value.
Streaming machine code generation interface.
Generic base class for all target subtargets.
const Triple & getTargetTriple() const
unsigned getOther() const
void setOther(unsigned Other)
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
StringRef getSymbolTableName() const
LLVM_ABI void print(raw_ostream &OS, const MCAsmInfo *MAI) const
print - Print the value to the stream OS.
StringRef getName() const
getName - Get the symbol name.
Target specific streamer interface.
MCTargetStreamer(MCStreamer &S)
~PPCTargetStreamer() override
PPCTargetStreamer(MCStreamer &S)
StringRef - Represent a constant reference to a string, i.e.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
ArchType getArch() const
Get the parsed architecture type of this triple.
bool isOSBinFormatXCOFF() const
Tests whether the OS uses the XCOFF binary format.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
@ C
The default llvm calling convention, compatible with C.
const char * stripRegisterPrefix(const char *RegName)
stripRegisterPrefix - This method strips the character prefix from a register name so that only the n...
static bool isVRRegister(unsigned Reg)
MCRegister getRegNumForOperand(const MCInstrDesc &Desc, MCRegister Reg, unsigned OpNo)
getRegNumForOperand - some operands use different numbering schemes for the same registers.
static bool isVFRegister(unsigned Reg)
constexpr uint64_t PointerSize
aarch64 pointer size.
Context & getContext() const
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
Target & getThePPC64LETarget()
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Target & getThePPC32Target()
MCAsmBackend * createPPCAsmBackend(const Target &T, const MCSubtargetInfo &STI, const MCRegisterInfo &MRI, const MCTargetOptions &Options)
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
MCStreamer * createPPCXCOFFStreamer(const Triple &, MCContext &, std::unique_ptr< MCAsmBackend > &&MAB, std::unique_ptr< MCObjectWriter > &&OW, std::unique_ptr< MCCodeEmitter > &&Emitter)
@ Ref
The access may reference the value stored in memory.
Target & getThePPC64Target()
MCCodeEmitter * createPPCMCCodeEmitter(const MCInstrInfo &MCII, MCContext &Ctx)
Target & getThePPC32LETarget()
MCStreamer * createPPCELFStreamer(const Triple &, MCContext &, std::unique_ptr< MCAsmBackend > &&MAB, std::unique_ptr< MCObjectWriter > &&OW, std::unique_ptr< MCCodeEmitter > &&Emitter)
RegisterMCAsmInfoFn - Helper template for registering a target assembly info implementation.
static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn)
RegisterMCRegInfo - Register a MCRegisterInfo implementation for the given target.
static void RegisterMCAsmBackend(Target &T, Target::MCAsmBackendCtorTy Fn)
RegisterMCAsmBackend - Register a MCAsmBackend implementation for the given target.
static void RegisterXCOFFStreamer(Target &T, Target::XCOFFStreamerCtorTy Fn)
static void RegisterMCCodeEmitter(Target &T, Target::MCCodeEmitterCtorTy Fn)
RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the given target.
static void RegisterMCSubtargetInfo(Target &T, Target::MCSubtargetInfoCtorFnTy Fn)
RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for the given target.
static void RegisterObjectTargetStreamer(Target &T, Target::ObjectTargetStreamerCtorTy Fn)
static void RegisterMCInstrAnalysis(Target &T, Target::MCInstrAnalysisCtorFnTy Fn)
RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for the given target.
static void RegisterELFStreamer(Target &T, Target::ELFStreamerCtorTy Fn)
static void RegisterNullTargetStreamer(Target &T, Target::NullTargetStreamerCtorTy Fn)
static void RegisterMCInstPrinter(Target &T, Target::MCInstPrinterCtorTy Fn)
RegisterMCInstPrinter - Register a MCInstPrinter implementation for the given target.
static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn)
RegisterMCInstrInfo - Register a MCInstrInfo implementation for the given target.
static void RegisterAsmTargetStreamer(Target &T, Target::AsmTargetStreamerCtorTy Fn)