ARMSubtarget.h revision e0703c84ddeb1a1276de4e38210c1127ef5df130
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 /// UseThumbBacktraces - True if we use thumb style backtraces. 41a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool UseThumbBacktraces; 42a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 43a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// IsR9Reserved - True if R9 is a not available as general purpose register. 44a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool IsR9Reserved; 453630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio 46a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// stackAlignment - The minimum alignment known to hold of the stack frame on 47a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// entry to the function and which must be maintained by every function. 48a8e2989ece6dc46df59b0768184028257f913843Evan Cheng unsigned stackAlignment; 49a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 50a8e2989ece6dc46df59b0768184028257f913843Evan Cheng public: 511a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng enum { 521a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng isELF, isDarwin 531a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng } TargetType; 541a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng 553630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio enum { 563630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio ARM_ABI_APCS, 573630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio ARM_ABI_AAPCS // ARM EABI 583630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio } TargetABI; 593630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio 60a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// This constructor initializes the data members to match that 61a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// of the specified module. 62a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// 6304321f70f5075673934d5b1ed3353dd15d911183Evan Cheng ARMSubtarget(const Module &M, const std::string &FS, bool thumb); 64a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 65e0703c84ddeb1a1276de4e38210c1127ef5df130Rafael Espindola unsigned getMaxInlineSizeThreshold() const { 66e0703c84ddeb1a1276de4e38210c1127ef5df130Rafael Espindola // FIXME: For now, we don't lower memcpy's to loads / stores for Thumb. 67e0703c84ddeb1a1276de4e38210c1127ef5df130Rafael Espindola // Change this once Thumb ldmia / stmia support is added. 68e0703c84ddeb1a1276de4e38210c1127ef5df130Rafael Espindola return isThumb() ? 0 : 64; 69e0703c84ddeb1a1276de4e38210c1127ef5df130Rafael Espindola } 70a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// ParseSubtargetFeatures - Parses features string setting specified 71a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// subtarget options. Definition of function is auto generated by tblgen. 72a8e2989ece6dc46df59b0768184028257f913843Evan Cheng void ParseSubtargetFeatures(const std::string &FS, const std::string &CPU); 73a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 74a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool hasV4TOps() const { return ARMArchVersion >= V4T; } 75a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool hasV5TOps() const { return ARMArchVersion >= V5T; } 76a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool hasV5TEOps() const { return ARMArchVersion >= V5TE; } 77a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool hasV6Ops() const { return ARMArchVersion >= V6; } 78a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 79a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool hasVFP2() const { return HasVFP2; } 80a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 811a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng bool isTargetDarwin() const { return TargetType == isDarwin; } 821a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng bool isTargetELF() const { return TargetType == isELF; } 831a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng 843630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio bool isAPCS_ABI() const { return TargetABI == ARM_ABI_APCS; } 853630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio bool isAAPCS_ABI() const { return TargetABI == ARM_ABI_AAPCS; } 863630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio 87a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool isThumb() const { return IsThumb; } 88a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 89a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool useThumbBacktraces() const { return UseThumbBacktraces; } 90a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool isR9Reserved() const { return IsR9Reserved; } 91a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 92a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// getStackAlignment - Returns the minimum alignment known to hold of the 93a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// stack frame on entry to the function and which must be maintained by every 94a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// function for this subtarget. 95a8e2989ece6dc46df59b0768184028257f913843Evan Cheng unsigned getStackAlignment() const { return stackAlignment; } 96a8e2989ece6dc46df59b0768184028257f913843Evan Cheng}; 97a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} // End llvm namespace 98a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 99a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#endif // ARMSUBTARGET_H 100