//===-- SPUSubtarget.h - Define Subtarget for the Cell SPU ------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file declares the Cell SPU-specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//

#ifndef CELLSUBTARGET_H
#define CELLSUBTARGET_H

#include "llvm/Target/TargetSubtargetInfo.h"
#include "llvm/MC/MCInstrItineraries.h"
#include <string>

#define GET_SUBTARGETINFO_HEADER
#include "SPUGenSubtargetInfo.inc"

namespace llvm {
  class GlobalValue;
  class StringRef;

  namespace SPU {
    enum {
      PROC_NONE,
      DEFAULT_PROC
    };
  }
    
  class SPUSubtarget : public SPUGenSubtargetInfo {
  protected:
    /// stackAlignment - The minimum alignment known to hold of the stack frame
    /// on entry to the function and which must be maintained by every function.
    unsigned StackAlignment;
    
    /// Selected instruction itineraries (one entry per itinerary class.)
    InstrItineraryData InstrItins;

    /// Which SPU processor (this isn't really used, but it's there to keep
    /// the C compiler happy)
    unsigned ProcDirective;

    /// Use (assume) large memory -- effectively disables the LQA/STQA
    /// instructions that assume 259K local store.
    bool UseLargeMem;
    
  public:
    /// This constructor initializes the data members to match that
    /// of the specified triple.
    ///
    SPUSubtarget(const std::string &TT, const std::string &CPU,
                 const std::string &FS);
    
    /// ParseSubtargetFeatures - Parses features string setting specified 
    /// subtarget options.  Definition of function is auto generated by tblgen.
    void ParseSubtargetFeatures(StringRef CPU, StringRef FS);

    /// SetJITMode - This is called to inform the subtarget info that we are
    /// producing code for the JIT.
    void SetJITMode();

    /// getStackAlignment - Returns the minimum alignment known to hold of the
    /// stack frame on entry to the function and which must be maintained by
    /// every function for this subtarget.
    unsigned getStackAlignment() const { return StackAlignment; }
    
    /// getInstrItins - Return the instruction itineraies based on subtarget 
    /// selection.
    const InstrItineraryData &getInstrItineraryData() const {
      return InstrItins;
    }

    /// Use large memory addressing predicate
    bool usingLargeMem() const {
      return UseLargeMem;
    }

    /// getTargetDataString - Return the pointer size and type alignment
    /// properties of this subtarget.
    const char *getTargetDataString() const {
      return "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128"
             "-i16:16:128-i8:8:128-i1:8:128-a:0:128-v64:64:128-v128:128:128"
             "-s:128:128-n32:64";
    }

    bool enablePostRAScheduler(CodeGenOpt::Level OptLevel,
                               TargetSubtargetInfo::AntiDepBreakMode& Mode,
                               RegClassVector& CriticalPathRCs) const;
  };
} // End llvm namespace

#endif
