From 75d97185c949b47f71512eb99e8ca66496c885e8 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 17 Apr 2013 15:28:28 -0600 Subject: [PATCH] ARM JIT: use static configuration The output of "/proc/cpuinfo" seems wrong for a Raspberry Pi running the latest Raspian, because it claims ARMv6-compatible but also claims "thumb" as a feature and 7 as the CPU architecture. Use the C compiler's configuraton, instead, which is relatively straightforward and drops code that will turn out to be dead. --- src/racket/src/lightning/arm/asm-common.h | 3 + src/racket/src/lightning/arm/asm.h | 78 ++++++++++++++++++++-- src/racket/src/lightning/arm/core-common.h | 4 +- src/racket/src/lightning/arm/core.h | 6 -- src/racket/src/lightning/arm/funcs.h | 18 +++-- 5 files changed, 91 insertions(+), 18 deletions(-) diff --git a/src/racket/src/lightning/arm/asm-common.h b/src/racket/src/lightning/arm/asm-common.h index 63da549e28..bd82dda764 100644 --- a/src/racket/src/lightning/arm/asm-common.h +++ b/src/racket/src/lightning/arm/asm-common.h @@ -65,6 +65,7 @@ struct jit_local_state { jit_insn *thumb; }; +#ifdef JIT_ARM_DYNAMIC_CPU struct { _ui version : 4; _ui extend : 1; @@ -74,6 +75,8 @@ struct { _ui neon : 1; _ui abi : 2; } jit_cpu; +#endif + struct { /* prevent using thumb instructions that set flags? */ _ui no_set_flags : 1; diff --git a/src/racket/src/lightning/arm/asm.h b/src/racket/src/lightning/arm/asm.h index 2c3692598c..8f36e1de47 100644 --- a/src/racket/src/lightning/arm/asm.h +++ b/src/racket/src/lightning/arm/asm.h @@ -103,9 +103,79 @@ typedef enum { /* match vfpv3 result */ #define NAN_TO_INT_IS_ZERO 1 -#define jit_thumb_p() jit_cpu.thumb -#define jit_armv6_p() (jit_cpu.version >= 6) -#define jit_advsimd_p() ((jit_cpu.version >= 7) && jit_thumb_p()) +#if defined(__ARM_ARCH_4__) +# define JIT_ARM_VERSION 4 +#elif defined(__ARM_ARCH_4T__) +# define JIT_ARM_THUMB 1 +# define JIT_ARM_VERSION 4 +#elif (defined(__ARM_ARCH_5T__) || defined(__ARM_ARCH_5__)) +# define JIT_ARM_THUMB 1 +# define JIT_ARM_VERSION 5 +#elif (defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__)) +# define JIT_ARM_THUMB 1 +# define JIT_ARM_VERSION 5 +# define JIT_ARM_EXTENDED 1 +#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6K__) +# define JIT_ARM_VERSION 6 +#elif defined(__ARM_ARCH_6T__) || defined(__ARM_ARCH_6T2__) +# define JIT_ARM_THUMB 2 +# define JIT_ARM_VERSION 6 +#elif (defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7__)) +# define JIT_ARM_THUMB 2 +# define JIT_ARM_VERSION 7 +# if defined(__ARM_ARCH_7R__) +# define JIT_ARM_REALTIME 1 +# endif +#else +# define JIT_ARM_VERSION 4 +#endif + +#if defined(__ARM_PCS_VFP) || defined(__VFP_FP__) +# define JIT_ARM_VFP 1 +#endif + +#if defined(__ARM_NEON__) +# define JIT_ARM_NEON 1 +#endif + +#ifndef JIT_ARM_THUMB +# define JIT_ARM_THUMB 0 +#endif + +#ifndef JIT_ARM_NEON +# define JIT_ARM_NEON 0 +#endif + +#ifndef JIT_ARM_EXTENDED +# define JIT_ARM_EXTENDED 0 +#endif + +#ifndef JIT_ARM_REALTIME +# define JIT_ARM_REALTIME 0 +#endif + +#ifndef JIT_ARM_VFP +# define JIT_ARM_VFP 0 +#endif + +/* For now, thumb doesn't work with software float: */ +#if JIT_ARM_THUMB && !JIT_ARM_VFP +# undef JIT_ARM_THUMB +# define JIT_ARM_THUMB 0 +#endif + +# define jit_thumb_p() JIT_ARM_THUMB +# define jit_neon_p() JIT_ARM_NEON +# define jit_hardfp_p() JIT_ARM_VFP +# define jit_swf_p() !JIT_ARM_VFP + +#define jit_armv5_p() (JIT_ARM_VERSION >= 5) +#define jit_armv5e_p() ((JIT_ARM_VERSION > 5) || JIT_ARM_EXTENDED) +#define jit_armv6_p() (JIT_ARM_VERSION >= 6) +#define jit_armv6t_p() ((JIT_ARM_VERSION >= 6) && jit_thumb_p()) +#define jit_armv7r_p() ((JIT_ARM_VERSION >= 7) && JIT_ARM_REALTIME) + + typedef union _jit_thumb_t { int i; short s[2]; @@ -520,7 +590,7 @@ encode_vfp_double(int mov, int inv, unsigned lo, unsigned hi) { int code, mode, imm, mask; - if (!jit_advsimd_p()) return -1; + if (!jit_neon_p()) return -1; if (hi != lo) { if (mov && !inv) { diff --git a/src/racket/src/lightning/arm/core-common.h b/src/racket/src/lightning/arm/core-common.h index cfa89aba63..520ee1c310 100644 --- a/src/racket/src/lightning/arm/core-common.h +++ b/src/racket/src/lightning/arm/core-common.h @@ -40,8 +40,8 @@ #define jit_get_label() jit_get_ip() #define jit_forward() jit_get_ip() -#define jit_adjust_ip(x) ((jit_insn *)(((char *)(x)) + jit_cpu.thumb)) -#define jit_unadjust_ip(x) ((jit_insn *)(((char *)(x)) - jit_cpu.thumb)) +#define jit_adjust_ip(x) ((jit_insn *)(((char *)(x)) + (jit_thumb_p() ? 1 : 0))) +#define jit_unadjust_ip(x) ((jit_insn *)(((char *)(x)) - (jit_thumb_p() ? 1 : 0))) #define jit_field(struc, f) ( ((long) (&((struc *) 8)->f) ) - 8) #define jit_ptr_field(struc_p, f) ( ((long) (&((struc_p) 8)->f) ) - 8) diff --git a/src/racket/src/lightning/arm/core.h b/src/racket/src/lightning/arm/core.h index 4933a5664f..ed02fb0c55 100644 --- a/src/racket/src/lightning/arm/core.h +++ b/src/racket/src/lightning/arm/core.h @@ -52,12 +52,6 @@ jit_v_order[JIT_V_NUM] = { #define JIT_V2 _R6 #define jit_no_set_flags() jit_flags.no_set_flags -#define jit_armv5_p() (jit_cpu.version >= 5) -#define jit_armv5e_p() (jit_cpu.version >= 5 && jit_cpu.extend) -#define jit_armv7r_p() 0 -#define jit_armv6t_p() ((jit_cpu.version >= 6) && (jit_cpu.thumb)) -#define jit_swf_p() (jit_cpu.vfp == 0) -#define jit_hardfp_p() jit_cpu.abi extern int __aeabi_idivmod(int, int); extern unsigned __aeabi_uidivmod(unsigned, unsigned); diff --git a/src/racket/src/lightning/arm/funcs.h b/src/racket/src/lightning/arm/funcs.h index b2b154e684..cd079d0e50 100644 --- a/src/racket/src/lightning/arm/funcs.h +++ b/src/racket/src/lightning/arm/funcs.h @@ -67,6 +67,11 @@ jit_flush_code(void *start, void *end) __jit_constructor __jit_inline void jit_get_cpu(void) { +#ifdef JIT_ARM_DYNAMIC_CPU + /* Dynamic tests may not be reliable ("/proc/cpuinfo" seems to give bad info + on Raspbian as of April 2013), and a static configuration has the advatange + of generating a more compact JIT. Some variant of this code may make sense + in the future, though. */ static int initialized; if (initialized) @@ -74,7 +79,7 @@ jit_get_cpu(void) initialized = 1; -#if defined(__linux__) +# if defined(__linux__) { FILE *fp; char *ptr; @@ -110,18 +115,18 @@ jit_get_cpu(void) } fclose(fp); } -#endif -#if defined(__ARM_PCS_VFP) +# endif +# if defined(__ARM_PCS_VFP) if (!jit_cpu.vfp) jit_cpu.vfp = 3; if (!jit_cpu.version) jit_cpu.version = 7; jit_cpu.abi = 1; -#endif -#ifdef __VFP_FP__ +# endif +# ifdef __VFP_FP__ if (!jit_cpu.vfp) jit_cpu.vfp = 1; -#endif +# endif /* armv6t2 todo (software float and thumb2) */ if (!jit_cpu.vfp && jit_cpu.thumb) jit_cpu.thumb = 0; @@ -131,6 +136,7 @@ jit_get_cpu(void) whether or not a VFP ABI is in use (since we avoid passing floating-point arguments or receiving floating-point results in that mode). */ +#endif } #endif /* __lightning_funcs_h */