ARMSubtarget.h revision d4022c3fbb0705abdc8eddc3ee4a5059f5ef8094
1a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//=====---- ARMSubtarget.h - Define Subtarget for the ARM -----*- C++ -*--====// 2a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 3a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// The LLVM Compiler Infrastructure 4a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// 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 { 266d7d2aa38a247426e2ccf53e3c6ad0315c9a4d8cAnton Korobeynikov V4T, V5T, V5TE, V6, V7A 27a8e2989ece6dc46df59b0768184028257f913843Evan Cheng }; 28a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 296d7d2aa38a247426e2ccf53e3c6ad0315c9a4d8cAnton Korobeynikov enum ARMFPEnum { 306d7d2aa38a247426e2ccf53e3c6ad0315c9a4d8cAnton Korobeynikov None, VFPv2, VFPv3, NEON 316d7d2aa38a247426e2ccf53e3c6ad0315c9a4d8cAnton Korobeynikov }; 326d7d2aa38a247426e2ccf53e3c6ad0315c9a4d8cAnton Korobeynikov 33d4022c3fbb0705abdc8eddc3ee4a5059f5ef8094Anton Korobeynikov enum ThumbTypeEnum { 34d4022c3fbb0705abdc8eddc3ee4a5059f5ef8094Anton Korobeynikov ThumbNone, 35d4022c3fbb0705abdc8eddc3ee4a5059f5ef8094Anton Korobeynikov Thumb1, 36d4022c3fbb0705abdc8eddc3ee4a5059f5ef8094Anton Korobeynikov Thumb2 37d4022c3fbb0705abdc8eddc3ee4a5059f5ef8094Anton Korobeynikov }; 38d4022c3fbb0705abdc8eddc3ee4a5059f5ef8094Anton Korobeynikov 396d7d2aa38a247426e2ccf53e3c6ad0315c9a4d8cAnton Korobeynikov /// ARMArchVersion - ARM architecture version: V4T (base), V5T, V5TE, 40d4022c3fbb0705abdc8eddc3ee4a5059f5ef8094Anton Korobeynikov /// V6, V6T2, V7A. 41a8e2989ece6dc46df59b0768184028257f913843Evan Cheng ARMArchEnum ARMArchVersion; 42a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 436d7d2aa38a247426e2ccf53e3c6ad0315c9a4d8cAnton Korobeynikov /// ARMFPUType - Floating Point Unit type. 446d7d2aa38a247426e2ccf53e3c6ad0315c9a4d8cAnton Korobeynikov ARMFPEnum ARMFPUType; 45a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 46d4022c3fbb0705abdc8eddc3ee4a5059f5ef8094Anton Korobeynikov /// ThumbMode - ARM if in ARM mode, otherwise indicates Thumb version. 47d4022c3fbb0705abdc8eddc3ee4a5059f5ef8094Anton Korobeynikov ThumbTypeEnum ThumbMode; 48a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 49a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// UseThumbBacktraces - True if we use thumb style backtraces. 50a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool UseThumbBacktraces; 51a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 52a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// IsR9Reserved - True if R9 is a not available as general purpose register. 53a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool IsR9Reserved; 543630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio 55a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// stackAlignment - The minimum alignment known to hold of the stack frame on 56a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// entry to the function and which must be maintained by every function. 57a8e2989ece6dc46df59b0768184028257f913843Evan Cheng unsigned stackAlignment; 58a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 5941a024385f1220eadc48b48cb4c044a5fbc1b361Anton Korobeynikov /// CPUString - String name of used CPU. 6041a024385f1220eadc48b48cb4c044a5fbc1b361Anton Korobeynikov std::string CPUString; 6141a024385f1220eadc48b48cb4c044a5fbc1b361Anton Korobeynikov 62a8e2989ece6dc46df59b0768184028257f913843Evan Cheng public: 631a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng enum { 641a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng isELF, isDarwin 651a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng } TargetType; 661a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng 673630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio enum { 683630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio ARM_ABI_APCS, 693630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio ARM_ABI_AAPCS // ARM EABI 703630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio } TargetABI; 713630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio 72a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// This constructor initializes the data members to match that 73a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// of the specified module. 74a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// 75d4022c3fbb0705abdc8eddc3ee4a5059f5ef8094Anton Korobeynikov ARMSubtarget(const Module &M, const std::string &FS, bool isThumb); 76a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 77707e0184233f27e0e9f9aee0309f2daab8cfe7f8Dan Gohman /// getMaxInlineSizeThreshold - Returns the maximum memset / memcpy size 78707e0184233f27e0e9f9aee0309f2daab8cfe7f8Dan Gohman /// that still makes it profitable to inline the call. 79e0703c84ddeb1a1276de4e38210c1127ef5df130Rafael Espindola unsigned getMaxInlineSizeThreshold() const { 80e0703c84ddeb1a1276de4e38210c1127ef5df130Rafael Espindola // FIXME: For now, we don't lower memcpy's to loads / stores for Thumb. 81e0703c84ddeb1a1276de4e38210c1127ef5df130Rafael Espindola // Change this once Thumb ldmia / stmia support is added. 82e0703c84ddeb1a1276de4e38210c1127ef5df130Rafael Espindola return isThumb() ? 0 : 64; 83e0703c84ddeb1a1276de4e38210c1127ef5df130Rafael Espindola } 846d7d2aa38a247426e2ccf53e3c6ad0315c9a4d8cAnton Korobeynikov /// ParseSubtargetFeatures - Parses features string setting specified 85a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// subtarget options. Definition of function is auto generated by tblgen. 8641a024385f1220eadc48b48cb4c044a5fbc1b361Anton Korobeynikov std::string ParseSubtargetFeatures(const std::string &FS, 8741a024385f1220eadc48b48cb4c044a5fbc1b361Anton Korobeynikov const std::string &CPU); 88a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 896d7d2aa38a247426e2ccf53e3c6ad0315c9a4d8cAnton Korobeynikov bool hasV4TOps() const { return ARMArchVersion >= V4T; } 906d7d2aa38a247426e2ccf53e3c6ad0315c9a4d8cAnton Korobeynikov bool hasV5TOps() const { return ARMArchVersion >= V5T; } 91a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool hasV5TEOps() const { return ARMArchVersion >= V5TE; } 926d7d2aa38a247426e2ccf53e3c6ad0315c9a4d8cAnton Korobeynikov bool hasV6Ops() const { return ARMArchVersion >= V6; } 936d7d2aa38a247426e2ccf53e3c6ad0315c9a4d8cAnton Korobeynikov bool hasV7Ops() const { return ARMArchVersion >= V7A; } 94a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 956d7d2aa38a247426e2ccf53e3c6ad0315c9a4d8cAnton Korobeynikov bool hasVFP2() const { return ARMFPUType >= VFPv2; } 966d7d2aa38a247426e2ccf53e3c6ad0315c9a4d8cAnton Korobeynikov bool hasVFP3() const { return ARMFPUType >= VFPv3; } 976d7d2aa38a247426e2ccf53e3c6ad0315c9a4d8cAnton Korobeynikov bool hasNEON() const { return ARMFPUType >= NEON; } 9841a024385f1220eadc48b48cb4c044a5fbc1b361Anton Korobeynikov 991a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng bool isTargetDarwin() const { return TargetType == isDarwin; } 1001a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng bool isTargetELF() const { return TargetType == isELF; } 1011a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng 1023630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio bool isAPCS_ABI() const { return TargetABI == ARM_ABI_APCS; } 1033630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio bool isAAPCS_ABI() const { return TargetABI == ARM_ABI_AAPCS; } 1043630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio 105d4022c3fbb0705abdc8eddc3ee4a5059f5ef8094Anton Korobeynikov bool isThumb() const { return ThumbMode >= Thumb1; } 106d4022c3fbb0705abdc8eddc3ee4a5059f5ef8094Anton Korobeynikov bool isThumb2() const { return ThumbMode >= Thumb2; } 107a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 108a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool useThumbBacktraces() const { return UseThumbBacktraces; } 109a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool isR9Reserved() const { return IsR9Reserved; } 110a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 11141a024385f1220eadc48b48cb4c044a5fbc1b361Anton Korobeynikov const std::string & getCPUString() const { return CPUString; } 11241a024385f1220eadc48b48cb4c044a5fbc1b361Anton Korobeynikov 113a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// getStackAlignment - Returns the minimum alignment known to hold of the 114a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// stack frame on entry to the function and which must be maintained by every 115a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// function for this subtarget. 116a8e2989ece6dc46df59b0768184028257f913843Evan Cheng unsigned getStackAlignment() const { return stackAlignment; } 117a8e2989ece6dc46df59b0768184028257f913843Evan Cheng}; 118a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} // End llvm namespace 119a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 120a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#endif // ARMSUBTARGET_H 121