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