summaryrefslogtreecommitdiff
path: root/libguile/vm-engine.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2018-04-29 10:09:01 +0200
committerAndy Wingo <wingo@pobox.com>2018-04-29 10:13:50 +0200
commit4779a10223078c89db4734857850df9af3d6830d (patch)
treed60e85e7c9f7e4f01eb684d1a9c33c48f57926b6 /libguile/vm-engine.c
parentc927ca7111aac50520728379521cbb98cafae1e9 (diff)
downloadguile-4779a10223078c89db4734857850df9af3d6830d.tar.gz
Add support for dynamic-state-related intrinsics
* libguile/vm-engine.c (call-thread, call-thread-scm-scm) (call-scm<-thread-scm): New intrinsics. * module/system/vm/assembler.scm (define-thread-scm-scm-intrinsic) (define-thread-intrinsic, define-scm<-thread-scm-intrinsic): New helpers. (encode-X8_S12_S12-C32!/shuffle): New shuffler. * libguile/intrinsics.h: Add new intrinsic types.
Diffstat (limited to 'libguile/vm-engine.c')
-rw-r--r--libguile/vm-engine.c49
1 files changed, 46 insertions, 3 deletions
diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c
index 256a2790c..19c263f2f 100644
--- a/libguile/vm-engine.c
+++ b/libguile/vm-engine.c
@@ -2255,9 +2255,52 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp,
NEXT (4);
}
- VM_DEFINE_OP (87, unused_87, NULL, NOP)
- VM_DEFINE_OP (88, unused_88, NULL, NOP)
- VM_DEFINE_OP (89, unused_89, NULL, NOP)
+ VM_DEFINE_OP (87, call_thread_scm_scm, "call-thread-scm-scm", OP2 (X8_S12_S12, C32))
+ {
+ scm_t_uint16 a, b;
+ scm_t_thread_scm_scm_intrinsic intrinsic;
+
+ UNPACK_12_12 (op, a, b);
+ intrinsic = intrinsics[ip[1]];
+
+ SYNC_IP ();
+ intrinsic (thread, SP_REF (a), SP_REF (b));
+ CACHE_SP ();
+
+ NEXT (2);
+ }
+
+ VM_DEFINE_OP (88, call_thread, "call-thread", OP2 (X32, C32))
+ {
+ scm_t_thread_intrinsic intrinsic;
+
+ intrinsic = intrinsics[ip[1]];
+
+ SYNC_IP ();
+ intrinsic (thread);
+ CACHE_SP ();
+
+ NEXT (2);
+ }
+
+ VM_DEFINE_OP (89, call_scm_from_thread_scm, "call-scm<-thread-scm", OP2 (X8_S12_S12, C32) | OP_DST)
+ {
+ scm_t_uint16 dst, src;
+ scm_t_scm_from_thread_scm_intrinsic intrinsic;
+ SCM res;
+
+ UNPACK_12_12 (op, dst, src);
+ intrinsic = intrinsics[ip[1]];
+
+ SYNC_IP ();
+ res = intrinsic (thread, SP_REF (src));
+ CACHE_SP ();
+
+ SP_SET (dst, res);
+
+ NEXT (2);
+ }
+
VM_DEFINE_OP (90, unused_90, NULL, NOP)
VM_DEFINE_OP (91, unused_91, NULL, NOP)
VM_DEFINE_OP (92, unused_92, NULL, NOP)