mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-12 06:41:13 +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:
parent
5e41d58ab9
commit
114198d15f
1 changed files with 34 additions and 35 deletions
|
@ -3969,16 +3969,36 @@ compile_numerically_equal_slow (scm_jit_state *j, uint16_t a, uint16_t b)
|
||||||
static void
|
static void
|
||||||
compile_less (scm_jit_state *j, uint16_t a, uint16_t b)
|
compile_less (scm_jit_state *j, uint16_t a, uint16_t b)
|
||||||
{
|
{
|
||||||
jit_reloc_t fast, k2, k3;
|
jit_reloc_t k;
|
||||||
jit_reloc_t k1;
|
|
||||||
uint32_t *target;
|
uint32_t *target;
|
||||||
enum scm_opcode op = fuse_conditional_branch (j, &target);
|
|
||||||
|
|
||||||
emit_sp_ref_scm (j, T0, a);
|
emit_sp_ref_scm (j, T0, a);
|
||||||
emit_sp_ref_scm (j, T1, b);
|
emit_sp_ref_scm (j, T1, b);
|
||||||
|
|
||||||
emit_andr (j, T2, T0, T1);
|
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_store_current_ip (j, T2);
|
||||||
emit_call_2 (j, scm_vm_intrinsics.less_p,
|
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));
|
jit_operand_gpr (JIT_OPERAND_ABI_POINTER, T1));
|
||||||
emit_retval (j, T0);
|
emit_retval (j, T0);
|
||||||
emit_reload_sp (j);
|
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 (fuse_conditional_branch (j, &target))
|
||||||
switch (op)
|
|
||||||
{
|
{
|
||||||
case scm_op_jl:
|
case scm_op_jl:
|
||||||
case scm_op_jnge:
|
k = jit_beqi (j->jit, T0, SCM_F_COMPARE_LESS_THAN);
|
||||||
k3 = jit_bltr (j->jit, T0, T1);
|
|
||||||
break;
|
break;
|
||||||
case scm_op_jnl:
|
case scm_op_jnl:
|
||||||
|
k = jit_bnei (j->jit, T0, SCM_F_COMPARE_LESS_THAN);
|
||||||
|
break;
|
||||||
case scm_op_jge:
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE ();
|
UNREACHABLE ();
|
||||||
}
|
}
|
||||||
|
|
||||||
jit_patch_here (j->jit, k2);
|
add_inter_instruction_patch (j, k, target);
|
||||||
|
continue_after_slow_path (j, j->next_ip);
|
||||||
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)
|
|
||||||
{
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue