forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			142 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- SPUHazardRecognizers.cpp - Cell Hazard Recognizer Impls -----------===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // This file implements hazard recognizers for scheduling on Cell SPU
 | |
| // processors.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #define DEBUG_TYPE "sched"
 | |
| 
 | |
| #include "SPUHazardRecognizers.h"
 | |
| #include "SPU.h"
 | |
| #include "SPUInstrInfo.h"
 | |
| #include "llvm/CodeGen/ScheduleDAG.h"
 | |
| #include "llvm/CodeGen/SelectionDAGNodes.h"
 | |
| #include "llvm/Support/Debug.h"
 | |
| #include "llvm/Support/raw_ostream.h"
 | |
| using namespace llvm;
 | |
| 
 | |
| //===----------------------------------------------------------------------===//
 | |
| // Cell SPU hazard recognizer
 | |
| //
 | |
| // This is the pipeline hazard recognizer for the Cell SPU processor. It does
 | |
| // very little right now.
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| SPUHazardRecognizer::SPUHazardRecognizer(const TargetInstrInfo &tii) :
 | |
|   TII(tii),
 | |
|   EvenOdd(0)
 | |
| {
 | |
| }
 | |
| 
 | |
| /// Return the pipeline hazard type encountered or generated by this
 | |
| /// instruction. Currently returns NoHazard.
 | |
| ///
 | |
| /// \return NoHazard
 | |
| ScheduleHazardRecognizer::HazardType
 | |
| SPUHazardRecognizer::getHazardType(SUnit *SU, int Stalls)
 | |
| {
 | |
|   // Initial thoughts on how to do this, but this code cannot work unless the
 | |
|   // function's prolog and epilog code are also being scheduled so that we can
 | |
|   // accurately determine which pipeline is being scheduled.
 | |
| #if 0
 | |
|   assert(Stalls == 0 && "SPU hazards don't yet support scoreboard lookahead");
 | |
| 
 | |
|   const SDNode *Node = SU->getNode()->getFlaggedMachineNode();
 | |
|   ScheduleHazardRecognizer::HazardType retval = NoHazard;
 | |
|   bool mustBeOdd = false;
 | |
| 
 | |
|   switch (Node->getOpcode()) {
 | |
|   case SPU::LQDv16i8:
 | |
|   case SPU::LQDv8i16:
 | |
|   case SPU::LQDv4i32:
 | |
|   case SPU::LQDv4f32:
 | |
|   case SPU::LQDv2f64:
 | |
|   case SPU::LQDr128:
 | |
|   case SPU::LQDr64:
 | |
|   case SPU::LQDr32:
 | |
|   case SPU::LQDr16:
 | |
|   case SPU::LQAv16i8:
 | |
|   case SPU::LQAv8i16:
 | |
|   case SPU::LQAv4i32:
 | |
|   case SPU::LQAv4f32:
 | |
|   case SPU::LQAv2f64:
 | |
|   case SPU::LQAr128:
 | |
|   case SPU::LQAr64:
 | |
|   case SPU::LQAr32:
 | |
|   case SPU::LQXv4i32:
 | |
|   case SPU::LQXr128:
 | |
|   case SPU::LQXr64:
 | |
|   case SPU::LQXr32:
 | |
|   case SPU::LQXr16:
 | |
|   case SPU::STQDv16i8:
 | |
|   case SPU::STQDv8i16:
 | |
|   case SPU::STQDv4i32:
 | |
|   case SPU::STQDv4f32:
 | |
|   case SPU::STQDv2f64:
 | |
|   case SPU::STQDr128:
 | |
|   case SPU::STQDr64:
 | |
|   case SPU::STQDr32:
 | |
|   case SPU::STQDr16:
 | |
|   case SPU::STQDr8:
 | |
|   case SPU::STQAv16i8:
 | |
|   case SPU::STQAv8i16:
 | |
|   case SPU::STQAv4i32:
 | |
|   case SPU::STQAv4f32:
 | |
|   case SPU::STQAv2f64:
 | |
|   case SPU::STQAr128:
 | |
|   case SPU::STQAr64:
 | |
|   case SPU::STQAr32:
 | |
|   case SPU::STQAr16:
 | |
|   case SPU::STQAr8:
 | |
|   case SPU::STQXv16i8:
 | |
|   case SPU::STQXv8i16:
 | |
|   case SPU::STQXv4i32:
 | |
|   case SPU::STQXv4f32:
 | |
|   case SPU::STQXv2f64:
 | |
|   case SPU::STQXr128:
 | |
|   case SPU::STQXr64:
 | |
|   case SPU::STQXr32:
 | |
|   case SPU::STQXr16:
 | |
|   case SPU::STQXr8:
 | |
|   case SPU::RET:
 | |
|     mustBeOdd = true;
 | |
|     break;
 | |
|   default:
 | |
|     // Assume that this instruction can be on the even pipe
 | |
|     break;
 | |
|   }
 | |
| 
 | |
|   if (mustBeOdd && !EvenOdd)
 | |
|     retval = Hazard;
 | |
| 
 | |
|   DEBUG(errs() << "SPUHazardRecognizer EvenOdd " << EvenOdd << " Hazard "
 | |
|                << retval << "\n");
 | |
|   EvenOdd ^= 1;
 | |
|   return retval;
 | |
| #else
 | |
|   return NoHazard;
 | |
| #endif
 | |
| }
 | |
| 
 | |
| void SPUHazardRecognizer::EmitInstruction(SUnit *SU)
 | |
| {
 | |
| }
 | |
| 
 | |
| void SPUHazardRecognizer::AdvanceCycle()
 | |
| {
 | |
|   DEBUG(errs() << "SPUHazardRecognizer::AdvanceCycle\n");
 | |
| }
 | |
| 
 | |
| void SPUHazardRecognizer::EmitNoop()
 | |
| {
 | |
|   AdvanceCycle();
 | |
| }
 |