b772b77c5e94790d7393e8e680baa03886323c05
[picodrive.git] / pico / arm_features.h
1 #ifndef __ARM_FEATURES_H__
2 #define __ARM_FEATURES_H__
3
4 #if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \
5  || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \
6  || defined(__ARM_ARCH_7EM__)
7
8 #define HAVE_ARMV7
9 #define HAVE_ARMV6
10 #define HAVE_ARMV5
11
12 #elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \
13    || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \
14    || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__)
15
16 #define HAVE_ARMV6
17 #define HAVE_ARMV5
18
19 #elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5E__) \
20    || defined(__ARM_ARCH_5T__) || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__)
21
22 #define HAVE_ARMV5
23
24 #endif
25
26 /* no need for HAVE_NEON - GCC defines __ARM_NEON__ consistently */
27
28 /* global function/external symbol */
29 #ifndef __MACH__
30 #define ESYM(name) name
31
32 #define FUNCTION(name) \
33   .globl name; \
34   .type name, %function; \
35   name
36
37 #define EXTRA_UNSAVED_REGS
38
39 #else
40 #define ESYM(name) _##name
41
42 #define FUNCTION(name) \
43   .globl ESYM(name); \
44   name: \
45   ESYM(name)
46
47 // r7 is preserved, but add it for EABI alignment..
48 #define EXTRA_UNSAVED_REGS r7, r9,
49
50 #endif
51
52 // indexed branch (XB) via branch table (BT)
53 #ifdef __PIC__
54 #define PIC_XB(c,r,s)   add##c  pc, r, s
55 #define PIC_BT(a)       b       a
56 #else
57 #define PIC_XB(c,r,s)   ldr##c  pc, [pc, r, s]
58 #define PIC_BT(a)       .word   a
59 #endif
60
61 // load data address (LDR) either via literal pool or via GOT
62 #ifdef __PIC__
63 // can't use pool loads since ldr= only allows a symbol or a constant expr :-(
64 #define PIC_LDR_INIT() \
65   .macro pic_ldr        r t a; \
66         ldr     \r, [pc, $.LD\@-.-8]; \
67         ldr     \t, [pc, $.LD\@-.-4]; \
68   .LP\@:add     \r, pc; \
69         ldr     \r, [\r, \t]; \
70         add     pc, $4; \
71   .LD\@:.word   _GLOBAL_OFFSET_TABLE_-.LP\@-8; \
72         .word   \a(GOT); \
73   .endm;
74 #define PIC_LDR(r,t,a)  pic_ldr r, t, a
75 #else
76 #define PIC_LDR_INIT()
77 #define PIC_LDR(r,t,a)  ldr     r, =a
78 #endif
79
80 #endif /* __ARM_FEATURES_H__ */