diff options
author | Mike Pall <mike> | 2016-11-24 18:56:19 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2016-11-24 18:56:19 +0100 |
commit | 81259898ea177bb7b4becebf3d7686603f6b373b (patch) | |
tree | 99510dd250c28d91fcc4c236380e646b3cd108d3 /src/vm_arm64.dasc | |
parent | 1131fa22a23c6284ba5945bffb3dcd6deef2076e (diff) | |
download | luajit-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.dasc | 31 |
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) |