SparcSubtarget.h revision 314564
1257097Srpaulo//===-- SparcSubtarget.h - Define Subtarget for the SPARC -------*- C++ -*-===//
2257097Srpaulo//
3257097Srpaulo//                     The LLVM Compiler Infrastructure
4257097Srpaulo//
5257097Srpaulo// This file is distributed under the University of Illinois Open Source
6257097Srpaulo// License. See LICENSE.TXT for details.
7257097Srpaulo//
8277457Sngie//===----------------------------------------------------------------------===//
9292282Sngie//
10292282Sngie// This file declares the SPARC specific subclass of TargetSubtargetInfo.
11326332Sasomers//
12326332Sasomers//===----------------------------------------------------------------------===//
13321130Sngie
14257097Srpaulo#ifndef LLVM_LIB_TARGET_SPARC_SPARCSUBTARGET_H
15277457Sngie#define LLVM_LIB_TARGET_SPARC_SPARCSUBTARGET_H
16260024Sjmmv
17290574Sngie#include "SparcFrameLowering.h"
18290574Sngie#include "SparcISelLowering.h"
19320712Sngie#include "SparcInstrInfo.h"
20320712Sngie#include "llvm/CodeGen/SelectionDAGTargetInfo.h"
21277747Sngie#include "llvm/IR/DataLayout.h"
22277747Sngie#include "llvm/Target/TargetFrameLowering.h"
23321093Sngie#include "llvm/Target/TargetSubtargetInfo.h"
24321093Sngie#include <string>
25289965Sngie
26289965Sngie#define GET_SUBTARGETINFO_HEADER
27326332Sasomers#include "SparcGenSubtargetInfo.inc"
28326332Sasomers
29277457Sngienamespace llvm {
30260024Sjmmvclass StringRef;
31277457Sngie
32260024Sjmmvclass SparcSubtarget : public SparcGenSubtargetInfo {
33277457Sngie  Triple TargetTriple;
34277457Sngie  virtual void anchor();
35326332Sasomers  bool IsV9;
36326332Sasomers  bool IsLeon;
37326332Sasomers  bool V8DeprecatedInsts;
38326332Sasomers  bool IsVIS, IsVIS2, IsVIS3;
39277457Sngie  bool Is64Bit;
40277457Sngie  bool HasHardQuad;
41262951Sjmmv  bool UsePopc;
42277457Sngie  bool UseSoftFloat;
43262951Sjmmv
44277457Sngie  // LEON features
45262951Sjmmv  bool HasUmacSmac;
46277457Sngie  bool HasLeonCasa;
47264996Sjmmv  bool InsertNOPLoad;
48277457Sngie  bool FixFSMULD;
49262951Sjmmv  bool ReplaceFMULS;
50277457Sngie  bool FixAllFDIVSQRT;
51276490Sngie  bool DetectRoundChange;
52277457Sngie  bool PerformSDIVReplace;
53262951Sjmmv
54262951Sjmmv  SparcInstrInfo InstrInfo;
55277457Sngie  SparcTargetLowering TLInfo;
56277457Sngie  SelectionDAGTargetInfo TSInfo;
57277457Sngie  SparcFrameLowering FrameLowering;
58277457Sngie
59277457Sngiepublic:
60277457Sngie  SparcSubtarget(const Triple &TT, const std::string &CPU,
61277457Sngie                 const std::string &FS, const TargetMachine &TM, bool is64bit);
62277457Sngie
63277457Sngie  const SparcInstrInfo *getInstrInfo() const override { return &InstrInfo; }
64277457Sngie  const TargetFrameLowering *getFrameLowering() const override {
65277457Sngie    return &FrameLowering;
66277457Sngie  }
67277457Sngie  const SparcRegisterInfo *getRegisterInfo() const override {
68313485Sngie    return &InstrInfo.getRegisterInfo();
69313485Sngie  }
70313485Sngie  const SparcTargetLowering *getTargetLowering() const override {
71313485Sngie    return &TLInfo;
72313485Sngie  }
73313485Sngie  const SelectionDAGTargetInfo *getSelectionDAGInfo() const override {
74313485Sngie    return &TSInfo;
75313485Sngie  }
76313485Sngie
77313485Sngie  bool enableMachineScheduler() const override;
78313485Sngie
79313485Sngie  bool isV9() const { return IsV9; }
80313485Sngie  bool isLeon() const { return IsLeon; }
81313485Sngie  bool isVIS() const { return IsVIS; }
82313485Sngie  bool isVIS2() const { return IsVIS2; }
83313485Sngie  bool isVIS3() const { return IsVIS3; }
84313485Sngie  bool useDeprecatedV8Instructions() const { return V8DeprecatedInsts; }
85313485Sngie  bool hasHardQuad() const { return HasHardQuad; }
86313485Sngie  bool usePopc() const { return UsePopc; }
87313485Sngie  bool useSoftFloat() const { return UseSoftFloat; }
88313485Sngie
89313485Sngie  // Leon options
90313485Sngie  bool hasUmacSmac() const { return HasUmacSmac; }
91313485Sngie  bool performSDIVReplace() const { return PerformSDIVReplace; }
92313485Sngie  bool hasLeonCasa() const { return HasLeonCasa; }
93313485Sngie  bool insertNOPLoad() const { return InsertNOPLoad; }
94313485Sngie  bool fixFSMULD() const { return FixFSMULD; }
95313485Sngie  bool replaceFMULS() const { return ReplaceFMULS; }
96313485Sngie  bool fixAllFDIVSQRT() const { return FixAllFDIVSQRT; }
97313485Sngie  bool detectRoundChange() const { return DetectRoundChange; }
98313485Sngie
99313485Sngie  /// ParseSubtargetFeatures - Parses features string setting specified
100313485Sngie  /// subtarget options.  Definition of function is auto generated by tblgen.
101313485Sngie  void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
102313485Sngie  SparcSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS);
103313485Sngie
104313485Sngie  bool is64Bit() const { return Is64Bit; }
105313485Sngie
106313485Sngie  /// The 64-bit ABI uses biased stack and frame pointers, so the stack frame
107313485Sngie  /// of the current function is the area from [%sp+BIAS] to [%fp+BIAS].
108313485Sngie  int64_t getStackPointerBias() const {
109313485Sngie    return is64Bit() ? 2047 : 0;
110313485Sngie  }
111313485Sngie
112313485Sngie  /// Given a actual stack size as determined by FrameInfo, this function
113313485Sngie  /// returns adjusted framesize which includes space for register window
114313485Sngie  /// spills and arguments.
115313485Sngie  int getAdjustedFrameSize(int stackSize) const;
116313485Sngie
117313485Sngie  bool isTargetLinux() const { return TargetTriple.isOSLinux(); }
118313485Sngie};
119313485Sngie
120313485Sngie} // end namespace llvm
121313485Sngie
122313485Sngie#endif
123313485Sngie