diff --git a/doc/status.html b/doc/status.html
index c5564d58..ba62625e 100644
--- a/doc/status.html
+++ b/doc/status.html
@@ -65,10 +65,13 @@ This is a list of the things you should know about the LuaJIT 2.0 beta test:
-
-The JIT compiler can only generate code for CPUs with SSE2 at the
-moment. I.e. you need at least a P4, Core 2/i5/i7 or K8/K10 to use it. I
-plan to fix this during the beta phase and add support for emitting x87
-instructions to the backend.
+The JIT compiler only generates code for CPUs with support for
+SSE2 instructions. I.e. you need at least a P4, Core 2/i5/i7
+or K8/K10 to get the full benefit.
+If you run LuaJIT on older CPUs without SSE2 support, the JIT compiler
+is disabled and the VM falls back to the interpreter.
+Run the command line executable without arguments to show the current status
+(JIT: ON or JIT: OFF).
-
Obviously there will be many bugs in a VM which has been
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. */