1//===-- SPUSubtarget.h - Define Subtarget for the Cell SPU ------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file declares the Cell SPU-specific subclass of TargetSubtargetInfo.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef CELLSUBTARGET_H
15#define CELLSUBTARGET_H
16
17#include "llvm/Target/TargetSubtargetInfo.h"
18#include "llvm/MC/MCInstrItineraries.h"
19#include <string>
20
21#define GET_SUBTARGETINFO_HEADER
22#include "SPUGenSubtargetInfo.inc"
23
24namespace llvm {
25  class GlobalValue;
26  class StringRef;
27
28  namespace SPU {
29    enum {
30      PROC_NONE,
31      DEFAULT_PROC
32    };
33  }
34
35  class SPUSubtarget : public SPUGenSubtargetInfo {
36  protected:
37    /// stackAlignment - The minimum alignment known to hold of the stack frame
38    /// on entry to the function and which must be maintained by every function.
39    unsigned StackAlignment;
40
41    /// Selected instruction itineraries (one entry per itinerary class.)
42    InstrItineraryData InstrItins;
43
44    /// Which SPU processor (this isn't really used, but it's there to keep
45    /// the C compiler happy)
46    unsigned ProcDirective;
47
48    /// Use (assume) large memory -- effectively disables the LQA/STQA
49    /// instructions that assume 259K local store.
50    bool UseLargeMem;
51
52  public:
53    /// This constructor initializes the data members to match that
54    /// of the specified triple.
55    ///
56    SPUSubtarget(const std::string &TT, const std::string &CPU,
57                 const std::string &FS);
58
59    /// ParseSubtargetFeatures - Parses features string setting specified
60    /// subtarget options.  Definition of function is auto generated by tblgen.
61    void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
62
63    /// SetJITMode - This is called to inform the subtarget info that we are
64    /// producing code for the JIT.
65    void SetJITMode();
66
67    /// getStackAlignment - Returns the minimum alignment known to hold of the
68    /// stack frame on entry to the function and which must be maintained by
69    /// every function for this subtarget.
70    unsigned getStackAlignment() const { return StackAlignment; }
71
72    /// getInstrItins - Return the instruction itineraies based on subtarget
73    /// selection.
74    const InstrItineraryData &getInstrItineraryData() const {
75      return InstrItins;
76    }
77
78    /// Use large memory addressing predicate
79    bool usingLargeMem() const {
80      return UseLargeMem;
81    }
82
83    /// getTargetDataString - Return the pointer size and type alignment
84    /// properties of this subtarget.
85    const char *getTargetDataString() const {
86      return "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128"
87             "-i16:16:128-i8:8:128-i1:8:128-a:0:128-v64:64:128-v128:128:128"
88             "-s:128:128-n32:64";
89    }
90
91    bool enablePostRAScheduler(CodeGenOpt::Level OptLevel,
92                               TargetSubtargetInfo::AntiDepBreakMode& Mode,
93                               RegClassVector& CriticalPathRCs) const;
94  };
95} // End llvm namespace
96
97#endif
98