mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-16 12:24:03 +00:00
Create a new InstrEmitter class for translating SelectionDAG nodes
into MachineInstrs. This is mostly just moving the code from ScheduleDAGSDNodesEmit.cpp into a new class. This decouples MachineInstr emitting from scheduling. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83699 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -14,6 +14,7 @@
|
||||
|
||||
#define DEBUG_TYPE "pre-RA-sched"
|
||||
#include "ScheduleDAGSDNodes.h"
|
||||
#include "InstrEmitter.h"
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
@ -181,7 +182,7 @@ void ScheduleDAGSDNodes::AddSchedEdges() {
|
||||
if (N->isMachineOpcode() &&
|
||||
TII->get(N->getMachineOpcode()).getImplicitDefs()) {
|
||||
SU->hasPhysRegClobbers = true;
|
||||
unsigned NumUsed = CountResults(N);
|
||||
unsigned NumUsed = InstrEmitter::CountResults(N);
|
||||
while (NumUsed != 0 && !N->hasAnyUseOfValue(NumUsed - 1))
|
||||
--NumUsed; // Skip over unused values at the end.
|
||||
if (NumUsed > TII->get(N->getMachineOpcode()).getNumDefs())
|
||||
@ -250,31 +251,6 @@ void ScheduleDAGSDNodes::ComputeLatency(SUnit *SU) {
|
||||
}
|
||||
}
|
||||
|
||||
/// CountResults - The results of target nodes have register or immediate
|
||||
/// operands first, then an optional chain, and optional flag operands (which do
|
||||
/// not go into the resulting MachineInstr).
|
||||
unsigned ScheduleDAGSDNodes::CountResults(SDNode *Node) {
|
||||
unsigned N = Node->getNumValues();
|
||||
while (N && Node->getValueType(N - 1) == MVT::Flag)
|
||||
--N;
|
||||
if (N && Node->getValueType(N - 1) == MVT::Other)
|
||||
--N; // Skip over chain result.
|
||||
return N;
|
||||
}
|
||||
|
||||
/// CountOperands - The inputs to target nodes have any actual inputs first,
|
||||
/// followed by an optional chain operand, then an optional flag operand.
|
||||
/// Compute the number of actual operands that will go into the resulting
|
||||
/// MachineInstr.
|
||||
unsigned ScheduleDAGSDNodes::CountOperands(SDNode *Node) {
|
||||
unsigned N = Node->getNumOperands();
|
||||
while (N && Node->getOperand(N - 1).getValueType() == MVT::Flag)
|
||||
--N;
|
||||
if (N && Node->getOperand(N - 1).getValueType() == MVT::Other)
|
||||
--N; // Ignore chain if it exists.
|
||||
return N;
|
||||
}
|
||||
|
||||
void ScheduleDAGSDNodes::dumpNode(const SUnit *SU) const {
|
||||
if (!SU->getNode()) {
|
||||
errs() << "PHYS REG COPY\n";
|
||||
@ -293,3 +269,43 @@ void ScheduleDAGSDNodes::dumpNode(const SUnit *SU) const {
|
||||
FlaggedNodes.pop_back();
|
||||
}
|
||||
}
|
||||
|
||||
/// EmitSchedule - Emit the machine code in scheduled order.
|
||||
MachineBasicBlock *ScheduleDAGSDNodes::
|
||||
EmitSchedule(DenseMap<MachineBasicBlock*, MachineBasicBlock*> *EM) {
|
||||
InstrEmitter Emitter(BB, InsertPos);
|
||||
DenseMap<SDValue, unsigned> VRBaseMap;
|
||||
DenseMap<SUnit*, unsigned> CopyVRBaseMap;
|
||||
for (unsigned i = 0, e = Sequence.size(); i != e; i++) {
|
||||
SUnit *SU = Sequence[i];
|
||||
if (!SU) {
|
||||
// Null SUnit* is a noop.
|
||||
EmitNoop();
|
||||
continue;
|
||||
}
|
||||
|
||||
// For pre-regalloc scheduling, create instructions corresponding to the
|
||||
// SDNode and any flagged SDNodes and append them to the block.
|
||||
if (!SU->getNode()) {
|
||||
// Emit a copy.
|
||||
EmitPhysRegCopy(SU, CopyVRBaseMap);
|
||||
continue;
|
||||
}
|
||||
|
||||
SmallVector<SDNode *, 4> FlaggedNodes;
|
||||
for (SDNode *N = SU->getNode()->getFlaggedNode(); N;
|
||||
N = N->getFlaggedNode())
|
||||
FlaggedNodes.push_back(N);
|
||||
while (!FlaggedNodes.empty()) {
|
||||
Emitter.EmitNode(FlaggedNodes.back(), SU->OrigNode != SU, SU->isCloned,
|
||||
VRBaseMap, EM);
|
||||
FlaggedNodes.pop_back();
|
||||
}
|
||||
Emitter.EmitNode(SU->getNode(), SU->OrigNode != SU, SU->isCloned,
|
||||
VRBaseMap, EM);
|
||||
}
|
||||
|
||||
BB = Emitter.getBlock();
|
||||
InsertPos = Emitter.getInsertPos();
|
||||
return BB;
|
||||
}
|
||||
|
Reference in New Issue
Block a user