1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-10 14:00:21 +02:00

Move less? slow path out of line

* libguile/jit.c (compile_less, compile_less_slow): Move slow path out
  of line.
This commit is contained in:
Andy Wingo 2019-12-10 23:03:19 +01:00
parent 5e41d58ab9
commit 114198d15f

View file

@ -3969,16 +3969,36 @@ compile_numerically_equal_slow (scm_jit_state *j, uint16_t a, uint16_t b)
static void
compile_less (scm_jit_state *j, uint16_t a, uint16_t b)
{
jit_reloc_t fast, k2, k3;
jit_reloc_t k1;
jit_reloc_t k;
uint32_t *target;
enum scm_opcode op = fuse_conditional_branch (j, &target);
emit_sp_ref_scm (j, T0, a);
emit_sp_ref_scm (j, T1, b);
emit_andr (j, T2, T0, T1);
fast = jit_bmsi (j->jit, T2, scm_tc2_int);
add_slow_path_patch (j, jit_bmci (j->jit, T2, scm_tc2_int));
switch (fuse_conditional_branch (j, &target))
{
case scm_op_jl:
case scm_op_jnge:
k = jit_bltr (j->jit, T0, T1);
break;
case scm_op_jnl:
case scm_op_jge:
k = jit_bger (j->jit, T0, T1);
break;
default:
UNREACHABLE ();
}
add_inter_instruction_patch (j, k, target);
}
static void
compile_less_slow (scm_jit_state *j, uint16_t a, uint16_t b)
{
jit_reloc_t k;
uint32_t *target;
emit_store_current_ip (j, T2);
emit_call_2 (j, scm_vm_intrinsics.less_p,
@ -3986,48 +4006,27 @@ compile_less (scm_jit_state *j, uint16_t a, uint16_t b)
jit_operand_gpr (JIT_OPERAND_ABI_POINTER, T1));
emit_retval (j, T0);
emit_reload_sp (j);
switch (op)
{
case scm_op_jl:
k1 = jit_beqi (j->jit, T0, SCM_F_COMPARE_LESS_THAN);
break;
case scm_op_jnl:
k1 = jit_bnei (j->jit, T0, SCM_F_COMPARE_LESS_THAN);
break;
case scm_op_jge:
k1 = jit_beqi (j->jit, T0, SCM_F_COMPARE_NONE);
break;
case scm_op_jnge:
k1 = jit_bnei (j->jit, T0, SCM_F_COMPARE_NONE);
break;
default:
UNREACHABLE ();
}
k2 = jit_jmp (j->jit);
jit_patch_here (j->jit, fast);
switch (op)
switch (fuse_conditional_branch (j, &target))
{
case scm_op_jl:
case scm_op_jnge:
k3 = jit_bltr (j->jit, T0, T1);
k = jit_beqi (j->jit, T0, SCM_F_COMPARE_LESS_THAN);
break;
case scm_op_jnl:
k = jit_bnei (j->jit, T0, SCM_F_COMPARE_LESS_THAN);
break;
case scm_op_jge:
k3 = jit_bger (j->jit, T0, T1);
k = jit_beqi (j->jit, T0, SCM_F_COMPARE_NONE);
break;
case scm_op_jnge:
k = jit_bnei (j->jit, T0, SCM_F_COMPARE_NONE);
break;
default:
UNREACHABLE ();
}
jit_patch_here (j->jit, k2);
add_inter_instruction_patch (j, k1, target);
add_inter_instruction_patch (j, k3, target);
}
static void
compile_less_slow (scm_jit_state *j, uint16_t a, uint16_t b)
{
add_inter_instruction_patch (j, k, target);
continue_after_slow_path (j, j->next_ip);
}
static void