diff options
| author | Mike Pall <mike> | 2016-12-07 09:42:43 +0100 |
|---|---|---|
| committer | Mike Pall <mike> | 2016-12-07 09:42:43 +0100 |
| commit | 22511fbe2b284d722f3a7ea901f1ae54992c9c5e (patch) | |
| tree | b96aec8323cae653a6fe9a8afe81aa4894ca4e46 | |
| parent | 3ad2bbf58600f8ba2918b56b0a7ab305df19cfe5 (diff) | |
| download | luajit-22511fbe2b284d722f3a7ea901f1ae54992c9c5e.tar.gz luajit-22511fbe2b284d722f3a7ea901f1ae54992c9c5e.tar.bz2 luajit-22511fbe2b284d722f3a7ea901f1ae54992c9c5e.zip | |
ARM64: Fix pc-relative loads of consts. Cleanup branch codegen.
Thanks to Zhongwei Yao.
| -rw-r--r-- | src/lj_emit_arm64.h | 30 |
1 files changed, 13 insertions, 17 deletions
diff --git a/src/lj_emit_arm64.h b/src/lj_emit_arm64.h index 1eb14204..6686802b 100644 --- a/src/lj_emit_arm64.h +++ b/src/lj_emit_arm64.h | |||
| @@ -234,7 +234,7 @@ static void emit_loadk(ASMState *as, Reg rd, uint64_t u64, int is64) | |||
| 234 | #define glofs(as, k) \ | 234 | #define glofs(as, k) \ |
| 235 | ((intptr_t)((uintptr_t)(k) - (uintptr_t)&J2GG(as->J)->g)) | 235 | ((intptr_t)((uintptr_t)(k) - (uintptr_t)&J2GG(as->J)->g)) |
| 236 | #define mcpofs(as, k) \ | 236 | #define mcpofs(as, k) \ |
| 237 | ((intptr_t)((uintptr_t)(k) - (uintptr_t)as->mcp)) | 237 | ((intptr_t)((uintptr_t)(k) - (uintptr_t)(as->mcp - 1))) |
| 238 | #define checkmcpofs(as, k) \ | 238 | #define checkmcpofs(as, k) \ |
| 239 | ((((mcpofs(as, k)>>2) + 0x00040000) >> 19) == 0) | 239 | ((((mcpofs(as, k)>>2) + 0x00040000) >> 19) == 0) |
| 240 | 240 | ||
| @@ -305,39 +305,35 @@ typedef MCode *MCLabel; | |||
| 305 | 305 | ||
| 306 | static void emit_cond_branch(ASMState *as, A64CC cond, MCode *target) | 306 | static void emit_cond_branch(ASMState *as, A64CC cond, MCode *target) |
| 307 | { | 307 | { |
| 308 | MCode *p = as->mcp; | 308 | MCode *p = --as->mcp; |
| 309 | ptrdiff_t delta = target - (p - 1); | 309 | ptrdiff_t delta = target - p; |
| 310 | lua_assert(((delta + 0x40000) >> 19) == 0); | 310 | lua_assert(((delta + 0x40000) >> 19) == 0); |
| 311 | *--p = A64I_BCC | A64F_S19((uint32_t)delta & 0x7ffff) | cond; | 311 | *p = A64I_BCC | A64F_S19((uint32_t)delta & 0x7ffff) | cond; |
| 312 | as->mcp = p; | ||
| 313 | } | 312 | } |
| 314 | 313 | ||
| 315 | static void emit_branch(ASMState *as, A64Ins ai, MCode *target) | 314 | static void emit_branch(ASMState *as, A64Ins ai, MCode *target) |
| 316 | { | 315 | { |
| 317 | MCode *p = as->mcp; | 316 | MCode *p = --as->mcp; |
| 318 | ptrdiff_t delta = target - (p - 1); | 317 | ptrdiff_t delta = target - p; |
| 319 | lua_assert(((delta + 0x02000000) >> 26) == 0); | 318 | lua_assert(((delta + 0x02000000) >> 26) == 0); |
| 320 | *--p = ai | ((uint32_t)delta & 0x03ffffffu); | 319 | *p = ai | ((uint32_t)delta & 0x03ffffffu); |
| 321 | as->mcp = p; | ||
| 322 | } | 320 | } |
| 323 | 321 | ||
| 324 | static void emit_tnb(ASMState *as, A64Ins ai, Reg r, uint32_t bit, MCode *target) | 322 | static void emit_tnb(ASMState *as, A64Ins ai, Reg r, uint32_t bit, MCode *target) |
| 325 | { | 323 | { |
| 326 | MCode *p = as->mcp; | 324 | MCode *p = --as->mcp; |
| 327 | ptrdiff_t delta = target - (p - 1); | 325 | ptrdiff_t delta = target - p; |
| 328 | lua_assert(bit < 63 && ((delta + 0x2000) >> 14) == 0); | 326 | lua_assert(bit < 63 && ((delta + 0x2000) >> 14) == 0); |
| 329 | if (bit > 31) ai |= A64I_X; | 327 | if (bit > 31) ai |= A64I_X; |
| 330 | *--p = ai | A64F_BIT(bit & 31) | A64F_S14((uint32_t)delta & 0x3fffu) | r; | 328 | *p = ai | A64F_BIT(bit & 31) | A64F_S14((uint32_t)delta & 0x3fffu) | r; |
| 331 | as->mcp = p; | ||
| 332 | } | 329 | } |
| 333 | 330 | ||
| 334 | static void emit_cnb(ASMState *as, A64Ins ai, Reg r, MCode *target) | 331 | static void emit_cnb(ASMState *as, A64Ins ai, Reg r, MCode *target) |
| 335 | { | 332 | { |
| 336 | MCode *p = as->mcp; | 333 | MCode *p = --as->mcp; |
| 337 | ptrdiff_t delta = target - (p - 1); | 334 | ptrdiff_t delta = target - p; |
| 338 | lua_assert(((delta + 0x40000) >> 19) == 0); | 335 | lua_assert(((delta + 0x40000) >> 19) == 0); |
| 339 | *--p = ai | A64F_S19((uint32_t)delta & 0x7ffff) | r; | 336 | *p = ai | A64F_S19((uint32_t)delta & 0x7ffff) | r; |
| 340 | as->mcp = p; | ||
| 341 | } | 337 | } |
| 342 | 338 | ||
| 343 | #define emit_jmp(as, target) emit_branch(as, A64I_B, (target)) | 339 | #define emit_jmp(as, target) emit_branch(as, A64I_B, (target)) |
