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;
};
#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;

View File

@ -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) {

View File

@ -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)

View File

@ -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);

View File

@ -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 */