blob: 053f874e1bca74abaa450c8f486dee858fb0f3ed [file] [log] [blame]
Evan Cheng48575f62010-12-05 22:04:16 +00001//===-- ARMHazardRecognizer.h - ARM Hazard Recognizers ----------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines hazard recognizers for scheduling ARM functions.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef ARMHAZARDRECOGNIZER_H
15#define ARMHAZARDRECOGNIZER_H
16
Andrew Trick6b120722010-12-08 20:04:29 +000017#include "llvm/CodeGen/ScoreboardHazardRecognizer.h"
Evan Cheng48575f62010-12-05 22:04:16 +000018
19namespace llvm {
20
21class ARMBaseInstrInfo;
22class ARMBaseRegisterInfo;
23class ARMSubtarget;
24class MachineInstr;
25
Andrew Trick7d8867d2011-11-29 19:33:49 +000026/// ARMHazardRecognizer handles special constraints that are not expressed in
27/// the scheduling itinerary. This is only used during postRA scheduling. The
28/// ARM preRA scheduler uses an unspecialized instance of the
29/// ScoreboardHazardRecognizer.
Andrew Trick6b120722010-12-08 20:04:29 +000030class ARMHazardRecognizer : public ScoreboardHazardRecognizer {
Evan Cheng48575f62010-12-05 22:04:16 +000031 const ARMBaseInstrInfo &TII;
32 const ARMBaseRegisterInfo &TRI;
33 const ARMSubtarget &STI;
34
35 MachineInstr *LastMI;
Andrew Trick2da8bc82010-12-24 05:03:26 +000036 unsigned FpMLxStalls;
Evan Cheng48575f62010-12-05 22:04:16 +000037 unsigned ITBlockSize; // No. of MIs in current IT block yet to be scheduled.
38 MachineInstr *ITBlockMIs[4];
39
40public:
41 ARMHazardRecognizer(const InstrItineraryData *ItinData,
42 const ARMBaseInstrInfo &tii,
43 const ARMBaseRegisterInfo &tri,
Andrew Trick2da8bc82010-12-24 05:03:26 +000044 const ARMSubtarget &sti,
45 const ScheduleDAG *DAG) :
46 ScoreboardHazardRecognizer(ItinData, DAG, "post-RA-sched"), TII(tii),
47 TRI(tri), STI(sti), LastMI(0), ITBlockSize(0) {}
Evan Cheng48575f62010-12-05 22:04:16 +000048
Andrew Trick2da8bc82010-12-24 05:03:26 +000049 virtual HazardType getHazardType(SUnit *SU, int Stalls);
Evan Cheng48575f62010-12-05 22:04:16 +000050 virtual void Reset();
51 virtual void EmitInstruction(SUnit *SU);
52 virtual void AdvanceCycle();
Andrew Trick6b120722010-12-08 20:04:29 +000053 virtual void RecedeCycle();
Evan Cheng48575f62010-12-05 22:04:16 +000054};
55
Evan Cheng48575f62010-12-05 22:04:16 +000056} // end namespace llvm
57
58#endif // ARMHAZARDRECOGNIZER_H