LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Functions | Variables
PPCISelLowering.cpp File Reference
#include "PPCISelLowering.h"
#include "MCTargetDesc/PPCPredicates.h"
#include "PPCMachineFunctionInfo.h"
#include "PPCPerfectShuffle.h"
#include "PPCTargetMachine.h"
#include "PPCTargetObjectFile.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/CodeGen/CallingConvLower.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/SelectionDAG.h"
#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetOptions.h"
#include "PPCGenCallingConv.inc"
Include dependency graph for PPCISelLowering.cpp:

Go to the source code of this file.

Functions

static TargetLoweringObjectFileCreateTLOF (const PPCTargetMachine &TM)
 
static void getMaxByValAlign (Type *Ty, unsigned &MaxAlign, unsigned MaxMaxAlign)
 
static bool isFloatingPointZero (SDValue Op)
 isFloatingPointZero - Return true if this is 0.0 or -0.0. More...
 
static bool isConstantOrUndef (int Op, int Val)
 
static bool isVMerge (ShuffleVectorSDNode *N, unsigned UnitSize, unsigned LHSStart, unsigned RHSStart)
 
static bool isIntS16Immediate (SDNode *N, short &Imm)
 
static bool isIntS16Immediate (SDValue Op, short &Imm)
 
static void fixupFuncForFI (SelectionDAG &DAG, int FrameIdx, EVT VT)
 
static bool GetLabelAccessInfo (const TargetMachine &TM, unsigned &HiOpFlags, unsigned &LoOpFlags, const GlobalValue *GV=0)
 
static SDValue LowerLabelRef (SDValue HiPart, SDValue LoPart, bool isPIC, SelectionDAG &DAG)
 
static const uint16_t * GetFPR ()
 
static unsigned CalculateStackSlotSize (EVT ArgVT, ISD::ArgFlagsTy Flags, unsigned PtrByteSize)
 
static unsigned CalculateParameterAndLinkageAreaSize (SelectionDAG &DAG, bool isPPC64, bool isVarArg, unsigned CC, const SmallVectorImpl< ISD::OutputArg > &Outs, const SmallVectorImpl< SDValue > &OutVals, unsigned &nAltivecParamsAtEnd)
 
static int CalculateTailCallSPDiff (SelectionDAG &DAG, bool isTailCall, unsigned ParamSize)
 
static SDNodeisBLACompatibleAddress (SDValue Op, SelectionDAG &DAG)
 
static void StoreTailCallArgumentsToStackSlot (SelectionDAG &DAG, SDValue Chain, const SmallVectorImpl< TailCallArgumentInfo > &TailCallArgs, SmallVectorImpl< SDValue > &MemOpChains, SDLoc dl)
 StoreTailCallArgumentsToStackSlot - Stores arguments to their stack slot. More...
 
static SDValue EmitTailCallStoreFPAndRetAddr (SelectionDAG &DAG, MachineFunction &MF, SDValue Chain, SDValue OldRetAddr, SDValue OldFP, int SPDiff, bool isPPC64, bool isDarwinABI, SDLoc dl)
 
static void CalculateTailCallArgDest (SelectionDAG &DAG, MachineFunction &MF, bool isPPC64, SDValue Arg, int SPDiff, unsigned ArgOffset, SmallVectorImpl< TailCallArgumentInfo > &TailCallArguments)
 
static SDValue CreateCopyOfByValArgument (SDValue Src, SDValue Dst, SDValue Chain, ISD::ArgFlagsTy Flags, SelectionDAG &DAG, SDLoc dl)
 
static void LowerMemOpCallTo (SelectionDAG &DAG, MachineFunction &MF, SDValue Chain, SDValue Arg, SDValue PtrOff, int SPDiff, unsigned ArgOffset, bool isPPC64, bool isTailCall, bool isVector, SmallVectorImpl< SDValue > &MemOpChains, SmallVectorImpl< TailCallArgumentInfo > &TailCallArguments, SDLoc dl)
 
static void PrepareTailCall (SelectionDAG &DAG, SDValue &InFlag, SDValue &Chain, SDLoc dl, bool isPPC64, int SPDiff, unsigned NumBytes, SDValue LROp, SDValue FPOp, bool isDarwinABI, SmallVectorImpl< TailCallArgumentInfo > &TailCallArguments)
 
static unsigned PrepareCall (SelectionDAG &DAG, SDValue &Callee, SDValue &InFlag, SDValue &Chain, SDLoc dl, int SPDiff, bool isTailCall, SmallVectorImpl< std::pair< unsigned, SDValue > > &RegsToPass, SmallVectorImpl< SDValue > &Ops, std::vector< EVT > &NodeTys, const PPCSubtarget &PPCSubTarget)
 
static bool isLocalCall (const SDValue &Callee)
 
static SDValue BuildSplatI (int Val, unsigned SplatSize, EVT VT, SelectionDAG &DAG, SDLoc dl)
 
static SDValue BuildIntrinsicOp (unsigned IID, SDValue Op, SelectionDAG &DAG, SDLoc dl, EVT DestVT=MVT::Other)
 
static SDValue BuildIntrinsicOp (unsigned IID, SDValue LHS, SDValue RHS, SelectionDAG &DAG, SDLoc dl, EVT DestVT=MVT::Other)
 
static SDValue BuildIntrinsicOp (unsigned IID, SDValue Op0, SDValue Op1, SDValue Op2, SelectionDAG &DAG, SDLoc dl, EVT DestVT=MVT::Other)
 
static SDValue BuildVSLDOI (SDValue LHS, SDValue RHS, unsigned Amt, EVT VT, SelectionDAG &DAG, SDLoc dl)
 
static SDValue GeneratePerfectShuffle (unsigned PFEntry, SDValue LHS, SDValue RHS, SelectionDAG &DAG, SDLoc dl)
 
static bool getAltivecCompareInfo (SDValue Intrin, int &CompareOpc, bool &isDot)
 
static bool isConsecutiveLS (LSBaseSDNode *LS, LSBaseSDNode *Base, unsigned Bytes, int Dist, SelectionDAG &DAG)
 
static bool findConsecutiveLoad (LoadSDNode *LD, SelectionDAG &DAG)
 

Variables

static cl::opt< boolDisablePPCPreinc ("disable-ppc-preinc", cl::desc("disable preincrement load/store generation on PPC"), cl::Hidden)
 
static cl::opt< boolDisableILPPref ("disable-ppc-ilp-pref", cl::desc("disable setting the node scheduling preference to ILP on PPC"), cl::Hidden)
 
static cl::opt< boolDisablePPCUnaligned ("disable-ppc-unaligned", cl::desc("disable unaligned load/store generation on PPC"), cl::Hidden)
 

Function Documentation

static SDValue BuildIntrinsicOp ( unsigned  IID,
SDValue  Op,
SelectionDAG DAG,
SDLoc  dl,
EVT  DestVT = MVT::Other 
)
static

BuildIntrinsicOp - Return a unary operator intrinsic node with the specified intrinsic ID.

Definition at line 5174 of file PPCISelLowering.cpp.

References llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getNode(), llvm::SDValue::getValueType(), llvm::ISD::INTRINSIC_WO_CHAIN, and llvm::MVT::Other.

Referenced by llvm::PPCTargetLowering::PerformDAGCombine().

static SDValue BuildIntrinsicOp ( unsigned  IID,
SDValue  LHS,
SDValue  RHS,
SelectionDAG DAG,
SDLoc  dl,
EVT  DestVT = MVT::Other 
)
static

BuildIntrinsicOp - Return a binary operator intrinsic node with the specified intrinsic ID.

Definition at line 5184 of file PPCISelLowering.cpp.

References llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getNode(), llvm::SDValue::getValueType(), llvm::ISD::INTRINSIC_WO_CHAIN, and llvm::MVT::Other.

static SDValue BuildIntrinsicOp ( unsigned  IID,
SDValue  Op0,
SDValue  Op1,
SDValue  Op2,
SelectionDAG DAG,
SDLoc  dl,
EVT  DestVT = MVT::Other 
)
static

BuildIntrinsicOp - Return a ternary operator intrinsic node with the specified intrinsic ID.

Definition at line 5194 of file PPCISelLowering.cpp.

References llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getNode(), llvm::SDValue::getValueType(), llvm::ISD::INTRINSIC_WO_CHAIN, and llvm::MVT::Other.

static SDValue BuildSplatI ( int  Val,
unsigned  SplatSize,
EVT  VT,
SelectionDAG DAG,
SDLoc  dl 
)
static
static SDValue BuildVSLDOI ( SDValue  LHS,
SDValue  RHS,
unsigned  Amt,
EVT  VT,
SelectionDAG DAG,
SDLoc  dl 
)
static

BuildVSLDOI - Return a VECTOR_SHUFFLE that is a vsldoi of the specified amount. The result has the specified value type.

Definition at line 5205 of file PPCISelLowering.cpp.

References llvm::ISD::BITCAST, llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getVectorShuffle(), and llvm::MVT::v16i8.

Referenced by GeneratePerfectShuffle().

static unsigned CalculateParameterAndLinkageAreaSize ( SelectionDAG DAG,
bool  isPPC64,
bool  isVarArg,
unsigned  CC,
const SmallVectorImpl< ISD::OutputArg > &  Outs,
const SmallVectorImpl< SDValue > &  OutVals,
unsigned nAltivecParamsAtEnd 
)
static
static unsigned CalculateStackSlotSize ( EVT  ArgVT,
ISD::ArgFlagsTy  Flags,
unsigned  PtrByteSize 
)
static

CalculateStackSlotSize - Calculates the size reserved for this argument on the stack.

Definition at line 1923 of file PPCISelLowering.cpp.

References llvm::ISD::ArgFlagsTy::getByValSize(), llvm::EVT::getSizeInBits(), and llvm::ISD::ArgFlagsTy::isByVal().

Referenced by CalculateParameterAndLinkageAreaSize().

static void CalculateTailCallArgDest ( SelectionDAG DAG,
MachineFunction MF,
bool  isPPC64,
SDValue  Arg,
int  SPDiff,
unsigned  ArgOffset,
SmallVectorImpl< TailCallArgumentInfo > &  TailCallArguments 
)
static
static int CalculateTailCallSPDiff ( SelectionDAG DAG,
bool  isTailCall,
unsigned  ParamSize 
)
static

CalculateTailCallSPDiff - Get the amount the stack pointer has to be adjusted to accommodate the arguments for the tailcall.

Definition at line 2931 of file PPCISelLowering.cpp.

References llvm::MachineFunction::getInfo(), llvm::SelectionDAG::getMachineFunction(), llvm::PPCFunctionInfo::getMinReservedArea(), and llvm::PPCFunctionInfo::setTailCallSPDelta().

static SDValue CreateCopyOfByValArgument ( SDValue  Src,
SDValue  Dst,
SDValue  Chain,
ISD::ArgFlagsTy  Flags,
SelectionDAG DAG,
SDLoc  dl 
)
static

CreateCopyOfByValArgument - Make a copy of an aggregate at address specified by "Src" to address "Dst" of size "Size". Alignment information is specified by the specific parameter attribute. The copy will be passed as a byval function parameter. Sometimes what we are copying is the end of a larger object, the part that does not fit in registers.

Definition at line 3125 of file PPCISelLowering.cpp.

References llvm::ISD::ArgFlagsTy::getByValAlign(), llvm::ISD::ArgFlagsTy::getByValSize(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getMemcpy(), and llvm::MVT::i32.

static TargetLoweringObjectFile* CreateTLOF ( const PPCTargetMachine TM)
static
static SDValue EmitTailCallStoreFPAndRetAddr ( SelectionDAG DAG,
MachineFunction MF,
SDValue  Chain,
SDValue  OldRetAddr,
SDValue  OldFP,
int  SPDiff,
bool  isPPC64,
bool  isDarwinABI,
SDLoc  dl 
)
static
static bool findConsecutiveLoad ( LoadSDNode LD,
SelectionDAG DAG 
)
static
static void fixupFuncForFI ( SelectionDAG DAG,
int  FrameIdx,
EVT  VT 
)
static
static SDValue GeneratePerfectShuffle ( unsigned  PFEntry,
SDValue  LHS,
SDValue  RHS,
SelectionDAG DAG,
SDLoc  dl 
)
static

GeneratePerfectShuffle - Given an entry in the perfect-shuffle table, emit the specified operations to build the shuffle.

Definition at line 5379 of file PPCISelLowering.cpp.

References llvm::ISD::BITCAST, BuildVSLDOI(), llvm::SelectionDAG::getNode(), llvm::SDValue::getValueType(), llvm::SelectionDAG::getVectorShuffle(), llvm_unreachable, PerfectShuffleTable, and llvm::MVT::v16i8.

static bool getAltivecCompareInfo ( SDValue  Intrin,
int &  CompareOpc,
bool isDot 
)
static
static const uint16_t* GetFPR ( )
static

GetFPR - Get the set of FP registers that should be allocated for arguments, on Darwin.

Definition at line 1912 of file PPCISelLowering.cpp.

static bool GetLabelAccessInfo ( const TargetMachine TM,
unsigned HiOpFlags,
unsigned LoOpFlags,
const GlobalValue GV = 0 
)
static

GetLabelAccessInfo - Return true if we should reference labels using a PICBase, set the HiOpFlags and LoOpFlags to the target MO flags.

Definition at line 1305 of file PPCISelLowering.cpp.

References llvm::TargetMachine::getRelocationModel(), llvm::TargetMachine::getSubtarget(), llvm::PPCSubtarget::hasLazyResolverStub(), llvm::PPCII::MO_HA, llvm::PPCII::MO_LO, llvm::PPCII::MO_NLP_FLAG, llvm::PPCII::MO_NLP_HIDDEN_FLAG, llvm::PPCII::MO_PIC_FLAG, and llvm::Reloc::PIC_.

static void getMaxByValAlign ( Type Ty,
unsigned MaxAlign,
unsigned  MaxMaxAlign 
)
static

getMaxByValAlign - Helper for getByValTypeAlignment to determine the desired ByVal argument alignment.

Definition at line 583 of file PPCISelLowering.cpp.

Referenced by llvm::PPCTargetLowering::getByValTypeAlignment().

static SDNode* isBLACompatibleAddress ( SDValue  Op,
SelectionDAG DAG 
)
static

isCallCompatibleAddress - Return the immediate to use if the specified 32-bit value is representable in the immediate field of a BxA instruction.

Definition at line 2987 of file PPCISelLowering.cpp.

References llvm::dyn_cast(), llvm::SelectionDAG::getConstant(), llvm::TargetLoweringBase::getPointerTy(), llvm::SelectionDAG::getTargetLoweringInfo(), and llvm::ConstantSDNode::getZExtValue().

Referenced by PrepareCall().

static bool isConsecutiveLS ( LSBaseSDNode LS,
LSBaseSDNode Base,
unsigned  Bytes,
int  Dist,
SelectionDAG DAG 
)
static
static bool isConstantOrUndef ( int  Op,
int  Val 
)
static

isConstantOrUndef - Op is either an undef node or a ConstantSDNode. Return true if Op is undef or if it matches the specified value.

Definition at line 714 of file PPCISelLowering.cpp.

Referenced by isVMerge(), llvm::PPC::isVPKUHUMShuffleMask(), llvm::PPC::isVPKUWUMShuffleMask(), and llvm::PPC::isVSLDOIShuffleMask().

static bool isFloatingPointZero ( SDValue  Op)
static

isFloatingPointZero - Return true if this is 0.0 or -0.0.

Definition at line 700 of file PPCISelLowering.cpp.

References llvm::SDValue::getNode(), llvm::SDValue::getOperand(), llvm::ISD::isEXTLoad(), and llvm::ISD::isNON_EXTLoad().

static bool isIntS16Immediate ( SDNode N,
short &  Imm 
)
static

isIntS16Immediate - This method tests to see if the node is either a 32-bit or 64-bit immediate, and if the value can be accurately represented as a sign extension from a 16-bit value. If so, this returns true and the immediate.

Definition at line 1001 of file PPCISelLowering.cpp.

References llvm::ISD::Constant, llvm::SDNode::getOpcode(), llvm::SDNode::getValueType(), llvm::MVT::i32, and N.

Referenced by isIntS16Immediate(), llvm::PPCTargetLowering::SelectAddressRegImm(), and llvm::PPCTargetLowering::SelectAddressRegReg().

static bool isIntS16Immediate ( SDValue  Op,
short &  Imm 
)
static

Definition at line 1011 of file PPCISelLowering.cpp.

References llvm::SDValue::getNode(), and isIntS16Immediate().

static bool isLocalCall ( const SDValue Callee)
static

Definition at line 3365 of file PPCISelLowering.cpp.

References G.

static bool isVMerge ( ShuffleVectorSDNode N,
unsigned  UnitSize,
unsigned  LHSStart,
unsigned  RHSStart 
)
static

isVMerge - Common function, used to match vmrg* shuffles.

Definition at line 755 of file PPCISelLowering.cpp.

References llvm::ShuffleVectorSDNode::getMaskElt(), llvm::SDNode::getValueType(), isConstantOrUndef(), and llvm::MVT::v16i8.

Referenced by llvm::PPC::isVMRGHShuffleMask(), and llvm::PPC::isVMRGLShuffleMask().

static SDValue LowerLabelRef ( SDValue  HiPart,
SDValue  LoPart,
bool  isPIC,
SelectionDAG DAG 
)
static
static void LowerMemOpCallTo ( SelectionDAG DAG,
MachineFunction MF,
SDValue  Chain,
SDValue  Arg,
SDValue  PtrOff,
int  SPDiff,
unsigned  ArgOffset,
bool  isPPC64,
bool  isTailCall,
bool  isVector,
SmallVectorImpl< SDValue > &  MemOpChains,
SmallVectorImpl< TailCallArgumentInfo > &  TailCallArguments,
SDLoc  dl 
)
static
static unsigned PrepareCall ( SelectionDAG DAG,
SDValue Callee,
SDValue InFlag,
SDValue Chain,
SDLoc  dl,
int  SPDiff,
bool  isTailCall,
SmallVectorImpl< std::pair< unsigned, SDValue > > &  RegsToPass,
SmallVectorImpl< SDValue > &  Ops,
std::vector< EVT > &  NodeTys,
const PPCSubtarget PPCSubTarget 
)
static
static void PrepareTailCall ( SelectionDAG DAG,
SDValue InFlag,
SDValue Chain,
SDLoc  dl,
bool  isPPC64,
int  SPDiff,
unsigned  NumBytes,
SDValue  LROp,
SDValue  FPOp,
bool  isDarwinABI,
SmallVectorImpl< TailCallArgumentInfo > &  TailCallArguments 
)
static
static void StoreTailCallArgumentsToStackSlot ( SelectionDAG DAG,
SDValue  Chain,
const SmallVectorImpl< TailCallArgumentInfo > &  TailCallArgs,
SmallVectorImpl< SDValue > &  MemOpChains,
SDLoc  dl 
)
static

Variable Documentation

cl::opt<bool> DisableILPPref("disable-ppc-ilp-pref", cl::desc("disable setting the node scheduling preference to ILP on PPC"), cl::Hidden)
static
cl::opt<bool> DisablePPCPreinc("disable-ppc-preinc", cl::desc("disable preincrement load/store generation on PPC"), cl::Hidden)
static
cl::opt<bool> DisablePPCUnaligned("disable-ppc-unaligned", cl::desc("disable unaligned load/store generation on PPC"), cl::Hidden)
static