15ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//===-- MipsSEISelLowering.h - MipsSE DAG Lowering Interface ----*- C++ -*-===//
25ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//
35ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//                     The LLVM Compiler Infrastructure
45ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//
55ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka// This file is distributed under the University of Illinois Open Source
65ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka// License. See LICENSE.TXT for details.
75ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//
85ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//===----------------------------------------------------------------------===//
95ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//
105ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka// Subclass of MipsTargetLowering specialized for mips32/64.
115ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//
125ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//===----------------------------------------------------------------------===//
135ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
14cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#ifndef MIPSSEISELLOWERING_H
15cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#define MIPSSEISELLOWERING_H
165ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
175ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka#include "MipsISelLowering.h"
18cbcdcfbda5c60d5ac7a492ef8f90b325b6026bd1Akira Hatanaka#include "MipsRegisterInfo.h"
195ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
205ac065a79767cc112eba63136183b7103765d0d3Akira Hatanakanamespace llvm {
215ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka  class MipsSETargetLowering : public MipsTargetLowering  {
225ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka  public:
235ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    explicit MipsSETargetLowering(MipsTargetMachine &TM);
245ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
25da521cc1cc733ee1c27b00e4c0e365c8b702e2e0Daniel Sanders    /// \brief Enable MSA support for the given integer type and Register
26da521cc1cc733ee1c27b00e4c0e365c8b702e2e0Daniel Sanders    /// class.
27ddfbd5805478cf108156bb0159b7495d2b236f7eDaniel Sanders    void addMSAIntType(MVT::SimpleValueType Ty, const TargetRegisterClass *RC);
28da521cc1cc733ee1c27b00e4c0e365c8b702e2e0Daniel Sanders    /// \brief Enable MSA support for the given floating-point type and
29da521cc1cc733ee1c27b00e4c0e365c8b702e2e0Daniel Sanders    /// Register class.
30ddfbd5805478cf108156bb0159b7495d2b236f7eDaniel Sanders    void addMSAFloatType(MVT::SimpleValueType Ty,
31ddfbd5805478cf108156bb0159b7495d2b236f7eDaniel Sanders                         const TargetRegisterClass *RC);
32e2a9376b1bd2204ea6f56a35b762e28e0ef4e35aJack Carter
33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool allowsUnalignedMemoryAccesses(EVT VT, unsigned AS = 0,
34dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                       bool *Fast = nullptr) const override;
355ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
37f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
39d593a77b4cf3b81cd657e351e47cad25ee037ce1Akira Hatanaka
40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MachineBasicBlock *
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    EmitInstrWithCustomInserter(MachineInstr *MI,
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                MachineBasicBlock *MBB) const override;
435ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool isShuffleMaskLegal(const SmallVectorImpl<int> &Mask,
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                            EVT VT) const override {
46bf308cedce5caca4c73e558611a1c8c48687d62eAkira Hatanaka      return false;
47bf308cedce5caca4c73e558611a1c8c48687d62eAkira Hatanaka    }
48bf308cedce5caca4c73e558611a1c8c48687d62eAkira Hatanaka
49cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    const TargetRegisterClass *getRepRegClassFor(MVT VT) const override;
50cbcdcfbda5c60d5ac7a492ef8f90b325b6026bd1Akira Hatanaka
515ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka  private:
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool isEligibleForTailCallOptimization(const MipsCC &MipsCCInfo,
53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                     unsigned NextStackOffset,
54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                     const MipsFunctionInfo& FI) const override;
555ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    void
575ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    getOpndList(SmallVectorImpl<SDValue> &Ops,
585ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka                std::deque< std::pair<unsigned, SDValue> > &RegsToPass,
595ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka                bool IsPICCall, bool GlobalOrExternal, bool InternalLinkage,
60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                CallLoweringInfo &CLI, SDValue Callee,
61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                SDValue Chain) const override;
625ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
633e6758541bb8c143f1f8d3ff550eba3dcc8d22e0Akira Hatanaka    SDValue lowerLOAD(SDValue Op, SelectionDAG &DAG) const;
643e6758541bb8c143f1f8d3ff550eba3dcc8d22e0Akira Hatanaka    SDValue lowerSTORE(SDValue Op, SelectionDAG &DAG) const;
653e6758541bb8c143f1f8d3ff550eba3dcc8d22e0Akira Hatanaka
66f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka    SDValue lowerMulDiv(SDValue Op, unsigned NewOpc, bool HasLo, bool HasHi,
67f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka                        SelectionDAG &DAG) const;
68f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka
694e0980af2e9eda80cbd82895167e650d83ffe087Akira Hatanaka    SDValue lowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
704e0980af2e9eda80cbd82895167e650d83ffe087Akira Hatanaka    SDValue lowerINTRINSIC_W_CHAIN(SDValue Op, SelectionDAG &DAG) const;
712fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders    SDValue lowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG) const;
729a1aaeb012e593fba977015c5d8b6b1aa41a908cDaniel Sanders    SDValue lowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
73da521cc1cc733ee1c27b00e4c0e365c8b702e2e0Daniel Sanders    SDValue lowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
747e0df9aa2966d0462e34511524a4958e226b74eeDaniel Sanders    /// \brief Lower VECTOR_SHUFFLE into one of a number of instructions
757e0df9aa2966d0462e34511524a4958e226b74eeDaniel Sanders    /// depending on the indices in the shuffle.
767e0df9aa2966d0462e34511524a4958e226b74eeDaniel Sanders    SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
774e0980af2e9eda80cbd82895167e650d83ffe087Akira Hatanaka
785ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    MachineBasicBlock *emitBPOSGE32(MachineInstr *MI,
795ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka                                    MachineBasicBlock *BB) const;
803c380d5e28f86984b147fcd424736c498773f37eDaniel Sanders    MachineBasicBlock *emitMSACBranchPseudo(MachineInstr *MI,
813c380d5e28f86984b147fcd424736c498773f37eDaniel Sanders                                            MachineBasicBlock *BB,
823c380d5e28f86984b147fcd424736c498773f37eDaniel Sanders                                            unsigned BranchOp) const;
83b4691b495d867a863aa12de57d45bc6a93e4df78Daniel Sanders    /// \brief Emit the COPY_FW pseudo instruction
84b4691b495d867a863aa12de57d45bc6a93e4df78Daniel Sanders    MachineBasicBlock *emitCOPY_FW(MachineInstr *MI,
85b4691b495d867a863aa12de57d45bc6a93e4df78Daniel Sanders                                   MachineBasicBlock *BB) const;
86b4691b495d867a863aa12de57d45bc6a93e4df78Daniel Sanders    /// \brief Emit the COPY_FD pseudo instruction
87b4691b495d867a863aa12de57d45bc6a93e4df78Daniel Sanders    MachineBasicBlock *emitCOPY_FD(MachineInstr *MI,
88b4691b495d867a863aa12de57d45bc6a93e4df78Daniel Sanders                                   MachineBasicBlock *BB) const;
8937469a132988eb0c888f6a8a205b2aca510e14f8Daniel Sanders    /// \brief Emit the INSERT_FW pseudo instruction
9037469a132988eb0c888f6a8a205b2aca510e14f8Daniel Sanders    MachineBasicBlock *emitINSERT_FW(MachineInstr *MI,
9137469a132988eb0c888f6a8a205b2aca510e14f8Daniel Sanders                                     MachineBasicBlock *BB) const;
9237469a132988eb0c888f6a8a205b2aca510e14f8Daniel Sanders    /// \brief Emit the INSERT_FD pseudo instruction
9337469a132988eb0c888f6a8a205b2aca510e14f8Daniel Sanders    MachineBasicBlock *emitINSERT_FD(MachineInstr *MI,
9437469a132988eb0c888f6a8a205b2aca510e14f8Daniel Sanders                                     MachineBasicBlock *BB) const;
95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// \brief Emit the INSERT_([BHWD]|F[WD])_VIDX pseudo instruction
96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MachineBasicBlock *emitINSERT_DF_VIDX(MachineInstr *MI,
97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                          MachineBasicBlock *BB,
98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                          unsigned EltSizeInBytes,
99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                          bool IsFP) const;
10062e87cb2415b305ca9b888a2338a6af59e74005dDaniel Sanders    /// \brief Emit the FILL_FW pseudo instruction
10162e87cb2415b305ca9b888a2338a6af59e74005dDaniel Sanders    MachineBasicBlock *emitFILL_FW(MachineInstr *MI,
10262e87cb2415b305ca9b888a2338a6af59e74005dDaniel Sanders                                   MachineBasicBlock *BB) const;
10362e87cb2415b305ca9b888a2338a6af59e74005dDaniel Sanders    /// \brief Emit the FILL_FD pseudo instruction
10462e87cb2415b305ca9b888a2338a6af59e74005dDaniel Sanders    MachineBasicBlock *emitFILL_FD(MachineInstr *MI,
10562e87cb2415b305ca9b888a2338a6af59e74005dDaniel Sanders                                   MachineBasicBlock *BB) const;
10609c7f4026afa46ca7ca67d47179013a340a5e944Daniel Sanders    /// \brief Emit the FEXP2_W_1 pseudo instructions.
10709c7f4026afa46ca7ca67d47179013a340a5e944Daniel Sanders    MachineBasicBlock *emitFEXP2_W_1(MachineInstr *MI,
10809c7f4026afa46ca7ca67d47179013a340a5e944Daniel Sanders                                     MachineBasicBlock *BB) const;
10909c7f4026afa46ca7ca67d47179013a340a5e944Daniel Sanders    /// \brief Emit the FEXP2_D_1 pseudo instructions.
11009c7f4026afa46ca7ca67d47179013a340a5e944Daniel Sanders    MachineBasicBlock *emitFEXP2_D_1(MachineInstr *MI,
11109c7f4026afa46ca7ca67d47179013a340a5e944Daniel Sanders                                     MachineBasicBlock *BB) const;
1125ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka  };
1135ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka}
1145ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
1155ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka#endif // MipsSEISELLOWERING_H
116