1249259Sdim//===---- Mips16ISelDAGToDAG.h - A Dag to Dag Inst Selector for Mips ------===// 2249259Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6249259Sdim// 7249259Sdim//===----------------------------------------------------------------------===// 8249259Sdim// 9249259Sdim// Subclass of MipsDAGToDAGISel specialized for mips16. 10249259Sdim// 11249259Sdim//===----------------------------------------------------------------------===// 12249259Sdim 13280031Sdim#ifndef LLVM_LIB_TARGET_MIPS_MIPS16ISELDAGTODAG_H 14280031Sdim#define LLVM_LIB_TARGET_MIPS_MIPS16ISELDAGTODAG_H 15249259Sdim 16249259Sdim#include "MipsISelDAGToDAG.h" 17249259Sdim 18249259Sdimnamespace llvm { 19249259Sdim 20249259Sdimclass Mips16DAGToDAGISel : public MipsDAGToDAGISel { 21249259Sdimpublic: 22309124Sdim explicit Mips16DAGToDAGISel(MipsTargetMachine &TM, CodeGenOpt::Level OL) 23309124Sdim : MipsDAGToDAGISel(TM, OL) {} 24249259Sdim 25249259Sdimprivate: 26309124Sdim std::pair<SDNode *, SDNode *> selectMULT(SDNode *N, unsigned Opc, 27309124Sdim const SDLoc &DL, EVT Ty, bool HasLo, 28309124Sdim bool HasHi); 29249259Sdim 30276479Sdim bool runOnMachineFunction(MachineFunction &MF) override; 31251662Sdim 32309124Sdim bool selectAddr(bool SPAllowed, SDValue Addr, SDValue &Base, 33309124Sdim SDValue &Offset); 34309124Sdim bool selectAddr16(SDValue Addr, SDValue &Base, 35309124Sdim SDValue &Offset) override; 36309124Sdim bool selectAddr16SP(SDValue Addr, SDValue &Base, 37309124Sdim SDValue &Offset) override; 38249259Sdim 39309124Sdim bool trySelect(SDNode *Node) override; 40249259Sdim 41276479Sdim void processFunctionAfterISel(MachineFunction &MF) override; 42249259Sdim 43249259Sdim // Insert instructions to initialize the global base register in the 44249259Sdim // first MBB of the function. 45249259Sdim void initGlobalBaseReg(MachineFunction &MF); 46249259Sdim 47249259Sdim void initMips16SPAliasReg(MachineFunction &MF); 48249259Sdim}; 49249259Sdim 50309124SdimFunctionPass *createMips16ISelDag(MipsTargetMachine &TM, 51309124Sdim CodeGenOpt::Level OptLevel); 52249259Sdim} 53249259Sdim 54249259Sdim#endif 55