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