Mips16ISelLowering.h revision 249259
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 setMips16LibcallName(RTLIB::Libcall, const char *Name);
36249259Sdim
37249259Sdim    void setMips16HardFloatLibCalls();
38249259Sdim
39249259Sdim    unsigned int
40249259Sdim      getMips16HelperFunctionStubNumber(ArgListTy &Args) const;
41249259Sdim
42249259Sdim    const char *getMips16HelperFunction
43249259Sdim      (Type* RetTy, ArgListTy &Args, bool &needHelper) const;
44249259Sdim
45249259Sdim    virtual void
46249259Sdim    getOpndList(SmallVectorImpl<SDValue> &Ops,
47249259Sdim                std::deque< std::pair<unsigned, SDValue> > &RegsToPass,
48249259Sdim                bool IsPICCall, bool GlobalOrExternal, bool InternalLinkage,
49249259Sdim                CallLoweringInfo &CLI, SDValue Callee, SDValue Chain) const;
50249259Sdim
51249259Sdim    MachineBasicBlock *emitSel16(unsigned Opc, MachineInstr *MI,
52249259Sdim                                 MachineBasicBlock *BB) const;
53249259Sdim
54249259Sdim    MachineBasicBlock *emitSeliT16(unsigned Opc1, unsigned Opc2,
55249259Sdim                                   MachineInstr *MI,
56249259Sdim                                   MachineBasicBlock *BB) const;
57249259Sdim
58249259Sdim    MachineBasicBlock *emitSelT16(unsigned Opc1, unsigned Opc2,
59249259Sdim                                  MachineInstr *MI,
60249259Sdim                                  MachineBasicBlock *BB) const;
61249259Sdim
62249259Sdim    MachineBasicBlock *emitFEXT_T8I816_ins(unsigned BtOpc, unsigned CmpOpc,
63249259Sdim                                           MachineInstr *MI,
64249259Sdim                                           MachineBasicBlock *BB) const;
65249259Sdim
66249259Sdim    MachineBasicBlock *emitFEXT_T8I8I16_ins(
67249259Sdim      unsigned BtOpc, unsigned CmpiOpc, unsigned CmpiXOpc,
68249259Sdim      MachineInstr *MI,  MachineBasicBlock *BB) const;
69249259Sdim
70249259Sdim    MachineBasicBlock *emitFEXT_CCRX16_ins(
71249259Sdim      unsigned SltOpc,
72249259Sdim      MachineInstr *MI,  MachineBasicBlock *BB) const;
73249259Sdim
74249259Sdim    MachineBasicBlock *emitFEXT_CCRXI16_ins(
75249259Sdim      unsigned SltiOpc, unsigned SltiXOpc,
76249259Sdim      MachineInstr *MI,  MachineBasicBlock *BB )const;
77249259Sdim  };
78249259Sdim}
79249259Sdim
80249259Sdim#endif // Mips16ISELLOWERING_H
81