This kinda sorta implements "things that have to lead a dispatch group".
authorNate Begeman <natebegeman@mac.com>
Tue, 7 Mar 2006 08:30:27 +0000 (08:30 +0000)
committerNate Begeman <natebegeman@mac.com>
Tue, 7 Mar 2006 08:30:27 +0000 (08:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26591 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/PPCHazardRecognizers.cpp
lib/Target/PowerPC/PPCHazardRecognizers.h

index 4408e950355589377374432584621859e7ac39d8..a022e8a5e2f7ee32fa247b0ea3ba2483ea32c23a 100644 (file)
@@ -54,7 +54,7 @@ void PPCHazardRecognizer970::EndDispatchGroup() {
   DEBUG(std::cerr << "=== Start of dispatch group\n");
   // Pipeline units.
   NumFXU = NumLSU = NumFPU = 0;
-  HasCR = HasVALU = HasVPERM = false;
+  HasCR = HasSPR = HasVALU = HasVPERM = false;
   NumIssued = 0;
   
   // Structural hazard info.
@@ -76,6 +76,15 @@ PPCHazardRecognizer970::GetInstrType(unsigned Opcode) {
   case PPC::BL:
   case PPC::BLA:
     return BR;
+  case PPC::MCRF:
+  case PPC::MFCR:
+  case PPC::MFOCRF:
+    return CR;
+  case PPC::MFLR:
+  case PPC::MFCTR:
+  case PPC::MTLR:
+  case PPC::MTCTR:
+    return SPR;
   case PPC::LFS:
   case PPC::LFD:
   case PPC::LWZ:
@@ -85,6 +94,11 @@ PPCHazardRecognizer970::GetInstrType(unsigned Opcode) {
   case PPC::STFD:
   case PPC::STW:
     return LSU_ST;
+  case PPC::DIVW:
+  case PPC::DIVWU:
+  case PPC::DIVD:
+  case PPC::DIVDU:
+    return FXU_FIRST;
   case PPC::FADDS:
   case PPC::FCTIWZ:
   case PPC::FRSP:
@@ -142,16 +156,24 @@ getHazardType(SDNode *Node) {
 
   switch (InstrType) {
   default: assert(0 && "Unknown instruction type!");
-  case FXU:    if (NumFXU  == 2) return Hazard;
+  case FXU:
+  case FXU_FIRST: if (NumFXU  == 2) return Hazard;
   case LSU_ST:
-  case LSU_LD: if (NumLSU  == 2) return Hazard;
-  case FPU:    if (NumFPU  == 2) return Hazard;
-  case CR:     if (HasCR) return Hazard;
-  case VALU:   if (HasVALU) return Hazard;
-  case VPERM:  if (HasVPERM) return Hazard;
-  case BR:    break;
+  case LSU_LD:    if (NumLSU  == 2) return Hazard;
+  case FPU:       if (NumFPU  == 2) return Hazard;
+  case CR:        if (HasCR) return Hazard;
+  case SPR:       if (HasSPR) return Hazard;
+  case VALU:      if (HasVALU) return Hazard;
+  case VPERM:     if (HasVPERM) return Hazard;
+  case BR:  break;
   }
-
+  
+  // We can only issue a CR or SPR instruction, or an FXU instruction that needs
+  // to lead a dispatch group as the first instruction in the group.
+  if (NumIssued != 0 && 
+      (InstrType == CR || InstrType == SPR || InstrType == FXU_FIRST))
+    return Hazard;
+  
   // We can only issue a branch as the last instruction in a group.
   if (NumIssued == 4 && InstrType != BR)
     return Hazard;
@@ -202,14 +224,16 @@ void PPCHazardRecognizer970::EmitInstruction(SDNode *Node) {
   
   switch (InstrType) {
   default: assert(0 && "Unknown instruction type!");
-  case FXU:    ++NumFXU; break;
+  case FXU:
+  case FXU_FIRST: ++NumFXU; break;
   case LSU_LD:
-  case LSU_ST: ++NumLSU; break;
-  case FPU:    ++NumFPU; break;
-  case CR:     HasCR    = true; break;
-  case VALU:   HasVALU  = true; break;
-  case VPERM:  HasVPERM = true; break;
-  case BR:     NumIssued = 4; return;  // ends a d-group.
+  case LSU_ST:    ++NumLSU; break;
+  case FPU:       ++NumFPU; break;
+  case CR:        HasCR    = true; break;
+  case SPR:       HasSPR   = true; break;
+  case VALU:      HasVALU  = true; break;
+  case VPERM:     HasVPERM = true; break;
+  case BR:        NumIssued = 4; return;  // ends a d-group.
   }
   ++NumIssued;
   
index f11d3e68292b0570a05b8ccf74fda890a0a2e132..c13d86d65e17df0a9e4ca741bc4dbaa59ec0a1f5 100644 (file)
@@ -32,6 +32,7 @@ class PPCHazardRecognizer970 : public HazardRecognizer {
   unsigned NumLSU;     // Number of Load/Store instructions
   unsigned NumFPU;     // Number of Floating Point instructions
   bool     HasCR;      // True if Condition Register instruction issued
+  bool     HasSPR;     // True if Special-Purpose Register instruction used
   bool     HasVALU;    // True if Vector Arithmetic instruction issued
   bool     HasVPERM;   // True if Vector Permute instruction issued
   
@@ -63,7 +64,7 @@ private:
   void EndDispatchGroup();
   
   enum PPC970InstrType {
-    FXU, LSU_LD, LSU_ST, FPU, CR, VALU, VPERM, BR, PseudoInst
+    FXU, FXU_FIRST, LSU_LD, LSU_ST, FPU, CR, SPR, VALU, VPERM, BR, PseudoInst
   };
   
   /// GetInstrType - Classify the specified powerpc opcode according to its