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