From 8060f5b53145b977c04bddf414aa541cb73ec536 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Tue, 16 Feb 2010 23:39:24 +0100 Subject: Just disable JIT compiler for non-SSE2 CPUs instead of aborting. --- src/lib_jit.c | 20 +++++++++----------- src/lj_dispatch.c | 6 ++++-- src/lj_errmsg.h | 8 +++++++- 3 files changed, 20 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/lib_jit.c b/src/lib_jit.c index 0ee5ad0d..34e5bd34 100644 --- a/src/lib_jit.c +++ b/src/lib_jit.c @@ -49,12 +49,10 @@ static int setjitmode(lua_State *L, int mode) mode |= LUAJIT_MODE_FUNC; } if (luaJIT_setmode(L, idx, mode) != 1) { + if ((mode & LUAJIT_MODE_MASK) == LUAJIT_MODE_ENGINE) + lj_err_caller(L, LJ_ERR_NOJIT); err: -#if LJ_HASJIT lj_err_arg(L, 1, LJ_ERR_NOLFUNC); -#else - lj_err_caller(L, LJ_ERR_NOJIT); -#endif } return 0; } @@ -532,19 +530,15 @@ static uint32_t jit_cpudetect(lua_State *L) } #endif } - /* Check for required instruction set support on x86. */ + /* Check for required instruction set support on x86 (unnecessary on x64). */ #if LJ_TARGET_X86 #if !defined(LUAJIT_CPU_NOCMOV) if (!(flags & JIT_F_CMOV)) luaL_error(L, "Ancient CPU lacks CMOV support (recompile with -DLUAJIT_CPU_NOCMOV)"); #endif - if (!(flags & JIT_F_SSE2)) #if defined(LUAJIT_CPU_SSE2) + if (!(flags & JIT_F_SSE2)) luaL_error(L, "CPU does not support SSE2 (recompile without -DLUAJIT_CPU_SSE2)"); -#elif LJ_HASJIT - luaL_error(L, "Sorry, SSE2 CPU support required for this beta release"); -#else - (void)0; #endif #endif UNUSED(L); @@ -560,7 +554,11 @@ static void jit_init(lua_State *L) uint32_t flags = jit_cpudetect(L); #if LJ_HASJIT jit_State *J = L2J(L); - J->flags = flags | JIT_F_ON | JIT_F_OPT_DEFAULT; +#if LJ_TARGET_X86 + /* Silently turn off the JIT compiler on CPUs without SSE2. */ + if ((flags & JIT_F_SSE2)) +#endif + J->flags = flags | JIT_F_ON | JIT_F_OPT_DEFAULT; memcpy(J->param, jit_param_default, sizeof(J->param)); lj_dispatch_update(G(L)); #else diff --git a/src/lj_dispatch.c b/src/lj_dispatch.c index 4629fb7e..7b3ff80b 100644 --- a/src/lj_dispatch.c +++ b/src/lj_dispatch.c @@ -209,10 +209,12 @@ int luaJIT_setmode(lua_State *L, int idx, int mode) if ((mode & LUAJIT_MODE_FLUSH)) { lj_trace_flushall(L); } else { - if ((mode & LUAJIT_MODE_ON)) + if (!(mode & LUAJIT_MODE_ON)) + G2J(g)->flags &= ~(uint32_t)JIT_F_ON; + else if ((G2J(g)->flags & JIT_F_SSE2)) G2J(g)->flags |= (uint32_t)JIT_F_ON; else - G2J(g)->flags &= ~(uint32_t)JIT_F_ON; + return 0; /* Don't turn on JIT compiler without SSE2 support. */ lj_dispatch_update(g); } break; diff --git a/src/lj_errmsg.h b/src/lj_errmsg.h index 0a2d9dd7..4891b74e 100644 --- a/src/lj_errmsg.h +++ b/src/lj_errmsg.h @@ -100,7 +100,13 @@ ERRDEF(STRFMTR, "invalid format (repeated flags)") ERRDEF(STRFMTW, "invalid format (width or precision too long)") ERRDEF(STRGSRV, "invalid replacement value (a %s)") ERRDEF(BADMODN, "name conflict for module " LUA_QS) -ERRDEF(NOJIT, "JIT compiler permanently disabled") +#if LJ_HASJIT +ERRDEF(NOJIT, "JIT compiler disabled, CPU does not support SSE2") +#elif defined(LJ_ARCH_NOJIT) +ERRDEF(NOJIT, "no JIT compiler for this architecture (yet)") +#else +ERRDEF(NOJIT, "JIT compiler permanently disabled by build option") +#endif ERRDEF(JITOPT, "unknown or malformed optimization flag " LUA_QS) /* Lexer/parser errors. */ -- cgit v1.2.3-55-g6feb