diff options
author | Mike Pall <mike> | 2016-11-29 19:30:40 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2016-11-29 19:30:40 +0100 |
commit | 3ad2bbf58600f8ba2918b56b0a7ab305df19cfe5 (patch) | |
tree | 28771b8efec0975a95831ebcac212f7955166191 /src/lj_emit_arm64.h | |
parent | 6538c8a18711a6eb009def36050acd5f02e42aec (diff) | |
download | luajit-3ad2bbf58600f8ba2918b56b0a7ab305df19cfe5.tar.gz luajit-3ad2bbf58600f8ba2918b56b0a7ab305df19cfe5.tar.bz2 luajit-3ad2bbf58600f8ba2918b56b0a7ab305df19cfe5.zip |
ARM64: Make use of tbz/tbnz and cbz/cbnz.
Contributed by Djordje Kovacevic and Stefan Pejic from RT-RK.com.
Diffstat (limited to 'src/lj_emit_arm64.h')
-rw-r--r-- | src/lj_emit_arm64.h | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/lj_emit_arm64.h b/src/lj_emit_arm64.h index 52e75559..1eb14204 100644 --- a/src/lj_emit_arm64.h +++ b/src/lj_emit_arm64.h | |||
@@ -321,6 +321,25 @@ static void emit_branch(ASMState *as, A64Ins ai, MCode *target) | |||
321 | as->mcp = p; | 321 | as->mcp = p; |
322 | } | 322 | } |
323 | 323 | ||
324 | static void emit_tnb(ASMState *as, A64Ins ai, Reg r, uint32_t bit, MCode *target) | ||
325 | { | ||
326 | MCode *p = as->mcp; | ||
327 | ptrdiff_t delta = target - (p - 1); | ||
328 | lua_assert(bit < 63 && ((delta + 0x2000) >> 14) == 0); | ||
329 | if (bit > 31) ai |= A64I_X; | ||
330 | *--p = ai | A64F_BIT(bit & 31) | A64F_S14((uint32_t)delta & 0x3fffu) | r; | ||
331 | as->mcp = p; | ||
332 | } | ||
333 | |||
334 | static void emit_cnb(ASMState *as, A64Ins ai, Reg r, MCode *target) | ||
335 | { | ||
336 | MCode *p = as->mcp; | ||
337 | ptrdiff_t delta = target - (p - 1); | ||
338 | lua_assert(((delta + 0x40000) >> 19) == 0); | ||
339 | *--p = ai | A64F_S19((uint32_t)delta & 0x7ffff) | r; | ||
340 | as->mcp = p; | ||
341 | } | ||
342 | |||
324 | #define emit_jmp(as, target) emit_branch(as, A64I_B, (target)) | 343 | #define emit_jmp(as, target) emit_branch(as, A64I_B, (target)) |
325 | 344 | ||
326 | static void emit_call(ASMState *as, void *target) | 345 | static void emit_call(ASMState *as, void *target) |