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
14249259Sdim#ifndef Mips16ISELLOWERING_H
15249259Sdim#define Mips16ISELLOWERING_H
16249259Sdim
17249259Sdim#include "MipsISelLowering.h"
18249259Sdim
19249259Sdimnamespace llvm {
20249259Sdim  class Mips16TargetLowering : public MipsTargetLowering  {
21249259Sdim  public:
22249259Sdim    explicit Mips16TargetLowering(MipsTargetMachine &TM);
23249259Sdim
24249259Sdim    virtual bool allowsUnalignedMemoryAccesses(EVT VT, bool *Fast) const;
25249259Sdim
26249259Sdim    virtual MachineBasicBlock *
27249259Sdim    EmitInstrWithCustomInserter(MachineInstr *MI, MachineBasicBlock *MBB) const;
28249259Sdim
29249259Sdim  private:
30249259Sdim    virtual bool
31249259Sdim    isEligibleForTailCallOptimization(const MipsCC &MipsCCInfo,
32249259Sdim                                      unsigned NextStackOffset,
33249259Sdim                                      const MipsFunctionInfo& FI) const;
34249259Sdim
35249259Sdim    void setMips16HardFloatLibCalls();
36249259Sdim
37249259Sdim    unsigned int
38249259Sdim      getMips16HelperFunctionStubNumber(ArgListTy &Args) const;
39249259Sdim
40249259Sdim    const char *getMips16HelperFunction
41249259Sdim      (Type* RetTy, ArgListTy &Args, bool &needHelper) const;
42249259Sdim
43249259Sdim    virtual void
44249259Sdim    getOpndList(SmallVectorImpl<SDValue> &Ops,
45249259Sdim                std::deque< std::pair<unsigned, SDValue> > &RegsToPass,
46249259Sdim                bool IsPICCall, bool GlobalOrExternal, bool InternalLinkage,
47249259Sdim                CallLoweringInfo &CLI, SDValue Callee, SDValue Chain) const;
48249259Sdim
49249259Sdim    MachineBasicBlock *emitSel16(unsigned Opc, MachineInstr *MI,
50249259Sdim                                 MachineBasicBlock *BB) const;
51249259Sdim
52249259Sdim    MachineBasicBlock *emitSeliT16(unsigned Opc1, unsigned Opc2,
53249259Sdim                                   MachineInstr *MI,
54249259Sdim                                   MachineBasicBlock *BB) const;
55249259Sdim
56249259Sdim    MachineBasicBlock *emitSelT16(unsigned Opc1, unsigned Opc2,
57249259Sdim                                  MachineInstr *MI,
58249259Sdim                                  MachineBasicBlock *BB) const;
59249259Sdim
60249259Sdim    MachineBasicBlock *emitFEXT_T8I816_ins(unsigned BtOpc, unsigned CmpOpc,
61249259Sdim                                           MachineInstr *MI,
62249259Sdim                                           MachineBasicBlock *BB) const;
63249259Sdim
64249259Sdim    MachineBasicBlock *emitFEXT_T8I8I16_ins(
65263508Sdim      unsigned BtOpc, unsigned CmpiOpc, unsigned CmpiXOpc, bool ImmSigned,
66249259Sdim      MachineInstr *MI,  MachineBasicBlock *BB) const;
67249259Sdim
68249259Sdim    MachineBasicBlock *emitFEXT_CCRX16_ins(
69249259Sdim      unsigned SltOpc,
70249259Sdim      MachineInstr *MI,  MachineBasicBlock *BB) const;
71249259Sdim
72249259Sdim    MachineBasicBlock *emitFEXT_CCRXI16_ins(
73249259Sdim      unsigned SltiOpc, unsigned SltiXOpc,
74249259Sdim      MachineInstr *MI,  MachineBasicBlock *BB )const;
75249259Sdim  };
76249259Sdim}
77249259Sdim
78249259Sdim#endif // Mips16ISELLOWERING_H
79