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