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:
parent
bd1ac6d77e
commit
75d97185c9
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue
Block a user