Mips16ISelLowering.h revision 263508
18813Srgallard//===-- Mips16ISelLowering.h - Mips16 DAG Lowering Interface ----*- C++ -*-===//
212442Smfang//
312442Smfang//                     The LLVM Compiler Infrastructure
412442Smfang//
512442Smfang// This file is distributed under the University of Illinois Open Source
612442Smfang// License. See LICENSE.TXT for details.
712442Smfang//
812442Smfang//===----------------------------------------------------------------------===//
912442Smfang//
1012442Smfang// Subclass of MipsTargetLowering specialized for mips16.
1112442Smfang//
1212442Smfang//===----------------------------------------------------------------------===//
1312442Smfang
1412442Smfang#ifndef Mips16ISELLOWERING_H
1512442Smfang#define Mips16ISELLOWERING_H
1612442Smfang
1712442Smfang#include "MipsISelLowering.h"
1812442Smfang
1912442Smfangnamespace llvm {
2012442Smfang  class Mips16TargetLowering : public MipsTargetLowering  {
2112442Smfang  public:
2212442Smfang    explicit Mips16TargetLowering(MipsTargetMachine &TM);
238813Srgallard
248813Srgallard    virtual bool allowsUnalignedMemoryAccesses(EVT VT, bool *Fast) const;
258813Srgallard
268813Srgallard    virtual MachineBasicBlock *
278813Srgallard    EmitInstrWithCustomInserter(MachineInstr *MI, MachineBasicBlock *MBB) const;
288813Srgallard
298813Srgallard  private:
308813Srgallard    virtual bool
3112442Smfang    isEligibleForTailCallOptimization(const MipsCC &MipsCCInfo,
3212442Smfang                                      unsigned NextStackOffset,
3312442Smfang                                      const MipsFunctionInfo& FI) const;
3412442Smfang
3512442Smfang    void setMips16HardFloatLibCalls();
3612442Smfang
3712442Smfang    unsigned int
3812442Smfang      getMips16HelperFunctionStubNumber(ArgListTy &Args) const;
3912442Smfang
4012442Smfang    const char *getMips16HelperFunction
4112442Smfang      (Type* RetTy, ArgListTy &Args, bool &needHelper) const;
4212442Smfang
4312442Smfang    virtual void
4412442Smfang    getOpndList(SmallVectorImpl<SDValue> &Ops,
4512442Smfang                std::deque< std::pair<unsigned, SDValue> > &RegsToPass,
4612442Smfang                bool IsPICCall, bool GlobalOrExternal, bool InternalLinkage,
4712442Smfang                CallLoweringInfo &CLI, SDValue Callee, SDValue Chain) const;
4812442Smfang
4912442Smfang    MachineBasicBlock *emitSel16(unsigned Opc, MachineInstr *MI,
508813Srgallard                                 MachineBasicBlock *BB) const;
518813Srgallard
528813Srgallard    MachineBasicBlock *emitSeliT16(unsigned Opc1, unsigned Opc2,
538813Srgallard                                   MachineInstr *MI,
548813Srgallard                                   MachineBasicBlock *BB) const;
558813Srgallard
568813Srgallard    MachineBasicBlock *emitSelT16(unsigned Opc1, unsigned Opc2,
578813Srgallard                                  MachineInstr *MI,
588813Srgallard                                  MachineBasicBlock *BB) const;
598813Srgallard
608813Srgallard    MachineBasicBlock *emitFEXT_T8I816_ins(unsigned BtOpc, unsigned CmpOpc,
618813Srgallard                                           MachineInstr *MI,
628813Srgallard                                           MachineBasicBlock *BB) const;
638813Srgallard
648956Srgallard    MachineBasicBlock *emitFEXT_T8I8I16_ins(
658813Srgallard      unsigned BtOpc, unsigned CmpiOpc, unsigned CmpiXOpc, bool ImmSigned,
668813Srgallard      MachineInstr *MI,  MachineBasicBlock *BB) const;
678813Srgallard
688813Srgallard    MachineBasicBlock *emitFEXT_CCRX16_ins(
698813Srgallard      unsigned SltOpc,
708813Srgallard      MachineInstr *MI,  MachineBasicBlock *BB) const;
718813Srgallard
728813Srgallard    MachineBasicBlock *emitFEXT_CCRXI16_ins(
738813Srgallard      unsigned SltiOpc, unsigned SltiXOpc,
748813Srgallard      MachineInstr *MI,  MachineBasicBlock *BB )const;
758813Srgallard  };
768813Srgallard}
778813Srgallard
788813Srgallard#endif // Mips16ISELLOWERING_H
798813Srgallard