From ae3179926af3deca671437c978375b39df6350e1 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Thu, 26 May 2011 17:58:29 +0200 Subject: [PATCH] ARM: Add CPU detection. --- src/lib_jit.c | 26 +++++++++++++++++++++++++- src/lj_def.h | 2 +- src/lj_jit.h | 8 ++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/lib_jit.c b/src/lib_jit.c index 259a03e1..6e16d45b 100644 --- a/src/lib_jit.c +++ b/src/lib_jit.c @@ -520,6 +520,10 @@ JIT_PARAMDEF(JIT_PARAMINIT) }; #endif +#if LJ_TARGET_ARM && LJ_TARGET_LINUX +#include +#endif + /* Arch-dependent CPU detection. */ static uint32_t jit_cpudetect(lua_State *L) { @@ -563,7 +567,27 @@ static uint32_t jit_cpudetect(lua_State *L) #endif #endif #elif LJ_TARGET_ARM - /* NYI */ + /* Compile-time ARM CPU detection. */ +#if __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ + flags |= JIT_F_ARMV6|JIT_F_ARMV6T2|JIT_F_ARMV7; +#elif __ARM_ARCH_6T2__ + flags |= JIT_F_ARMV6|JIT_F_ARMV6T2; +#elif __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6Z__ || __ARM_ARCH_6ZK__ + flags |= JIT_F_ARMV6; +#endif + /* Runtime ARM CPU detection. */ +#if LJ_TARGET_LINUX + if (!(flags & JIT_F_ARMV7)) { + struct utsname ut; + uname(&ut); + if (strncmp(ut.machine, "armv", 4) == 0) { + if (ut.machine[4] >= '7') + flags |= JIT_F_ARMV6|JIT_F_ARMV6T2|JIT_F_ARMV7; + else if (ut.machine[4] == '6') + flags |= JIT_F_ARMV6; + } + } +#endif #elif LJ_TARGET_PPC /* Nothing to do. */ #else diff --git a/src/lj_def.h b/src/lj_def.h index 86f041a4..197df291 100644 --- a/src/lj_def.h +++ b/src/lj_def.h @@ -136,7 +136,7 @@ static LJ_AINLINE uint32_t lj_bswap(uint32_t x) { uint32_t r; #if __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6T2__ || __ARM_ARCH_6Z__ ||\ - __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ + __ARM_ARCH_6ZK__ || __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ __asm__("rev %0, %1" : "=r" (r) : "r" (x)); return r; #else diff --git a/src/lj_jit.h b/src/lj_jit.h index 63584355..ea2dd4ad 100644 --- a/src/lj_jit.h +++ b/src/lj_jit.h @@ -26,6 +26,14 @@ /* Names for the CPU-specific flags. Must match the order above. */ #define JIT_F_CPU_FIRST JIT_F_CMOV #define JIT_F_CPUSTRING "\4CMOV\4SSE2\4SSE3\6SSE4.1\2P4\3AMD\2K8\4ATOM" +#elif LJ_TARGET_ARM +#define JIT_F_ARMV6 0x00000010 +#define JIT_F_ARMV6T2 0x00000020 +#define JIT_F_ARMV7 0x00000040 + +/* Names for the CPU-specific flags. Must match the order above. */ +#define JIT_F_CPU_FIRST JIT_F_ARMV6 +#define JIT_F_CPUSTRING "\5ARMv6\7ARMv6T2\5ARMv7" #else #define JIT_F_CPU_FIRST 0 #define JIT_F_CPUSTRING ""