LLVM  8.0.1
Macros | Typedefs | Enumerations | Functions | Variables
ARMISelLowering.cpp File Reference
#include "ARMISelLowering.h"
#include "ARMBaseInstrInfo.h"
#include "ARMBaseRegisterInfo.h"
#include "ARMCallingConv.h"
#include "ARMConstantPoolValue.h"
#include "ARMMachineFunctionInfo.h"
#include "ARMPerfectShuffle.h"
#include "ARMRegisterInfo.h"
#include "ARMSelectionDAGInfo.h"
#include "ARMSubtarget.h"
#include "MCTargetDesc/ARMAddressingModes.h"
#include "MCTargetDesc/ARMBaseInfo.h"
#include "Utils/ARMBaseInfo.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Triple.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/VectorUtils.h"
#include "llvm/CodeGen/CallingConvLower.h"
#include "llvm/CodeGen/ISDOpcodes.h"
#include "llvm/CodeGen/IntrinsicLowering.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineConstantPool.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/MachineMemOperand.h"
#include "llvm/CodeGen/MachineOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/RuntimeLibcalls.h"
#include "llvm/CodeGen/SelectionDAG.h"
#include "llvm/CodeGen/SelectionDAGNodes.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/CodeGen/TargetOpcodes.h"
#include "llvm/CodeGen/TargetRegisterInfo.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/CodeGen/ValueTypes.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/CallingConv.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/GlobalAlias.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/InlineAsm.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/MC/MCInstrDesc.h"
#include "llvm/MC/MCInstrItineraries.h"
#include "llvm/MC/MCRegisterInfo.h"
#include "llvm/MC/MCSchedule.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/KnownBits.h"
#include "llvm/Support/MachineValueType.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <cstdlib>
#include <iterator>
#include <limits>
#include <string>
#include <tuple>
#include <utility>
#include <vector>
#include "ARMGenCallingConv.inc"

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "arm-isel"
 

Typedefs

using RCPair = std::pair< unsigned, const TargetRegisterClass * >
 

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")
 
 STATISTIC (NumConstpoolPromoted, "Number of constants with their storage promoted into constant pools")
 
static bool isSRL16 (const SDValue &Op)
 
static bool isSRA16 (const SDValue &Op)
 
static bool isSHL16 (const SDValue &Op)
 
static bool isS16 (const SDValue &Op, SelectionDAG &DAG)
 
static ARMCC::CondCodes IntCCToARMCC (ISD::CondCode CC)
 IntCCToARMCC - Convert a DAG integer condition code to an ARM CC. More...
 
static void FPCCToARMCC (ISD::CondCode CC, ARMCC::CondCodes &CondCode, ARMCC::CondCodes &CondCode2, bool &InvalidOnQNaN)
 FPCCToARMCC - Convert a DAG fp condition code to an ARM CC. More...
 
static bool MatchingStackOffset (SDValue Arg, unsigned Offset, ISD::ArgFlagsTy Flags, MachineFrameInfo &MFI, const MachineRegisterInfo *MRI, const TargetInstrInfo *TII)
 MatchingStackOffset - Return true if the given stack call argument is already available in the same position (relatively) of the caller's incoming argument stack. More...
 
static SDValue LowerInterruptReturn (SmallVectorImpl< SDValue > &RetOps, const SDLoc &DL, SelectionDAG &DAG)
 
static SDValue LowerWRITE_REGISTER (SDValue Op, SelectionDAG &DAG)
 
static bool allUsersAreInFunction (const Value *V, const Function *F)
 Return true if all users of V are within function F, looking through ConstantExprs. More...
 
static SDValue promoteToConstantPool (const ARMTargetLowering *TLI, const GlobalValue *GV, SelectionDAG &DAG, EVT PtrVT, const SDLoc &dl)
 
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. More...
 
static SDValue ConvertBooleanCarryToCarryFlag (SDValue BoolCarry, SelectionDAG &DAG)
 
static SDValue ConvertCarryFlagToBooleanCarry (SDValue Flags, EVT VT, SelectionDAG &DAG)
 
static void checkVSELConstraints (ISD::CondCode CC, ARMCC::CondCodes &CondCode, bool &swpCmpOps, bool &swpVselOps)
 
static bool isGTorGE (ISD::CondCode CC)
 
static bool isLTorLE (ISD::CondCode CC)
 
static bool isLowerSaturate (const SDValue LHS, const SDValue RHS, const SDValue TrueVal, const SDValue FalseVal, const ISD::CondCode CC, const SDValue K)
 
static bool isUpperSaturate (const SDValue LHS, const SDValue RHS, const SDValue TrueVal, const SDValue FalseVal, const ISD::CondCode CC, const SDValue K)
 
static bool isSaturatingConditional (const SDValue &Op, SDValue &V, uint64_t &K, bool &usat)
 
static bool isLowerSaturatingConditional (const SDValue &Op, SDValue &V, SDValue &SatK)
 
static bool canChangeToInt (SDValue Op, bool &SeenZero, const ARMSubtarget *Subtarget)
 canChangeToInt - Given the fp compare operand, return true if it is suitable to morph to an integer compare sequence. More...
 
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 void ExpandREAD_REGISTER (SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG)
 
static SDValue CombineVMOVDRRCandidateWithVecOp (const SDNode *BC, SelectionDAG &DAG)
 BC is a bitcast that is about to be turned into a VMOVDRR. More...
 
static SDValue ExpandBITCAST (SDNode *N, SelectionDAG &DAG, const ARMSubtarget *Subtarget)
 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. More...
 
static SDValue getZeroVector (EVT VT, SelectionDAG &DAG, const SDLoc &dl)
 getZeroVector - Returns a vector of specified type with all zero elements. More...
 
static SDValue LowerCTTZ (SDNode *N, SelectionDAG &DAG, const ARMSubtarget *ST)
 
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 LowerSETCCCARRY (SDValue Op, SelectionDAG &DAG)
 
static SDValue isNEONModifiedImm (uint64_t SplatBits, uint64_t SplatUndef, unsigned SplatBitSize, SelectionDAG &DAG, const SDLoc &dl, EVT &VT, bool is128Bits, NEONModImmType type)
 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). More...
 
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)
 isVREVMask - Check if a vector shuffle corresponds to a VREV instruction with the specified blocksize. More...
 
static bool isVTBLMask (ArrayRef< int > M, EVT VT)
 
static unsigned SelectPairHalf (unsigned Elements, ArrayRef< int > Mask, unsigned Index)
 
static bool isVTRNMask (ArrayRef< int > M, EVT VT, unsigned &WhichResult)
 
static bool isVTRN_v_undef_Mask (ArrayRef< int > M, EVT VT, unsigned &WhichResult)
 isVTRN_v_undef_Mask - Special case of isVTRNMask for canonical form of "vector_shuffle v, v", i.e., "vector_shuffle v, undef". More...
 
static bool isVUZPMask (ArrayRef< int > M, EVT VT, unsigned &WhichResult)
 
static bool isVUZP_v_undef_Mask (ArrayRef< int > M, EVT VT, unsigned &WhichResult)
 isVUZP_v_undef_Mask - Special case of isVUZPMask for canonical form of "vector_shuffle v, v", i.e., "vector_shuffle v, undef". More...
 
static bool isVZIPMask (ArrayRef< int > M, EVT VT, unsigned &WhichResult)
 
static bool isVZIP_v_undef_Mask (ArrayRef< int > M, EVT VT, unsigned &WhichResult)
 isVZIP_v_undef_Mask - Special case of isVZIPMask for canonical form of "vector_shuffle v, v", i.e., "vector_shuffle v, undef". More...
 
static unsigned isNEONTwoResultShuffleMask (ArrayRef< int > ShuffleMask, EVT VT, unsigned &WhichResult, bool &isV_UNDEF)
 Check if ShuffleMask is a NEON two-result shuffle (VZIP, VUZP, VTRN), and return the corresponding ARMISD opcode if it is, or 0 if it isn't. More...
 
static bool isReverseMask (ArrayRef< int > M, EVT VT)
 
static SDValue IsSingleInstrConstant (SDValue N, SelectionDAG &DAG, const ARMSubtarget *ST, const SDLoc &dl)
 
static SDValue GeneratePerfectShuffle (unsigned PFEntry, SDValue LHS, SDValue RHS, SelectionDAG &DAG, const SDLoc &dl)
 GeneratePerfectShuffle - Given an entry in the perfect-shuffle table, emit the specified operations to build the shuffle. More...
 
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)
 isExtendedBUILD_VECTOR - Check if N is a constant BUILD_VECTOR where each element has been zero/sign-extended, depending on the isSigned parameter, from an integer type half its size. More...
 
static bool isSignExtended (SDNode *N, SelectionDAG &DAG)
 isSignExtended - Check if a node is a vector value that is sign-extended or a constant BUILD_VECTOR with sign-extended elements. More...
 
static bool isZeroExtended (SDNode *N, SelectionDAG &DAG)
 isZeroExtended - Check if a node is a vector value that is zero-extended or a constant BUILD_VECTOR with zero-extended elements. More...
 
static EVT getExtensionTo64Bits (const EVT &OrigVT)
 
static SDValue AddRequiredExtensionForVMULL (SDValue N, SelectionDAG &DAG, const EVT &OrigTy, const EVT &ExtTy, unsigned ExtOpcode)
 AddRequiredExtensionForVMULL - Add a sign/zero extension to extend the total value size to 64 bits. More...
 
static SDValue SkipLoadExtensionForVMULL (LoadSDNode *LD, SelectionDAG &DAG)
 SkipLoadExtensionForVMULL - return a load of the original vector size that does not do any sign/zero extension. More...
 
static SDValue SkipExtensionForVMULL (SDNode *N, SelectionDAG &DAG)
 SkipExtensionForVMULL - For a node that is a SIGN_EXTEND, ZERO_EXTEND, extending load, or BUILD_VECTOR with extended elements, return the unextended value. More...
 
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, const SDLoc &dl, SelectionDAG &DAG)
 
static SDValue LowerSDIV_v4i16 (SDValue N0, SDValue N1, const SDLoc &dl, SelectionDAG &DAG)
 
static SDValue LowerSDIV (SDValue Op, SelectionDAG &DAG)
 
static SDValue LowerUDIV (SDValue Op, SelectionDAG &DAG)
 
static SDValue LowerADDSUBCARRY (SDValue Op, SelectionDAG &DAG)
 
static SDValue WinDBZCheckDenominator (SelectionDAG &DAG, SDNode *N, SDValue InChain)
 
static SDValue LowerAtomicLoadStore (SDValue Op, SelectionDAG &DAG)
 
static void ReplaceREADCYCLECOUNTER (SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG, const ARMSubtarget *Subtarget)
 
static SDValue createGPRPairNode (SelectionDAG &DAG, SDValue V)
 
static void ReplaceCMP_SWAP_64Results (SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG)
 
static SDValue LowerFPOWI (SDValue Op, const ARMSubtarget &Subtarget, SelectionDAG &DAG)
 
static void ReplaceLongIntrinsic (SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG)
 
static MachineBasicBlockOtherSucc (MachineBasicBlock *MBB, MachineBasicBlock *Succ)
 
static unsigned getLdOpcode (unsigned LdSize, bool IsThumb1, bool IsThumb2)
 Return the load opcode for a given load size. More...
 
static unsigned getStOpcode (unsigned StSize, bool IsThumb1, bool IsThumb2)
 Return the store opcode for a given store size. More...
 
static void emitPostLd (MachineBasicBlock *BB, MachineBasicBlock::iterator Pos, const TargetInstrInfo *TII, const DebugLoc &dl, unsigned LdSize, unsigned Data, unsigned AddrIn, unsigned AddrOut, bool IsThumb1, bool IsThumb2)
 Emit a post-increment load operation with given size. More...
 
static void emitPostSt (MachineBasicBlock *BB, MachineBasicBlock::iterator Pos, const TargetInstrInfo *TII, const DebugLoc &dl, unsigned StSize, unsigned Data, unsigned AddrIn, unsigned AddrOut, bool IsThumb1, bool IsThumb2)
 Emit a post-increment store operation with given size. More...
 
static bool checkAndUpdateCPSRKill (MachineBasicBlock::iterator SelectItr, MachineBasicBlock *BB, const TargetRegisterInfo *TRI)
 
static void attachMEMCPYScratchRegs (const ARMSubtarget *Subtarget, MachineInstr &MI, const SDNode *Node)
 Attaches vregs to MEMCPY that it will use as scratch registers when it is expanded into LDM/STM. More...
 
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 bool IsVUZPShuffleNode (SDNode *N)
 
static SDValue AddCombineToVPADD (SDNode *N, SDValue N0, SDValue N1, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 
static SDValue AddCombineVUZPToVPADDL (SDNode *N, SDValue N0, SDValue N1, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 
static SDValue AddCombineBUILD_VECTORToVPADDL (SDNode *N, SDValue N0, SDValue N1, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 
static SDValue findMUL_LOHI (SDValue V)
 
static SDValue AddCombineTo64BitSMLAL16 (SDNode *AddcNode, SDNode *AddeNode, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 
static SDValue AddCombineTo64bitMLAL (SDNode *AddeSubeNode, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 
static SDValue AddCombineTo64bitUMAAL (SDNode *AddeNode, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 
static SDValue PerformUMLALCombine (SDNode *N, SelectionDAG &DAG, const ARMSubtarget *Subtarget)
 
static SDValue PerformAddcSubcCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 
static SDValue PerformAddeSubeCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 
static SDValue PerformADDECombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 PerformADDECombine - Target-specific dag combine transform from ARMISD::ADDC, ARMISD::ADDE, and ISD::MUL_LOHI to MLAL or ARMISD::ADDC, ARMISD::ADDE and ARMISD::UMLAL to ARMISD::UMAAL. More...
 
static SDValue PerformADDCombineWithOperands (SDNode *N, SDValue N0, SDValue N1, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 PerformADDCombineWithOperands - Try DAG combinations for an ADD with operands N0 and N1. More...
 
static SDValue PerformSHLSimplify (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *ST)
 
static SDValue PerformADDCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 PerformADDCombine - Target-specific dag combine xforms for ISD::ADD. More...
 
static SDValue PerformSUBCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
 PerformSUBCombine - Target-specific dag combine xforms for ISD::SUB. More...
 
static SDValue PerformVMULCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 PerformVMULCombine Distribute (A + B) * C to (A * C) + (B * C) to take advantage of the special multiplier accumulator forwarding. More...
 
static SDValue PerformMULCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 
static SDValue CombineANDShift (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 
static SDValue PerformANDCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 
static SDValue PerformORCombineToSMULWBT (SDNode *OR, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 
static SDValue PerformORCombineToBFI (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. More...
 
static SDValue PerformXORCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 
static SDValue ParseBFI (SDNode *N, APInt &ToMask, APInt &FromMask)
 
static bool BitsProperlyConcatenate (const APInt &A, const APInt &B)
 
static SDValue FindBFIToCombineWith (SDNode *N)
 
static SDValue PerformBFICombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
 
static SDValue PerformVMOVRRDCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 PerformVMOVRRDCombine - Target-specific dag combine xforms for ARMISD::VMOVRRD. More...
 
static SDValue PerformVMOVDRRCombine (SDNode *N, SelectionDAG &DAG)
 PerformVMOVDRRCombine - Target-specific dag combine xforms for ARMISD::VMOVDRR. More...
 
static bool hasNormalLoadOperand (SDNode *N)
 hasNormalLoadOperand - Check if any of the operands of a BUILD_VECTOR node are normal, non-volatile loads. More...
 
static SDValue PerformBUILD_VECTORCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const ARMSubtarget *Subtarget)
 PerformBUILD_VECTORCombine - Target-specific dag combine xforms for ISD::BUILD_VECTOR. More...
 
static SDValue PerformARMBUILD_VECTORCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
 Target-specific dag combine xforms for ARMISD::BUILD_VECTOR. More...
 
static SDValue PerformInsertEltCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
 PerformInsertEltCombine - Target-specific dag combine xforms for ISD::INSERT_VECTOR_ELT. More...
 
static SDValue PerformVECTOR_SHUFFLECombine (SDNode *N, SelectionDAG &DAG)
 PerformVECTOR_SHUFFLECombine - Target-specific dag combine xforms for ISD::VECTOR_SHUFFLE. More...
 
static SDValue CombineBaseUpdate (SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
 CombineBaseUpdate - Target-specific DAG combine function for VLDDUP, NEON load/store intrinsics, and generic vector load/stores, to merge base address updates. More...
 
static SDValue PerformVLDCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
 
static bool CombineVLDDUP (SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
 CombineVLDDUP - For a VDUPLANE node N, check if its source operand is a vldN-lane (N > 1) intrinsic, and if all the other uses of that intrinsic are also VDUPLANEs. More...
 
static SDValue PerformVDUPLANECombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
 PerformVDUPLANECombine - Target-specific dag combine xforms for ARMISD::VDUPLANE. More...
 
static SDValue PerformVDUPCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
 PerformVDUPCombine - Target-specific dag combine xforms for ARMISD::VDUP. More...
 
static SDValue PerformLOADCombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
 
static SDValue PerformSTORECombine (SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
 PerformSTORECombine - Target-specific dag combine xforms for ISD::STORE. More...
 
static SDValue PerformVCVTCombine (SDNode *N, SelectionDAG &DAG, const ARMSubtarget *Subtarget)
 PerformVCVTCombine - VCVT (floating-point to fixed-point, Advanced SIMD) can replace combinations of VMUL and VCVT (floating-point to integer) when the VMUL has a constant operand that is a power of 2. More...
 
static SDValue PerformVDIVCombine (SDNode *N, SelectionDAG &DAG, const ARMSubtarget *Subtarget)
 PerformVDIVCombine - VCVT (fixed-point to floating-point, Advanced SIMD) can replace combinations of VCVT (integer to floating-point) and VDIV when the VDIV has a constant operand that is a power of 2. More...
 
static bool getVShiftImm (SDValue Op, unsigned ElementBits, int64_t &Cnt)
 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. More...
 
static bool isVShiftLImm (SDValue Op, EVT VT, bool isLong, int64_t &Cnt)
 isVShiftLImm - Check if this is a valid build_vector for the immediate operand of a vector shift left operation. More...
 
static bool isVShiftRImm (SDValue Op, EVT VT, bool isNarrow, bool isIntrinsic, int64_t &Cnt)
 isVShiftRImm - Check if this is a valid build_vector for the immediate operand of a vector shift right operation. More...
 
static SDValue PerformIntrinsicCombine (SDNode *N, SelectionDAG &DAG)
 PerformIntrinsicCombine - ARM-specific DAG combining for intrinsics. More...
 
static SDValue PerformShiftCombine (SDNode *N, SelectionDAG &DAG, const ARMSubtarget *ST)
 PerformShiftCombine - Checks for immediate versions of vector shifts and lowers them. More...
 
static SDValue PerformExtendCombine (SDNode *N, SelectionDAG &DAG, const ARMSubtarget *ST)
 PerformExtendCombine - Target-specific DAG combining for ISD::SIGN_EXTEND, ISD::ZERO_EXTEND, and ISD::ANY_EXTEND. More...
 
static const APIntisPowerOf2Constant (SDValue V)
 
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)
 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. More...
 
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 RTLIB::Libcall getDivRemLibcall (const SDNode *N, MVT::SimpleValueType SVT)
 
static TargetLowering::ArgListTy getDivRemArgList (const SDNode *N, LLVMContext *Context, const ARMSubtarget *Subtarget)
 
static bool isHomogeneousAggregate (Type *Ty, HABaseType &Base, uint64_t &Members)
 

Variables

static cl::opt< boolARMInterworking ("arm-interworking", cl::Hidden, cl::desc("Enable / disable ARM interworking (for debugging only)"), cl::init(true))
 
static cl::opt< boolEnableConstpoolPromotion ("arm-promote-constant", cl::Hidden, cl::desc("Enable / disable promotion of unnamed_addr constants into " "constant pools"), cl::init(false))
 
static cl::opt< unsignedConstpoolPromotionMaxSize ("arm-promote-constant-max-size", cl::Hidden, cl::desc("Maximum size of constant to promote into a constant pool"), cl::init(64))
 
static cl::opt< unsignedConstpoolPromotionMaxTotal ("arm-promote-constant-max-total", cl::Hidden, cl::desc("Maximum size of ALL constants to promote into a constant pool"), cl::init(128))
 
static const MCPhysReg GPRArgRegs []
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "arm-isel"

Definition at line 117 of file ARMISelLowering.cpp.

Typedef Documentation

◆ RCPair

using RCPair = std::pair<unsigned, const TargetRegisterClass *>

Definition at line 13844 of file ARMISelLowering.cpp.

Enumeration Type Documentation

◆ HABaseType

enum HABaseType
Enumerator
HA_UNKNOWN 
HA_FLOAT 
HA_DOUBLE 
HA_VECT64 
HA_VECT128 

Definition at line 15011 of file ARMISelLowering.cpp.

Function Documentation

◆ AddCombineBUILD_VECTORToVPADDL()

static SDValue AddCombineBUILD_VECTORToVPADDL ( SDNode N,
SDValue  N0,
SDValue  N1,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget Subtarget 
)
static

◆ AddCombineTo64bitMLAL()

static SDValue AddCombineTo64bitMLAL ( SDNode AddeSubeNode,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget Subtarget 
)
static

◆ AddCombineTo64BitSMLAL16()

static SDValue AddCombineTo64BitSMLAL16 ( SDNode AddcNode,
SDNode AddeNode,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget Subtarget 
)
static

◆ AddCombineTo64bitUMAAL()

static SDValue AddCombineTo64bitUMAAL ( SDNode AddeNode,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget Subtarget 
)
static

◆ AddCombineToVPADD()

static SDValue AddCombineToVPADD ( SDNode N,
SDValue  N0,
SDValue  N1,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget Subtarget 
)
static

◆ AddCombineVUZPToVPADDL()

static SDValue AddCombineVUZPToVPADDL ( SDNode N,
SDValue  N0,
SDValue  N1,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget Subtarget 
)
static

◆ AddRequiredExtensionForVMULL()

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 7247 of file ARMISelLowering.cpp.

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

Referenced by SkipExtensionForVMULL().

◆ allUsersAreInFunction()

static bool allUsersAreInFunction ( const Value V,
const Function F 
)
static

Return true if all users of V are within function F, looking through ConstantExprs.

Definition at line 3037 of file ARMISelLowering.cpp.

References llvm::dyn_cast(), llvm::SmallVectorBase::empty(), F(), I, llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T >::push_back(), and llvm::Value::users().

Referenced by promoteToConstantPool().

◆ attachMEMCPYScratchRegs()

static void attachMEMCPYScratchRegs ( const ARMSubtarget Subtarget,
MachineInstr MI,
const SDNode Node 
)
static

Attaches vregs to MEMCPY that it will use as scratch registers when it is expanded into LDM/STM.

This is done as a post-isel lowering instead of as a custom inserter because we need the use list from the SDNode.

Definition at line 9515 of file ARMISelLowering.cpp.

◆ bitcastf32Toi32()

static SDValue bitcastf32Toi32 ( SDValue  Op,
SelectionDAG DAG 
)
static

◆ BitsProperlyConcatenate()

static bool BitsProperlyConcatenate ( const APInt A,
const APInt B 
)
static

◆ canChangeToInt()

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 4529 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().

Referenced by expandf64Toi32().

◆ checkAndUpdateCPSRKill()

static bool checkAndUpdateCPSRKill ( MachineBasicBlock::iterator  SelectItr,
MachineBasicBlock BB,
const TargetRegisterInfo TRI 
)
static

◆ checkVSELConstraints()

static void checkVSELConstraints ( ISD::CondCode  CC,
ARMCC::CondCodes CondCode,
bool swpCmpOps,
bool swpVselOps 
)
static

◆ CombineANDShift()

static SDValue CombineANDShift ( SDNode N,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget Subtarget 
)
static

◆ CombineBaseUpdate()

static SDValue CombineBaseUpdate ( SDNode N,
TargetLowering::DAGCombinerInfo DCI 
)
static

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

For generic load/stores, the memory type is assumed to be a vector. The caller is assumed to have checked legality.

Definition at line 11564 of file ARMISelLowering.cpp.

References llvm::ISD::ADD, llvm::Intrinsic::arm_neon_vld1, llvm::Intrinsic::arm_neon_vld2, llvm::Intrinsic::arm_neon_vld2dup, llvm::Intrinsic::arm_neon_vld2lane, llvm::Intrinsic::arm_neon_vld3, llvm::Intrinsic::arm_neon_vld3dup, llvm::Intrinsic::arm_neon_vld3lane, llvm::Intrinsic::arm_neon_vld4, llvm::Intrinsic::arm_neon_vld4dup, llvm::Intrinsic::arm_neon_vld4lane, llvm::Intrinsic::arm_neon_vst1, llvm::Intrinsic::arm_neon_vst2, llvm::Intrinsic::arm_neon_vst2lane, llvm::Intrinsic::arm_neon_vst3, llvm::Intrinsic::arm_neon_vst3lane, llvm::Intrinsic::arm_neon_vst4, llvm::Intrinsic::arm_neon_vst4lane, assert(), llvm::ISD::BITCAST, llvm::TargetLowering::DAGCombinerInfo::CombineTo(), llvm::TargetLowering::DAGCombinerInfo::DAG, llvm::dyn_cast(), llvm::MemSDNode::getAlignment(), llvm::SelectionDAG::getConstant(), llvm::MVT::getIntegerVT(), llvm::SelectionDAG::getMemIntrinsicNode(), llvm::MemSDNode::getMemOperand(), llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SDNode::getNumOperands(), llvm::SDNode::getOpcode(), llvm::SDNode::getOperand(), llvm::SDValue::getResNo(), llvm::EVT::getScalarSizeInBits(), llvm::EVT::getSizeInBits(), llvm::MVT::getSizeInBits(), llvm::SDValue::getValueType(), llvm::SDNode::getValueType(), llvm::EVT::getVectorElementType(), llvm::EVT::getVectorNumElements(), llvm::MVT::getVectorVT(), llvm::SelectionDAG::getVTList(), llvm::ConstantSDNode::getZExtValue(), llvm::SDNode::hasPredecessorHelper(), llvm::MVT::i32, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::ISD::INTRINSIC_VOID, llvm::ISD::INTRINSIC_W_CHAIN, isStore(), llvm_unreachable, llvm::ISD::LOAD, llvm::makeArrayRef(), N, llvm::MVT::Other, llvm::SmallVectorTemplateBase< T >::push_back(), llvm::SmallVectorBase::size(), llvm::ISD::STORE, llvm::SDNode::use_begin(), llvm::SDNode::use_end(), llvm::ARMISD::VLD1_UPD, llvm::ARMISD::VLD1DUP, llvm::ARMISD::VLD1DUP_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 PerformLOADCombine(), PerformSTORECombine(), and PerformVLDCombine().

◆ combineSelectAndUse()

static SDValue combineSelectAndUse ( SDNode N,
SDValue  Slct,
SDValue  OtherOp,
TargetLowering::DAGCombinerInfo DCI,
bool  AllOnes = false 
)
static

◆ combineSelectAndUseCommutative()

static SDValue combineSelectAndUseCommutative ( SDNode N,
bool  AllOnes,
TargetLowering::DAGCombinerInfo DCI 
)
static

◆ CombineVLDDUP()

static bool CombineVLDDUP ( SDNode N,
TargetLowering::DAGCombinerInfo DCI 
)
static

◆ CombineVMOVDRRCandidateWithVecOp()

static SDValue CombineVMOVDRRCandidateWithVecOp ( const SDNode BC,
SelectionDAG DAG 
)
static

BC is a bitcast that is about to be turned into a VMOVDRR.

When DstVT, the destination type of BC, is on the vector register bank and the source of bitcast, Op, operates on the same bank, it might be possible to combine them, such that everything stays on the vector register bank. return The node that would replace BT, if the combine is possible.

Definition at line 5079 of file ARMISelLowering.cpp.

References llvm::ISD::BITCAST, llvm::dyn_cast(), llvm::ISD::EXTRACT_SUBVECTOR, llvm::ISD::EXTRACT_VECTOR_ELT, llvm::ConstantSDNode::getAPIntValue(), llvm::APInt::getBitWidth(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::SDNode::getOperand(), llvm::EVT::getScalarType(), llvm::SDValue::getValueType(), llvm::SDNode::getValueType(), llvm::EVT::getVectorNumElements(), llvm::EVT::getVectorVT(), llvm::SDValue::hasOneUse(), llvm::MVT::i32, and llvm::EVT::isVector().

Referenced by ExpandBITCAST().

◆ ConvertBooleanCarryToCarryFlag()

static SDValue ConvertBooleanCarryToCarryFlag ( SDValue  BoolCarry,
SelectionDAG DAG 
)
static

◆ ConvertCarryFlagToBooleanCarry()

static SDValue ConvertCarryFlagToBooleanCarry ( SDValue  Flags,
EVT  VT,
SelectionDAG DAG 
)
static

◆ createGPRPairNode()

static SDValue createGPRPairNode ( SelectionDAG DAG,
SDValue  V 
)
static

◆ emitPostLd()

static void emitPostLd ( MachineBasicBlock BB,
MachineBasicBlock::iterator  Pos,
const TargetInstrInfo TII,
const DebugLoc dl,
unsigned  LdSize,
unsigned  Data,
unsigned  AddrIn,
unsigned  AddrOut,
bool  IsThumb1,
bool  IsThumb2 
)
static

◆ emitPostSt()

static void emitPostSt ( MachineBasicBlock BB,
MachineBasicBlock::iterator  Pos,
const TargetInstrInfo TII,
const 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 8798 of file ARMISelLowering.cpp.

References llvm::ARM_AM::add, llvm::MachineInstrBuilder::add(), llvm::MachineInstrBuilder::addConstantPoolIndex(), llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addMBB(), llvm::MachineInstrBuilder::addReg(), llvm::MachineBasicBlock::addSuccessor(), llvm::ARMCC::AL, assert(), llvm::MachineBasicBlock::begin(), llvm::BuildMI(), C, llvm::condCodeOp(), llvm::MachineFunction::CreateMachineBasicBlock(), llvm::MachineRegisterInfo::createVirtualRegister(), llvm::RegState::Dead, llvm::RegState::Define, emitPostLd(), llvm::MachineBasicBlock::end(), llvm::ARMCC::EQ, llvm::MachineInstr::eraseFromParent(), llvm::MachineInstr::FrameSetup, llvm::MCInstrInfo::get(), llvm::ConstantInt::get(), llvm::MachineBasicBlock::getBasicBlock(), llvm::TargetMachine::getCodeModel(), llvm::MachineFunction::getConstantPool(), llvm::MachineConstantPool::getConstantPoolIndex(), llvm::Function::getContext(), llvm::MachineFunction::getDataLayout(), llvm::MachineInstr::getDebugLoc(), llvm::MachineFunction::getFunction(), llvm::MachineOperand::getImm(), llvm::ARMSubtarget::getInstrInfo(), llvm::Type::getInt32Ty(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::MachineInstr::getOperand(), llvm::MachineBasicBlock::getParent(), llvm::DataLayout::getPrefTypeAlignment(), llvm::MachineOperand::getReg(), llvm::MachineFunction::getRegInfo(), getStOpcode(), llvm::TargetLoweringBase::getTargetMachine(), llvm::DataLayout::getTypeAllocSize(), llvm::Function::hasFnAttribute(), llvm::ARMSubtarget::hasNEON(), llvm::RegState::Implicit, llvm::MachineFunction::insert(), Int32Ty, llvm::ARMSubtarget::isTargetWindows(), llvm::ARMSubtarget::isThumb(), llvm::ARMSubtarget::isThumb1Only(), llvm::ARMSubtarget::isThumb2(), llvm::CodeModel::Kernel, llvm::RegState::Kill, llvm::CodeModel::Large, llvm_unreachable, llvm::CodeModel::Medium, MRI, llvm::ARMCC::NE, llvm::Attribute::NoImplicitFloat, llvm::predOps(), llvm::MachineFunction::push_back(), R4, Reg, llvm::MachineOperand::setIsDef(), llvm::MachineInstrBuilder::setMIFlags(), llvm::MachineOperand::setReg(), llvm::CodeModel::Small, llvm::MachineBasicBlock::splice(), llvm::t1CondCodeOp(), TII, llvm::CodeModel::Tiny, llvm::MachineBasicBlock::transferSuccessorsAndUpdatePHIs(), and llvm::ARMSubtarget::useMovt().

◆ Expand64BitShift()

static SDValue Expand64BitShift ( SDNode N,
SelectionDAG DAG,
const ARMSubtarget ST 
)
static

◆ ExpandBITCAST()

static SDValue ExpandBITCAST ( SDNode N,
SelectionDAG DAG,
const ARMSubtarget Subtarget 
)
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 5127 of file ARMISelLowering.cpp.

References llvm::ISD::BITCAST, llvm::ISD::BUILD_PAIR, CombineVMOVDRRCandidateWithVecOp(), llvm::ISD::CopyFromReg, llvm::ISD::CopyToReg, llvm::ISD::EXTRACT_ELEMENT, llvm::MVT::f16, llvm::MVT::f32, llvm::MVT::f64, llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getDataLayout(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::SDNode::getOperand(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::SDValue::getValue(), llvm::SDValue::getValueType(), llvm::SDNode::getValueType(), llvm::EVT::getVectorNumElements(), llvm::SelectionDAG::getVTList(), llvm::ARMSubtarget::hasFullFP16(), llvm::MipsISD::Hi, llvm::MVT::i16, llvm::MVT::i32, llvm::MVT::i64, llvm::DataLayout::isBigEndian(), llvm::TargetLoweringBase::isTypeLegal(), llvm::EVT::isVector(), llvm::MipsISD::Lo, llvm::SelectionDAG::ReplaceAllUsesWith(), llvm::ARMISD::RET_FLAG, llvm::SDNode::use_begin(), llvm::SDNode::use_size(), llvm::ARMISD::VMOVDRR, llvm::ARMISD::VMOVhr, llvm::ARMISD::VMOVrh, llvm::ARMISD::VMOVRRD, llvm::ARMISD::VREV64, and llvm::ISD::ZERO_EXTEND.

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

◆ expandf64Toi32()

static void expandf64Toi32 ( SDValue  Op,
SelectionDAG DAG,
SDValue RetVal1,
SDValue RetVal2 
)
static

Definition at line 4562 of file ARMISelLowering.cpp.

References llvm::ISD::ADD, llvm::ARMCC::AL, llvm::ISD::AND, llvm::ARMISD::BCC_i64, bitcastf32Toi32(), llvm::ARMISD::BR2_JT, llvm::ARMISD::BR_JT, llvm::ARMISD::BRCOND, canChangeToInt(), llvm::MVT::f32, llvm::MVT::f64, FPCCToARMCC(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getDataLayout(), llvm::SDNode::getFlags(), llvm::MachinePointerInfo::getJumpTable(), llvm::SelectionDAG::getLoad(), llvm::SelectionDAG::getMachineFunction(), llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::ARMCC::getOppositeCondition(), llvm::TargetLoweringBase::getPointerTy(), llvm::SelectionDAG::getRegister(), llvm::SDValue::getResNo(), llvm::SelectionDAG::getTargetJumpTable(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::TargetLoweringBase::getTargetMachine(), llvm::SDValue::getValue(), llvm::SDValue::getValueType(), llvm::SDNode::getValueType(), llvm::SelectionDAG::getVTList(), llvm::MVT::Glue, llvm::ARMSubtarget::hasV8MBaselineOps(), llvm::MVT::i32, IntCCToARMCC(), isFloatingPointZero(), llvm::ARMSubtarget::isFPOnlySP(), llvm::isNullConstant(), llvm::isOneConstant(), llvm::TargetLowering::isPositionIndependent(), llvm::ARMSubtarget::isROPI(), llvm::ARMSubtarget::isThumb(), llvm::ARMSubtarget::isThumb1Only(), llvm::ARMSubtarget::isThumb2(), llvm::TargetLoweringBase::isTypeLegal(), llvm::HexagonISD::JT, llvm_unreachable, llvm::BitmaskEnumDetail::Mask(), llvm::MinAlign(), llvm::ISD::MUL, llvm::MVT::Other, llvm::ISD::SADDO, llvm::ISD::SETEQ, llvm::ISD::SETNE, llvm::ISD::SETOEQ, llvm::ISD::SETUNE, llvm::ISD::SMULO, llvm::TargetLowering::softenSetCCOperands(), llvm::ISD::SSUBO, llvm::ISD::UADDO, llvm::ISD::UMULO, llvm::ISD::USUBO, and llvm::ARMISD::WrapperJT.

◆ ExpandREAD_REGISTER()

static void ExpandREAD_REGISTER ( SDNode N,
SmallVectorImpl< SDValue > &  Results,
SelectionDAG DAG 
)
static

◆ FindBFIToCombineWith()

static SDValue FindBFIToCombineWith ( SDNode N)
static

◆ findMUL_LOHI()

static SDValue findMUL_LOHI ( SDValue  V)
static

◆ FPCCToARMCC()

static void FPCCToARMCC ( ISD::CondCode  CC,
ARMCC::CondCodes CondCode,
ARMCC::CondCodes CondCode2,
bool InvalidOnQNaN 
)
static

◆ GeneratePerfectShuffle()

static SDValue GeneratePerfectShuffle ( unsigned  PFEntry,
SDValue  LHS,
SDValue  RHS,
SelectionDAG DAG,
const SDLoc dl 
)
static

◆ getARMIndexedAddressParts()

static bool getARMIndexedAddressParts ( SDNode Ptr,
EVT  VT,
bool  isSEXTLoad,
SDValue Base,
SDValue Offset,
bool isInc,
SelectionDAG DAG 
)
static

◆ getDivRemArgList()

static TargetLowering::ArgListTy getDivRemArgList ( const SDNode N,
LLVMContext Context,
const ARMSubtarget Subtarget 
)
static

Definition at line 14086 of file ARMISelLowering.cpp.

References llvm::ISD::AND, llvm::AMDGPU::HSAMD::Kernel::Key::Args, llvm::CallingConv::ARM_AAPCS, assert(), llvm::MVT::f64, first, llvm::StructType::get(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getCopyFromReg(), llvm::SelectionDAG::getCopyToReg(), llvm::SelectionDAG::getDataLayout(), getDivRemLibcall(), llvm::SelectionDAG::getEntryNode(), llvm::SelectionDAG::getExternalSymbol(), llvm::RTLIB::getFPEXT(), llvm::RTLIB::getFPROUND(), llvm::MachineFunction::getFunction(), llvm::Type::getInt16Ty(), llvm::Type::getInt32Ty(), llvm::Type::getInt64Ty(), llvm::Type::getInt8Ty(), llvm::TargetLoweringBase::getLibcallCallingConv(), llvm::TargetLoweringBase::getLibcallName(), llvm::SelectionDAG::getMachineFunction(), llvm::SelectionDAG::getMergeValues(), llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SDNode::getNumOperands(), llvm::SDNode::getOpcode(), llvm::SDValue::getOperand(), llvm::SDNode::getOperand(), llvm::TargetLoweringBase::getPointerTy(), llvm::SDNode::getSimpleValueType(), llvm::EVT::getSimpleVT(), llvm::EVT::getTypeForEVT(), llvm::SDValue::getValue(), llvm::SDValue::getValueType(), llvm::SDNode::getValueType(), llvm::SelectionDAG::getVTList(), llvm::MVT::Glue, llvm::ARMSubtarget::hasDivideInARMMode(), llvm::ARMSubtarget::hasDivideInThumbMode(), llvm::Function::hasFnAttribute(), llvm::MVT::i16, llvm::MVT::i32, llvm::MVT::i64, llvm::MVT::i8, llvm::ARMSubtarget::isFPOnlySP(), llvm::EVT::isSimple(), llvm::ARMSubtarget::isTargetAEABI(), llvm::ARMSubtarget::isTargetAndroid(), llvm::ARMSubtarget::isTargetGNUAEABI(), llvm::ARMSubtarget::isTargetMuslAEABI(), llvm::ARMSubtarget::isTargetWindows(), llvm::ARMSubtarget::isThumb(), llvm_unreachable, llvm::TargetLowering::LowerCallTo(), llvm::TargetLowering::makeLibCall(), llvm::ISD::MERGE_VALUES, llvm::ISD::MUL, llvm::MVT::Other, R4, llvm::ISD::SDIV, llvm::ISD::SDIVREM, llvm::TargetLowering::CallLoweringInfo::setCallee(), llvm::TargetLowering::CallLoweringInfo::setChain(), llvm::TargetLowering::CallLoweringInfo::setDebugLoc(), llvm::TargetLowering::CallLoweringInfo::setInRegister(), llvm::TargetLowering::CallLoweringInfo::setSExtResult(), llvm::TargetLowering::CallLoweringInfo::setZExtResult(), llvm::MVT::SimpleTy, llvm::ISD::SREM, llvm::ISD::SRL, llvm::ISD::SUB, std::swap(), llvm::ISD::UDIV, llvm::ISD::UDIVREM, llvm::ISD::UREM, llvm::ARMISD::WIN__CHKSTK, and WinDBZCheckDenominator().

◆ getDivRemLibcall()

static RTLIB::Libcall getDivRemLibcall ( const SDNode N,
MVT::SimpleValueType  SVT 
)
static

◆ getExtensionTo64Bits()

static EVT getExtensionTo64Bits ( const EVT OrigVT)
static

◆ getLdOpcode()

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 8719 of file ARMISelLowering.cpp.

Referenced by emitPostLd().

◆ getStOpcode()

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 8738 of file ARMISelLowering.cpp.

Referenced by emitPostSt().

◆ getT2IndexedAddressParts()

static bool getT2IndexedAddressParts ( SDNode Ptr,
EVT  VT,
bool  isSEXTLoad,
SDValue Base,
SDValue Offset,
bool isInc,
SelectionDAG DAG 
)
static

◆ getVShiftImm()

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 12204 of file ARMISelLowering.cpp.

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

Referenced by isVShiftLImm(), and isVShiftRImm().

◆ getZeroVector()

static SDValue getZeroVector ( EVT  VT,
SelectionDAG DAG,
const SDLoc dl 
)
static

◆ hasNormalLoadOperand()

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 11346 of file ARMISelLowering.cpp.

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

Referenced by PerformBUILD_VECTORCombine().

◆ IntCCToARMCC()

static ARMCC::CondCodes IntCCToARMCC ( ISD::CondCode  CC)
static

◆ isAddSubSExt()

static bool isAddSubSExt ( SDNode N,
SelectionDAG DAG 
)
static

◆ isAddSubZExt()

static bool isAddSubZExt ( SDNode N,
SelectionDAG DAG 
)
static

◆ isConditionalZeroOrAllOnes()

static bool isConditionalZeroOrAllOnes ( SDNode N,
bool  AllOnes,
SDValue CC,
bool Invert,
SDValue OtherOp,
SelectionDAG DAG 
)
static

◆ isExtendedBUILD_VECTOR()

static bool isExtendedBUILD_VECTOR ( SDNode N,
SelectionDAG DAG,
bool  isSigned 
)
static

◆ isFloatingPointZero()

static bool isFloatingPointZero ( SDValue  Op)
static

isFloatingPointZero - Return true if this is +0.0.

Definition at line 3799 of file ARMISelLowering.cpp.

References llvm::ISD::ADD, llvm::ARMISD::ADDC, assert(), llvm::ISD::BITCAST, C, llvm::ARMISD::CMOV, llvm::ARMISD::CMP, llvm::ARMISD::CMPFP, llvm::ARMISD::CMPFPw0, llvm::ARMISD::CMPZ, llvm::HexagonISD::CP, llvm::ARMCC::EQ, llvm::MVT::f64, llvm::ARMISD::FMSTAT, llvm::SelectionDAG::getConstant(), llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDNode::getOpcode(), llvm::SDValue::getOperand(), llvm::SDNode::getOperand(), llvm::SelectionDAG::getRegister(), llvm::ISD::getSetCCSwappedOperands(), llvm::ARM_AM::getShiftOpcForNode(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::SDValue::getValue(), llvm::SDValue::getValueType(), llvm::SDNode::getValueType(), llvm::SelectionDAG::getVTList(), llvm::MVT::Glue, llvm::ARMCC::HS, llvm::MVT::i32, IntCCToARMCC(), llvm::ISD::isEXTLoad(), llvm::ARMSubtarget::isFPOnlySP(), llvm::ARMTargetLowering::isLegalICmpImmediate(), llvm::ISD::isNON_EXTLoad(), llvm::isNullConstant(), llvm::TargetLoweringBase::isTypeLegal(), llvm_unreachable, llvm::ISD::MERGE_VALUES, llvm::ARMCC::NE, llvm::ARM_AM::no_shift, llvm::ISD::SADDO, llvm::ISD::SETGE, llvm::ISD::SETGT, llvm::ISD::SETLE, llvm::ISD::SETLT, llvm::ISD::SETUGE, llvm::ISD::SETUGT, llvm::ISD::SETULE, llvm::ISD::SETULT, llvm::ISD::SMUL_LOHI, llvm::ISD::SMULO, llvm::ISD::SRA, llvm::ISD::SSUBO, llvm::ISD::SUB, std::swap(), llvm::ISD::UADDO, llvm::ISD::UMUL_LOHI, llvm::ISD::UMULO, llvm::ISD::USUBO, llvm::ARMCC::VC, llvm::ARMISD::VMOVIMM, and llvm::ARMISD::Wrapper.

Referenced by bitcastf32Toi32(), canChangeToInt(), expandf64Toi32(), and isLowerSaturatingConditional().

◆ isGTorGE()

static bool isGTorGE ( ISD::CondCode  CC)
static

Definition at line 4226 of file ARMISelLowering.cpp.

References llvm::ISD::SETGE, and llvm::ISD::SETGT.

Referenced by isLowerSaturate(), and isUpperSaturate().

◆ isHomogeneousAggregate()

static bool isHomogeneousAggregate ( Type Ty,
HABaseType Base,
uint64_t &  Members 
)
static

◆ isLegalAddressImmediate()

static bool isLegalAddressImmediate ( int64_t  V,
EVT  VT,
const ARMSubtarget Subtarget 
)
static

◆ isLegalT1AddressImmediate()

static bool isLegalT1AddressImmediate ( int64_t  V,
EVT  VT 
)
static

◆ isLegalT2AddressImmediate()

static bool isLegalT2AddressImmediate ( int64_t  V,
EVT  VT,
const ARMSubtarget Subtarget 
)
static

◆ isLowerSaturate()

static bool isLowerSaturate ( const SDValue  LHS,
const SDValue  RHS,
const SDValue  TrueVal,
const SDValue  FalseVal,
const ISD::CondCode  CC,
const SDValue  K 
)
static

Definition at line 4240 of file ARMISelLowering.cpp.

References isGTorGE(), and isLTorLE().

Referenced by isLowerSaturatingConditional(), and isSaturatingConditional().

◆ isLowerSaturatingConditional()

static bool isLowerSaturatingConditional ( const SDValue Op,
SDValue V,
SDValue SatK 
)
static

◆ isLTorLE()

static bool isLTorLE ( ISD::CondCode  CC)
static

Definition at line 4230 of file ARMISelLowering.cpp.

References llvm::ISD::SETLE, and llvm::ISD::SETLT.

Referenced by isLowerSaturate(), and isUpperSaturate().

◆ isNEONModifiedImm()

static SDValue isNEONModifiedImm ( uint64_t  SplatBits,
uint64_t  SplatUndef,
unsigned  SplatBitSize,
SelectionDAG DAG,
const SDLoc dl,
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 5714 of file ARMISelLowering.cpp.

References assert(), llvm::ISD::BITCAST, llvm::ARM_AM::createNEONModImm(), llvm::ISD::EXTRACT_VECTOR_ELT, llvm::MVT::f32, llvm::MVT::f64, llvm::ARMSubtarget::genExecuteOnly(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getDataLayout(), llvm::ARM_AM::getFP32Imm(), llvm::ARM_AM::getFP64Imm(), llvm::SelectionDAG::getNode(), llvm::EVT::getSimpleVT(), llvm::SelectionDAG::getTargetConstant(), llvm::ConstantFPSDNode::getValueAPF(), llvm::SDValue::getValueType(), llvm::ARMSubtarget::hasNEON(), llvm::ARMSubtarget::hasVFP3(), llvm::MipsISD::Hi, llvm::MVT::i32, llvm::X86II::ImmMask, llvm::DataLayout::isBigEndian(), llvm::ARMTargetLowering::isFPImmLegal(), llvm::ARMSubtarget::isFPOnlySP(), llvm::ARMSubtarget::isLittle(), llvm_unreachable, llvm::MipsISD::Lo, llvm::APInt::lshr(), llvm::OtherModImm, llvm::MVT::SimpleTy, llvm::ARM_MB::ST, std::swap(), llvm::APInt::trunc(), llvm::ARMSubtarget::useNEONForSinglePrecisionFP(), llvm::MVT::v16i8, llvm::MVT::v1i64, llvm::MVT::v2f32, llvm::MVT::v2i32, llvm::MVT::v2i64, llvm::MVT::v4i16, llvm::MVT::v4i32, llvm::MVT::v8i16, llvm::MVT::v8i8, llvm::ARMISD::VMOVDRR, llvm::ARMISD::VMOVFPIMM, llvm::ARMISD::VMOVIMM, llvm::VMOVModImm, llvm::ARMISD::VMOVSR, llvm::ARMISD::VMVNIMM, and llvm::VMVNModImm.

Referenced by IsSingleInstrConstant(), PerformANDCombine(), and PerformORCombine().

◆ isNEONTwoResultShuffleMask()

static unsigned isNEONTwoResultShuffleMask ( ArrayRef< int >  ShuffleMask,
EVT  VT,
unsigned WhichResult,
bool isV_UNDEF 
)
static

Check if ShuffleMask is a NEON two-result shuffle (VZIP, VUZP, VTRN), and return the corresponding ARMISD opcode if it is, or 0 if it isn't.

Definition at line 6292 of file ARMISelLowering.cpp.

References isVTRN_v_undef_Mask(), isVTRNMask(), isVUZP_v_undef_Mask(), isVUZPMask(), isVZIP_v_undef_Mask(), isVZIPMask(), llvm::ARMISD::VTRN, llvm::ARMISD::VUZP, and llvm::ARMISD::VZIP.

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

◆ isPowerOf2Constant()

static const APInt* isPowerOf2Constant ( SDValue  V)
static

◆ isReverseMask()

static bool isReverseMask ( ArrayRef< int >  M,
EVT  VT 
)
static

◆ isS16()

static bool isS16 ( const SDValue Op,
SelectionDAG DAG 
)
static

◆ isSaturatingConditional()

static bool isSaturatingConditional ( const SDValue Op,
SDValue V,
uint64_t &  K,
bool usat 
)
static

◆ isSHL16()

static bool isSHL16 ( const SDValue Op)
static

◆ isSignExtended()

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 7209 of file ARMISelLowering.cpp.

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

Referenced by isAddSubSExt(), and LowerMUL().

◆ IsSingleInstrConstant()

static SDValue IsSingleInstrConstant ( SDValue  N,
SelectionDAG DAG,
const ARMSubtarget ST,
const SDLoc dl 
)
static

Definition at line 6332 of file ARMISelLowering.cpp.

References assert(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::begin(), llvm::ISD::BITCAST, llvm::EVT::bitsLT(), llvm::ARMISD::BUILD_VECTOR, llvm::ISD::BUILD_VECTOR, llvm::ISD::CONCAT_VECTORS, llvm::dyn_cast(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::empty(), llvm::SmallVectorTemplateCommon< T >::end(), llvm::ISD::EXTRACT_SUBVECTOR, llvm::ISD::EXTRACT_VECTOR_ELT, llvm::find(), llvm::ConstantSDNode::getAPIntValue(), llvm::SelectionDAG::getBuildVector(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getContext(), llvm::EVT::getFloatingPointVT(), llvm::ARM_AM::getFP32Imm(), llvm::APInt::getLimitedValue(), llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDNode::getOpcode(), llvm::SDValue::getOperand(), llvm::SDNode::getOperand(), llvm::EVT::getScalarSizeInBits(), llvm::EVT::getSizeInBits(), llvm::ARM_AM::getSOImmVal(), llvm::SelectionDAG::getUNDEF(), llvm::SDValue::getValueType(), llvm::EVT::getVectorElementType(), llvm::EVT::getVectorNumElements(), llvm::SelectionDAG::getVectorShuffle(), llvm::EVT::getVectorVT(), llvm::APInt::getZExtValue(), I, llvm::MVT::i32, llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::insert(), llvm::SmallVectorImpl< T >::insert(), llvm::ISD::INSERT_VECTOR_ELT, llvm::EVT::is128BitVector(), llvm::APInt::isAllOnesValue(), isConstant(), llvm::BuildVectorSDNode::isConstantSplat(), llvm::EVT::isFloatingPoint(), isNEONModifiedImm(), llvm::ISD::isNormalLoad(), llvm::ARMTargetLowering::isShuffleMaskLegal(), llvm::ARMSubtarget::isThumb1Only(), llvm::SDValue::isUndef(), LLVM_DEBUG, llvm::Lower, llvm::makeArrayRef(), llvm::BitmaskEnumDetail::Mask(), llvm::max(), N, llvm::SDNode::op_begin(), llvm::operator==(), llvm::SmallVectorTemplateBase< T >::push_back(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::ISD::SCALAR_TO_VECTOR, llvm::SmallVectorBase::size(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::size(), llvm::Sched::Source, llvm::Upper, llvm::MVT::v2f32, llvm::MVT::v2f64, llvm::MVT::v4f32, llvm::ARMISD::VDUP, llvm::ARMISD::VDUPLANE, llvm::ARMISD::VEXT, llvm::ARMISD::VMOVFPIMM, llvm::ARMISD::VMOVIMM, llvm::VMOVModImm, llvm::ARMISD::VMVNIMM, and llvm::VMVNModImm.

◆ isSingletonVEXTMask()

static bool isSingletonVEXTMask ( ArrayRef< int >  M,
EVT  VT,
unsigned Imm 
)
static

Definition at line 5964 of file ARMISelLowering.cpp.

References llvm::EVT::getVectorNumElements().

Referenced by LowerVECTOR_SHUFFLE().

◆ isSRA16()

static bool isSRA16 ( const SDValue Op)
static

◆ isSRL16()

static bool isSRL16 ( const SDValue Op)
static

◆ isUpperSaturate()

static bool isUpperSaturate ( const SDValue  LHS,
const SDValue  RHS,
const SDValue  TrueVal,
const SDValue  FalseVal,
const ISD::CondCode  CC,
const SDValue  K 
)
static

Definition at line 4250 of file ARMISelLowering.cpp.

References isGTorGE(), and isLTorLE().

Referenced by isSaturatingConditional().

◆ isVEXTMask()

static bool isVEXTMask ( ArrayRef< int >  M,
EVT  VT,
bool ReverseVEXT,
unsigned Imm 
)
static

◆ isVREVMask()

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 6031 of file ARMISelLowering.cpp.

References assert(), llvm::EVT::getScalarSizeInBits(), and llvm::EVT::getVectorNumElements().

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

◆ isVShiftLImm()

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 12224 of file ARMISelLowering.cpp.

References assert(), llvm::EVT::getScalarSizeInBits(), getVShiftImm(), and llvm::EVT::isVector().

Referenced by PerformIntrinsicCombine(), and PerformShiftCombine().

◆ isVShiftRImm()

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 12238 of file ARMISelLowering.cpp.

References assert(), llvm::EVT::getScalarSizeInBits(), getVShiftImm(), and llvm::EVT::isVector().

Referenced by PerformIntrinsicCombine(), and PerformShiftCombine().

◆ isVTBLMask()

static bool isVTBLMask ( ArrayRef< int >  M,
EVT  VT 
)
static

◆ isVTRN_v_undef_Mask()

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 6124 of file ARMISelLowering.cpp.

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

Referenced by isNEONTwoResultShuffleMask().

◆ isVTRNMask()

static bool isVTRNMask ( ArrayRef< int >  M,
EVT  VT,
unsigned WhichResult 
)
static

◆ isVUZP_v_undef_Mask()

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 6186 of file ARMISelLowering.cpp.

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

Referenced by isNEONTwoResultShuffleMask().

◆ isVUZPMask()

static bool isVUZPMask ( ArrayRef< int >  M,
EVT  VT,
unsigned WhichResult 
)
static

◆ IsVUZPShuffleNode()

static bool IsVUZPShuffleNode ( SDNode N)
static

◆ isVZIP_v_undef_Mask()

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 6260 of file ARMISelLowering.cpp.

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

Referenced by isNEONTwoResultShuffleMask().

◆ isVZIPMask()

static bool isVZIPMask ( ArrayRef< int >  M,
EVT  VT,
unsigned WhichResult 
)
static

◆ isZeroExtended()

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 7219 of file ARMISelLowering.cpp.

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

Referenced by isAddSubZExt(), and LowerMUL().

◆ isZeroOrAllOnes()

static bool isZeroOrAllOnes ( SDValue  N,
bool  AllOnes 
)
inlinestatic

Definition at line 9643 of file ARMISelLowering.cpp.

References llvm::isAllOnesConstant(), and llvm::isNullConstant().

Referenced by isConditionalZeroOrAllOnes().

◆ LowerADDSUBCARRY()

static SDValue LowerADDSUBCARRY ( SDValue  Op,
SelectionDAG DAG 
)
static

Definition at line 7621 of file ARMISelLowering.cpp.

References llvm::MCID::Add, llvm::ISD::ADD, llvm::ISD::ADDCARRY, llvm::ARMISD::ADDE, Arg, llvm::AMDGPU::HSAMD::Kernel::Key::Args, llvm::CallingConv::ARM_AAPCS_VFP, assert(), ConvertBooleanCarryToCarryFlag(), ConvertCarryFlagToBooleanCarry(), llvm::MVT::f64, llvm::StructType::get(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getDataLayout(), llvm::SelectionDAG::getEntryNode(), llvm::SelectionDAG::getExternalSymbol(), llvm::SelectionDAG::getFrameIndex(), llvm::MachineFunction::getFrameInfo(), llvm::MachineFunction::getFunction(), llvm::SelectionDAG::getIntPtrConstant(), llvm::TargetLoweringBase::getLibcallCallingConv(), llvm::TargetLoweringBase::getLibcallName(), llvm::SelectionDAG::getLoad(), llvm::SelectionDAG::getMachineFunction(), llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDNode::getOpcode(), llvm::SDValue::getOperand(), llvm::SDNode::getOperand(), llvm::Type::getPointerTo(), llvm::TargetLoweringBase::getPointerTy(), llvm::EVT::getStoreSize(), llvm::SelectionDAG::getSubtarget(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::EVT::getTypeForEVT(), llvm::SDValue::getValue(), llvm::SDValue::getValueType(), llvm::SDNode::getValueType(), llvm::Type::getVoidTy(), llvm::SelectionDAG::getVTList(), llvm::SDNode::getVTList(), llvm::ARMSubtarget::hasDivideInARMMode(), llvm::ARMSubtarget::hasDivideInThumbMode(), llvm::MVT::i32, llvm::MVT::i64, llvm::ARMSubtarget::isAPCS_ABI(), llvm::ARMSubtarget::isTargetDarwin(), llvm::ARMSubtarget::isThumb(), llvm::EVT::isVector(), llvm::TargetLowering::LowerCallTo(), llvm::ISD::MERGE_VALUES, Name, llvm::Function::optForMinSize(), llvm::MVT::Other, llvm::ISD::SDIV, llvm::TargetLowering::CallLoweringInfo::setChain(), llvm::TargetLowering::CallLoweringInfo::setDebugLoc(), llvm::APInt::sgt(), Signed, llvm::ISD::SUB, llvm::ARMISD::SUBE, and llvm::ARMISD::WIN__DBZCHK.

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

◆ LowerATOMIC_FENCE()

static SDValue LowerATOMIC_FENCE ( SDValue  Op,
SelectionDAG DAG,
const ARMSubtarget Subtarget 
)
static

◆ LowerAtomicLoadStore()

static SDValue LowerAtomicLoadStore ( SDValue  Op,
SelectionDAG DAG 
)
static

◆ LowerCONCAT_VECTORS()

static SDValue LowerCONCAT_VECTORS ( SDValue  Op,
SelectionDAG DAG 
)
static

◆ LowerCTPOP()

static SDValue LowerCTPOP ( SDNode N,
SelectionDAG DAG,
const ARMSubtarget ST 
)
static

◆ LowerCTTZ()

static SDValue LowerCTTZ ( SDNode N,
SelectionDAG DAG,
const ARMSubtarget ST 
)
static

◆ LowerEXTRACT_VECTOR_ELT()

static SDValue LowerEXTRACT_VECTOR_ELT ( SDValue  Op,
SelectionDAG DAG 
)
static

◆ LowerFPOWI()

static SDValue LowerFPOWI ( SDValue  Op,
const ARMSubtarget Subtarget,
SelectionDAG DAG 
)
static

◆ LowerINSERT_VECTOR_ELT()

static SDValue LowerINSERT_VECTOR_ELT ( SDValue  Op,
SelectionDAG DAG 
)
static

◆ LowerInterruptReturn()

static SDValue LowerInterruptReturn ( SmallVectorImpl< SDValue > &  RetOps,
const SDLoc DL,
SelectionDAG DAG 
)
static

Definition at line 2425 of file ARMISelLowering.cpp.

References llvm::CCState::AnalyzeReturn(), Arg, assert(), llvm::CCValAssign::BCvt, llvm::SmallVectorTemplateCommon< T >::begin(), llvm::ISD::BITCAST, llvm::ARMTargetLowering::CCAssignFnForReturn(), contains(), Copies, llvm::ISD::CopyToReg, llvm::SmallPtrSetImpl< PtrType >::count(), llvm::ISD::EXTRACT_VECTOR_ELT, F(), llvm::MVT::f16, llvm::MVT::f32, llvm::MVT::f64, llvm::CCValAssign::Full, llvm::ARMBaseRegisterInfo::getCalleeSavedRegsViaCopy(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getCopyToReg(), llvm::MVT::getFloatingPointVT(), llvm::Function::getFnAttribute(), llvm::MachineFunction::getFunction(), llvm::MachineFunction::getInfo(), llvm::CCValAssign::getLocInfo(), llvm::CCValAssign::getLocReg(), llvm::CCValAssign::getLocVT(), llvm::SelectionDAG::getMachineFunction(), llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SDNode::getNumOperands(), llvm::SDNode::getNumValues(), llvm::SDValue::getOpcode(), llvm::SDNode::getOpcode(), llvm::SDValue::getOperand(), llvm::SDNode::getOperand(), llvm::Instruction::getParent(), llvm::BasicBlock::getParent(), llvm::SelectionDAG::getRegister(), llvm::ARMSubtarget::getRegisterInfo(), llvm::SDValue::getValue(), llvm::Attribute::getValueAsString(), llvm::SDValue::getValueType(), llvm::TargetLoweringBase::getValueType(), llvm::SelectionDAG::getVTList(), llvm::MVT::Glue, llvm::Function::hasFnAttribute(), llvm::ARMSubtarget::hasFullFP16(), llvm::SDNode::hasNUsesOfValue(), llvm::SDNode::hasOneUse(), I, llvm::MVT::i16, llvm::MVT::i32, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::SmallVectorImpl< T >::insert(), llvm::ARMISD::INTRET_FLAG, llvm::ARMSubtarget::isLittle(), llvm::ARMSubtarget::isMClass(), llvm::CCValAssign::isRegLoc(), llvm::CallInst::isTailCall(), llvm::ARMSubtarget::isTargetHardFloat(), llvm::ARMSubtarget::isThumb1Only(), llvm_unreachable, N, llvm::CCValAssign::needsCustom(), llvm::MVT::Other, llvm::SmallVectorTemplateBase< T >::push_back(), llvm::report_fatal_error(), llvm::ARMISD::RET_FLAG, llvm::ARMFunctionInfo::setReturnRegsCount(), llvm::SmallVectorBase::size(), llvm::SmallPtrSetImplBase::size(), llvm::ARMSubtarget::supportsTailCall(), TRI, llvm::SDNode::use_begin(), llvm::SDNode::use_end(), llvm::MVT::v2f64, llvm::ARMISD::VMOVRRD, and llvm::ISD::ZERO_EXTEND.

◆ LowerMUL()

static SDValue LowerMUL ( SDValue  Op,
SelectionDAG DAG 
)
static

◆ LowerPREFETCH()

static SDValue LowerPREFETCH ( SDValue  Op,
SelectionDAG DAG,
const ARMSubtarget Subtarget 
)
static

◆ LowerReverse_VECTOR_SHUFFLEv16i8_v8i16()

static SDValue LowerReverse_VECTOR_SHUFFLEv16i8_v8i16 ( SDValue  Op,
SelectionDAG DAG 
)
static

◆ LowerSDIV()

static SDValue LowerSDIV ( SDValue  Op,
SelectionDAG DAG 
)
static

◆ LowerSDIV_v4i16()

static SDValue LowerSDIV_v4i16 ( SDValue  N0,
SDValue  N1,
const SDLoc dl,
SelectionDAG DAG 
)
static

◆ LowerSDIV_v4i8()

static SDValue LowerSDIV_v4i8 ( SDValue  X,
SDValue  Y,
const SDLoc dl,
SelectionDAG DAG 
)
static

◆ LowerSETCCCARRY()

static SDValue LowerSETCCCARRY ( SDValue  Op,
SelectionDAG DAG 
)
static

◆ LowerShift()

static SDValue LowerShift ( SDNode N,
SelectionDAG DAG,
const ARMSubtarget ST 
)
static

◆ LowerUDIV()

static SDValue LowerUDIV ( SDValue  Op,
SelectionDAG DAG 
)
static

◆ LowerVASTART()

static SDValue LowerVASTART ( SDValue  Op,
SelectionDAG DAG 
)
static

Definition at line 3468 of file ARMISelLowering.cpp.

References llvm::ISD::ADD, llvm::MachineFunction::addLiveIn(), llvm::CCState::AnalyzeFormalArguments(), llvm::Function::arg_begin(), llvm::array_lengthof(), assert(), llvm::ISD::AssertSext, llvm::ISD::AssertZext, llvm::CCValAssign::BCvt, llvm::ISD::BITCAST, llvm::ARMTargetLowering::CCAssignFnForCall(), llvm::MachineFrameInfo::CreateFixedObject(), llvm::SmallVectorBase::empty(), llvm::MVT::f16, llvm::MVT::f32, llvm::MVT::f64, llvm::ISD::FrameIndex, llvm::CCValAssign::Full, llvm::ISD::ArgFlagsTy::getByValSize(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getCopyFromReg(), llvm::SelectionDAG::getDataLayout(), llvm::CCState::getFirstUnallocated(), llvm::MachinePointerInfo::getFixedStack(), llvm::SelectionDAG::getFrameIndex(), llvm::MachineFunction::getFrameInfo(), llvm::MachineFunction::getFunction(), llvm::MachineFunction::getInfo(), llvm::CCState::getInRegsParamInfo(), llvm::CCState::getInRegsParamsCount(), llvm::CCState::getInRegsParamsProcessed(), llvm::SelectionDAG::getIntPtrConstant(), llvm::SelectionDAG::getLoad(), llvm::CCValAssign::getLocInfo(), llvm::CCValAssign::getLocMemOffset(), llvm::CCValAssign::getLocReg(), llvm::CCValAssign::getLocVT(), llvm::SelectionDAG::getMachineFunction(), llvm::CCState::getNextStackOffset(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOperand(), llvm::TargetLoweringBase::getPointerTy(), llvm::MVT::getSizeInBits(), llvm::SelectionDAG::getStore(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::CCValAssign::getValNo(), llvm::SDValue::getValue(), llvm::SelectionDAG::getValueType(), llvm::CCValAssign::getValVT(), llvm::ARMFunctionInfo::getVarArgsFrameIndex(), llvm::MachineFrameInfo::hasVAStart(), llvm::MVT::i32, llvm::MVT::i64, llvm::ISD::INSERT_VECTOR_ELT, llvm::ISD::ArgFlagsTy::isByVal(), llvm::ARMSubtarget::isLittle(), llvm::CCValAssign::isMemLoc(), llvm::CCValAssign::isRegLoc(), llvm::ARMFunctionInfo::isThumb1OnlyFunction(), llvm_unreachable, llvm::CCValAssign::needsCustom(), llvm::CCState::nextInRegsParam(), llvm::MVT::Other, llvm::SmallVectorTemplateBase< T >::push_back(), R4, Reg, llvm::CCState::rewindByValRegsInfo(), llvm::ARMFunctionInfo::setArgRegsSaveSize(), llvm::ARMFunctionInfo::setArgumentStackSize(), llvm::ARMFunctionInfo::setVarArgsFrameIndex(), llvm::CCValAssign::SExt, llvm::SPII::Store, std::swap(), llvm::ISD::TokenFactor, llvm::ISD::TRUNCATE, llvm::ISD::UNDEF, llvm::MVT::v2f64, llvm::MVT::v4f16, llvm::MVT::v8f16, llvm::ARMISD::VMOVDRR, and llvm::CCValAssign::ZExt.

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

◆ LowerVECTOR_SHUFFLE()

static SDValue LowerVECTOR_SHUFFLE ( SDValue  Op,
SelectionDAG DAG 
)
static

Definition at line 6936 of file ARMISelLowering.cpp.

References llvm::all_of(), assert(), llvm::ISD::BITCAST, llvm::ARMISD::BUILD_VECTOR, llvm::ISD::BUILD_VECTOR, llvm::ISD::CONCAT_VECTORS, 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::SDNode::getOperand(), llvm::EVT::getScalarSizeInBits(), llvm::ShuffleVectorSDNode::getSplatIndex(), llvm::SelectionDAG::getUNDEF(), llvm::SDValue::getValue(), llvm::SDValue::getValueType(), llvm::EVT::getVectorNumElements(), llvm::EVT::getVectorVT(), llvm::SelectionDAG::getVTList(), llvm::MVT::i32, isNEONTwoResultShuffleMask(), isReverseMask(), isSingletonVEXTMask(), llvm::ShuffleVectorSDNode::isSplat(), llvm::SDValue::isUndef(), llvm::SDNode::isUndef(), isVEXTMask(), isVREVMask(), LowerReverse_VECTOR_SHUFFLEv16i8_v8i16(), LowerVECTOR_SHUFFLEv8i8(), PerfectShuffleTable, llvm::SmallVectorTemplateBase< T >::push_back(), llvm::ISD::SCALAR_TO_VECTOR, std::swap(), 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, and llvm::ARMISD::VREV64.

Referenced by llvm::PPCTargetLowering::functionArgumentNeedsConsecutiveRegisters(), llvm::HexagonTargetLowering::isCtlzFast(), llvm::ARMTargetLowering::LowerOperation(), and llvm::AArch64TargetLowering::supportSwiftError().

◆ LowerVECTOR_SHUFFLEv8i8()

static SDValue LowerVECTOR_SHUFFLEv8i8 ( SDValue  Op,
ArrayRef< int >  ShuffleMask,
SelectionDAG DAG 
)
static

◆ LowerVectorFP_TO_INT()

static SDValue LowerVectorFP_TO_INT ( SDValue  Op,
SelectionDAG DAG 
)
static

◆ LowerVectorINT_TO_FP()

static SDValue LowerVectorINT_TO_FP ( SDValue  Op,
SelectionDAG DAG 
)
static

Definition at line 4851 of file ARMISelLowering.cpp.

References llvm::ISD::ADD, llvm::MachineFunction::addLiveIn(), llvm::ISD::AND, assert(), llvm::ISD::BITCAST, llvm::ARM_AM::createNEONModImm(), llvm::StringSwitch< T, R >::Default(), llvm::Depth, llvm::ISD::EXTRACT_VECTOR_ELT, llvm::MVT::f32, llvm::MVT::f64, first, llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getCopyFromReg(), llvm::SelectionDAG::getEntryNode(), llvm::MachineFunction::getFrameInfo(), llvm::ARMBaseRegisterInfo::getFrameRegister(), llvm::SelectionDAG::getLoad(), llvm::SelectionDAG::getMachineFunction(), llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::ARMTargetLowering::getRegClassFor(), llvm::RTLIB::getSINTTOFP(), llvm::SelectionDAG::getSubtarget(), llvm::SelectionDAG::getTargetConstant(), llvm::RTLIB::getUINTTOFP(), llvm::SDValue::getValue(), llvm::SDValue::getValueType(), llvm::EVT::getVectorElementType(), llvm::SelectionDAG::getVTList(), llvm::ARMSubtarget::hasNEON(), llvm::MipsISD::Hi, llvm::MVT::i32, llvm::ARMSubtarget::isFPOnlySP(), llvm::EVT::isVector(), llvm_unreachable, llvm::MipsISD::Lo, llvm::TargetLowering::makeLibCall(), llvm::BitmaskEnumDetail::Mask(), llvm::ISD::OR, Reg, llvm::report_fatal_error(), llvm::ISD::SCALAR_TO_VECTOR, llvm::MachineFrameInfo::setFrameAddressIsTaken(), llvm::MachineFrameInfo::setReturnAddressIsTaken(), llvm::ISD::SIGN_EXTEND, llvm::ISD::SINT_TO_FP, llvm::ISD::UINT_TO_FP, llvm::SelectionDAG::UnrollVectorOp(), llvm::MVT::v1i64, llvm::MVT::v2f32, llvm::MVT::v2i32, llvm::MVT::v4f16, llvm::MVT::v4f32, llvm::MVT::v4i16, llvm::MVT::v4i32, llvm::MVT::v8f16, llvm::MVT::v8i16, llvm::MVT::v8i8, llvm::TargetLowering::verifyReturnAddressArgumentIsConstant(), llvm::ARMISD::VMOVDRR, llvm::ARMISD::VMOVIMM, llvm::ARMISD::VMOVRRD, llvm::ARMISD::VSHL, llvm::ARMISD::VSHRu, llvm::ISD::XOR, and llvm::ISD::ZERO_EXTEND.

◆ LowerVSETCC()

static SDValue LowerVSETCC ( SDValue  Op,
SelectionDAG DAG 
)
static

◆ LowerWRITE_REGISTER()

static SDValue LowerWRITE_REGISTER ( SDValue  Op,
SelectionDAG DAG 
)
static

◆ MatchingStackOffset()

static bool MatchingStackOffset ( SDValue  Arg,
unsigned  Offset,
ISD::ArgFlagsTy  Flags,
MachineFrameInfo MFI,
const MachineRegisterInfo MRI,
const TargetInstrInfo TII 
)
static

MatchingStackOffset - Return true if the given stack call argument is already available in the same position (relatively) of the caller's incoming argument stack.

Definition at line 2244 of file ARMISelLowering.cpp.

References llvm::CCState::AnalyzeCallOperands(), assert(), C, Callee, llvm::ARMTargetLowering::CCAssignFnForCall(), llvm::ARMTargetLowering::CCAssignFnForReturn(), llvm::CCState::CheckReturn(), Context, llvm::ISD::CopyFromReg, llvm::tgtok::Def, llvm::dyn_cast(), llvm::SmallVectorBase::empty(), G, llvm::ARMFunctionInfo::getArgRegsSaveSize(), llvm::Function::getCallingConv(), llvm::ARMBaseRegisterInfo::getCallPreservedMask(), llvm::SelectionDAG::getContext(), llvm::MachineFunction::getFrameInfo(), llvm::MachineFunction::getFunction(), llvm::FrameIndexSDNode::getIndex(), llvm::MachineFunction::getInfo(), llvm::ARMSubtarget::getInstrInfo(), llvm::CCValAssign::getLocInfo(), llvm::CCValAssign::getLocMemOffset(), llvm::CCValAssign::getLocVT(), llvm::SelectionDAG::getMachineFunction(), llvm::CCState::getNextStackOffset(), llvm::SDValue::getNode(), llvm::MachineFrameInfo::getObjectOffset(), llvm::MachineFrameInfo::getObjectSize(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), getReg(), llvm::MachineFunction::getRegInfo(), llvm::ARMSubtarget::getRegisterInfo(), llvm::TargetLoweringBase::getTargetMachine(), llvm::TargetMachine::getTargetTriple(), llvm::SDValue::getValueSizeInBits(), llvm::MachineRegisterInfo::getVRegDef(), llvm::GlobalValue::hasExternalWeakLinkage(), llvm::Function::hasFnAttribute(), llvm::CCValAssign::Indirect, llvm::ISD::ArgFlagsTy::isByVal(), llvm::MachineFrameInfo::isFixedObjectIndex(), llvm::TargetInstrInfo::isLoadFromStackSlot(), llvm::Triple::isOSBinFormatELF(), llvm::Triple::isOSBinFormatMachO(), llvm::Triple::isOSWindows(), llvm::CCValAssign::isRegLoc(), llvm::ARMSubtarget::isThumb1Only(), llvm::TargetRegisterInfo::isVirtualRegister(), llvm::max(), MRI, llvm::CCValAssign::needsCustom(), llvm::TargetLowering::parametersInCSRMatch(), llvm::CCState::resultsCompatible(), llvm::SmallVectorBase::size(), llvm::ARMSubtarget::supportsTailCall(), TII, TRI, and llvm::MVT::v2f64.

◆ memOpAlign()

static bool memOpAlign ( unsigned  DstAlign,
unsigned  SrcAlign,
unsigned  AlignCheck 
)
static

Definition at line 12978 of file ARMISelLowering.cpp.

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

◆ OtherSucc()

static MachineBasicBlock* OtherSucc ( MachineBasicBlock MBB,
MachineBasicBlock Succ 
)
static

◆ ParseBFI()

static SDValue ParseBFI ( SDNode N,
APInt ToMask,
APInt FromMask 
)
static

◆ PerformADDCombine()

static SDValue PerformADDCombine ( SDNode N,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget Subtarget 
)
static

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

Definition at line 10530 of file ARMISelLowering.cpp.

References llvm::SDNode::getOperand(), PerformADDCombineWithOperands(), and PerformSHLSimplify().

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

◆ PerformADDCombineWithOperands()

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 10373 of file ARMISelLowering.cpp.

References AddCombineBUILD_VECTORToVPADDL(), AddCombineToVPADD(), AddCombineVUZPToVPADDL(), combineSelectAndUse(), llvm::SDValue::getNode(), and llvm::SDNode::hasOneUse().

Referenced by PerformADDCombine().

◆ PerformAddcSubcCombine()

static SDValue PerformAddcSubcCombine ( SDNode N,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget Subtarget 
)
static

◆ PerformADDECombine()

static SDValue PerformADDECombine ( SDNode N,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget Subtarget 
)
static

PerformADDECombine - Target-specific dag combine transform from ARMISD::ADDC, ARMISD::ADDE, and ISD::MUL_LOHI to MLAL or ARMISD::ADDC, ARMISD::ADDE and ARMISD::UMLAL to ARMISD::UMAAL.

Definition at line 10356 of file ARMISelLowering.cpp.

References AddCombineTo64bitUMAAL(), llvm::TargetLowering::DAGCombinerInfo::isBeforeLegalize(), llvm::ARMSubtarget::isThumb1Only(), and PerformAddeSubeCombine().

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

◆ PerformAddeSubeCombine()

static SDValue PerformAddeSubeCombine ( SDNode N,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget Subtarget 
)
static

◆ PerformANDCombine()

static SDValue PerformANDCombine ( SDNode N,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget Subtarget 
)
static

◆ PerformARMBUILD_VECTORCombine()

static SDValue PerformARMBUILD_VECTORCombine ( SDNode N,
TargetLowering::DAGCombinerInfo DCI 
)
static

◆ PerformBFICombine()

static SDValue PerformBFICombine ( SDNode N,
TargetLowering::DAGCombinerInfo DCI 
)
static

◆ PerformBUILD_VECTORCombine()

static SDValue PerformBUILD_VECTORCombine ( SDNode N,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget Subtarget 
)
static

◆ PerformExtendCombine()

static SDValue PerformExtendCombine ( SDNode N,
SelectionDAG DAG,
const ARMSubtarget ST 
)
static

◆ PerformInsertEltCombine()

static SDValue PerformInsertEltCombine ( SDNode N,
TargetLowering::DAGCombinerInfo DCI 
)
static

◆ PerformIntrinsicCombine()

static SDValue PerformIntrinsicCombine ( SDNode N,
SelectionDAG DAG 
)
static

◆ PerformLOADCombine()

static SDValue PerformLOADCombine ( SDNode N,
TargetLowering::DAGCombinerInfo DCI 
)
static

◆ PerformMULCombine()

static SDValue PerformMULCombine ( SDNode N,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget Subtarget 
)
static

◆ PerformORCombine()

static SDValue PerformORCombine ( SDNode N,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget Subtarget 
)
static

◆ PerformORCombineToBFI()

static SDValue PerformORCombineToBFI ( SDNode N,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget Subtarget 
)
static

◆ PerformORCombineToSMULWBT()

static SDValue PerformORCombineToSMULWBT ( SDNode OR,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget Subtarget 
)
static

◆ PerformShiftCombine()

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 12401 of file ARMISelLowering.cpp.

References assert(), llvm::ISD::BSWAP, C, 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::MVT::i32, 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().

◆ PerformSHLSimplify()

static SDValue PerformSHLSimplify ( SDNode N,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget ST 
)
static

◆ PerformSTORECombine()

static SDValue PerformSTORECombine ( SDNode N,
TargetLowering::DAGCombinerInfo DCI 
)
static

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

Definition at line 11940 of file ARMISelLowering.cpp.

References llvm::ISD::ADD, llvm::TargetLowering::DAGCombinerInfo::AddToWorklist(), assert(), llvm::ISD::BITCAST, CombineBaseUpdate(), llvm::TargetLowering::DAGCombinerInfo::DAG, E, llvm::ISD::EXTRACT_VECTOR_ELT, llvm::MVT::f64, llvm::MemSDNode::getAAInfo(), llvm::MemSDNode::getAlignment(), llvm::StoreSDNode::getBasePtr(), llvm::MemSDNode::getChain(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getDataLayout(), llvm::MachineMemOperand::getFlags(), llvm::SelectionDAG::getIntPtrConstant(), llvm::MemSDNode::getMemOperand(), 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::getScalarSizeInBits(), 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::getVectorNumElements(), llvm::SelectionDAG::getVectorShuffle(), llvm::EVT::getVectorVT(), llvm::SDNode::hasOneUse(), I, llvm::MVT::i32, llvm::MVT::i64, llvm::MVT::i8, llvm::MVT::integer_valuetypes(), llvm::DataLayout::isBigEndian(), llvm::ISD::isNormalStore(), llvm::isPowerOf2_32(), llvm::StoreSDNode::isTruncatingStore(), llvm::TargetLoweringBase::isTypeLegal(), llvm::EVT::isVector(), llvm::MemSDNode::isVolatile(), N, llvm::MVT::Other, llvm::SmallVectorTemplateBase< T >::push_back(), llvm::ISD::TokenFactor, and llvm::ARMISD::VMOVDRR.

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

◆ PerformSUBCombine()

static SDValue PerformSUBCombine ( SDNode N,
TargetLowering::DAGCombinerInfo DCI 
)
static

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

Definition at line 10550 of file ARMISelLowering.cpp.

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

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

◆ PerformUMLALCombine()

static SDValue PerformUMLALCombine ( SDNode N,
SelectionDAG DAG,
const ARMSubtarget Subtarget 
)
static

◆ PerformVCVTCombine()

static SDValue PerformVCVTCombine ( SDNode N,
SelectionDAG DAG,
const ARMSubtarget Subtarget 
)
static

◆ PerformVDIVCombine()

static SDValue PerformVDIVCombine ( SDNode N,
SelectionDAG DAG,
const ARMSubtarget Subtarget 
)
static

◆ PerformVDUPCombine()

static SDValue PerformVDUPCombine ( SDNode N,
TargetLowering::DAGCombinerInfo DCI 
)
static

◆ PerformVDUPLANECombine()

static SDValue PerformVDUPLANECombine ( SDNode N,
TargetLowering::DAGCombinerInfo DCI 
)
static

◆ PerformVECTOR_SHUFFLECombine()

static SDValue PerformVECTOR_SHUFFLECombine ( SDNode N,
SelectionDAG DAG 
)
static

◆ PerformVLDCombine()

static SDValue PerformVLDCombine ( SDNode N,
TargetLowering::DAGCombinerInfo DCI 
)
static

◆ PerformVMOVDRRCombine()

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 11326 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().

◆ PerformVMOVRRDCombine()

static SDValue PerformVMOVRRDCombine ( SDNode N,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget Subtarget 
)
static

◆ PerformVMULCombine()

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 10578 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().

◆ PerformXORCombine()

static SDValue PerformXORCombine ( SDNode N,
TargetLowering::DAGCombinerInfo DCI,
const ARMSubtarget Subtarget 
)
static

◆ promoteToConstantPool()

static SDValue promoteToConstantPool ( const ARMTargetLowering TLI,
const GlobalValue GV,
SelectionDAG DAG,
EVT  PtrVT,
const SDLoc dl 
)
static

◆ ReplaceCMP_SWAP_64Results()

static void ReplaceCMP_SWAP_64Results ( SDNode N,
SmallVectorImpl< SDValue > &  Results,
SelectionDAG DAG 
)
static

◆ ReplaceLongIntrinsic()

static void ReplaceLongIntrinsic ( SDNode N,
SmallVectorImpl< SDValue > &  Results,
SelectionDAG DAG 
)
static

◆ ReplaceREADCYCLECOUNTER()

static void ReplaceREADCYCLECOUNTER ( SDNode N,
SmallVectorImpl< SDValue > &  Results,
SelectionDAG DAG,
const ARMSubtarget Subtarget 
)
static

◆ SelectPairHalf()

static unsigned SelectPairHalf ( unsigned  Elements,
ArrayRef< int >  Mask,
unsigned  Index 
)
static

◆ SkipExtensionForVMULL()

static SDValue SkipExtensionForVMULL ( SDNode N,
SelectionDAG DAG 
)
static

◆ SkipLoadExtensionForVMULL()

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 7269 of file ARMISelLowering.cpp.

References llvm::MemSDNode::getAlignment(), llvm::LoadSDNode::getBasePtr(), llvm::MemSDNode::getChain(), getExtensionTo64Bits(), llvm::LoadSDNode::getExtensionType(), llvm::SelectionDAG::getExtLoad(), llvm::MachineMemOperand::getFlags(), llvm::SelectionDAG::getLoad(), llvm::MemSDNode::getMemOperand(), llvm::MemSDNode::getMemoryVT(), and llvm::MemSDNode::getPointerInfo().

Referenced by SkipExtensionForVMULL().

◆ STATISTIC() [1/4]

STATISTIC ( NumTailCalls  ,
"Number of tail calls  
)

◆ STATISTIC() [2/4]

STATISTIC ( NumMovwMovt  ,
"Number of GAs materialized with movw + movt"   
)

◆ STATISTIC() [3/4]

STATISTIC ( NumLoopByVals  ,
"Number of loops generated for byval arguments"   
)

◆ STATISTIC() [4/4]

STATISTIC ( NumConstpoolPromoted  ,
"Number of constants with their storage promoted into constant pools"   
)

◆ WinDBZCheckDenominator()

static SDValue WinDBZCheckDenominator ( SelectionDAG DAG,
SDNode N,
SDValue  InChain 
)
static

Variable Documentation

◆ ARMInterworking

cl::opt<bool> ARMInterworking("arm-interworking", cl::Hidden, cl::desc("Enable / disable ARM interworking (for debugging only)"), cl::init(true))
static

◆ ConstpoolPromotionMaxSize

cl::opt<unsigned> ConstpoolPromotionMaxSize("arm-promote-constant-max-size", cl::Hidden, cl::desc("Maximum size of constant to promote into a constant pool"), cl::init(64))
static

Referenced by promoteToConstantPool().

◆ ConstpoolPromotionMaxTotal

cl::opt<unsigned> ConstpoolPromotionMaxTotal("arm-promote-constant-max-total", cl::Hidden, cl::desc("Maximum size of ALL constants to promote into a constant pool"), cl::init(128))
static

Referenced by promoteToConstantPool().

◆ EnableConstpoolPromotion

cl::opt<bool> EnableConstpoolPromotion("arm-promote-constant", cl::Hidden, cl::desc("Enable / disable promotion of unnamed_addr constants into " "constant pools"), cl::init(false))
static

Referenced by promoteToConstantPool().

◆ GPRArgRegs

const MCPhysReg GPRArgRegs[]
static
Initial value:
= {
ARM::R0, ARM::R1, ARM::R2, ARM::R3
}
#define R2(n)

Definition at line 145 of file ARMISelLowering.cpp.

Referenced by llvm::AArch64TargetLowering::CCAssignFnForReturn(), llvm::f64AssignAAPCS(), and llvm::AArch64RegisterInfo::isAnyArgRegReserved().