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