d4d62665 |
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 | |
9760505e |
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__ |
90b1c9db |
63 | // can't use pool loads since ldr= only allows a symbol or a constant expr :-( |
9760505e |
64 | #define PIC_LDR_INIT() \ |
9760505e |
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); \ |
90b1c9db |
73 | .endm; |
74 | #define PIC_LDR(r,t,a) pic_ldr r, t, a |
9760505e |
75 | #else |
76 | #define PIC_LDR_INIT() |
90b1c9db |
77 | #define PIC_LDR(r,t,a) ldr r, =a |
9760505e |
78 | #endif |
79 | |
d4d62665 |
80 | #endif /* __ARM_FEATURES_H__ */ |