1 //===-- SparcSubtarget.h - Define Subtarget for the SPARC -------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file declares the SPARC specific subclass of TargetSubtargetInfo.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_LIB_TARGET_SPARC_SPARCSUBTARGET_H
14 #define LLVM_LIB_TARGET_SPARC_SPARCSUBTARGET_H
16 #include "SparcFrameLowering.h"
17 #include "SparcISelLowering.h"
18 #include "SparcInstrInfo.h"
19 #include "llvm/CodeGen/SelectionDAGTargetInfo.h"
20 #include "llvm/CodeGen/TargetFrameLowering.h"
21 #include "llvm/CodeGen/TargetSubtargetInfo.h"
22 #include "llvm/IR/DataLayout.h"
25 #define GET_SUBTARGETINFO_HEADER
26 #include "SparcGenSubtargetInfo.inc"
31 class SparcSubtarget
: public SparcGenSubtargetInfo
{
33 virtual void anchor();
37 bool V8DeprecatedInsts
;
38 bool IsVIS
, IsVIS2
, IsVIS3
;
52 bool DetectRoundChange
;
53 bool HasLeonCycleCounter
;
55 SparcInstrInfo InstrInfo
;
56 SparcTargetLowering TLInfo
;
57 SelectionDAGTargetInfo TSInfo
;
58 SparcFrameLowering FrameLowering
;
61 SparcSubtarget(const Triple
&TT
, const std::string
&CPU
,
62 const std::string
&FS
, const TargetMachine
&TM
, bool is64bit
);
64 const SparcInstrInfo
*getInstrInfo() const override
{ return &InstrInfo
; }
65 const TargetFrameLowering
*getFrameLowering() const override
{
66 return &FrameLowering
;
68 const SparcRegisterInfo
*getRegisterInfo() const override
{
69 return &InstrInfo
.getRegisterInfo();
71 const SparcTargetLowering
*getTargetLowering() const override
{
74 const SelectionDAGTargetInfo
*getSelectionDAGInfo() const override
{
78 bool enableMachineScheduler() const override
;
80 bool useSoftMulDiv() const { return UseSoftMulDiv
; }
81 bool isV9() const { return IsV9
; }
82 bool isLeon() const { return IsLeon
; }
83 bool isVIS() const { return IsVIS
; }
84 bool isVIS2() const { return IsVIS2
; }
85 bool isVIS3() const { return IsVIS3
; }
86 bool useDeprecatedV8Instructions() const { return V8DeprecatedInsts
; }
87 bool hasHardQuad() const { return HasHardQuad
; }
88 bool usePopc() const { return UsePopc
; }
89 bool useSoftFloat() const { return UseSoftFloat
; }
90 bool hasNoFSMULD() const { return HasNoFSMULD
; }
91 bool hasNoFMULS() const { return HasNoFMULS
; }
94 bool hasUmacSmac() const { return HasUmacSmac
; }
95 bool hasLeonCasa() const { return HasLeonCasa
; }
96 bool hasPWRPSR() const { return HasPWRPSR
; }
97 bool insertNOPLoad() const { return InsertNOPLoad
; }
98 bool fixAllFDIVSQRT() const { return FixAllFDIVSQRT
; }
99 bool detectRoundChange() const { return DetectRoundChange
; }
100 bool hasLeonCycleCounter() const { return HasLeonCycleCounter
; }
102 /// ParseSubtargetFeatures - Parses features string setting specified
103 /// subtarget options. Definition of function is auto generated by tblgen.
104 void ParseSubtargetFeatures(StringRef CPU
, StringRef FS
);
105 SparcSubtarget
&initializeSubtargetDependencies(StringRef CPU
, StringRef FS
);
107 bool is64Bit() const { return Is64Bit
; }
109 /// The 64-bit ABI uses biased stack and frame pointers, so the stack frame
110 /// of the current function is the area from [%sp+BIAS] to [%fp+BIAS].
111 int64_t getStackPointerBias() const {
112 return is64Bit() ? 2047 : 0;
115 /// Given a actual stack size as determined by FrameInfo, this function
116 /// returns adjusted framesize which includes space for register window
117 /// spills and arguments.
118 int getAdjustedFrameSize(int stackSize
) const;
120 bool isTargetLinux() const { return TargetTriple
.isOSLinux(); }
123 } // end namespace llvm