mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-26 07:29:55 +00:00
Thumb2 hazard recognizer.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106347 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
fe181f4848
commit
886459456c
50
lib/Target/ARM/Thumb2HazardRecognizer.cpp
Normal file
50
lib/Target/ARM/Thumb2HazardRecognizer.cpp
Normal file
@ -0,0 +1,50 @@
|
||||
//===-- Thumb2HazardRecognizer.cpp - Thumb2 postra hazard recognizer ------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "ARM.h"
|
||||
#include "Thumb2HazardRecognizer.h"
|
||||
#include "llvm/CodeGen/MachineInstr.h"
|
||||
#include "llvm/CodeGen/ScheduleDAG.h"
|
||||
using namespace llvm;
|
||||
|
||||
ScheduleHazardRecognizer::HazardType
|
||||
Thumb2HazardRecognizer::getHazardType(SUnit *SU) {
|
||||
if (ITBlockSize) {
|
||||
MachineInstr *MI = SU->getInstr();
|
||||
if (MI != ITBlockMIs[ITBlockSize-1])
|
||||
return Hazard;
|
||||
}
|
||||
|
||||
return PostRAHazardRecognizer::getHazardType(SU);
|
||||
}
|
||||
|
||||
void Thumb2HazardRecognizer::Reset() {
|
||||
ITBlockSize = 0;
|
||||
PostRAHazardRecognizer::Reset();
|
||||
}
|
||||
|
||||
void Thumb2HazardRecognizer::EmitInstruction(SUnit *SU) {
|
||||
MachineInstr *MI = SU->getInstr();
|
||||
unsigned Opcode = MI->getOpcode();
|
||||
if (ITBlockSize) {
|
||||
--ITBlockSize;
|
||||
} else if (Opcode == ARM::t2IT) {
|
||||
unsigned Mask = MI->getOperand(1).getImm();
|
||||
unsigned NumTZ = CountTrailingZeros_32(Mask);
|
||||
assert(NumTZ <= 3 && "Invalid IT mask!");
|
||||
ITBlockSize = 4 - NumTZ;
|
||||
MachineBasicBlock::iterator I = MI;
|
||||
for (unsigned i = 0; i < ITBlockSize; ++i) {
|
||||
++I;
|
||||
ITBlockMIs[ITBlockSize-1-i] = &*I;
|
||||
}
|
||||
}
|
||||
|
||||
PostRAHazardRecognizer::EmitInstruction(SU);
|
||||
}
|
40
lib/Target/ARM/Thumb2HazardRecognizer.h
Normal file
40
lib/Target/ARM/Thumb2HazardRecognizer.h
Normal file
@ -0,0 +1,40 @@
|
||||
//===-- Thumb2HazardRecognizer.h - Thumb2 Hazard Recognizers ----*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file defines hazard recognizers for scheduling Thumb2 functions on
|
||||
// ARM processors.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef THUMB2HAZARDRECOGNIZER_H
|
||||
#define THUMB2HAZARDRECOGNIZER_H
|
||||
|
||||
#include "llvm/CodeGen/PostRAHazardRecognizer.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class MachineInstr;
|
||||
|
||||
class Thumb2HazardRecognizer : public PostRAHazardRecognizer {
|
||||
unsigned ITBlockSize; // No. of MIs in current IT block yet to be scheduled.
|
||||
MachineInstr *ITBlockMIs[4];
|
||||
|
||||
public:
|
||||
Thumb2HazardRecognizer(const InstrItineraryData &ItinData) :
|
||||
PostRAHazardRecognizer(ItinData) {}
|
||||
|
||||
virtual HazardType getHazardType(SUnit *SU);
|
||||
virtual void Reset();
|
||||
virtual void EmitInstruction(SUnit *SU);
|
||||
};
|
||||
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif // THUMB2HAZARDRECOGNIZER_H
|
Loading…
Reference in New Issue
Block a user