MipsSEISelLowering.h revision 7e0df9aa2966d0462e34511524a4958e226b74ee
19e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com//===-- MipsSEISelLowering.h - MipsSE DAG Lowering Interface ----*- C++ -*-===// 29e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com// 39e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com// The LLVM Compiler Infrastructure 49e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com// 59e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com// This file is distributed under the University of Illinois Open Source 69e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com// License. See LICENSE.TXT for details. 74917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com// 84917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com//===----------------------------------------------------------------------===// 9198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com// 10198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com// Subclass of MipsTargetLowering specialized for mips32/64. 11198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com// 124917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com//===----------------------------------------------------------------------===// 134917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com 144917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com#ifndef MipsSEISELLOWERING_H 154917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com#define MipsSEISELLOWERING_H 164917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com 174917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com#include "MipsISelLowering.h" 184917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com#include "MipsRegisterInfo.h" 194917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com 204917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.comnamespace llvm { 214917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com class MipsSETargetLowering : public MipsTargetLowering { 224917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com public: 234917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com explicit MipsSETargetLowering(MipsTargetMachine &TM); 244917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com 25198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com /// \brief Enable MSA support for the given integer type and Register 262e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com /// class. 272e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com void addMSAIntType(MVT::SimpleValueType Ty, const TargetRegisterClass *RC); 282e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com /// \brief Enable MSA support for the given floating-point type and 292e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com /// Register class. 302e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com void addMSAFloatType(MVT::SimpleValueType Ty, 312e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com const TargetRegisterClass *RC); 322e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 332e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com virtual bool allowsUnalignedMemoryAccesses(EVT VT, bool *Fast) const; 342e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 352e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const; 362e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 372e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const; 382e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 392e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com virtual MachineBasicBlock * 40198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com EmitInstrWithCustomInserter(MachineInstr *MI, MachineBasicBlock *MBB) const; 412e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 422e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com virtual bool isShuffleMaskLegal(const SmallVectorImpl<int> &Mask, 432e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com EVT VT) const { 442e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com return false; 452e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com } 462e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 472e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com virtual const TargetRegisterClass *getRepRegClassFor(MVT VT) const { 482e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com if (VT == MVT::Untyped) 492e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com return Subtarget->hasDSP() ? &Mips::ACC64DSPRegClass : 502e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com &Mips::ACC64RegClass; 512e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 522e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com return TargetLowering::getRepRegClassFor(VT); 532e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com } 542e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 55198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com private: 562e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com virtual bool 572e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com isEligibleForTailCallOptimization(const MipsCC &MipsCCInfo, 582e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com unsigned NextStackOffset, 592e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com const MipsFunctionInfo& FI) const; 602e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 612e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com virtual void 622e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com getOpndList(SmallVectorImpl<SDValue> &Ops, 632e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com std::deque< std::pair<unsigned, SDValue> > &RegsToPass, 642e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com bool IsPICCall, bool GlobalOrExternal, bool InternalLinkage, 652e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com CallLoweringInfo &CLI, SDValue Callee, SDValue Chain) const; 662e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 672e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com SDValue lowerLOAD(SDValue Op, SelectionDAG &DAG) const; 682e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com SDValue lowerSTORE(SDValue Op, SelectionDAG &DAG) const; 692e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 70198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com SDValue lowerMulDiv(SDValue Op, unsigned NewOpc, bool HasLo, bool HasHi, 712e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com SelectionDAG &DAG) const; 722e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 732e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com SDValue lowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const; 742e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com SDValue lowerINTRINSIC_W_CHAIN(SDValue Op, SelectionDAG &DAG) const; 752e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com SDValue lowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG) const; 762e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com SDValue lowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const; 772e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com SDValue lowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const; 782e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com /// \brief Lower VECTOR_SHUFFLE into one of a number of instructions 792e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com /// depending on the indices in the shuffle. 802e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const; 812e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 822e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com MachineBasicBlock *emitBPOSGE32(MachineInstr *MI, 832e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com MachineBasicBlock *BB) const; 842e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com MachineBasicBlock *emitMSACBranchPseudo(MachineInstr *MI, 85198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com MachineBasicBlock *BB, 862e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com unsigned BranchOp) const; 872e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com }; 882e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com} 892e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 902e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com#endif // MipsSEISELLOWERING_H 912e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com