diff options
author | Mike Pall <mike> | 2016-12-08 05:53:36 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2016-12-08 05:53:36 +0100 |
commit | 986854cbb2fa08514e10d9d4d5ded2b7f5f60445 (patch) | |
tree | 8a66282ed63abd9e661b3dc7e3b123ef7e0fe3f2 | |
parent | 3975b6c9f4c59e2913e36f62a99653754fd33fe1 (diff) | |
download | luajit-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.h | 2 | ||||
-rw-r--r-- | src/lj_emit_arm64.h | 4 | ||||
-rw-r--r-- | src/lj_target_arm64.h | 2 |
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 | ||
319 | static void emit_branch(ASMState *as, A64Ins ai, MCode *target) | 319 | 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) | |||
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) |