bd76096afff3b9a5e93dd1937e54c259e791e980
[pcsx_rearmed.git] / include / arm_features.h
1 #ifndef __ARM_FEATURES_H__
2 #define __ARM_FEATURES_H__
3
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
8  */
9
10 #if defined(__aarch64__)
11
12 #elif (defined(__ARM_ARCH) && __ARM_ARCH >= 8)
13
14 #define HAVE_ARMV8
15 #define HAVE_ARMV7
16 #define HAVE_ARMV6
17 #define HAVE_ARMV5E
18 #define HAVE_ARMV5
19
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__)
24
25 #define HAVE_ARMV7
26 #define HAVE_ARMV6
27 #define HAVE_ARMV5E
28 #define HAVE_ARMV5
29
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__)
35
36 #define HAVE_ARMV6
37 #define HAVE_ARMV5E
38 #define HAVE_ARMV5
39 #define HAVE_PRE_ARMV7
40
41 #elif defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__)
42
43 #define HAVE_ARMV5E
44 #define HAVE_ARMV5
45 #define HAVE_PRE_ARMV7
46
47 #elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__)
48
49 #define HAVE_ARMV5
50 #define HAVE_PRE_ARMV7
51
52 #elif defined(__arm__)
53
54 #define HAVE_PRE_ARMV7
55
56 #endif
57
58 /* gcc defines __ARM_NEON__ consistently for 32bit, but apple clang defines it for 64bit also... */
59 #if defined(HAVE_ARMV7) && defined(__ARM_NEON__)
60 #define HAVE_NEON32
61 #endif
62
63 #if defined(__APPLE__) && defined(__aarch64__)
64 #define ASM_SEPARATOR %%
65 #else
66 #define ASM_SEPARATOR ;
67 #endif
68
69 /* global function/external symbol */
70 #ifndef __APPLE__
71 #define ESYM(name) name
72
73 #define FUNCTION(name) \
74   .globl name; \
75   .type name, %function; \
76   name
77
78 #define ESIZE(name_, size_) \
79   .size name_, size_
80
81 #define EOBJECT(name_) \
82   .type name_, %object
83
84 #define EXTRA_UNSAVED_REGS
85
86 #else
87 #define ESYM(name) _##name
88
89 #define FUNCTION(name) \
90   name: ASM_SEPARATOR \
91   .globl ESYM(name) ASM_SEPARATOR \
92   ESYM(name)
93
94 #define ESIZE(name_, size_)
95 #define EOBJECT(name_)
96
97 // r7 is preserved, but add it for EABI alignment..
98 #define EXTRA_UNSAVED_REGS r7, r9,
99
100 #endif
101
102 #if defined(__MACH__) || defined(__PIC__)
103 #define TEXRELS_FORBIDDEN
104 #endif
105
106 #endif /* __ARM_FEATURES_H__ */