1//===---- Mips16ISelDAGToDAG.h - A Dag to Dag Inst Selector for Mips ------===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// Subclass of MipsDAGToDAGISel specialized for mips16. 10// 11//===----------------------------------------------------------------------===// 12 13#ifndef LLVM_LIB_TARGET_MIPS_MIPS16ISELDAGTODAG_H 14#define LLVM_LIB_TARGET_MIPS_MIPS16ISELDAGTODAG_H 15 16#include "MipsISelDAGToDAG.h" 17 18namespace llvm { 19 20class Mips16DAGToDAGISel : public MipsDAGToDAGISel { 21public: 22 explicit Mips16DAGToDAGISel(MipsTargetMachine &TM, CodeGenOpt::Level OL) 23 : MipsDAGToDAGISel(TM, OL) {} 24 25private: 26 std::pair<SDNode *, SDNode *> selectMULT(SDNode *N, unsigned Opc, 27 const SDLoc &DL, EVT Ty, bool HasLo, 28 bool HasHi); 29 30 bool runOnMachineFunction(MachineFunction &MF) override; 31 32 bool selectAddr(bool SPAllowed, SDValue Addr, SDValue &Base, 33 SDValue &Offset); 34 bool selectAddr16(SDValue Addr, SDValue &Base, 35 SDValue &Offset) override; 36 bool selectAddr16SP(SDValue Addr, SDValue &Base, 37 SDValue &Offset) override; 38 39 bool trySelect(SDNode *Node) override; 40 41 void processFunctionAfterISel(MachineFunction &MF) override; 42 43 // Insert instructions to initialize the global base register in the 44 // first MBB of the function. 45 void initGlobalBaseReg(MachineFunction &MF); 46 47 void initMips16SPAliasReg(MachineFunction &MF); 48}; 49 50FunctionPass *createMips16ISelDag(MipsTargetMachine &TM, 51 CodeGenOpt::Level OptLevel); 52} 53 54#endif 55