| //===-- 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(); | |
| } |