LLVM API Documentation

Defines | Typedefs | Enumerations | Functions | Variables
ARMISelLowering.cpp File Reference
#include "ARMISelLowering.h"
#include "ARMCallingConv.h"
#include "ARMConstantPoolValue.h"
#include "ARMMachineFunctionInfo.h"
#include "ARMPerfectShuffle.h"
#include "ARMSubtarget.h"
#include "ARMTargetMachine.h"
#include "ARMTargetObjectFile.h"
#include "MCTargetDesc/ARMAddressingModes.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/CodeGen/CallingConvLower.h"
#include "llvm/CodeGen/IntrinsicLowering.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineJumpTableInfo.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/SelectionDAG.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/Type.h"
#include "llvm/MC/MCSectionMachO.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Target/TargetOptions.h"
#include <utility>
#include "ARMGenCallingConv.inc"
Include dependency graph for ARMISelLowering.cpp:

Go to the source code of this file.

Defines

#define DEBUG_TYPE   "arm-isel"

Typedefs

typedef std::pair< unsigned,
const TargetRegisterClass * > 
RCPair

Enumerations

enum  HABaseType {
  HA_UNKNOWN = 0, HA_FLOAT, HA_DOUBLE, HA_VECT64,
  HA_VECT128
}

Functions

 STATISTIC (NumTailCalls,"Number of tail calls")
 STATISTIC (NumMovwMovt,"Number of GAs materialized with movw + movt")
 STATISTIC (NumLoopByVals,"Number of loops generated for byval arguments")
static TargetLoweringObjectFile * createTLOF (const Triple &TT)
static ARMCC::CondCodes IntCCToARMCC (ISD::CondCode CC)
 IntCCToARMCC - Convert a DAG integer condition code to an ARM CC.
static void FPCCToARMCC (ISD::CondCode CC, ARMCC::CondCodes &CondCode, ARMCC::CondCodes &CondCode2)
 FPCCToARMCC - Convert a DAG fp condition code to an ARM CC.
static bool MatchingStackOffset (SDValue Arg, unsigned Offset, ISD::ArgFlagsTy Flags, MachineFrameInfo *MFI, const MachineRegisterInfo *MRI, const TargetInstrInfo *TII)
static SDValue LowerInterruptReturn (SmallVectorImpl< SDValue > &RetOps, SDLoc DL, SelectionDAG &DAG)
static SDValue LowerConstantPool (SDValue Op, SelectionDAG &DAG)
static SDValue LowerATOMIC_FENCE (SDValue Op, SelectionDAG &DAG, const ARMSubtarget *Subtarget)
static SDValue LowerPREFETCH (SDValue Op, SelectionDAG &DAG, const ARMSubtarget *Subtarget)
static SDValue LowerVASTART (SDValue Op, SelectionDAG &DAG)
static bool isFloatingPointZero (SDValue Op)
 isFloatingPointZero - Return true if this is +0.0.
static ISD::CondCode getInverseCCForVSEL (ISD::CondCode CC)
static void checkVSELConstraints (ISD::CondCode CC, ARMCC::CondCodes &CondCode, bool &swpCmpOps, bool &swpVselOps)
static bool canChangeToInt (SDValue Op, bool &SeenZero, const ARMSubtarget *Subtarget)
static SDValue bitcastf32Toi32 (SDValue Op, SelectionDAG &DAG)
static void expandf64Toi32 (SDValue Op, SelectionDAG &DAG, SDValue &RetVal1, SDValue &RetVal2)
static SDValue LowerVectorFP_TO_INT (SDValue Op, SelectionDAG &DAG)
static SDValue LowerVectorINT_TO_FP (SDValue Op, SelectionDAG &DAG)
static SDValue ExpandBITCAST (SDNode *N, SelectionDAG &DAG)
static SDValue getZeroVector (EVT VT, SelectionDAG &DAG, SDLoc dl)
static SDValue LowerCTTZ (SDNode *N, SelectionDAG &DAG, const ARMSubtarget *ST)
static SDValue getCTPOP16BitCounts (SDNode *N, SelectionDAG &DAG)
static SDValue lowerCTPOP16BitElements (SDNode *N, SelectionDAG &DAG)
static SDValue lowerCTPOP32BitElements (SDNode *N, SelectionDAG &DAG)
static SDValue LowerCTPOP (SDNode *N, SelectionDAG &DAG, const ARMSubtarget *ST)
static SDValue LowerShift (SDNode *N, SelectionDAG &DAG, const ARMSubtarget *ST)
static SDValue Expand64BitShift (SDNode *N, SelectionDAG &DAG, const ARMSubtarget *ST)
static SDValue LowerVSETCC (SDValue Op, SelectionDAG &DAG)
static SDValue isNEONModifiedImm (uint64_t SplatBits, uint64_t SplatUndef, unsigned SplatBitSize, SelectionDAG &DAG, EVT &VT, bool is128Bits, NEONModImmType type)
static bool isSingletonVEXTMask (ArrayRef< int > M, EVT VT, unsigned &Imm)
static bool isVEXTMask (ArrayRef< int > M, EVT VT, bool &ReverseVEXT, unsigned &Imm)
static bool isVREVMask (ArrayRef< int > M, EVT VT, unsigned BlockSize)
static bool isVTBLMask (ArrayRef< int > M, EVT VT)
static bool isVTRNMask (ArrayRef< int > M, EVT VT, unsigned &WhichResult)
static bool isVTRN_v_undef_Mask (ArrayRef< int > M, EVT VT, unsigned &WhichResult)
static bool isVUZPMask (ArrayRef< int > M, EVT VT, unsigned &WhichResult)
static bool isVUZP_v_undef_Mask (ArrayRef< int > M, EVT VT, unsigned &WhichResult)
static bool isVZIPMask (ArrayRef< int > M, EVT VT, unsigned &WhichResult)
static bool isVZIP_v_undef_Mask (ArrayRef< int > M, EVT VT, unsigned &WhichResult)
static bool isReverseMask (ArrayRef< int > M, EVT VT)
static SDValue IsSingleInstrConstant (SDValue N, SelectionDAG &DAG, const ARMSubtarget *ST, SDLoc dl)
static SDValue GeneratePerfectShuffle (unsigned PFEntry, SDValue LHS, SDValue RHS, SelectionDAG &DAG, SDLoc dl)
static SDValue LowerVECTOR_SHUFFLEv8i8 (SDValue Op, ArrayRef< int > ShuffleMask, SelectionDAG &DAG)
static SDValue LowerReverse_VECTOR_SHUFFLEv16i8_v8i16 (SDValue Op, SelectionDAG &DAG)
static SDValue LowerVECTOR_SHUFFLE (SDValue Op, SelectionDAG &DAG)
static SDValue LowerINSERT_VECTOR_ELT (SDValue Op, SelectionDAG &DAG)
static SDValue LowerEXTRACT_VECTOR_ELT (SDValue Op, SelectionDAG &DAG)
static SDValue LowerCONCAT_VECTORS (SDValue Op, SelectionDAG &DAG)
static bool isExtendedBUILD_VECTOR (SDNode *N, SelectionDAG &DAG, bool isSigned)
static bool isSignExtended (SDNode *N, SelectionDAG &DAG)
static bool isZeroExtended (SDNode *N, SelectionDAG &DAG)
static EVT getExtensionTo64Bits (const EVT &OrigVT)
static SDValue AddRequiredExtensionForVMULL (SDValue N, SelectionDAG &DAG, const EVT &OrigTy, const EVT &ExtTy, unsigned ExtOpcode)
static SDValue SkipLoadExtensionForVMULL (LoadSDNode *LD, SelectionDAG &DAG)
static SDValue SkipExtensionForVMULL (SDNode *N, SelectionDAG &DAG)
static bool isAddSubSExt (SDNode *N, SelectionDAG &DAG)
static bool isAddSubZExt (SDNode *N, SelectionDAG &DAG)
static SDValue LowerMUL (SDValue Op, SelectionDAG &DAG)
static SDValue LowerSDIV_v4i8 (SDValue X, SDValue Y, SDLoc dl, SelectionDAG &DAG)
static SDValue LowerSDIV_v4i16 (SDValue N0, SDValue N1, SDLoc dl, SelectionDAG &DAG)
static SDValue LowerSDIV (SDValue Op, SelectionDAG &DAG)
static SDValue LowerUDIV (SDValue Op, SelectionDAG &DAG)
static SDValue LowerADDC_ADDE_SUBC_SUBE (SDValue Op, SelectionDAG &DAG)
static SDValue LowerAtomicLoadStore (SDValue Op, SelectionDAG &DAG)
static void ReplaceREADCYCLECOUNTER (SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG, const ARMSubtarget *Subtarget)
static MachineBasicBlock * OtherSucc (MachineBasicBlock *MBB, MachineBasicBlock *Succ)
static unsigned getLdOpcode (unsigned LdSize, bool IsThumb1, bool IsThumb2)
static unsigned getStOpcode (unsigned StSize, bool IsThumb1, bool IsThumb2)
static void emitPostLd (MachineBasicBlock *BB, MachineInstr *Pos, const TargetInstrInfo *TII, DebugLoc dl, unsigned LdSize, unsigned Data, unsigned AddrIn, unsigned AddrOut, bool IsThumb1, bool IsThumb2)
static void emitPostSt (MachineBasicBlock *BB, MachineInstr *Pos, const TargetInstrInfo *TII, DebugLoc dl, unsigned StSize, unsigned Data, unsigned AddrIn, unsigned AddrOut, bool IsThumb1, bool IsThumb2)
static bool isZeroOrAllOnes (SDValue N, bool AllOnes)
static bool isConditionalZeroOrAllOnes (SDNode *N, bool AllOnes, SDValue &CC, bool &Invert, SDValue &OtherOp, SelectionDAG &DAG)
static SDValue combineSelectAndUse (SDNode *N, SDValue Slct, SDValue OtherOp, TargetLowering::DAGCombinerInfo &DCI, bool AllOnes=false)
static SDValue combineSelectAndUseCommutative (SDNode *N, bool AllOnes, TargetLowering::DAGCombinerInfo &DCI)
static SDValue AddCombineToVPADDL (SDNode *N, SDValue N0, SDValue N1, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
static SDValue findMUL_LOHI (SDValue V)
static SDValue AddCombineTo64bitMLAL (SDNode *AddcNode, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
static SDValue PerformADDCCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
static SDValue PerformADDCombineWithOperands (SDNode *N, SDValue N0, SDValue N1, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
static SDValue PerformADDCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
static SDValue PerformSUBCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
static SDValue PerformVMULCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
static SDValue PerformMULCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
static SDValue PerformANDCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
static SDValue PerformORCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 PerformORCombine - Target-specific dag combine xforms for ISD::OR.
static SDValue PerformXORCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
static SDValue PerformBFICombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
static SDValue PerformVMOVRRDCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
static SDValue PerformVMOVDRRCombine (SDNode *N, SelectionDAG &DAG)
static SDValue PerformSTORECombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
static bool hasNormalLoadOperand (SDNode *N)
static SDValue PerformBUILD_VECTORCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
static SDValue PerformARMBUILD_VECTORCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
 Target-specific dag combine xforms for ARMISD::BUILD_VECTOR.
static SDValue PerformInsertEltCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
static SDValue PerformVECTOR_SHUFFLECombine (SDNode *N, SelectionDAG &DAG)
static SDValue CombineBaseUpdate (SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
static bool CombineVLDDUP (SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
static SDValue PerformVDUPLANECombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
static bool isConstVecPow2 (SDValue ConstVec, bool isSigned, uint64_t &C)
static SDValue PerformVCVTCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
static SDValue PerformVDIVCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
static bool getVShiftImm (SDValue Op, unsigned ElementBits, int64_t &Cnt)
static bool isVShiftLImm (SDValue Op, EVT VT, bool isLong, int64_t &Cnt)
static bool isVShiftRImm (SDValue Op, EVT VT, bool isNarrow, bool isIntrinsic, int64_t &Cnt)
static SDValue PerformIntrinsicCombine (SDNode *N, SelectionDAG &DAG)
 PerformIntrinsicCombine - ARM-specific DAG combining for intrinsics.
static SDValue PerformShiftCombine (SDNode *N, SelectionDAG &DAG, const ARMSubtarget *ST)
static SDValue PerformExtendCombine (SDNode *N, SelectionDAG &DAG, const ARMSubtarget *ST)
static SDValue PerformSELECT_CCCombine (SDNode *N, SelectionDAG &DAG, const ARMSubtarget *ST)
static bool memOpAlign (unsigned DstAlign, unsigned SrcAlign, unsigned AlignCheck)
static bool isLegalT1AddressImmediate (int64_t V, EVT VT)
static bool isLegalT2AddressImmediate (int64_t V, EVT VT, const ARMSubtarget *Subtarget)
static bool isLegalAddressImmediate (int64_t V, EVT VT, const ARMSubtarget *Subtarget)
static bool getARMIndexedAddressParts (SDNode *Ptr, EVT VT, bool isSEXTLoad, SDValue &Base, SDValue &Offset, bool &isInc, SelectionDAG &DAG)
static bool getT2IndexedAddressParts (SDNode *Ptr, EVT VT, bool isSEXTLoad, SDValue &Base, SDValue &Offset, bool &isInc, SelectionDAG &DAG)
static void makeDMB (IRBuilder<> &Builder, ARM_MB::MemBOpt Domain)
static bool isHomogeneousAggregate (Type *Ty, HABaseType &Base, uint64_t &Members)

Variables

cl::opt< bool > EnableARMLongCalls ("arm-long-calls", cl::Hidden, cl::desc("Generate calls via indirect call instructions"), cl::init(false))
static cl::opt< bool > ARMInterworking ("arm-interworking", cl::Hidden, cl::desc("Enable / disable ARM interworking (for debugging only)"), cl::init(true))
static const MCPhysReg GPRArgRegs []

Define Documentation

#define DEBUG_TYPE   "arm-isel"

Definition at line 54 of file ARMISelLowering.cpp.


Typedef Documentation

typedef std::pair<unsigned, const TargetRegisterClass*> RCPair

Definition at line 10517 of file ARMISelLowering.cpp.


Enumeration Type Documentation

enum HABaseType
Enumerator:
HA_UNKNOWN 
HA_FLOAT 
HA_DOUBLE 
HA_VECT64 
HA_VECT128 

Definition at line 11143 of file ARMISelLowering.cpp.


Function Documentation

static SDValue AddCombineTo64bitMLAL ( SDNode *  AddcNode,
TargetLowering::DAGCombinerInfo &  DCI,
const ARMSubtarget *  Subtarget 
) [static]
static SDValue AddCombineToVPADDL ( SDNode *  N,
SDValue  N0,
SDValue  N1,
TargetLowering::DAGCombinerInfo &  DCI,
const ARMSubtarget *  Subtarget 
) [static]
static SDValue AddRequiredExtensionForVMULL ( SDValue  N,
SelectionDAG &  DAG,
const EVT &  OrigTy,
const EVT &  ExtTy,
unsigned  ExtOpcode 
) [static]

AddRequiredExtensionForVMULL - Add a sign/zero extension to extend the total value size to 64 bits. We need a 64-bit D register as an operand to VMULL. We insert the required extension here to get the vector to fill a D register.

Definition at line 5875 of file ARMISelLowering.cpp.

References getExtensionTo64Bits(), llvm::SelectionDAG::getNode(), llvm::EVT::getSizeInBits(), and llvm::EVT::is128BitVector().

Referenced by SkipExtensionForVMULL().

static SDValue bitcastf32Toi32 ( SDValue  Op,
SelectionDAG &  DAG 
) [static]
static bool canChangeToInt ( SDValue  Op,
bool &  SeenZero,
const ARMSubtarget *  Subtarget 
) [static]

canChangeToInt - Given the fp compare operand, return true if it is suitable to morph to an integer compare sequence.

Definition at line 3644 of file ARMISelLowering.cpp.

References llvm::MVT::f32, llvm::SDValue::getNode(), llvm::SDNode::getNumValues(), llvm::SDValue::getValueType(), llvm::SDNode::hasOneUse(), isFloatingPointZero(), llvm::ARMSubtarget::isFPBrccSlow(), and llvm::ISD::isNormalLoad().

static void checkVSELConstraints ( ISD::CondCode  CC,
ARMCC::CondCodes &  CondCode,
bool &  swpCmpOps,
bool &  swpVselOps 
) [static]
static SDValue CombineBaseUpdate ( SDNode *  N,
TargetLowering::DAGCombinerInfo &  DCI 
) [static]

CombineBaseUpdate - Target-specific DAG combine function for VLDDUP and NEON load/store intrinsics to merge base address updates.

Definition at line 9002 of file ARMISelLowering.cpp.

References llvm::ISD::ADD, llvm::TargetLowering::DAGCombinerInfo::CombineTo(), llvm::TargetLowering::DAGCombinerInfo::DAG, llvm::SelectionDAG::getMemIntrinsicNode(), llvm::MemSDNode::getMemOperand(), llvm::MemSDNode::getMemoryVT(), llvm::SDValue::getNode(), llvm::SDNode::getNumOperands(), llvm::SDNode::getOpcode(), llvm::SDNode::getOperand(), llvm::SDValue::getResNo(), llvm::EVT::getSizeInBits(), llvm::SDValue::getValueType(), llvm::SDNode::getValueType(), llvm::EVT::getVectorNumElements(), llvm::SelectionDAG::getVTList(), llvm::ISD::INTRINSIC_VOID, llvm::ISD::INTRINSIC_W_CHAIN, llvm::TargetLowering::DAGCombinerInfo::isBeforeLegalize(), llvm::TargetLowering::DAGCombinerInfo::isCalledByLegalizer(), llvm::SDNode::isPredecessorOf(), llvm_unreachable, llvm::makeArrayRef(), llvm::MVT::Other, llvm::SmallVectorTemplateBase< T, isPodLike >::push_back(), llvm::SDNode::use_begin(), llvm::SDNode::use_end(), llvm::ARMISD::VLD1_UPD, llvm::ARMISD::VLD2_UPD, llvm::ARMISD::VLD2DUP, llvm::ARMISD::VLD2DUP_UPD, llvm::ARMISD::VLD2LN_UPD, llvm::ARMISD::VLD3_UPD, llvm::ARMISD::VLD3DUP, llvm::ARMISD::VLD3DUP_UPD, llvm::ARMISD::VLD3LN_UPD, llvm::ARMISD::VLD4_UPD, llvm::ARMISD::VLD4DUP, llvm::ARMISD::VLD4DUP_UPD, llvm::ARMISD::VLD4LN_UPD, llvm::ARMISD::VST1_UPD, llvm::ARMISD::VST2_UPD, llvm::ARMISD::VST2LN_UPD, llvm::ARMISD::VST3_UPD, llvm::ARMISD::VST3LN_UPD, llvm::ARMISD::VST4_UPD, and llvm::ARMISD::VST4LN_UPD.

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

static SDValue combineSelectAndUse ( SDNode *  N,
SDValue  Slct,
SDValue  OtherOp,
TargetLowering::DAGCombinerInfo &  DCI,
bool  AllOnes = false 
) [static]
static SDValue combineSelectAndUseCommutative ( SDNode *  N,
bool  AllOnes,
TargetLowering::DAGCombinerInfo &  DCI 
) [static]
static bool CombineVLDDUP ( SDNode *  N,
TargetLowering::DAGCombinerInfo &  DCI 
) [static]
static TargetLoweringObjectFile* createTLOF ( const Triple &  TT) [static]
static void emitPostLd ( MachineBasicBlock *  BB,
MachineInstr *  Pos,
const TargetInstrInfo *  TII,
DebugLoc  dl,
unsigned  LdSize,
unsigned  Data,
unsigned  AddrIn,
unsigned  AddrOut,
bool  IsThumb1,
bool  IsThumb2 
) [static]

Emit a post-increment load operation with given size. The instructions will be added to BB at Pos.

Definition at line 7041 of file ARMISelLowering.cpp.

References llvm::AddDefaultPred(), llvm::AddDefaultT1CC(), llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addReg(), llvm::BuildMI(), llvm::RegState::Define, llvm::MCInstrInfo::get(), and getLdOpcode().

static void emitPostSt ( MachineBasicBlock *  BB,
MachineInstr *  Pos,
const TargetInstrInfo *  TII,
DebugLoc  dl,
unsigned  StSize,
unsigned  Data,
unsigned  AddrIn,
unsigned  AddrOut,
bool  IsThumb1,
bool  IsThumb2 
) [static]

Emit a post-increment store operation with given size. The instructions will be added to BB at Pos.

Definition at line 7073 of file ARMISelLowering.cpp.

References llvm::AddDefaultPred(), llvm::AddDefaultT1CC(), llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addReg(), llvm::BuildMI(), llvm::MCInstrInfo::get(), and getStOpcode().

static SDValue Expand64BitShift ( SDNode *  N,
SelectionDAG &  DAG,
const ARMSubtarget *  ST 
) [static]
static SDValue ExpandBITCAST ( SDNode *  N,
SelectionDAG &  DAG 
) [static]

ExpandBITCAST - If the target supports VFP, this function is called to expand a bit convert where either the source or destination type is i64 to use a VMOVDRR or VMOVRRD node. This should not be done when the non-i64 operand type is illegal (e.g., v2f32 for a target that doesn't support vectors), since the legalizer won't know what to do with that.

Definition at line 4116 of file ARMISelLowering.cpp.

References llvm::ISD::BITCAST, llvm::ISD::BUILD_PAIR, llvm::ISD::EXTRACT_ELEMENT, llvm::MVT::f64, llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getNode(), llvm::SDNode::getOperand(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::SDValue::getValue(), llvm::SDValue::getValueType(), llvm::SDNode::getValueType(), llvm::EVT::getVectorNumElements(), llvm::SelectionDAG::getVTList(), llvm::MVT::i64, llvm::TargetLoweringBase::isBigEndian(), llvm::TargetLoweringBase::isTypeLegal(), llvm::EVT::isVector(), llvm::ARMISD::VMOVDRR, llvm::ARMISD::VMOVRRD, and llvm::ARMISD::VREV64.

Referenced by llvm::ARMTargetLowering::LowerOperation(), and llvm::ARMTargetLowering::ReplaceNodeResults().

static void expandf64Toi32 ( SDValue  Op,
SelectionDAG &  DAG,
SDValue &  RetVal1,
SDValue &  RetVal2 
) [static]
static SDValue findMUL_LOHI ( SDValue  V) [static]
static void FPCCToARMCC ( ISD::CondCode  CC,
ARMCC::CondCodes &  CondCode,
ARMCC::CondCodes &  CondCode2 
) [static]
static SDValue GeneratePerfectShuffle ( unsigned  PFEntry,
SDValue  LHS,
SDValue  RHS,
SelectionDAG &  DAG,
SDLoc  dl 
) [static]
static bool getARMIndexedAddressParts ( SDNode *  Ptr,
EVT  VT,
bool  isSEXTLoad,
SDValue &  Base,
SDValue &  Offset,
bool &  isInc,
SelectionDAG &  DAG 
) [static]
static SDValue getCTPOP16BitCounts ( SDNode *  N,
SelectionDAG &  DAG 
) [static]

getCTPOP16BitCounts - Returns a v8i8/v16i8 vector containing the bit-count for each 16-bit element from operand, repeated. The basic idea is to leverage vcnt to get the 8-bit counts, gather and add the results.

Trace for v4i16: input = [v0 v1 v2 v3 ] (vi 16-bit element) cast: N0 = [w0 w1 w2 w3 w4 w5 w6 w7] (v0 = [w0 w1], wi 8-bit element) vcnt: N1 = [b0 b1 b2 b3 b4 b5 b6 b7] (bi = bit-count of 8-bit element wi) vrev: N2 = [b1 b0 b3 b2 b5 b4 b7 b6] [b0 b1 b2 b3 b4 b5 b6 b7] +[b1 b0 b3 b2 b5 b4 b7 b6] N3=N1+N2 = [k0 k0 k1 k1 k2 k2 k3 k3] (k0 = b0+b1 = bit-count of 16-bit v0, vuzp: = [k0 k1 k2 k3 k0 k1 k2 k3] each ki is 8-bits)

Definition at line 4284 of file ARMISelLowering.cpp.

References llvm::ISD::ADD, llvm::ISD::BITCAST, llvm::ISD::CTPOP, llvm::SelectionDAG::getNode(), llvm::SDNode::getOperand(), llvm::SDNode::getValueType(), llvm::EVT::is64BitVector(), llvm::MVT::v16i8, llvm::MVT::v8i8, llvm::ARMISD::VREV16, and llvm::ARMISD::VUZP.

Referenced by lowerCTPOP16BitElements().

static EVT getExtensionTo64Bits ( const EVT &  OrigVT) [static]
static unsigned getLdOpcode ( unsigned  LdSize,
bool  IsThumb1,
bool  IsThumb2 
) [static]

Return the load opcode for a given load size. If load size >= 8, neon opcode will be returned.

Definition at line 7003 of file ARMISelLowering.cpp.

Referenced by emitPostLd().

static unsigned getStOpcode ( unsigned  StSize,
bool  IsThumb1,
bool  IsThumb2 
) [static]

Return the store opcode for a given store size. If store size >= 8, neon opcode will be returned.

Definition at line 7022 of file ARMISelLowering.cpp.

Referenced by emitPostSt().

static bool getT2IndexedAddressParts ( SDNode *  Ptr,
EVT  VT,
bool  isSEXTLoad,
SDValue &  Base,
SDValue &  Offset,
bool &  isInc,
SelectionDAG &  DAG 
) [static]
static bool getVShiftImm ( SDValue  Op,
unsigned  ElementBits,
int64_t &  Cnt 
) [static]

Getvshiftimm - Check if this is a valid build_vector for the immediate operand of a vector shift operation, where all the elements of the build_vector must have the same constant integer value.

Definition at line 9376 of file ARMISelLowering.cpp.

References llvm::ISD::BITCAST, llvm::dyn_cast(), llvm::SDValue::getNode(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), and llvm::BuildVectorSDNode::isConstantSplat().

Referenced by isVShiftLImm(), and isVShiftRImm().

static SDValue getZeroVector ( EVT  VT,
SelectionDAG &  DAG,
SDLoc  dl 
) [static]

getZeroVector - Returns a vector of specified type with all zero elements. Zero vectors are used to represent vector negation and in those cases will be implemented with the NEON VNEG instruction. However, VNEG does not support i64 elements, so sometimes the zero vectors will need to be explicitly constructed. Regardless, use a canonical VMOV to create the zero vector.

Definition at line 4162 of file ARMISelLowering.cpp.

References llvm::ISD::BITCAST, llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getTargetConstant(), llvm::EVT::is128BitVector(), llvm::EVT::isVector(), llvm::MVT::v2i32, llvm::MVT::v4i32, and llvm::ARMISD::VMOVIMM.

Referenced by LowerShift().

static bool hasNormalLoadOperand ( SDNode *  N) [static]

hasNormalLoadOperand - Check if any of the operands of a BUILD_VECTOR node are normal, non-volatile loads. If so, it is profitable to bitcast an i64 vector to have f64 elements, since the value can then be loaded directly into a VFP register.

Definition at line 8784 of file ARMISelLowering.cpp.

References llvm::SDValue::getNode(), llvm::SDNode::getOperand(), llvm::SDNode::getValueType(), llvm::EVT::getVectorNumElements(), and llvm::ISD::isNormalLoad().

Referenced by PerformBUILD_VECTORCombine().

static ARMCC::CondCodes IntCCToARMCC ( ISD::CondCode  CC) [static]
static bool isAddSubSExt ( SDNode *  N,
SelectionDAG &  DAG 
) [static]
static bool isAddSubZExt ( SDNode *  N,
SelectionDAG &  DAG 
) [static]
static bool isConditionalZeroOrAllOnes ( SDNode *  N,
bool  AllOnes,
SDValue &  CC,
bool &  Invert,
SDValue &  OtherOp,
SelectionDAG &  DAG 
) [static]
static bool isConstVecPow2 ( SDValue  ConstVec,
bool  isSigned,
uint64_t &  C 
) [static]
static bool isExtendedBUILD_VECTOR ( SDNode *  N,
SelectionDAG &  DAG,
bool  isSigned 
) [static]
static bool isFloatingPointZero ( SDValue  Op) [static]
static bool isHomogeneousAggregate ( Type *  Ty,
HABaseType &  Base,
uint64_t &  Members 
) [static]
static bool isLegalAddressImmediate ( int64_t  V,
EVT  VT,
const ARMSubtarget *  Subtarget 
) [static]

isLegalAddressImmediate - Return true if the integer value can be used as the offset of the target addressing mode for load / store of the given type.

Definition at line 10041 of file ARMISelLowering.cpp.

References llvm::MVT::f32, llvm::MVT::f64, llvm::EVT::getSimpleVT(), llvm::ARMSubtarget::hasVFP2(), llvm::MVT::i1, llvm::MVT::i16, llvm::MVT::i8, isLegalT1AddressImmediate(), isLegalT2AddressImmediate(), llvm::EVT::isSimple(), llvm::ARMSubtarget::isThumb1Only(), llvm::ARMSubtarget::isThumb2(), and llvm::MVT::SimpleTy.

Referenced by llvm::ARMTargetLowering::isLegalAddressingMode().

static bool isLegalT1AddressImmediate ( int64_t  V,
EVT  VT 
) [static]
static bool isLegalT2AddressImmediate ( int64_t  V,
EVT  VT,
const ARMSubtarget *  Subtarget 
) [static]
static SDValue isNEONModifiedImm ( uint64_t  SplatBits,
uint64_t  SplatUndef,
unsigned  SplatBitSize,
SelectionDAG &  DAG,
EVT &  VT,
bool  is128Bits,
NEONModImmType  type 
) [static]

isNEONModifiedImm - Check if the specified splat value corresponds to a valid vector constant for a NEON instruction with a "modified immediate" operand (e.g., VMOV). If so, return the encoded value.

Definition at line 4586 of file ARMISelLowering.cpp.

References llvm::ARM_AM::createNEONModImm(), llvm::SelectionDAG::getTargetConstant(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::X86II::ImmMask, llvm::TargetLoweringBase::isBigEndian(), llvm_unreachable, llvm::OtherModImm, llvm::MVT::v16i8, llvm::MVT::v1i64, llvm::MVT::v2i32, llvm::MVT::v2i64, llvm::MVT::v4i16, llvm::MVT::v4i32, llvm::MVT::v8i16, llvm::MVT::v8i8, and llvm::VMOVModImm.

Referenced by PerformANDCombine(), and PerformORCombine().

static bool isReverseMask ( ArrayRef< int >  M,
EVT  VT 
) [static]
Returns:
true if this is a reverse operation on an vector.

Definition at line 5037 of file ARMISelLowering.cpp.

References llvm::EVT::getVectorNumElements(), and llvm::ArrayRef< T >::size().

Referenced by llvm::ARMTargetLowering::isShuffleMaskLegal(), and LowerVECTOR_SHUFFLE().

static bool isSignExtended ( SDNode *  N,
SelectionDAG &  DAG 
) [static]

isSignExtended - Check if a node is a vector value that is sign-extended or a constant BUILD_VECTOR with sign-extended elements.

Definition at line 5837 of file ARMISelLowering.cpp.

References llvm::SDNode::getOpcode(), isExtendedBUILD_VECTOR(), llvm::ISD::isSEXTLoad(), and llvm::ISD::SIGN_EXTEND.

Referenced by isAddSubSExt(), and LowerMUL().

static SDValue IsSingleInstrConstant ( SDValue  N,
SelectionDAG &  DAG,
const ARMSubtarget *  ST,
SDLoc  dl 
) [static]
static bool isSingletonVEXTMask ( ArrayRef< int >  M,
EVT  VT,
unsigned &  Imm 
) [static]

Definition at line 4808 of file ARMISelLowering.cpp.

References llvm::EVT::getVectorNumElements().

Referenced by LowerVECTOR_SHUFFLE().

static bool isVEXTMask ( ArrayRef< int >  M,
EVT  VT,
bool &  ReverseVEXT,
unsigned &  Imm 
) [static]
static bool isVREVMask ( ArrayRef< int >  M,
EVT  VT,
unsigned  BlockSize 
) [static]

isVREVMask - Check if a vector shuffle corresponds to a VREV instruction with the specified blocksize. (The order of the elements within each block of the vector is reversed.)

Definition at line 4876 of file ARMISelLowering.cpp.

References llvm::EVT::getSizeInBits(), llvm::EVT::getVectorElementType(), and llvm::EVT::getVectorNumElements().

Referenced by llvm::ARMTargetLowering::isShuffleMaskLegal(), and LowerVECTOR_SHUFFLE().

static bool isVShiftLImm ( SDValue  Op,
EVT  VT,
bool  isLong,
int64_t &  Cnt 
) [static]

isVShiftLImm - Check if this is a valid build_vector for the immediate operand of a vector shift left operation. That value must be in the range: 0 <= Value < ElementBits for a left shift; or 0 <= Value <= ElementBits for a long left shift.

Definition at line 9396 of file ARMISelLowering.cpp.

References llvm::EVT::getSizeInBits(), llvm::EVT::getVectorElementType(), getVShiftImm(), and llvm::EVT::isVector().

Referenced by PerformIntrinsicCombine(), and PerformShiftCombine().

static bool isVShiftRImm ( SDValue  Op,
EVT  VT,
bool  isNarrow,
bool  isIntrinsic,
int64_t &  Cnt 
) [static]

isVShiftRImm - Check if this is a valid build_vector for the immediate operand of a vector shift right operation. For a shift opcode, the value is positive, but for an intrinsic the value count must be negative. The absolute value must be in the range: 1 <= |Value| <= ElementBits for a right shift; or 1 <= |Value| <= ElementBits/2 for a narrow right shift.

Definition at line 9410 of file ARMISelLowering.cpp.

References llvm::EVT::getSizeInBits(), llvm::EVT::getVectorElementType(), getVShiftImm(), and llvm::EVT::isVector().

Referenced by PerformIntrinsicCombine(), and PerformShiftCombine().

static bool isVTBLMask ( ArrayRef< int >  M,
EVT  VT 
) [static]
static bool isVTRN_v_undef_Mask ( ArrayRef< int >  M,
EVT  VT,
unsigned &  WhichResult 
) [static]

isVTRN_v_undef_Mask - Special case of isVTRNMask for canonical form of "vector_shuffle v, v", i.e., "vector_shuffle v, undef". Mask is e.g., <0, 0, 2, 2> instead of <0, 4, 2, 6>.

Definition at line 4927 of file ARMISelLowering.cpp.

References llvm::EVT::getSizeInBits(), llvm::EVT::getVectorElementType(), and llvm::EVT::getVectorNumElements().

Referenced by llvm::ARMTargetLowering::isShuffleMaskLegal(), and LowerVECTOR_SHUFFLE().

static bool isVTRNMask ( ArrayRef< int >  M,
EVT  VT,
unsigned &  WhichResult 
) [static]
static bool isVUZP_v_undef_Mask ( ArrayRef< int >  M,
EVT  VT,
unsigned &  WhichResult 
) [static]

isVUZP_v_undef_Mask - Special case of isVUZPMask for canonical form of "vector_shuffle v, v", i.e., "vector_shuffle v, undef". Mask is e.g., <0, 2, 0, 2> instead of <0, 2, 4, 6>,

Definition at line 4965 of file ARMISelLowering.cpp.

References llvm::EVT::getSizeInBits(), llvm::EVT::getVectorElementType(), llvm::EVT::getVectorNumElements(), and llvm::EVT::is64BitVector().

Referenced by llvm::ARMTargetLowering::isShuffleMaskLegal(), and LowerVECTOR_SHUFFLE().

static bool isVUZPMask ( ArrayRef< int >  M,
EVT  VT,
unsigned &  WhichResult 
) [static]
static bool isVZIP_v_undef_Mask ( ArrayRef< int >  M,
EVT  VT,
unsigned &  WhichResult 
) [static]

isVZIP_v_undef_Mask - Special case of isVZIPMask for canonical form of "vector_shuffle v, v", i.e., "vector_shuffle v, undef". Mask is e.g., <0, 0, 1, 1> instead of <0, 4, 1, 5>.

Definition at line 5014 of file ARMISelLowering.cpp.

References llvm::EVT::getSizeInBits(), llvm::EVT::getVectorElementType(), llvm::EVT::getVectorNumElements(), and llvm::EVT::is64BitVector().

Referenced by llvm::ARMTargetLowering::isShuffleMaskLegal(), and LowerVECTOR_SHUFFLE().

static bool isVZIPMask ( ArrayRef< int >  M,
EVT  VT,
unsigned &  WhichResult 
) [static]
static bool isZeroExtended ( SDNode *  N,
SelectionDAG &  DAG 
) [static]

isZeroExtended - Check if a node is a vector value that is zero-extended or a constant BUILD_VECTOR with zero-extended elements.

Definition at line 5847 of file ARMISelLowering.cpp.

References llvm::SDNode::getOpcode(), isExtendedBUILD_VECTOR(), llvm::ISD::isZEXTLoad(), and llvm::ISD::ZERO_EXTEND.

Referenced by isAddSubZExt(), and LowerMUL().

static bool isZeroOrAllOnes ( SDValue  N,
bool  AllOnes 
) [inline, static]
static SDValue LowerADDC_ADDE_SUBC_SUBE ( SDValue  Op,
SelectionDAG &  DAG 
) [static]
static SDValue LowerATOMIC_FENCE ( SDValue  Op,
SelectionDAG &  DAG,
const ARMSubtarget *  Subtarget 
) [static]
static SDValue LowerAtomicLoadStore ( SDValue  Op,
SelectionDAG &  DAG 
) [static]

Definition at line 6317 of file ARMISelLowering.cpp.

References llvm::Monotonic.

Referenced by llvm::ARMTargetLowering::LowerOperation().

static SDValue LowerCONCAT_VECTORS ( SDValue  Op,
SelectionDAG &  DAG 
) [static]
static SDValue LowerConstantPool ( SDValue  Op,
SelectionDAG &  DAG 
) [static]
static SDValue LowerCTPOP ( SDNode *  N,
SelectionDAG &  DAG,
const ARMSubtarget *  ST 
) [static]
static SDValue lowerCTPOP16BitElements ( SDNode *  N,
SelectionDAG &  DAG 
) [static]

lowerCTPOP16BitElements - Returns a v4i16/v8i16 vector containing the bit-count for each 16-bit element from the operand. We need slightly different sequencing for v4i16 and v8i16 to stay within NEON's available 64/128-bit registers.

Trace for v4i16: input = [v0 v1 v2 v3 ] (vi 16-bit element) v8i8: BitCounts = [k0 k1 k2 k3 k0 k1 k2 k3 ] (ki is the bit-count of vi) v8i16:Extended = [k0 k1 k2 k3 k0 k1 k2 k3 ] v4i16:Extracted = [k0 k1 k2 k3 ]

Definition at line 4306 of file ARMISelLowering.cpp.

References llvm::ISD::EXTRACT_SUBVECTOR, getCTPOP16BitCounts(), llvm::SelectionDAG::getIntPtrConstant(), llvm::SelectionDAG::getNode(), llvm::SDNode::getValueType(), llvm::EVT::is64BitVector(), llvm::MVT::v4i16, llvm::MVT::v8i16, llvm::MVT::v8i8, and llvm::ISD::ZERO_EXTEND.

Referenced by LowerCTPOP(), and lowerCTPOP32BitElements().

static SDValue lowerCTPOP32BitElements ( SDNode *  N,
SelectionDAG &  DAG 
) [static]

lowerCTPOP32BitElements - Returns a v2i32/v4i32 vector containing the bit-count for each 32-bit element from the operand. The idea here is to split the vector into 16-bit elements, leverage the 16-bit count routine, and then combine the results.

Trace for v2i32 (v4i32 similar with Extracted/Extended exchanged): input = [v0 v1 ] (vi: 32-bit elements) Bitcast = [w0 w1 w2 w3 ] (wi: 16-bit elements, v0 = [w0 w1]) Counts16 = [k0 k1 k2 k3 ] (ki: 16-bit elements, bit-count of wi) vrev: N0 = [k1 k0 k3 k2 ] [k0 k1 k2 k3 ] N1 =+[k1 k0 k3 k2 ] [k0 k2 k1 k3 ] N2 =+[k1 k3 k0 k2 ] [k0 k2 k1 k3 ] Extended =+[k1 k3 k0 k2 ] [k0 k2 ] Extracted=+[k1 k3 ]

Definition at line 4341 of file ARMISelLowering.cpp.

References llvm::ISD::ADD, llvm::MCID::Bitcast, llvm::ISD::BITCAST, llvm::ISD::EXTRACT_SUBVECTOR, llvm::SelectionDAG::getIntPtrConstant(), llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SDNode::getOperand(), llvm::SDNode::getValueType(), llvm::EVT::is64BitVector(), lowerCTPOP16BitElements(), llvm::MVT::v2i32, llvm::MVT::v4i16, llvm::MVT::v4i32, llvm::MVT::v8i16, llvm::ARMISD::VREV32, llvm::ARMISD::VUZP, and llvm::ISD::ZERO_EXTEND.

Referenced by LowerCTPOP().

static SDValue LowerCTTZ ( SDNode *  N,
SelectionDAG &  DAG,
const ARMSubtarget *  ST 
) [static]
static SDValue LowerEXTRACT_VECTOR_ELT ( SDValue  Op,
SelectionDAG &  DAG 
) [static]
static SDValue LowerINSERT_VECTOR_ELT ( SDValue  Op,
SelectionDAG &  DAG 
) [static]
static SDValue LowerInterruptReturn ( SmallVectorImpl< SDValue > &  RetOps,
SDLoc  DL,
SelectionDAG &  DAG 
) [static]
static SDValue LowerMUL ( SDValue  Op,
SelectionDAG &  DAG 
) [static]
static SDValue LowerPREFETCH ( SDValue  Op,
SelectionDAG &  DAG,
const ARMSubtarget *  Subtarget 
) [static]
static SDValue LowerSDIV ( SDValue  Op,
SelectionDAG &  DAG 
) [static]
static SDValue LowerSDIV_v4i16 ( SDValue  N0,
SDValue  N1,
SDLoc  dl,
SelectionDAG &  DAG 
) [static]
static SDValue LowerSDIV_v4i8 ( SDValue  X,
SDValue  Y,
SDLoc  dl,
SelectionDAG &  DAG 
) [static]
static SDValue LowerShift ( SDNode *  N,
SelectionDAG &  DAG,
const ARMSubtarget *  ST 
) [static]
static SDValue LowerUDIV ( SDValue  Op,
SelectionDAG &  DAG 
) [static]
static SDValue LowerVASTART ( SDValue  Op,
SelectionDAG &  DAG 
) [static]
static SDValue LowerVECTOR_SHUFFLE ( SDValue  Op,
SelectionDAG &  DAG 
) [static]

Definition at line 5587 of file ARMISelLowering.cpp.

References llvm::ISD::BITCAST, llvm::ARMISD::BUILD_VECTOR, llvm::ISD::BUILD_VECTOR, llvm::ISD::EXTRACT_VECTOR_ELT, GeneratePerfectShuffle(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getContext(), llvm::EVT::getFloatingPointVT(), llvm::ShuffleVectorSDNode::getMask(), llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SDValue::getNumOperands(), llvm::SDValue::getOpcode(), llvm::SDNode::getOpcode(), llvm::SDValue::getOperand(), llvm::EVT::getSizeInBits(), llvm::ShuffleVectorSDNode::getSplatIndex(), llvm::SelectionDAG::getUNDEF(), llvm::SDValue::getValueType(), llvm::EVT::getVectorElementType(), llvm::EVT::getVectorNumElements(), llvm::EVT::getVectorVT(), llvm::SelectionDAG::getVTList(), isReverseMask(), isSingletonVEXTMask(), llvm::ShuffleVectorSDNode::isSplatMask(), isVEXTMask(), isVREVMask(), isVTRN_v_undef_Mask(), isVTRNMask(), isVUZP_v_undef_Mask(), isVUZPMask(), isVZIP_v_undef_Mask(), isVZIPMask(), LowerReverse_VECTOR_SHUFFLEv16i8_v8i16(), LowerVECTOR_SHUFFLEv8i8(), PerfectShuffleTable, llvm::SmallVectorTemplateBase< T, isPodLike >::push_back(), llvm::ISD::SCALAR_TO_VECTOR, std::swap(), llvm::ISD::UNDEF, llvm::MVT::v16i8, llvm::NVPTX::PTXLdStInstCode::V2, llvm::MVT::v8i16, llvm::MVT::v8i8, llvm::ARMISD::VDUP, llvm::ARMISD::VDUPLANE, llvm::ARMISD::VEXT, llvm::ARMISD::VREV16, llvm::ARMISD::VREV32, llvm::ARMISD::VREV64, llvm::ARMISD::VTRN, llvm::ARMISD::VUZP, and llvm::ARMISD::VZIP.

Referenced by llvm::ARMTargetLowering::LowerOperation().

static SDValue LowerVECTOR_SHUFFLEv8i8 ( SDValue  Op,
ArrayRef< int >  ShuffleMask,
SelectionDAG &  DAG 
) [static]
static SDValue LowerVectorFP_TO_INT ( SDValue  Op,
SelectionDAG &  DAG 
) [static]
static SDValue LowerVectorINT_TO_FP ( SDValue  Op,
SelectionDAG &  DAG 
) [static]
static SDValue LowerVSETCC ( SDValue  Op,
SelectionDAG &  DAG 
) [static]
static void makeDMB ( IRBuilder<> &  Builder,
ARM_MB::MemBOpt  Domain 
) [static]
static bool MatchingStackOffset ( SDValue  Arg,
unsigned  Offset,
ISD::ArgFlagsTy  Flags,
MachineFrameInfo *  MFI,
const MachineRegisterInfo *  MRI,
const TargetInstrInfo *  TII 
) [static]
static bool memOpAlign ( unsigned  DstAlign,
unsigned  SrcAlign,
unsigned  AlignCheck 
) [static]

Definition at line 9904 of file ARMISelLowering.cpp.

Referenced by llvm::ARMTargetLowering::getOptimalMemOpType().

static MachineBasicBlock* OtherSucc ( MachineBasicBlock *  MBB,
MachineBasicBlock *  Succ 
) [static]
static SDValue PerformADDCCombine ( SDNode *  N,
TargetLowering::DAGCombinerInfo &  DCI,
const ARMSubtarget *  Subtarget 
) [static]

PerformADDCCombine - Target-specific dag combine transform from ISD::ADDC, ISD::ADDE, and ISD::MUL_LOHI to MLAL.

Definition at line 8103 of file ARMISelLowering.cpp.

References AddCombineTo64bitMLAL().

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

static SDValue PerformADDCombine ( SDNode *  N,
TargetLowering::DAGCombinerInfo &  DCI,
const ARMSubtarget *  Subtarget 
) [static]

PerformADDCombine - Target-specific dag combine xforms for ISD::ADD.

Definition at line 8134 of file ARMISelLowering.cpp.

References llvm::SDValue::getNode(), llvm::SDNode::getOperand(), and PerformADDCombineWithOperands().

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

static SDValue PerformADDCombineWithOperands ( SDNode *  N,
SDValue  N0,
SDValue  N1,
TargetLowering::DAGCombinerInfo &  DCI,
const ARMSubtarget *  Subtarget 
) [static]

PerformADDCombineWithOperands - Try DAG combinations for an ADD with operands N0 and N1. This is a helper for PerformADDCombine that is called with the default operands, and if that fails, with commuted operands.

Definition at line 8115 of file ARMISelLowering.cpp.

References AddCombineToVPADDL(), combineSelectAndUse(), llvm::SDValue::getNode(), and llvm::SDNode::hasOneUse().

Referenced by PerformADDCombine().

static SDValue PerformANDCombine ( SDNode *  N,
TargetLowering::DAGCombinerInfo &  DCI,
const ARMSubtarget *  Subtarget 
) [static]
static SDValue PerformBFICombine ( SDNode *  N,
TargetLowering::DAGCombinerInfo &  DCI 
) [static]
static SDValue PerformBUILD_VECTORCombine ( SDNode *  N,
TargetLowering::DAGCombinerInfo &  DCI,
const ARMSubtarget *  Subtarget 
) [static]
static SDValue PerformExtendCombine ( SDNode *  N,
SelectionDAG &  DAG,
const ARMSubtarget *  ST 
) [static]
static SDValue PerformIntrinsicCombine ( SDNode *  N,
SelectionDAG &  DAG 
) [static]
static SDValue PerformMULCombine ( SDNode *  N,
TargetLowering::DAGCombinerInfo &  DCI,
const ARMSubtarget *  Subtarget 
) [static]
static SDValue PerformORCombine ( SDNode *  N,
TargetLowering::DAGCombinerInfo &  DCI,
const ARMSubtarget *  Subtarget 
) [static]
static SDValue PerformSELECT_CCCombine ( SDNode *  N,
SelectionDAG &  DAG,
const ARMSubtarget *  ST 
) [static]
static SDValue PerformShiftCombine ( SDNode *  N,
SelectionDAG &  DAG,
const ARMSubtarget *  ST 
) [static]

PerformShiftCombine - Checks for immediate versions of vector shifts and lowers them. As with the vector shift intrinsics, this is done during DAG combining instead of DAG legalizing because the build_vectors for 64-bit vector element shift counts are generally not legal, and it is hard to see their values after they get legalized to loads from a constant pool.

Definition at line 9567 of file ARMISelLowering.cpp.

References llvm::ISD::BSWAP, llvm::SelectionDAG::getConstant(), llvm::APInt::getHighBitsSet(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDNode::getOpcode(), llvm::SDValue::getOperand(), llvm::SDNode::getOperand(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::SDNode::getValueType(), llvm::ARMSubtarget::hasNEON(), llvm::ARMSubtarget::hasV6Ops(), llvm::TargetLoweringBase::isTypeLegal(), isVShiftLImm(), isVShiftRImm(), llvm_unreachable, llvm::SelectionDAG::MaskedValueIsZero(), llvm::ISD::ROTR, llvm::ISD::SHL, llvm::ISD::SRA, llvm::ISD::SRL, llvm::ARMISD::VSHL, llvm::ARMISD::VSHRs, and llvm::ARMISD::VSHRu.

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

static SDValue PerformSTORECombine ( SDNode *  N,
TargetLowering::DAGCombinerInfo &  DCI 
) [static]

PerformSTORECombine - Target-specific dag combine xforms for ISD::STORE.

Definition at line 8641 of file ARMISelLowering.cpp.

References llvm::ISD::ADD, llvm::TargetLowering::DAGCombinerInfo::AddToWorklist(), llvm::ISD::BITCAST, llvm::TargetLowering::DAGCombinerInfo::DAG, llvm::SmallVectorTemplateCommon< T >::data(), llvm::ISD::EXTRACT_VECTOR_ELT, llvm::MVT::f64, llvm::MVT::FIRST_INTEGER_VALUETYPE, llvm::MemSDNode::getAAInfo(), llvm::MemSDNode::getAlignment(), llvm::StoreSDNode::getBasePtr(), llvm::MemSDNode::getChain(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getIntPtrConstant(), llvm::MemSDNode::getMemoryVT(), llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SDNode::getOpcode(), llvm::SDValue::getOperand(), llvm::SDNode::getOperand(), llvm::MemSDNode::getPointerInfo(), llvm::TargetLoweringBase::getPointerTy(), llvm::EVT::getScalarType(), llvm::EVT::getSizeInBits(), llvm::MVT::getSizeInBits(), llvm::SelectionDAG::getStore(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::SelectionDAG::getUNDEF(), llvm::SDValue::getValue(), llvm::StoreSDNode::getValue(), llvm::SDValue::getValueType(), llvm::EVT::getVectorElementType(), llvm::EVT::getVectorNumElements(), llvm::SelectionDAG::getVectorShuffle(), llvm::EVT::getVectorVT(), llvm::SDNode::hasOneUse(), I, llvm::MVT::i64, llvm::MVT::i8, llvm::TargetLoweringBase::isBigEndian(), llvm::MemSDNode::isNonTemporal(), llvm::ISD::isNormalStore(), llvm::isPowerOf2_32(), llvm::StoreSDNode::isTruncatingStore(), llvm::TargetLoweringBase::isTypeLegal(), llvm::EVT::isVector(), llvm::MemSDNode::isVolatile(), llvm::MVT::LAST_INTEGER_VALUETYPE, llvm::MVT::Other, llvm::SmallVectorTemplateBase< T, isPodLike >::push_back(), llvm::ISD::TokenFactor, and llvm::ARMISD::VMOVDRR.

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

static SDValue PerformSUBCombine ( SDNode *  N,
TargetLowering::DAGCombinerInfo &  DCI 
) [static]

PerformSUBCombine - Target-specific dag combine xforms for ISD::SUB.

Definition at line 8151 of file ARMISelLowering.cpp.

References combineSelectAndUse(), llvm::SDValue::getNode(), llvm::SDNode::getOperand(), and llvm::SDNode::hasOneUse().

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

static SDValue PerformVCVTCombine ( SDNode *  N,
TargetLowering::DAGCombinerInfo &  DCI,
const ARMSubtarget *  Subtarget 
) [static]
static SDValue PerformVDIVCombine ( SDNode *  N,
TargetLowering::DAGCombinerInfo &  DCI,
const ARMSubtarget *  Subtarget 
) [static]
static SDValue PerformVECTOR_SHUFFLECombine ( SDNode *  N,
SelectionDAG &  DAG 
) [static]
static SDValue PerformVMOVDRRCombine ( SDNode *  N,
SelectionDAG &  DAG 
) [static]

PerformVMOVDRRCombine - Target-specific dag combine xforms for ARMISD::VMOVDRR. This is also used for BUILD_VECTORs with 2 operands.

Definition at line 8623 of file ARMISelLowering.cpp.

References llvm::ISD::BITCAST, llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::SDNode::getOperand(), llvm::SDValue::getResNo(), llvm::SDNode::getValueType(), and llvm::ARMISD::VMOVRRD.

Referenced by PerformBUILD_VECTORCombine(), and llvm::ARMTargetLowering::PerformDAGCombine().

static SDValue PerformVMOVRRDCombine ( SDNode *  N,
TargetLowering::DAGCombinerInfo &  DCI,
const ARMSubtarget *  Subtarget 
) [static]
static SDValue PerformVMULCombine ( SDNode *  N,
TargetLowering::DAGCombinerInfo &  DCI,
const ARMSubtarget *  Subtarget 
) [static]

PerformVMULCombine Distribute (A + B) * C to (A * C) + (B * C) to take advantage of the special multiplier accumulator forwarding. vmul d3, d0, d2 vmla d3, d1, d2 is faster than vadd d3, d0, d1 vmul d3, d3, d2

Definition at line 8180 of file ARMISelLowering.cpp.

References llvm::ISD::ADD, llvm::TargetLowering::DAGCombinerInfo::DAG, llvm::ISD::FADD, llvm::ISD::FSUB, llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDNode::getOperand(), llvm::SDNode::getValueType(), llvm::ARMSubtarget::hasVMLxForwarding(), llvm::ISD::MUL, llvm::ISD::SUB, and std::swap().

Referenced by PerformMULCombine().

static SDValue PerformXORCombine ( SDNode *  N,
TargetLowering::DAGCombinerInfo &  DCI,
const ARMSubtarget *  Subtarget 
) [static]
static void ReplaceREADCYCLECOUNTER ( SDNode *  N,
SmallVectorImpl< SDValue > &  Results,
SelectionDAG &  DAG,
const ARMSubtarget *  Subtarget 
) [static]
static SDValue SkipExtensionForVMULL ( SDNode *  N,
SelectionDAG &  DAG 
) [static]

SkipExtensionForVMULL - For a node that is a SIGN_EXTEND, ZERO_EXTEND, extending load, or BUILD_VECTOR with extended elements, return the unextended value. The unextended vector should be 64 bits so that it can be used as an operand to a VMULL instruction. If the original vector size before extension is less than 64 bits we add a an extension to resize the vector to 64 bits.

Definition at line 5922 of file ARMISelLowering.cpp.

References AddRequiredExtensionForVMULL(), llvm::ISD::BITCAST, llvm::ISD::BUILD_VECTOR, llvm::ConstantSDNode::getAPIntValue(), llvm::SelectionDAG::getConstant(), llvm::MVT::getIntegerVT(), llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SDNode::getOpcode(), llvm::SDNode::getOperand(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::SDNode::getValueType(), llvm::MVT::getVectorVT(), llvm::MVT::i32, llvm::TargetLoweringBase::isBigEndian(), llvm::AArch64DB::LD, llvm::SmallVectorTemplateBase< T, isPodLike >::push_back(), llvm::ISD::SIGN_EXTEND, SkipLoadExtensionForVMULL(), llvm::MVT::v2i32, llvm::MVT::v4i32, and llvm::ISD::ZERO_EXTEND.

Referenced by LowerMUL().

static SDValue SkipLoadExtensionForVMULL ( LoadSDNode *  LD,
SelectionDAG &  DAG 
) [static]

SkipLoadExtensionForVMULL - return a load of the original vector size that does not do any sign/zero extension. If the original vector is less than 64 bits, an appropriate extension will be added after the load to reach a total size of 64 bits. We have to add the extension separately because ARM does not have a sign/zero extending load for vectors.

Definition at line 5897 of file ARMISelLowering.cpp.

References llvm::MemSDNode::getAlignment(), llvm::LoadSDNode::getBasePtr(), llvm::MemSDNode::getChain(), getExtensionTo64Bits(), llvm::LoadSDNode::getExtensionType(), llvm::SelectionDAG::getExtLoad(), llvm::SelectionDAG::getLoad(), llvm::MemSDNode::getMemoryVT(), llvm::MemSDNode::getPointerInfo(), llvm::MemSDNode::isInvariant(), llvm::MemSDNode::isNonTemporal(), and llvm::MemSDNode::isVolatile().

Referenced by SkipExtensionForVMULL().

STATISTIC ( NumTailCalls  ,
"Number of tail calls"   
)
STATISTIC ( NumMovwMovt  ,
"Number of GAs materialized with movw + movt"   
)
STATISTIC ( NumLoopByVals  ,
"Number of loops generated for byval arguments"   
)

Variable Documentation

cl::opt<bool> ARMInterworking("arm-interworking", cl::Hidden, cl::desc("Enable / disable ARM interworking (for debugging only)"), cl::init(true)) [static]
cl::opt<bool> EnableARMLongCalls("arm-long-calls", cl::Hidden, cl::desc("Generate calls via indirect call instructions"), cl::init(false))
Initial value:
 {
  ARM::R0, ARM::R1, ARM::R2, ARM::R3
}

Definition at line 86 of file ARMISelLowering.cpp.

Referenced by llvm::f64AssignAAPCS().