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