diff options
author | Andy Wingo <wingo@pobox.com> | 2020-04-29 21:23:53 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2020-04-29 21:47:37 +0200 |
commit | d6b6daca372e3a7d2abc601e2b60d6c2cc6c0abc (patch) | |
tree | a9c7ad961f0f8879aa7217961b9ad1c5f408b426 /module/system/vm/assembler.scm | |
parent | 3d96c87cf82e3f2f4d73195cda6753ebe5e6ad74 (diff) | |
download | guile-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.scm | 50 |
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)))) |