1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-18 17:50:29 +02:00

Fix JIT of 64-bit comparisons on 32-bit architectures

* libguile/jit.c (compile_u64_imm_less): Compare high word using
  not-equal, to avoid a signedness compare.
(compile_s64_imm_less, compile_imm_s64_less): Fix the not-less cases.
This commit is contained in:
Andy Wingo 2018-10-09 12:11:59 +02:00 committed by Andy Wingo
parent d41f2e9978
commit e08d10af67

View file

@ -3779,7 +3779,7 @@ compile_u64_imm_less (scm_jit_state *j, uint16_t a, uint16_t b)
add_inter_instruction_patch (j, k2, target); add_inter_instruction_patch (j, k2, target);
break; break;
case scm_op_jnl: case scm_op_jnl:
k1 = jit_bgti (T1, 0); k1 = jit_bnei (T1, 0);
k2 = jit_bgei_u (T0, b); k2 = jit_bgei_u (T0, b);
add_inter_instruction_patch (j, k1, target); add_inter_instruction_patch (j, k1, target);
add_inter_instruction_patch (j, k2, target); add_inter_instruction_patch (j, k2, target);
@ -3867,16 +3867,16 @@ compile_s64_imm_less (scm_jit_state *j, uint16_t a, int16_t b)
k1 = jit_blti (T1, sign); k1 = jit_blti (T1, sign);
k2 = jit_bnei (T1, sign); k2 = jit_bnei (T1, sign);
k3 = jit_blti (T0, b); k3 = jit_blti (T0, b);
jit_patch (k2);
add_inter_instruction_patch (j, k1, target); add_inter_instruction_patch (j, k1, target);
jit_patch (k2);
add_inter_instruction_patch (j, k3, target); add_inter_instruction_patch (j, k3, target);
break; break;
case scm_op_jnl: case scm_op_jnl:
k1 = jit_bgti (T1, sign); k1 = jit_blti (T1, sign);
k2 = jit_bnei (T1, sign); k2 = jit_bnei (T1, sign);
k3 = jit_bgei (T0, b); k3 = jit_bgei (T0, b);
jit_patch (k2); jit_patch (k1);
add_inter_instruction_patch (j, k1, target); add_inter_instruction_patch (j, k2, target);
add_inter_instruction_patch (j, k3, target); add_inter_instruction_patch (j, k3, target);
break; break;
default: default:
@ -3922,11 +3922,11 @@ compile_imm_s64_less (scm_jit_state *j, uint16_t a, int16_t b)
add_inter_instruction_patch (j, k3, target); add_inter_instruction_patch (j, k3, target);
break; break;
case scm_op_jnl: case scm_op_jnl:
k1 = jit_bgti (T1, sign); k1 = jit_blti (T1, sign);
k2 = jit_bnei (T1, sign); k2 = jit_bnei (T1, sign);
k3 = jit_blei (T0, b); k3 = jit_blei (T0, b);
jit_patch (k1); add_inter_instruction_patch (j, k1, target);
add_inter_instruction_patch (j, k2, target); jit_patch (k2);
add_inter_instruction_patch (j, k3, target); add_inter_instruction_patch (j, k3, target);
break; break;
default: default: