blob: 7c4aa143021751d263bb24e4f9eea13fd79467e9 [file] [log] [blame]
Chris Lattner4ee451d2007-12-29 20:36:04 +00001//===-- SPUSubtarget.h - Define Subtarget for the Cell SPU ------*- C++ -*-===//
Scott Michel564427e2007-12-05 01:24:05 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Scott Michel564427e2007-12-05 01:24:05 +00007//
8//===----------------------------------------------------------------------===//
9//
Evan Cheng5b1b44892011-07-01 21:01:15 +000010// This file declares the Cell SPU-specific subclass of TargetSubtargetInfo.
Scott Michel564427e2007-12-05 01:24:05 +000011//
12//===----------------------------------------------------------------------===//
13
Chris Lattner4ee451d2007-12-29 20:36:04 +000014#ifndef CELLSUBTARGET_H
15#define CELLSUBTARGET_H
Scott Michel564427e2007-12-05 01:24:05 +000016
Evan Cheng5b1b44892011-07-01 21:01:15 +000017#include "llvm/Target/TargetSubtargetInfo.h"
Evan Chengab8be962011-06-29 01:14:12 +000018#include "llvm/MC/MCInstrItineraries.h"
Scott Michel564427e2007-12-05 01:24:05 +000019#include <string>
20
Evan Cheng94214702011-07-01 20:45:01 +000021#define GET_SUBTARGETINFO_HEADER
Evan Cheng385e9302011-07-01 22:36:09 +000022#include "SPUGenSubtargetInfo.inc"
Evan Cheng94214702011-07-01 20:45:01 +000023
Scott Michel564427e2007-12-05 01:24:05 +000024namespace llvm {
Scott Michel564427e2007-12-05 01:24:05 +000025 class GlobalValue;
Evan Cheng0ddff1b2011-07-07 07:07:08 +000026 class StringRef;
Scott Michel564427e2007-12-05 01:24:05 +000027
28 namespace SPU {
29 enum {
Dale Johannesendb01c8b2008-02-14 23:35:16 +000030 PROC_NONE,
Scott Michel564427e2007-12-05 01:24:05 +000031 DEFAULT_PROC
32 };
33 }
34
Evan Cheng94214702011-07-01 20:45:01 +000035 class SPUSubtarget : public SPUGenSubtargetInfo {
Scott Michel564427e2007-12-05 01:24:05 +000036 protected:
Scott Michel564427e2007-12-05 01:24:05 +000037 /// 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
Daniel Dunbar3be03402009-08-02 22:11:08 +000054 /// of the specified triple.
Scott Michel564427e2007-12-05 01:24:05 +000055 ///
Evan Cheng276365d2011-06-30 01:53:36 +000056 SPUSubtarget(const std::string &TT, const std::string &CPU,
57 const std::string &FS);
Scott Michel564427e2007-12-05 01:24:05 +000058
59 /// ParseSubtargetFeatures - Parses features string setting specified
60 /// subtarget options. Definition of function is auto generated by tblgen.
Evan Cheng0ddff1b2011-07-07 07:07:08 +000061 void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
Anton Korobeynikov41a02432009-05-23 19:50:50 +000062
Scott Michel564427e2007-12-05 01:24:05 +000063 /// 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"
Kalle Raiskila505faa62010-10-26 10:45:47 +000087 "-i16:16:128-i8:8:128-i1:8:128-a:0:128-v64:64:128-v128:128:128"
Chris Lattner59a91782009-11-07 19:07:32 +000088 "-s:128:128-n32:64";
Scott Michel564427e2007-12-05 01:24:05 +000089 }
Kalle Raiskilac2ebfd42010-11-29 10:30:25 +000090
91 bool enablePostRAScheduler(CodeGenOpt::Level OptLevel,
Evan Cheng5b1b44892011-07-01 21:01:15 +000092 TargetSubtargetInfo::AntiDepBreakMode& Mode,
Kalle Raiskilac2ebfd42010-11-29 10:30:25 +000093 RegClassVector& CriticalPathRCs) const;
Scott Michel564427e2007-12-05 01:24:05 +000094 };
95} // End llvm namespace
96
97#endif