arm_features.h 1.8 KB

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