[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCHazardRecognizers.cpp PPCHazardRecognizers.h
Chris Lattner
lattner at cs.uiuc.edu
Sun Mar 12 21:20:16 PST 2006
Changes in directory llvm/lib/Target/PowerPC:
PPCHazardRecognizers.cpp updated: 1.9 -> 1.10
PPCHazardRecognizers.h updated: 1.5 -> 1.6
---
Log message:
Handle cracked instructions in dispatch group formation.
---
Diffs of the changes: (+28 -15)
PPCHazardRecognizers.cpp | 41 +++++++++++++++++++++++++++--------------
PPCHazardRecognizers.h | 2 +-
2 files changed, 28 insertions(+), 15 deletions(-)
Index: llvm/lib/Target/PowerPC/PPCHazardRecognizers.cpp
diff -u llvm/lib/Target/PowerPC/PPCHazardRecognizers.cpp:1.9 llvm/lib/Target/PowerPC/PPCHazardRecognizers.cpp:1.10
--- llvm/lib/Target/PowerPC/PPCHazardRecognizers.cpp:1.9 Sun Mar 12 03:13:49 2006
+++ llvm/lib/Target/PowerPC/PPCHazardRecognizers.cpp Sun Mar 12 23:20:04 2006
@@ -42,10 +42,8 @@
//
// FIXME: This is missing some significant cases:
// 1. Modeling of microcoded instructions.
-// 2. Handling of cracked instructions.
-// 3. Handling of serialized operations.
-// 4. Handling of the esoteric cases in "Resource-based Instruction Grouping",
-// e.g. integer divides that only execute in the second slot.
+// 2. Handling of serialized operations.
+// 3. Handling of the esoteric cases in "Resource-based Instruction Grouping".
//
PPCHazardRecognizer970::PPCHazardRecognizer970(const TargetInstrInfo &tii)
@@ -66,9 +64,10 @@
PPCII::PPC970_Unit
PPCHazardRecognizer970::GetInstrType(unsigned Opcode,
bool &isFirst, bool &isSingle,
- bool &isLoad, bool &isStore){
+ bool &isCracked,
+ bool &isLoad, bool &isStore) {
if (Opcode < ISD::BUILTIN_OP_END) {
- isFirst = isSingle = isLoad = isStore = false;
+ isFirst = isSingle = isCracked = isLoad = isStore = false;
return PPCII::PPC970_Pseudo;
}
Opcode -= ISD::BUILTIN_OP_END;
@@ -80,8 +79,9 @@
unsigned TSFlags = TID.TSFlags;
- isFirst = TSFlags & PPCII::PPC970_First;
- isSingle = TSFlags & PPCII::PPC970_Single;
+ isFirst = TSFlags & PPCII::PPC970_First;
+ isSingle = TSFlags & PPCII::PPC970_Single;
+ isCracked = TSFlags & PPCII::PPC970_Cracked;
return (PPCII::PPC970_Unit)(TSFlags & PPCII::PPC970_Mask);
}
@@ -122,17 +122,24 @@
/// pipeline flush.
HazardRecognizer::HazardType PPCHazardRecognizer970::
getHazardType(SDNode *Node) {
- bool isFirst, isSingle, isLoad, isStore;
+ bool isFirst, isSingle, isCracked, isLoad, isStore;
PPCII::PPC970_Unit InstrType =
- GetInstrType(Node->getOpcode(), isFirst, isSingle, isLoad, isStore);
+ GetInstrType(Node->getOpcode(), isFirst, isSingle, isCracked,
+ isLoad, isStore);
if (InstrType == PPCII::PPC970_Pseudo) return NoHazard;
unsigned Opcode = Node->getOpcode()-ISD::BUILTIN_OP_END;
// We can only issue a PPC970_First/PPC970_Single instruction (such as
// crand/mtspr/etc) if this is the first cycle of the dispatch group.
- if (NumIssued != 0 && (isFirst || isSingle) )
+ if (NumIssued != 0 && (isFirst || isSingle))
return Hazard;
+ // If this instruction is cracked into two ops by the decoder, we know that
+ // it is not a branch and that it cannot issue if 3 other instructions are
+ // already in the dispatch group.
+ if (isCracked && NumIssued > 2)
+ return Hazard;
+
switch (InstrType) {
default: assert(0 && "Unknown instruction type!");
case PPCII::PPC970_FXU:
@@ -150,7 +157,7 @@
case PPCII::PPC970_BRU:
break;
}
-
+
// Do not allow MTCTR and BCTRL to be in the same dispatch group.
if (HasCTRSet && Opcode == PPC::BCTRL)
return NoopHazard;
@@ -203,9 +210,10 @@
}
void PPCHazardRecognizer970::EmitInstruction(SDNode *Node) {
- bool isFirst, isSingle, isLoad, isStore;
+ bool isFirst, isSingle, isCracked, isLoad, isStore;
PPCII::PPC970_Unit InstrType =
- GetInstrType(Node->getOpcode(), isFirst, isSingle, isLoad, isStore);
+ GetInstrType(Node->getOpcode(), isFirst, isSingle, isCracked,
+ isLoad, isStore);
if (InstrType == PPCII::PPC970_Pseudo) return;
unsigned Opcode = Node->getOpcode()-ISD::BUILTIN_OP_END;
@@ -260,6 +268,11 @@
NumIssued = 4; // Terminate a d-group.
++NumIssued;
+ // If this instruction is cracked into two ops by the decoder, remember that
+ // we issued two pieces.
+ if (isCracked)
+ ++NumIssued;
+
if (NumIssued == 5)
EndDispatchGroup();
}
Index: llvm/lib/Target/PowerPC/PPCHazardRecognizers.h
diff -u llvm/lib/Target/PowerPC/PPCHazardRecognizers.h:1.5 llvm/lib/Target/PowerPC/PPCHazardRecognizers.h:1.6
--- llvm/lib/Target/PowerPC/PPCHazardRecognizers.h:1.5 Sun Mar 12 03:13:49 2006
+++ llvm/lib/Target/PowerPC/PPCHazardRecognizers.h Sun Mar 12 23:20:04 2006
@@ -60,7 +60,7 @@
/// GetInstrType - Classify the specified powerpc opcode according to its
/// pipeline.
PPCII::PPC970_Unit GetInstrType(unsigned Opcode,
- bool &isFirst, bool &isSingle,
+ bool &isFirst, bool &isSingle,bool &isCracked,
bool &isLoad, bool &isStore);
bool isLoadOfStoredAddress(unsigned LoadSize,
More information about the llvm-commits
mailing list