From 1f6f282f163598baacc89ec4d38342ff17c7092a Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Fri, 30 Mar 2018 22:11:18 +0200 Subject: 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. --- libguile/vm-engine.c | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) (limited to 'libguile/vm-engine.c') diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index 63f4b895e..c7407ef2f 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -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); -- cgit v1.2.3