aboutsummaryrefslogtreecommitdiff
path: root/src/vm_arm64.dasc
diff options
context:
space:
mode:
authorMike Pall <mike>2016-11-24 18:56:19 +0100
committerMike Pall <mike>2016-11-24 18:56:19 +0100
commit81259898ea177bb7b4becebf3d7686603f6b373b (patch)
tree99510dd250c28d91fcc4c236380e646b3cd108d3 /src/vm_arm64.dasc
parent1131fa22a23c6284ba5945bffb3dcd6deef2076e (diff)
downloadluajit-81259898ea177bb7b4becebf3d7686603f6b373b.tar.gz
luajit-81259898ea177bb7b4becebf3d7686603f6b373b.tar.bz2
luajit-81259898ea177bb7b4becebf3d7686603f6b373b.zip
ARM64: Emit more efficient trace exits.
Contributed by Djordje Kovacevic and Stefan Pejic from RT-RK.com.
Diffstat (limited to '')
-rw-r--r--src/vm_arm64.dasc31
1 files changed, 15 insertions, 16 deletions
diff --git a/src/vm_arm64.dasc b/src/vm_arm64.dasc
index a6227bf7..86c78fa5 100644
--- a/src/vm_arm64.dasc
+++ b/src/vm_arm64.dasc
@@ -1927,22 +1927,21 @@ static void build_subroutines(BuildCtx *ctx)
1927 | stp d30, d31, [sp, #30*8] 1927 | stp d30, d31, [sp, #30*8]
1928 | ldr CARG1, [sp, #64*8] // Load original value of lr. 1928 | ldr CARG1, [sp, #64*8] // Load original value of lr.
1929 | add CARG3, sp, #64*8 // Recompute original value of sp. 1929 | add CARG3, sp, #64*8 // Recompute original value of sp.
1930 | mv_vmstate CARG4, EXIT 1930 | mv_vmstate CARG4, EXIT
1931 | ldr CARG2w, [CARG1, #-4]! // Get exit instruction. 1931 | stp xzr, CARG3, [sp, #62*8] // Store 0/sp in RID_LR/RID_SP.
1932 | stp CARG1, CARG3, [sp, #62*8] // Store exit pc/sp in RID_LR/RID_SP. 1932 | sub CARG1, CARG1, lr
1933 | lsl CARG2, CARG2, #38 1933 | ldr L, GL->cur_L
1934 | add CARG1, CARG1, CARG2, asr #36 1934 | lsr CARG1, CARG1, #2
1935 | ldr CARG2w, [lr] // Load exit stub group offset. 1935 | ldr BASE, GL->jit_base
1936 | sub CARG1, CARG1, lr 1936 | sub CARG1, CARG1, #2
1937 | sub CARG1, CARG1, #4 1937 | ldr CARG2w, [lr] // Load trace number.
1938 | ldr L, GL->cur_L 1938 | st_vmstate CARG4
1939 | add CARG1, CARG2, CARG1, lsr #2 // Compute exit number. 1939 | str BASE, L->base
1940 | ldr BASE, GL->jit_base 1940 | ubfx CARG2w, CARG2w, #5, #16
1941 | st_vmstate CARG4 1941 | str CARG1w, [GL, #GL_J(exitno)]
1942 | str CARG1w, [GL, #GL_J(exitno)] 1942 | str CARG2w, [GL, #GL_J(parent)]
1943 | str BASE, L->base 1943 | str L, [GL, #GL_J(L)]
1944 | str L, [GL, #GL_J(L)] 1944 | str xzr, GL->jit_base
1945 | str xzr, GL->jit_base
1946 | add CARG1, GL, #GG_G2J 1945 | add CARG1, GL, #GG_G2J
1947 | mov CARG2, sp 1946 | mov CARG2, sp
1948 | bl extern lj_trace_exit // (jit_State *J, ExitState *ex) 1947 | bl extern lj_trace_exit // (jit_State *J, ExitState *ex)