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.
This commit is contained in:
Matthew Flatt 2013-04-17 15:28:28 -06:00
parent bd1ac6d77e
commit 75d97185c9
5 changed files with 91 additions and 18 deletions

View File

@ -65,6 +65,7 @@ struct jit_local_state {
jit_insn *thumb; jit_insn *thumb;
}; };
#ifdef JIT_ARM_DYNAMIC_CPU
struct { struct {
_ui version : 4; _ui version : 4;
_ui extend : 1; _ui extend : 1;
@ -74,6 +75,8 @@ struct {
_ui neon : 1; _ui neon : 1;
_ui abi : 2; _ui abi : 2;
} jit_cpu; } jit_cpu;
#endif
struct { struct {
/* prevent using thumb instructions that set flags? */ /* prevent using thumb instructions that set flags? */
_ui no_set_flags : 1; _ui no_set_flags : 1;

View File

@ -103,9 +103,79 @@ typedef enum {
/* match vfpv3 result */ /* match vfpv3 result */
#define NAN_TO_INT_IS_ZERO 1 #define NAN_TO_INT_IS_ZERO 1
#define jit_thumb_p() jit_cpu.thumb #if defined(__ARM_ARCH_4__)
#define jit_armv6_p() (jit_cpu.version >= 6) # define JIT_ARM_VERSION 4
#define jit_advsimd_p() ((jit_cpu.version >= 7) && jit_thumb_p()) #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 { typedef union _jit_thumb_t {
int i; int i;
short s[2]; short s[2];
@ -520,7 +590,7 @@ encode_vfp_double(int mov, int inv, unsigned lo, unsigned hi)
{ {
int code, mode, imm, mask; int code, mode, imm, mask;
if (!jit_advsimd_p()) return -1; if (!jit_neon_p()) return -1;
if (hi != lo) { if (hi != lo) {
if (mov && !inv) { if (mov && !inv) {

View File

@ -40,8 +40,8 @@
#define jit_get_label() jit_get_ip() #define jit_get_label() jit_get_ip()
#define jit_forward() jit_get_ip() #define jit_forward() jit_get_ip()
#define jit_adjust_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_cpu.thumb)) #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_field(struc, f) ( ((long) (&((struc *) 8)->f) ) - 8)
#define jit_ptr_field(struc_p, f) ( ((long) (&((struc_p) 8)->f) ) - 8) #define jit_ptr_field(struc_p, f) ( ((long) (&((struc_p) 8)->f) ) - 8)

View File

@ -52,12 +52,6 @@ jit_v_order[JIT_V_NUM] = {
#define JIT_V2 _R6 #define JIT_V2 _R6
#define jit_no_set_flags() jit_flags.no_set_flags #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 int __aeabi_idivmod(int, int);
extern unsigned __aeabi_uidivmod(unsigned, unsigned); extern unsigned __aeabi_uidivmod(unsigned, unsigned);

View File

@ -67,6 +67,11 @@ jit_flush_code(void *start, void *end)
__jit_constructor __jit_inline void __jit_constructor __jit_inline void
jit_get_cpu(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; static int initialized;
if (initialized) if (initialized)
@ -74,7 +79,7 @@ jit_get_cpu(void)
initialized = 1; initialized = 1;
#if defined(__linux__) # if defined(__linux__)
{ {
FILE *fp; FILE *fp;
char *ptr; char *ptr;
@ -110,18 +115,18 @@ jit_get_cpu(void)
} }
fclose(fp); fclose(fp);
} }
#endif # endif
#if defined(__ARM_PCS_VFP) # if defined(__ARM_PCS_VFP)
if (!jit_cpu.vfp) if (!jit_cpu.vfp)
jit_cpu.vfp = 3; jit_cpu.vfp = 3;
if (!jit_cpu.version) if (!jit_cpu.version)
jit_cpu.version = 7; jit_cpu.version = 7;
jit_cpu.abi = 1; jit_cpu.abi = 1;
#endif # endif
#ifdef __VFP_FP__ # ifdef __VFP_FP__
if (!jit_cpu.vfp) if (!jit_cpu.vfp)
jit_cpu.vfp = 1; jit_cpu.vfp = 1;
#endif # endif
/* armv6t2 todo (software float and thumb2) */ /* armv6t2 todo (software float and thumb2) */
if (!jit_cpu.vfp && jit_cpu.thumb) if (!jit_cpu.vfp && jit_cpu.thumb)
jit_cpu.thumb = 0; 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 whether or not a VFP ABI is in use (since we avoid passing
floating-point arguments or receiving floating-point results in floating-point arguments or receiving floating-point results in
that mode). */ that mode). */
#endif
} }
#endif /* __lightning_funcs_h */ #endif /* __lightning_funcs_h */