1249259Sdim//===-- Mips16ISelLowering.h - Mips16 DAG Lowering Interface ----*- C++ -*-===//
2249259Sdim//
3249259Sdim//                     The LLVM Compiler Infrastructure
4249259Sdim//
5249259Sdim// This file is distributed under the University of Illinois Open Source
6249259Sdim// License. See LICENSE.TXT for details.
7249259Sdim//
8249259Sdim//===----------------------------------------------------------------------===//
9249259Sdim//
10249259Sdim// Subclass of MipsTargetLowering specialized for mips16.
11249259Sdim//
12249259Sdim//===----------------------------------------------------------------------===//
13249259Sdim
14280031Sdim#ifndef LLVM_LIB_TARGET_MIPS_MIPS16ISELLOWERING_H
15280031Sdim#define LLVM_LIB_TARGET_MIPS_MIPS16ISELLOWERING_H
16249259Sdim
17249259Sdim#include "MipsISelLowering.h"
18249259Sdim
19249259Sdimnamespace llvm {
20249259Sdim  class Mips16TargetLowering : public MipsTargetLowering  {
21249259Sdim  public:
22280031Sdim    explicit Mips16TargetLowering(const MipsTargetMachine &TM,
23276479Sdim                                  const MipsSubtarget &STI);
24249259Sdim
25280031Sdim    bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AddrSpace,
26280031Sdim                                        unsigned Align,
27280031Sdim                                        bool *Fast) const override;
28249259Sdim
29276479Sdim    MachineBasicBlock *
30276479Sdim    EmitInstrWithCustomInserter(MachineInstr *MI,
31276479Sdim                                MachineBasicBlock *MBB) const override;
32249259Sdim
33249259Sdim  private:
34277320Sdim    bool isEligibleForTailCallOptimization(
35277320Sdim        const CCState &CCInfo, unsigned NextStackOffset,
36277320Sdim        const MipsFunctionInfo &FI) const override;
37249259Sdim
38249259Sdim    void setMips16HardFloatLibCalls();
39249259Sdim
40249259Sdim    unsigned int
41249259Sdim      getMips16HelperFunctionStubNumber(ArgListTy &Args) const;
42249259Sdim
43249259Sdim    const char *getMips16HelperFunction
44249259Sdim      (Type* RetTy, ArgListTy &Args, bool &needHelper) const;
45249259Sdim
46276479Sdim    void
47249259Sdim    getOpndList(SmallVectorImpl<SDValue> &Ops,
48249259Sdim                std::deque< std::pair<unsigned, SDValue> > &RegsToPass,
49249259Sdim                bool IsPICCall, bool GlobalOrExternal, bool InternalLinkage,
50280031Sdim                bool IsCallReloc, CallLoweringInfo &CLI, SDValue Callee,
51276479Sdim                SDValue Chain) const override;
52249259Sdim
53249259Sdim    MachineBasicBlock *emitSel16(unsigned Opc, MachineInstr *MI,
54249259Sdim                                 MachineBasicBlock *BB) const;
55249259Sdim
56249259Sdim    MachineBasicBlock *emitSeliT16(unsigned Opc1, unsigned Opc2,
57249259Sdim                                   MachineInstr *MI,
58249259Sdim                                   MachineBasicBlock *BB) const;
59249259Sdim
60249259Sdim    MachineBasicBlock *emitSelT16(unsigned Opc1, unsigned Opc2,
61249259Sdim                                  MachineInstr *MI,
62249259Sdim                                  MachineBasicBlock *BB) const;
63249259Sdim
64249259Sdim    MachineBasicBlock *emitFEXT_T8I816_ins(unsigned BtOpc, unsigned CmpOpc,
65249259Sdim                                           MachineInstr *MI,
66249259Sdim                                           MachineBasicBlock *BB) const;
67249259Sdim
68249259Sdim    MachineBasicBlock *emitFEXT_T8I8I16_ins(
69261991Sdim      unsigned BtOpc, unsigned CmpiOpc, unsigned CmpiXOpc, bool ImmSigned,
70249259Sdim      MachineInstr *MI,  MachineBasicBlock *BB) const;
71249259Sdim
72249259Sdim    MachineBasicBlock *emitFEXT_CCRX16_ins(
73249259Sdim      unsigned SltOpc,
74249259Sdim      MachineInstr *MI,  MachineBasicBlock *BB) const;
75249259Sdim
76249259Sdim    MachineBasicBlock *emitFEXT_CCRXI16_ins(
77249259Sdim      unsigned SltiOpc, unsigned SltiXOpc,
78249259Sdim      MachineInstr *MI,  MachineBasicBlock *BB )const;
79249259Sdim  };
80249259Sdim}
81249259Sdim
82280031Sdim#endif
83