aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2016-12-08 05:53:36 +0100
committerMike Pall <mike>2016-12-08 05:53:36 +0100
commit986854cbb2fa08514e10d9d4d5ded2b7f5f60445 (patch)
tree8a66282ed63abd9e661b3dc7e3b123ef7e0fe3f2
parent3975b6c9f4c59e2913e36f62a99653754fd33fe1 (diff)
downloadluajit-986854cbb2fa08514e10d9d4d5ded2b7f5f60445.tar.gz
luajit-986854cbb2fa08514e10d9d4d5ded2b7f5f60445.tar.bz2
luajit-986854cbb2fa08514e10d9d4d5ded2b7f5f60445.zip
ARM64: Fix code generation for S19 offsets.
Contributed by Zhongwei Yao.
-rw-r--r--src/lj_asm_arm64.h2
-rw-r--r--src/lj_emit_arm64.h4
-rw-r--r--src/lj_target_arm64.h2
3 files changed, 4 insertions, 4 deletions
diff --git a/src/lj_asm_arm64.h b/src/lj_asm_arm64.h
index d14f0224..ab0de5cd 100644
--- a/src/lj_asm_arm64.h
+++ b/src/lj_asm_arm64.h
@@ -781,7 +781,7 @@ static void asm_href(ASMState *as, IRIns *ir, IROp merge)
781 emit_lso(as, A64I_LDRx, scr, dest, offsetof(Node, key)); 781 emit_lso(as, A64I_LDRx, scr, dest, offsetof(Node, key));
782 } 782 }
783 783
784 *l_loop = A64I_BCC | A64F_S19((as->mcp-l_loop) & 0x0007ffffu) | CC_NE; 784 *l_loop = A64I_BCC | A64F_S19(as->mcp - l_loop) | CC_NE;
785 if (!isk && irt_isaddr(kt)) { 785 if (!isk && irt_isaddr(kt)) {
786 Reg type = ra_allock(as, (int32_t)irt_toitype(kt), allow); 786 Reg type = ra_allock(as, (int32_t)irt_toitype(kt), allow);
787 emit_dnm(as, A64I_ADDx | A64F_SH(A64SH_LSL, 47), tmp, key, type); 787 emit_dnm(as, A64I_ADDx | A64F_SH(A64SH_LSL, 47), tmp, key, type);
diff --git a/src/lj_emit_arm64.h b/src/lj_emit_arm64.h
index e0f43689..c7eb4d81 100644
--- a/src/lj_emit_arm64.h
+++ b/src/lj_emit_arm64.h
@@ -313,7 +313,7 @@ static void emit_cond_branch(ASMState *as, A64CC cond, MCode *target)
313 MCode *p = --as->mcp; 313 MCode *p = --as->mcp;
314 ptrdiff_t delta = target - p; 314 ptrdiff_t delta = target - p;
315 lua_assert(((delta + 0x40000) >> 19) == 0); 315 lua_assert(((delta + 0x40000) >> 19) == 0);
316 *p = A64I_BCC | A64F_S19((uint32_t)delta & 0x7ffff) | cond; 316 *p = A64I_BCC | A64F_S19(delta) | cond;
317} 317}
318 318
319static void emit_branch(ASMState *as, A64Ins ai, MCode *target) 319static 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)
338 MCode *p = --as->mcp; 338 MCode *p = --as->mcp;
339 ptrdiff_t delta = target - p; 339 ptrdiff_t delta = target - p;
340 lua_assert(((delta + 0x40000) >> 19) == 0); 340 lua_assert(((delta + 0x40000) >> 19) == 0);
341 *p = ai | A64F_S19((uint32_t)delta & 0x7ffff) | r; 341 *p = ai | A64F_S19(delta) | r;
342} 342}
343 343
344#define emit_jmp(as, target) emit_branch(as, A64I_B, (target)) 344#define emit_jmp(as, target) emit_branch(as, A64I_B, (target))
diff --git a/src/lj_target_arm64.h b/src/lj_target_arm64.h
index e1210045..f77a58a0 100644
--- a/src/lj_target_arm64.h
+++ b/src/lj_target_arm64.h
@@ -126,7 +126,7 @@ static LJ_AINLINE uint32_t *exitstub_trace_addr_(uint32_t *p, uint32_t exitno)
126#define A64F_U16(x) ((x) << 5) 126#define A64F_U16(x) ((x) << 5)
127#define A64F_U12(x) ((x) << 10) 127#define A64F_U12(x) ((x) << 10)
128#define A64F_S26(x) (x) 128#define A64F_S26(x) (x)
129#define A64F_S19(x) ((x) << 5) 129#define A64F_S19(x) (((uint32_t)(x) & 0x7ffffu) << 5)
130#define A64F_S14(x) ((x) << 5) 130#define A64F_S14(x) ((x) << 5)
131#define A64F_S9(x) ((x) << 12) 131#define A64F_S9(x) ((x) << 12)
132#define A64F_BIT(x) ((x) << 19) 132#define A64F_BIT(x) ((x) << 19)