mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-01 04:10:18 +02:00
Add support for comparisons against integer immediates
* libguile/vm-engine.c (s64-imm=?, u64-imm<?, imm-u64<?, s64-imm<?) (imm-s64<?): New instructions. * libguile/instructions.c (FOR_EACH_INSTRUCTION_WORD_TYPE): Add new X8_S12_Z12 word type used by the new S64/immediate instructions. A Z12 is a 12-bit signed integer immediate. * module/system/vm/assembler.scm: Export new instructions, and add X8_S12_Z12 support. Also, add missing shufflers for X8_S12_C12. * module/language/bytecode.scm (compute-instruction-arity): * module/system/vm/disassembler.scm (unpack-s12, disassembler): Add support for X8_S12_Z12. * module/language/cps/types.scm (define-predicate-inferrer/param): New helper. (u64-=, u64-<, s64-<): Remove type checkers; this procedure does not cause &type-check. (u64-imm=?, s64-imm=?, u64-imm<?, imm-u64<?, s64-imm<?, imm-s64<?): New type inferrers. * module/language/cps/type-fold.scm (define-unary-branch-folder*): New helper. (u64-imm=?, s64-imm=?, u64-imm<?, imm-u64<?, s64-imm<?, imm-s64<?): New branch folders. * module/language/cps/reify-primitives.scm (reify-primitives): Reify constants for new immediate branching primcalls if values out of range. * module/language/cps/effects-analysis.scm: Add support for new primcalls. * module/language/cps/compile-bytecode.scm (compile-function): Add support for new primcalls and instructions. Compile u64-imm-= to s64-imm=?.
This commit is contained in:
parent
4a0a930f1c
commit
294dbaad35
12 changed files with 225 additions and 19 deletions
|
@ -4100,11 +4100,77 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp,
|
|||
NEXT (1);
|
||||
}
|
||||
|
||||
VM_DEFINE_OP (218, unused_218, NULL, NOP)
|
||||
VM_DEFINE_OP (219, unused_219, NULL, NOP)
|
||||
VM_DEFINE_OP (220, unused_220, NULL, NOP)
|
||||
VM_DEFINE_OP (221, unused_221, NULL, NOP)
|
||||
VM_DEFINE_OP (222, unused_222, NULL, NOP)
|
||||
VM_DEFINE_OP (218, s64_imm_numerically_equal, "s64-imm=?", OP1 (X8_S12_Z12))
|
||||
{
|
||||
scm_t_uint16 a;
|
||||
scm_t_int64 x, y;
|
||||
|
||||
a = (op >> 8) & 0xfff;
|
||||
x = SP_REF_S64 (a);
|
||||
|
||||
y = ((scm_t_int32) op) >> 20; /* Sign extension. */
|
||||
|
||||
vp->compare_result = x == y ? SCM_F_COMPARE_EQUAL : SCM_F_COMPARE_NONE;
|
||||
|
||||
NEXT (1);
|
||||
}
|
||||
|
||||
VM_DEFINE_OP (219, u64_imm_less, "u64-imm<?", OP1 (X8_S12_C12))
|
||||
{
|
||||
scm_t_uint16 a;
|
||||
scm_t_uint64 x, y;
|
||||
|
||||
UNPACK_12_12 (op, a, y);
|
||||
x = SP_REF_U64 (a);
|
||||
|
||||
vp->compare_result = x < y ? SCM_F_COMPARE_LESS_THAN : SCM_F_COMPARE_NONE;
|
||||
|
||||
NEXT (1);
|
||||
}
|
||||
|
||||
VM_DEFINE_OP (220, imm_u64_less, "imm-u64<?", OP1 (X8_S12_C12))
|
||||
{
|
||||
scm_t_uint16 a;
|
||||
scm_t_uint64 x, y;
|
||||
|
||||
UNPACK_12_12 (op, a, x);
|
||||
y = SP_REF_U64 (a);
|
||||
|
||||
vp->compare_result = x < y ? SCM_F_COMPARE_LESS_THAN : SCM_F_COMPARE_NONE;
|
||||
|
||||
NEXT (1);
|
||||
}
|
||||
|
||||
VM_DEFINE_OP (221, s64_imm_less, "s64-imm<?", OP1 (X8_S12_Z12))
|
||||
{
|
||||
scm_t_uint16 a;
|
||||
scm_t_int64 x, y;
|
||||
|
||||
a = (op >> 8) & 0xfff;
|
||||
x = SP_REF_S64 (a);
|
||||
|
||||
y = ((scm_t_int32) op) >> 20; /* Sign extension. */
|
||||
|
||||
vp->compare_result = x < y ? SCM_F_COMPARE_LESS_THAN : SCM_F_COMPARE_NONE;
|
||||
|
||||
NEXT (1);
|
||||
}
|
||||
|
||||
VM_DEFINE_OP (222, imm_s64_less, "imm-s64<?", OP1 (X8_S12_Z12))
|
||||
{
|
||||
scm_t_uint16 a;
|
||||
scm_t_int64 x, y;
|
||||
|
||||
a = (op >> 8) & 0xfff;
|
||||
y = SP_REF_S64 (a);
|
||||
|
||||
x = ((scm_t_int32) op) >> 20; /* Sign extension. */
|
||||
|
||||
vp->compare_result = x < y ? SCM_F_COMPARE_LESS_THAN : SCM_F_COMPARE_NONE;
|
||||
|
||||
NEXT (1);
|
||||
}
|
||||
|
||||
VM_DEFINE_OP (223, unused_223, NULL, NOP)
|
||||
VM_DEFINE_OP (224, unused_224, NULL, NOP)
|
||||
VM_DEFINE_OP (225, unused_225, NULL, NOP)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue