MIPS: Support MIPS16 interlinking.

This commit is contained in:
Mike Pall 2016-06-08 10:24:00 +02:00
parent f5983437a6
commit 287a5347cf
5 changed files with 9 additions and 3 deletions

View 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>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 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 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> </ul>
<p> <p>
Here are some examples for targets with a different CPU than the host: Here are some examples for targets with a different CPU than the host:

View File

@ -214,7 +214,7 @@ local map_pri = {
map_cop0, map_cop1, false, map_cop1x, map_cop0, map_cop1, false, map_cop1x,
"beql|beqzlST0B", "bnel|bnezlST0B", "blezlSB", "bgtzlSB", "beql|beqzlST0B", "bnel|bnezlST0B", "blezlSB", "bgtzlSB",
false, false, false, false, false, false, false, false,
map_special2, false, false, map_special3, map_special2, "jalxJ", false, map_special3,
"lbTSO", "lhTSO", "lwlTSO", "lwTSO", "lbTSO", "lhTSO", "lwlTSO", "lwTSO",
"lbuTSO", "lhuTSO", "lwrTSO", false, "lbuTSO", "lhuTSO", "lwrTSO", false,
"sbTSO", "shTSO", "swlTSO", "swTSO", "sbTSO", "shTSO", "swlTSO", "swTSO",

View File

@ -721,8 +721,12 @@ static uint32_t jit_cpudetect(lua_State *L)
#if defined(__GNUC__) #if defined(__GNUC__)
if (!(flags & JIT_F_MIPSXXR2)) { if (!(flags & JIT_F_MIPSXXR2)) {
int x; 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. */ /* 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"); __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). */ if (x) flags |= JIT_F_MIPSXXR2; /* Either 0x80000000 (R2) or 0 (R1). */
} }
#endif #endif

View File

@ -157,7 +157,8 @@ static void emit_call(ASMState *as, void *target, int needcfa)
MCode *p = as->mcp; MCode *p = as->mcp;
*--p = MIPSI_NOP; *--p = MIPSI_NOP;
if ((((uintptr_t)target ^ (uintptr_t)p) >> 28) == 0) { 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. */ } else { /* Target out of range: need indirect call. */
*--p = MIPSI_JALR | MIPSF_S(RID_CFUNCADDR); *--p = MIPSI_JALR | MIPSF_S(RID_CFUNCADDR);
needcfa = 1; needcfa = 1;

View File

@ -239,6 +239,7 @@ typedef enum MIPSIns {
MIPSI_B = 0x10000000, MIPSI_B = 0x10000000,
MIPSI_J = 0x08000000, MIPSI_J = 0x08000000,
MIPSI_JAL = 0x0c000000, MIPSI_JAL = 0x0c000000,
MIPSI_JALX = 0x74000000,
MIPSI_JR = 0x00000008, MIPSI_JR = 0x00000008,
MIPSI_JALR = 0x0000f809, MIPSI_JALR = 0x0000f809,