summaryrefslogtreecommitdiff
path: root/src/lj_emit_arm64.h
diff options
context:
space:
mode:
authorMike Pall <mike>2016-11-29 19:30:40 +0100
committerMike Pall <mike>2016-11-29 19:30:40 +0100
commit3ad2bbf58600f8ba2918b56b0a7ab305df19cfe5 (patch)
tree28771b8efec0975a95831ebcac212f7955166191 /src/lj_emit_arm64.h
parent6538c8a18711a6eb009def36050acd5f02e42aec (diff)
downloadluajit-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.h19
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
324static 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
334static 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
326static void emit_call(ASMState *as, void *target) 345static void emit_call(ASMState *as, void *target)