mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-18 01:30:27 +02:00
Compile some generic arithmetic to intrinsic calls
* libguile/intrinsics.h: Rename intrinsic types added in previous commit. * libguile/vm-engine.c (call-scm<-scm-scm, call-scm<-scm-uimm): New instructions. * libguile/vm.c: Include intrinsics.h. * module/language/bytecode.scm * module/language/bytecode.scm (*intrinsic-codes*, *intrinsic-names*): New internal definitions. (intrinsic-name->index, intrinsic-index->name): New exported definitions. * module/system/vm/assembler.scm (encode-X8_S8_S8_S8-C32<-/shuffle): (encode-X8_S8_S8_C8-C32<-/shuffle): New shuffling encoders. (shuffling-encoder-name): Add case for new shuffling encoders. (define-scm<-scm-scm-intrinsic, define-scm<-scm-uimm-intrinsic): New helpers. Define encoders for "add", etc.
This commit is contained in:
parent
4d530a94bb
commit
1f6f282f16
5 changed files with 130 additions and 30 deletions
|
@ -23,22 +23,22 @@
|
|||
|
||||
#ifdef BUILDING_LIBGUILE
|
||||
|
||||
typedef SCM (*scm_t_binary_scm_intrinsic) (SCM, SCM);
|
||||
typedef SCM (*scm_t_binary_uimm_intrinsic) (SCM, scm_t_uint8);
|
||||
typedef SCM (*scm_t_scm_from_scm_scm_intrinsic) (SCM, SCM);
|
||||
typedef SCM (*scm_t_scm_from_scm_uimm_intrinsic) (SCM, scm_t_uint8);
|
||||
|
||||
#define SCM_FOR_ALL_VM_INTRINSICS(M) \
|
||||
M(binary_scm, add, "add", ADD) \
|
||||
M(binary_uimm, add_immediate, "add/immediate", ADD_IMMEDIATE) \
|
||||
M(binary_scm, sub, "sub", SUB) \
|
||||
M(binary_uimm, sub_immediate, "sub/immediate", SUB_IMMEDIATE) \
|
||||
M(binary_scm, mul, "mul", MUL) \
|
||||
M(binary_scm, div, "div", DIV) \
|
||||
M(binary_scm, quo, "quo", QUO) \
|
||||
M(binary_scm, rem, "rem", REM) \
|
||||
M(binary_scm, mod, "mod", MOD) \
|
||||
M(binary_scm, logand, "logand", LOGAND) \
|
||||
M(binary_scm, logior, "logior", LOGIOR) \
|
||||
M(binary_scm, logxor, "logxor", LOGXOR) \
|
||||
M(scm_from_scm_scm, add, "add", ADD) \
|
||||
M(scm_from_scm_uimm, add_immediate, "add/immediate", ADD_IMMEDIATE) \
|
||||
M(scm_from_scm_scm, sub, "sub", SUB) \
|
||||
M(scm_from_scm_uimm, sub_immediate, "sub/immediate", SUB_IMMEDIATE) \
|
||||
M(scm_from_scm_scm, mul, "mul", MUL) \
|
||||
M(scm_from_scm_scm, div, "div", DIV) \
|
||||
M(scm_from_scm_scm, quo, "quo", QUO) \
|
||||
M(scm_from_scm_scm, rem, "rem", REM) \
|
||||
M(scm_from_scm_scm, mod, "mod", MOD) \
|
||||
M(scm_from_scm_scm, logand, "logand", LOGAND) \
|
||||
M(scm_from_scm_scm, logior, "logior", LOGIOR) \
|
||||
M(scm_from_scm_scm, logxor, "logxor", LOGXOR) \
|
||||
/* Add new intrinsics here; also update scm_bootstrap_intrinsics. */
|
||||
|
||||
enum scm_vm_intrinsic
|
||||
|
|
|
@ -358,6 +358,8 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp,
|
|||
jump_table = jump_table_;
|
||||
#endif
|
||||
|
||||
void **intrinsics = (void**) &scm_vm_intrinsics;
|
||||
|
||||
/* Load VM registers. */
|
||||
CACHE_REGISTER ();
|
||||
|
||||
|
@ -1497,8 +1499,40 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp,
|
|||
NEXT (2);
|
||||
}
|
||||
|
||||
VM_DEFINE_OP (51, unused_51, NULL, NOP)
|
||||
VM_DEFINE_OP (52, unused_52, NULL, NOP)
|
||||
VM_DEFINE_OP (51, call_scm_from_scm_scm, "call-scm<-scm-scm", OP2 (X8_S8_S8_S8, C32) | OP_DST)
|
||||
{
|
||||
scm_t_uint8 dst, a, b;
|
||||
SCM res;
|
||||
scm_t_scm_from_scm_scm_intrinsic intrinsic;
|
||||
|
||||
UNPACK_8_8_8 (op, dst, a, b);
|
||||
intrinsic = intrinsics[ip[1]];
|
||||
|
||||
SYNC_IP ();
|
||||
res = intrinsic (SP_REF (a), SP_REF (b));
|
||||
CACHE_SP ();
|
||||
SP_SET (dst, res);
|
||||
|
||||
NEXT (2);
|
||||
}
|
||||
|
||||
VM_DEFINE_OP (52, call_scm_from_scm_uimm, "call-scm<-scm-uimm", OP2 (X8_S8_S8_C8, C32) | OP_DST)
|
||||
{
|
||||
scm_t_uint8 dst, a, b;
|
||||
SCM res;
|
||||
scm_t_scm_from_scm_uimm_intrinsic intrinsic;
|
||||
|
||||
UNPACK_8_8_8 (op, dst, a, b);
|
||||
intrinsic = intrinsics[ip[1]];
|
||||
|
||||
SYNC_IP ();
|
||||
res = intrinsic (SP_REF (a), b);
|
||||
CACHE_SP ();
|
||||
SP_SET (dst, res);
|
||||
|
||||
NEXT (2);
|
||||
}
|
||||
|
||||
VM_DEFINE_OP (53, unused_53, NULL, NOP)
|
||||
{
|
||||
vm_error_bad_instruction (op);
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
#include "libguile/frames.h"
|
||||
#include "libguile/gc-inline.h"
|
||||
#include "libguile/instructions.h"
|
||||
#include "libguile/intrinsics.h"
|
||||
#include "libguile/loader.h"
|
||||
#include "libguile/programs.h"
|
||||
#include "libguile/simpos.h"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue