summaryrefslogtreecommitdiff
path: root/module/system/vm/assembler.scm
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2020-04-29 21:23:53 +0200
committerAndy Wingo <wingo@pobox.com>2020-04-29 21:47:37 +0200
commitd6b6daca372e3a7d2abc601e2b60d6c2cc6c0abc (patch)
treea9c7ad961f0f8879aa7217961b9ad1c5f408b426 /module/system/vm/assembler.scm
parent3d96c87cf82e3f2f4d73195cda6753ebe5e6ad74 (diff)
downloadguile-d6b6daca372e3a7d2abc601e2b60d6c2cc6c0abc.tar.gz
Add intrinsics for a baseline compiler
Since there's no optimization in the baseline compiler, there's no sense in instruction explosion. * libguile/intrinsics.h: * libguile/intrinsics.c ($car, $cdr, $set-car!, $set-cdr!, $variable-ref, $variable-set!, $vector-length, $vector-ref, $vector-set!, $vector-ref/immediate, $vector-set!, $allocate-struct, $struct-vtable, $struct-ref, $struct-set! $struct-ref/immediate, $struct-set!): New intrinsics. * libguile/jit.c (compile_call_scm_scm, compile_call_scm_scm_slow) (compile_call_scm_scm_scm, compile_call_scm_scm_scm_slow) (compile_call_scm_uimm_scm, compile_call_scm_uimm_scm_slow): New code generators. * libguile/vm-engine.c (call-scm-scm, call-scm-scm-scm, call-scm-uimm-scm): New instructions. * module/system/vm/assembler.scm (emit-null?, emit-false?, emit-nil?): Export these. Also export emitters for the new intrinsics. (define-scm-scm-intrinsic, define-scm-uimm-scm-intrinsic) (define-scm-scm-scm-intrinsic): New helpers. * doc/ref/vm.texi (Intrinsic Call Instructions): Add new instructions.
Diffstat (limited to 'module/system/vm/assembler.scm')
-rw-r--r--module/system/vm/assembler.scm50
1 files changed, 50 insertions, 0 deletions
diff --git a/module/system/vm/assembler.scm b/module/system/vm/assembler.scm
index 022a40256..64b65f79e 100644
--- a/module/system/vm/assembler.scm
+++ b/module/system/vm/assembler.scm
@@ -101,6 +101,10 @@
emit-undefined?
emit-eof-object?
+ emit-null?
+ emit-false?
+ emit-nil?
+
emit-untag-fixnum
emit-tag-fixnum
emit-untag-char
@@ -256,6 +260,25 @@
emit-define!
emit-current-module
+ ;; Intrinsics for use by the baseline compiler.
+ emit-$car
+ emit-$cdr
+ emit-$set-car!
+ emit-$set-cdr!
+ emit-$variable-ref
+ emit-$variable-set!
+ emit-$vector-length
+ emit-$vector-ref
+ emit-$vector-set!
+ emit-$vector-ref/immediate
+ emit-$vector-set!/immediate
+ emit-$allocate-struct
+ emit-$struct-vtable
+ emit-$struct-ref
+ emit-$struct-set!
+ emit-$struct-ref/immediate
+ emit-$struct-set!/immediate
+
emit-cache-ref
emit-cache-set!
@@ -1399,6 +1422,15 @@ returned instead."
(define-syntax-rule (define-scm<-thread-intrinsic name)
(define-macro-assembler (name asm dst)
(emit-call-scm<-thread asm dst (intrinsic-name->index 'name))))
+(define-syntax-rule (define-scm-scm-intrinsic name)
+ (define-macro-assembler (name asm a b)
+ (emit-call-scm-scm asm a b (intrinsic-name->index 'name))))
+(define-syntax-rule (define-scm-uimm-scm-intrinsic name)
+ (define-macro-assembler (name asm a b c)
+ (emit-call-scm-uimm-scm asm a b c (intrinsic-name->index 'name))))
+(define-syntax-rule (define-scm-scm-scm-intrinsic name)
+ (define-macro-assembler (name asm a b c)
+ (emit-call-scm-scm-scm asm a b c (intrinsic-name->index 'name))))
(define-scm<-scm-scm-intrinsic add)
(define-scm<-scm-uimm-intrinsic add/immediate)
@@ -1464,6 +1496,24 @@ returned instead."
(define-scm<-scm-scm-intrinsic define!)
(define-scm<-thread-intrinsic current-module)
+(define-scm<-scm-intrinsic $car)
+(define-scm<-scm-intrinsic $cdr)
+(define-scm-scm-intrinsic $set-car!)
+(define-scm-scm-intrinsic $set-cdr!)
+(define-scm<-scm-intrinsic $variable-ref)
+(define-scm-scm-intrinsic $variable-set!)
+(define-scm<-scm-intrinsic $vector-length)
+(define-scm<-scm-scm-intrinsic $vector-ref)
+(define-scm-scm-scm-intrinsic $vector-set!)
+(define-scm<-scm-uimm-intrinsic $vector-ref/immediate)
+(define-scm-uimm-scm-intrinsic $vector-set!/immediate)
+(define-scm<-scm-scm-intrinsic $allocate-struct)
+(define-scm<-scm-intrinsic $struct-vtable)
+(define-scm<-scm-scm-intrinsic $struct-ref)
+(define-scm-scm-scm-intrinsic $struct-set!)
+(define-scm<-scm-uimm-intrinsic $struct-ref/immediate)
+(define-scm-uimm-scm-intrinsic $struct-set!/immediate)
+
(define-macro-assembler (begin-program asm label properties)
(emit-label asm label)
(let ((meta (make-meta label properties (asm-start asm))))