Browse Source

Just disable JIT compiler for non-SSE2 CPUs instead of aborting.

Mike Pall 15 years ago
parent
commit
8060f5b531
4 changed files with 27 additions and 18 deletions
  1. 7 4
      doc/status.html
  2. 9 11
      src/lib_jit.c
  3. 4 2
      src/lj_dispatch.c
  4. 7 1
      src/lj_errmsg.h

+ 7 - 4
doc/status.html

@@ -65,10 +65,13 @@ This is a list of the things you should know about the LuaJIT 2.0 beta test:
 </p>
 <ul>
 <li>
-The JIT compiler can only generate code for CPUs with <b>SSE2</b> 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
+<b>SSE2</b> instructions. I.e. you need at least a P4, Core 2/i5/i7
+or K8/K10 to get the full benefit.<br>
+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 
+(<tt>JIT: ON</tt> or <tt>JIT: OFF</tt>).
 </li>
 <li>
 Obviously there will be many <b>bugs</b> in a VM which has been

+ 9 - 11
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

+ 4 - 2
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;

+ 7 - 1
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. */