]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
MIPS: Support MIPS16 interlinking.
authorMike Pall <mike>
Wed, 8 Jun 2016 08:24:00 +0000 (10:24 +0200)
committerMike Pall <mike>
Wed, 8 Jun 2016 08:24:00 +0000 (10:24 +0200)
doc/install.html
src/jit/dis_mips.lua
src/lib_jit.c
src/lj_emit_mips.h
src/lj_target_mips.h

index 38c9a6bb690634df8f5114339290e5b442993902..bbc71c987b0ac4876fab23c41e565b96d4a36608 100644 (file)
@@ -386,7 +386,7 @@ important to compile with the proper CPU or architecture settings:
 <li>The best way to get consistent results is to specify the correct settings when building the toolchain yourself.</li>
 <li>For a pre-built, generic toolchain add <tt>-mcpu=...</tt> or <tt>-march=...</tt> and other necessary flags to <tt>TARGET_CFLAGS</tt>.</li>
 <li>For ARM it's important to have the correct <tt>-mfloat-abi=...</tt> setting, too. Otherwise LuaJIT may not run at the full performance of your target CPU.</li>
-<li>For MIPS it's important to select a supported ABI (o32 on MIPS32, n64 on MIPS64) and consistently compile your project either with hard-float or soft-float compiler settings. Do not use <tt>-mips16</tt>.</li>
+<li>For MIPS it's important to select a supported ABI (o32 on MIPS32, n64 on MIPS64) and consistently compile your project either with hard-float or soft-float compiler settings.</li>
 </ul>
 <p>
 Here are some examples for targets with a different CPU than the host:
index 19327d6fcf8c2b7d68b31107a9b42c841cb64a89..6776f0cb568f8b8da6c1cff975f97daf371a06ec 100644 (file)
@@ -214,7 +214,7 @@ local map_pri = {
   map_cop0,    map_cop1,       false,          map_cop1x,
   "beql|beqzlST0B",    "bnel|bnezlST0B",       "blezlSB",      "bgtzlSB",
   false,       false,          false,          false,
-  map_special2,        false,          false,          map_special3,
+  map_special2,        "jalxJ",        false,          map_special3,
   "lbTSO",     "lhTSO",        "lwlTSO",       "lwTSO",
   "lbuTSO",    "lhuTSO",       "lwrTSO",       false,
   "sbTSO",     "shTSO",        "swlTSO",       "swTSO",
index 1655f0c5db83244e7ee6b317887fc1948cf26e4b..592538bd8ff76a564dcf3973904bdbf485bcbccb 100644 (file)
@@ -721,8 +721,12 @@ static uint32_t jit_cpudetect(lua_State *L)
 #if defined(__GNUC__)
   if (!(flags & JIT_F_MIPSXXR2)) {
     int x;
+#ifdef __mips16
+    x = 0;  /* Runtime detection is difficult. Ensure optimal -march flags. */
+#else
     /* On MIPS32R1 rotr is treated as srl. rotr r2,r2,1 -> srl r2,r2,1. */
     __asm__("li $2, 1\n\t.long 0x00221042\n\tmove %0, $2" : "=r"(x) : : "$2");
+#endif
     if (x) flags |= JIT_F_MIPSXXR2;  /* Either 0x80000000 (R2) or 0 (R1). */
   }
 #endif
index 9df047710a819c3ea4180da9ce7c5a49ea5190b1..d35f830b4826728675fa594502c8a324a1739917 100644 (file)
@@ -157,7 +157,8 @@ static void emit_call(ASMState *as, void *target, int needcfa)
   MCode *p = as->mcp;
   *--p = MIPSI_NOP;
   if ((((uintptr_t)target ^ (uintptr_t)p) >> 28) == 0) {
-    *--p = MIPSI_JAL | (((uintptr_t)target >>2) & 0x03ffffffu);
+    *--p = (((uintptr_t)target & 1) ? MIPSI_JALX : MIPSI_JAL) |
+          (((uintptr_t)target >>2) & 0x03ffffffu);
   } else {  /* Target out of range: need indirect call. */
     *--p = MIPSI_JALR | MIPSF_S(RID_CFUNCADDR);
     needcfa = 1;
index ac72528d314591689062a5c5d575365c6d216ebc..6a7d4b50290212f328f3294c5093a5428936ec1a 100644 (file)
@@ -239,6 +239,7 @@ typedef enum MIPSIns {
   MIPSI_B = 0x10000000,
   MIPSI_J = 0x08000000,
   MIPSI_JAL = 0x0c000000,
+  MIPSI_JALX = 0x74000000,
   MIPSI_JR = 0x00000008,
   MIPSI_JALR = 0x0000f809,