50#define GET_INSTRINFO_MC_DESC
51#define ENABLE_INSTR_PREDICATE_VERIFIER
52#include "PPCGenInstrInfo.inc"
54#define GET_SUBTARGETINFO_MC_DESC
55#include "PPCGenSubtargetInfo.inc"
57#define GET_REGINFO_MC_DESC
58#include "PPCGenRegisterInfo.inc"
122 int16_t regClass =
Desc.operands()[OpNo].RegClass;
126 case PPC::VSSRCRegClassID:
127 case PPC::VSFRCRegClassID:
129 return PPC::VSX32 + (Reg - PPC::VF0);
133 case PPC::VSRCRegClassID:
135 return PPC::VSX32 + (Reg - PPC::V0);
151 InitPPCMCInstrInfo(
X);
158 unsigned Flavour = isPPC64 ? 0 : 1;
159 unsigned RA = isPPC64 ? PPC::LR8 : PPC::LR;
162 InitPPCMCRegisterInfo(
X,
RA, Flavour, Flavour);
169 std::string FullFS = std::string(FS);
173 FullFS =
"+aix," + FullFS;
178 return createPPCMCSubtargetInfoImpl(TT, CPU, CPU, FullFS);
194 unsigned Reg = isPPC64 ? PPC::X1 : PPC::R1;
204 std::unique_ptr<MCAsmBackend> &&MAB,
205 std::unique_ptr<MCObjectWriter> &&OW,
206 std::unique_ptr<MCCodeEmitter> &&
Emitter) {
213 std::unique_ptr<MCAsmBackend> &&MAB,
214 std::unique_ptr<MCObjectWriter> &&OW,
215 std::unique_ptr<MCCodeEmitter> &&
Emitter) {
231 if (
const MCSymbolXCOFF *XSym = dyn_cast<MCSymbolXCOFF>(&S)) {
233 cast<MCSectionXCOFF>(Streamer.getCurrentSectionOnly())
234 ->getQualNameSymbol();
242 if (Kind == MCSymbolRefExpr::VariantKind::VK_PPC_AIX_TLSGD ||
243 Kind == MCSymbolRefExpr::VariantKind::VK_PPC_AIX_TLSGDM ||
244 Kind == MCSymbolRefExpr::VariantKind::VK_PPC_AIX_TLSIE ||
245 Kind == MCSymbolRefExpr::VariantKind::VK_PPC_AIX_TLSLE ||
246 Kind == MCSymbolRefExpr::VariantKind::VK_PPC_AIX_TLSLD ||
247 Kind == MCSymbolRefExpr::VariantKind::VK_PPC_AIX_TLSML)
248 OS <<
"\t.tc " << TCSym->
getName() <<
"," << XSym->getName() <<
"@"
251 OS <<
"\t.tc " << TCSym->
getName() <<
"," << XSym->getName() <<
'\n';
261 void emitMachine(
StringRef CPU)
override {
262 const Triple &
TT = Streamer.getContext().getTargetTriple();
263 if (
TT.isOSBinFormatXCOFF())
264 OS <<
"\t.machine\t" <<
'\"' << CPU <<
'\"' <<
'\n';
266 OS <<
"\t.machine " << CPU <<
'\n';
269 void emitAbiVersion(
int AbiVersion)
override {
270 OS <<
"\t.abiversion " << AbiVersion <<
'\n';
274 const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo();
276 OS <<
"\t.localentry\t";
296 Streamer.emitSymbolValue(&S, 8);
299 void emitMachine(
StringRef CPU)
override {
304 void emitAbiVersion(
int AbiVersion)
override {
306 unsigned Flags =
W.getELFHeaderEFlags();
307 Flags &= ~ELF::EF_PPC64_ABI;
309 W.setELFHeaderEFlags(Flags);
316 unsigned Encoded = encodePPC64LocalEntryOffset(LocalOffset);
319 Other &= ~ELF::STO_PPC64_LOCAL_MASK;
326 unsigned Flags =
W.getELFHeaderEFlags();
328 W.setELFHeaderEFlags(Flags | 2);
332 auto *
Symbol = cast<MCSymbolELF>(S);
336 if (copyLocalEntry(Symbol,
Value))
337 UpdateOther.insert(Symbol);
339 UpdateOther.erase(Symbol);
342 void finish()
override {
343 for (
auto *
Sym : UpdateOther)
344 if (
Sym->isVariable())
345 copyLocalEntry(
Sym,
Sym->getVariableValue());
356 auto *
Ref = dyn_cast<const MCSymbolRefExpr>(S);
359 const auto &RhsSym = cast<MCSymbolELF>(
Ref->getSymbol());
360 unsigned Other =
D->getOther();
361 Other &= ~ELF::STO_PPC64_LOCAL_MASK;
367 unsigned encodePPC64LocalEntryOffset(
const MCExpr *LocalOffset) {
370 if (!LocalOffset->evaluateAsAbsolute(
Offset, MCA))
372 ".localentry expression must be absolute");
377 LocalOffset->
getLoc(),
".localentry expression must be a power of 2");
402 void emitMachine(
StringRef CPU)
override {
407 void emitAbiVersion(
int AbiVersion)
override {
422 const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo();
424 Streamer.emitValueToAlignment(
Align(PointerSize));
429 void emitMachine(
StringRef CPU)
override {
434 void emitAbiVersion(
int AbiVersion)
override {
448 return new PPCTargetAsmStreamer(S,
OS);
458 if (TT.isOSBinFormatELF())
459 return new PPCTargetELFStreamer(S);
460 if (TT.isOSBinFormatXCOFF())
461 return new PPCTargetXCOFFStreamer(S);
462 return new PPCTargetMachOStreamer(S);
466 unsigned SyntaxVariant,
484 Info->get(Inst.
getOpcode()).operands()[NumOps - 1].OperandType !=
495 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
dxil DXContainer Global Emitter
std::optional< std::vector< StOtherPiece > > Other
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
static MCTargetStreamer * createNullTargetStreamer(MCStreamer &S)
static MCTargetStreamer * createAsmTargetStreamer(MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter *InstPrint)
LLVM_EXTERNAL_VISIBILITY void LLVMInitializePowerPCTargetMC()
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)
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.
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)
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.
Context object for machine code objects.
void reportError(SMLoc L, const Twine &Msg)
void emitValueToAlignment(Align, int64_t, unsigned, unsigned) override
Emit some number of copies of Value until the byte alignment ByteAlignment is reached.
Base class for the full range of assembler expressions which are needed for parsing.
void print(raw_ostream &OS, const MCAsmInfo *MAI, bool InParens=false) const
This is an instance of a target assembly language printer that converts an MCInst to valid target ass...
Instances of this class represent a single low-level machine instruction.
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...
Streaming machine code generation interface.
Generic base class for all target subtargets.
const Triple & getTargetTriple() const
unsigned getOther() const
void setOther(unsigned Other)
static StringRef getVariantKindName(VariantKind Kind)
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx)
StringRef getSymbolTableName() const
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
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.
~PPCTargetStreamer() override
PPCTargetStreamer(MCStreamer &S)
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
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.
LLVM Value Representation.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ 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)
static bool isVFRegister(unsigned Reg)
unsigned getRegNumForOperand(const MCInstrDesc &Desc, unsigned Reg, unsigned OpNo)
getRegNumForOperand - some operands use different numbering schemes for the same registers.
constexpr uint64_t PointerSize
aarch64 pointer size.
This is an optimization pass for GlobalISel generic memory operations.
Target & getThePPC64LETarget()
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.
MCXCOFFStreamer * createPPCXCOFFStreamer(MCContext &Context, 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()
MCELFStreamer * createPPCELFStreamer(MCContext &Context, std::unique_ptr< MCAsmBackend > MAB, std::unique_ptr< MCObjectWriter > OW, std::unique_ptr< MCCodeEmitter > Emitter)
This struct is a compact representation of a valid (non-zero power of two) alignment.
Description of the encoding of one expression Op.
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)