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