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
1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_TARGET_MIPS_MIPSSEISELLOWERING_H
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_TARGET_MIPS_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:
2337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    explicit MipsSETargetLowering(const MipsTargetMachine &TM,
2437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                  const MipsSubtarget &STI);
255ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
26da521cc1cc733ee1c27b00e4c0e365c8b702e2e0Daniel Sanders    /// \brief Enable MSA support for the given integer type and Register
27da521cc1cc733ee1c27b00e4c0e365c8b702e2e0Daniel Sanders    /// class.
28ddfbd5805478cf108156bb0159b7495d2b236f7eDaniel Sanders    void addMSAIntType(MVT::SimpleValueType Ty, const TargetRegisterClass *RC);
29da521cc1cc733ee1c27b00e4c0e365c8b702e2e0Daniel Sanders    /// \brief Enable MSA support for the given floating-point type and
30da521cc1cc733ee1c27b00e4c0e365c8b702e2e0Daniel Sanders    /// Register class.
31ddfbd5805478cf108156bb0159b7495d2b236f7eDaniel Sanders    void addMSAFloatType(MVT::SimpleValueType Ty,
32ddfbd5805478cf108156bb0159b7495d2b236f7eDaniel Sanders                         const TargetRegisterClass *RC);
33e2a9376b1bd2204ea6f56a35b762e28e0ef4e35aJack Carter
3437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS = 0,
3537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                        unsigned Align = 1,
3637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                        bool *Fast = nullptr) const override;
375ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
39f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka
40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
41d593a77b4cf3b81cd657e351e47cad25ee037ce1Akira Hatanaka
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MachineBasicBlock *
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    EmitInstrWithCustomInserter(MachineInstr *MI,
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                MachineBasicBlock *MBB) const override;
455ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool isShuffleMaskLegal(const SmallVectorImpl<int> &Mask,
47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                            EVT VT) const override {
48bf308cedce5caca4c73e558611a1c8c48687d62eAkira Hatanaka      return false;
49bf308cedce5caca4c73e558611a1c8c48687d62eAkira Hatanaka    }
50bf308cedce5caca4c73e558611a1c8c48687d62eAkira Hatanaka
51c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    const TargetRegisterClass *getRepRegClassFor(MVT VT) const override;
52cbcdcfbda5c60d5ac7a492ef8f90b325b6026bd1Akira Hatanaka
535ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka  private:
5437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    bool isEligibleForTailCallOptimization(
5537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        const CCState &CCInfo, unsigned NextStackOffset,
5637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        const MipsFunctionInfo &FI) const override;
575ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    void
595ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    getOpndList(SmallVectorImpl<SDValue> &Ops,
605ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka                std::deque< std::pair<unsigned, SDValue> > &RegsToPass,
615ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka                bool IsPICCall, bool GlobalOrExternal, bool InternalLinkage,
6237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                bool IsCallReloc, CallLoweringInfo &CLI, SDValue Callee,
63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                SDValue Chain) const override;
645ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
653e6758541bb8c143f1f8d3ff550eba3dcc8d22e0Akira Hatanaka    SDValue lowerLOAD(SDValue Op, SelectionDAG &DAG) const;
663e6758541bb8c143f1f8d3ff550eba3dcc8d22e0Akira Hatanaka    SDValue lowerSTORE(SDValue Op, SelectionDAG &DAG) const;
673e6758541bb8c143f1f8d3ff550eba3dcc8d22e0Akira Hatanaka
68f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka    SDValue lowerMulDiv(SDValue Op, unsigned NewOpc, bool HasLo, bool HasHi,
69f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka                        SelectionDAG &DAG) const;
70f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka
714e0980af2e9eda80cbd82895167e650d83ffe087Akira Hatanaka    SDValue lowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
724e0980af2e9eda80cbd82895167e650d83ffe087Akira Hatanaka    SDValue lowerINTRINSIC_W_CHAIN(SDValue Op, SelectionDAG &DAG) const;
732fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders    SDValue lowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG) const;
749a1aaeb012e593fba977015c5d8b6b1aa41a908cDaniel Sanders    SDValue lowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
75da521cc1cc733ee1c27b00e4c0e365c8b702e2e0Daniel Sanders    SDValue lowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
767e0df9aa2966d0462e34511524a4958e226b74eeDaniel Sanders    /// \brief Lower VECTOR_SHUFFLE into one of a number of instructions
777e0df9aa2966d0462e34511524a4958e226b74eeDaniel Sanders    /// depending on the indices in the shuffle.
787e0df9aa2966d0462e34511524a4958e226b74eeDaniel Sanders    SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
794e0980af2e9eda80cbd82895167e650d83ffe087Akira Hatanaka
805ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    MachineBasicBlock *emitBPOSGE32(MachineInstr *MI,
815ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka                                    MachineBasicBlock *BB) const;
823c380d5e28f86984b147fcd424736c498773f37eDaniel Sanders    MachineBasicBlock *emitMSACBranchPseudo(MachineInstr *MI,
833c380d5e28f86984b147fcd424736c498773f37eDaniel Sanders                                            MachineBasicBlock *BB,
843c380d5e28f86984b147fcd424736c498773f37eDaniel Sanders                                            unsigned BranchOp) const;
85b4691b495d867a863aa12de57d45bc6a93e4df78Daniel Sanders    /// \brief Emit the COPY_FW pseudo instruction
86b4691b495d867a863aa12de57d45bc6a93e4df78Daniel Sanders    MachineBasicBlock *emitCOPY_FW(MachineInstr *MI,
87b4691b495d867a863aa12de57d45bc6a93e4df78Daniel Sanders                                   MachineBasicBlock *BB) const;
88b4691b495d867a863aa12de57d45bc6a93e4df78Daniel Sanders    /// \brief Emit the COPY_FD pseudo instruction
89b4691b495d867a863aa12de57d45bc6a93e4df78Daniel Sanders    MachineBasicBlock *emitCOPY_FD(MachineInstr *MI,
90b4691b495d867a863aa12de57d45bc6a93e4df78Daniel Sanders                                   MachineBasicBlock *BB) const;
9137469a132988eb0c888f6a8a205b2aca510e14f8Daniel Sanders    /// \brief Emit the INSERT_FW pseudo instruction
9237469a132988eb0c888f6a8a205b2aca510e14f8Daniel Sanders    MachineBasicBlock *emitINSERT_FW(MachineInstr *MI,
9337469a132988eb0c888f6a8a205b2aca510e14f8Daniel Sanders                                     MachineBasicBlock *BB) const;
9437469a132988eb0c888f6a8a205b2aca510e14f8Daniel Sanders    /// \brief Emit the INSERT_FD pseudo instruction
9537469a132988eb0c888f6a8a205b2aca510e14f8Daniel Sanders    MachineBasicBlock *emitINSERT_FD(MachineInstr *MI,
9637469a132988eb0c888f6a8a205b2aca510e14f8Daniel Sanders                                     MachineBasicBlock *BB) const;
97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// \brief Emit the INSERT_([BHWD]|F[WD])_VIDX pseudo instruction
98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MachineBasicBlock *emitINSERT_DF_VIDX(MachineInstr *MI,
99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                          MachineBasicBlock *BB,
100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                          unsigned EltSizeInBytes,
101dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                          bool IsFP) const;
10262e87cb2415b305ca9b888a2338a6af59e74005dDaniel Sanders    /// \brief Emit the FILL_FW pseudo instruction
10362e87cb2415b305ca9b888a2338a6af59e74005dDaniel Sanders    MachineBasicBlock *emitFILL_FW(MachineInstr *MI,
10462e87cb2415b305ca9b888a2338a6af59e74005dDaniel Sanders                                   MachineBasicBlock *BB) const;
10562e87cb2415b305ca9b888a2338a6af59e74005dDaniel Sanders    /// \brief Emit the FILL_FD pseudo instruction
10662e87cb2415b305ca9b888a2338a6af59e74005dDaniel Sanders    MachineBasicBlock *emitFILL_FD(MachineInstr *MI,
10762e87cb2415b305ca9b888a2338a6af59e74005dDaniel Sanders                                   MachineBasicBlock *BB) const;
10809c7f4026afa46ca7ca67d47179013a340a5e944Daniel Sanders    /// \brief Emit the FEXP2_W_1 pseudo instructions.
10909c7f4026afa46ca7ca67d47179013a340a5e944Daniel Sanders    MachineBasicBlock *emitFEXP2_W_1(MachineInstr *MI,
11009c7f4026afa46ca7ca67d47179013a340a5e944Daniel Sanders                                     MachineBasicBlock *BB) const;
11109c7f4026afa46ca7ca67d47179013a340a5e944Daniel Sanders    /// \brief Emit the FEXP2_D_1 pseudo instructions.
11209c7f4026afa46ca7ca67d47179013a340a5e944Daniel Sanders    MachineBasicBlock *emitFEXP2_D_1(MachineInstr *MI,
11309c7f4026afa46ca7ca67d47179013a340a5e944Daniel Sanders                                     MachineBasicBlock *BB) const;
1145ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka  };
1155ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka}
1165ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
11737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#endif
118