148575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng//===-- ARMHazardRecognizer.h - ARM Hazard Recognizers ----------*- C++ -*-===//
248575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng//
348575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng//                     The LLVM Compiler Infrastructure
448575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng//
548575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng// This file is distributed under the University of Illinois Open Source
648575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng// License. See LICENSE.TXT for details.
748575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng//
848575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng//===----------------------------------------------------------------------===//
948575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng//
1048575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng// This file defines hazard recognizers for scheduling ARM functions.
1148575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng//
1248575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng//===----------------------------------------------------------------------===//
1348575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng
1448575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng#ifndef ARMHAZARDRECOGNIZER_H
1548575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng#define ARMHAZARDRECOGNIZER_H
1648575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng
176b1207267f01877ff9b351786c902cb2ecd354c0Andrew Trick#include "llvm/CodeGen/ScoreboardHazardRecognizer.h"
1848575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng
1948575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Chengnamespace llvm {
2048575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng
2148575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Chengclass ARMBaseInstrInfo;
2248575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Chengclass ARMBaseRegisterInfo;
2348575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Chengclass ARMSubtarget;
2448575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Chengclass MachineInstr;
2548575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng
266b1207267f01877ff9b351786c902cb2ecd354c0Andrew Trickclass ARMHazardRecognizer : public ScoreboardHazardRecognizer {
2748575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng  const ARMBaseInstrInfo &TII;
2848575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng  const ARMBaseRegisterInfo &TRI;
2948575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng  const ARMSubtarget &STI;
3048575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng
3148575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng  MachineInstr *LastMI;
322da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  unsigned FpMLxStalls;
3348575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng  unsigned ITBlockSize;  // No. of MIs in current IT block yet to be scheduled.
3448575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng  MachineInstr *ITBlockMIs[4];
3548575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng
3648575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Chengpublic:
3748575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng  ARMHazardRecognizer(const InstrItineraryData *ItinData,
3848575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng                      const ARMBaseInstrInfo &tii,
3948575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng                      const ARMBaseRegisterInfo &tri,
402da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick                      const ARMSubtarget &sti,
412da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick                      const ScheduleDAG *DAG) :
422da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick    ScoreboardHazardRecognizer(ItinData, DAG, "post-RA-sched"), TII(tii),
432da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick    TRI(tri), STI(sti), LastMI(0), ITBlockSize(0) {}
4448575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng
452da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  virtual HazardType getHazardType(SUnit *SU, int Stalls);
4648575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng  virtual void Reset();
4748575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng  virtual void EmitInstruction(SUnit *SU);
4848575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng  virtual void AdvanceCycle();
496b1207267f01877ff9b351786c902cb2ecd354c0Andrew Trick  virtual void RecedeCycle();
5048575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng};
5148575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng
5248575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng} // end namespace llvm
5348575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng
5448575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng#endif // ARMHAZARDRECOGNIZER_H
55