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;
|
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;
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user