1 #ifndef __ARM_FEATURES_H__
2 #define __ARM_FEATURES_H__
4 /* note: features only available since:
5 * __ARM_ARCH gcc 4.8/clang 3.2
6 * ARMv8 support gcc 4.8/clang 3.4
7 * ARM64 support gcc 4.8/clang 3.5
10 #if defined(__aarch64__)
12 #elif (defined(__ARM_ARCH) && __ARM_ARCH >= 8)
20 #elif (defined(__ARM_ARCH) && __ARM_ARCH >= 7) \
21 || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \
22 || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \
23 || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_7S__)
30 #elif (defined(__ARM_ARCH) && __ARM_ARCH >= 6) \
31 || defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \
32 || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \
33 || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \
34 || defined(__ARM_ARCH_6M__)
39 #define HAVE_PRE_ARMV7
41 #elif defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__)
45 #define HAVE_PRE_ARMV7
47 #elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__)
50 #define HAVE_PRE_ARMV7
52 #elif defined(__arm__)
54 #define HAVE_PRE_ARMV7
58 /* gcc defines __ARM_NEON__ consistently for 32bit, but apple clang defines it for 64bit also... */
59 #if defined(HAVE_ARMV7) && defined(__ARM_NEON__)
63 #if defined(__APPLE__) && defined(__aarch64__)
64 #define ASM_SEPARATOR %%
66 #define ASM_SEPARATOR ;
69 /* global function/external symbol */
71 #define ESYM(name) name
73 #define FUNCTION(name) \
75 .type name, %function; \
78 #define ESIZE(name_, size_) \
81 #define EOBJECT(name_) \
84 #define EXTRA_UNSAVED_REGS
87 #define ESYM(name) _##name
89 #define FUNCTION(name) \
91 .globl ESYM(name) ASM_SEPARATOR \
94 #define ESIZE(name_, size_)
95 #define EOBJECT(name_)
97 // r7 is preserved, but add it for EABI alignment..
98 #define EXTRA_UNSAVED_REGS r7, r9,
102 #if defined(__MACH__) || defined(__PIC__)
103 #define TEXRELS_FORBIDDEN
106 #endif /* __ARM_FEATURES_H__ */