]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
ARM64: Fix code generation for S19 offsets.
authorMike Pall <mike>
Thu, 8 Dec 2016 04:53:36 +0000 (05:53 +0100)
committerMike Pall <mike>
Thu, 8 Dec 2016 04:53:36 +0000 (05:53 +0100)
Contributed by Zhongwei Yao.

src/lj_asm_arm64.h
src/lj_emit_arm64.h
src/lj_target_arm64.h

index d14f022413dc9b739f0a5f029c09b6c3de4da020..ab0de5cd9c022b24f97571f1a858484b69151437 100644 (file)
@@ -781,7 +781,7 @@ static void asm_href(ASMState *as, IRIns *ir, IROp merge)
     emit_lso(as, A64I_LDRx, scr, dest, offsetof(Node, key));
   }
 
-  *l_loop = A64I_BCC | A64F_S19((as->mcp-l_loop) & 0x0007ffffu) | CC_NE;
+  *l_loop = A64I_BCC | A64F_S19(as->mcp - l_loop) | CC_NE;
   if (!isk && irt_isaddr(kt)) {
     Reg type = ra_allock(as, (int32_t)irt_toitype(kt), allow);
     emit_dnm(as, A64I_ADDx | A64F_SH(A64SH_LSL, 47), tmp, key, type);
index e0f436898cb05f2fb23f123c8c99a2eb8ffa37cd..c7eb4d81dd35c1a85746f9ee15776caf22cdd8c9 100644 (file)
@@ -313,7 +313,7 @@ static void emit_cond_branch(ASMState *as, A64CC cond, MCode *target)
   MCode *p = --as->mcp;
   ptrdiff_t delta = target - p;
   lua_assert(((delta + 0x40000) >> 19) == 0);
-  *p = A64I_BCC | A64F_S19((uint32_t)delta & 0x7ffff) | cond;
+  *p = A64I_BCC | A64F_S19(delta) | cond;
 }
 
 static void emit_branch(ASMState *as, A64Ins ai, MCode *target)
@@ -338,7 +338,7 @@ static void emit_cnb(ASMState *as, A64Ins ai, Reg r, MCode *target)
   MCode *p = --as->mcp;
   ptrdiff_t delta = target - p;
   lua_assert(((delta + 0x40000) >> 19) == 0);
-  *p = ai | A64F_S19((uint32_t)delta & 0x7ffff) | r;
+  *p = ai | A64F_S19(delta) | r;
 }
 
 #define emit_jmp(as, target)   emit_branch(as, A64I_B, (target))
index e12100458529433602fa537e4ec95a05f62b3091..f77a58a05897790803cf8418a1183288ee07cb0d 100644 (file)
@@ -126,7 +126,7 @@ static LJ_AINLINE uint32_t *exitstub_trace_addr_(uint32_t *p, uint32_t exitno)
 #define A64F_U16(x)    ((x) << 5)
 #define A64F_U12(x)    ((x) << 10)
 #define A64F_S26(x)    (x)
-#define A64F_S19(x)    ((x) << 5)
+#define A64F_S19(x)    (((uint32_t)(x) & 0x7ffffu) << 5)
 #define A64F_S14(x)    ((x) << 5)
 #define A64F_S9(x)     ((x) << 12)
 #define A64F_BIT(x)    ((x) << 19)