15ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//===-- Mips16ISelLowering.h - Mips16 DAG Lowering Interface ----*- C++ -*-===//
25ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//
35ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//                     The LLVM Compiler Infrastructure
45ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//
55ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka// This file is distributed under the University of Illinois Open Source
65ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka// License. See LICENSE.TXT for details.
75ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//
85ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//===----------------------------------------------------------------------===//
95ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//
105ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka// Subclass of MipsTargetLowering specialized for mips16.
115ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//
125ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//===----------------------------------------------------------------------===//
135ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
145ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka#ifndef Mips16ISELLOWERING_H
155ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka#define Mips16ISELLOWERING_H
165ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
175ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka#include "MipsISelLowering.h"
185ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
195ac065a79767cc112eba63136183b7103765d0d3Akira Hatanakanamespace llvm {
205ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka  class Mips16TargetLowering : public MipsTargetLowering  {
215ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka  public:
225ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    explicit Mips16TargetLowering(MipsTargetMachine &TM);
235ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
245ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    virtual bool allowsUnalignedMemoryAccesses(EVT VT, bool *Fast) const;
255ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
265ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    virtual MachineBasicBlock *
275ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    EmitInstrWithCustomInserter(MachineInstr *MI, MachineBasicBlock *MBB) const;
285ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
295ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka  private:
305ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    virtual bool
315ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    isEligibleForTailCallOptimization(const MipsCC &MipsCCInfo,
325ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka                                      unsigned NextStackOffset,
335ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka                                      const MipsFunctionInfo& FI) const;
345ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
355ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    void setMips16HardFloatLibCalls();
365ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
375ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    unsigned int
385ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka      getMips16HelperFunctionStubNumber(ArgListTy &Args) const;
395ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
405ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    const char *getMips16HelperFunction
415ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka      (Type* RetTy, ArgListTy &Args, bool &needHelper) const;
425ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
435ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    virtual void
445ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    getOpndList(SmallVectorImpl<SDValue> &Ops,
455ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka                std::deque< std::pair<unsigned, SDValue> > &RegsToPass,
465ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka                bool IsPICCall, bool GlobalOrExternal, bool InternalLinkage,
475ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka                CallLoweringInfo &CLI, SDValue Callee, SDValue Chain) const;
485ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
495ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    MachineBasicBlock *emitSel16(unsigned Opc, MachineInstr *MI,
505ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka                                 MachineBasicBlock *BB) const;
515ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
525ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    MachineBasicBlock *emitSeliT16(unsigned Opc1, unsigned Opc2,
535ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka                                   MachineInstr *MI,
545ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka                                   MachineBasicBlock *BB) const;
555ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
565ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    MachineBasicBlock *emitSelT16(unsigned Opc1, unsigned Opc2,
575ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka                                  MachineInstr *MI,
585ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka                                  MachineBasicBlock *BB) const;
595ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
605ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    MachineBasicBlock *emitFEXT_T8I816_ins(unsigned BtOpc, unsigned CmpOpc,
615ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka                                           MachineInstr *MI,
625ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka                                           MachineBasicBlock *BB) const;
635ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
645ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    MachineBasicBlock *emitFEXT_T8I8I16_ins(
65b0ee97a366a07c05b2c8ab314e29f5e72a9b7bfbReed Kotler      unsigned BtOpc, unsigned CmpiOpc, unsigned CmpiXOpc, bool ImmSigned,
665ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka      MachineInstr *MI,  MachineBasicBlock *BB) const;
675ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
685ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    MachineBasicBlock *emitFEXT_CCRX16_ins(
695ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka      unsigned SltOpc,
705ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka      MachineInstr *MI,  MachineBasicBlock *BB) const;
715ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
725ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka    MachineBasicBlock *emitFEXT_CCRXI16_ins(
735ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka      unsigned SltiOpc, unsigned SltiXOpc,
745ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka      MachineInstr *MI,  MachineBasicBlock *BB )const;
755ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka  };
765ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka}
775ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka
785ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka#endif // Mips16ISELLOWERING_H
79