diff options
author | Andy Wingo <wingo@pobox.com> | 2018-08-20 12:39:20 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2018-08-20 12:45:00 +0200 |
commit | 9c76a1ad423dea1f040d94b8ab84fb17fa2bccb7 (patch) | |
tree | 597d87cd260d8075d328de71824ee84f1dc09125 /libguile/jit.c | |
parent | d00150303d5af3155529ad1a8198983a8db92cb3 (diff) | |
download | guile-9c76a1ad423dea1f040d94b8ab84fb17fa2bccb7.tar.gz |
Fix frame popping in JIT
* libguile/jit.c (emit_entry_trampoline): Don't bother hackily trying to
save registers; the "jit_frame" call handles that.
(compile_return_values, compile_return_from_interrupt): Fix bug when
computing previous FP: no need to add frame_overhead_slots.
(emit_load_prev_fp_offset, emit_store_prev_fp_offset): Rename from
emit_load_prev_frame_size, emit_store_prev_frame_size.
(emit_push_frame): Adapt to emit_store_prev_frame_size. Don't
subtract off the frame_overhead_slots.
(scm_jit_enter_mcode): Comment out a printf for the time being.
Diffstat (limited to 'libguile/jit.c')
-rw-r--r-- | libguile/jit.c | 21 |
1 files changed, 7 insertions, 14 deletions
diff --git a/libguile/jit.c b/libguile/jit.c index 6bf7e1754..41b654b31 100644 --- a/libguile/jit.c +++ b/libguile/jit.c @@ -198,14 +198,14 @@ emit_store_vra (scm_jit_state *j, jit_gpr_t fp, jit_gpr_t t, const uint32_t *vra } static void -emit_load_prev_frame_size (scm_jit_state *j, jit_gpr_t dst, jit_gpr_t fp) +emit_load_prev_fp_offset (scm_jit_state *j, jit_gpr_t dst, jit_gpr_t fp) { jit_ldxi (dst, fp, frame_offset_prev); } static void -emit_store_prev_frame_size (scm_jit_state *j, jit_gpr_t fp, jit_gpr_t t, - uint32_t n) +emit_store_prev_fp_offset (scm_jit_state *j, jit_gpr_t fp, jit_gpr_t t, + uint32_t n) { jit_movi (t, n); jit_stxi (frame_offset_prev, fp, t); @@ -371,7 +371,7 @@ emit_push_frame (scm_jit_state *j, uint32_t proc_slot, uint32_t nlocals, emit_subtract_stack_slots (j, fp, old_fp, proc_slot); continuation = emit_store_mra (j, fp, T1); emit_store_vra (j, fp, T1, vra); - emit_store_prev_frame_size (j, fp, T1, proc_slot - frame_overhead_slots); + emit_store_prev_fp_offset (j, fp, T1, proc_slot); emit_store_fp (j, fp); emit_reset_frame (j, fp, nlocals); @@ -589,11 +589,6 @@ emit_entry_trampoline (scm_jit_state *j) jit_frame (entry_frame_size); thread = jit_arg (); ip = jit_arg (); - /* Ensure that callee-saved registers are used and thus saved by - lightning in the prolog. */ - jit_xorr (JIT_V0, JIT_V0, JIT_V0); - jit_xorr (JIT_V1, JIT_V1, JIT_V1); - jit_xorr (JIT_V2, JIT_V2, JIT_V2); /* Load our reserved registers: THREAD and SP. */ jit_getarg (THREAD, thread); emit_reload_sp (j); @@ -935,8 +930,7 @@ compile_return_values (scm_jit_state *j) emit_run_hook (j, T0, scm_vm_intrinsics.invoke_return_hook); emit_load_fp (j, old_fp); - emit_load_prev_frame_size (j, offset, old_fp); - jit_addi (offset, offset, frame_overhead_slots); + emit_load_prev_fp_offset (j, offset, old_fp); jit_lshi (offset, offset, 3); /* Multiply by sizeof (scm_vm_stack_element) */ jit_addr (new_fp, old_fp, offset); emit_store_fp (j, new_fp); @@ -2271,8 +2265,7 @@ compile_return_from_interrupt (scm_jit_state *j) emit_run_hook (j, T0, scm_vm_intrinsics.invoke_return_hook); emit_load_fp (j, old_fp); - emit_load_prev_frame_size (j, offset, old_fp); - jit_addi (offset, offset, frame_overhead_slots); + emit_load_prev_fp_offset (j, offset, old_fp); jit_lshi (offset, offset, 3); /* Multiply by sizeof (scm_vm_stack_element) */ jit_addr (new_fp, old_fp, offset); emit_store_fp (j, new_fp); @@ -3594,7 +3587,7 @@ scm_jit_compute_mcode (scm_thread *thread, struct scm_jit_function_data *data) void scm_jit_enter_mcode (scm_thread *thread, const uint8_t *mcode) { - fprintf (stderr, "entering mcode! %p\n", mcode); + // fprintf (stderr, "entering mcode! %p\n", mcode); enter_mcode (thread, mcode); } |