forked from OSchip/llvm-project
[PowerPC] Fix some Clang-tidy modernize and Include What You Use warnings; other minor fixes (NFC).
llvm-svn: 291872
This commit is contained in:
parent
d7279bba20
commit
8187c192c6
|
@ -11,22 +11,28 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "PPCInstrInfo.h"
|
||||
#include "MCTargetDesc/PPCMCTargetDesc.h"
|
||||
#include "MCTargetDesc/PPCFixupKinds.h"
|
||||
#include "PPCInstrInfo.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/ADT/Triple.h"
|
||||
#include "llvm/MC/MCAsmInfo.h"
|
||||
#include "llvm/MC/MCCodeEmitter.h"
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/MC/MCFixup.h"
|
||||
#include "llvm/MC/MCInst.h"
|
||||
#include "llvm/MC/MCInstrDesc.h"
|
||||
#include "llvm/MC/MCInstrInfo.h"
|
||||
#include "llvm/MC/MCRegisterInfo.h"
|
||||
#include "llvm/MC/MCSubtargetInfo.h"
|
||||
#include "llvm/Support/Endian.h"
|
||||
#include "llvm/Support/EndianStream.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Target/TargetOpcodes.h"
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
#define DEBUG_TYPE "mccodeemitter"
|
||||
|
@ -34,10 +40,8 @@ using namespace llvm;
|
|||
STATISTIC(MCNumEmitted, "Number of MC instructions emitted");
|
||||
|
||||
namespace {
|
||||
class PPCMCCodeEmitter : public MCCodeEmitter {
|
||||
PPCMCCodeEmitter(const PPCMCCodeEmitter &) = delete;
|
||||
void operator=(const PPCMCCodeEmitter &) = delete;
|
||||
|
||||
class PPCMCCodeEmitter : public MCCodeEmitter {
|
||||
const MCInstrInfo &MCII;
|
||||
const MCContext &CTX;
|
||||
bool IsLittleEndian;
|
||||
|
@ -46,8 +50,9 @@ public:
|
|||
PPCMCCodeEmitter(const MCInstrInfo &mcii, MCContext &ctx)
|
||||
: MCII(mcii), CTX(ctx),
|
||||
IsLittleEndian(ctx.getAsmInfo()->isLittleEndian()) {}
|
||||
|
||||
~PPCMCCodeEmitter() override {}
|
||||
PPCMCCodeEmitter(const PPCMCCodeEmitter &) = delete;
|
||||
void operator=(const PPCMCCodeEmitter &) = delete;
|
||||
~PPCMCCodeEmitter() override = default;
|
||||
|
||||
unsigned getDirectBrEncoding(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
|
@ -103,6 +108,7 @@ public:
|
|||
uint64_t getBinaryCodeForInstr(const MCInst &MI,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const;
|
||||
|
||||
void encodeInstruction(const MCInst &MI, raw_ostream &OS,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const override {
|
||||
|
@ -137,7 +143,7 @@ public:
|
|||
}
|
||||
break;
|
||||
default:
|
||||
llvm_unreachable ("Invalid instruction size");
|
||||
llvm_unreachable("Invalid instruction size");
|
||||
}
|
||||
|
||||
++MCNumEmitted; // Keep track of the # of mi's emitted.
|
||||
|
@ -238,7 +244,6 @@ unsigned PPCMCCodeEmitter::getMemRIEncoding(const MCInst &MI, unsigned OpNo,
|
|||
return RegBits;
|
||||
}
|
||||
|
||||
|
||||
unsigned PPCMCCodeEmitter::getMemRIXEncoding(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
|
@ -286,7 +291,6 @@ unsigned PPCMCCodeEmitter::getSPE8DisEncoding(const MCInst &MI, unsigned OpNo,
|
|||
return reverseBits(Imm | RegBits) >> 22;
|
||||
}
|
||||
|
||||
|
||||
unsigned PPCMCCodeEmitter::getSPE4DisEncoding(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI)
|
||||
|
@ -302,7 +306,6 @@ unsigned PPCMCCodeEmitter::getSPE4DisEncoding(const MCInst &MI, unsigned OpNo,
|
|||
return reverseBits(Imm | RegBits) >> 22;
|
||||
}
|
||||
|
||||
|
||||
unsigned PPCMCCodeEmitter::getSPE2DisEncoding(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI)
|
||||
|
@ -318,7 +321,6 @@ unsigned PPCMCCodeEmitter::getSPE2DisEncoding(const MCInst &MI, unsigned OpNo,
|
|||
return reverseBits(Imm | RegBits) >> 22;
|
||||
}
|
||||
|
||||
|
||||
unsigned PPCMCCodeEmitter::getTLSRegEncoding(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
|
@ -383,7 +385,5 @@ getMachineOpValue(const MCInst &MI, const MCOperand &MO,
|
|||
return MO.getImm();
|
||||
}
|
||||
|
||||
|
||||
|
||||
#define ENABLE_INSTR_PREDICATE_VERIFIER
|
||||
#include "PPCGenMCCodeEmitter.inc"
|
||||
|
|
|
@ -11,22 +11,29 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "PPCMCTargetDesc.h"
|
||||
#include "InstPrinter/PPCInstPrinter.h"
|
||||
#include "PPCMCAsmInfo.h"
|
||||
#include "MCTargetDesc/PPCMCAsmInfo.h"
|
||||
#include "MCTargetDesc/PPCMCTargetDesc.h"
|
||||
#include "PPCTargetStreamer.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/ADT/Triple.h"
|
||||
#include "llvm/MC/MCAssembler.h"
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCDwarf.h"
|
||||
#include "llvm/MC/MCELFStreamer.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/MC/MCInstrInfo.h"
|
||||
#include "llvm/MC/MCRegisterInfo.h"
|
||||
#include "llvm/MC/MCStreamer.h"
|
||||
#include "llvm/MC/MCSubtargetInfo.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
#include "llvm/MC/MCSymbolELF.h"
|
||||
#include "llvm/MC/MachineLocation.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
#include "llvm/Support/CodeGen.h"
|
||||
#include "llvm/Support/ELF.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/FormattedStream.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Support/TargetRegistry.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
@ -41,9 +48,10 @@ using namespace llvm;
|
|||
#include "PPCGenRegisterInfo.inc"
|
||||
|
||||
// Pin the vtable to this file.
|
||||
PPCTargetStreamer::~PPCTargetStreamer() {}
|
||||
PPCTargetStreamer::PPCTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {}
|
||||
|
||||
PPCTargetStreamer::~PPCTargetStreamer() = default;
|
||||
|
||||
static MCInstrInfo *createPPCMCInstrInfo() {
|
||||
MCInstrInfo *X = new MCInstrInfo();
|
||||
InitPPCMCInstrInfo(X);
|
||||
|
@ -96,12 +104,14 @@ static void adjustCodeGenOpts(const Triple &TT, Reloc::Model RM,
|
|||
}
|
||||
|
||||
namespace {
|
||||
|
||||
class PPCTargetAsmStreamer : public PPCTargetStreamer {
|
||||
formatted_raw_ostream &OS;
|
||||
|
||||
public:
|
||||
PPCTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS)
|
||||
: PPCTargetStreamer(S), OS(OS) {}
|
||||
|
||||
void emitTCEntry(const MCSymbol &S) override {
|
||||
OS << "\t.tc ";
|
||||
OS << S.getName();
|
||||
|
@ -109,12 +119,15 @@ public:
|
|||
OS << S.getName();
|
||||
OS << '\n';
|
||||
}
|
||||
|
||||
void emitMachine(StringRef CPU) override {
|
||||
OS << "\t.machine " << CPU << '\n';
|
||||
}
|
||||
|
||||
void emitAbiVersion(int AbiVersion) override {
|
||||
OS << "\t.abiversion " << AbiVersion << '\n';
|
||||
}
|
||||
|
||||
void emitLocalEntry(MCSymbolELF *S, const MCExpr *LocalOffset) override {
|
||||
const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo();
|
||||
|
||||
|
@ -129,18 +142,22 @@ public:
|
|||
class PPCTargetELFStreamer : public PPCTargetStreamer {
|
||||
public:
|
||||
PPCTargetELFStreamer(MCStreamer &S) : PPCTargetStreamer(S) {}
|
||||
|
||||
MCELFStreamer &getStreamer() {
|
||||
return static_cast<MCELFStreamer &>(Streamer);
|
||||
}
|
||||
|
||||
void emitTCEntry(const MCSymbol &S) override {
|
||||
// Creates a R_PPC64_TOC relocation
|
||||
Streamer.EmitValueToAlignment(8);
|
||||
Streamer.EmitSymbolValue(&S, 8);
|
||||
}
|
||||
|
||||
void emitMachine(StringRef CPU) override {
|
||||
// FIXME: Is there anything to do in here or does this directive only
|
||||
// limit the parser?
|
||||
}
|
||||
|
||||
void emitAbiVersion(int AbiVersion) override {
|
||||
MCAssembler &MCA = getStreamer().getAssembler();
|
||||
unsigned Flags = MCA.getELFHeaderEFlags();
|
||||
|
@ -148,6 +165,7 @@ public:
|
|||
Flags |= (AbiVersion & ELF::EF_PPC64_ABI);
|
||||
MCA.setELFHeaderEFlags(Flags);
|
||||
}
|
||||
|
||||
void emitLocalEntry(MCSymbolELF *S, const MCExpr *LocalOffset) override {
|
||||
MCAssembler &MCA = getStreamer().getAssembler();
|
||||
|
||||
|
@ -170,6 +188,7 @@ public:
|
|||
if ((Flags & ELF::EF_PPC64_ABI) == 0)
|
||||
MCA.setELFHeaderEFlags(Flags | 2);
|
||||
}
|
||||
|
||||
void emitAssignment(MCSymbol *S, const MCExpr *Value) override {
|
||||
auto *Symbol = cast<MCSymbolELF>(S);
|
||||
// When encoding an assignment to set symbol A to symbol B, also copy
|
||||
|
@ -188,21 +207,26 @@ public:
|
|||
class PPCTargetMachOStreamer : public PPCTargetStreamer {
|
||||
public:
|
||||
PPCTargetMachOStreamer(MCStreamer &S) : PPCTargetStreamer(S) {}
|
||||
|
||||
void emitTCEntry(const MCSymbol &S) override {
|
||||
llvm_unreachable("Unknown pseudo-op: .tc");
|
||||
}
|
||||
|
||||
void emitMachine(StringRef CPU) override {
|
||||
// FIXME: We should update the CPUType, CPUSubType in the Object file if
|
||||
// the new values are different from the defaults.
|
||||
}
|
||||
|
||||
void emitAbiVersion(int AbiVersion) override {
|
||||
llvm_unreachable("Unknown pseudo-op: .abiversion");
|
||||
}
|
||||
|
||||
void emitLocalEntry(MCSymbolELF *S, const MCExpr *LocalOffset) override {
|
||||
llvm_unreachable("Unknown pseudo-op: .localentry");
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
static MCTargetStreamer *createAsmTargetStreamer(MCStreamer &S,
|
||||
formatted_raw_ostream &OS,
|
||||
|
|
|
@ -17,23 +17,22 @@
|
|||
// GCC #defines PPC on Linux but we use it as our namespace name
|
||||
#undef PPC
|
||||
|
||||
#include "llvm/Support/DataTypes.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include <cstdint>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class MCAsmBackend;
|
||||
class MCCodeEmitter;
|
||||
class MCContext;
|
||||
class MCInstrInfo;
|
||||
class MCObjectWriter;
|
||||
class MCRegisterInfo;
|
||||
class MCSubtargetInfo;
|
||||
class MCTargetOptions;
|
||||
class Target;
|
||||
class Triple;
|
||||
class StringRef;
|
||||
class raw_pwrite_stream;
|
||||
class raw_ostream;
|
||||
|
||||
Target &getThePPC32Target();
|
||||
Target &getThePPC64Target();
|
||||
|
@ -83,7 +82,7 @@ static inline bool isRunOfOnes(unsigned Val, unsigned &MB, unsigned &ME) {
|
|||
return false;
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // end namespace llvm
|
||||
|
||||
// Generated files will use "namespace PPC". To avoid symbol clash,
|
||||
// undefine PPC here. PPC may be predefined on some hosts.
|
||||
|
@ -103,4 +102,4 @@ static inline bool isRunOfOnes(unsigned Val, unsigned &MB, unsigned &ME) {
|
|||
#define GET_SUBTARGETINFO_ENUM
|
||||
#include "PPCGenSubtargetInfo.inc"
|
||||
|
||||
#endif
|
||||
#endif // LLVM_LIB_TARGET_POWERPC_MCTARGETDESC_PPCMCTARGETDESC_H
|
||||
|
|
|
@ -12,30 +12,57 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "PPC.h"
|
||||
#include "MCTargetDesc/PPCMCTargetDesc.h"
|
||||
#include "MCTargetDesc/PPCPredicates.h"
|
||||
#include "PPC.h"
|
||||
#include "PPCISelLowering.h"
|
||||
#include "PPCMachineFunctionInfo.h"
|
||||
#include "PPCSubtarget.h"
|
||||
#include "PPCTargetMachine.h"
|
||||
#include "llvm/ADT/APInt.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/Analysis/BranchProbabilityInfo.h"
|
||||
#include "llvm/CodeGen/FunctionLoweringInfo.h"
|
||||
#include "llvm/CodeGen/ISDOpcodes.h"
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/MachineValueType.h"
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "llvm/CodeGen/SelectionDAGISel.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/CodeGen/SelectionDAGNodes.h"
|
||||
#include "llvm/CodeGen/ValueTypes.h"
|
||||
#include "llvm/IR/BasicBlock.h"
|
||||
#include "llvm/IR/DebugLoc.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/GlobalAlias.h"
|
||||
#include "llvm/IR/GlobalValue.h"
|
||||
#include "llvm/IR/GlobalVariable.h"
|
||||
#include "llvm/IR/Intrinsics.h"
|
||||
#include "llvm/IR/InlineAsm.h"
|
||||
#include "llvm/IR/InstrTypes.h"
|
||||
#include "llvm/IR/Module.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
#include "llvm/Support/CodeGen.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Compiler.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
#include <iterator>
|
||||
#include <limits>
|
||||
#include <memory>
|
||||
#include <new>
|
||||
#include <tuple>
|
||||
#include <utility>
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
#define DEBUG_TYPE "ppc-codegen"
|
||||
|
@ -60,6 +87,7 @@ static cl::opt<bool> EnableBranchHint(
|
|||
cl::Hidden);
|
||||
|
||||
namespace {
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
/// PPCDAGToDAGISel - PPC specific code to select PPC machine
|
||||
/// instructions for SelectionDAG operations.
|
||||
|
@ -69,6 +97,7 @@ namespace {
|
|||
const PPCSubtarget *PPCSubTarget;
|
||||
const PPCTargetLowering *PPCLowering;
|
||||
unsigned GlobalBaseReg;
|
||||
|
||||
public:
|
||||
explicit PPCDAGToDAGISel(PPCTargetMachine &tm)
|
||||
: SelectionDAGISel(tm), TM(tm) {}
|
||||
|
@ -184,7 +213,6 @@ namespace {
|
|||
bool SelectInlineAsmMemoryOperand(const SDValue &Op,
|
||||
unsigned ConstraintID,
|
||||
std::vector<SDValue> &OutOps) override {
|
||||
|
||||
switch(ConstraintID) {
|
||||
default:
|
||||
errs() << "ConstraintID: " << ConstraintID << "\n";
|
||||
|
@ -237,7 +265,8 @@ private:
|
|||
|
||||
void transferMemOperands(SDNode *N, SDNode *Result);
|
||||
};
|
||||
}
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
/// InsertVRSaveCode - Once the entire function has been instruction selected,
|
||||
/// all virtual registers are created and all machine instructions are built,
|
||||
|
@ -303,7 +332,6 @@ void PPCDAGToDAGISel::InsertVRSaveCode(MachineFunction &Fn) {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/// getGlobalBaseReg - Output the instructions required to put the
|
||||
/// base address to use for accessing globals into a register.
|
||||
///
|
||||
|
@ -368,7 +396,6 @@ static bool isIntS16Immediate(SDValue Op, short &Imm) {
|
|||
return isIntS16Immediate(Op.getNode(), Imm);
|
||||
}
|
||||
|
||||
|
||||
/// isInt32Immediate - This method tests to see if the node is a 32-bit constant
|
||||
/// operand. If so Imm will receive the 32-bit value.
|
||||
static bool isInt32Immediate(SDNode *N, unsigned &Imm) {
|
||||
|
@ -833,6 +860,7 @@ static SDNode *getInt64(SelectionDAG *CurDAG, SDNode *N) {
|
|||
}
|
||||
|
||||
namespace {
|
||||
|
||||
class BitPermutationSelector {
|
||||
struct ValueBit {
|
||||
SDValue V;
|
||||
|
@ -898,14 +926,12 @@ class BitPermutationSelector {
|
|||
// associated with each) used to choose the lowering method.
|
||||
struct ValueRotInfo {
|
||||
SDValue V;
|
||||
unsigned RLAmt;
|
||||
unsigned NumGroups;
|
||||
unsigned FirstGroupStartIdx;
|
||||
bool Repl32;
|
||||
unsigned RLAmt = std::numeric_limits<unsigned>::max();
|
||||
unsigned NumGroups = 0;
|
||||
unsigned FirstGroupStartIdx = std::numeric_limits<unsigned>::max();
|
||||
bool Repl32 = false;
|
||||
|
||||
ValueRotInfo()
|
||||
: RLAmt(UINT32_MAX), NumGroups(0), FirstGroupStartIdx(UINT32_MAX),
|
||||
Repl32(false) {}
|
||||
ValueRotInfo() = default;
|
||||
|
||||
// For sorting (in reverse order) by NumGroups, and then by
|
||||
// FirstGroupStartIdx.
|
||||
|
@ -1985,7 +2011,8 @@ public:
|
|||
return RNLM;
|
||||
}
|
||||
};
|
||||
} // anonymous namespace
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
bool PPCDAGToDAGISel::tryBitPermutation(SDNode *N) {
|
||||
if (N->getValueType(0) != MVT::i32 &&
|
||||
|
@ -2450,7 +2477,6 @@ void PPCDAGToDAGISel::transferMemOperands(SDNode *N, SDNode *Result) {
|
|||
cast<MachineSDNode>(Result)->setMemRefs(MemOp, MemOp + 1);
|
||||
}
|
||||
|
||||
|
||||
// Select - Convert the specified operand from a target-independent to a
|
||||
// target-specific node if it hasn't already been changed.
|
||||
void PPCDAGToDAGISel::Select(SDNode *N) {
|
||||
|
@ -2474,19 +2500,18 @@ void PPCDAGToDAGISel::Select(SDNode *N) {
|
|||
switch (N->getOpcode()) {
|
||||
default: break;
|
||||
|
||||
case ISD::Constant: {
|
||||
case ISD::Constant:
|
||||
if (N->getValueType(0) == MVT::i64) {
|
||||
ReplaceNode(N, getInt64(CurDAG, N));
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case ISD::SETCC: {
|
||||
case ISD::SETCC:
|
||||
if (trySETCC(N))
|
||||
return;
|
||||
break;
|
||||
}
|
||||
|
||||
case PPCISD::GlobalBaseReg:
|
||||
ReplaceNode(N, getGlobalBaseReg());
|
||||
return;
|
||||
|
@ -2502,11 +2527,10 @@ void PPCDAGToDAGISel::Select(SDNode *N) {
|
|||
return;
|
||||
}
|
||||
|
||||
case PPCISD::READ_TIME_BASE: {
|
||||
case PPCISD::READ_TIME_BASE:
|
||||
ReplaceNode(N, CurDAG->getMachineNode(PPC::ReadTB, dl, MVT::i32, MVT::i32,
|
||||
MVT::Other, N->getOperand(0)));
|
||||
return;
|
||||
}
|
||||
|
||||
case PPCISD::SRA_ADDZE: {
|
||||
SDValue N0 = N->getOperand(0);
|
||||
|
@ -2911,8 +2935,8 @@ void PPCDAGToDAGISel::Select(SDNode *N) {
|
|||
CurDAG->SelectNodeTo(N, PPC::XXSEL, N->getValueType(0), Ops);
|
||||
return;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case ISD::VECTOR_SHUFFLE:
|
||||
if (PPCSubTarget->hasVSX() && (N->getValueType(0) == MVT::v2f64 ||
|
||||
N->getValueType(0) == MVT::v2i64)) {
|
||||
|
@ -3088,7 +3112,7 @@ void PPCDAGToDAGISel::Select(SDNode *N) {
|
|||
SDValue(Tmp, 0), GA));
|
||||
return;
|
||||
}
|
||||
case PPCISD::PPC32_PICGOT: {
|
||||
case PPCISD::PPC32_PICGOT:
|
||||
// Generate a PIC-safe GOT reference.
|
||||
assert(!PPCSubTarget->isPPC64() && PPCSubTarget->isSVR4ABI() &&
|
||||
"PPCISD::PPC32_PICGOT is only supported for 32-bit SVR4");
|
||||
|
@ -3096,7 +3120,7 @@ void PPCDAGToDAGISel::Select(SDNode *N) {
|
|||
PPCLowering->getPointerTy(CurDAG->getDataLayout()),
|
||||
MVT::i32);
|
||||
return;
|
||||
}
|
||||
|
||||
case PPCISD::VADD_SPLAT: {
|
||||
// This expands into one of three sequences, depending on whether
|
||||
// the first operand is odd or even, positive or negative.
|
||||
|
@ -3139,7 +3163,6 @@ void PPCDAGToDAGISel::Select(SDNode *N) {
|
|||
SDValue TmpVal = SDValue(Tmp, 0);
|
||||
ReplaceNode(N, CurDAG->getMachineNode(Opc2, dl, VT, TmpVal, TmpVal));
|
||||
return;
|
||||
|
||||
} else if (Elt > 0) {
|
||||
// Elt is odd and positive, in the range [17,31].
|
||||
//
|
||||
|
@ -3154,7 +3177,6 @@ void PPCDAGToDAGISel::Select(SDNode *N) {
|
|||
ReplaceNode(N, CurDAG->getMachineNode(Opc3, dl, VT, SDValue(Tmp1, 0),
|
||||
SDValue(Tmp2, 0)));
|
||||
return;
|
||||
|
||||
} else {
|
||||
// Elt is odd and negative, in the range [-31,-17].
|
||||
//
|
||||
|
@ -3199,7 +3221,7 @@ SDValue PPCDAGToDAGISel::combineToCMPB(SDNode *N) {
|
|||
EVT VT = N->getValueType(0);
|
||||
|
||||
SDValue RHS, LHS;
|
||||
bool BytesFound[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
bool BytesFound[8] = {false, false, false, false, false, false, false, false};
|
||||
uint64_t Mask = 0, Alt = 0;
|
||||
|
||||
auto IsByteSelectCC = [this](SDValue O, unsigned &b,
|
||||
|
@ -3499,7 +3521,6 @@ void PPCDAGToDAGISel::PreprocessISelDAG() {
|
|||
/// PostprocessISelDAG - Perform some late peephole optimizations
|
||||
/// on the DAG representation.
|
||||
void PPCDAGToDAGISel::PostprocessISelDAG() {
|
||||
|
||||
// Skip peepholes at -O0.
|
||||
if (TM.getOptLevel() == CodeGenOpt::None)
|
||||
return;
|
||||
|
@ -4520,7 +4541,6 @@ void PPCDAGToDAGISel::PeepholePPC64() {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/// createPPCISelDag - This pass converts a legalized DAG into a
|
||||
/// PowerPC-specific DAG, ready for instruction scheduling.
|
||||
///
|
||||
|
|
|
@ -11,39 +11,88 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "PPCISelLowering.h"
|
||||
#include "MCTargetDesc/PPCPredicates.h"
|
||||
#include "PPC.h"
|
||||
#include "PPCCallingConv.h"
|
||||
#include "PPCCCState.h"
|
||||
#include "PPCFrameLowering.h"
|
||||
#include "PPCInstrInfo.h"
|
||||
#include "PPCISelLowering.h"
|
||||
#include "PPCMachineFunctionInfo.h"
|
||||
#include "PPCPerfectShuffle.h"
|
||||
#include "PPCRegisterInfo.h"
|
||||
#include "PPCSubtarget.h"
|
||||
#include "PPCTargetMachine.h"
|
||||
#include "PPCTargetObjectFile.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/APFloat.h"
|
||||
#include "llvm/ADT/APInt.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/None.h"
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
#include "llvm/ADT/SmallSet.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/ADT/StringSwitch.h"
|
||||
#include "llvm/ADT/Triple.h"
|
||||
#include "llvm/CodeGen/CallingConvLower.h"
|
||||
#include "llvm/CodeGen/ISDOpcodes.h"
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineInstr.h"
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/CodeGen/MachineJumpTableInfo.h"
|
||||
#include "llvm/CodeGen/MachineLoopInfo.h"
|
||||
#include "llvm/CodeGen/MachineMemOperand.h"
|
||||
#include "llvm/CodeGen/MachineOperand.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/MachineValueType.h"
|
||||
#include "llvm/CodeGen/RuntimeLibcalls.h"
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
|
||||
#include "llvm/CodeGen/SelectionDAGNodes.h"
|
||||
#include "llvm/CodeGen/ValueTypes.h"
|
||||
#include "llvm/IR/CallingConv.h"
|
||||
#include "llvm/IR/CallSite.h"
|
||||
#include "llvm/IR/Constant.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
#include "llvm/IR/DebugLoc.h"
|
||||
#include "llvm/IR/DerivedTypes.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/GlobalValue.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/Intrinsics.h"
|
||||
#include "llvm/IR/IRBuilder.h"
|
||||
#include "llvm/IR/Module.h"
|
||||
#include "llvm/IR/Type.h"
|
||||
#include "llvm/IR/Use.h"
|
||||
#include "llvm/IR/Value.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/MC/MCRegisterInfo.h"
|
||||
#include "llvm/Support/AtomicOrdering.h"
|
||||
#include "llvm/Support/BranchProbability.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
#include "llvm/Support/CodeGen.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Compiler.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/Format.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/Target/TargetLowering.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
#include <iterator>
|
||||
#include <list>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
|
@ -1525,7 +1574,6 @@ bool PPC::isSplatShuffleMask(ShuffleVectorSDNode *N, unsigned EltSize) {
|
|||
|
||||
bool PPC::isXXINSERTWMask(ShuffleVectorSDNode *N, unsigned &ShiftElts,
|
||||
unsigned &InsertAtByte, bool &Swap, bool IsLE) {
|
||||
|
||||
// Check that the mask is shuffling words
|
||||
for (unsigned i = 0; i < 4; ++i) {
|
||||
unsigned B0 = N->getMaskElt(i*4);
|
||||
|
@ -1643,7 +1691,6 @@ SDValue PPC::get_VSPLTI_elt(SDNode *N, unsigned ByteSize, SelectionDAG &DAG) {
|
|||
// If the element isn't a constant, bail fully out.
|
||||
if (!isa<ConstantSDNode>(N->getOperand(i))) return SDValue();
|
||||
|
||||
|
||||
if (!UniquedVals[i&(Multiple-1)].getNode())
|
||||
UniquedVals[i&(Multiple-1)] = N->getOperand(i);
|
||||
else if (UniquedVals[i&(Multiple-1)] != N->getOperand(i))
|
||||
|
@ -2026,7 +2073,6 @@ bool PPCTargetLowering::getPreIndexedAddressParts(SDNode *N, SDValue &Base,
|
|||
}
|
||||
|
||||
if (SelectAddressRegReg(Ptr, Base, Offset, DAG)) {
|
||||
|
||||
// Common code will reject creating a pre-inc form if the base pointer
|
||||
// is a frame index, or if N is a store and the base pointer is either
|
||||
// the same as or a predecessor of the value being stored. Check for
|
||||
|
@ -2277,7 +2323,6 @@ SDValue PPCTargetLowering::LowerBlockAddress(SDValue Op,
|
|||
|
||||
SDValue PPCTargetLowering::LowerGlobalTLSAddress(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
|
||||
// FIXME: TLS addresses currently use medium model code sequences,
|
||||
// which is the most useful form. Eventually support for small and
|
||||
// large models could be added if users need it, at the cost of
|
||||
|
@ -4222,11 +4267,12 @@ namespace {
|
|||
struct TailCallArgumentInfo {
|
||||
SDValue Arg;
|
||||
SDValue FrameIdxOp;
|
||||
int FrameIdx;
|
||||
int FrameIdx = 0;
|
||||
|
||||
TailCallArgumentInfo() : FrameIdx(0) {}
|
||||
TailCallArgumentInfo() = default;
|
||||
};
|
||||
}
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
/// StoreTailCallArgumentsToStackSlot - Stores arguments to their stack slot.
|
||||
static void StoreTailCallArgumentsToStackSlot(
|
||||
|
@ -4406,7 +4452,6 @@ PrepareCall(SelectionDAG &DAG, SDValue &Callee, SDValue &InFlag, SDValue &Chain,
|
|||
SmallVectorImpl<std::pair<unsigned, SDValue>> &RegsToPass,
|
||||
SmallVectorImpl<SDValue> &Ops, std::vector<EVT> &NodeTys,
|
||||
ImmutableCallSite *CS, const PPCSubtarget &Subtarget) {
|
||||
|
||||
bool isPPC64 = Subtarget.isPPC64();
|
||||
bool isSVR4ABI = Subtarget.isSVR4ABI();
|
||||
bool isELFv2ABI = Subtarget.isELFv2ABI();
|
||||
|
@ -4602,7 +4647,6 @@ SDValue PPCTargetLowering::LowerCallResult(
|
|||
SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool isVarArg,
|
||||
const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &dl,
|
||||
SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
|
||||
|
||||
SmallVector<CCValAssign, 16> RVLocs;
|
||||
CCState CCRetInfo(CallConv, isVarArg, DAG.getMachineFunction(), RVLocs,
|
||||
*DAG.getContext());
|
||||
|
@ -4649,7 +4693,6 @@ SDValue PPCTargetLowering::FinishCall(
|
|||
SDValue Chain, SDValue CallSeqStart, SDValue &Callee, int SPDiff,
|
||||
unsigned NumBytes, const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||
SmallVectorImpl<SDValue> &InVals, ImmutableCallSite *CS) const {
|
||||
|
||||
std::vector<EVT> NodeTys;
|
||||
SmallVector<SDValue, 8> Ops;
|
||||
unsigned CallOpc = PrepareCall(DAG, Callee, InFlag, Chain, CallSeqStart, dl,
|
||||
|
@ -5059,7 +5102,6 @@ SDValue PPCTargetLowering::LowerCall_64SVR4(
|
|||
const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &dl,
|
||||
SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals,
|
||||
ImmutableCallSite *CS) const {
|
||||
|
||||
bool isELFv2ABI = Subtarget.isELFv2ABI();
|
||||
bool isLittleEndian = Subtarget.isLittleEndian();
|
||||
unsigned NumOps = Outs.size();
|
||||
|
@ -5673,7 +5715,6 @@ SDValue PPCTargetLowering::LowerCall_Darwin(
|
|||
const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &dl,
|
||||
SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals,
|
||||
ImmutableCallSite *CS) const {
|
||||
|
||||
unsigned NumOps = Outs.size();
|
||||
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
@ -6065,7 +6106,6 @@ PPCTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
|
|||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
const SmallVectorImpl<SDValue> &OutVals,
|
||||
const SDLoc &dl, SelectionDAG &DAG) const {
|
||||
|
||||
SmallVector<CCValAssign, 16> RVLocs;
|
||||
CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(), RVLocs,
|
||||
*DAG.getContext());
|
||||
|
@ -7612,7 +7652,6 @@ SDValue PPCTargetLowering::LowerVECTOR_SHUFFLE(SDValue Op,
|
|||
SDValue Swap = DAG.getNode(PPCISD::SWAP_NO_CHAIN, dl, MVT::v2f64, Conv);
|
||||
return DAG.getNode(ISD::BITCAST, dl, MVT::v16i8, Swap);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (Subtarget.hasQPX()) {
|
||||
|
@ -7792,24 +7831,39 @@ SDValue PPCTargetLowering::LowerVECTOR_SHUFFLE(SDValue Op,
|
|||
static bool getVectorCompareInfo(SDValue Intrin, int &CompareOpc,
|
||||
bool &isDot, const PPCSubtarget &Subtarget) {
|
||||
unsigned IntrinsicID =
|
||||
cast<ConstantSDNode>(Intrin.getOperand(0))->getZExtValue();
|
||||
cast<ConstantSDNode>(Intrin.getOperand(0))->getZExtValue();
|
||||
CompareOpc = -1;
|
||||
isDot = false;
|
||||
switch (IntrinsicID) {
|
||||
default: return false;
|
||||
// Comparison predicates.
|
||||
case Intrinsic::ppc_altivec_vcmpbfp_p: CompareOpc = 966; isDot = 1; break;
|
||||
case Intrinsic::ppc_altivec_vcmpeqfp_p: CompareOpc = 198; isDot = 1; break;
|
||||
case Intrinsic::ppc_altivec_vcmpequb_p: CompareOpc = 6; isDot = 1; break;
|
||||
case Intrinsic::ppc_altivec_vcmpequh_p: CompareOpc = 70; isDot = 1; break;
|
||||
case Intrinsic::ppc_altivec_vcmpequw_p: CompareOpc = 134; isDot = 1; break;
|
||||
default:
|
||||
return false;
|
||||
// Comparison predicates.
|
||||
case Intrinsic::ppc_altivec_vcmpbfp_p:
|
||||
CompareOpc = 966;
|
||||
isDot = true;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpeqfp_p:
|
||||
CompareOpc = 198;
|
||||
isDot = true;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpequb_p:
|
||||
CompareOpc = 6;
|
||||
isDot = true;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpequh_p:
|
||||
CompareOpc = 70;
|
||||
isDot = true;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpequw_p:
|
||||
CompareOpc = 134;
|
||||
isDot = true;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpequd_p:
|
||||
if (Subtarget.hasP8Altivec()) {
|
||||
CompareOpc = 199;
|
||||
isDot = 1;
|
||||
isDot = true;
|
||||
} else
|
||||
return false;
|
||||
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpneb_p:
|
||||
case Intrinsic::ppc_altivec_vcmpneh_p:
|
||||
|
@ -7818,45 +7872,80 @@ static bool getVectorCompareInfo(SDValue Intrin, int &CompareOpc,
|
|||
case Intrinsic::ppc_altivec_vcmpnezh_p:
|
||||
case Intrinsic::ppc_altivec_vcmpnezw_p:
|
||||
if (Subtarget.hasP9Altivec()) {
|
||||
switch(IntrinsicID) {
|
||||
default: llvm_unreachable("Unknown comparison intrinsic.");
|
||||
case Intrinsic::ppc_altivec_vcmpneb_p: CompareOpc = 7; break;
|
||||
case Intrinsic::ppc_altivec_vcmpneh_p: CompareOpc = 71; break;
|
||||
case Intrinsic::ppc_altivec_vcmpnew_p: CompareOpc = 135; break;
|
||||
case Intrinsic::ppc_altivec_vcmpnezb_p: CompareOpc = 263; break;
|
||||
case Intrinsic::ppc_altivec_vcmpnezh_p: CompareOpc = 327; break;
|
||||
case Intrinsic::ppc_altivec_vcmpnezw_p: CompareOpc = 391; break;
|
||||
switch (IntrinsicID) {
|
||||
default:
|
||||
llvm_unreachable("Unknown comparison intrinsic.");
|
||||
case Intrinsic::ppc_altivec_vcmpneb_p:
|
||||
CompareOpc = 7;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpneh_p:
|
||||
CompareOpc = 71;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpnew_p:
|
||||
CompareOpc = 135;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpnezb_p:
|
||||
CompareOpc = 263;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpnezh_p:
|
||||
CompareOpc = 327;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpnezw_p:
|
||||
CompareOpc = 391;
|
||||
break;
|
||||
}
|
||||
isDot = 1;
|
||||
isDot = true;
|
||||
} else
|
||||
return false;
|
||||
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgefp_p: CompareOpc = 454; isDot = 1; break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtfp_p: CompareOpc = 710; isDot = 1; break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtsb_p: CompareOpc = 774; isDot = 1; break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtsh_p: CompareOpc = 838; isDot = 1; break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtsw_p: CompareOpc = 902; isDot = 1; break;
|
||||
case Intrinsic::ppc_altivec_vcmpgefp_p:
|
||||
CompareOpc = 454;
|
||||
isDot = true;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtfp_p:
|
||||
CompareOpc = 710;
|
||||
isDot = true;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtsb_p:
|
||||
CompareOpc = 774;
|
||||
isDot = true;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtsh_p:
|
||||
CompareOpc = 838;
|
||||
isDot = true;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtsw_p:
|
||||
CompareOpc = 902;
|
||||
isDot = true;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtsd_p:
|
||||
if (Subtarget.hasP8Altivec()) {
|
||||
CompareOpc = 967;
|
||||
isDot = 1;
|
||||
isDot = true;
|
||||
} else
|
||||
return false;
|
||||
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtub_p: CompareOpc = 518; isDot = 1; break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtuh_p: CompareOpc = 582; isDot = 1; break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtuw_p: CompareOpc = 646; isDot = 1; break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtub_p:
|
||||
CompareOpc = 518;
|
||||
isDot = true;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtuh_p:
|
||||
CompareOpc = 582;
|
||||
isDot = true;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtuw_p:
|
||||
CompareOpc = 646;
|
||||
isDot = true;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtud_p:
|
||||
if (Subtarget.hasP8Altivec()) {
|
||||
CompareOpc = 711;
|
||||
isDot = 1;
|
||||
isDot = true;
|
||||
} else
|
||||
return false;
|
||||
|
||||
break;
|
||||
// VSX predicate comparisons use the same infrastructure
|
||||
|
||||
// VSX predicate comparisons use the same infrastructure
|
||||
case Intrinsic::ppc_vsx_xvcmpeqdp_p:
|
||||
case Intrinsic::ppc_vsx_xvcmpgedp_p:
|
||||
case Intrinsic::ppc_vsx_xvcmpgtdp_p:
|
||||
|
@ -7865,33 +7954,51 @@ static bool getVectorCompareInfo(SDValue Intrin, int &CompareOpc,
|
|||
case Intrinsic::ppc_vsx_xvcmpgtsp_p:
|
||||
if (Subtarget.hasVSX()) {
|
||||
switch (IntrinsicID) {
|
||||
case Intrinsic::ppc_vsx_xvcmpeqdp_p: CompareOpc = 99; break;
|
||||
case Intrinsic::ppc_vsx_xvcmpgedp_p: CompareOpc = 115; break;
|
||||
case Intrinsic::ppc_vsx_xvcmpgtdp_p: CompareOpc = 107; break;
|
||||
case Intrinsic::ppc_vsx_xvcmpeqsp_p: CompareOpc = 67; break;
|
||||
case Intrinsic::ppc_vsx_xvcmpgesp_p: CompareOpc = 83; break;
|
||||
case Intrinsic::ppc_vsx_xvcmpgtsp_p: CompareOpc = 75; break;
|
||||
case Intrinsic::ppc_vsx_xvcmpeqdp_p:
|
||||
CompareOpc = 99;
|
||||
break;
|
||||
case Intrinsic::ppc_vsx_xvcmpgedp_p:
|
||||
CompareOpc = 115;
|
||||
break;
|
||||
case Intrinsic::ppc_vsx_xvcmpgtdp_p:
|
||||
CompareOpc = 107;
|
||||
break;
|
||||
case Intrinsic::ppc_vsx_xvcmpeqsp_p:
|
||||
CompareOpc = 67;
|
||||
break;
|
||||
case Intrinsic::ppc_vsx_xvcmpgesp_p:
|
||||
CompareOpc = 83;
|
||||
break;
|
||||
case Intrinsic::ppc_vsx_xvcmpgtsp_p:
|
||||
CompareOpc = 75;
|
||||
break;
|
||||
}
|
||||
isDot = 1;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
|
||||
break;
|
||||
|
||||
// Normal Comparisons.
|
||||
case Intrinsic::ppc_altivec_vcmpbfp: CompareOpc = 966; isDot = 0; break;
|
||||
case Intrinsic::ppc_altivec_vcmpeqfp: CompareOpc = 198; isDot = 0; break;
|
||||
case Intrinsic::ppc_altivec_vcmpequb: CompareOpc = 6; isDot = 0; break;
|
||||
case Intrinsic::ppc_altivec_vcmpequh: CompareOpc = 70; isDot = 0; break;
|
||||
case Intrinsic::ppc_altivec_vcmpequw: CompareOpc = 134; isDot = 0; break;
|
||||
case Intrinsic::ppc_altivec_vcmpequd:
|
||||
if (Subtarget.hasP8Altivec()) {
|
||||
CompareOpc = 199;
|
||||
isDot = 0;
|
||||
isDot = true;
|
||||
} else
|
||||
return false;
|
||||
break;
|
||||
|
||||
// Normal Comparisons.
|
||||
case Intrinsic::ppc_altivec_vcmpbfp:
|
||||
CompareOpc = 966;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpeqfp:
|
||||
CompareOpc = 198;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpequb:
|
||||
CompareOpc = 6;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpequh:
|
||||
CompareOpc = 70;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpequw:
|
||||
CompareOpc = 134;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpequd:
|
||||
if (Subtarget.hasP8Altivec())
|
||||
CompareOpc = 199;
|
||||
else
|
||||
return false;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpneb:
|
||||
case Intrinsic::ppc_altivec_vcmpneh:
|
||||
|
@ -7899,43 +8006,67 @@ static bool getVectorCompareInfo(SDValue Intrin, int &CompareOpc,
|
|||
case Intrinsic::ppc_altivec_vcmpnezb:
|
||||
case Intrinsic::ppc_altivec_vcmpnezh:
|
||||
case Intrinsic::ppc_altivec_vcmpnezw:
|
||||
if (Subtarget.hasP9Altivec()) {
|
||||
if (Subtarget.hasP9Altivec())
|
||||
switch (IntrinsicID) {
|
||||
default: llvm_unreachable("Unknown comparison intrinsic.");
|
||||
case Intrinsic::ppc_altivec_vcmpneb: CompareOpc = 7; break;
|
||||
case Intrinsic::ppc_altivec_vcmpneh: CompareOpc = 71; break;
|
||||
case Intrinsic::ppc_altivec_vcmpnew: CompareOpc = 135; break;
|
||||
case Intrinsic::ppc_altivec_vcmpnezb: CompareOpc = 263; break;
|
||||
case Intrinsic::ppc_altivec_vcmpnezh: CompareOpc = 327; break;
|
||||
case Intrinsic::ppc_altivec_vcmpnezw: CompareOpc = 391; break;
|
||||
default:
|
||||
llvm_unreachable("Unknown comparison intrinsic.");
|
||||
case Intrinsic::ppc_altivec_vcmpneb:
|
||||
CompareOpc = 7;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpneh:
|
||||
CompareOpc = 71;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpnew:
|
||||
CompareOpc = 135;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpnezb:
|
||||
CompareOpc = 263;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpnezh:
|
||||
CompareOpc = 327;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpnezw:
|
||||
CompareOpc = 391;
|
||||
break;
|
||||
}
|
||||
isDot = 0;
|
||||
} else
|
||||
else
|
||||
return false;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgefp: CompareOpc = 454; isDot = 0; break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtfp: CompareOpc = 710; isDot = 0; break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtsb: CompareOpc = 774; isDot = 0; break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtsh: CompareOpc = 838; isDot = 0; break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtsw: CompareOpc = 902; isDot = 0; break;
|
||||
case Intrinsic::ppc_altivec_vcmpgefp:
|
||||
CompareOpc = 454;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtfp:
|
||||
CompareOpc = 710;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtsb:
|
||||
CompareOpc = 774;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtsh:
|
||||
CompareOpc = 838;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtsw:
|
||||
CompareOpc = 902;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtsd:
|
||||
if (Subtarget.hasP8Altivec()) {
|
||||
if (Subtarget.hasP8Altivec())
|
||||
CompareOpc = 967;
|
||||
isDot = 0;
|
||||
} else
|
||||
else
|
||||
return false;
|
||||
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtub: CompareOpc = 518; isDot = 0; break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtuh: CompareOpc = 582; isDot = 0; break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtuw: CompareOpc = 646; isDot = 0; break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtub:
|
||||
CompareOpc = 518;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtuh:
|
||||
CompareOpc = 582;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtuw:
|
||||
CompareOpc = 646;
|
||||
break;
|
||||
case Intrinsic::ppc_altivec_vcmpgtud:
|
||||
if (Subtarget.hasP8Altivec()) {
|
||||
if (Subtarget.hasP8Altivec())
|
||||
CompareOpc = 711;
|
||||
isDot = 0;
|
||||
} else
|
||||
else
|
||||
return false;
|
||||
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
|
@ -8044,7 +8175,7 @@ SDValue PPCTargetLowering::LowerSIGN_EXTEND_INREG(SDValue Op,
|
|||
}
|
||||
|
||||
SDValue PPCTargetLowering::LowerSCALAR_TO_VECTOR(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
SelectionDAG &DAG) const {
|
||||
SDLoc dl(Op);
|
||||
// Create a stack slot that is 16-byte aligned.
|
||||
MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
|
||||
|
@ -9417,7 +9548,6 @@ PPCTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
|
|||
BB = EmitAtomicBinary(MI, BB, 4, 0);
|
||||
else if (MI.getOpcode() == PPC::ATOMIC_SWAP_I64)
|
||||
BB = EmitAtomicBinary(MI, BB, 8, 0);
|
||||
|
||||
else if (MI.getOpcode() == PPC::ATOMIC_CMP_SWAP_I32 ||
|
||||
MI.getOpcode() == PPC::ATOMIC_CMP_SWAP_I64 ||
|
||||
(Subtarget.hasPartwordAtomics() &&
|
||||
|
@ -10028,14 +10158,12 @@ static bool findConsecutiveLoad(LoadSDNode *LD, SelectionDAG &DAG) {
|
|||
return false;
|
||||
}
|
||||
|
||||
|
||||
/// This function is called when we have proved that a SETCC node can be replaced
|
||||
/// by subtraction (and other supporting instructions) so that the result of
|
||||
/// comparison is kept in a GPR instead of CR. This function is purely for
|
||||
/// codegen purposes and has some flags to guide the codegen process.
|
||||
static SDValue generateEquivalentSub(SDNode *N, int Size, bool Complement,
|
||||
bool Swap, SDLoc &DL, SelectionDAG &DAG) {
|
||||
|
||||
assert(N->getOpcode() == ISD::SETCC && "ISD::SETCC Expected.");
|
||||
|
||||
// Zero extend the operands to the largest legal integer. Originally, they
|
||||
|
@ -10068,7 +10196,6 @@ static SDValue generateEquivalentSub(SDNode *N, int Size, bool Complement,
|
|||
|
||||
SDValue PPCTargetLowering::ConvertSETCCToSubtract(SDNode *N,
|
||||
DAGCombinerInfo &DCI) const {
|
||||
|
||||
assert(N->getOpcode() == ISD::SETCC && "ISD::SETCC Expected.");
|
||||
|
||||
SelectionDAG &DAG = DCI.DAG;
|
||||
|
@ -11570,7 +11697,7 @@ SDValue PPCTargetLowering::PerformDAGCombine(SDNode *N,
|
|||
}
|
||||
|
||||
break;
|
||||
case ISD::INTRINSIC_W_CHAIN: {
|
||||
case ISD::INTRINSIC_W_CHAIN:
|
||||
// For little endian, VSX loads require generating lxvd2x/xxswapd.
|
||||
// Not needed on ISA 3.0 based CPUs since we have a non-permuting load.
|
||||
if (Subtarget.needsSwapsForVSXMemOps()) {
|
||||
|
@ -11583,8 +11710,7 @@ SDValue PPCTargetLowering::PerformDAGCombine(SDNode *N,
|
|||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ISD::INTRINSIC_VOID: {
|
||||
case ISD::INTRINSIC_VOID:
|
||||
// For little endian, VSX stores require generating xxswapd/stxvd2x.
|
||||
// Not needed on ISA 3.0 based CPUs since we have a non-permuting store.
|
||||
if (Subtarget.needsSwapsForVSXMemOps()) {
|
||||
|
@ -11597,7 +11723,6 @@ SDValue PPCTargetLowering::PerformDAGCombine(SDNode *N,
|
|||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ISD::BSWAP:
|
||||
// Turn BSWAP (LOAD) -> lhbrx/lwbrx.
|
||||
if (ISD::isNON_EXTLoad(N->getOperand(0).getNode()) &&
|
||||
|
@ -11635,9 +11760,8 @@ SDValue PPCTargetLowering::PerformDAGCombine(SDNode *N,
|
|||
// Return N so it doesn't get rechecked!
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
break;
|
||||
case PPCISD::VCMP: {
|
||||
case PPCISD::VCMP:
|
||||
// If a VCMPo node already exists with exactly the same operands as this
|
||||
// node, use its result instead of this node (VCMPo computes both a CR6 and
|
||||
// a normal output).
|
||||
|
@ -11687,7 +11811,6 @@ SDValue PPCTargetLowering::PerformDAGCombine(SDNode *N,
|
|||
return SDValue(VCMPoNode, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ISD::BRCOND: {
|
||||
SDValue Cond = N->getOperand(1);
|
||||
SDValue Target = N->getOperand(2);
|
||||
|
@ -12295,7 +12418,6 @@ PPCTargetLowering::isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const {
|
|||
bool PPCTargetLowering::getTgtMemIntrinsic(IntrinsicInfo &Info,
|
||||
const CallInst &I,
|
||||
unsigned Intrinsic) const {
|
||||
|
||||
switch (Intrinsic) {
|
||||
case Intrinsic::ppc_qpx_qvlfd:
|
||||
case Intrinsic::ppc_qpx_qvlfs:
|
||||
|
@ -12753,7 +12875,6 @@ void PPCTargetLowering::insertSSPDeclarations(Module &M) const {
|
|||
}
|
||||
|
||||
bool PPCTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT) const {
|
||||
|
||||
if (!VT.isSimple() || !Subtarget.hasVSX())
|
||||
return false;
|
||||
|
||||
|
|
|
@ -17,13 +17,26 @@
|
|||
|
||||
#include "PPC.h"
|
||||
#include "PPCInstrInfo.h"
|
||||
#include "PPCRegisterInfo.h"
|
||||
#include "llvm/CodeGen/CallingConvLower.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineMemOperand.h"
|
||||
#include "llvm/CodeGen/MachineValueType.h"
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "llvm/CodeGen/SelectionDAGNodes.h"
|
||||
#include "llvm/CodeGen/ValueTypes.h"
|
||||
#include "llvm/IR/Attributes.h"
|
||||
#include "llvm/IR/CallingConv.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/InlineAsm.h"
|
||||
#include "llvm/IR/Metadata.h"
|
||||
#include "llvm/IR/Type.h"
|
||||
#include "llvm/Target/TargetLowering.h"
|
||||
#include <utility>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
namespace PPCISD {
|
||||
|
||||
enum NodeType : unsigned {
|
||||
// Start the numbering where the builtin ops and target ops leave off.
|
||||
FIRST_NUMBER = ISD::BUILTIN_OP_END,
|
||||
|
@ -398,10 +411,12 @@ namespace llvm {
|
|||
/// the last operand.
|
||||
TOC_ENTRY
|
||||
};
|
||||
}
|
||||
|
||||
} // end namespace PPCISD
|
||||
|
||||
/// Define some predicates that are used for node matching.
|
||||
namespace PPC {
|
||||
|
||||
/// isVPKUHUMShuffleMask - Return true if this is the shuffle mask for a
|
||||
/// VPKUHUM instruction.
|
||||
bool isVPKUHUMShuffleMask(ShuffleVectorSDNode *N, unsigned ShuffleKind,
|
||||
|
@ -465,7 +480,8 @@ namespace llvm {
|
|||
/// If this is a qvaligni shuffle mask, return the shift
|
||||
/// amount, otherwise return -1.
|
||||
int isQVALIGNIShuffleMask(SDNode *N);
|
||||
}
|
||||
|
||||
} // end namespace PPC
|
||||
|
||||
class PPCTargetLowering : public TargetLowering {
|
||||
const PPCSubtarget &Subtarget;
|
||||
|
@ -492,6 +508,7 @@ namespace llvm {
|
|||
return TypeWidenVector;
|
||||
return TargetLoweringBase::getPreferredVectorAction(VT);
|
||||
}
|
||||
|
||||
bool useSoftFloat() const override;
|
||||
|
||||
MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override {
|
||||
|
@ -785,15 +802,13 @@ namespace llvm {
|
|||
SDValue Chain;
|
||||
SDValue ResChain;
|
||||
MachinePointerInfo MPI;
|
||||
bool IsDereferenceable;
|
||||
bool IsInvariant;
|
||||
unsigned Alignment;
|
||||
bool IsDereferenceable = false;
|
||||
bool IsInvariant = false;
|
||||
unsigned Alignment = 0;
|
||||
AAMDNodes AAInfo;
|
||||
const MDNode *Ranges;
|
||||
const MDNode *Ranges = nullptr;
|
||||
|
||||
ReuseLoadInfo()
|
||||
: IsDereferenceable(false), IsInvariant(false), Alignment(0),
|
||||
Ranges(nullptr) {}
|
||||
ReuseLoadInfo() = default;
|
||||
|
||||
MachineMemOperand::Flags MMOFlags() const {
|
||||
MachineMemOperand::Flags F = MachineMemOperand::MONone;
|
||||
|
@ -906,15 +921,13 @@ namespace llvm {
|
|||
const SDLoc &dl, SelectionDAG &DAG,
|
||||
SmallVectorImpl<SDValue> &InVals) const override;
|
||||
|
||||
SDValue
|
||||
LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
SmallVectorImpl<SDValue> &InVals) const override;
|
||||
SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
SmallVectorImpl<SDValue> &InVals) const override;
|
||||
|
||||
bool
|
||||
CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
|
||||
bool isVarArg,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
LLVMContext &Context) const override;
|
||||
bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
|
||||
bool isVarArg,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
LLVMContext &Context) const override;
|
||||
|
||||
SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
|
@ -994,14 +1007,16 @@ namespace llvm {
|
|||
CCAssignFn *useFastISelCCs(unsigned Flag) const;
|
||||
|
||||
SDValue
|
||||
combineElementTruncationToVectorTruncation(SDNode *N,
|
||||
DAGCombinerInfo &DCI) const;
|
||||
combineElementTruncationToVectorTruncation(SDNode *N,
|
||||
DAGCombinerInfo &DCI) const;
|
||||
};
|
||||
|
||||
namespace PPC {
|
||||
|
||||
FastISel *createFastISel(FunctionLoweringInfo &FuncInfo,
|
||||
const TargetLibraryInfo *LibInfo);
|
||||
}
|
||||
|
||||
} // end namespace PPC
|
||||
|
||||
bool CC_PPC32_SVR4_Custom_Dummy(unsigned &ValNo, MVT &ValVT, MVT &LocVT,
|
||||
CCValAssign::LocInfo &LocInfo,
|
||||
|
@ -1026,6 +1041,7 @@ namespace llvm {
|
|||
CCValAssign::LocInfo &LocInfo,
|
||||
ISD::ArgFlagsTy &ArgFlags,
|
||||
CCState &State);
|
||||
}
|
||||
|
||||
#endif // LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H
|
||||
} // end namespace llvm
|
||||
|
||||
#endif // LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/IntrinsicInst.h"
|
||||
#include "llvm/IR/Module.h"
|
||||
#include "llvm/IR/Type.h"
|
||||
#include "llvm/IR/Value.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
|
@ -72,9 +73,10 @@ namespace {
|
|||
public:
|
||||
static char ID; // Pass ID, replacement for typeid
|
||||
|
||||
PPCLoopPreIncPrep() : FunctionPass(ID), TM(nullptr) {
|
||||
PPCLoopPreIncPrep() : FunctionPass(ID) {
|
||||
initializePPCLoopPreIncPrepPass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
PPCLoopPreIncPrep(PPCTargetMachine &TM) : FunctionPass(ID), TM(&TM) {
|
||||
initializePPCLoopPreIncPrepPass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
@ -93,7 +95,7 @@ namespace {
|
|||
bool rotateLoop(Loop *L);
|
||||
|
||||
private:
|
||||
PPCTargetMachine *TM;
|
||||
PPCTargetMachine *TM = nullptr;
|
||||
DominatorTree *DT;
|
||||
LoopInfo *LI;
|
||||
ScalarEvolution *SE;
|
||||
|
|
|
@ -8,14 +8,13 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "PPCMachineFunctionInfo.h"
|
||||
#include "llvm/ADT/Twine.h"
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Target/TargetSubtargetInfo.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
void PPCFunctionInfo::anchor() { }
|
||||
void PPCFunctionInfo::anchor() {}
|
||||
|
||||
MCSymbol *PPCFunctionInfo::getPICOffsetSymbol() const {
|
||||
const DataLayout &DL = MF.getDataLayout();
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#ifndef LLVM_LIB_TARGET_POWERPC_PPCMACHINEFUNCTIONINFO_H
|
||||
#define LLVM_LIB_TARGET_POWERPC_PPCMACHINEFUNCTIONINFO_H
|
||||
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
|
||||
namespace llvm {
|
||||
|
@ -26,17 +27,17 @@ class PPCFunctionInfo : public MachineFunctionInfo {
|
|||
/// FramePointerSaveIndex - Frame index of where the old frame pointer is
|
||||
/// stored. Also used as an anchor for instructions that need to be altered
|
||||
/// when using frame pointers (dyna_add, dyna_sub.)
|
||||
int FramePointerSaveIndex;
|
||||
int FramePointerSaveIndex = 0;
|
||||
|
||||
/// ReturnAddrSaveIndex - Frame index of where the return address is stored.
|
||||
///
|
||||
int ReturnAddrSaveIndex;
|
||||
int ReturnAddrSaveIndex = 0;
|
||||
|
||||
/// Frame index where the old base pointer is stored.
|
||||
int BasePointerSaveIndex;
|
||||
int BasePointerSaveIndex = 0;
|
||||
|
||||
/// Frame index where the old PIC base pointer is stored.
|
||||
int PICBasePointerSaveIndex;
|
||||
int PICBasePointerSaveIndex = 0;
|
||||
|
||||
/// MustSaveLR - Indicates whether LR is defined (or clobbered) in the current
|
||||
/// function. This is only valid after the initial scan of the function by
|
||||
|
@ -44,54 +45,58 @@ class PPCFunctionInfo : public MachineFunctionInfo {
|
|||
bool MustSaveLR;
|
||||
|
||||
/// Does this function have any stack spills.
|
||||
bool HasSpills;
|
||||
bool HasSpills = false;
|
||||
|
||||
/// Does this function spill using instructions with only r+r (not r+i)
|
||||
/// forms.
|
||||
bool HasNonRISpills;
|
||||
bool HasNonRISpills = false;
|
||||
|
||||
/// SpillsCR - Indicates whether CR is spilled in the current function.
|
||||
bool SpillsCR;
|
||||
bool SpillsCR = false;
|
||||
|
||||
/// Indicates whether VRSAVE is spilled in the current function.
|
||||
bool SpillsVRSAVE;
|
||||
bool SpillsVRSAVE = false;
|
||||
|
||||
/// LRStoreRequired - The bool indicates whether there is some explicit use of
|
||||
/// the LR/LR8 stack slot that is not obvious from scanning the code. This
|
||||
/// requires that the code generator produce a store of LR to the stack on
|
||||
/// entry, even though LR may otherwise apparently not be used.
|
||||
bool LRStoreRequired;
|
||||
bool LRStoreRequired = false;
|
||||
|
||||
/// This function makes use of the PPC64 ELF TOC base pointer (register r2).
|
||||
bool UsesTOCBasePtr;
|
||||
bool UsesTOCBasePtr = false;
|
||||
|
||||
/// MinReservedArea - This is the frame size that is at least reserved in a
|
||||
/// potential caller (parameter+linkage area).
|
||||
unsigned MinReservedArea;
|
||||
unsigned MinReservedArea = 0;
|
||||
|
||||
/// TailCallSPDelta - Stack pointer delta used when tail calling. Maximum
|
||||
/// amount the stack pointer is adjusted to make the frame bigger for tail
|
||||
/// calls. Used for creating an area before the register spill area.
|
||||
int TailCallSPDelta;
|
||||
int TailCallSPDelta = 0;
|
||||
|
||||
/// HasFastCall - Does this function contain a fast call. Used to determine
|
||||
/// how the caller's stack pointer should be calculated (epilog/dynamicalloc).
|
||||
bool HasFastCall;
|
||||
bool HasFastCall = false;
|
||||
|
||||
/// VarArgsFrameIndex - FrameIndex for start of varargs area.
|
||||
int VarArgsFrameIndex;
|
||||
int VarArgsFrameIndex = 0;
|
||||
|
||||
/// VarArgsStackOffset - StackOffset for start of stack
|
||||
/// arguments.
|
||||
int VarArgsStackOffset;
|
||||
|
||||
int VarArgsStackOffset = 0;
|
||||
|
||||
/// VarArgsNumGPR - Index of the first unused integer
|
||||
/// register for parameter passing.
|
||||
unsigned VarArgsNumGPR;
|
||||
unsigned VarArgsNumGPR = 0;
|
||||
|
||||
/// VarArgsNumFPR - Index of the first unused double
|
||||
/// register for parameter passing.
|
||||
unsigned VarArgsNumFPR;
|
||||
unsigned VarArgsNumFPR = 0;
|
||||
|
||||
/// CRSpillFrameIndex - FrameIndex for CR spill slot for 32-bit SVR4.
|
||||
int CRSpillFrameIndex;
|
||||
int CRSpillFrameIndex = 0;
|
||||
|
||||
/// If any of CR[2-4] need to be saved in the prologue and restored in the
|
||||
/// epilogue then they are added to this array. This is used for the
|
||||
|
@ -102,35 +107,14 @@ class PPCFunctionInfo : public MachineFunctionInfo {
|
|||
MachineFunction &MF;
|
||||
|
||||
/// Whether this uses the PIC Base register or not.
|
||||
bool UsesPICBase;
|
||||
bool UsesPICBase = false;
|
||||
|
||||
/// True if this function has a subset of CSRs that is handled explicitly via
|
||||
/// copies
|
||||
bool IsSplitCSR;
|
||||
bool IsSplitCSR = false;
|
||||
|
||||
public:
|
||||
explicit PPCFunctionInfo(MachineFunction &MF)
|
||||
: FramePointerSaveIndex(0),
|
||||
ReturnAddrSaveIndex(0),
|
||||
BasePointerSaveIndex(0),
|
||||
PICBasePointerSaveIndex(0),
|
||||
HasSpills(false),
|
||||
HasNonRISpills(false),
|
||||
SpillsCR(false),
|
||||
SpillsVRSAVE(false),
|
||||
LRStoreRequired(false),
|
||||
UsesTOCBasePtr(false),
|
||||
MinReservedArea(0),
|
||||
TailCallSPDelta(0),
|
||||
HasFastCall(false),
|
||||
VarArgsFrameIndex(0),
|
||||
VarArgsStackOffset(0),
|
||||
VarArgsNumGPR(0),
|
||||
VarArgsNumFPR(0),
|
||||
CRSpillFrameIndex(0),
|
||||
MF(MF),
|
||||
UsesPICBase(0),
|
||||
IsSplitCSR(false) {}
|
||||
explicit PPCFunctionInfo(MachineFunction &MF) : MF(MF) {}
|
||||
|
||||
int getFramePointerSaveIndex() const { return FramePointerSaveIndex; }
|
||||
void setFramePointerSaveIndex(int Idx) { FramePointerSaveIndex = Idx; }
|
||||
|
@ -211,7 +195,6 @@ public:
|
|||
MCSymbol *getTOCOffsetSymbol() const;
|
||||
};
|
||||
|
||||
} // end of namespace llvm
|
||||
} // end namespace llvm
|
||||
|
||||
|
||||
#endif
|
||||
#endif // LLVM_LIB_TARGET_POWERPC_PPCMACHINEFUNCTIONINFO_H
|
||||
|
|
|
@ -11,21 +11,33 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "PPCTargetMachine.h"
|
||||
#include "MCTargetDesc/PPCMCTargetDesc.h"
|
||||
#include "PPC.h"
|
||||
#include "PPCSubtarget.h"
|
||||
#include "PPCTargetObjectFile.h"
|
||||
#include "PPCTargetMachine.h"
|
||||
#include "PPCTargetTransformInfo.h"
|
||||
#include "llvm/CodeGen/LiveVariables.h"
|
||||
#include "llvm/ADT/Optional.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/ADT/Triple.h"
|
||||
#include "llvm/Analysis/TargetTransformInfo.h"
|
||||
#include "llvm/CodeGen/Passes.h"
|
||||
#include "llvm/CodeGen/TargetPassConfig.h"
|
||||
#include "llvm/IR/Attributes.h"
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/LegacyPassManager.h"
|
||||
#include "llvm/MC/MCStreamer.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Support/CodeGen.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/FormattedStream.h"
|
||||
#include "llvm/Support/TargetRegistry.h"
|
||||
#include "llvm/Target/TargetLoweringObjectFile.h"
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
#include <cassert>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
static cl::
|
||||
|
@ -149,9 +161,9 @@ static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {
|
|||
// If it isn't a Mach-O file then it's going to be a linux ELF
|
||||
// object file.
|
||||
if (TT.isOSDarwin())
|
||||
return make_unique<TargetLoweringObjectFileMachO>();
|
||||
return llvm::make_unique<TargetLoweringObjectFileMachO>();
|
||||
|
||||
return make_unique<PPC64LinuxTargetObjectFile>();
|
||||
return llvm::make_unique<PPC64LinuxTargetObjectFile>();
|
||||
}
|
||||
|
||||
static PPCTargetMachine::PPCABI computeTargetABI(const Triple &TT,
|
||||
|
@ -211,9 +223,9 @@ PPCTargetMachine::PPCTargetMachine(const Target &T, const Triple &TT,
|
|||
initAsmInfo();
|
||||
}
|
||||
|
||||
PPCTargetMachine::~PPCTargetMachine() {}
|
||||
PPCTargetMachine::~PPCTargetMachine() = default;
|
||||
|
||||
void PPC32TargetMachine::anchor() { }
|
||||
void PPC32TargetMachine::anchor() {}
|
||||
|
||||
PPC32TargetMachine::PPC32TargetMachine(const Target &T, const Triple &TT,
|
||||
StringRef CPU, StringRef FS,
|
||||
|
@ -223,7 +235,7 @@ PPC32TargetMachine::PPC32TargetMachine(const Target &T, const Triple &TT,
|
|||
CodeGenOpt::Level OL)
|
||||
: PPCTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL) {}
|
||||
|
||||
void PPC64TargetMachine::anchor() { }
|
||||
void PPC64TargetMachine::anchor() {}
|
||||
|
||||
PPC64TargetMachine::PPC64TargetMachine(const Target &T, const Triple &TT,
|
||||
StringRef CPU, StringRef FS,
|
||||
|
@ -281,6 +293,7 @@ PPCTargetMachine::getSubtargetImpl(const Function &F) const {
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
namespace {
|
||||
|
||||
/// PPC Code Generator Pass Configuration Options.
|
||||
class PPCPassConfig : public TargetPassConfig {
|
||||
public:
|
||||
|
@ -300,7 +313,8 @@ public:
|
|||
void addPreSched2() override;
|
||||
void addPreEmitPass() override;
|
||||
};
|
||||
} // namespace
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
TargetPassConfig *PPCTargetMachine::createPassConfig(PassManagerBase &PM) {
|
||||
return new PPCPassConfig(this, PM);
|
||||
|
|
Loading…
Reference in New Issue