ARMSubtarget.h revision 198892
1351278Sdim//=====---- ARMSubtarget.h - Define Subtarget for the ARM -----*- C++ -*--====// 2351278Sdim// 3351278Sdim// The LLVM Compiler Infrastructure 4351278Sdim// 5351278Sdim// This file is distributed under the University of Illinois Open Source 6351278Sdim// License. See LICENSE.TXT for details. 7351278Sdim// 8351278Sdim//===----------------------------------------------------------------------===// 9351278Sdim// 10351278Sdim// This file declares the ARM specific subclass of TargetSubtarget. 11351278Sdim// 12351278Sdim//===----------------------------------------------------------------------===// 13351278Sdim 14351278Sdim#ifndef ARMSUBTARGET_H 15351278Sdim#define ARMSUBTARGET_H 16351278Sdim 17351278Sdim#include "llvm/Target/TargetInstrItineraries.h" 18351278Sdim#include "llvm/Target/TargetMachine.h" 19351278Sdim#include "llvm/Target/TargetSubtarget.h" 20360784Sdim#include <string> 21360784Sdim 22351278Sdimnamespace llvm { 23360784Sdimclass GlobalValue; 24360784Sdim 25351278Sdimclass ARMSubtarget : public TargetSubtarget { 26360784Sdimprotected: 27351278Sdim enum ARMArchEnum { 28360784Sdim V4T, V5T, V5TE, V6, V6T2, V7A 29360784Sdim }; 30351278Sdim 31360784Sdim enum ARMFPEnum { 32360784Sdim None, VFPv2, VFPv3, NEON 33351278Sdim }; 34360784Sdim 35360784Sdim enum ThumbTypeEnum { 36360784Sdim Thumb1, 37360784Sdim Thumb2 38360784Sdim }; 39360784Sdim 40360784Sdim /// ARMArchVersion - ARM architecture version: V4T (base), V5T, V5TE, 41360784Sdim /// V6, V6T2, V7A. 42360784Sdim ARMArchEnum ARMArchVersion; 43360784Sdim 44360784Sdim /// ARMFPUType - Floating Point Unit type. 45360784Sdim ARMFPEnum ARMFPUType; 46360784Sdim 47360784Sdim /// UseNEONForSinglePrecisionFP - if the NEONFP attribute has been 48360784Sdim /// specified. Use the method useNEONForSinglePrecisionFP() to 49360784Sdim /// determine if NEON should actually be used. 50360784Sdim bool UseNEONForSinglePrecisionFP; 51360784Sdim 52360784Sdim /// IsThumb - True if we are in thumb mode, false if in ARM mode. 53360784Sdim bool IsThumb; 54360784Sdim 55360784Sdim /// ThumbMode - Indicates supported Thumb version. 56360784Sdim ThumbTypeEnum ThumbMode; 57360784Sdim 58360784Sdim /// PostRAScheduler - True if using post-register-allocation scheduler. 59351278Sdim bool PostRAScheduler; 60360784Sdim 61351278Sdim /// IsR9Reserved - True if R9 is a not available as general purpose register. 62360784Sdim bool IsR9Reserved; 63360784Sdim 64351278Sdim /// stackAlignment - The minimum alignment known to hold of the stack frame on 65360784Sdim /// entry to the function and which must be maintained by every function. 66360784Sdim unsigned stackAlignment; 67360784Sdim 68360784Sdim /// CPUString - String name of used CPU. 69360784Sdim std::string CPUString; 70360784Sdim 71351278Sdim /// Selected instruction itineraries (one entry per itinerary class.) 72360784Sdim InstrItineraryData InstrItins; 73360784Sdim 74360784Sdim public: 75360784Sdim enum { 76351278Sdim isELF, isDarwin 77360784Sdim } TargetType; 78360784Sdim 79360784Sdim enum { 80360784Sdim ARM_ABI_APCS, 81351278Sdim ARM_ABI_AAPCS // ARM EABI 82360784Sdim } TargetABI; 83360784Sdim 84360784Sdim /// This constructor initializes the data members to match that 85360784Sdim /// of the specified triple. 86360784Sdim /// 87360784Sdim ARMSubtarget(const std::string &TT, const std::string &FS, bool isThumb); 88360784Sdim 89360784Sdim /// getMaxInlineSizeThreshold - Returns the maximum memset / memcpy size 90360784Sdim /// that still makes it profitable to inline the call. 91360784Sdim unsigned getMaxInlineSizeThreshold() const { 92360784Sdim // FIXME: For now, we don't lower memcpy's to loads / stores for Thumb. 93360784Sdim // Change this once Thumb ldmia / stmia support is added. 94351278Sdim return isThumb() ? 0 : 64; 95360784Sdim } 96360784Sdim /// ParseSubtargetFeatures - Parses features string setting specified 97351278Sdim /// subtarget options. Definition of function is auto generated by tblgen. 98351278Sdim std::string ParseSubtargetFeatures(const std::string &FS, 99360784Sdim const std::string &CPU); 100360784Sdim 101351278Sdim bool hasV4TOps() const { return ARMArchVersion >= V4T; } 102360784Sdim bool hasV5TOps() const { return ARMArchVersion >= V5T; } 103360784Sdim bool hasV5TEOps() const { return ARMArchVersion >= V5TE; } 104351278Sdim bool hasV6Ops() const { return ARMArchVersion >= V6; } 105351278Sdim bool hasV6T2Ops() const { return ARMArchVersion >= V6T2; } 106360784Sdim bool hasV7Ops() const { return ARMArchVersion >= V7A; } 107360784Sdim 108360784Sdim bool hasVFP2() const { return ARMFPUType >= VFPv2; } 109360784Sdim bool hasVFP3() const { return ARMFPUType >= VFPv3; } 110360784Sdim bool hasNEON() const { return ARMFPUType >= NEON; } 111360784Sdim bool useNEONForSinglePrecisionFP() const { 112360784Sdim return hasNEON() && UseNEONForSinglePrecisionFP; } 113360784Sdim 114360784Sdim bool isTargetDarwin() const { return TargetType == isDarwin; } 115360784Sdim bool isTargetELF() const { return TargetType == isELF; } 116351278Sdim 117360784Sdim bool isAPCS_ABI() const { return TargetABI == ARM_ABI_APCS; } 118351278Sdim bool isAAPCS_ABI() const { return TargetABI == ARM_ABI_AAPCS; } 119360784Sdim 120360784Sdim bool isThumb() const { return IsThumb; } 121360784Sdim bool isThumb1Only() const { return IsThumb && (ThumbMode == Thumb1); } 122360784Sdim bool isThumb2() const { return IsThumb && (ThumbMode == Thumb2); } 123360784Sdim bool hasThumb2() const { return ThumbMode >= Thumb2; } 124360784Sdim 125360784Sdim bool isR9Reserved() const { return IsR9Reserved; } 126360784Sdim 127360784Sdim const std::string & getCPUString() const { return CPUString; } 128360784Sdim 129360784Sdim /// enablePostRAScheduler - True at 'More' optimization except 130360784Sdim /// for Thumb1. 131360784Sdim bool enablePostRAScheduler(CodeGenOpt::Level OptLevel, 132360784Sdim TargetSubtarget::AntiDepBreakMode& mode) const { 133360784Sdim mode = TargetSubtarget::ANTIDEP_CRITICAL; 134360784Sdim return PostRAScheduler && OptLevel >= CodeGenOpt::Default; 135360784Sdim } 136360784Sdim 137360784Sdim /// getInstrItins - Return the instruction itineraies based on subtarget 138360784Sdim /// selection. 139360784Sdim const InstrItineraryData &getInstrItineraryData() const { return InstrItins; } 140360784Sdim 141360784Sdim /// getStackAlignment - Returns the minimum alignment known to hold of the 142360784Sdim /// stack frame on entry to the function and which must be maintained by every 143360784Sdim /// function for this subtarget. 144360784Sdim unsigned getStackAlignment() const { return stackAlignment; } 145360784Sdim 146360784Sdim /// GVIsIndirectSymbol - true if the GV will be accessed via an indirect 147360784Sdim /// symbol. 148360784Sdim bool GVIsIndirectSymbol(GlobalValue *GV, Reloc::Model RelocM) const; 149360784Sdim}; 150360784Sdim} // End llvm namespace 151360784Sdim 152360784Sdim#endif // ARMSUBTARGET_H 153360784Sdim