ARM: Add CPU detection.

This commit is contained in:
Mike Pall 2011-05-26 17:58:29 +02:00
parent 185554b682
commit ae3179926a
3 changed files with 34 additions and 2 deletions

View File

@ -520,6 +520,10 @@ JIT_PARAMDEF(JIT_PARAMINIT)
}; };
#endif #endif
#if LJ_TARGET_ARM && LJ_TARGET_LINUX
#include <sys/utsname.h>
#endif
/* Arch-dependent CPU detection. */ /* Arch-dependent CPU detection. */
static uint32_t jit_cpudetect(lua_State *L) static uint32_t jit_cpudetect(lua_State *L)
{ {
@ -563,7 +567,27 @@ static uint32_t jit_cpudetect(lua_State *L)
#endif #endif
#endif #endif
#elif LJ_TARGET_ARM #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 #elif LJ_TARGET_PPC
/* Nothing to do. */ /* Nothing to do. */
#else #else

View File

@ -136,7 +136,7 @@ static LJ_AINLINE uint32_t lj_bswap(uint32_t x)
{ {
uint32_t r; uint32_t r;
#if __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6T2__ || __ARM_ARCH_6Z__ ||\ #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)); __asm__("rev %0, %1" : "=r" (r) : "r" (x));
return r; return r;
#else #else

View File

@ -26,6 +26,14 @@
/* Names for the CPU-specific flags. Must match the order above. */ /* Names for the CPU-specific flags. Must match the order above. */
#define JIT_F_CPU_FIRST JIT_F_CMOV #define JIT_F_CPU_FIRST JIT_F_CMOV
#define JIT_F_CPUSTRING "\4CMOV\4SSE2\4SSE3\6SSE4.1\2P4\3AMD\2K8\4ATOM" #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 #else
#define JIT_F_CPU_FIRST 0 #define JIT_F_CPU_FIRST 0
#define JIT_F_CPUSTRING "" #define JIT_F_CPUSTRING ""