ARMSubtarget.h revision a8e2989ece6dc46df59b0768184028257f913843
1a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//=====---- ARMSubtarget.h - Define Subtarget for the ARM -----*- C++ -*--====// 2a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 3a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// The LLVM Compiler Infrastructure 4a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 5a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// This file was developed by Evan Cheng and is distributed under the 6a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// University of Illinois Open Source License. See LICENSE.TXT for details. 7a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 8a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===----------------------------------------------------------------------===// 9a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 10a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// This file declares the ARM specific subclass of TargetSubtarget. 11a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 12a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===----------------------------------------------------------------------===// 13a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 14a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#ifndef ARMSUBTARGET_H 15a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#define ARMSUBTARGET_H 16a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 17a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "llvm/Target/TargetSubtarget.h" 18a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include <string> 19a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 20a8e2989ece6dc46df59b0768184028257f913843Evan Chengnamespace llvm { 21a8e2989ece6dc46df59b0768184028257f913843Evan Chengclass Module; 22a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 23a8e2989ece6dc46df59b0768184028257f913843Evan Chengclass ARMSubtarget : public TargetSubtarget { 24a8e2989ece6dc46df59b0768184028257f913843Evan Chengprotected: 25a8e2989ece6dc46df59b0768184028257f913843Evan Cheng enum ARMArchEnum { 26a8e2989ece6dc46df59b0768184028257f913843Evan Cheng V4T, V5T, V5TE, V6 27a8e2989ece6dc46df59b0768184028257f913843Evan Cheng }; 28a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 29a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// ARMArchVersion - ARM architecture vecrsion: V4T (base), V5T, V5TE, 30a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// and V6. 31a8e2989ece6dc46df59b0768184028257f913843Evan Cheng ARMArchEnum ARMArchVersion; 32a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 33a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// HasVFP2 - True if the processor supports Vector Floating Point (VFP) V2 34a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// instructions. 35a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool HasVFP2; 36a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 37a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// IsThumb - True if we are in thumb mode, false if in ARM mode. 38a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool IsThumb; 39a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 40a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool IsDarwin; 41a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 42a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// UseThumbBacktraces - True if we use thumb style backtraces. 43a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool UseThumbBacktraces; 44a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 45a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// IsR9Reserved - True if R9 is a not available as general purpose register. 46a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool IsR9Reserved; 47a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 48a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// stackAlignment - The minimum alignment known to hold of the stack frame on 49a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// entry to the function and which must be maintained by every function. 50a8e2989ece6dc46df59b0768184028257f913843Evan Cheng unsigned stackAlignment; 51a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 52a8e2989ece6dc46df59b0768184028257f913843Evan Cheng public: 53a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// This constructor initializes the data members to match that 54a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// of the specified module. 55a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// 56a8e2989ece6dc46df59b0768184028257f913843Evan Cheng ARMSubtarget(const Module &M, const std::string &FS); 57a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 58a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// ParseSubtargetFeatures - Parses features string setting specified 59a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// subtarget options. Definition of function is auto generated by tblgen. 60a8e2989ece6dc46df59b0768184028257f913843Evan Cheng void ParseSubtargetFeatures(const std::string &FS, const std::string &CPU); 61a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 62a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool hasV4TOps() const { return ARMArchVersion >= V4T; } 63a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool hasV5TOps() const { return ARMArchVersion >= V5T; } 64a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool hasV5TEOps() const { return ARMArchVersion >= V5TE; } 65a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool hasV6Ops() const { return ARMArchVersion >= V6; } 66a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 67a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool hasVFP2() const { return HasVFP2; } 68a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 69a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool isDarwin() const { return IsDarwin; } 70a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool isThumb() const { return IsThumb; } 71a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 72a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool useThumbBacktraces() const { return UseThumbBacktraces; } 73a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool isR9Reserved() const { return IsR9Reserved; } 74a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 75a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// getStackAlignment - Returns the minimum alignment known to hold of the 76a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// stack frame on entry to the function and which must be maintained by every 77a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// function for this subtarget. 78a8e2989ece6dc46df59b0768184028257f913843Evan Cheng unsigned getStackAlignment() const { return stackAlignment; } 79a8e2989ece6dc46df59b0768184028257f913843Evan Cheng}; 80a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} // End llvm namespace 81a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 82a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#endif // ARMSUBTARGET_H 83