summaryrefslogtreecommitdiff
path: root/libguile/jit.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2019-12-10 17:08:22 +0100
committerAndy Wingo <wingo@pobox.com>2019-12-10 17:08:22 +0100
commita3be0b1e2ddc6cd6b420a7c9fbe5ad84889e1145 (patch)
treef29a4caf406e46de4e1c445aef01804d00d98d2c /libguile/jit.c
parent9c329776df1d032e34e224035a357fbbf18149d2 (diff)
downloadguile-a3be0b1e2ddc6cd6b420a7c9fbe5ad84889e1145.tar.gz
Move handle-interrupts slow path out of line
* libguile/jit.c (compile_handle_interrupts) (compile_handle_interrupts_slow): Move slow path out of line.
Diffstat (limited to 'libguile/jit.c')
-rw-r--r--libguile/jit.c26
1 files changed, 9 insertions, 17 deletions
diff --git a/libguile/jit.c b/libguile/jit.c
index 1ed8f9233..f7cdf25f4 100644
--- a/libguile/jit.c
+++ b/libguile/jit.c
@@ -3624,29 +3624,21 @@ compile_ulogxor_slow (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
static void
compile_handle_interrupts (scm_jit_state *j)
{
- uint32_t saved_state = save_reloadable_register_state (j);
-
- /* This instruction invalidates SP_CACHE_GPR / SP_CACHE_FPR. */
-
- void *again = jit_address (j->jit);
-
jit_addi (j->jit, T0, THREAD, thread_offset_pending_asyncs);
jit_ldr_atomic (j->jit, T0, T0);
- jit_reloc_t none_pending = jit_beqi (j->jit, T0, SCM_UNPACK (SCM_EOL));
- jit_ldxi_i (j->jit, T0, THREAD, thread_offset_block_asyncs);
- jit_reloc_t blocked = jit_bnei (j->jit, T0, 0);
-
- emit_store_current_ip (j, T0);
- jit_jmpi_with_link (j->jit, handle_interrupts_trampoline);
- jit_jmpi (j->jit, again);
-
- jit_patch_here (j->jit, none_pending);
- jit_patch_here (j->jit, blocked);
- j->register_state = saved_state;
+ add_slow_path_patch (j, jit_bnei (j->jit, T0, SCM_UNPACK (SCM_EOL)));
}
static void
compile_handle_interrupts_slow (scm_jit_state *j)
{
+ jit_ldxi_i (j->jit, T0, THREAD, thread_offset_block_asyncs);
+ add_inter_instruction_patch (j,
+ jit_bnei (j->jit, T0, 0),
+ j->next_ip);
+
+ emit_store_current_ip (j, T0);
+ jit_jmpi_with_link (j->jit, handle_interrupts_trampoline);
+ continue_after_slow_path (j, j->ip);
}
static void