From f6a95c07d232bbefb1098ef9f9747fe58b60f6cd Mon Sep 17 00:00:00 2001 From: Abdulaziz Ghuloum Date: Thu, 23 Nov 2006 20:37:04 -0500 Subject: [PATCH] Removed all version names from files --- .bzrignore | 7 + src/Makefile | 3 +- src/build-date.tmp | 1 - src/compiler-8.1.ss | 290 -- src/compiler-9.0.ss | 290 -- src/compiler-9.1.ss | 297 -- src/ikarus.boot | Bin 1853333 -> 1853333 bytes src/ikarus.boot.back | Bin 0 -> 1853333 bytes src/{libassembler-6.7.ss => libassembler.ss} | 0 src/{libcafe-6.1.ss => libcafe.ss} | 0 src/{libchezio-8.1.ss => libchezio.ss} | 0 src/{libcollect-6.1.ss => libcollect.ss} | 0 src/libcompile-8.1.ss | 3771 -------------- src/libcompile-9.0.ss | 3774 -------------- src/{libcompile-9.1.ss => libcompile.ss} | 0 src/{libcontrol-6.1.ss => libcontrol.ss} | 0 src/{libcore-6.9.ss => libcore.ss} | 0 src/{libcxr-6.0.ss => libcxr.ss} | 0 src/{libfasl-6.7.ss => libfasl.ss} | 0 src/{libhandlers-6.9.ss => libhandlers.ss} | 0 src/libhash-6.2.ss | 207 - src/{libhash-9.2.ss => libhash.ss} | 0 src/{libintelasm-6.9.ss => libintelasm.ss} | 0 src/{libinterpret-6.5.ss => libinterpret.ss} | 0 src/{libnumerics-9.1.ss => libnumerics.ss} | 0 src/{libposix-6.0.ss => libposix.ss} | 0 src/{librecord-6.4.ss => librecord.ss} | 0 src/libtokenizer-6.1.ss | 513 -- src/libtokenizer-9.0.ss | 626 --- src/{libtokenizer-9.1.ss => libtokenizer.ss} | 0 src/{libtoplevel-6.9.ss => libtoplevel.ss} | 0 src/{libtrace-6.9.ss => libtrace.ss} | 0 src/libwriter-6.2.ss | 373 -- src/libwriter-9.0.ss | 496 -- src/{libwriter-9.1.ss => libwriter.ss} | 0 src/makefile.ss | 42 +- src/psyntax-7.1-6.9.ss | 4711 ------------------ src/psyntax-7.1-9.0.ss | 4711 ------------------ src/{psyntax-7.1-9.1.ss => psyntax-7.1.ss} | 0 39 files changed, 30 insertions(+), 20082 deletions(-) create mode 100644 .bzrignore delete mode 100644 src/build-date.tmp delete mode 100644 src/compiler-8.1.ss delete mode 100644 src/compiler-9.0.ss delete mode 100644 src/compiler-9.1.ss create mode 100644 src/ikarus.boot.back rename src/{libassembler-6.7.ss => libassembler.ss} (100%) rename src/{libcafe-6.1.ss => libcafe.ss} (100%) rename src/{libchezio-8.1.ss => libchezio.ss} (100%) rename src/{libcollect-6.1.ss => libcollect.ss} (100%) delete mode 100644 src/libcompile-8.1.ss delete mode 100644 src/libcompile-9.0.ss rename src/{libcompile-9.1.ss => libcompile.ss} (100%) rename src/{libcontrol-6.1.ss => libcontrol.ss} (100%) rename src/{libcore-6.9.ss => libcore.ss} (100%) rename src/{libcxr-6.0.ss => libcxr.ss} (100%) rename src/{libfasl-6.7.ss => libfasl.ss} (100%) rename src/{libhandlers-6.9.ss => libhandlers.ss} (100%) delete mode 100644 src/libhash-6.2.ss rename src/{libhash-9.2.ss => libhash.ss} (100%) rename src/{libintelasm-6.9.ss => libintelasm.ss} (100%) rename src/{libinterpret-6.5.ss => libinterpret.ss} (100%) rename src/{libnumerics-9.1.ss => libnumerics.ss} (100%) rename src/{libposix-6.0.ss => libposix.ss} (100%) rename src/{librecord-6.4.ss => librecord.ss} (100%) delete mode 100644 src/libtokenizer-6.1.ss delete mode 100644 src/libtokenizer-9.0.ss rename src/{libtokenizer-9.1.ss => libtokenizer.ss} (100%) rename src/{libtoplevel-6.9.ss => libtoplevel.ss} (100%) rename src/{libtrace-6.9.ss => libtrace.ss} (100%) delete mode 100644 src/libwriter-6.2.ss delete mode 100644 src/libwriter-9.0.ss rename src/{libwriter-9.1.ss => libwriter.ss} (100%) delete mode 100644 src/psyntax-7.1-6.9.ss delete mode 100644 src/psyntax-7.1-9.0.ss rename src/{psyntax-7.1-9.1.ss => psyntax-7.1.ss} (100%) diff --git a/.bzrignore b/.bzrignore new file mode 100644 index 0000000..bfbc335 --- /dev/null +++ b/.bzrignore @@ -0,0 +1,7 @@ +*.tmp +*.out +*.fasl +.gdb_history +.bzrignore +.bzrignore +./ikarus.boot.back diff --git a/src/Makefile b/src/Makefile index b90246e..c4847d2 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2,7 +2,8 @@ all: ikarus.boot ikarus.boot: *.ss - echo '(load "makefile.ss")' | ../runtime/ikarus ikarus.boot + cp ikarus.boot ikarus.boot.back + echo '(load "makefile.ss")' | time ../runtime/ikarus ikarus.boot clean: rm -f *.fasl diff --git a/src/build-date.tmp b/src/build-date.tmp deleted file mode 100644 index 77c2433..0000000 --- a/src/build-date.tmp +++ /dev/null @@ -1 +0,0 @@ -2006-08-25 diff --git a/src/compiler-8.1.ss b/src/compiler-8.1.ss deleted file mode 100644 index 1cee6fc..0000000 --- a/src/compiler-8.1.ss +++ /dev/null @@ -1,290 +0,0 @@ - - -;;; 8.1: * using chez-style io ports -;;; 6.9: * creating a *system* environment -;;; 6.8: * creating a core-primitive form in the expander -;;; 6.2: * side-effects now modify the dirty-vector -;;; * added bwp-object? -;;; * added pointer-value -;;; * added tcbuckets -;;; 6.1: * added case-lambda, dropped lambda -;;; 6.0: * basic compiler - - - - -(define macros - '(|#primitive| lambda case-lambda set! quote begin define if letrec - foreign-call $apply - quasiquote unquote unquote-splicing - define-syntax identifier-syntax let-syntax letrec-syntax - fluid-let-syntax alias meta eval-when with-implicit with-syntax - type-descriptor - syntax-case syntax-rules module $module import $import import-only - syntax quasisyntax unsyntax unsyntax-splicing datum - let let* let-values cond case define-record or and when unless do - include parameterize trace untrace trace-lambda)) - - - -(define public-primitives - '(null? pair? char? fixnum? symbol? gensym? string? vector? list? - boolean? procedure? - not - eof-object eof-object? bwp-object? - void - fx= fx< fx<= fx> fx>= fxzero? - fx+ fx- fx* fxadd1 fxsub1 fxquotient fxremainder fxmodulo - fxsll fxsra fxlognot fxlogor fxlogand fxlogxor - integer->char char->integer - char=? char? char>=? - cons car cdr set-car! set-cdr! - caar cadr cdar cddr - caaar caadr cadar caddr cdaar cdadr cddar cdddr - caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr - cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr - list list* make-list length list-ref - append - make-vector vector-ref vector-set! vector-length vector - vector->list list->vector - make-string string-ref string-set! string-length string list->string - uuid - string-append substring - string=? string? string>=? - remprop putprop getprop property-list - apply - map for-each andmap ormap - memq memv assq - eq? equal? - reverse - string->symbol symbol->string oblist - top-level-value set-top-level-value! top-level-bound? - gensym gensym-count gensym-prefix print-gensym - gensym->unique-string - call-with-values values - make-parameter dynamic-wind - display write fasl-write printf format print-error - read-token read - error exit call/cc - current-error-handler - eval current-eval interpret compile compile-file new-cafe load - system - expand sc-expand current-expand expand-mode - environment? interaction-environment - identifier? free-identifier=? bound-identifier=? literal-identifier=? - datum->syntax-object syntax-object->datum syntax-error - syntax->list - generate-temporaries - record? record-set! record-ref record-length - record-type-descriptor make-record-type - record-printer record-name record-field-accessor - record-field-mutator record-predicate record-constructor - record-type-name record-type-symbol record-type-field-names - hash-table? make-hash-table get-hash-table put-hash-table! - assembler-output - $make-environment - features - - port? input-port? output-port? - make-input-port make-output-port make-input/output-port - port-handler - port-input-buffer port-input-index port-input-size - port-output-buffer port-output-index port-output-size - set-port-input-index! set-port-input-size! - set-port-output-index! set-port-output-size! - port-name input-port-name output-port-name - write-char read-char unread-char peek-char - newline - reset-input-port! flush-output-port - close-input-port close-output-port - console-input-port current-input-port - standard-output-port standard-error-port - console-output-port current-output-port - open-output-file open-input-file - open-output-string get-output-string - with-output-to-file call-with-output-file - with-input-from-file call-with-input-file - date-string - - )) - -(define system-primitives - '(immediate? $unbound-object? $forward-ptr? - pointer-value - primitive-ref primitive-set! - $fx= $fx< $fx<= $fx> $fx>= $fxzero? - $fx+ $fx- $fx* $fxadd1 $fxsub1 $fxquotient $fxremainder $fxmodulo - $fxsll $fxsra $fxlognot $fxlogor $fxlogand $fxlogxor - $fixnum->char $char->fixnum - $char= $char< $char<= $char> $char>= - $car $cdr $set-car! $set-cdr! - $make-vector $vector-ref $vector-set! $vector-length - $make-string $string-ref $string-set! $string-length $string - $symbol-string $symbol-unique-string $symbol-value - $set-symbol-string! $set-symbol-unique-string! $set-symbol-value! - $make-symbol $set-symbol-plist! $symbol-plist - $sc-put-cte - $record? $record/rtd? $record-set! $record-ref $record-rtd - $make-record $record - $base-rtd - $code? $code-reloc-vector $code-freevars $code-size $code-ref $code-set! - $code->closure list*->code* - make-code code? set-code-reloc-vector! code-reloc-vector code-freevars - code-size code-ref code-set! - $frame->continuation $fp-at-base $current-frame $seal-frame-and-call - $make-call-with-values-procedure $make-values-procedure - do-overflow collect - $make-tcbucket $tcbucket-next $tcbucket-key $tcbucket-val - $set-tcbucket-next! $set-tcbucket-val! $set-tcbucket-tconc! - call/cf trace-symbol! untrace-symbol! make-traced-procedure - fixnum->string - vector-memq vector-memv - - ;;; must open-code - $make-port/input - $make-port/output - $make-port/both - $make-input-port $make-output-port $make-input/output-port - $port-handler - $port-input-buffer $port-input-index $port-input-size - $port-output-buffer $port-output-index $port-output-size - $set-port-input-index! $set-port-input-size! - $set-port-output-index! $set-port-output-size! - - ;;; better open-code - $write-char $read-char $peek-char $unread-char - - ;;; never open-code - $reset-input-port! $close-input-port - $close-output-port $flush-output-port - *standard-output-port* *standard-error-port* *current-output-port* - *standard-input-port* *current-input-port* - )) - - - -(define (whack-system-env setenv?) - (define add-prim - (lambda (x) - (let ([g (gensym (symbol->string x))]) - (putprop x '|#system| g) - (putprop g '*sc-expander* (cons 'core-primitive x))))) - (define add-macro - (lambda (x) - (let ([g (gensym (symbol->string x))] - [e (getprop x '*sc-expander*)]) - (when e - (putprop x '|#system| g) - (putprop g '*sc-expander* e))))) - (define (foo) - (eval - `(begin - (define-syntax compile-time-date-string - (lambda (x) - #'(quote ,(date-string)))) - (define-syntax public-primitives - (lambda (x) - #'(quote ,public-primitives))) - (define-syntax system-primitives - (lambda (x) - #'(quote ,system-primitives))) - (define-syntax macros - (lambda (x) - #'(quote ,macros)))))) - (set! system-env ($make-environment '|#system| #t)) - (for-each add-macro macros) - (for-each add-prim public-primitives) - (for-each add-prim system-primitives) - (if setenv? - (parameterize ([interaction-environment system-env]) - (foo)) - (foo))) - - - -(when (eq? "" "") - (load "chez-compat.ss") - (set! primitive-ref top-level-value) - (set! primitive-set! set-top-level-value!) - (set! chez-expand sc-expand) - (set! chez-current-expand current-expand) - (printf "loading psyntax.pp ...\n") - (load "psyntax-7.1.pp") - (chez-current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - (whack-system-env #f) - (printf "loading psyntax.ss ...\n") - (load "psyntax-7.1-6.9.ss") - (chez-current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - (whack-system-env #t) - (printf "ok\n") - (load "libassembler-compat-6.7.ss") ; defines make-code etc. - (load "libintelasm-6.9.ss") ; uses make-code, etc. - (load "libfasl-6.7.ss") ; uses code? etc. - (load "libcompile-8.1.ss") ; uses fasl-write -) - - -(whack-system-env #t) - -(define scheme-library-files - '(["libhandlers-6.9.ss" #t "libhandlers.fasl"] - ["libcontrol-6.1.ss" #t "libcontrol.fasl"] - ["libcollect-6.1.ss" #t "libcollect.fasl"] - ["librecord-6.4.ss" #t "librecord.fasl"] - ["libcxr-6.0.ss" #t "libcxr.fasl"] - ["libcore-6.9.ss" #t "libcore.fasl"] - ["libchezio-8.1.ss" #t "libchezio.fasl"] - ["libwriter-6.2.ss" #t "libwriter.fasl"] - ["libtokenizer-6.1.ss" #t "libtokenizer.fasl"] - ["libassembler-6.7.ss" #t "libassembler.ss"] - ["libintelasm-6.9.ss" #t "libintelasm.fasl"] - ["libfasl-6.7.ss" #t "libfasl.fasl"] - ["libcompile-8.1.ss" #t "libcompile.fasl"] - ["psyntax-7.1-6.9.ss" #t "psyntax.fasl"] - ["libinterpret-6.5.ss" #t "libinterpret.fasl"] - ["libcafe-6.1.ss" #t "libcafe.fasl"] - ["libtrace-6.9.ss" #t "libtrace.fasl"] - ["libposix-6.0.ss" #t "libposix.fasl"] - ["libhash-6.2.ss" #t "libhash.fasl"] - ["libtoplevel-6.9.ss" #t "libtoplevel.fasl"] - )) - - - -(define (compile-library ifile ofile) - (parameterize ([assembler-output #f] - [expand-mode 'bootstrap] - [interaction-environment system-env]) - (printf "compiling ~a ...\n" ifile) - (compile-file ifile ofile 'replace))) - -(for-each - (lambda (x) - (when (cadr x) - (compile-library (car x) (caddr x)))) - scheme-library-files) - - -(define (join s ls) - (cond - [(null? ls) ""] - [else - (let ([str (open-output-string)]) - (let f ([a (car ls)] [d (cdr ls)]) - (cond - [(null? d) - (display a str) - (get-output-string str)] - [else - (display a str) - (display s str) - (f (car d) (cdr d))])))])) - - -(system - (format "cat ~a > ikarus.fasl" - (join " " (map caddr scheme-library-files)))) diff --git a/src/compiler-9.0.ss b/src/compiler-9.0.ss deleted file mode 100644 index f3ab9c7..0000000 --- a/src/compiler-9.0.ss +++ /dev/null @@ -1,290 +0,0 @@ - - -;;; 8.1: * using chez-style io ports -;;; 6.9: * creating a *system* environment -;;; 6.8: * creating a core-primitive form in the expander -;;; 6.2: * side-effects now modify the dirty-vector -;;; * added bwp-object? -;;; * added pointer-value -;;; * added tcbuckets -;;; 6.1: * added case-lambda, dropped lambda -;;; 6.0: * basic compiler - - - - -(define macros - '(|#primitive| lambda case-lambda set! quote begin define if letrec - foreign-call $apply - quasiquote unquote unquote-splicing - define-syntax identifier-syntax let-syntax letrec-syntax - fluid-let-syntax alias meta eval-when with-implicit with-syntax - type-descriptor - syntax-case syntax-rules module $module import $import import-only - syntax quasisyntax unsyntax unsyntax-splicing datum - let let* let-values cond case define-record or and when unless do - include parameterize trace untrace trace-lambda)) - - - -(define public-primitives - '(null? pair? char? fixnum? symbol? gensym? string? vector? list? - boolean? procedure? - not - eof-object eof-object? bwp-object? - void - fx= fx< fx<= fx> fx>= fxzero? - fx+ fx- fx* fxadd1 fxsub1 fxquotient fxremainder fxmodulo - fxsll fxsra fxlognot fxlogor fxlogand fxlogxor - integer->char char->integer - char=? char? char>=? - cons car cdr set-car! set-cdr! - caar cadr cdar cddr - caaar caadr cadar caddr cdaar cdadr cddar cdddr - caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr - cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr - list list* make-list length list-ref - append - make-vector vector-ref vector-set! vector-length vector - vector->list list->vector - make-string string-ref string-set! string-length string list->string - uuid - string-append substring - string=? string? string>=? - remprop putprop getprop property-list - apply - map for-each andmap ormap - memq memv assq - eq? equal? - reverse - string->symbol symbol->string oblist - top-level-value set-top-level-value! top-level-bound? - gensym gensym-count gensym-prefix print-gensym - gensym->unique-string - call-with-values values - make-parameter dynamic-wind - display write print-graph fasl-write printf format print-error - read-token read - error exit call/cc - current-error-handler - eval current-eval interpret compile compile-file new-cafe load - system - expand sc-expand current-expand expand-mode - environment? interaction-environment - identifier? free-identifier=? bound-identifier=? literal-identifier=? - datum->syntax-object syntax-object->datum syntax-error - syntax->list - generate-temporaries - record? record-set! record-ref record-length - record-type-descriptor make-record-type - record-printer record-name record-field-accessor - record-field-mutator record-predicate record-constructor - record-type-name record-type-symbol record-type-field-names - hash-table? make-hash-table get-hash-table put-hash-table! - assembler-output - $make-environment - features - - port? input-port? output-port? - make-input-port make-output-port make-input/output-port - port-handler - port-input-buffer port-input-index port-input-size - port-output-buffer port-output-index port-output-size - set-port-input-index! set-port-input-size! - set-port-output-index! set-port-output-size! - port-name input-port-name output-port-name - write-char read-char unread-char peek-char - newline - reset-input-port! flush-output-port - close-input-port close-output-port - console-input-port current-input-port - standard-output-port standard-error-port - console-output-port current-output-port - open-output-file open-input-file - open-output-string get-output-string - with-output-to-file call-with-output-file - with-input-from-file call-with-input-file - date-string - - )) - -(define system-primitives - '(immediate? $unbound-object? $forward-ptr? - pointer-value - primitive-ref primitive-set! - $fx= $fx< $fx<= $fx> $fx>= $fxzero? - $fx+ $fx- $fx* $fxadd1 $fxsub1 $fxquotient $fxremainder $fxmodulo - $fxsll $fxsra $fxlognot $fxlogor $fxlogand $fxlogxor - $fixnum->char $char->fixnum - $char= $char< $char<= $char> $char>= - $car $cdr $set-car! $set-cdr! - $make-vector $vector-ref $vector-set! $vector-length - $make-string $string-ref $string-set! $string-length $string - $symbol-string $symbol-unique-string $symbol-value - $set-symbol-string! $set-symbol-unique-string! $set-symbol-value! - $make-symbol $set-symbol-plist! $symbol-plist - $sc-put-cte - $record? $record/rtd? $record-set! $record-ref $record-rtd - $make-record $record - $base-rtd - $code? $code-reloc-vector $code-freevars $code-size $code-ref $code-set! - $code->closure list*->code* - make-code code? set-code-reloc-vector! code-reloc-vector code-freevars - code-size code-ref code-set! - $frame->continuation $fp-at-base $current-frame $seal-frame-and-call - $make-call-with-values-procedure $make-values-procedure - do-overflow collect - $make-tcbucket $tcbucket-next $tcbucket-key $tcbucket-val - $set-tcbucket-next! $set-tcbucket-val! $set-tcbucket-tconc! - call/cf trace-symbol! untrace-symbol! make-traced-procedure - fixnum->string - vector-memq vector-memv - - ;;; must open-code - $make-port/input - $make-port/output - $make-port/both - $make-input-port $make-output-port $make-input/output-port - $port-handler - $port-input-buffer $port-input-index $port-input-size - $port-output-buffer $port-output-index $port-output-size - $set-port-input-index! $set-port-input-size! - $set-port-output-index! $set-port-output-size! - - ;;; better open-code - $write-char $read-char $peek-char $unread-char - - ;;; never open-code - $reset-input-port! $close-input-port - $close-output-port $flush-output-port - *standard-output-port* *standard-error-port* *current-output-port* - *standard-input-port* *current-input-port* - )) - - - -(define (whack-system-env setenv?) - (define add-prim - (lambda (x) - (let ([g (gensym (symbol->string x))]) - (putprop x '|#system| g) - (putprop g '*sc-expander* (cons 'core-primitive x))))) - (define add-macro - (lambda (x) - (let ([g (gensym (symbol->string x))] - [e (getprop x '*sc-expander*)]) - (when e - (putprop x '|#system| g) - (putprop g '*sc-expander* e))))) - (define (foo) - (eval - `(begin - (define-syntax compile-time-date-string - (lambda (x) - #'(quote ,(date-string)))) - (define-syntax public-primitives - (lambda (x) - #'(quote ,public-primitives))) - (define-syntax system-primitives - (lambda (x) - #'(quote ,system-primitives))) - (define-syntax macros - (lambda (x) - #'(quote ,macros)))))) - (set! system-env ($make-environment '|#system| #t)) - (for-each add-macro macros) - (for-each add-prim public-primitives) - (for-each add-prim system-primitives) - (if setenv? - (parameterize ([interaction-environment system-env]) - (foo)) - (foo))) - - - -(when (eq? "" "") - (load "chez-compat.ss") - (set! primitive-ref top-level-value) - (set! primitive-set! set-top-level-value!) - (set! chez-expand sc-expand) - (set! chez-current-expand current-expand) - (printf "loading psyntax.pp ...\n") - (load "psyntax-7.1.pp") - (chez-current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - (whack-system-env #f) - (printf "loading psyntax.ss ...\n") - (load "psyntax-7.1-6.9.ss") - (chez-current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - (whack-system-env #t) - (printf "ok\n") - (load "libassembler-compat-6.7.ss") ; defines make-code etc. - (load "libintelasm-6.9.ss") ; uses make-code, etc. - (load "libfasl-6.7.ss") ; uses code? etc. - (load "libcompile-8.1.ss") ; uses fasl-write -) - - -(whack-system-env #t) - -(define scheme-library-files - '(["libhandlers-6.9.ss" #t "libhandlers.fasl"] - ["libcontrol-6.1.ss" #t "libcontrol.fasl"] - ["libcollect-6.1.ss" #t "libcollect.fasl"] - ["librecord-6.4.ss" #t "librecord.fasl"] - ["libcxr-6.0.ss" #t "libcxr.fasl"] - ["libcore-6.9.ss" #t "libcore.fasl"] - ["libchezio-8.1.ss" #t "libchezio.fasl"] - ["libhash-6.2.ss" #t "libhash.fasl"] - ["libwriter-9.0.ss" #t "libwriter.fasl"] - ["libtokenizer-9.0.ss" #t "libtokenizer.fasl"] - ["libassembler-6.7.ss" #t "libassembler.ss"] - ["libintelasm-6.9.ss" #t "libintelasm.fasl"] - ["libfasl-6.7.ss" #t "libfasl.fasl"] - ["libcompile-9.0.ss" #t "libcompile.fasl"] - ["psyntax-7.1-9.0.ss" #t "psyntax.fasl"] - ["libinterpret-6.5.ss" #t "libinterpret.fasl"] - ["libcafe-6.1.ss" #t "libcafe.fasl"] - ["libtrace-6.9.ss" #t "libtrace.fasl"] - ["libposix-6.0.ss" #t "libposix.fasl"] - ["libtoplevel-6.9.ss" #t "libtoplevel.fasl"] - )) - - - -(define (compile-library ifile ofile) - (parameterize ([assembler-output #f] - [expand-mode 'bootstrap] - [interaction-environment system-env]) - (printf "compiling ~a ...\n" ifile) - (compile-file ifile ofile 'replace))) - -(for-each - (lambda (x) - (when (cadr x) - (compile-library (car x) (caddr x)))) - scheme-library-files) - - -(define (join s ls) - (cond - [(null? ls) ""] - [else - (let ([str (open-output-string)]) - (let f ([a (car ls)] [d (cdr ls)]) - (cond - [(null? d) - (display a str) - (get-output-string str)] - [else - (display a str) - (display s str) - (f (car d) (cdr d))])))])) - - -(system - (format "cat ~a > ikarus.fasl" - (join " " (map caddr scheme-library-files)))) diff --git a/src/compiler-9.1.ss b/src/compiler-9.1.ss deleted file mode 100644 index 160f2e1..0000000 --- a/src/compiler-9.1.ss +++ /dev/null @@ -1,297 +0,0 @@ - - -;;; 9.1: * starting with libnumerics -;;; 9.0: * graph marks for both reader and writer -;;; * circularity detection during read -;;; 8.1: * using chez-style io ports -;;; 6.9: * creating a *system* environment -;;; 6.8: * creating a core-primitive form in the expander -;;; 6.2: * side-effects now modify the dirty-vector -;;; * added bwp-object? -;;; * added pointer-value -;;; * added tcbuckets -;;; 6.1: * added case-lambda, dropped lambda -;;; 6.0: * basic compiler - - - - -(define macros - '(|#primitive| lambda case-lambda set! quote begin define if letrec - foreign-call $apply - quasiquote unquote unquote-splicing - define-syntax identifier-syntax let-syntax letrec-syntax - fluid-let-syntax alias meta eval-when with-implicit with-syntax - type-descriptor - syntax-case syntax-rules module $module import $import import-only - syntax quasisyntax unsyntax unsyntax-splicing datum - let let* let-values cond case define-record or and when unless do - include parameterize trace untrace trace-lambda)) - - - -(define public-primitives - '(null? pair? char? fixnum? symbol? gensym? string? vector? list? - boolean? procedure? - not - eof-object eof-object? bwp-object? - void - fx= fx< fx<= fx> fx>= fxzero? - fx+ fx- fx* fxadd1 fxsub1 fxquotient fxremainder fxmodulo - fxsll fxsra fxlognot fxlogor fxlogand fxlogxor - integer->char char->integer - char=? char? char>=? - cons car cdr set-car! set-cdr! - caar cadr cdar cddr - caaar caadr cadar caddr cdaar cdadr cddar cdddr - caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr - cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr - list list* make-list length list-ref - append - make-vector vector-ref vector-set! vector-length vector - vector->list list->vector - make-string string-ref string-set! string-length string list->string - uuid - string-append substring - string=? string? string>=? - remprop putprop getprop property-list - apply - map for-each andmap ormap - memq memv assq - eq? equal? - reverse - string->symbol symbol->string oblist - top-level-value set-top-level-value! top-level-bound? - gensym gensym-count gensym-prefix print-gensym - gensym->unique-string - call-with-values values - make-parameter dynamic-wind - display write print-graph fasl-write printf format print-error - read-token read - error exit call/cc - current-error-handler - eval current-eval interpret compile compile-file new-cafe load - system - expand sc-expand current-expand expand-mode - environment? interaction-environment - identifier? free-identifier=? bound-identifier=? literal-identifier=? - datum->syntax-object syntax-object->datum syntax-error - syntax->list - generate-temporaries - record? record-set! record-ref record-length - record-type-descriptor make-record-type - record-printer record-name record-field-accessor - record-field-mutator record-predicate record-constructor - record-type-name record-type-symbol record-type-field-names - hash-table? make-hash-table get-hash-table put-hash-table! - assembler-output - $make-environment - features - - port? input-port? output-port? - make-input-port make-output-port make-input/output-port - port-handler - port-input-buffer port-input-index port-input-size - port-output-buffer port-output-index port-output-size - set-port-input-index! set-port-input-size! - set-port-output-index! set-port-output-size! - port-name input-port-name output-port-name - write-char read-char unread-char peek-char - newline - reset-input-port! flush-output-port - close-input-port close-output-port - console-input-port current-input-port - standard-output-port standard-error-port - console-output-port current-output-port - open-output-file open-input-file - open-output-string get-output-string - with-output-to-file call-with-output-file - with-input-from-file call-with-input-file - date-string - - + - add1 sub1 * expt number? positive? negative? zero? number->string - logand - = < > <= >= - )) - -(define system-primitives - '(immediate? $unbound-object? $forward-ptr? - pointer-value - primitive-ref primitive-set! - $fx= $fx< $fx<= $fx> $fx>= $fxzero? - $fx+ $fx- $fx* $fxadd1 $fxsub1 $fxquotient $fxremainder $fxmodulo - $fxsll $fxsra $fxlognot $fxlogor $fxlogand $fxlogxor - $fixnum->char $char->fixnum - $char= $char< $char<= $char> $char>= - $car $cdr $set-car! $set-cdr! - $make-vector $vector-ref $vector-set! $vector-length - $make-string $string-ref $string-set! $string-length $string - $symbol-string $symbol-unique-string $symbol-value - $set-symbol-string! $set-symbol-unique-string! $set-symbol-value! - $make-symbol $set-symbol-plist! $symbol-plist - $sc-put-cte - $record? $record/rtd? $record-set! $record-ref $record-rtd - $make-record $record - $base-rtd - $code? $code-reloc-vector $code-freevars $code-size $code-ref $code-set! - $code->closure list*->code* - make-code code? set-code-reloc-vector! code-reloc-vector code-freevars - code-size code-ref code-set! - $frame->continuation $fp-at-base $current-frame $seal-frame-and-call - $make-call-with-values-procedure $make-values-procedure - do-overflow collect - $make-tcbucket $tcbucket-next $tcbucket-key $tcbucket-val - $set-tcbucket-next! $set-tcbucket-val! $set-tcbucket-tconc! - call/cf trace-symbol! untrace-symbol! make-traced-procedure - fixnum->string - vector-memq vector-memv - - ;;; must open-code - $make-port/input - $make-port/output - $make-port/both - $make-input-port $make-output-port $make-input/output-port - $port-handler - $port-input-buffer $port-input-index $port-input-size - $port-output-buffer $port-output-index $port-output-size - $set-port-input-index! $set-port-input-size! - $set-port-output-index! $set-port-output-size! - - ;;; better open-code - $write-char $read-char $peek-char $unread-char - - ;;; never open-code - $reset-input-port! $close-input-port - $close-output-port $flush-output-port - *standard-output-port* *standard-error-port* *current-output-port* - *standard-input-port* *current-input-port* - )) - - - -(define (whack-system-env setenv?) - (define add-prim - (lambda (x) - (let ([g (gensym (symbol->string x))]) - (putprop x '|#system| g) - (putprop g '*sc-expander* (cons 'core-primitive x))))) - (define add-macro - (lambda (x) - (let ([g (gensym (symbol->string x))] - [e (getprop x '*sc-expander*)]) - (when e - (putprop x '|#system| g) - (putprop g '*sc-expander* e))))) - (define (foo) - (eval - `(begin - (define-syntax compile-time-date-string - (lambda (x) - #'(quote ,(date-string)))) - (define-syntax public-primitives - (lambda (x) - #'(quote ,public-primitives))) - (define-syntax system-primitives - (lambda (x) - #'(quote ,system-primitives))) - (define-syntax macros - (lambda (x) - #'(quote ,macros)))))) - (set! system-env ($make-environment '|#system| #t)) - (for-each add-macro macros) - (for-each add-prim public-primitives) - (for-each add-prim system-primitives) - (if setenv? - (parameterize ([interaction-environment system-env]) - (foo)) - (foo))) - - - -(when (eq? "" "") - (load "chez-compat.ss") - (set! primitive-ref top-level-value) - (set! primitive-set! set-top-level-value!) - (set! chez-expand sc-expand) - (set! chez-current-expand current-expand) - (printf "loading psyntax.pp ...\n") - (load "psyntax-7.1.pp") - (chez-current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - (whack-system-env #f) - (printf "loading psyntax.ss ...\n") - (load "psyntax-7.1-6.9.ss") - (chez-current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - (whack-system-env #t) - (printf "ok\n") - (load "libassembler-compat-6.7.ss") ; defines make-code etc. - (load "libintelasm-6.9.ss") ; uses make-code, etc. - (load "libfasl-6.7.ss") ; uses code? etc. - (load "libcompile-8.1.ss") ; uses fasl-write -) - - -(whack-system-env #t) - -(define scheme-library-files - '(["libhandlers-6.9.ss" #t "libhandlers.fasl"] - ["libcontrol-6.1.ss" #t "libcontrol.fasl"] - ["libcollect-6.1.ss" #t "libcollect.fasl"] - ["librecord-6.4.ss" #t "librecord.fasl"] - ["libcxr-6.0.ss" #t "libcxr.fasl"] - ["libnumerics-9.1.ss" #t "libnumerics.fasl"] - ["libcore-6.9.ss" #t "libcore.fasl"] - ["libchezio-8.1.ss" #t "libchezio.fasl"] - ["libhash-6.2.ss" #t "libhash.fasl"] - ["libwriter-9.1.ss" #t "libwriter.fasl"] - ["libtokenizer-9.1.ss" #t "libtokenizer.fasl"] - ["libassembler-6.7.ss" #t "libassembler.ss"] - ["libintelasm-6.9.ss" #t "libintelasm.fasl"] - ["libfasl-6.7.ss" #t "libfasl.fasl"] - ["libcompile-9.1.ss" #t "libcompile.fasl"] - ["psyntax-7.1-9.1.ss" #t "psyntax.fasl"] - ["libinterpret-6.5.ss" #t "libinterpret.fasl"] - ["libcafe-6.1.ss" #t "libcafe.fasl"] - ["libtrace-6.9.ss" #t "libtrace.fasl"] - ["libposix-6.0.ss" #t "libposix.fasl"] - ["libtoplevel-6.9.ss" #t "libtoplevel.fasl"] - )) - - - -(define (compile-library ifile ofile) - (parameterize ([assembler-output #f] - [expand-mode 'bootstrap] - [interaction-environment system-env]) - (printf "compiling ~a ...\n" ifile) - (compile-file ifile ofile 'replace))) - -(for-each - (lambda (x) - (when (cadr x) - (compile-library (car x) (caddr x)))) - scheme-library-files) - - -(define (join s ls) - (cond - [(null? ls) ""] - [else - (let ([str (open-output-string)]) - (let f ([a (car ls)] [d (cdr ls)]) - (cond - [(null? d) - (display a str) - (get-output-string str)] - [else - (display a str) - (display s str) - (f (car d) (cdr d))])))])) - - -(system - (format "cat ~a > ikarus.fasl" - (join " " (map caddr scheme-library-files)))) diff --git a/src/ikarus.boot b/src/ikarus.boot index eba0775d5bcdc1279d570872907dde63162a83db..1ea6a1c0b4c32fbf47df65e2bf18f1150aa9d6d7 100644 GIT binary patch delta 13200 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 r1b(nVr2wp46l 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 diff --git a/src/ikarus.boot.back b/src/ikarus.boot.back new file mode 100644 index 0000000000000000000000000000000000000000..ff79ab8dce7f2d127c26d7d15ad784b68a8dc30f GIT binary patch literal 1853333 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
    h?^6*J@+cu?{FV}RqQX*?;Y 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�?wJG4Yl@63YZHbj#mQEjAL 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 f^M&EslUZ$Q=5E1^N9rd17jNoaV8D9izraiwe6 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 zzxExScdatum #'test)) - #'conseq - #'altern)]))) - -(cond-expand (eq? "" "") - (include "record-case.chez.ss") - (include "record-case.ss")) - - -(include "set-operations.ss") - - -(define open-coded-primitives -;;; these primitives, when found in operator position with the correct -;;; number of arguments, will be open-coded by the generator. If an -;;; incorrect number of args is detected, or if they appear in non-operator -;;; position, then they cannot be open-coded, and the pcb-primitives table -;;; is consulted for a reference of the pcb slot containing the primitive. -;;; If it's not found there, an error is signalled. -;;; -;;; prim-name args - '([$constant-ref 1 value] - [$constant-set! 2 effect] - [$pcb-ref 1 value] - [$pcb-set! 2 effect] - ;;; type predicates - [fixnum? 1 pred] - [immediate? 1 pred] - [boolean? 1 pred] - [char? 1 pred] - [pair? 1 pred] - [symbol? 1 pred] - [vector? 1 pred] - [string? 1 pred] - [procedure? 1 pred] - [null? 1 pred] - [eof-object? 1 pred] - [bwp-object? 1 pred] - [$unbound-object? 1 pred] - [$forward-ptr? 1 pred] - [not 1 pred] - [pointer-value 1 value] - [eq? 2 pred] - ;;; fixnum primitives - [$fxadd1 1 value] - [$fxsub1 1 value] - [$fx+ 2 value] - [$fx- 2 value] - [$fx* 2 value] - [$fxsll 2 value] - [$fxsra 2 value] - [$fxlogand 2 value] - [$fxlogor 2 value] - [$fxlogxor 2 value] - [$fxlognot 1 value] - [$fxquotient 2 value] - [$fxmodulo 2 value] - ;;; fixnum predicates - [$fxzero? 1 pred] - [$fx= 2 pred] - [$fx< 2 pred] - [$fx<= 2 pred] - [$fx> 2 pred] - [$fx>= 2 pred] - ;;; character predicates - [$char= 2 pred] - [$char< 2 pred] - [$char<= 2 pred] - [$char> 2 pred] - [$char>= 2 pred] - ;;; character conversion - [$fixnum->char 1 value] - [$char->fixnum 1 value] - ;;; lists/pairs - [cons 2 value] - [list* positive value] - [list any value] - [car 1 value] - [cdr 1 value] - [$car 1 value] - [$cdr 1 value] - [$set-car! 2 effect] - [$set-cdr! 2 effect] - ;;; vectors - [$make-vector 1 value] - [vector any value] - [$vector-length 1 value] - [$vector-ref 2 value] - [$vector-set! 3 effect] - [$vector-memq 2 value] - ;;; strings - [$make-string 1 value] - [$string any value] - [$string-length 1 value] - [$string-ref 2 value] - [$string-set! 3 effect] - ;;; symbols - [$make-symbol 1 value] - [$symbol-value 1 value] - [$symbol-string 1 value] - [$symbol-unique-string 1 value] - [$set-symbol-value! 2 effect] - [$set-symbol-string! 2 effect] - [$set-symbol-unique-string! 2 effect] - [$symbol-plist 1 value] - [$set-symbol-plist! 2 effect] - [primitive-ref 1 value] - [primitive-set! 2 effect] - [top-level-value 1 value] - ;;; ports - [port? 1 pred] - [input-port? 1 pred] - [output-port? 1 pred] - [$make-port/input 7 value] - [$make-port/output 7 value] - [$make-port/both 7 value] - [$port-handler 1 value] - [$port-input-buffer 1 value] - [$port-input-index 1 value] - [$port-input-size 1 value] - [$port-output-buffer 1 value] - [$port-output-index 1 value] - [$port-output-size 1 value] - [$set-port-input-index! 2 effect] - [$set-port-input-size! 2 effect] - [$set-port-output-index! 2 effect] - [$set-port-output-size! 2 effect] - ;;; tcbuckets - [$make-tcbucket 4 value] - [$tcbucket-key 1 value] - [$tcbucket-val 1 value] - [$tcbucket-next 1 value] - [$set-tcbucket-val! 2 effect] - [$set-tcbucket-next! 2 effect] - [$set-tcbucket-tconc! 2 effect] - ;;; misc - [eof-object 0 value] - [void 0 value] - [$exit 1 effect] - [$fp-at-base 0 pred] - [$current-frame 0 value] - [$seal-frame-and-call 1 tail] - [$frame->continuation 1 value] - ;;; - ;;; records - ;;; - [$make-record 2 value] - [$record? 1 pred] - [$record/rtd? 2 pred] - [$record-rtd 1 value] - [$record-ref 2 value] - [$record-set! 3 effect] - [$record any value] - ;;; - ;;; asm - ;;; - [$code? 1 pred] - [$code-size 1 value] - [$code-reloc-vector 1 value] - [$code-freevars 1 value] - [$code-ref 2 value] - [$code-set! 3 value] - [$code->closure 1 value] - ;;; - [$make-call-with-values-procedure 0 value] - [$make-values-procedure 0 value] - [$install-underflow-handler 0 effect] - )) - -(define (primitive-context x) - (cond - [(assq x open-coded-primitives) => caddr] - [else (error 'primitive-context "unknown prim ~s" x)])) - -(define (open-codeable? x) - (cond - [(assq x open-coded-primitives) #t] - [else #f])) - -(define (open-coded-primitive-args x) - (cond - [(assq x open-coded-primitives) => cadr] - [else (error 'open-coded-primitive-args "invalid ~s" x)])) - -;;; end of primitives table section - - -(define-record constant (value)) -(define-record code-loc (label)) -(define-record foreign-label (label)) -(define-record var (name assigned)) -(define-record cp-var (idx)) -(define-record frame-var (idx)) -(define-record new-frame (base-idx size body)) -(define-record save-cp (loc)) -(define-record eval-cp (check body)) -(define-record return (value)) -(define-record call-cp - (call-convention rp-convention base-idx arg-count live-mask)) -(define-record tailcall-cp (convention arg-count)) -(define-record primcall (op arg*)) -(define-record primref (name)) -(define-record conditional (test conseq altern)) -(define-record bind (lhs* rhs* body)) -(define-record recbind (lhs* rhs* body)) -(define-record fix (lhs* rhs* body)) - -(define-record seq (e0 e1)) -(define-record clambda-case (arg* proper body)) -(define-record clambda (cases)) -(define-record clambda-code (label cases free)) -(define-record closure (code free*)) -(define-record funcall (op rand*)) -(define-record appcall (op rand*)) -(define-record forcall (op rand*)) -(define-record code-rec (arg* proper free* body)) -(define-record codes (list body)) -(define-record assign (lhs rhs)) - -(define (unique-var x) - (make-var (gensym (symbol->string x)) #f)) - - -(define (make-bind^ lhs* rhs* body) - (if (null? lhs*) - body - (make-bind lhs* rhs* body))) - -(define (recordize x) - (define (gen-fml* fml*) - (cond - [(pair? fml*) - (cons (unique-var (car fml*)) - (gen-fml* (cdr fml*)))] - [(symbol? fml*) - (unique-var fml*)] - [else '()])) - (define (properize fml*) - (cond - [(pair? fml*) - (cons (car fml*) (properize (cdr fml*)))] - [(null? fml*) '()] - [else (list fml*)])) - (define (extend-env fml* nfml* env) - (cons (cons fml* nfml*) env)) - (define (quoted-sym x) - (if (and (list? x) - (fx= (length x) 2) - (eq? 'quote (car x)) - (symbol? (cadr x))) - (cadr x) - (error 'quoted-sym "not a quoted symbol ~s" x))) - (define (quoted-string x) - (if (and (list? x) - (fx= (length x) 2) - (eq? 'quote (car x)) - (string? (cadr x))) - (cadr x) - (error 'quoted-string "not a quoted string ~s" x))) - (define (lookup^ x lhs* rhs*) - (cond - [(pair? lhs*) - (if (eq? x (car lhs*)) - (car rhs*) - (lookup^ x (cdr lhs*) (cdr rhs*)))] - [(eq? x lhs*) rhs*] - [else #f])) - (define (lookup x env) - (cond - [(pair? env) - (or (lookup^ x (caar env) (cdar env)) - (lookup x (cdr env)))] - [else #f])) - (define (E x env) - (cond - [(pair? x) - (case (car x) - [(quote) (make-constant (cadr x))] - [(if) - (make-conditional - (E (cadr x) env) - (E (caddr x) env) - (E (cadddr x) env))] - [(set!) - (let ([lhs (cadr x)] [rhs (caddr x)]) - (make-assign - (or (lookup lhs env) - (error 'recordize "invalid assignment ~s" x)) - (E rhs env)))] - [(begin) - (let f ([a (cadr x)] [d (cddr x)]) - (cond - [(null? d) (E a env)] - [else - (make-seq - (E a env) - (f (car d) (cdr d)))]))] - [(letrec) - (unless (fx= (length x) 3) (syntax-error x)) - (let ([bind* (cadr x)] [body (caddr x)]) - (let ([lhs* (map car bind*)] - [rhs* (map cadr bind*)]) - (let ([nlhs* (gen-fml* lhs*)]) - (let ([env (extend-env lhs* nlhs* env)]) - (make-recbind nlhs* - (map (lambda (rhs) (E rhs env)) rhs*) - (E body env))))))] - [(letrec) - (unless (fx= (length x) 3) (syntax-error x)) - (let ([bind* (cadr x)] [body (caddr x)]) - (let ([lhs* (map car bind*)] - [rhs* (map cadr bind*)] - [v* (map (lambda (x) '(void)) bind*)] - [t* (map (lambda (x) (gensym)) bind*)]) - (E `((case-lambda - [,lhs* - ((case-lambda - [,t* - (begin ,@(map (lambda (x v) `(set! ,x ,v)) lhs* t*) - ,body)]) - ,@rhs*)]) - ,@v*) - env)))] - [(case-lambda) - (let ([cls* - (map - (lambda (cls) - (let ([fml* (car cls)] [body (cadr cls)]) - (let ([nfml* (gen-fml* fml*)]) - (let ([body (E body (extend-env fml* nfml* env))]) - (make-clambda-case - (properize nfml*) - (list? fml*) - body))))) - (cdr x))]) - (make-clambda cls*))] - [(foreign-call) - (let ([name (quoted-string (cadr x))] [arg* (cddr x)]) - (make-forcall name - (map (lambda (x) (E x env)) arg*)))] - [(|#primitive|) - (let ([var (cadr x)]) - (make-primref var))] - ;;; [(|#primitive|) - ;;; (let ([var (cadr x)]) - ;;; (if (primitive? var) - ;;; (make-primref var) - ;;; (error 'recordize "invalid primitive ~s" var)))] - [(top-level-value) - (let ([var (quoted-sym (cadr x))]) - (if (eq? (expand-mode) 'bootstrap) - (error 'compile "reference to ~s in bootstrap mode" var) - ;(make-primref var) - (make-funcall - (make-primref 'top-level-value) - (list (make-constant var)))))] - ;;; [(top-level-value) - ;;; (let ([var (quoted-sym (cadr x))]) - ;;; (if (eq? (expand-mode) 'bootstrap) - ;;; (if (primitive? var) - ;;; (make-primref var) - ;;; (error 'compile "invalid primitive ~s" var)) - ;;; (make-funcall - ;;; (make-primref 'top-level-value) - ;;; (list (make-constant var)))))] - [(set-top-level-value!) - (make-funcall (make-primref 'set-top-level-value!) - (map (lambda (x) (E x env)) (cdr x)))] - [(memv) - (make-funcall - (make-primref 'memq) - (map (lambda (x) (E x env)) (cdr x)))] - [($apply) - (let ([proc (cadr x)] [arg* (cddr x)]) - (make-appcall - (E proc env) - (map (lambda (x) (E x env)) arg*)))] - [(void) - (make-constant (void))] - [else - (make-funcall - (E (car x) env) - (map (lambda (x) (E x env)) (cdr x)))])] - [(symbol? x) - (or (lookup x env) - (error 'recordize "invalid reference in ~s" x))] - [else (error 'recordize "invalid expression ~s" x)])) - (E x '())) - - -(define (unparse x) - (define (E-args proper x) - (if proper - (map E x) - (let f ([a (car x)] [d (cdr x)]) - (cond - [(null? d) (E a)] - [else (cons (E a) (f (car d) (cdr d)))])))) - (define (E x) - (record-case x - [(constant c) `(quote ,c)] - [(code-loc x) `(code-loc ,x)] - [(var x) (string->symbol (format "v:~a" x))] - [(primref x) x] - [(conditional test conseq altern) - `(if ,(E test) ,(E conseq) ,(E altern))] - [(primcall op arg*) `(,op . ,(map E arg*))] - [(bind lhs* rhs* body) - `(let ,(map (lambda (lhs rhs) (list (E lhs) (E rhs))) lhs* rhs*) - ,(E body))] - [(recbind lhs* rhs* body) - `(letrec ,(map (lambda (lhs rhs) (list (E lhs) (E rhs))) lhs* rhs*) - ,(E body))] - [(fix lhs* rhs* body) - `(fix ,(map (lambda (lhs rhs) (list (E lhs) (E rhs))) lhs* rhs*) - ,(E body))] - [(seq e0 e1) `(begin ,(E e0) ,(E e1))] - [(clambda-case args proper body) - `(clambda-case ,(E-args proper args) ,(E body))] - [(clambda cls*) - `(case-lambda . ,(map E cls*))] - [(clambda-code label clauses free) - `(code ,label . ,(map E clauses))] - [(closure code free*) - `(closure ,(E code) ,(map E free*))] - [(code-rec arg* proper free* body) - `(code-rec [arg: ,(E-args proper arg*)] - [free: ,(map E free*)] - ,(E body))] - [(codes list body) - `(codes ,(map E list) - ,(E body))] - [(funcall rator rand*) `(funcall ,(E rator) . ,(map E rand*))] - [(appcall rator rand*) `(appcall ,(E rator) . ,(map E rand*))] - [(forcall rator rand*) `(foreign-call ,rator . ,(map E rand*))] - [(assign lhs rhs) `(set! ,(E lhs) ,(E rhs))] - [(return x) `(return ,(E x))] - [(new-frame base-idx size body) - `(new-frame [base: ,base-idx] - [size: ,size] - ,(E body))] - [(frame-var idx) - (string->symbol (format "fv.~a" idx))] - [(cp-var idx) - (string->symbol (format "cp.~a" idx))] - [(save-cp expr) - `(save-cp ,(E expr))] - [(eval-cp check body) - `(eval-cp ,check ,(E body))] - [(call-cp call-convention rp-convention base-idx arg-count live-mask) - `(call-cp [conv: ,call-convention] - [rpconv: ,rp-convention] - [base-idx: ,base-idx] - [arg-count: ,arg-count] - [live-mask: ,live-mask])] - [(foreign-label x) `(foreign-label ,x)] - [else (error 'unparse "invalid record ~s" x)])) - (E x)) - -(define (optimize-direct-calls x) - (define who 'optimize-direct-calls) - (define (make-conses ls) - (cond - [(null? ls) (make-constant '())] - [else - (make-primcall 'cons - (list (car ls) (make-conses (cdr ls))))])) - (define (properize lhs* rhs*) - (cond - [(null? lhs*) (error who "improper improper")] - [(null? (cdr lhs*)) - (list (make-conses rhs*))] - [else (cons (car rhs*) (properize (cdr lhs*) (cdr rhs*)))])) - (define (inline-case cls rand*) - (record-case cls - [(clambda-case fml* proper body) - (if proper - (and (fx= (length fml*) (length rand*)) - (make-bind fml* rand* body)) - (and (fx<= (length fml*) (length rand*)) - (make-bind fml* (properize fml* rand*) body)))])) - (define (try-inline cls* rand* default) - (cond - [(null? cls*) default] - [(inline-case (car cls*) rand*)] - [else (try-inline (cdr cls*) rand* default)])) - (define (inline rator rand*) - (record-case rator - [(clambda cls*) - (try-inline cls* rand* - (make-funcall rator rand*))] - [else (make-funcall rator rand*)])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(recbind lhs* rhs* body) - (make-recbind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional - (Expr test) - (Expr conseq) - (Expr altern))] - [(seq e0 e1) - (make-seq (Expr e0) (Expr e1))] - [(clambda cls*) - (make-clambda - (map (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Expr body))])) - cls*))] - [(primcall rator rand*) - (make-primcall rator (map Expr rand*))] - [(funcall rator rand*) - (inline (Expr rator) (map Expr rand*))] - [(appcall rator rand*) - (make-appcall (Expr rator) (map Expr rand*))] - [(forcall rator rand*) - (make-forcall rator (map Expr rand*))] - [(assign lhs rhs) - (make-assign lhs (Expr rhs))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - - - -(define lambda-both 0) -(define lambda-producer 0) -(define lambda-consumer 0) -(define lambda-none 0) -(define branching-producer 0) - - -(define (analyze-cwv x) - (define who 'analyze-cwv) - (define (lambda? x) - (record-case x - [(clambda) #t] - [else #f])) - (define (branching-producer? x) - (define (bt? x) - (record-case x - [(bind lhs* rhs* body) (bt? body)] - [(recbind lhs* rhs* body) (bt? body)] - [(conditional test conseq altern) #t] - [(seq e0 e1) (bt? e1)] - [else #f])) - (define (branching-clause? x) - (record-case x - [(clambda-case fml* proper body) - (bt? body)])) - (record-case x - [(clambda cls*) - (ormap branching-clause? cls*)] - [else #f])) - (define (analyze producer consumer) - (cond - [(and (lambda? producer) (lambda? consumer)) - (set! lambda-both (fxadd1 lambda-both))] - [(lambda? producer) - (set! lambda-producer (fxadd1 lambda-producer))] - [(lambda? consumer) - (set! lambda-consumer (fxadd1 lambda-consumer))] - [else - (set! lambda-none (fxadd1 lambda-none))]) - (when (branching-producer? producer) - (set! branching-producer (fxadd1 branching-producer))) - (printf "both=~s p=~s c=~s none=~s branching-prod=~s\n" - lambda-both lambda-producer lambda-consumer lambda-none - branching-producer)) - (define (E x) - (record-case x - [(constant) (void)] - [(var) (void)] - [(primref) (void)] - [(bind lhs* rhs* body) - (for-each E rhs*) (E body)] - [(recbind lhs* rhs* body) - (for-each E rhs*) (E body)] - [(conditional test conseq altern) - (E test) - (E conseq) - (E altern)] - [(seq e0 e1) (E e0) (E e1)] - [(clambda cls*) - (for-each - (lambda (x) - (record-case x - [(clambda-case fml* proper body) (E body)])) - cls*)] - [(primcall rator rand*) - (for-each E rand*) - (when (and (eq? rator 'call-with-values) (fx= (length rand*) 2)) - (analyze (car rand*) (cadr rand*)))] - [(funcall rator rand*) - (E rator) (for-each E rand*) - (when (and (record-case rator - [(primref op) (eq? op 'call-with-values)] - [else #f]) - (fx= (length rand*) 2)) - (analyze (car rand*) (cadr rand*)))] - [(appcall rator rand*) - (E rator) (for-each E rand*)] - [(forcall rator rand*) - (for-each E rand*)] - [(assign lhs rhs) - (E rhs)] - [else (error who "invalid expression ~s" (unparse x))])) - (E x)) - - - - -(define (optimize-letrec x) - (define who 'optimize-letrec) - (define (extend-hash lhs* h ref) - (for-each (lambda (lhs) (put-hash-table! h lhs #t)) lhs*) - (lambda (x) - (unless (get-hash-table h x #f) - (put-hash-table! h x #t) - (ref x)))) - (define (E* x* ref comp) - (cond - [(null? x*) '()] - [else - (cons (E (car x*) ref comp) - (E* (cdr x*) ref comp))])) - (define (do-rhs* i lhs* rhs* ref comp vref vcomp) - (cond - [(null? rhs*) '()] - [else - (let ([h (make-hash-table)]) - (let ([ref - (lambda (x) - (unless (get-hash-table h x #f) - (put-hash-table! h x #t) - (ref x) - (when (memq x lhs*) - (vector-set! vref i #t))))] - [comp - (lambda () - (vector-set! vcomp i #t) - (comp))]) - (cons (E (car rhs*) ref comp) - (do-rhs* (fxadd1 i) lhs* (cdr rhs*) ref comp vref vcomp))))])) - (define (partition-rhs* i lhs* rhs* vref vcomp) - (cond - [(null? lhs*) (values '() '() '() '() '() '())] - [else - (let-values - ([(slhs* srhs* llhs* lrhs* clhs* crhs*) - (partition-rhs* (fxadd1 i) (cdr lhs*) (cdr rhs*) vref vcomp)] - [(lhs rhs) (values (car lhs*) (car rhs*))]) - (cond - [(var-assigned lhs) - (values slhs* srhs* llhs* lrhs* (cons lhs clhs*) (cons rhs crhs*))] - [(clambda? rhs) - (values slhs* srhs* (cons lhs llhs*) (cons rhs lrhs*) clhs* crhs*)] - [(or (vector-ref vref i) (vector-ref vcomp i)) - (values slhs* srhs* llhs* lrhs* (cons lhs clhs*) (cons rhs crhs*))] - [else - (values (cons lhs slhs*) (cons rhs srhs*) llhs* lrhs* clhs* crhs*)] - ))])) - (define (do-recbind lhs* rhs* body ref comp) - (let ([h (make-hash-table)] - [vref (make-vector (length lhs*) #f)] - [vcomp (make-vector (length lhs*) #f)]) - (let* ([ref (extend-hash lhs* h ref)] - [body (E body ref comp)]) - (let ([rhs* (do-rhs* 0 lhs* rhs* ref comp vref vcomp)]) - (let-values ([(slhs* srhs* llhs* lrhs* clhs* crhs*) - (partition-rhs* 0 lhs* rhs* vref vcomp)]) - (let ([v* (map (lambda (x) (make-primcall 'void '())) clhs*)] - [t* (map (lambda (x) (unique-var 'tmp)) clhs*)]) - (make-bind slhs* srhs* - (make-bind clhs* v* - (make-fix llhs* lrhs* - (make-bind t* crhs* - (build-assign* clhs* t* body))))))))))) - (define (build-assign* lhs* rhs* body) - (cond - [(null? lhs*) body] - [else - (make-seq - (make-assign (car lhs*) (car rhs*)) - (build-assign* (cdr lhs*) (cdr rhs*) body))])) - (define (E x ref comp) - (record-case x - [(constant) x] - [(var) (ref x) x] - [(assign lhs rhs) - (set-var-assigned! lhs #t) - (ref lhs) - (make-assign lhs (E rhs ref comp))] - [(primref) x] - [(bind lhs* rhs* body) - (let ([rhs* (E* rhs* ref comp)]) - (let ([h (make-hash-table)]) - (let ([body (E body (extend-hash lhs* h ref) comp)]) - (make-bind lhs* rhs* body))))] - [(recbind lhs* rhs* body) - (if (null? lhs*) - (E body ref comp) - (do-recbind lhs* rhs* body ref comp))] - [(conditional e0 e1 e2) - (make-conditional (E e0 ref comp) (E e1 ref comp) (E e2 ref comp))] - [(seq e0 e1) (make-seq (E e0 ref comp) (E e1 ref comp))] - [(clambda cls*) - (make-clambda - (map (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (let ([h (make-hash-table)]) - (let ([body (E body (extend-hash fml* h ref) void)]) - (make-clambda-case fml* proper body)))])) - cls*))] - [(primcall rator rand*) - (when (memq rator '(call/cc call/cf)) - (comp)) - (make-primcall rator (E* rand* ref comp))] - [(funcall rator rand*) - (let ([rator (E rator ref comp)] [rand* (E* rand* ref comp)]) - (record-case rator - [(primref op) - (when (memq op '(call/cc call/cf)) - (comp))] - [else - (comp)]) - (make-funcall rator rand*))] - [(appcall rator rand*) - (let ([rator (E rator ref comp)] [rand* (E* rand* ref comp)]) - (record-case rator - [(primref op) - (when (memq op '(call/cc call/cf)) - (comp))] - [else - (comp)]) - (make-appcall rator rand*))] - [(forcall rator rand*) - (make-forcall rator (E* rand* ref comp))] - [else (error who "invalid expression ~s" (unparse x))])) - (E x (lambda (x) (error who "free var ~s found" x)) - void)) - - -(define (remove-letrec x) - (define who 'remove-letrec) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(recbind lhs* rhs* body) - (let ([t* (map (lambda (lhs) (unique-var 'tmp)) lhs*)] - [v* (map (lambda (lhs) (make-primcall 'void '())) lhs*)]) - (make-bind lhs* v* - (make-bind t* (map Expr rhs*) - (let f ([lhs* lhs*] [t* t*]) - (cond - [(null? lhs*) (Expr body)] - [else - (make-seq - (make-assign (car lhs*) (car t*)) - (f (cdr lhs*) (cdr t*)))])))))] - ;[(fix lhs* rhs* body) - ; (Expr (make-recbind lhs* rhs* body))] - [(fix lhs* rhs* body) - (make-fix lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional - (Expr test) - (Expr conseq) - (Expr altern))] - [(seq e0 e1) - (make-seq (Expr e0) (Expr e1))] - [(clambda cls*) - (make-clambda - (map (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Expr body))])) - cls*))] - [(primcall rator rand*) - (make-primcall rator (map Expr rand*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall rator rand*) - (make-appcall (Expr rator) (map Expr rand*))] - [(forcall rator rand*) - (make-forcall rator (map Expr rand*))] - [(assign lhs rhs) - (make-assign lhs (Expr rhs))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - - -(define (uncover-assigned x) - (define who 'uncover-assigned) - (define (Expr* x*) - (for-each Expr x*)) - (define (Expr x) - (record-case x - [(constant) (void)] - [(var) (void)] - [(primref) (void)] - [(bind lhs* rhs* body) - (begin (Expr body) (Expr* rhs*))] - [(recbind lhs* rhs* body) - (begin (Expr body) (Expr* rhs*))] - [(fix lhs* rhs* body) - (Expr* rhs*) - (Expr body) - (when (ormap var-assigned lhs*) - (error 'uncover-assigned "a fix lhs is assigned"))] - [(conditional test conseq altern) - (begin (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (begin (Expr e0) (Expr e1))] - [(clambda cls*) - (for-each - (lambda (cls) - (Expr (clambda-case-body cls))) - cls*)] - [(primcall rator rand*) (Expr* rand*)] - [(funcall rator rand*) - (begin (Expr rator) (Expr* rand*))] - [(appcall rator rand*) - (begin (Expr rator) (Expr* rand*))] - [(forcall rator rand*) (Expr* rand*)] - [(assign lhs rhs) - (set-var-assigned! lhs #t) - (Expr rhs)] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - - -(define (rewrite-assignments x) - (define who 'rewrite-assignments) - (define (fix-lhs* lhs*) - (cond - [(null? lhs*) (values '() '() '())] - [else - (let ([x (car lhs*)]) - (let-values ([(lhs* a-lhs* a-rhs*) (fix-lhs* (cdr lhs*))]) - (cond - [(var-assigned x) - (let ([t (unique-var 'assignment-tmp)]) - (values (cons t lhs*) (cons x a-lhs*) (cons t a-rhs*)))] - [else - (values (cons x lhs*) a-lhs* a-rhs*)])))])) - (define (bind-assigned lhs* rhs* body) - (cond - [(null? lhs*) body] - [else - (make-bind lhs* - (map (lambda (rhs) (make-primcall 'vector (list rhs))) rhs*) - body)])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) - (cond - [(var-assigned x) - (make-primcall '$vector-ref (list x (make-constant 0)))] - [else x])] - [(primref) x] - [(bind lhs* rhs* body) - (let-values ([(lhs* a-lhs* a-rhs*) (fix-lhs* lhs*)]) - (make-bind lhs* (map Expr rhs*) - (bind-assigned a-lhs* a-rhs* (Expr body))))] - [(fix lhs* rhs* body) - (make-fix lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(clambda cls*) - (make-clambda - (map (lambda (cls) - (record-case cls - [(clambda-case fml* proper body) - (let-values ([(fml* a-lhs* a-rhs*) (fix-lhs* fml*)]) - (make-clambda-case fml* proper - (bind-assigned a-lhs* a-rhs* (Expr body))))])) - cls*))] - [(primcall op rand*) - (make-primcall op (map Expr rand*))] - [(forcall op rand*) - (make-forcall op (map Expr rand*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall rator rand*) - (make-appcall (Expr rator) (map Expr rand*))] - [(assign lhs rhs) - (unless (var-assigned lhs) - (error 'rewrite-assignments "not assigned ~s in ~s" lhs x)) - (make-primcall '$vector-set! (list lhs (make-constant 0) (Expr rhs)))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - -(define (remove-assignments x) - (uncover-assigned x) - (rewrite-assignments x)) - - - - - -(define (convert-closures prog) - (define who 'convert-closures) - (define (Expr* x*) - (cond - [(null? x*) (values '() '())] - [else - (let-values ([(a a-free) (Expr (car x*))] - [(d d-free) (Expr* (cdr x*))]) - (values (cons a d) (union a-free d-free)))])) - (define (do-clambda* x*) - (cond - [(null? x*) (values '() '())] - [else - (let-values ([(a a-free) (do-clambda (car x*))] - [(d d-free) (do-clambda* (cdr x*))]) - (values (cons a d) (union a-free d-free)))])) - (define (do-clambda x) - (record-case x - [(clambda cls*) - (let-values ([(cls* free) - (let f ([cls* cls*]) - (cond - [(null? cls*) (values '() '())] - [else - (record-case (car cls*) - [(clambda-case fml* proper body) - (let-values ([(body body-free) (Expr body)] - [(cls* cls*-free) (f (cdr cls*))]) - (values - (cons (make-clambda-case fml* proper body) - cls*) - (union (difference body-free fml*) - cls*-free)))])]))]) - (values (make-closure (make-clambda-code (gensym) cls* free) free) - free))])) - (define (Expr ex) - (record-case ex - [(constant) (values ex '())] - [(var) (values ex (singleton ex))] - [(primref) (values ex '())] - [(bind lhs* rhs* body) - (let-values ([(rhs* rhs-free) (Expr* rhs*)] - [(body body-free) (Expr body)]) - (values (make-bind lhs* rhs* body) - (union rhs-free (difference body-free lhs*))))] - [(fix lhs* rhs* body) - (let-values ([(rhs* rfree) (do-clambda* rhs*)] - [(body bfree) (Expr body)]) - (values (make-fix lhs* rhs* body) - (difference (union bfree rfree) lhs*)))] - [(conditional test conseq altern) - (let-values ([(test test-free) (Expr test)] - [(conseq conseq-free) (Expr conseq)] - [(altern altern-free) (Expr altern)]) - (values (make-conditional test conseq altern) - (union test-free (union conseq-free altern-free))))] - [(seq e0 e1) - (let-values ([(e0 e0-free) (Expr e0)] - [(e1 e1-free) (Expr e1)]) - (values (make-seq e0 e1) (union e0-free e1-free)))] - [(clambda) - (do-clambda ex)] - [(primcall op rand*) - (let-values ([(rand* rand*-free) (Expr* rand*)]) - (values (make-primcall op rand*) rand*-free))] - [(forcall op rand*) - (let-values ([(rand* rand*-free) (Expr* rand*)]) - (values (make-forcall op rand*) rand*-free))] - [(funcall rator rand*) - (let-values ([(rator rat-free) (Expr rator)] - [(rand* rand*-free) (Expr* rand*)]) - (values (make-funcall rator rand*) - (union rat-free rand*-free)))] - [(appcall rator rand*) - (let-values ([(rator rat-free) (Expr rator)] - [(rand* rand*-free) (Expr* rand*)]) - (values (make-appcall rator rand*) - (union rat-free rand*-free)))] - [else (error who "invalid expression ~s" (unparse ex))])) - (let-values ([(prog free) (Expr prog)]) - (unless (null? free) - (error 'convert-closures "free vars ~s encountered in ~a" - free (unparse prog))) - prog)) - - -(define (lift-codes x) - (define who 'lift-codes) - (define all-codes '()) - (define (do-code x) - (record-case x - [(clambda-code label cls* free) - (let ([cls* (map - (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (E body))])) - cls*)]) - (let ([g (make-code-loc label)]) - (set! all-codes - (cons (make-clambda-code label cls* free) all-codes)) - g))])) - (define (E x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map E rhs*) (E body))] - [(fix lhs* rhs* body) - (make-fix lhs* (map E rhs*) (E body))] - [(conditional test conseq altern) - (make-conditional (E test) (E conseq) (E altern))] - [(seq e0 e1) (make-seq (E e0) (E e1))] - [(closure c free) (make-closure (do-code c) free)] - [(primcall op rand*) (make-primcall op (map E rand*))] - [(forcall op rand*) (make-forcall op (map E rand*))] - [(funcall rator rand*) (make-funcall (E rator) (map E rand*))] - [(appcall rator rand*) (make-appcall (E rator) (map E rand*))] - [else (error who "invalid expression ~s" (unparse x))])) - (let ([x (E x)]) - (make-codes all-codes x))) - - - - -(define (syntactically-valid? op rand*) - (define (valid-arg-count? op rand*) - (let ([n (open-coded-primitive-args op)] [m (length rand*)]) - (cond - [(eq? n 'any) #t] - [(eq? n 'positive) (fx> m 1)] - [(eq? n 'no-code) - (error 'syntactically-valid - "should not primcall non codable prim ~s" op)] - [(fixnum? n) - (cond - [(fx= n m) #t] - [else - (error 'compile - "Possible incorrect number of args in ~s" - (cons op (map unparse rand*))) - #f])] - [else (error 'do-primcall "BUG: what ~s" n)]))) - (define (check op pred?) - (lambda (arg) - (record-case arg - [(constant c) - (cond - [(pred? c) #t] - [else - (error 'compile "Possible argument error to primitive ~s" op) - #f])] - [(primref) - (cond - [(pred? (lambda (x) x)) #t] - [else - (error 'compile "Possible argument error to primitive ~s" op) - #f])] - [else #t]))) - (define (nonnegative-fixnum? n) - (and (fixnum? n) (fx>= n 0))) - (define (byte? n) - (and (fixnum? n) (fx<= 0 n) (fx<= n 127))) - (define (valid-arg-types? op rand*) - (case op - [(fixnum? immediate? boolean? char? vector? string? procedure? - null? pair? not cons eq? vector symbol? error eof-object eof-object? - void $unbound-object? $code? $forward-ptr? bwp-object? - pointer-value top-level-value car cdr list* list $record - port? input-port? output-port? - $make-port/input $make-port/output $make-port/both - $port-handler - $port-input-buffer $port-input-index $port-input-size - $port-output-buffer $port-output-index $port-output-size - $set-port-input-index! $set-port-input-size! - $set-port-output-index! $set-port-output-size! ) - '#t] - [($fxadd1 $fxsub1 $fxzero? $fxlognot $fxlogor $fxlogand $fx+ $fx- $fx* - $fx= $fx< $fx<= $fx> $fx>= $fxquotient $fxmodulo $fxsll $fxsra $fxlogxor $exit) - (andmap (check op fixnum?) rand*)] - [($fixnum->char) - (andmap (check op byte?) rand*)] - [($char->fixnum $char= $char< $char<= $char> $char>= $string) - (andmap (check op char?) rand*)] - [($make-vector $make-string) - (andmap (check op nonnegative-fixnum?) rand*)] - [($car $cdr) - (andmap (check op pair?) rand*)] - [($vector-length) - (andmap (check op vector?) rand*)] - [($string-length) - (andmap (check op string?) rand*)] - [($set-car! $set-cdr!) - ((check op pair?) (car rand*))] - [($vector-ref $vector-set!) - (and ((check op vector?) (car rand*)) - ((check op nonnegative-fixnum?) (cadr rand*)))] - [($string-ref $string-set! - $string-ref-16+0 $string-ref-16+1 $string-ref-8+0 $string-ref-8+2) - (and ((check op string?) (car rand*)) - ((check op nonnegative-fixnum?) (cadr rand*)))] - [($symbol-string $symbol-unique-string) - (andmap (check op symbol?) rand*)] - [($constant-ref $set-constant! $intern $pcb-set! $pcb-ref $make-symbol - $symbol-value $set-symbol-value! $symbol-plist $set-symbol-plist! - $set-symbol-system-value! $set-symbol-system-value! - $set-symbol-unique-string! - $set-symbol-string! - $seal-frame-and-call $frame->continuation $code->closure - $code-size $code-reloc-vector $code-freevars - $code-ref $code-set! - $make-record $record? $record/rtd? $record-rtd $record-ref $record-set! - primitive-set! primitive-ref - $make-tcbucket $tcbucket-key $tcbucket-val $tcbucket-next - $set-tcbucket-val! $set-tcbucket-next! $set-tcbucket-tconc!) - #t] - [else (error 'valid-arg-types? "unhandled op ~s" op)])) - (and (valid-arg-count? op rand*) - (or (null? rand*) - (valid-arg-types? op rand*)))) - - -;;; the output of simplify-operands differs from the input in that the -;;; operands to primcalls are all simple (variables, primrefs, or constants). -;;; funcalls to open-codable primrefs whos arguments are "ok" are converted to -;;; primcalls. - - -(define uninlined '()) -(define (mark-uninlined x) - (cond - [(assq x uninlined) => - (lambda (p) (set-cdr! p (fxadd1 (cdr p))))] - [else (set! uninlined (cons (cons x 1) uninlined))])) - -(module () - (primitive-set! 'uninlined-stats - (lambda () - (let f ([ls uninlined] [ac '()]) - (cond - [(null? ls) ac] - [(fx> (cdar ls) 15) - (f (cdr ls) (cons (car ls) ac))] - [else (f (cdr ls) ac)]))))) - -(define (introduce-primcalls x) - (define who 'introduce-primcalls) - (define (simple? x) - (or (constant? x) (var? x) (primref? x))) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(fix lhs* rhs* body) - (make-fix lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (case op - ;[(values) - ; (if (fx= (length arg*) 1) - ; (Expr (car arg*)) - ; (begin - ; (warning 'compile "possible incorrect number of values") - ; (make-funcall (make-primref 'values) (map Expr arg*))))] - [else - (make-primcall op (map Expr arg*))])] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (cond - [(and (primref? rator) - (open-codeable? (primref-name rator)) - (syntactically-valid? (primref-name rator) rand*)) - (Expr (make-primcall (primref-name rator) rand*))] - [else - (when (primref? rator) - (mark-uninlined (primref-name rator))) - (make-funcall (Expr rator) (map Expr rand*))])] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(constant) (make-return x)] - [(var) (make-return x)] - [(primref) (make-return x)] - [(closure) (make-return x)] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(fix lhs* rhs* body) - (make-fix lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(primcall op arg*) - (case op - ;[(values) - ; (if (fx= (length arg*) 1) - ; (make-return (Expr (car arg*))) - ; (make-return* (map Expr arg*)))] - [else - (make-return (make-primcall op (map Expr arg*)))])] - [(forcall op arg*) - (make-return (make-forcall op (map Expr arg*)))] - [(funcall rator rand*) - (cond - [(and (primref? rator) - (open-codeable? (primref-name rator)) - (syntactically-valid? (primref-name rator) rand*)) - (Tail (make-primcall (primref-name rator) rand*))] - [else - (make-funcall (Expr rator) (map Expr rand*))])] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - -(define (simplify-operands x) - (define who 'simplify-operands) - (define (simple? x) - (or (constant? x) (var? x) (primref? x))) - (define (simplify arg lhs* rhs* k) - (if (simple? arg) - (k arg lhs* rhs*) - (let ([v (unique-var 'tmp)]) - (k v (cons v lhs*) (cons (Expr arg) rhs*))))) - (define (simplify* arg* lhs* rhs* k) - (cond - [(null? arg*) (k '() lhs* rhs*)] - [else - (simplify (car arg*) lhs* rhs* - (lambda (a lhs* rhs*) - (simplify* (cdr arg*) lhs* rhs* - (lambda (d lhs* rhs*) - (k (cons a d) lhs* rhs*)))))])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(fix lhs* rhs* body) - (make-fix lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (cond - [(memq op '(not car cdr)) - (make-primcall op (map Expr arg*))] - [else - (simplify* arg* '() '() - (lambda (arg* lhs* rhs*) - (make-bind^ lhs* rhs* - (make-primcall op arg*))))])] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (make-return (Expr v))] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(fix lhs* rhs* body) - (make-fix lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L clauses free) - (make-clambda-code L (map CaseExpr clauses) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - -(define (insert-stack-overflow-checks x) - (define who 'insert-stack-overflow-checks) - (define (insert-check body) - (make-seq - (make-conditional - (make-primcall '$fp-overflow '()) - (make-funcall (make-primref 'do-stack-overflow) '()) - (make-primcall 'void '())) - body)) - (define (Expr x) - (record-case x - [(constant) #f] - [(var) #f] - [(primref) #f] - [(closure code free*) #f] - [(bind lhs* rhs* body) - (or (ormap Expr rhs*) (Expr body))] - [(fix lhs* rhs* body) (Expr body)] - [(conditional test conseq altern) - (or (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (or (Expr e0) (Expr e1))] - [(primcall op arg*) (ormap Expr arg*)] - [(forcall op arg*) (ormap Expr arg*)] - [(funcall rator arg*) #t] - [(appcall rator arg*) #t] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (Expr v)] - [(bind lhs* rhs* body) - (or (ormap Expr rhs*) (Tail body))] - [(fix lhs* rhs* body) (Tail body)] - [(conditional test conseq altern) - (or (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (or (Expr e0) (Tail e1))] - [(funcall rator arg*) (or (Expr rator) (ormap Expr arg*))] - [(appcall rator arg*) (or (Expr rator) (ormap Expr arg*))] - [else (error who "invalid tail expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (if (Tail body) - (make-clambda-case fml* proper (insert-check body)) - x)])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) - (if (Tail body) - (insert-check body) - body))])) - (CodesExpr x)) - - -(define (insert-allocation-checks x) - (define who 'insert-allocation-checks) - (define (check-bytes n var body) - (make-seq - (make-conditional - (make-primcall '$ap-check-bytes - (list (make-constant n) var)) - (make-forcall "ik_collect" ;(make-primref 'do-overflow) - (list - (make-primcall '$fx+ - (list (make-constant (fx+ n 4096)) var)))) - (make-primcall 'void '())) - body)) - (define (check-words n var body) - (make-seq - (make-conditional - (make-primcall '$ap-check-words - (list (make-constant n) var)) - (make-forcall "ik_collect" ; (make-primref 'do-overflow-words) - (list - (make-primcall '$fx+ - (list (make-constant (fx+ n 4096)) var)))) - (make-primcall 'void '())) - body)) - (define (check-const n body) - (make-seq - (make-conditional - (make-primcall '$ap-check-const - (list (make-constant n))) - (make-forcall "ik_collect" ;(make-primref 'do-overflow) - (list (make-constant (fx+ n 4096)))) - (make-primcall 'void '())) - body)) - (define (closure-size x) - (record-case x - [(closure code free*) - (align (fx+ disp-closure-data (fx* (length free*) wordsize)))] - [else (error 'closure-size "~s is not a closure" x)])) - (define (sum ac ls) - (cond - [(null? ls) ac] - [else (sum (fx+ ac (car ls)) (cdr ls))])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure) - (check-const (closure-size x) x)] - [(fix lhs* rhs* body) - (if (null? lhs*) - (Expr body) - (check-const (sum 0 (map closure-size rhs*)) - (make-fix lhs* rhs* - (Expr body))))] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (let ([x (make-primcall op (map Expr arg*))]) - (case op - [(cons) (check-const pair-size x)] - [($make-symbol) (check-const symbol-size x)] - [($make-tcbucket) (check-const tcbucket-size x)] - [($frame->continuation $code->closure) - (check-const (fx+ disp-closure-data (fx* (length arg*) wordsize)) x)] - [($make-string) - (record-case (car arg*) - [(constant i) - (check-const (fx+ i (fx+ disp-string-data 1)) x)] - [else - (check-bytes (fxadd1 disp-string-data) (car arg*) x)])] - [($string) - (check-const (fx+ (length arg*) (fx+ disp-string-data 1)) x)] - [($make-port/input $make-port/output $make-port/both) - (check-const port-size x)] - [($make-vector) - (record-case (car arg*) - [(constant i) - (check-const (fx+ (fx* i wordsize) disp-vector-data) x)] - [else - (check-words (fxadd1 disp-vector-data) (car arg*) x)])] - [($make-record) - (record-case (cadr arg*) - [(constant i) - (check-const (fx+ (fx* i wordsize) disp-record-data) x)] - [else - (check-words (fxadd1 disp-record-data) (cadr arg*) x)])] - [(list*) - (check-const (fx* (fxsub1 (length arg*)) pair-size) x)] - [(list) - (check-const (fx* (length arg*) pair-size) x)] - [(vector $record) - (check-const (fx+ (fx* (length arg*) wordsize) disp-vector-data) x)] - [else x]))] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (make-return (Expr v))] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(fix lhs* rhs* body) - (if (null? lhs*) - (Tail body) - (check-const (sum 0 (map closure-size rhs*)) - (make-fix lhs* rhs* - (Tail body))))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - - -(define (remove-local-variables x) - (define who 'remove-local-variables) - (define (simple* x* r) - (map (lambda (x) - (cond - [(assq x r) => cdr] - [else - (when (var? x) (error who "unbound var ~s" x)) - x])) - x*)) - (define (env->mask r sz) - (let ([s (make-vector (fxsra (fx+ sz 7) 3) 0)]) - (for-each - (lambda (idx) - (let ([q (fxsra idx 3)] - [r (fxlogand idx 7)]) - (vector-set! s q - (fxlogor (vector-ref s q) (fxsll 1 r))))) - r) - s)) - (define (check? x) - (cond - [(primref? x) #f] ;;;; PRIMREF CHECK - [else #t])) - (define (do-new-frame op rand* si r call-convention rp-convention orig-live) - (make-new-frame (fxadd1 si) (fx+ (length rand*) 2) - (let f ([r* rand*] [nsi (fx+ si 2)] [live orig-live]) - (cond - [(null? r*) - (make-seq - (make-seq - (make-save-cp (make-frame-var si)) - (case call-convention - [(normal apply) - (make-eval-cp (check? op) (Expr op nsi r (cons si live)))] - [(foreign) - (make-eval-cp #f (make-foreign-label op))] - [else (error who "invalid convention ~s" call-convention)])) - (make-call-cp call-convention - rp-convention - (fxadd1 si) ; frame size - (length rand*) ; argc - (env->mask (cons si orig-live) ; cp and everything before it - (fxadd1 si))))] ; mask-size ~~ frame size - [else - (make-seq - (make-assign (make-frame-var nsi) - (Expr (car r*) nsi r live)) - (f (cdr r*) (fxadd1 nsi) (cons nsi live)))])))) - (define (nop) (make-primcall 'void '())) - (define (do-bind lhs* rhs* body si r live k) - (let f ([lhs* lhs*] [rhs* rhs*] [si si] [nr r] [live live]) - (cond - [(null? lhs*) (k body si nr live)] - [else - (let ([v (make-frame-var si)]) - (make-seq - (make-assign v (Expr (car rhs*) si r live)) - (f (cdr lhs*) (cdr rhs*) (fxadd1 si) - (cons (cons (car lhs*) v) nr) - (cons si live))))]))) - (define (do-closure r) - (lambda (x) - (record-case x - [(closure code free*) - (make-closure code (simple* free* r))]))) - (define (do-fix lhs* rhs* body si r live k) - (let f ([l* lhs*] [nlhs* '()] [si si] [r r] [live live]) - (cond - [(null? l*) - (make-fix (reverse nlhs*) - (map (do-closure r) rhs*) - (k body si r live))] - [else - (let ([v (make-frame-var si)]) - (f (cdr l*) (cons v nlhs*) (fxadd1 si) - (cons (cons (car l*) v) r) - (cons si live)))]))) - (define (do-tail-frame-old op rand* si r call-conv live) - (define (const? x) - (record-case x - [(constant) #t] - [(primref) #t] - [else #f])) - (define (evalrand* rand* i si r live) - (cond - [(null? rand*) - (make-eval-cp (check? op) (Expr op si r live))] - [(const? (car rand*)) - (evalrand* (cdr rand*) (fxadd1 i) (fxadd1 si) r live)] - [else - (let ([v (make-frame-var si)] - [rhs (Expr (car rand*) si r live)]) - (cond - [(and (frame-var? rhs) - (fx= (frame-var-idx rhs) i)) - (evalrand* (cdr rand*) (fx+ i 1) (fx+ si 1) r (cons si live))] - [else - (make-seq - (make-assign v rhs) - (evalrand* (cdr rand*) (fx+ 1 i) (fx+ 1 si) r - (cons si live)))]))])) - (define (moverand* rand* i si ac) - (cond - [(null? rand*) ac] - [(const? (car rand*)) - (make-seq - (make-assign (make-frame-var i) (car rand*)) - (moverand* (cdr rand*) (fxadd1 i) (fxadd1 si) ac))] - [else - (make-seq - (make-assign (make-frame-var i) (make-frame-var si)) - (moverand* (cdr rand*) (fxadd1 i) (fxadd1 si) ac))])) - (make-seq - (evalrand* rand* 1 si r live) - (moverand* rand* 1 si - (make-tailcall-cp call-conv (length rand*))))) - (define (do-tail-frame op rand* si r call-conv live) - (define (const? x) - (record-case x - [(constant) #t] - [(primref) #t] - [else #f])) - (define (evalrand* rand* i si r live ac) - (cond - [(null? rand*) - (make-seq - (make-eval-cp (check? op) (Expr op si r live)) - ac)] - [(const? (car rand*)) - (evalrand* (cdr rand*) (fxadd1 i) (fxadd1 si) r live - (make-seq ac - (make-assign (make-frame-var i) (car rand*))))] - [else - (let ([vsi (make-frame-var si)] - [rhs (Expr (car rand*) si r live)]) - (cond - [(and (frame-var? rhs) - (fx= (frame-var-idx rhs) i)) - (evalrand* (cdr rand*) (fx+ i 1) (fx+ si 1) r (cons si live) ac)] - [(fx= i si) - (make-seq - (make-assign vsi rhs) - (evalrand* (cdr rand*) (fx+ i 1) (fx+ si 1) r - (cons si live) ac))] - [else - (make-seq - (make-assign vsi rhs) - (evalrand* (cdr rand*) (fxadd1 i) (fxadd1 si) r (cons si live) - (make-seq ac - (make-assign (make-frame-var i) vsi))))]))])) - (make-seq - (evalrand* rand* 1 si r live (make-primcall 'void '())) - (make-tailcall-cp call-conv (length rand*)))) - (define (Tail x si r live) - (record-case x - [(return v) (make-return (Expr v si r live))] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Tail)] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* body si r live Tail)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Tail conseq si r live) - (Tail altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Tail e1 si r live))] - [(primcall op arg*) - (make-return - (make-primcall op - (map (lambda (x) (Expr x si r live)) arg*)))] - - [(funcall op rand*) - (do-tail-frame op rand* si r 'normal live)] - [(appcall op rand*) - (do-tail-frame op rand* si r 'apply live)] -;;; [(funcall op rand*) -;;; (do-new-frame op rand* si r 'normal 'tail live)] -;;; [(appcall op rand*) -;;; (do-new-frame op rand* si r 'apply 'tail live)] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Effect x si r live) - (record-case x - [(constant) (nop)] - [(var) (nop)] - [(primref) (nop)] - [(closure code free*) (nop)] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Effect)] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* body si r live Effect)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Effect conseq si r live) - (Effect altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Effect e1 si r live))] - [(primcall op arg*) - (make-primcall op - (map (lambda (x) (Expr x si r live)) arg*))] - [(forcall op rand*) - (do-new-frame op rand* si r 'foreign 'effect live)] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'effect live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'effect live)] - [else (error who "invalid effect expression ~s" (unparse x))])) - (define (Expr x si r live) - (record-case x - [(constant) x] - [(var) - (cond - [(assq x r) => cdr] - [else (error who "unbound var ~s" x)])] - [(primref) x] - [(closure code free*) - (make-closure code (simple* free* r))] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Expr)] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* body si r live Expr)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Expr conseq si r live) - (Expr altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Expr e1 si r live))] - [(primcall op arg*) - (make-primcall op - (map (lambda (x) (Expr x si r live)) arg*))] - [(forcall op rand*) - (do-new-frame op rand* si r 'foreign 'value live)] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'value live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'value live)] - [else (error who "invalid expression ~s" (unparse x))])) - (define (bind-fml* fml* r) - (let f ([si 1] [fml* fml*]) - (cond - [(null? fml*) (values '() si r '())] - [else - (let-values ([(nfml* nsi r live) (f (fxadd1 si) (cdr fml*))]) - (let ([v (make-frame-var si)]) - (values (cons v nfml*) - nsi - (cons (cons (car fml*) v) r) - (cons si live))))]))) - (define (bind-free* free*) - (let f ([free* free*] [idx 0] [r '()]) - (cond - [(null? free*) r] - [else - (f (cdr free*) (fxadd1 idx) - (cons (cons (car free*) (make-cp-var idx)) r))]))) - (define CaseExpr - (lambda (r) - (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (let-values ([(fml* si r live) (bind-fml* fml* r)]) - (make-clambda-case fml* proper (Tail body si r live)))])))) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (let ([r (bind-free* free)]) - (make-clambda-code L (map (CaseExpr r) cases) free))])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) - (Tail body 1 '() '()))])) - (CodesExpr x)) - - - -(define checks-elim-count 0) -(define (optimize-ap-check x) - (define who 'optimize-ap-check) - (define (min x y) - (if (fx< x y) x y)) - (define (Tail x f) - (record-case x - [(return v) - (let-values ([(v f) (NonTail v f)]) - (make-return v))] - [(fix lhs* rhs* body) - (make-fix lhs* rhs* (Tail body f))] - [(conditional test conseq altern) - (let-values ([(test f) (NonTail test f)]) - (make-conditional - test - (Tail conseq f) - (Tail altern f)))] - [(seq e0 e1) - (let-values ([(e0 f) (NonTail e0 f)]) - (make-seq e0 (Tail e1 f)))] - [(tailcall-cp) x] - [else (error who "invalid tail expression ~s" (unparse x))])) - (define (do-primcall op arg* f) - (case op - [($ap-check-const) - (let ([n (constant-value (car arg*))]) - (cond - [(fx< n f) - ;(set! checks-elim-count (fxadd1 checks-elim-count)) - ;(printf "~s checks eliminated\n" checks-elim-count) - (values (make-constant #f) (fx- f n))] - [(fx<= n 4096) - (values (make-primcall '$ap-check-const - (list (make-constant 4096))) - (fx- 4096 n))] - [else - (values (make-primcall '$ap-check-const - (list (make-constant (fx+ n 4096)))) - 4096)]))] - [($ap-check-bytes $ap-check-words) - (values (make-primcall op - (list (make-constant (fx+ (constant-value (car arg*)) - 4096)) - (cadr arg*))) - 4096)] - [else (values (make-primcall op arg*) f)])) - (define (NonTail x f) - (record-case x - [(constant) (values x f)] - [(frame-var) (values x f)] - [(cp-var) (values x f)] - [(save-cp) (values x f)] - [(foreign-label) (values x f)] - [(primref) (values x f)] - [(closure) (values x f)] - [(call-cp call-conv) - (if (eq? call-conv 'foreign) - (values x f) - (values x 0))] - [(primcall op arg*) (do-primcall op arg* f)] - [(fix lhs* rhs* body) - (let-values ([(body f) (NonTail body f)]) - (values (make-fix lhs* rhs* body) f))] - [(conditional test conseq altern) - (let-values ([(test f) (NonTail test f)]) - (if (constant? test) - (if (constant-value test) - (NonTail conseq f) - (NonTail altern f)) - (let-values ([(conseq f0) (NonTail conseq f)] - [(altern f1) (NonTail altern f)]) - (values (make-conditional test conseq altern) - (min f0 f1)))))] - [(seq e0 e1) - (let-values ([(e0 f) (NonTail e0 f)]) - (let-values ([(e1 f) (NonTail e1 f)]) - (values (make-seq e0 e1) f)))] - [(assign lhs rhs) - (let-values ([(rhs f) (NonTail rhs f)]) - (values (make-assign lhs rhs) f))] - [(eval-cp check body) - (let-values ([(body f) (NonTail body f)]) - (values (make-eval-cp check body) f))] - [(new-frame base-idx size body) - (let-values ([(body f) (NonTail body f)]) - (values (make-new-frame base-idx size body) f))] - [else (error who "invalid nontail expression ~s" (unparse x))])) - (define CaseExpr - (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body 0))]))) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) - (Tail body 0))])) - (CodesExpr x)) - -(begin - (define fx-shift 2) - (define fx-mask #x03) - (define fx-tag 0) - (define bool-f #x2F) - (define bool-t #x3F) - (define bool-mask #xEF) - (define bool-tag #x2F) - (define bool-shift 4) - (define nil #x4F) - (define eof #x5F) ; double check - (define unbound #x6F) ; double check - (define void-object #x7F) ; double check - (define bwp-object #x8F) ; double check - (define char-shift 8) - (define char-tag #x0F) - (define char-mask #xFF) - (define pair-mask 7) - (define pair-tag 1) - (define disp-car 0) - (define disp-cdr 4) - (define pair-size 8) - (define pagesize 4096) - (define pageshift 12) - (define wordsize 4) - (define wordshift 2) - - (define symbol-mask 7) - (define symbol-tag 2) - (define disp-symbol-string 0) - (define disp-symbol-unique-string 4) - (define disp-symbol-value 8) - (define disp-symbol-plist 12) - (define disp-symbol-system-value 16) - (define disp-symbol-system-plist 20) - (define symbol-size 24) - (define vector-tag 5) - (define vector-mask 7) - (define disp-vector-length 0) - (define disp-vector-data 4) - (define string-mask 7) - (define string-tag 6) - (define disp-string-length 0) - (define disp-string-data 4) - (define closure-mask 7) - (define closure-tag 3) - (define disp-closure-data 4) - (define disp-closure-code 0) - (define continuation-size 16) - (define continuation-tag #x1F) - (define disp-continuation-top 4) - (define disp-continuation-size 8) - (define disp-continuation-next 12) - (define code-tag #x2F) - (define disp-code-instrsize 4) - (define disp-code-relocsize 8) - (define disp-code-freevars 12) - (define disp-code-data 16) - (define port-tag #x3F) - (define input-port-tag #x7F) - (define output-port-tag #xBF) - (define input/output-port-tag #xFF) - (define port-mask #x3F) - (define disp-port-handler 4) - (define disp-port-input-buffer 8) - (define disp-port-input-index 12) - (define disp-port-input-size 16) - (define disp-port-output-buffer 20) - (define disp-port-output-index 24) - (define disp-port-output-size 28) - (define port-size 32) - (define disp-tcbucket-tconc 0) - (define disp-tcbucket-key 4) - (define disp-tcbucket-val 8) - (define disp-tcbucket-next 12) - (define tcbucket-size 16) - (define record-ptag 5) - (define record-pmask 7) - (define disp-record-rtd 0) - (define disp-record-data 4) - (define disp-frame-size -17) - (define disp-frame-offset -13) - (define disp-multivalue-rp -9) - (define object-alignment 8) - (define align-shift 3) - (define dirty-word -1)) - -(define (align n) - (fxsll (fxsra (fx+ n (fxsub1 object-alignment)) align-shift) align-shift)) - -(begin - (define (mem off val) - (cond - [(fixnum? off) (list 'disp (int off) val)] - [(register? off) (list 'disp off val)] - [else (error 'mem "invalid disp ~s" off)])) - (define (int x) (list 'int x)) - (define (obj x) (list 'obj x)) - (define (byte x) (list 'byte x)) - (define (byte-vector x) (list 'byte-vector x)) - (define (movzbl src targ) (list 'movzbl src targ)) - (define (sall src targ) (list 'sall src targ)) - (define (sarl src targ) (list 'sarl src targ)) - (define (shrl src targ) (list 'shrl src targ)) - (define (notl src) (list 'notl src)) - (define (pushl src) (list 'pushl src)) - (define (popl src) (list 'popl src)) - (define (orl src targ) (list 'orl src targ)) - (define (xorl src targ) (list 'xorl src targ)) - (define (andl src targ) (list 'andl src targ)) - (define (movl src targ) (list 'movl src targ)) - (define (movb src targ) (list 'movb src targ)) - (define (addl src targ) (list 'addl src targ)) - (define (imull src targ) (list 'imull src targ)) - (define (idivl src) (list 'idivl src)) - (define (subl src targ) (list 'subl src targ)) - (define (push src) (list 'push src)) - (define (pop targ) (list 'pop targ)) - (define (sete targ) (list 'sete targ)) - (define (call targ) (list 'call targ)) - (define (tail-indirect-cpr-call) - (jmp (mem (fx- disp-closure-code closure-tag) cpr))) - (define (indirect-cpr-call) - (call (mem (fx- disp-closure-code closure-tag) cpr))) - (define (negl targ) (list 'negl targ)) - (define (label x) (list 'label x)) - (define (label-address x) (list 'label-address x)) - (define (ret) '(ret)) - (define (cltd) '(cltd)) - (define (cmpl arg1 arg2) (list 'cmpl arg1 arg2)) - (define (je label) (list 'je label)) - (define (jne label) (list 'jne label)) - (define (jle label) (list 'jle label)) - (define (jge label) (list 'jge label)) - (define (jg label) (list 'jg label)) - (define (jl label) (list 'jl label)) - (define (jb label) (list 'jb label)) - (define (ja label) (list 'ja label)) - (define (jmp label) (list 'jmp label)) - (define edi '%edx) ; closure pointer - (define esi '%esi) ; pcb - (define ebp '%ebp) ; allocation pointer - (define esp '%esp) ; stack base pointer - (define al '%al) - (define ah '%ah) - (define bh '%bh) - (define cl '%cl) - (define eax '%eax) - (define ebx '%ebx) - (define ecx '%ecx) - (define edx '%edx) - (define apr '%ebp) - (define fpr '%esp) - (define cpr '%edi) - (define pcr '%esi) - (define register? symbol?) - (define (argc-convention n) - (fx- 0 (fxsll n fx-shift)))) - - -(define pcb-ref - (lambda (x) - (case x - [(allocation-pointer) (mem 0 pcr)] - [(allocation-redline) (mem 4 pcr)] - [(frame-pointer) (mem 8 pcr)] - [(frame-base) (mem 12 pcr)] - [(frame-redline) (mem 16 pcr)] - [(next-continuation) (mem 20 pcr)] - [(system-stack) (mem 24 pcr)] - [(dirty-vector) (mem 28 pcr)] - [else (error 'pcb-ref "invalid arg ~s" x)]))) - -(define (primref-loc op) - (unless (symbol? op) (error 'primref-loc "not a symbol ~s" op)) - (mem (fx- disp-symbol-system-value symbol-tag) - (obj op))) - - -(define (generate-code x) - (define who 'generate-code) - (define (rp-label x) - (case x - [(value) (label-address SL_multiple_values_error_rp)] - [(effect) (label-address SL_multiple_values_ignore_rp)] - [else (error who "invalid rp-convention ~s" x)])) - (define unique-label - (lambda () - (label (gensym)))) - (define (constant-val x) - (cond - [(fixnum? x) (obj x)] - [(boolean? x) (int (if x bool-t bool-f))] - [(null? x) (int nil)] - [(char? x) (int (fx+ (fxsll (char->integer x) char-shift) char-tag))] - [(eq? x (void)) (int void-object)] - [else (obj x)])) - (define (cond-branch op Lt Lf ac) - (define (opposite x) - (cadr (assq x '([je jne] [jl jge] [jle jg] [jg jle] [jge jl])))) - (unless (or Lt Lf) - (error 'cond-branch "no labels")) - (cond - [(not Lf) (cons (list op Lt) ac)] - [(not Lt) (cons (list (opposite op) Lf) ac)] - [else (list* (list op Lt) (jmp Lf) ac)])) - (define (indirect-type-pred pri-mask pri-tag sec-mask sec-tag rand* Lt Lf ac) - (cond - [(and Lt Lf) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne Lf) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (jne Lf) - (jmp Lt) - ac)] - [Lf - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne Lf) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (jne Lf) - ac)] - [Lt - (let ([L_END (unique-label)]) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne L_END) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (je Lt) - L_END - ac))] - [else ac])) - (define (type-pred mask tag rand* Lt Lf ac) - (cond - [mask - (list* - (movl (Simple (car rand*)) eax) - (andl (int mask) eax) - (cmpl (int tag) eax) - (cond-branch 'je Lt Lf ac))] - [else - (let ([v (Simple (car rand*))]) - (cond - [(memq (car v) '(mem register)) - (list* - (cmpl (int tag) (Simple (car rand*))) - (cond-branch 'je Lt Lf ac))] - [else - (list* - (movl (Simple (car rand*)) eax) - (cmpl (int tag) eax) - (cond-branch 'je Lt Lf ac))]))])) - (define (compare-and-branch op rand* Lt Lf ac) - (define (opposite x) - (cadr (assq x '([je je] [jl jg] [jle jge] [jg jl] [jge jle])))) - (cond - [(and (constant? (car rand*)) (constant? (cadr rand*))) - (list* - (movl (Simple (car rand*)) eax) - (cmpl (Simple (cadr rand*)) eax) - (cond-branch op Lt Lf ac))] - [(constant? (cadr rand*)) - (list* - (cmpl (Simple (cadr rand*)) (Simple (car rand*))) - (cond-branch op Lt Lf ac))] - [(constant? (car rand*)) - (list* - (cmpl (Simple (car rand*)) (Simple (cadr rand*))) - (cond-branch (opposite op) Lt Lf ac))] - [else - (list* - (movl (Simple (car rand*)) eax) - (cmpl (Simple (cadr rand*)) eax) - (cond-branch op Lt Lf ac))])) - (define (do-pred-prim op rand* Lt Lf ac) - (case op - [(fixnum?) (type-pred fx-mask fx-tag rand* Lt Lf ac)] - [(pair?) (type-pred pair-mask pair-tag rand* Lt Lf ac)] - [(char?) (type-pred char-mask char-tag rand* Lt Lf ac)] - [(string?) (type-pred string-mask string-tag rand* Lt Lf ac)] - [(symbol?) (type-pred symbol-mask symbol-tag rand* Lt Lf ac)] - [(procedure?) (type-pred closure-mask closure-tag rand* Lt Lf ac)] - [(boolean?) (type-pred bool-mask bool-tag rand* Lt Lf ac)] - [(null?) (type-pred #f nil rand* Lt Lf ac)] - [($unbound-object?) (type-pred #f unbound rand* Lt Lf ac)] - [($forward-ptr?) (type-pred #f -1 rand* Lt Lf ac)] - [(not) (Pred (car rand*) Lf Lt ac)] - ;[(not) (type-pred #f bool-f rand* Lt Lf ac)] - [(eof-object?) (type-pred #f eof rand* Lt Lf ac)] - [(bwp-object?) (type-pred #f bwp-object rand* Lt Lf ac)] - [($code?) - (indirect-type-pred vector-mask vector-tag #f code-tag - rand* Lt Lf ac)] - [($fxzero?) (type-pred #f 0 rand* Lt Lf ac)] - [($fx= $char= eq?) (compare-and-branch 'je rand* Lt Lf ac)] - [($fx< $char<) (compare-and-branch 'jl rand* Lt Lf ac)] - [($fx<= $char<=) (compare-and-branch 'jle rand* Lt Lf ac)] - [($fx> $char>) (compare-and-branch 'jg rand* Lt Lf ac)] - [($fx>= $char>=) (compare-and-branch 'jge rand* Lt Lf ac)] - [(vector?) - (indirect-type-pred vector-mask vector-tag fx-mask fx-tag - rand* Lt Lf ac)] - [($record?) - (indirect-type-pred record-pmask record-ptag record-pmask record-ptag - rand* Lt Lf ac)] - [(output-port?) - (indirect-type-pred - vector-mask vector-tag #f output-port-tag rand* Lt Lf ac)] - [(input-port?) - (indirect-type-pred - vector-mask vector-tag #f input-port-tag rand* Lt Lf ac)] - [(port?) - (indirect-type-pred - vector-mask vector-tag port-mask port-tag rand* Lt Lf ac)] - [($record/rtd?) - (cond - [Lf - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int vector-mask) eax) - (cmpl (int vector-tag) eax) - (jne Lf) - (movl (Simple (cadr rand*)) eax) - (cmpl (mem (fx- disp-record-rtd vector-tag) ebx) eax) - (jne Lf) - (if Lt - (cons (jmp Lt) ac) - ac))] - [Lt - (let ([Ljoin (unique-label)]) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int vector-mask) eax) - (cmpl (int vector-tag) eax) - (jne Ljoin) - (movl (Simple (cadr rand*)) eax) - (cmpl (mem (fx- disp-record-rtd vector-tag) ebx) eax) - (je Lt) - Ljoin - ac))] - [else ac])] - [(immediate?) - (cond - [(and Lt Lf) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Lt) - (andl (int 7) eax) - (cmpl (int 7) eax) - (je Lt) - (jmp Lf) - ac)] - [Lt - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Lt) - (andl (int 7) eax) - (cmpl (int 7) eax) - (je Lt) - ac)] - [Lf - (let ([Ljoin (unique-label)]) - (list* - (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Ljoin) - (andl (int 7) eax) - (cmpl (int 7) eax) - (jne Lf) - Ljoin - ac))] - [else ac])] - [($ap-check-words) - (record-case (car rand*) - [(constant i) - (list* (movl (pcb-ref 'allocation-redline) eax) - (subl (Simple (cadr rand*)) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac))] - [else (error who "ap-check-words")])] - [($ap-check-bytes) - (record-case (car rand*) - [(constant i) - (list* (movl (Simple (cadr rand*)) eax) - (negl eax) - (addl (pcb-ref 'allocation-redline) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac))] - [else (error who "ap-check-bytes")])] - [($ap-check-const) - (record-case (car rand*) - [(constant i) - (if (fx<= i pagesize) - (list* - (cmpl (pcb-ref 'allocation-redline) apr) - (cond-branch 'jge Lt Lf ac)) - (list* - (movl (pcb-ref 'allocation-redline) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac)))] - [else (error who "ap-check-const")])] - [($fp-at-base) - (list* - (movl (pcb-ref 'frame-base) eax) - (subl (int wordsize) eax) - (cmpl eax fpr) - (cond-branch 'je Lt Lf ac))] - [($fp-overflow) - (list* (cmpl (pcb-ref 'frame-redline) fpr) - (cond-branch 'jle Lt Lf ac))] - [($vector-ref top-level-value car cdr $record-ref) - (do-value-prim op rand* - (do-simple-test eax Lt Lf ac))] - [(cons void $fxadd1 $fxsub1) - ;;; always true - (do-effect-prim op rand* - (cond - [(not Lt) ac] - [else (cons (jmp Lt) ac)]))] - [else - (error 'pred-prim "HERE unhandled ~s" op)])) - (define (do-pred->value-prim op rand* ac) - (case op - [else - (let ([Lf (unique-label)] [Lj (unique-label)]) - (do-pred-prim op rand* #f Lf - (list* (movl (constant-val #t) eax) - (jmp Lj) - Lf - (movl (constant-val #f) eax) - Lj - ac)))])) - (define (indirect-ref arg* off ac) - (list* - (movl (Simple (car arg*)) eax) - (movl (mem off eax) eax) - ac)) - (define (do-make-port tag args ac) - (let f ([args args] [idx disp-vector-data]) - (cond - [(null? args) - (if (fx= idx port-size) - (list* - (movl (int tag) (mem 0 apr)) - (movl apr eax) - (addl (int port-size) apr) - (addl (int vector-tag) eax) - ac) - (error 'do-make-port "BUG"))] - [else - (list* - (movl (Simple (car args)) eax) - (movl eax (mem idx apr)) - (f (cdr args) (fx+ idx wordsize)))]))) - (define (do-value-prim op arg* ac) - (case op - [(eof-object) (cons (movl (int eof) eax) ac)] - [(void) (cons (movl (int void-object) eax) ac)] - [($fxadd1) - (list* (movl (Simple (car arg*)) eax) - (addl (constant-val 1) eax) - ac)] - [($fxsub1) - (list* (movl (Simple (car arg*)) eax) - (addl (constant-val -1) eax) - ac)] - [($fx+) - (list* (movl (Simple (car arg*)) eax) - (addl (Simple (cadr arg*)) eax) - ac)] - [($fx-) - (list* (movl (Simple (car arg*)) eax) - (subl (Simple (cadr arg*)) eax) - ac)] - [($fx*) - (cond - [(constant? (car arg*)) - (record-case (car arg*) - [(constant c) - (unless (fixnum? c) - (error who "invalid arg ~s to fx*" c)) - (list* (movl (Simple (cadr arg*)) eax) - (imull (int c) eax) - ac)])] - [(constant? (cadr arg*)) - (record-case (cadr arg*) - [(constant c) - (unless (fixnum? c) - (error who "invalid arg ~s to fx*" c)) - (list* (movl (Simple (car arg*)) eax) - (imull (int c) eax) - ac)])] - [else - (list* (movl (Simple (car arg*)) eax) - (sarl (int fx-shift) eax) - (imull (Simple (cadr arg*)) eax) - ac)])] - [($fxquotient) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (cltd) - (idivl ecx) - (sall (int fx-shift) eax) - ac)] - [($fxmodulo) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl eax ecx) - (xorl ebx ecx) - (sarl (int (fxsub1 (fx* wordsize 8))) ecx) - (andl ebx ecx) - (cltd) - (idivl ebx) - (movl edx eax) - (addl ecx eax) - ac)] - [($fxlogor) - (list* (movl (Simple (car arg*)) eax) - (orl (Simple (cadr arg*)) eax) - ac)] - [($fxlogand) - (list* (movl (Simple (car arg*)) eax) - (andl (Simple (cadr arg*)) eax) - ac)] - [($fxlogxor) - (list* (movl (Simple (car arg*)) eax) - (xorl (Simple (cadr arg*)) eax) - ac)] - [($fxsra) - (record-case (cadr arg*) - [(constant i) - (unless (fixnum? i) (error who "invalid arg to fxsra")) - (list* (movl (Simple (car arg*)) eax) - (sarl (int (fx+ i fx-shift)) eax) - (sall (int fx-shift) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (sarl (int fx-shift) ecx) - (sarl (int fx-shift) eax) - (sarl cl eax) - (sall (int fx-shift) eax) - ac)])] - [($fxsll) - (record-case (cadr arg*) - [(constant i) - (unless (fixnum? i) (error who "invalid arg to fxsll")) - (list* (movl (Simple (car arg*)) eax) - (sall (int i) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (sarl (int fx-shift) ecx) - (sall cl eax) - ac)])] - [($fixnum->char) - (list* (movl (Simple (car arg*)) eax) - (sall (int (fx- char-shift fx-shift)) eax) - (orl (int char-tag) eax) - ac)] - [($char->fixnum) - (list* (movl (Simple (car arg*)) eax) - (sarl (int (fx- char-shift fx-shift)) eax) - ac)] - [($fxlognot) - (list* (movl (Simple (car arg*)) eax) - (orl (int fx-mask) eax) - (notl eax) - ac)] - [($car) (indirect-ref arg* (fx- disp-car pair-tag) ac)] - [($cdr) (indirect-ref arg* (fx- disp-cdr pair-tag) ac)] - [($vector-length) - (indirect-ref arg* (fx- disp-vector-length vector-tag) ac)] - [($string-length) - (indirect-ref arg* (fx- disp-string-length string-tag) ac)] - [($symbol-string) - (indirect-ref arg* (fx- disp-symbol-string symbol-tag) ac)] - [($symbol-unique-string) - (indirect-ref arg* (fx- disp-symbol-unique-string symbol-tag) ac)] - [($symbol-value) - (indirect-ref arg* (fx- disp-symbol-value symbol-tag) ac)] - [(primitive-ref) - (indirect-ref arg* (fx- disp-symbol-system-value symbol-tag) ac)] - [($tcbucket-key) - (indirect-ref arg* (fx- disp-tcbucket-key vector-tag) ac)] - [($tcbucket-val) - (indirect-ref arg* (fx- disp-tcbucket-val vector-tag) ac)] - [($tcbucket-next) - (indirect-ref arg* (fx- disp-tcbucket-next vector-tag) ac)] - [($port-handler) - (indirect-ref arg* (fx- disp-port-handler vector-tag) ac)] - [($port-input-buffer) - (indirect-ref arg* (fx- disp-port-input-buffer vector-tag) ac)] - [($port-input-index) - (indirect-ref arg* (fx- disp-port-input-index vector-tag) ac)] - [($port-input-size) - (indirect-ref arg* (fx- disp-port-input-size vector-tag) ac)] - [($port-output-buffer) - (indirect-ref arg* (fx- disp-port-output-buffer vector-tag) ac)] - [($port-output-index) - (indirect-ref arg* (fx- disp-port-output-index vector-tag) ac)] - [($port-output-size) - (indirect-ref arg* (fx- disp-port-output-size vector-tag) ac)] - [(pointer-value) - (list* - (movl (Simple (car arg*)) eax) - (sarl (int fx-shift) eax) - (sall (int fx-shift) eax) - ac)] - [($symbol-plist) - (indirect-ref arg* (fx- disp-symbol-plist symbol-tag) ac)] - [($record-rtd) - (indirect-ref arg* (fx- disp-record-rtd record-ptag) ac)] - [($constant-ref) - (list* (movl (Simple (car arg*)) eax) ac)] - [(car cdr) - (let ([x (car arg*)]) - (NonTail x - (list* - (movl eax ebx) - (andl (int pair-mask) eax) - (cmpl (int pair-tag) eax) - (if (eq? op 'car) - (list* - (jne (label SL_car_error)) - (movl (mem (fx- disp-car pair-tag) ebx) eax) - ac) - (list* - (jne (label SL_cdr_error)) - (movl (mem (fx- disp-cdr pair-tag) ebx) eax) - ac)))))] - [(top-level-value) - (let ([x (car arg*)]) - (cond - [(constant? x) - (let ([v (constant-value x)]) - (cond - [(symbol? v) - (list* - (movl (mem (fx- disp-symbol-value symbol-tag) (obj v)) eax) - (movl (obj v) ebx) - (cmpl (int unbound) eax) - (je (label SL_top_level_value_error)) - ac)] - [else - (list* - (movl (obj v) ebx) - (jmp (label SL_top_level_value_error)) - ac)]))] - [else - (NonTail x - (list* - (movl eax ebx) - (andl (int symbol-mask) eax) - (cmpl (int symbol-tag) eax) - (jne (label SL_top_level_value_error)) - (movl (mem (fx- disp-symbol-value symbol-tag) ebx) eax) - (cmpl (int unbound) eax) - (je (label SL_top_level_value_error)) - ac))]))] - [($vector-ref) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (mem (fx- disp-vector-data vector-tag) ebx) eax) - ac)] - [($record-ref) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (mem (fx- disp-record-data record-ptag) ebx) eax) - ac)] - [($code-ref) - (list* (movl (Simple (cadr arg*)) ebx) - (sarl (int fx-shift) ebx) - (addl (Simple (car arg*)) ebx) - (movl (int 0) eax) - (movb (mem (fx- disp-code-data vector-tag) ebx) ah) - (sarl (int (fx- 8 fx-shift)) eax) - ac)] - [($string-ref) - (list* (movl (Simple (cadr arg*)) ebx) - (sarl (int fx-shift) ebx) - (addl (Simple (car arg*)) ebx) - (movl (int char-tag) eax) - (movb (mem (fx- disp-string-data string-tag) ebx) ah) - ac)] - [($make-string) - (list* (movl (Simple (car arg*)) ebx) - (movl ebx (mem disp-string-length apr)) - (movl apr eax) - (addl (int string-tag) eax) - (sarl (int fx-shift) ebx) - (addl ebx apr) - (movb (int 0) (mem disp-string-data apr)) - (addl (int (fx+ disp-string-data object-alignment)) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [($make-vector) - (list* (movl (Simple (car arg*)) ebx) - (movl ebx (mem disp-vector-length apr)) - (movl apr eax) - (addl (int vector-tag) eax) - (addl ebx apr) - (addl (int (fx+ disp-vector-data (fxsub1 object-alignment))) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [($make-record) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-record-rtd apr)) - (movl apr eax) - (addl (int record-ptag) eax) - (addl (Simple (cadr arg*)) apr) - (addl (int (fx+ disp-record-data (fxsub1 object-alignment))) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [(cons) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl eax (mem disp-car apr)) - (movl apr eax) - (movl ebx (mem disp-cdr apr)) - (addl (int pair-tag) eax) - (addl (int (align pair-size)) apr) - ac)] - [(list) - (cond - [(null? arg*) (NonTail (make-constant '()) ac)] - [else - (list* - (addl (int pair-tag) apr) - (movl apr eax) - (let f ([a (car arg*)] [d (cdr arg*)]) - (list* - (movl (Simple a) ebx) - (movl ebx (mem (fx- disp-car pair-tag) apr)) - (if (null? d) - (list* - (movl (int nil) (mem (fx- disp-cdr pair-tag) apr)) - (addl (int (fx- pair-size pair-tag)) apr) - ac) - (list* - (addl (int pair-size) apr) - (movl apr - (mem (fx- disp-cdr (fx+ pair-tag pair-size)) apr)) - (f (car d) (cdr d)))))))])] - [(list*) - (cond - [(fx= (length arg*) 1) (NonTail (car arg*) ac)] - [(fx= (length arg*) 2) (NonTail (make-primcall 'cons arg*) ac)] - [else - (list* - (addl (int pair-tag) apr) - (movl apr eax) - (let f ([a (car arg*)] [b (cadr arg*)] [d (cddr arg*)]) - (list* - (movl (Simple a) ebx) - (movl ebx (mem (fx- disp-car pair-tag) apr)) - (if (null? d) - (list* - (movl (Simple b) ebx) - (movl ebx (mem (fx- disp-cdr pair-tag) apr)) - (addl (int (fx- pair-size pair-tag)) apr) - ac) - (list* - (addl (int pair-size) apr) - (movl apr - (mem (fx- disp-cdr (fx+ pair-tag pair-size)) apr)) - (f b (car d) (cdr d)))))))])] - [($make-symbol) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-symbol-string apr)) - (movl (int 0) (mem disp-symbol-unique-string apr)) - (movl (int unbound) (mem disp-symbol-value apr)) - (movl (int nil) (mem disp-symbol-plist apr)) - (movl (int unbound) (mem disp-symbol-system-value apr)) - (movl (int nil) (mem disp-symbol-system-plist apr)) - (movl apr eax) - (addl (int symbol-tag) eax) - (addl (int (align symbol-size)) apr) - ac)] - [($make-port/input) (do-make-port input-port-tag arg* ac)] - [($make-port/output) (do-make-port output-port-tag arg* ac)] - [($make-port/both) (do-make-port input/output-port-tag arg* ac)] - [($make-tcbucket) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-tcbucket-tconc apr)) - (movl (Simple (cadr arg*)) eax) - (movl eax (mem disp-tcbucket-key apr)) - (movl (Simple (caddr arg*)) eax) - (movl eax (mem disp-tcbucket-val apr)) - (movl (Simple (cadddr arg*)) eax) - (movl eax (mem disp-tcbucket-next apr)) - (movl apr eax) - (addl (int vector-tag) eax) - (addl (int (align tcbucket-size)) apr) - ac)] - [($record) - (let ([rtd (car arg*)] - [ac - (let f ([arg* (cdr arg*)] [idx disp-record-data]) - (cond - [(null? arg*) - (list* (movl apr eax) - (addl (int vector-tag) eax) - (addl (int (align idx)) apr) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem idx apr)) - (f (cdr arg*) (fx+ idx wordsize)))]))]) - (cond - [(constant? rtd) - (list* (movl (Simple rtd) (mem 0 apr)) ac)] - [else - (list* (movl (Simple rtd) eax) (movl eax (mem 0 apr)) ac)]))] - [(vector) - (let f ([arg* arg*] [idx disp-vector-data]) - (cond - [(null? arg*) - (list* (movl apr eax) - (addl (int vector-tag) eax) - (movl (int (fx- idx disp-vector-data)) - (mem disp-vector-length apr)) - (addl (int (align idx)) apr) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem idx apr)) - (f (cdr arg*) (fx+ idx wordsize)))]))] - [($string) - (let f ([arg* arg*] [idx disp-string-data]) - (cond - [(null? arg*) - (list* (movb (int 0) (mem idx apr)) - (movl apr eax) - (addl (int string-tag) eax) - (movl (int (fx* (fx- idx disp-string-data) wordsize)) - (mem disp-string-length apr)) - (addl (int (align (fxadd1 idx))) apr) - ac)] - [else - (record-case (car arg*) - [(constant c) - (unless (char? c) (error who "invalid arg to string ~s" x)) - (list* (movb (int (char->integer c)) (mem idx apr)) - (f (cdr arg*) (fxadd1 idx)))] - [else - (list* (movl (Simple (car arg*)) ebx) - (movb bh (mem idx apr)) - (f (cdr arg*) (fxadd1 idx)))])]))] - [($current-frame) - (list* (movl (pcb-ref 'next-continuation) eax) - ac)] - [($seal-frame-and-call) - (list* (movl (Simple (car arg*)) cpr) ; proc - (movl (pcb-ref 'frame-base) eax) - ; eax=baseofstack - (movl (mem (fx- 0 wordsize) eax) ebx) ; underflow handler - (movl ebx (mem (fx- 0 wordsize) fpr)) ; set - ; create a new cont record - (movl (int continuation-tag) (mem 0 apr)) - (movl fpr (mem disp-continuation-top apr)) - ; compute the size of the captured frame - (movl eax ebx) - (subl fpr ebx) - (subl (int wordsize) ebx) - ; and store it - (movl ebx (mem disp-continuation-size apr)) - ; load next cont - (movl (pcb-ref 'next-continuation) ebx) - ; and store it - (movl ebx (mem disp-continuation-next apr)) - ; adjust ap - (movl apr eax) - (addl (int vector-tag) eax) - (addl (int continuation-size) apr) - ; store new cont in current-cont - (movl eax (pcb-ref 'next-continuation)) - ; adjust fp - (movl fpr (pcb-ref 'frame-base)) - (subl (int wordsize) fpr) - ; tail-call f - (movl eax (mem (fx- 0 wordsize) fpr)) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call) - ac)] - [($code-size) - (indirect-ref arg* (fx- disp-code-instrsize vector-tag) ac)] - [($code-reloc-vector) - (indirect-ref arg* (fx- disp-code-relocsize vector-tag) ac)] - [($code-freevars) - (indirect-ref arg* (fx- disp-code-freevars vector-tag) ac)] - [($set-car! $set-cdr! $vector-set! $string-set! $exit - $set-symbol-value! $set-symbol-plist! - $code-set! primitive-set! - $set-code-object! $set-code-object+offset! $set-code-object+offset/rel! - $record-set! - $set-port-input-index! $set-port-input-size! - $set-port-output-index! $set-port-output-size!) - (do-effect-prim op arg* - (cons (movl (int void-object) eax) ac))] - [(fixnum? immediate? $fxzero? boolean? char? pair? vector? string? symbol? - procedure? null? not eof-object? $fx= $fx< $fx<= $fx> $fx>= eq? - $char= $char< $char<= $char> $char>= $unbound-object? $code? - $record? $record/rtd? bwp-object? port? input-port? output-port?) - (do-pred->value-prim op arg* ac)] - [($code->closure) - (list* - (movl (Simple (car arg*)) eax) - (addl (int (fx- disp-code-data vector-tag)) eax) - (movl eax (mem 0 apr)) - (movl apr eax) - (addl (int closure-tag) eax) - (addl (int (align disp-closure-data)) apr) - ac)] - [($frame->continuation) - (NonTail - (make-closure (make-code-loc SL_continuation_code) arg*) - ac)] - [($make-call-with-values-procedure) - (NonTail - (make-closure (make-code-loc SL_call_with_values) arg*) - ac)] - [($make-values-procedure) - (NonTail - (make-closure (make-code-loc SL_values) arg*) - ac)] - [else - (error 'value-prim "unhandled ~s" op)])) - (define (indirect-assignment arg* offset ac) - (list* - (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem offset eax)) - ;;; record side effect - (addl (int offset) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)) - (define (do-effect-prim op arg* ac) - (case op - [($vector-set!) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (addl (int (fx- disp-vector-data vector-tag)) ebx) - (movl (Simple (caddr arg*)) eax) - (movl eax (mem 0 ebx)) - ;;; record side effect - (shrl (int pageshift) ebx) - (sall (int wordshift) ebx) - (addl (pcb-ref 'dirty-vector) ebx) - (movl (int dirty-word) (mem 0 ebx)) - ac)] - [($code-set!) - (list* (movl (Simple (cadr arg*)) eax) - (sarl (int fx-shift) eax) - (addl (Simple (car arg*)) eax) - (movl (Simple (caddr arg*)) ebx) - (sall (int (fx- 8 fx-shift)) ebx) - (movb bh (mem (fx- disp-code-data vector-tag) eax)) - ac)] - [($string-set!) - (list* (movl (Simple (cadr arg*)) eax) - (sarl (int fx-shift) eax) - (addl (Simple (car arg*)) eax) - (movl (Simple (caddr arg*)) ebx) - (movb bh (mem (fx- disp-string-data string-tag) eax)) - ac)] - [($set-car!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-car pair-tag) eax)) - ;;; record side effect - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-cdr!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-cdr pair-tag) eax)) - ;;; record side effect - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-tcbucket-key!) - (indirect-assignment arg* (fx- disp-tcbucket-key vector-tag) ac)] - [($set-tcbucket-val!) - (indirect-assignment arg* (fx- disp-tcbucket-val vector-tag) ac)] - [($set-tcbucket-next!) - (indirect-assignment arg* (fx- disp-tcbucket-next vector-tag) ac)] - [($set-tcbucket-tconc!) - (indirect-assignment arg* (fx- disp-tcbucket-tconc vector-tag) ac)] - [($set-port-input-index!) - (list* - (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-port-input-index vector-tag) eax)) - ac)] - [($set-port-input-size!) - (list* - (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl (int 0) (mem (fx- disp-port-input-index vector-tag) eax)) - (movl ebx (mem (fx- disp-port-input-size vector-tag) eax)) - ac)] - [($set-port-output-index!) - (list* - (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-port-output-index vector-tag) eax)) - ac)] - [($set-port-output-size!) - (list* - (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl (int 0) (mem (fx- disp-port-output-index vector-tag) eax)) - (movl ebx (mem (fx- disp-port-output-size vector-tag) eax)) - ac)] - [($set-symbol-value!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-value symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-value symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [(primitive-set!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-system-value symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-system-value symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-symbol-plist!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-plist symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-plist symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-symbol-unique-string!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-unique-string symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-unique-string symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-symbol-string!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-string symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-string symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($record-set!) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (Simple (caddr arg*)) eax) - (addl (int (fx- disp-record-data record-ptag)) ebx) - (movl eax (mem 0 ebx)) - ;;; record side effect - (shrl (int pageshift) ebx) - (sall (int wordshift) ebx) - (addl (pcb-ref 'dirty-vector) ebx) - (movl (int dirty-word) (mem 0 ebx)) - ac)] - [(cons void $fxadd1 $fxsub1 $record-ref) - (let f ([arg* arg*]) - (cond - [(null? arg*) ac] - [else - (Effect (car arg*) (f (cdr arg*)))]))] - [else - (error 'do-effect-prim "unhandled op ~s" op)])) - (define (do-simple-test x Lt Lf ac) - (unless (or Lt Lf) - (error 'Pred "no labels")) - (cond - [(not Lt) - (list* (cmpl (int bool-f) x) (je Lf) ac)] - [(not Lf) - (list* (cmpl (int bool-f) x) (jne Lt) ac)] - [else - (list* (cmpl (int bool-f) x) (je Lf) (jmp Lt) ac)])) - (define (Simple x) - (record-case x - [(cp-var i) - (mem (fx+ (fx* i wordsize) (fx- disp-closure-data closure-tag)) cpr)] - [(frame-var i) (mem (fx* i (fx- 0 wordsize)) fpr)] - [(constant c) (constant-val c)] - [(code-loc label) (label-address label)] - [(primref op) (primref-loc op)] - [else (error 'Simple "what ~s" x)])) - (define (closure-size x) - (align (fx+ disp-closure-data - (fx* wordsize (length (closure-free* x)))))) - (define (assign-codes rhs* n* i ac) - (cond - [(null? rhs*) ac] - [else - (record-case (car rhs*) - [(closure label free*) - (cons (movl (Simple label) (mem i apr)) - (assign-codes - (cdr rhs*) (cdr n*) (fx+ i (car n*)) ac))])])) - (define (whack-free x i n* rhs* ac) - (cond - [(null? rhs*) ac] - [else - (let ([free (closure-free* (car rhs*))]) - (let f ([free free] [j (fx+ i disp-closure-data)]) - (cond - [(null? free) - (whack-free x (fx+ i (car n*)) (cdr n*) (cdr rhs*) ac)] - [(eq? (car free) x) - (cons - (movl eax (mem j apr)) - (f (cdr free) (fx+ j wordsize)))] - [else (f (cdr free) (fx+ j wordsize))])))])) - (define (assign-nonrec-free* rhs* all-rhs* n* seen ac) - (cond - [(null? rhs*) ac] - [else - (let f ([ls (closure-free* (car rhs*))] [seen seen]) - (cond - [(null? ls) - (assign-nonrec-free* (cdr rhs*) all-rhs* n* seen ac)] - [(memq (car ls) seen) (f (cdr ls) seen)] - [else - (cons - (movl (Simple (car ls)) eax) - (whack-free (car ls) 0 n* all-rhs* - (f (cdr ls) (cons (car ls) seen))))]))])) - (define (assign-rec-free* lhs* rhs* all-n* ac) - (list* (movl apr eax) - (addl (int closure-tag) eax) - (let f ([lhs* lhs*] [n* all-n*]) - (cond - [(null? (cdr lhs*)) - (cons - (movl eax (Simple (car lhs*))) - (whack-free (car lhs*) 0 all-n* rhs* ac))] - [else - (cons - (movl eax (Simple (car lhs*))) - (whack-free (car lhs*) 0 all-n* rhs* - (cons - (addl (int (car n*)) eax) - (f (cdr lhs*) (cdr n*)))))])))) - (define (sum ac ls) - (cond - [(null? ls) ac] - [else (sum (fx+ ac (car ls)) (cdr ls))])) - (define (do-fix lhs* rhs* ac) - ;;; 1. first, set the code pointers in the right places - ;;; 2. next, for every variable appearing in the rhs* but is not in - ;;; the lhs*, load it once and set it everywhere it occurs. - ;;; 3. next, compute the values of the lhs*, and for every computed - ;;; value, store it on the stack, and set it everywhere it occurs - ;;; in the rhs* - ;;; 4. that's it. - (let* ([n* (map closure-size rhs*)]) - (assign-codes rhs* n* 0 - (assign-nonrec-free* rhs* rhs* n* lhs* - (assign-rec-free* lhs* rhs* n* - (cons (addl (int (sum 0 n*)) apr) ac)))))) - (define (frame-adjustment offset) - (fx* (fxsub1 offset) (fx- 0 wordsize))) - (define (NonTail x ac) - (record-case x - [(constant c) - (cons (movl (constant-val c) eax) ac)] - [(frame-var) - (cons (movl (Simple x) eax) ac)] - [(cp-var) - (cons (movl (Simple x) eax) ac)] - [(foreign-label L) - (cons (movl (list 'foreign-label L) eax) ac)] - [(primref c) - (cons (movl (primref-loc c) eax) ac)] - [(closure label arg*) - (let f ([arg* arg*] [off disp-closure-data]) - (cond - [(null? arg*) - (list* (movl (Simple label) (mem 0 apr)) - (movl apr eax) - (addl (int (align off)) apr) - (addl (int closure-tag) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem off apr)) - (f (cdr arg*) (fx+ off wordsize)))]))] - [(conditional test conseq altern) - (let ([Lj (unique-label)] [Lf (unique-label)]) - (Pred test #f Lf - (NonTail conseq - (list* (jmp Lj) Lf (NonTail altern (cons Lj ac))))))] - [(seq e0 e1) - (Effect e0 (NonTail e1 ac))] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* (NonTail body ac))] - [(primcall op rand*) - (do-value-prim op rand* ac)] - [(new-frame base-idx size body) - (NonTail body ac)] - [(call-cp call-convention rp-convention offset size mask) - (let ([L_CALL (unique-label)]) - (case call-convention - [(normal) - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (jmp L_CALL) - ; NEW FRAME - `(byte-vector ,mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) - `(byte 0) ; padding for indirect calls only - `(byte 0) ; direct calls are ok - L_CALL - (indirect-cpr-call) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [(foreign) - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (movl '(foreign-label "ik_foreign_call") ebx) - (jmp L_CALL) - ; NEW FRAME - (byte-vector mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) ; should be 0, since C has 1 rv - '(byte 0) - '(byte 0) - '(byte 0) - L_CALL - (call ebx) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [else - (error who "invalid convention ~s for call-cp" call-convention)]))] - [else (error 'NonTail "invalid expression ~s" x)])) - (define (Pred x Lt Lf ac) - (record-case x - [(frame-var i) - (do-simple-test (idx->frame-loc i) Lt Lf ac)] - [(cp-var i) - (do-simple-test (Simple x) Lt Lf ac)] - [(constant c) - (if c - (if Lt (cons (jmp Lt) ac) ac) - (if Lf (cons (jmp Lf) ac) ac))] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* (Pred body Lt Lf ac))] - [(primcall op rand*) - (do-pred-prim op rand* Lt Lf ac)] - [(conditional test conseq altern) - (cond - [(not Lt) - (let ([Lj^ (unique-label)] [Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lj^ Lf - (cons Lf^ - (Pred altern #f Lf - (cons Lj^ ac))))))] - [(not Lf) - (let ([Lj^ (unique-label)] [Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lt Lj^ - (cons Lf^ - (Pred altern Lt #f - (cons Lj^ ac))))))] - [else - (let ([Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lt Lf - (cons Lf^ - (Pred altern Lt Lf ac)))))])] - [(seq e0 e1) - (Effect e0 (Pred e1 Lt Lf ac))] - [(new-frame) - (NonTail x (do-simple-test eax Lt Lf ac))] - [else (error 'Pred "invalid expression ~s" x)])) - (define (idx->frame-loc i) - (mem (fx* i (fx- 0 wordsize)) fpr)) - (define (Effect x ac) - (record-case x - [(constant) ac] - [(primcall op rand*) - (do-effect-prim op rand* ac)] - [(conditional test conseq altern) - (let* ([Ljoin (unique-label)] - [ac (cons Ljoin ac)] - [altern-ac (Effect altern ac)]) - (cond - [(eq? altern-ac ac) ;; altern is nop - (let* ([conseq-ac (Effect conseq ac)]) - (cond - [(eq? conseq-ac ac) ;; conseq is nop too! - (Effect test ac)] - [else ; "when" pattern - (Pred test #f Ljoin conseq-ac)]))] - [else - (let* ([Lf (unique-label)] - [nac (list* (jmp Ljoin) Lf altern-ac)] - [conseq-ac (Effect conseq nac)]) - (cond - [(eq? conseq-ac nac) ;; "unless" pattern" - (Pred test Ljoin #f altern-ac)] - [else - (Pred test #f Lf conseq-ac)]))]))] -;;; [(conditional test conseq altern) -;;; (let ([Lf (unique-label)] [Ljoin (unique-label)]) -;;; (Pred test #f Lf -;;; (Effect conseq -;;; (list* (jmp Ljoin) Lf (Effect altern (cons Ljoin ac))))))] - [(seq e0 e1) - (Effect e0 (Effect e1 ac))] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* (Effect body ac))] - [(assign loc val) - (record-case loc - [(frame-var i) - (record-case val - [(constant c) - (cons (movl (constant-val c) (idx->frame-loc i)) ac)] - [else - (NonTail val - (cons (movl eax (idx->frame-loc i)) ac))])] - [else (error who "invalid assign loc ~s" loc)])] - [(eval-cp check body) - (cond - [check - (NonTail body - (list* - (movl eax cpr) - (andl (int closure-mask) eax) - (cmpl (int closure-tag) eax) - (jne (label SL_nonprocedure)) - ac))] - [(primref? body) - (list* (movl (primref-loc (primref-name body)) cpr) ac)] - [else - (NonTail body (list* (movl eax cpr) ac))])] - [(save-cp loc) - (record-case loc - [(frame-var i) - (cons (movl cpr (idx->frame-loc i)) ac)] - [else (error who "invalid cpr loc ~s" x)])] - [(new-frame) (NonTail x ac)] - [(frame-var) ac] - [else (error 'Effect "invalid expression ~s" x)])) - (define (Tail x ac) - (record-case x - [(return x) - (NonTail x (cons (ret) ac))] - [(conditional test conseq altern) - (let ([L (unique-label)]) - (Pred test #f L - (Tail conseq - (cons L (Tail altern ac)))))] - [(seq e0 e1) - (Effect e0 (Tail e1 ac))] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* (Tail body ac))] - [(new-frame idx size body) - (Tail body ac)] - [(tailcall-cp call-convention argc) - (list* - (movl (int (argc-convention argc)) eax) - (case call-convention - [(normal) (tail-indirect-cpr-call)] - [(apply) (jmp (label SL_apply))] - [else - (error who "invalid tail-call convention ~s" call-convention)]) - ac)] -;;; [(call-cp call-convention rp-convention idx argc mask) -;;; (unless (eq? rp-convention 'tail) -;;; (error who "nontail rp (~s) in tail context" rp-convention)) -;;; (let f ([i 0]) -;;; (cond -;;; [(fx= i argc) -;;; (case call-convention -;;; [(normal) -;;; (list* -;;; (movl (int (argc-convention argc)) eax) -;;; (tail-indirect-cpr-call) -;;; ac)] -;;; [(apply) -;;; (list* -;;; (movl (int (argc-convention argc)) eax) -;;; (jmp (label SL_apply)) -;;; ac)] -;;; [else -;;; (error who "invalid conv ~s in tail call-cpr" call-convention)])] -;;; [else -;;; (list* (movl (mem (fx* (fx+ idx (fxadd1 i)) -;;; (fx- 0 wordsize)) fpr) -;;; eax) -;;; (movl eax (mem (fx* (fx+ i 1) (fx- 0 wordsize)) fpr)) -;;; (f (fxadd1 i)))]))] - [else (error 'Tail "invalid expression ~s" x)])) - (define (handle-vararg fml-count ac) - (define CONTINUE_LABEL (unique-label)) - (define DONE_LABEL (unique-label)) - (define CONS_LABEL (unique-label)) - (define LOOP_HEAD (unique-label)) - (define L_CALL (unique-label)) - (list* (cmpl (int (argc-convention (fxsub1 fml-count))) eax) - (jg (label SL_invalid_args)) - (jl CONS_LABEL) - (movl (int nil) ebx) - (jmp DONE_LABEL) - CONS_LABEL - (movl (pcb-ref 'allocation-redline) ebx) - (addl eax ebx) - (addl eax ebx) - (cmpl ebx apr) - (jle LOOP_HEAD) - ; overflow - (addl eax esp) ; advance esp to cover args - (pushl cpr) ; push current cp - (pushl eax) ; push argc - (negl eax) ; make argc positive - (addl (int (fx* 4 wordsize)) eax) ; add 4 words to adjust frame size - (pushl eax) ; push frame size - (addl eax eax) ; double the number of args - (movl eax (mem (fx* -2 wordsize) fpr)) ; pass it as first arg - (movl (int (argc-convention 1)) eax) ; setup argc - (movl (primref-loc 'do-vararg-overflow) cpr) ; load handler - (jmp L_CALL) ; go to overflow handler - ; NEW FRAME - (int 0) ; if the framesize=0, then the framesize is dynamic - '(current-frame-offset) - (int 0) ; multiarg rp - (byte 0) - (byte 0) - L_CALL - (indirect-cpr-call) - (popl eax) ; pop framesize and drop it - (popl eax) ; reload argc - (popl cpr) ; reload cp - (subl eax fpr) ; readjust fp - LOOP_HEAD - (movl (int nil) ebx) - CONTINUE_LABEL - (movl ebx (mem disp-cdr apr)) - (movl (mem fpr eax) ebx) - (movl ebx (mem disp-car apr)) - (movl apr ebx) - (addl (int pair-tag) ebx) - (addl (int pair-size) apr) - (addl (int (fxsll 1 fx-shift)) eax) - (cmpl (int (fx- 0 (fxsll fml-count fx-shift))) eax) - (jle CONTINUE_LABEL) - DONE_LABEL - (movl ebx (mem (fx- 0 (fxsll fml-count fx-shift)) fpr)) - ac)) - (define (Entry check? x ac) - (record-case x - [(clambda-case fml* proper body) - (let ([ac (Tail body ac)]) - (cond - [(and proper check?) - (list* (cmpl (int (argc-convention (length fml*))) eax) - (jne (label SL_invalid_args)) - ac)] - [proper ac] - [else - (handle-vararg (length fml*) ac)]))])) - (define make-dispatcher - (lambda (j? L L* x x* ac) - (cond - [(null? L*) (if j? (cons (jmp (label L)) ac) ac)] - [else - (record-case x - [(clambda-case fml* proper _) - (cond - [proper - (list* (cmpl (int (argc-convention (length fml*))) eax) - (je (label L)) - (make-dispatcher #t - (car L*) (cdr L*) (car x*) (cdr x*) ac))] - [else - (list* (cmpl (int (argc-convention (fxsub1 (length fml*)))) eax) - (jle (label L)) - (make-dispatcher #t - (car L*) (cdr L*) (car x*) (cdr x*) ac))])])]))) - (define (handle-cases x x*) - (let ([L* (map (lambda (_) (gensym)) x*)] - [L (gensym)]) - (make-dispatcher #f L L* x x* - (let f ([x x] [x* x*] [L L] [L* L*]) - (cond - [(null? x*) - (cons (label L) (Entry 'check x '()))] - [else - (cons (label L) - (Entry #f x - (f (car x*) (cdr x*) (car L*) (cdr L*))))]))))) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (list* - (length free) - (label L) - (handle-cases (car cases) (cdr cases)))])) - (record-case x - [(codes list body) - (cons (cons 0 (Tail body '())) - (map CodeExpr list))])) - - -(define SL_nonprocedure (gensym "SL_nonprocedure")) - -(define SL_top_level_value_error (gensym "SL_top_level_value_error")) -(define SL_car_error (gensym "SL_car_error")) -(define SL_cdr_error (gensym "SL_cdr_error")) - -(define SL_invalid_args (gensym "SL_invalid_args")) -(define SL_foreign_call (gensym "SL_foreign_call")) -(define SL_continuation_code (gensym "SL_continuation_code")) -(define SL_multiple_values_error_rp (gensym "SL_multiple_values_error_rp")) -(define SL_multiple_values_ignore_rp (gensym "SL_multiple_ignore_error_rp")) -(define SL_underflow_multiple_values (gensym "SL_underflow_multiple_values")) -(define SL_underflow_handler (gensym "SL_underflow_handler")) -(define SL_scheme_exit (gensym "SL_scheme_exit")) -(define SL_apply (gensym "SL_apply")) -(define SL_values (gensym "SL_values")) -(define SL_call_with_values (gensym "SL_call_with_values")) - -(module () -(list*->code* - (list - (list 0 - (label SL_car_error) - (movl ebx (mem (fx- 0 wordsize) fpr)) - (movl (primref-loc 'car-error) cpr) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_cdr_error) - (movl ebx (mem (fx- 0 wordsize) fpr)) - (movl (primref-loc 'cdr-error) cpr) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_top_level_value_error) - (movl ebx (mem (fx- 0 wordsize) fpr)) - (movl (primref-loc 'top-level-value-error) cpr) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call)) - - (let ([L_cwv_done (gensym)] - [L_cwv_loop (gensym)] - [L_cwv_multi_rp (gensym)] - [L_cwv_call (gensym)]) - (list - 0 ; no free vars - (label SL_call_with_values) - (cmpl (int (argc-convention 2)) eax) - (jne (label SL_invalid_args)) - (movl (mem (fx- 0 wordsize) fpr) ebx) ; producer - (movl ebx cpr) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (movl (int (argc-convention 0)) eax) - (subl (int (fx* wordsize 2)) fpr) - (jmp (label L_cwv_call)) - ; MV NEW FRAME - (byte-vector '#(#b110)) - (int (fx* wordsize 3)) - '(current-frame-offset) - (label-address L_cwv_multi_rp) - (byte 0) - (byte 0) - (label L_cwv_call) - (indirect-cpr-call) - ;;; one value returned - (addl (int (fx* wordsize 2)) fpr) - (movl (mem (fx* -2 wordsize) fpr) ebx) ; consumer - (movl ebx cpr) - (movl eax (mem (fx- 0 wordsize) fpr)) - (movl (int (argc-convention 1)) eax) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (tail-indirect-cpr-call) - ;;; multiple values returned - (label L_cwv_multi_rp) - ; because values does not pop the return point - ; we have to adjust fp one more word here - (addl (int (fx* wordsize 3)) fpr) - (movl (mem (fx* -2 wordsize) fpr) cpr) ; consumer - (cmpl (int (argc-convention 0)) eax) - (je (label L_cwv_done)) - (movl (int (fx* -4 wordsize)) ebx) - (addl fpr ebx) ; ebx points to first value - (movl ebx ecx) - (addl eax ecx) ; ecx points to the last value - (label L_cwv_loop) - (movl (mem 0 ebx) edx) - (movl edx (mem (fx* 3 wordsize) ebx)) - (subl (int wordsize) ebx) - (cmpl ecx ebx) - (jge (label L_cwv_loop)) - (label L_cwv_done) - (movl cpr ebx) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (tail-indirect-cpr-call))) - - (let ([L_values_one_value (gensym)] - [L_values_many_values (gensym)]) - (list 0 ; no freevars - (label SL_values) - (cmpl (int (argc-convention 1)) eax) - (je (label L_values_one_value)) - (label L_values_many_values) - (movl (mem 0 fpr) ebx) ; return point - (jmp (mem disp-multivalue-rp ebx)) ; go - (label L_values_one_value) - (movl (mem (fx- 0 wordsize) fpr) eax) - (ret))) - - (let ([L_apply_done (gensym)] - [L_apply_loop (gensym)]) - (list 0 - (label SL_apply) - (movl (mem fpr eax) ebx) - (cmpl (int nil) ebx) - (je (label L_apply_done)) - (label L_apply_loop) - (movl (mem (fx- disp-car pair-tag) ebx) ecx) - (movl (mem (fx- disp-cdr pair-tag) ebx) ebx) - (movl ecx (mem fpr eax)) - (subl (int wordsize) eax) - (cmpl (int nil) ebx) - (jne (label L_apply_loop)) - (label L_apply_done) - (addl (int wordsize) eax) - (tail-indirect-cpr-call))) - - (list 0 - (label SL_nonprocedure) - (movl cpr (mem (fx- 0 wordsize) fpr)) ; first arg - (movl (primref-loc '$apply-nonprocedure-error-handler) cpr) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_multiple_values_error_rp) - (movl (primref-loc '$multiple-values-error) cpr) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_multiple_values_ignore_rp) - (ret)) - - (list 0 - (label SL_invalid_args) - ;;; - (movl cpr (mem (fx- 0 wordsize) fpr)) ; first arg - (negl eax) - (movl eax (mem (fx- 0 (fx* 2 wordsize)) fpr)) - (movl (primref-loc '$incorrect-args-error-handler) cpr) - (movl (int (argc-convention 2)) eax) - (tail-indirect-cpr-call)) - - (let ([Lset (gensym)] [Lloop (gensym)]) - (list 0 - (label SL_foreign_call) - (movl fpr (pcb-ref 'frame-pointer)) - (movl apr (pcb-ref 'allocation-pointer)) - (movl fpr ebx) - (movl (pcb-ref 'system-stack) esp) - (pushl pcr) - (cmpl (int 0) eax) - (je (label Lset)) - (label Lloop) - (movl (mem ebx eax) ecx) - (pushl ecx) - (addl (int 4) eax) - (cmpl (int 0) eax) - (jne (label Lloop)) - (label Lset) - ; FOREIGN NEW FRAME - (call cpr) - (movl (pcb-ref 'frame-pointer) fpr) - (movl (pcb-ref 'allocation-pointer) apr) - (ret))) - - (let ([L_cont_zero_args (gensym)] - [L_cont_mult_args (gensym)] - [L_cont_one_arg (gensym)] - [L_cont_mult_move_args (gensym)] - [L_cont_mult_copy_loop (gensym)]) - (list 1 ; freevars - (label SL_continuation_code) - (movl (mem (fx- disp-closure-data closure-tag) cpr) ebx) ; captured-k - (movl ebx (pcb-ref 'next-continuation)) ; set - (movl (pcb-ref 'frame-base) ebx) - (cmpl (int (argc-convention 1)) eax) - (jg (label L_cont_zero_args)) - (jl (label L_cont_mult_args)) - (label L_cont_one_arg) - (movl (mem (fx- 0 wordsize) fpr) eax) - (movl ebx fpr) - (subl (int wordsize) fpr) - (ret) - (label L_cont_zero_args) - (subl (int wordsize) ebx) - (movl ebx fpr) - (movl (mem 0 ebx) ebx) ; return point - (jmp (mem disp-multivalue-rp ebx)) ; go - (label L_cont_mult_args) - (subl (int wordsize) ebx) - (cmpl ebx fpr) - (jne (label L_cont_mult_move_args)) - (movl (mem 0 ebx) ebx) - (jmp (mem disp-multivalue-rp ebx)) - (label L_cont_mult_move_args) - ; move args from fpr to ebx - (movl (int 0) ecx) - (label L_cont_mult_copy_loop) - (subl (int wordsize) ecx) - (movl (mem fpr ecx) edx) - (movl edx (mem ebx ecx)) - (cmpl ecx eax) - (jne (label L_cont_mult_copy_loop)) - (movl ebx fpr) - (movl (mem 0 ebx) ebx) - (jmp (mem disp-multivalue-rp ebx)) - )) - ))) - - - -(define (compile-expr expr) - (let* ([p (recordize expr)] - [p (optimize-direct-calls p)] -;;; [foo (analyze-cwv p)] - [p (optimize-letrec p)] - ;[p (remove-letrec p)] - [p (remove-assignments p)] - [p (convert-closures p)] - [p (lift-codes p)] - [p (introduce-primcalls p)] - [p (simplify-operands p)] - [p (insert-stack-overflow-checks p)] - [p (insert-allocation-checks p)] - [p (remove-local-variables p)] - [p (optimize-ap-check p)] - [ls* (generate-code p)] - [f (when (assembler-output) - (for-each - (lambda (ls) - (for-each (lambda (x) (printf " ~s\n" x)) ls)) - ls*))] - [code* (list*->code* ls*)]) - (car code*))) - -(define compile-file - (lambda (input-file output-file . rest) - (let ([ip (open-input-file input-file)] - [op (apply open-output-file output-file rest)]) - (let f () - (let ([x (read ip)]) - (unless (eof-object? x) - (fasl-write (compile-expr (expand x)) op) - (f)))) - (close-input-port ip) - (close-output-port op)))) - -(primitive-set! 'compile-file compile-file) -(primitive-set! 'assembler-output (make-parameter #f)) -(primitive-set! 'compile - (lambda (x) - (let ([code (compile-expr (expand x))]) - (let ([proc ($code->closure code)]) - (proc))))) - -) - diff --git a/src/libcompile-9.0.ss b/src/libcompile-9.0.ss deleted file mode 100644 index 8e8dc40..0000000 --- a/src/libcompile-9.0.ss +++ /dev/null @@ -1,3774 +0,0 @@ - -;;; 9.0: * calls (gensym ) instead of -;;; (gensym (symbol->string )) in order to avoid incrementing -;;; gensym-count. -;;; 6.7: * open-coded top-level-value, car, cdr -;;; 6.2: * side-effects now modify the dirty-vector -;;; * added bwp-object? -;;; * added pointer-value -;;; * added tcbuckets -;;; 6.1: * added case-lambda, dropped lambda -;;; 6.0: * basic compiler - -(let () - -(define-syntax cond-expand - (lambda (x) - (syntax-case x () - [(_ test conseq altern) - (if (eval (syntax-object->datum #'test)) - #'conseq - #'altern)]))) - -(cond-expand (eq? "" "") - (include "record-case.chez.ss") - (include "record-case.ss")) - - -(include "set-operations.ss") - - -(define open-coded-primitives -;;; these primitives, when found in operator position with the correct -;;; number of arguments, will be open-coded by the generator. If an -;;; incorrect number of args is detected, or if they appear in non-operator -;;; position, then they cannot be open-coded, and the pcb-primitives table -;;; is consulted for a reference of the pcb slot containing the primitive. -;;; If it's not found there, an error is signalled. -;;; -;;; prim-name args - '([$constant-ref 1 value] - [$constant-set! 2 effect] - [$pcb-ref 1 value] - [$pcb-set! 2 effect] - ;;; type predicates - [fixnum? 1 pred] - [immediate? 1 pred] - [boolean? 1 pred] - [char? 1 pred] - [pair? 1 pred] - [symbol? 1 pred] - [vector? 1 pred] - [string? 1 pred] - [procedure? 1 pred] - [null? 1 pred] - [eof-object? 1 pred] - [bwp-object? 1 pred] - [$unbound-object? 1 pred] - [$forward-ptr? 1 pred] - [not 1 pred] - [pointer-value 1 value] - [eq? 2 pred] - ;;; fixnum primitives - [$fxadd1 1 value] - [$fxsub1 1 value] - [$fx+ 2 value] - [$fx- 2 value] - [$fx* 2 value] - [$fxsll 2 value] - [$fxsra 2 value] - [$fxlogand 2 value] - [$fxlogor 2 value] - [$fxlogxor 2 value] - [$fxlognot 1 value] - [$fxquotient 2 value] - [$fxmodulo 2 value] - ;;; fixnum predicates - [$fxzero? 1 pred] - [$fx= 2 pred] - [$fx< 2 pred] - [$fx<= 2 pred] - [$fx> 2 pred] - [$fx>= 2 pred] - ;;; character predicates - [$char= 2 pred] - [$char< 2 pred] - [$char<= 2 pred] - [$char> 2 pred] - [$char>= 2 pred] - ;;; character conversion - [$fixnum->char 1 value] - [$char->fixnum 1 value] - ;;; lists/pairs - [cons 2 value] - [list* positive value] - [list any value] - [car 1 value] - [cdr 1 value] - [$car 1 value] - [$cdr 1 value] - [$set-car! 2 effect] - [$set-cdr! 2 effect] - ;;; vectors - [$make-vector 1 value] - [vector any value] - [$vector-length 1 value] - [$vector-ref 2 value] - [$vector-set! 3 effect] - [$vector-memq 2 value] - ;;; strings - [$make-string 1 value] - [$string any value] - [$string-length 1 value] - [$string-ref 2 value] - [$string-set! 3 effect] - ;;; symbols - [$make-symbol 1 value] - [$symbol-value 1 value] - [$symbol-string 1 value] - [$symbol-unique-string 1 value] - [$set-symbol-value! 2 effect] - [$set-symbol-string! 2 effect] - [$set-symbol-unique-string! 2 effect] - [$symbol-plist 1 value] - [$set-symbol-plist! 2 effect] - [primitive-ref 1 value] - [primitive-set! 2 effect] - [top-level-value 1 value] - ;;; ports - [port? 1 pred] - [input-port? 1 pred] - [output-port? 1 pred] - [$make-port/input 7 value] - [$make-port/output 7 value] - [$make-port/both 7 value] - [$port-handler 1 value] - [$port-input-buffer 1 value] - [$port-input-index 1 value] - [$port-input-size 1 value] - [$port-output-buffer 1 value] - [$port-output-index 1 value] - [$port-output-size 1 value] - [$set-port-input-index! 2 effect] - [$set-port-input-size! 2 effect] - [$set-port-output-index! 2 effect] - [$set-port-output-size! 2 effect] - ;;; tcbuckets - [$make-tcbucket 4 value] - [$tcbucket-key 1 value] - [$tcbucket-val 1 value] - [$tcbucket-next 1 value] - [$set-tcbucket-val! 2 effect] - [$set-tcbucket-next! 2 effect] - [$set-tcbucket-tconc! 2 effect] - ;;; misc - [eof-object 0 value] - [void 0 value] - [$exit 1 effect] - [$fp-at-base 0 pred] - [$current-frame 0 value] - [$seal-frame-and-call 1 tail] - [$frame->continuation 1 value] - ;;; - ;;; records - ;;; - [$make-record 2 value] - [$record? 1 pred] - [$record/rtd? 2 pred] - [$record-rtd 1 value] - [$record-ref 2 value] - [$record-set! 3 effect] - [$record any value] - ;;; - ;;; asm - ;;; - [$code? 1 pred] - [$code-size 1 value] - [$code-reloc-vector 1 value] - [$code-freevars 1 value] - [$code-ref 2 value] - [$code-set! 3 value] - [$code->closure 1 value] - ;;; - [$make-call-with-values-procedure 0 value] - [$make-values-procedure 0 value] - [$install-underflow-handler 0 effect] - )) - -(define (primitive-context x) - (cond - [(assq x open-coded-primitives) => caddr] - [else (error 'primitive-context "unknown prim ~s" x)])) - -(define (open-codeable? x) - (cond - [(assq x open-coded-primitives) #t] - [else #f])) - -(define (open-coded-primitive-args x) - (cond - [(assq x open-coded-primitives) => cadr] - [else (error 'open-coded-primitive-args "invalid ~s" x)])) - -;;; end of primitives table section - - -(define-record constant (value)) -(define-record code-loc (label)) -(define-record foreign-label (label)) -(define-record var (name assigned)) -(define-record cp-var (idx)) -(define-record frame-var (idx)) -(define-record new-frame (base-idx size body)) -(define-record save-cp (loc)) -(define-record eval-cp (check body)) -(define-record return (value)) -(define-record call-cp - (call-convention rp-convention base-idx arg-count live-mask)) -(define-record tailcall-cp (convention arg-count)) -(define-record primcall (op arg*)) -(define-record primref (name)) -(define-record conditional (test conseq altern)) -(define-record bind (lhs* rhs* body)) -(define-record recbind (lhs* rhs* body)) -(define-record fix (lhs* rhs* body)) - -(define-record seq (e0 e1)) -(define-record clambda-case (arg* proper body)) -(define-record clambda (cases)) -(define-record clambda-code (label cases free)) -(define-record closure (code free*)) -(define-record funcall (op rand*)) -(define-record appcall (op rand*)) -(define-record forcall (op rand*)) -(define-record code-rec (arg* proper free* body)) -(define-record codes (list body)) -(define-record assign (lhs rhs)) - -(define (unique-var x) - (make-var (gensym x) #f)) - - -(define (make-bind^ lhs* rhs* body) - (if (null? lhs*) - body - (make-bind lhs* rhs* body))) - -(define (recordize x) - (define (gen-fml* fml*) - (cond - [(pair? fml*) - (cons (unique-var (car fml*)) - (gen-fml* (cdr fml*)))] - [(symbol? fml*) - (unique-var fml*)] - [else '()])) - (define (properize fml*) - (cond - [(pair? fml*) - (cons (car fml*) (properize (cdr fml*)))] - [(null? fml*) '()] - [else (list fml*)])) - (define (extend-env fml* nfml* env) - (cons (cons fml* nfml*) env)) - (define (quoted-sym x) - (if (and (list? x) - (fx= (length x) 2) - (eq? 'quote (car x)) - (symbol? (cadr x))) - (cadr x) - (error 'quoted-sym "not a quoted symbol ~s" x))) - (define (quoted-string x) - (if (and (list? x) - (fx= (length x) 2) - (eq? 'quote (car x)) - (string? (cadr x))) - (cadr x) - (error 'quoted-string "not a quoted string ~s" x))) - (define (lookup^ x lhs* rhs*) - (cond - [(pair? lhs*) - (if (eq? x (car lhs*)) - (car rhs*) - (lookup^ x (cdr lhs*) (cdr rhs*)))] - [(eq? x lhs*) rhs*] - [else #f])) - (define (lookup x env) - (cond - [(pair? env) - (or (lookup^ x (caar env) (cdar env)) - (lookup x (cdr env)))] - [else #f])) - (define (E x env) - (cond - [(pair? x) - (case (car x) - [(quote) (make-constant (cadr x))] - [(if) - (make-conditional - (E (cadr x) env) - (E (caddr x) env) - (E (cadddr x) env))] - [(set!) - (let ([lhs (cadr x)] [rhs (caddr x)]) - (make-assign - (or (lookup lhs env) - (error 'recordize "invalid assignment ~s" x)) - (E rhs env)))] - [(begin) - (let f ([a (cadr x)] [d (cddr x)]) - (cond - [(null? d) (E a env)] - [else - (make-seq - (E a env) - (f (car d) (cdr d)))]))] - [(letrec) - (unless (fx= (length x) 3) (syntax-error x)) - (let ([bind* (cadr x)] [body (caddr x)]) - (let ([lhs* (map car bind*)] - [rhs* (map cadr bind*)]) - (let ([nlhs* (gen-fml* lhs*)]) - (let ([env (extend-env lhs* nlhs* env)]) - (make-recbind nlhs* - (map (lambda (rhs) (E rhs env)) rhs*) - (E body env))))))] - [(letrec) - (unless (fx= (length x) 3) (syntax-error x)) - (let ([bind* (cadr x)] [body (caddr x)]) - (let ([lhs* (map car bind*)] - [rhs* (map cadr bind*)] - [v* (map (lambda (x) '(void)) bind*)] - [t* (map (lambda (x) (gensym)) bind*)]) - (E `((case-lambda - [,lhs* - ((case-lambda - [,t* - (begin ,@(map (lambda (x v) `(set! ,x ,v)) lhs* t*) - ,body)]) - ,@rhs*)]) - ,@v*) - env)))] - [(case-lambda) - (let ([cls* - (map - (lambda (cls) - (let ([fml* (car cls)] [body (cadr cls)]) - (let ([nfml* (gen-fml* fml*)]) - (let ([body (E body (extend-env fml* nfml* env))]) - (make-clambda-case - (properize nfml*) - (list? fml*) - body))))) - (cdr x))]) - (make-clambda cls*))] - [(foreign-call) - (let ([name (quoted-string (cadr x))] [arg* (cddr x)]) - (make-forcall name - (map (lambda (x) (E x env)) arg*)))] - [(|#primitive|) - (let ([var (cadr x)]) - (make-primref var))] - ;;; [(|#primitive|) - ;;; (let ([var (cadr x)]) - ;;; (if (primitive? var) - ;;; (make-primref var) - ;;; (error 'recordize "invalid primitive ~s" var)))] - [(top-level-value) - (let ([var (quoted-sym (cadr x))]) - (if (eq? (expand-mode) 'bootstrap) - (error 'compile "reference to ~s in bootstrap mode" var) - ;(make-primref var) - (make-funcall - (make-primref 'top-level-value) - (list (make-constant var)))))] - ;;; [(top-level-value) - ;;; (let ([var (quoted-sym (cadr x))]) - ;;; (if (eq? (expand-mode) 'bootstrap) - ;;; (if (primitive? var) - ;;; (make-primref var) - ;;; (error 'compile "invalid primitive ~s" var)) - ;;; (make-funcall - ;;; (make-primref 'top-level-value) - ;;; (list (make-constant var)))))] - [(set-top-level-value!) - (make-funcall (make-primref 'set-top-level-value!) - (map (lambda (x) (E x env)) (cdr x)))] - [(memv) - (make-funcall - (make-primref 'memq) - (map (lambda (x) (E x env)) (cdr x)))] - [($apply) - (let ([proc (cadr x)] [arg* (cddr x)]) - (make-appcall - (E proc env) - (map (lambda (x) (E x env)) arg*)))] - [(void) - (make-constant (void))] - [else - (make-funcall - (E (car x) env) - (map (lambda (x) (E x env)) (cdr x)))])] - [(symbol? x) - (or (lookup x env) - (error 'recordize "invalid reference in ~s" x))] - [else (error 'recordize "invalid expression ~s" x)])) - (E x '())) - - -(define (unparse x) - (define (E-args proper x) - (if proper - (map E x) - (let f ([a (car x)] [d (cdr x)]) - (cond - [(null? d) (E a)] - [else (cons (E a) (f (car d) (cdr d)))])))) - (define (E x) - (record-case x - [(constant c) `(quote ,c)] - [(code-loc x) `(code-loc ,x)] - [(var x) (string->symbol (format "v:~a" x))] - [(primref x) x] - [(conditional test conseq altern) - `(if ,(E test) ,(E conseq) ,(E altern))] - [(primcall op arg*) `(,op . ,(map E arg*))] - [(bind lhs* rhs* body) - `(let ,(map (lambda (lhs rhs) (list (E lhs) (E rhs))) lhs* rhs*) - ,(E body))] - [(recbind lhs* rhs* body) - `(letrec ,(map (lambda (lhs rhs) (list (E lhs) (E rhs))) lhs* rhs*) - ,(E body))] - [(fix lhs* rhs* body) - `(fix ,(map (lambda (lhs rhs) (list (E lhs) (E rhs))) lhs* rhs*) - ,(E body))] - [(seq e0 e1) `(begin ,(E e0) ,(E e1))] - [(clambda-case args proper body) - `(clambda-case ,(E-args proper args) ,(E body))] - [(clambda cls*) - `(case-lambda . ,(map E cls*))] - [(clambda-code label clauses free) - `(code ,label . ,(map E clauses))] - [(closure code free*) - `(closure ,(E code) ,(map E free*))] - [(code-rec arg* proper free* body) - `(code-rec [arg: ,(E-args proper arg*)] - [free: ,(map E free*)] - ,(E body))] - [(codes list body) - `(codes ,(map E list) - ,(E body))] - [(funcall rator rand*) `(funcall ,(E rator) . ,(map E rand*))] - [(appcall rator rand*) `(appcall ,(E rator) . ,(map E rand*))] - [(forcall rator rand*) `(foreign-call ,rator . ,(map E rand*))] - [(assign lhs rhs) `(set! ,(E lhs) ,(E rhs))] - [(return x) `(return ,(E x))] - [(new-frame base-idx size body) - `(new-frame [base: ,base-idx] - [size: ,size] - ,(E body))] - [(frame-var idx) - (string->symbol (format "fv.~a" idx))] - [(cp-var idx) - (string->symbol (format "cp.~a" idx))] - [(save-cp expr) - `(save-cp ,(E expr))] - [(eval-cp check body) - `(eval-cp ,check ,(E body))] - [(call-cp call-convention rp-convention base-idx arg-count live-mask) - `(call-cp [conv: ,call-convention] - [rpconv: ,rp-convention] - [base-idx: ,base-idx] - [arg-count: ,arg-count] - [live-mask: ,live-mask])] - [(foreign-label x) `(foreign-label ,x)] - [else (error 'unparse "invalid record ~s" x)])) - (E x)) - -(define (optimize-direct-calls x) - (define who 'optimize-direct-calls) - (define (make-conses ls) - (cond - [(null? ls) (make-constant '())] - [else - (make-primcall 'cons - (list (car ls) (make-conses (cdr ls))))])) - (define (properize lhs* rhs*) - (cond - [(null? lhs*) (error who "improper improper")] - [(null? (cdr lhs*)) - (list (make-conses rhs*))] - [else (cons (car rhs*) (properize (cdr lhs*) (cdr rhs*)))])) - (define (inline-case cls rand*) - (record-case cls - [(clambda-case fml* proper body) - (if proper - (and (fx= (length fml*) (length rand*)) - (make-bind fml* rand* body)) - (and (fx<= (length fml*) (length rand*)) - (make-bind fml* (properize fml* rand*) body)))])) - (define (try-inline cls* rand* default) - (cond - [(null? cls*) default] - [(inline-case (car cls*) rand*)] - [else (try-inline (cdr cls*) rand* default)])) - (define (inline rator rand*) - (record-case rator - [(clambda cls*) - (try-inline cls* rand* - (make-funcall rator rand*))] - [else (make-funcall rator rand*)])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(recbind lhs* rhs* body) - (make-recbind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional - (Expr test) - (Expr conseq) - (Expr altern))] - [(seq e0 e1) - (make-seq (Expr e0) (Expr e1))] - [(clambda cls*) - (make-clambda - (map (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Expr body))])) - cls*))] - [(primcall rator rand*) - (make-primcall rator (map Expr rand*))] - [(funcall rator rand*) - (inline (Expr rator) (map Expr rand*))] - [(appcall rator rand*) - (make-appcall (Expr rator) (map Expr rand*))] - [(forcall rator rand*) - (make-forcall rator (map Expr rand*))] - [(assign lhs rhs) - (make-assign lhs (Expr rhs))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - - - -(define lambda-both 0) -(define lambda-producer 0) -(define lambda-consumer 0) -(define lambda-none 0) -(define branching-producer 0) - - -(define (analyze-cwv x) - (define who 'analyze-cwv) - (define (lambda? x) - (record-case x - [(clambda) #t] - [else #f])) - (define (branching-producer? x) - (define (bt? x) - (record-case x - [(bind lhs* rhs* body) (bt? body)] - [(recbind lhs* rhs* body) (bt? body)] - [(conditional test conseq altern) #t] - [(seq e0 e1) (bt? e1)] - [else #f])) - (define (branching-clause? x) - (record-case x - [(clambda-case fml* proper body) - (bt? body)])) - (record-case x - [(clambda cls*) - (ormap branching-clause? cls*)] - [else #f])) - (define (analyze producer consumer) - (cond - [(and (lambda? producer) (lambda? consumer)) - (set! lambda-both (fxadd1 lambda-both))] - [(lambda? producer) - (set! lambda-producer (fxadd1 lambda-producer))] - [(lambda? consumer) - (set! lambda-consumer (fxadd1 lambda-consumer))] - [else - (set! lambda-none (fxadd1 lambda-none))]) - (when (branching-producer? producer) - (set! branching-producer (fxadd1 branching-producer))) - (printf "both=~s p=~s c=~s none=~s branching-prod=~s\n" - lambda-both lambda-producer lambda-consumer lambda-none - branching-producer)) - (define (E x) - (record-case x - [(constant) (void)] - [(var) (void)] - [(primref) (void)] - [(bind lhs* rhs* body) - (for-each E rhs*) (E body)] - [(recbind lhs* rhs* body) - (for-each E rhs*) (E body)] - [(conditional test conseq altern) - (E test) - (E conseq) - (E altern)] - [(seq e0 e1) (E e0) (E e1)] - [(clambda cls*) - (for-each - (lambda (x) - (record-case x - [(clambda-case fml* proper body) (E body)])) - cls*)] - [(primcall rator rand*) - (for-each E rand*) - (when (and (eq? rator 'call-with-values) (fx= (length rand*) 2)) - (analyze (car rand*) (cadr rand*)))] - [(funcall rator rand*) - (E rator) (for-each E rand*) - (when (and (record-case rator - [(primref op) (eq? op 'call-with-values)] - [else #f]) - (fx= (length rand*) 2)) - (analyze (car rand*) (cadr rand*)))] - [(appcall rator rand*) - (E rator) (for-each E rand*)] - [(forcall rator rand*) - (for-each E rand*)] - [(assign lhs rhs) - (E rhs)] - [else (error who "invalid expression ~s" (unparse x))])) - (E x)) - - - - -(define (optimize-letrec x) - (define who 'optimize-letrec) - (define (extend-hash lhs* h ref) - (for-each (lambda (lhs) (put-hash-table! h lhs #t)) lhs*) - (lambda (x) - (unless (get-hash-table h x #f) - (put-hash-table! h x #t) - (ref x)))) - (define (E* x* ref comp) - (cond - [(null? x*) '()] - [else - (cons (E (car x*) ref comp) - (E* (cdr x*) ref comp))])) - (define (do-rhs* i lhs* rhs* ref comp vref vcomp) - (cond - [(null? rhs*) '()] - [else - (let ([h (make-hash-table)]) - (let ([ref - (lambda (x) - (unless (get-hash-table h x #f) - (put-hash-table! h x #t) - (ref x) - (when (memq x lhs*) - (vector-set! vref i #t))))] - [comp - (lambda () - (vector-set! vcomp i #t) - (comp))]) - (cons (E (car rhs*) ref comp) - (do-rhs* (fxadd1 i) lhs* (cdr rhs*) ref comp vref vcomp))))])) - (define (partition-rhs* i lhs* rhs* vref vcomp) - (cond - [(null? lhs*) (values '() '() '() '() '() '())] - [else - (let-values - ([(slhs* srhs* llhs* lrhs* clhs* crhs*) - (partition-rhs* (fxadd1 i) (cdr lhs*) (cdr rhs*) vref vcomp)] - [(lhs rhs) (values (car lhs*) (car rhs*))]) - (cond - [(var-assigned lhs) - (values slhs* srhs* llhs* lrhs* (cons lhs clhs*) (cons rhs crhs*))] - [(clambda? rhs) - (values slhs* srhs* (cons lhs llhs*) (cons rhs lrhs*) clhs* crhs*)] - [(or (vector-ref vref i) (vector-ref vcomp i)) - (values slhs* srhs* llhs* lrhs* (cons lhs clhs*) (cons rhs crhs*))] - [else - (values (cons lhs slhs*) (cons rhs srhs*) llhs* lrhs* clhs* crhs*)] - ))])) - (define (do-recbind lhs* rhs* body ref comp) - (let ([h (make-hash-table)] - [vref (make-vector (length lhs*) #f)] - [vcomp (make-vector (length lhs*) #f)]) - (let* ([ref (extend-hash lhs* h ref)] - [body (E body ref comp)]) - (let ([rhs* (do-rhs* 0 lhs* rhs* ref comp vref vcomp)]) - (let-values ([(slhs* srhs* llhs* lrhs* clhs* crhs*) - (partition-rhs* 0 lhs* rhs* vref vcomp)]) - (let ([v* (map (lambda (x) (make-primcall 'void '())) clhs*)] - [t* (map (lambda (x) (unique-var 'tmp)) clhs*)]) - (make-bind slhs* srhs* - (make-bind clhs* v* - (make-fix llhs* lrhs* - (make-bind t* crhs* - (build-assign* clhs* t* body))))))))))) - (define (build-assign* lhs* rhs* body) - (cond - [(null? lhs*) body] - [else - (make-seq - (make-assign (car lhs*) (car rhs*)) - (build-assign* (cdr lhs*) (cdr rhs*) body))])) - (define (E x ref comp) - (record-case x - [(constant) x] - [(var) (ref x) x] - [(assign lhs rhs) - (set-var-assigned! lhs #t) - (ref lhs) - (make-assign lhs (E rhs ref comp))] - [(primref) x] - [(bind lhs* rhs* body) - (let ([rhs* (E* rhs* ref comp)]) - (let ([h (make-hash-table)]) - (let ([body (E body (extend-hash lhs* h ref) comp)]) - (make-bind lhs* rhs* body))))] - [(recbind lhs* rhs* body) - (if (null? lhs*) - (E body ref comp) - (do-recbind lhs* rhs* body ref comp))] - [(conditional e0 e1 e2) - (make-conditional (E e0 ref comp) (E e1 ref comp) (E e2 ref comp))] - [(seq e0 e1) (make-seq (E e0 ref comp) (E e1 ref comp))] - [(clambda cls*) - (make-clambda - (map (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (let ([h (make-hash-table)]) - (let ([body (E body (extend-hash fml* h ref) void)]) - (make-clambda-case fml* proper body)))])) - cls*))] - [(primcall rator rand*) - (when (memq rator '(call/cc call/cf)) - (comp)) - (make-primcall rator (E* rand* ref comp))] - [(funcall rator rand*) - (let ([rator (E rator ref comp)] [rand* (E* rand* ref comp)]) - (record-case rator - [(primref op) - (when (memq op '(call/cc call/cf)) - (comp))] - [else - (comp)]) - (make-funcall rator rand*))] - [(appcall rator rand*) - (let ([rator (E rator ref comp)] [rand* (E* rand* ref comp)]) - (record-case rator - [(primref op) - (when (memq op '(call/cc call/cf)) - (comp))] - [else - (comp)]) - (make-appcall rator rand*))] - [(forcall rator rand*) - (make-forcall rator (E* rand* ref comp))] - [else (error who "invalid expression ~s" (unparse x))])) - (E x (lambda (x) (error who "free var ~s found" x)) - void)) - - -(define (remove-letrec x) - (define who 'remove-letrec) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(recbind lhs* rhs* body) - (let ([t* (map (lambda (lhs) (unique-var 'tmp)) lhs*)] - [v* (map (lambda (lhs) (make-primcall 'void '())) lhs*)]) - (make-bind lhs* v* - (make-bind t* (map Expr rhs*) - (let f ([lhs* lhs*] [t* t*]) - (cond - [(null? lhs*) (Expr body)] - [else - (make-seq - (make-assign (car lhs*) (car t*)) - (f (cdr lhs*) (cdr t*)))])))))] - ;[(fix lhs* rhs* body) - ; (Expr (make-recbind lhs* rhs* body))] - [(fix lhs* rhs* body) - (make-fix lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional - (Expr test) - (Expr conseq) - (Expr altern))] - [(seq e0 e1) - (make-seq (Expr e0) (Expr e1))] - [(clambda cls*) - (make-clambda - (map (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Expr body))])) - cls*))] - [(primcall rator rand*) - (make-primcall rator (map Expr rand*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall rator rand*) - (make-appcall (Expr rator) (map Expr rand*))] - [(forcall rator rand*) - (make-forcall rator (map Expr rand*))] - [(assign lhs rhs) - (make-assign lhs (Expr rhs))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - - -(define (uncover-assigned x) - (define who 'uncover-assigned) - (define (Expr* x*) - (for-each Expr x*)) - (define (Expr x) - (record-case x - [(constant) (void)] - [(var) (void)] - [(primref) (void)] - [(bind lhs* rhs* body) - (begin (Expr body) (Expr* rhs*))] - [(recbind lhs* rhs* body) - (begin (Expr body) (Expr* rhs*))] - [(fix lhs* rhs* body) - (Expr* rhs*) - (Expr body) - (when (ormap var-assigned lhs*) - (error 'uncover-assigned "a fix lhs is assigned"))] - [(conditional test conseq altern) - (begin (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (begin (Expr e0) (Expr e1))] - [(clambda cls*) - (for-each - (lambda (cls) - (Expr (clambda-case-body cls))) - cls*)] - [(primcall rator rand*) (Expr* rand*)] - [(funcall rator rand*) - (begin (Expr rator) (Expr* rand*))] - [(appcall rator rand*) - (begin (Expr rator) (Expr* rand*))] - [(forcall rator rand*) (Expr* rand*)] - [(assign lhs rhs) - (set-var-assigned! lhs #t) - (Expr rhs)] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - - -(define (rewrite-assignments x) - (define who 'rewrite-assignments) - (define (fix-lhs* lhs*) - (cond - [(null? lhs*) (values '() '() '())] - [else - (let ([x (car lhs*)]) - (let-values ([(lhs* a-lhs* a-rhs*) (fix-lhs* (cdr lhs*))]) - (cond - [(var-assigned x) - (let ([t (unique-var 'assignment-tmp)]) - (values (cons t lhs*) (cons x a-lhs*) (cons t a-rhs*)))] - [else - (values (cons x lhs*) a-lhs* a-rhs*)])))])) - (define (bind-assigned lhs* rhs* body) - (cond - [(null? lhs*) body] - [else - (make-bind lhs* - (map (lambda (rhs) (make-primcall 'vector (list rhs))) rhs*) - body)])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) - (cond - [(var-assigned x) - (make-primcall '$vector-ref (list x (make-constant 0)))] - [else x])] - [(primref) x] - [(bind lhs* rhs* body) - (let-values ([(lhs* a-lhs* a-rhs*) (fix-lhs* lhs*)]) - (make-bind lhs* (map Expr rhs*) - (bind-assigned a-lhs* a-rhs* (Expr body))))] - [(fix lhs* rhs* body) - (make-fix lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(clambda cls*) - (make-clambda - (map (lambda (cls) - (record-case cls - [(clambda-case fml* proper body) - (let-values ([(fml* a-lhs* a-rhs*) (fix-lhs* fml*)]) - (make-clambda-case fml* proper - (bind-assigned a-lhs* a-rhs* (Expr body))))])) - cls*))] - [(primcall op rand*) - (make-primcall op (map Expr rand*))] - [(forcall op rand*) - (make-forcall op (map Expr rand*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall rator rand*) - (make-appcall (Expr rator) (map Expr rand*))] - [(assign lhs rhs) - (unless (var-assigned lhs) - (error 'rewrite-assignments "not assigned ~s in ~s" lhs x)) - (make-primcall '$vector-set! (list lhs (make-constant 0) (Expr rhs)))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - -(define (remove-assignments x) - (uncover-assigned x) - (rewrite-assignments x)) - - - - - -(define (convert-closures prog) - (define who 'convert-closures) - (define (Expr* x*) - (cond - [(null? x*) (values '() '())] - [else - (let-values ([(a a-free) (Expr (car x*))] - [(d d-free) (Expr* (cdr x*))]) - (values (cons a d) (union a-free d-free)))])) - (define (do-clambda* x*) - (cond - [(null? x*) (values '() '())] - [else - (let-values ([(a a-free) (do-clambda (car x*))] - [(d d-free) (do-clambda* (cdr x*))]) - (values (cons a d) (union a-free d-free)))])) - (define (do-clambda x) - (record-case x - [(clambda cls*) - (let-values ([(cls* free) - (let f ([cls* cls*]) - (cond - [(null? cls*) (values '() '())] - [else - (record-case (car cls*) - [(clambda-case fml* proper body) - (let-values ([(body body-free) (Expr body)] - [(cls* cls*-free) (f (cdr cls*))]) - (values - (cons (make-clambda-case fml* proper body) - cls*) - (union (difference body-free fml*) - cls*-free)))])]))]) - (values (make-closure (make-clambda-code (gensym) cls* free) free) - free))])) - (define (Expr ex) - (record-case ex - [(constant) (values ex '())] - [(var) (values ex (singleton ex))] - [(primref) (values ex '())] - [(bind lhs* rhs* body) - (let-values ([(rhs* rhs-free) (Expr* rhs*)] - [(body body-free) (Expr body)]) - (values (make-bind lhs* rhs* body) - (union rhs-free (difference body-free lhs*))))] - [(fix lhs* rhs* body) - (let-values ([(rhs* rfree) (do-clambda* rhs*)] - [(body bfree) (Expr body)]) - (values (make-fix lhs* rhs* body) - (difference (union bfree rfree) lhs*)))] - [(conditional test conseq altern) - (let-values ([(test test-free) (Expr test)] - [(conseq conseq-free) (Expr conseq)] - [(altern altern-free) (Expr altern)]) - (values (make-conditional test conseq altern) - (union test-free (union conseq-free altern-free))))] - [(seq e0 e1) - (let-values ([(e0 e0-free) (Expr e0)] - [(e1 e1-free) (Expr e1)]) - (values (make-seq e0 e1) (union e0-free e1-free)))] - [(clambda) - (do-clambda ex)] - [(primcall op rand*) - (let-values ([(rand* rand*-free) (Expr* rand*)]) - (values (make-primcall op rand*) rand*-free))] - [(forcall op rand*) - (let-values ([(rand* rand*-free) (Expr* rand*)]) - (values (make-forcall op rand*) rand*-free))] - [(funcall rator rand*) - (let-values ([(rator rat-free) (Expr rator)] - [(rand* rand*-free) (Expr* rand*)]) - (values (make-funcall rator rand*) - (union rat-free rand*-free)))] - [(appcall rator rand*) - (let-values ([(rator rat-free) (Expr rator)] - [(rand* rand*-free) (Expr* rand*)]) - (values (make-appcall rator rand*) - (union rat-free rand*-free)))] - [else (error who "invalid expression ~s" (unparse ex))])) - (let-values ([(prog free) (Expr prog)]) - (unless (null? free) - (error 'convert-closures "free vars ~s encountered in ~a" - free (unparse prog))) - prog)) - - -(define (lift-codes x) - (define who 'lift-codes) - (define all-codes '()) - (define (do-code x) - (record-case x - [(clambda-code label cls* free) - (let ([cls* (map - (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (E body))])) - cls*)]) - (let ([g (make-code-loc label)]) - (set! all-codes - (cons (make-clambda-code label cls* free) all-codes)) - g))])) - (define (E x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map E rhs*) (E body))] - [(fix lhs* rhs* body) - (make-fix lhs* (map E rhs*) (E body))] - [(conditional test conseq altern) - (make-conditional (E test) (E conseq) (E altern))] - [(seq e0 e1) (make-seq (E e0) (E e1))] - [(closure c free) (make-closure (do-code c) free)] - [(primcall op rand*) (make-primcall op (map E rand*))] - [(forcall op rand*) (make-forcall op (map E rand*))] - [(funcall rator rand*) (make-funcall (E rator) (map E rand*))] - [(appcall rator rand*) (make-appcall (E rator) (map E rand*))] - [else (error who "invalid expression ~s" (unparse x))])) - (let ([x (E x)]) - (make-codes all-codes x))) - - - - -(define (syntactically-valid? op rand*) - (define (valid-arg-count? op rand*) - (let ([n (open-coded-primitive-args op)] [m (length rand*)]) - (cond - [(eq? n 'any) #t] - [(eq? n 'positive) (fx> m 1)] - [(eq? n 'no-code) - (error 'syntactically-valid - "should not primcall non codable prim ~s" op)] - [(fixnum? n) - (cond - [(fx= n m) #t] - [else - (error 'compile - "Possible incorrect number of args in ~s" - (cons op (map unparse rand*))) - #f])] - [else (error 'do-primcall "BUG: what ~s" n)]))) - (define (check op pred?) - (lambda (arg) - (record-case arg - [(constant c) - (cond - [(pred? c) #t] - [else - (error 'compile "Possible argument error to primitive ~s" op) - #f])] - [(primref) - (cond - [(pred? (lambda (x) x)) #t] - [else - (error 'compile "Possible argument error to primitive ~s" op) - #f])] - [else #t]))) - (define (nonnegative-fixnum? n) - (and (fixnum? n) (fx>= n 0))) - (define (byte? n) - (and (fixnum? n) (fx<= 0 n) (fx<= n 127))) - (define (valid-arg-types? op rand*) - (case op - [(fixnum? immediate? boolean? char? vector? string? procedure? - null? pair? not cons eq? vector symbol? error eof-object eof-object? - void $unbound-object? $code? $forward-ptr? bwp-object? - pointer-value top-level-value car cdr list* list $record - port? input-port? output-port? - $make-port/input $make-port/output $make-port/both - $port-handler - $port-input-buffer $port-input-index $port-input-size - $port-output-buffer $port-output-index $port-output-size - $set-port-input-index! $set-port-input-size! - $set-port-output-index! $set-port-output-size! ) - '#t] - [($fxadd1 $fxsub1 $fxzero? $fxlognot $fxlogor $fxlogand $fx+ $fx- $fx* - $fx= $fx< $fx<= $fx> $fx>= $fxquotient $fxmodulo $fxsll $fxsra $fxlogxor $exit) - (andmap (check op fixnum?) rand*)] - [($fixnum->char) - (andmap (check op byte?) rand*)] - [($char->fixnum $char= $char< $char<= $char> $char>= $string) - (andmap (check op char?) rand*)] - [($make-vector $make-string) - (andmap (check op nonnegative-fixnum?) rand*)] - [($car $cdr) - (andmap (check op pair?) rand*)] - [($vector-length) - (andmap (check op vector?) rand*)] - [($string-length) - (andmap (check op string?) rand*)] - [($set-car! $set-cdr!) - ((check op pair?) (car rand*))] - [($vector-ref $vector-set!) - (and ((check op vector?) (car rand*)) - ((check op nonnegative-fixnum?) (cadr rand*)))] - [($string-ref $string-set! - $string-ref-16+0 $string-ref-16+1 $string-ref-8+0 $string-ref-8+2) - (and ((check op string?) (car rand*)) - ((check op nonnegative-fixnum?) (cadr rand*)))] - [($symbol-string $symbol-unique-string) - (andmap (check op symbol?) rand*)] - [($constant-ref $set-constant! $intern $pcb-set! $pcb-ref $make-symbol - $symbol-value $set-symbol-value! $symbol-plist $set-symbol-plist! - $set-symbol-system-value! $set-symbol-system-value! - $set-symbol-unique-string! - $set-symbol-string! - $seal-frame-and-call $frame->continuation $code->closure - $code-size $code-reloc-vector $code-freevars - $code-ref $code-set! - $make-record $record? $record/rtd? $record-rtd $record-ref $record-set! - primitive-set! primitive-ref - $make-tcbucket $tcbucket-key $tcbucket-val $tcbucket-next - $set-tcbucket-val! $set-tcbucket-next! $set-tcbucket-tconc!) - #t] - [else (error 'valid-arg-types? "unhandled op ~s" op)])) - (and (valid-arg-count? op rand*) - (or (null? rand*) - (valid-arg-types? op rand*)))) - - -;;; the output of simplify-operands differs from the input in that the -;;; operands to primcalls are all simple (variables, primrefs, or constants). -;;; funcalls to open-codable primrefs whos arguments are "ok" are converted to -;;; primcalls. - - -(define uninlined '()) -(define (mark-uninlined x) - (cond - [(assq x uninlined) => - (lambda (p) (set-cdr! p (fxadd1 (cdr p))))] - [else (set! uninlined (cons (cons x 1) uninlined))])) - -(module () - (primitive-set! 'uninlined-stats - (lambda () - (let f ([ls uninlined] [ac '()]) - (cond - [(null? ls) ac] - [(fx> (cdar ls) 15) - (f (cdr ls) (cons (car ls) ac))] - [else (f (cdr ls) ac)]))))) - -(define (introduce-primcalls x) - (define who 'introduce-primcalls) - (define (simple? x) - (or (constant? x) (var? x) (primref? x))) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(fix lhs* rhs* body) - (make-fix lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (case op - ;[(values) - ; (if (fx= (length arg*) 1) - ; (Expr (car arg*)) - ; (begin - ; (warning 'compile "possible incorrect number of values") - ; (make-funcall (make-primref 'values) (map Expr arg*))))] - [else - (make-primcall op (map Expr arg*))])] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (cond - [(and (primref? rator) - (open-codeable? (primref-name rator)) - (syntactically-valid? (primref-name rator) rand*)) - (Expr (make-primcall (primref-name rator) rand*))] - [else - (when (primref? rator) - (mark-uninlined (primref-name rator))) - (make-funcall (Expr rator) (map Expr rand*))])] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(constant) (make-return x)] - [(var) (make-return x)] - [(primref) (make-return x)] - [(closure) (make-return x)] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(fix lhs* rhs* body) - (make-fix lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(primcall op arg*) - (case op - ;[(values) - ; (if (fx= (length arg*) 1) - ; (make-return (Expr (car arg*))) - ; (make-return* (map Expr arg*)))] - [else - (make-return (make-primcall op (map Expr arg*)))])] - [(forcall op arg*) - (make-return (make-forcall op (map Expr arg*)))] - [(funcall rator rand*) - (cond - [(and (primref? rator) - (open-codeable? (primref-name rator)) - (syntactically-valid? (primref-name rator) rand*)) - (Tail (make-primcall (primref-name rator) rand*))] - [else - (make-funcall (Expr rator) (map Expr rand*))])] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - -(define (simplify-operands x) - (define who 'simplify-operands) - (define (simple? x) - (or (constant? x) (var? x) (primref? x))) - (define (simplify arg lhs* rhs* k) - (if (simple? arg) - (k arg lhs* rhs*) - (let ([v (unique-var 'tmp)]) - (k v (cons v lhs*) (cons (Expr arg) rhs*))))) - (define (simplify* arg* lhs* rhs* k) - (cond - [(null? arg*) (k '() lhs* rhs*)] - [else - (simplify (car arg*) lhs* rhs* - (lambda (a lhs* rhs*) - (simplify* (cdr arg*) lhs* rhs* - (lambda (d lhs* rhs*) - (k (cons a d) lhs* rhs*)))))])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(fix lhs* rhs* body) - (make-fix lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (cond - [(memq op '(not car cdr)) - (make-primcall op (map Expr arg*))] - [else - (simplify* arg* '() '() - (lambda (arg* lhs* rhs*) - (make-bind^ lhs* rhs* - (make-primcall op arg*))))])] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (make-return (Expr v))] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(fix lhs* rhs* body) - (make-fix lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L clauses free) - (make-clambda-code L (map CaseExpr clauses) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - -(define (insert-stack-overflow-checks x) - (define who 'insert-stack-overflow-checks) - (define (insert-check body) - (make-seq - (make-conditional - (make-primcall '$fp-overflow '()) - (make-funcall (make-primref 'do-stack-overflow) '()) - (make-primcall 'void '())) - body)) - (define (Expr x) - (record-case x - [(constant) #f] - [(var) #f] - [(primref) #f] - [(closure code free*) #f] - [(bind lhs* rhs* body) - (or (ormap Expr rhs*) (Expr body))] - [(fix lhs* rhs* body) (Expr body)] - [(conditional test conseq altern) - (or (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (or (Expr e0) (Expr e1))] - [(primcall op arg*) (ormap Expr arg*)] - [(forcall op arg*) (ormap Expr arg*)] - [(funcall rator arg*) #t] - [(appcall rator arg*) #t] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (Expr v)] - [(bind lhs* rhs* body) - (or (ormap Expr rhs*) (Tail body))] - [(fix lhs* rhs* body) (Tail body)] - [(conditional test conseq altern) - (or (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (or (Expr e0) (Tail e1))] - [(funcall rator arg*) (or (Expr rator) (ormap Expr arg*))] - [(appcall rator arg*) (or (Expr rator) (ormap Expr arg*))] - [else (error who "invalid tail expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (if (Tail body) - (make-clambda-case fml* proper (insert-check body)) - x)])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) - (if (Tail body) - (insert-check body) - body))])) - (CodesExpr x)) - - -(define (insert-allocation-checks x) - (define who 'insert-allocation-checks) - (define (check-bytes n var body) - (make-seq - (make-conditional - (make-primcall '$ap-check-bytes - (list (make-constant n) var)) - (make-forcall "ik_collect" ;(make-primref 'do-overflow) - (list - (make-primcall '$fx+ - (list (make-constant (fx+ n 4096)) var)))) - (make-primcall 'void '())) - body)) - (define (check-words n var body) - (make-seq - (make-conditional - (make-primcall '$ap-check-words - (list (make-constant n) var)) - (make-forcall "ik_collect" ; (make-primref 'do-overflow-words) - (list - (make-primcall '$fx+ - (list (make-constant (fx+ n 4096)) var)))) - (make-primcall 'void '())) - body)) - (define (check-const n body) - (make-seq - (make-conditional - (make-primcall '$ap-check-const - (list (make-constant n))) - (make-forcall "ik_collect" ;(make-primref 'do-overflow) - (list (make-constant (fx+ n 4096)))) - (make-primcall 'void '())) - body)) - (define (closure-size x) - (record-case x - [(closure code free*) - (align (fx+ disp-closure-data (fx* (length free*) wordsize)))] - [else (error 'closure-size "~s is not a closure" x)])) - (define (sum ac ls) - (cond - [(null? ls) ac] - [else (sum (fx+ ac (car ls)) (cdr ls))])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure) - (check-const (closure-size x) x)] - [(fix lhs* rhs* body) - (if (null? lhs*) - (Expr body) - (check-const (sum 0 (map closure-size rhs*)) - (make-fix lhs* rhs* - (Expr body))))] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (let ([x (make-primcall op (map Expr arg*))]) - (case op - [(cons) (check-const pair-size x)] - [($make-symbol) (check-const symbol-size x)] - [($make-tcbucket) (check-const tcbucket-size x)] - [($frame->continuation $code->closure) - (check-const (fx+ disp-closure-data (fx* (length arg*) wordsize)) x)] - [($make-string) - (record-case (car arg*) - [(constant i) - (check-const (fx+ i (fx+ disp-string-data 1)) x)] - [else - (check-bytes (fxadd1 disp-string-data) (car arg*) x)])] - [($string) - (check-const (fx+ (length arg*) (fx+ disp-string-data 1)) x)] - [($make-port/input $make-port/output $make-port/both) - (check-const port-size x)] - [($make-vector) - (record-case (car arg*) - [(constant i) - (check-const (fx+ (fx* i wordsize) disp-vector-data) x)] - [else - (check-words (fxadd1 disp-vector-data) (car arg*) x)])] - [($make-record) - (record-case (cadr arg*) - [(constant i) - (check-const (fx+ (fx* i wordsize) disp-record-data) x)] - [else - (check-words (fxadd1 disp-record-data) (cadr arg*) x)])] - [(list*) - (check-const (fx* (fxsub1 (length arg*)) pair-size) x)] - [(list) - (check-const (fx* (length arg*) pair-size) x)] - [(vector $record) - (check-const (fx+ (fx* (length arg*) wordsize) disp-vector-data) x)] - [else x]))] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (make-return (Expr v))] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(fix lhs* rhs* body) - (if (null? lhs*) - (Tail body) - (check-const (sum 0 (map closure-size rhs*)) - (make-fix lhs* rhs* - (Tail body))))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - - -(define (remove-local-variables x) - (define who 'remove-local-variables) - (define (simple* x* r) - (map (lambda (x) - (cond - [(assq x r) => cdr] - [else - (when (var? x) (error who "unbound var ~s" x)) - x])) - x*)) - (define (env->mask r sz) - (let ([s (make-vector (fxsra (fx+ sz 7) 3) 0)]) - (for-each - (lambda (idx) - (let ([q (fxsra idx 3)] - [r (fxlogand idx 7)]) - (vector-set! s q - (fxlogor (vector-ref s q) (fxsll 1 r))))) - r) - s)) - (define (check? x) - (cond - [(primref? x) #f] ;;;; PRIMREF CHECK - [else #t])) - (define (do-new-frame op rand* si r call-convention rp-convention orig-live) - (make-new-frame (fxadd1 si) (fx+ (length rand*) 2) - (let f ([r* rand*] [nsi (fx+ si 2)] [live orig-live]) - (cond - [(null? r*) - (make-seq - (make-seq - (make-save-cp (make-frame-var si)) - (case call-convention - [(normal apply) - (make-eval-cp (check? op) (Expr op nsi r (cons si live)))] - [(foreign) - (make-eval-cp #f (make-foreign-label op))] - [else (error who "invalid convention ~s" call-convention)])) - (make-call-cp call-convention - rp-convention - (fxadd1 si) ; frame size - (length rand*) ; argc - (env->mask (cons si orig-live) ; cp and everything before it - (fxadd1 si))))] ; mask-size ~~ frame size - [else - (make-seq - (make-assign (make-frame-var nsi) - (Expr (car r*) nsi r live)) - (f (cdr r*) (fxadd1 nsi) (cons nsi live)))])))) - (define (nop) (make-primcall 'void '())) - (define (do-bind lhs* rhs* body si r live k) - (let f ([lhs* lhs*] [rhs* rhs*] [si si] [nr r] [live live]) - (cond - [(null? lhs*) (k body si nr live)] - [else - (let ([v (make-frame-var si)]) - (make-seq - (make-assign v (Expr (car rhs*) si r live)) - (f (cdr lhs*) (cdr rhs*) (fxadd1 si) - (cons (cons (car lhs*) v) nr) - (cons si live))))]))) - (define (do-closure r) - (lambda (x) - (record-case x - [(closure code free*) - (make-closure code (simple* free* r))]))) - (define (do-fix lhs* rhs* body si r live k) - (let f ([l* lhs*] [nlhs* '()] [si si] [r r] [live live]) - (cond - [(null? l*) - (make-fix (reverse nlhs*) - (map (do-closure r) rhs*) - (k body si r live))] - [else - (let ([v (make-frame-var si)]) - (f (cdr l*) (cons v nlhs*) (fxadd1 si) - (cons (cons (car l*) v) r) - (cons si live)))]))) - (define (do-tail-frame-old op rand* si r call-conv live) - (define (const? x) - (record-case x - [(constant) #t] - [(primref) #t] - [else #f])) - (define (evalrand* rand* i si r live) - (cond - [(null? rand*) - (make-eval-cp (check? op) (Expr op si r live))] - [(const? (car rand*)) - (evalrand* (cdr rand*) (fxadd1 i) (fxadd1 si) r live)] - [else - (let ([v (make-frame-var si)] - [rhs (Expr (car rand*) si r live)]) - (cond - [(and (frame-var? rhs) - (fx= (frame-var-idx rhs) i)) - (evalrand* (cdr rand*) (fx+ i 1) (fx+ si 1) r (cons si live))] - [else - (make-seq - (make-assign v rhs) - (evalrand* (cdr rand*) (fx+ 1 i) (fx+ 1 si) r - (cons si live)))]))])) - (define (moverand* rand* i si ac) - (cond - [(null? rand*) ac] - [(const? (car rand*)) - (make-seq - (make-assign (make-frame-var i) (car rand*)) - (moverand* (cdr rand*) (fxadd1 i) (fxadd1 si) ac))] - [else - (make-seq - (make-assign (make-frame-var i) (make-frame-var si)) - (moverand* (cdr rand*) (fxadd1 i) (fxadd1 si) ac))])) - (make-seq - (evalrand* rand* 1 si r live) - (moverand* rand* 1 si - (make-tailcall-cp call-conv (length rand*))))) - (define (do-tail-frame op rand* si r call-conv live) - (define (const? x) - (record-case x - [(constant) #t] - [(primref) #t] - [else #f])) - (define (evalrand* rand* i si r live ac) - (cond - [(null? rand*) - (make-seq - (make-eval-cp (check? op) (Expr op si r live)) - ac)] - [(const? (car rand*)) - (evalrand* (cdr rand*) (fxadd1 i) (fxadd1 si) r live - (make-seq ac - (make-assign (make-frame-var i) (car rand*))))] - [else - (let ([vsi (make-frame-var si)] - [rhs (Expr (car rand*) si r live)]) - (cond - [(and (frame-var? rhs) - (fx= (frame-var-idx rhs) i)) - (evalrand* (cdr rand*) (fx+ i 1) (fx+ si 1) r (cons si live) ac)] - [(fx= i si) - (make-seq - (make-assign vsi rhs) - (evalrand* (cdr rand*) (fx+ i 1) (fx+ si 1) r - (cons si live) ac))] - [else - (make-seq - (make-assign vsi rhs) - (evalrand* (cdr rand*) (fxadd1 i) (fxadd1 si) r (cons si live) - (make-seq ac - (make-assign (make-frame-var i) vsi))))]))])) - (make-seq - (evalrand* rand* 1 si r live (make-primcall 'void '())) - (make-tailcall-cp call-conv (length rand*)))) - (define (Tail x si r live) - (record-case x - [(return v) (make-return (Expr v si r live))] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Tail)] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* body si r live Tail)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Tail conseq si r live) - (Tail altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Tail e1 si r live))] - [(primcall op arg*) - (make-return - (make-primcall op - (map (lambda (x) (Expr x si r live)) arg*)))] - - [(funcall op rand*) - (do-tail-frame op rand* si r 'normal live)] - [(appcall op rand*) - (do-tail-frame op rand* si r 'apply live)] -;;; [(funcall op rand*) -;;; (do-new-frame op rand* si r 'normal 'tail live)] -;;; [(appcall op rand*) -;;; (do-new-frame op rand* si r 'apply 'tail live)] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Effect x si r live) - (record-case x - [(constant) (nop)] - [(var) (nop)] - [(primref) (nop)] - [(closure code free*) (nop)] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Effect)] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* body si r live Effect)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Effect conseq si r live) - (Effect altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Effect e1 si r live))] - [(primcall op arg*) - (make-primcall op - (map (lambda (x) (Expr x si r live)) arg*))] - [(forcall op rand*) - (do-new-frame op rand* si r 'foreign 'effect live)] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'effect live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'effect live)] - [else (error who "invalid effect expression ~s" (unparse x))])) - (define (Expr x si r live) - (record-case x - [(constant) x] - [(var) - (cond - [(assq x r) => cdr] - [else (error who "unbound var ~s" x)])] - [(primref) x] - [(closure code free*) - (make-closure code (simple* free* r))] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Expr)] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* body si r live Expr)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Expr conseq si r live) - (Expr altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Expr e1 si r live))] - [(primcall op arg*) - (make-primcall op - (map (lambda (x) (Expr x si r live)) arg*))] - [(forcall op rand*) - (do-new-frame op rand* si r 'foreign 'value live)] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'value live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'value live)] - [else (error who "invalid expression ~s" (unparse x))])) - (define (bind-fml* fml* r) - (let f ([si 1] [fml* fml*]) - (cond - [(null? fml*) (values '() si r '())] - [else - (let-values ([(nfml* nsi r live) (f (fxadd1 si) (cdr fml*))]) - (let ([v (make-frame-var si)]) - (values (cons v nfml*) - nsi - (cons (cons (car fml*) v) r) - (cons si live))))]))) - (define (bind-free* free*) - (let f ([free* free*] [idx 0] [r '()]) - (cond - [(null? free*) r] - [else - (f (cdr free*) (fxadd1 idx) - (cons (cons (car free*) (make-cp-var idx)) r))]))) - (define CaseExpr - (lambda (r) - (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (let-values ([(fml* si r live) (bind-fml* fml* r)]) - (make-clambda-case fml* proper (Tail body si r live)))])))) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (let ([r (bind-free* free)]) - (make-clambda-code L (map (CaseExpr r) cases) free))])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) - (Tail body 1 '() '()))])) - (CodesExpr x)) - - - -(define checks-elim-count 0) -(define (optimize-ap-check x) - (define who 'optimize-ap-check) - (define (min x y) - (if (fx< x y) x y)) - (define (Tail x f) - (record-case x - [(return v) - (let-values ([(v f) (NonTail v f)]) - (make-return v))] - [(fix lhs* rhs* body) - (make-fix lhs* rhs* (Tail body f))] - [(conditional test conseq altern) - (let-values ([(test f) (NonTail test f)]) - (make-conditional - test - (Tail conseq f) - (Tail altern f)))] - [(seq e0 e1) - (let-values ([(e0 f) (NonTail e0 f)]) - (make-seq e0 (Tail e1 f)))] - [(tailcall-cp) x] - [else (error who "invalid tail expression ~s" (unparse x))])) - (define (do-primcall op arg* f) - (case op - [($ap-check-const) - (let ([n (constant-value (car arg*))]) - (cond - [(fx< n f) - ;(set! checks-elim-count (fxadd1 checks-elim-count)) - ;(printf "~s checks eliminated\n" checks-elim-count) - (values (make-constant #f) (fx- f n))] - [(fx<= n 4096) - (values (make-primcall '$ap-check-const - (list (make-constant 4096))) - (fx- 4096 n))] - [else - (values (make-primcall '$ap-check-const - (list (make-constant (fx+ n 4096)))) - 4096)]))] - [($ap-check-bytes $ap-check-words) - (values (make-primcall op - (list (make-constant (fx+ (constant-value (car arg*)) - 4096)) - (cadr arg*))) - 4096)] - [else (values (make-primcall op arg*) f)])) - (define (NonTail x f) - (record-case x - [(constant) (values x f)] - [(frame-var) (values x f)] - [(cp-var) (values x f)] - [(save-cp) (values x f)] - [(foreign-label) (values x f)] - [(primref) (values x f)] - [(closure) (values x f)] - [(call-cp call-conv) - (if (eq? call-conv 'foreign) - (values x f) - (values x 0))] - [(primcall op arg*) (do-primcall op arg* f)] - [(fix lhs* rhs* body) - (let-values ([(body f) (NonTail body f)]) - (values (make-fix lhs* rhs* body) f))] - [(conditional test conseq altern) - (let-values ([(test f) (NonTail test f)]) - (if (constant? test) - (if (constant-value test) - (NonTail conseq f) - (NonTail altern f)) - (let-values ([(conseq f0) (NonTail conseq f)] - [(altern f1) (NonTail altern f)]) - (values (make-conditional test conseq altern) - (min f0 f1)))))] - [(seq e0 e1) - (let-values ([(e0 f) (NonTail e0 f)]) - (let-values ([(e1 f) (NonTail e1 f)]) - (values (make-seq e0 e1) f)))] - [(assign lhs rhs) - (let-values ([(rhs f) (NonTail rhs f)]) - (values (make-assign lhs rhs) f))] - [(eval-cp check body) - (let-values ([(body f) (NonTail body f)]) - (values (make-eval-cp check body) f))] - [(new-frame base-idx size body) - (let-values ([(body f) (NonTail body f)]) - (values (make-new-frame base-idx size body) f))] - [else (error who "invalid nontail expression ~s" (unparse x))])) - (define CaseExpr - (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body 0))]))) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) - (Tail body 0))])) - (CodesExpr x)) - -(begin - (define fx-shift 2) - (define fx-mask #x03) - (define fx-tag 0) - (define bool-f #x2F) - (define bool-t #x3F) - (define bool-mask #xEF) - (define bool-tag #x2F) - (define bool-shift 4) - (define nil #x4F) - (define eof #x5F) ; double check - (define unbound #x6F) ; double check - (define void-object #x7F) ; double check - (define bwp-object #x8F) ; double check - (define char-shift 8) - (define char-tag #x0F) - (define char-mask #xFF) - (define pair-mask 7) - (define pair-tag 1) - (define disp-car 0) - (define disp-cdr 4) - (define pair-size 8) - (define pagesize 4096) - (define pageshift 12) - (define wordsize 4) - (define wordshift 2) - - (define symbol-mask 7) - (define symbol-tag 2) - (define disp-symbol-string 0) - (define disp-symbol-unique-string 4) - (define disp-symbol-value 8) - (define disp-symbol-plist 12) - (define disp-symbol-system-value 16) - (define disp-symbol-system-plist 20) - (define symbol-size 24) - (define vector-tag 5) - (define vector-mask 7) - (define disp-vector-length 0) - (define disp-vector-data 4) - (define string-mask 7) - (define string-tag 6) - (define disp-string-length 0) - (define disp-string-data 4) - (define closure-mask 7) - (define closure-tag 3) - (define disp-closure-data 4) - (define disp-closure-code 0) - (define continuation-size 16) - (define continuation-tag #x1F) - (define disp-continuation-top 4) - (define disp-continuation-size 8) - (define disp-continuation-next 12) - (define code-tag #x2F) - (define disp-code-instrsize 4) - (define disp-code-relocsize 8) - (define disp-code-freevars 12) - (define disp-code-data 16) - (define port-tag #x3F) - (define input-port-tag #x7F) - (define output-port-tag #xBF) - (define input/output-port-tag #xFF) - (define port-mask #x3F) - (define disp-port-handler 4) - (define disp-port-input-buffer 8) - (define disp-port-input-index 12) - (define disp-port-input-size 16) - (define disp-port-output-buffer 20) - (define disp-port-output-index 24) - (define disp-port-output-size 28) - (define port-size 32) - (define disp-tcbucket-tconc 0) - (define disp-tcbucket-key 4) - (define disp-tcbucket-val 8) - (define disp-tcbucket-next 12) - (define tcbucket-size 24) - (define record-ptag 5) - (define record-pmask 7) - (define disp-record-rtd 0) - (define disp-record-data 4) - (define disp-frame-size -17) - (define disp-frame-offset -13) - (define disp-multivalue-rp -9) - (define object-alignment 8) - (define align-shift 3) - (define dirty-word -1)) - -(define (align n) - (fxsll (fxsra (fx+ n (fxsub1 object-alignment)) align-shift) align-shift)) - -(begin - (define (mem off val) - (cond - [(fixnum? off) (list 'disp (int off) val)] - [(register? off) (list 'disp off val)] - [else (error 'mem "invalid disp ~s" off)])) - (define (int x) (list 'int x)) - (define (obj x) (list 'obj x)) - (define (byte x) (list 'byte x)) - (define (byte-vector x) (list 'byte-vector x)) - (define (movzbl src targ) (list 'movzbl src targ)) - (define (sall src targ) (list 'sall src targ)) - (define (sarl src targ) (list 'sarl src targ)) - (define (shrl src targ) (list 'shrl src targ)) - (define (notl src) (list 'notl src)) - (define (pushl src) (list 'pushl src)) - (define (popl src) (list 'popl src)) - (define (orl src targ) (list 'orl src targ)) - (define (xorl src targ) (list 'xorl src targ)) - (define (andl src targ) (list 'andl src targ)) - (define (movl src targ) (list 'movl src targ)) - (define (movb src targ) (list 'movb src targ)) - (define (addl src targ) (list 'addl src targ)) - (define (imull src targ) (list 'imull src targ)) - (define (idivl src) (list 'idivl src)) - (define (subl src targ) (list 'subl src targ)) - (define (push src) (list 'push src)) - (define (pop targ) (list 'pop targ)) - (define (sete targ) (list 'sete targ)) - (define (call targ) (list 'call targ)) - (define (tail-indirect-cpr-call) - (jmp (mem (fx- disp-closure-code closure-tag) cpr))) - (define (indirect-cpr-call) - (call (mem (fx- disp-closure-code closure-tag) cpr))) - (define (negl targ) (list 'negl targ)) - (define (label x) (list 'label x)) - (define (label-address x) (list 'label-address x)) - (define (ret) '(ret)) - (define (cltd) '(cltd)) - (define (cmpl arg1 arg2) (list 'cmpl arg1 arg2)) - (define (je label) (list 'je label)) - (define (jne label) (list 'jne label)) - (define (jle label) (list 'jle label)) - (define (jge label) (list 'jge label)) - (define (jg label) (list 'jg label)) - (define (jl label) (list 'jl label)) - (define (jb label) (list 'jb label)) - (define (ja label) (list 'ja label)) - (define (jmp label) (list 'jmp label)) - (define edi '%edx) ; closure pointer - (define esi '%esi) ; pcb - (define ebp '%ebp) ; allocation pointer - (define esp '%esp) ; stack base pointer - (define al '%al) - (define ah '%ah) - (define bh '%bh) - (define cl '%cl) - (define eax '%eax) - (define ebx '%ebx) - (define ecx '%ecx) - (define edx '%edx) - (define apr '%ebp) - (define fpr '%esp) - (define cpr '%edi) - (define pcr '%esi) - (define register? symbol?) - (define (argc-convention n) - (fx- 0 (fxsll n fx-shift)))) - - -(define pcb-ref - (lambda (x) - (case x - [(allocation-pointer) (mem 0 pcr)] - [(allocation-redline) (mem 4 pcr)] - [(frame-pointer) (mem 8 pcr)] - [(frame-base) (mem 12 pcr)] - [(frame-redline) (mem 16 pcr)] - [(next-continuation) (mem 20 pcr)] - [(system-stack) (mem 24 pcr)] - [(dirty-vector) (mem 28 pcr)] - [else (error 'pcb-ref "invalid arg ~s" x)]))) - -(define (primref-loc op) - (unless (symbol? op) (error 'primref-loc "not a symbol ~s" op)) - (mem (fx- disp-symbol-system-value symbol-tag) - (obj op))) - - -(define (generate-code x) - (define who 'generate-code) - (define (rp-label x) - (case x - [(value) (label-address SL_multiple_values_error_rp)] - [(effect) (label-address SL_multiple_values_ignore_rp)] - [else (error who "invalid rp-convention ~s" x)])) - (define unique-label - (lambda () - (label (gensym)))) - (define (constant-val x) - (cond - [(fixnum? x) (obj x)] - [(boolean? x) (int (if x bool-t bool-f))] - [(null? x) (int nil)] - [(char? x) (int (fx+ (fxsll (char->integer x) char-shift) char-tag))] - [(eq? x (void)) (int void-object)] - [else (obj x)])) - (define (cond-branch op Lt Lf ac) - (define (opposite x) - (cadr (assq x '([je jne] [jl jge] [jle jg] [jg jle] [jge jl])))) - (unless (or Lt Lf) - (error 'cond-branch "no labels")) - (cond - [(not Lf) (cons (list op Lt) ac)] - [(not Lt) (cons (list (opposite op) Lf) ac)] - [else (list* (list op Lt) (jmp Lf) ac)])) - (define (indirect-type-pred pri-mask pri-tag sec-mask sec-tag rand* Lt Lf ac) - (cond - [(and Lt Lf) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne Lf) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (jne Lf) - (jmp Lt) - ac)] - [Lf - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne Lf) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (jne Lf) - ac)] - [Lt - (let ([L_END (unique-label)]) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne L_END) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (je Lt) - L_END - ac))] - [else ac])) - (define (type-pred mask tag rand* Lt Lf ac) - (cond - [mask - (list* - (movl (Simple (car rand*)) eax) - (andl (int mask) eax) - (cmpl (int tag) eax) - (cond-branch 'je Lt Lf ac))] - [else - (let ([v (Simple (car rand*))]) - (cond - [(memq (car v) '(mem register)) - (list* - (cmpl (int tag) (Simple (car rand*))) - (cond-branch 'je Lt Lf ac))] - [else - (list* - (movl (Simple (car rand*)) eax) - (cmpl (int tag) eax) - (cond-branch 'je Lt Lf ac))]))])) - (define (compare-and-branch op rand* Lt Lf ac) - (define (opposite x) - (cadr (assq x '([je je] [jl jg] [jle jge] [jg jl] [jge jle])))) - (cond - [(and (constant? (car rand*)) (constant? (cadr rand*))) - (list* - (movl (Simple (car rand*)) eax) - (cmpl (Simple (cadr rand*)) eax) - (cond-branch op Lt Lf ac))] - [(constant? (cadr rand*)) - (list* - (cmpl (Simple (cadr rand*)) (Simple (car rand*))) - (cond-branch op Lt Lf ac))] - [(constant? (car rand*)) - (list* - (cmpl (Simple (car rand*)) (Simple (cadr rand*))) - (cond-branch (opposite op) Lt Lf ac))] - [else - (list* - (movl (Simple (car rand*)) eax) - (cmpl (Simple (cadr rand*)) eax) - (cond-branch op Lt Lf ac))])) - (define (do-pred-prim op rand* Lt Lf ac) - (case op - [(fixnum?) (type-pred fx-mask fx-tag rand* Lt Lf ac)] - [(pair?) (type-pred pair-mask pair-tag rand* Lt Lf ac)] - [(char?) (type-pred char-mask char-tag rand* Lt Lf ac)] - [(string?) (type-pred string-mask string-tag rand* Lt Lf ac)] - [(symbol?) (type-pred symbol-mask symbol-tag rand* Lt Lf ac)] - [(procedure?) (type-pred closure-mask closure-tag rand* Lt Lf ac)] - [(boolean?) (type-pred bool-mask bool-tag rand* Lt Lf ac)] - [(null?) (type-pred #f nil rand* Lt Lf ac)] - [($unbound-object?) (type-pred #f unbound rand* Lt Lf ac)] - [($forward-ptr?) (type-pred #f -1 rand* Lt Lf ac)] - [(not) (Pred (car rand*) Lf Lt ac)] - ;[(not) (type-pred #f bool-f rand* Lt Lf ac)] - [(eof-object?) (type-pred #f eof rand* Lt Lf ac)] - [(bwp-object?) (type-pred #f bwp-object rand* Lt Lf ac)] - [($code?) - (indirect-type-pred vector-mask vector-tag #f code-tag - rand* Lt Lf ac)] - [($fxzero?) (type-pred #f 0 rand* Lt Lf ac)] - [($fx= $char= eq?) (compare-and-branch 'je rand* Lt Lf ac)] - [($fx< $char<) (compare-and-branch 'jl rand* Lt Lf ac)] - [($fx<= $char<=) (compare-and-branch 'jle rand* Lt Lf ac)] - [($fx> $char>) (compare-and-branch 'jg rand* Lt Lf ac)] - [($fx>= $char>=) (compare-and-branch 'jge rand* Lt Lf ac)] - [(vector?) - (indirect-type-pred vector-mask vector-tag fx-mask fx-tag - rand* Lt Lf ac)] - [($record?) - (indirect-type-pred record-pmask record-ptag record-pmask record-ptag - rand* Lt Lf ac)] - [(output-port?) - (indirect-type-pred - vector-mask vector-tag #f output-port-tag rand* Lt Lf ac)] - [(input-port?) - (indirect-type-pred - vector-mask vector-tag #f input-port-tag rand* Lt Lf ac)] - [(port?) - (indirect-type-pred - vector-mask vector-tag port-mask port-tag rand* Lt Lf ac)] - [($record/rtd?) - (cond - [Lf - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int vector-mask) eax) - (cmpl (int vector-tag) eax) - (jne Lf) - (movl (Simple (cadr rand*)) eax) - (cmpl (mem (fx- disp-record-rtd vector-tag) ebx) eax) - (jne Lf) - (if Lt - (cons (jmp Lt) ac) - ac))] - [Lt - (let ([Ljoin (unique-label)]) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int vector-mask) eax) - (cmpl (int vector-tag) eax) - (jne Ljoin) - (movl (Simple (cadr rand*)) eax) - (cmpl (mem (fx- disp-record-rtd vector-tag) ebx) eax) - (je Lt) - Ljoin - ac))] - [else ac])] - [(immediate?) - (cond - [(and Lt Lf) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Lt) - (andl (int 7) eax) - (cmpl (int 7) eax) - (je Lt) - (jmp Lf) - ac)] - [Lt - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Lt) - (andl (int 7) eax) - (cmpl (int 7) eax) - (je Lt) - ac)] - [Lf - (let ([Ljoin (unique-label)]) - (list* - (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Ljoin) - (andl (int 7) eax) - (cmpl (int 7) eax) - (jne Lf) - Ljoin - ac))] - [else ac])] - [($ap-check-words) - (record-case (car rand*) - [(constant i) - (list* (movl (pcb-ref 'allocation-redline) eax) - (subl (Simple (cadr rand*)) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac))] - [else (error who "ap-check-words")])] - [($ap-check-bytes) - (record-case (car rand*) - [(constant i) - (list* (movl (Simple (cadr rand*)) eax) - (negl eax) - (addl (pcb-ref 'allocation-redline) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac))] - [else (error who "ap-check-bytes")])] - [($ap-check-const) - (record-case (car rand*) - [(constant i) - (if (fx<= i pagesize) - (list* - (cmpl (pcb-ref 'allocation-redline) apr) - (cond-branch 'jge Lt Lf ac)) - (list* - (movl (pcb-ref 'allocation-redline) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac)))] - [else (error who "ap-check-const")])] - [($fp-at-base) - (list* - (movl (pcb-ref 'frame-base) eax) - (subl (int wordsize) eax) - (cmpl eax fpr) - (cond-branch 'je Lt Lf ac))] - [($fp-overflow) - (list* (cmpl (pcb-ref 'frame-redline) fpr) - (cond-branch 'jle Lt Lf ac))] - [($vector-ref top-level-value car cdr $record-ref) - (do-value-prim op rand* - (do-simple-test eax Lt Lf ac))] - [(cons void $fxadd1 $fxsub1) - ;;; always true - (do-effect-prim op rand* - (cond - [(not Lt) ac] - [else (cons (jmp Lt) ac)]))] - [else - (error 'pred-prim "HERE unhandled ~s" op)])) - (define (do-pred->value-prim op rand* ac) - (case op - [else - (let ([Lf (unique-label)] [Lj (unique-label)]) - (do-pred-prim op rand* #f Lf - (list* (movl (constant-val #t) eax) - (jmp Lj) - Lf - (movl (constant-val #f) eax) - Lj - ac)))])) - (define (indirect-ref arg* off ac) - (list* - (movl (Simple (car arg*)) eax) - (movl (mem off eax) eax) - ac)) - (define (do-make-port tag args ac) - (let f ([args args] [idx disp-vector-data]) - (cond - [(null? args) - (if (fx= idx port-size) - (list* - (movl (int tag) (mem 0 apr)) - (movl apr eax) - (addl (int port-size) apr) - (addl (int vector-tag) eax) - ac) - (error 'do-make-port "BUG"))] - [else - (list* - (movl (Simple (car args)) eax) - (movl eax (mem idx apr)) - (f (cdr args) (fx+ idx wordsize)))]))) - (define (do-value-prim op arg* ac) - (case op - [(eof-object) (cons (movl (int eof) eax) ac)] - [(void) (cons (movl (int void-object) eax) ac)] - [($fxadd1) - (list* (movl (Simple (car arg*)) eax) - (addl (constant-val 1) eax) - ac)] - [($fxsub1) - (list* (movl (Simple (car arg*)) eax) - (addl (constant-val -1) eax) - ac)] - [($fx+) - (list* (movl (Simple (car arg*)) eax) - (addl (Simple (cadr arg*)) eax) - ac)] - [($fx-) - (list* (movl (Simple (car arg*)) eax) - (subl (Simple (cadr arg*)) eax) - ac)] - [($fx*) - (cond - [(constant? (car arg*)) - (record-case (car arg*) - [(constant c) - (unless (fixnum? c) - (error who "invalid arg ~s to fx*" c)) - (list* (movl (Simple (cadr arg*)) eax) - (imull (int c) eax) - ac)])] - [(constant? (cadr arg*)) - (record-case (cadr arg*) - [(constant c) - (unless (fixnum? c) - (error who "invalid arg ~s to fx*" c)) - (list* (movl (Simple (car arg*)) eax) - (imull (int c) eax) - ac)])] - [else - (list* (movl (Simple (car arg*)) eax) - (sarl (int fx-shift) eax) - (imull (Simple (cadr arg*)) eax) - ac)])] - [($fxquotient) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (cltd) - (idivl ecx) - (sall (int fx-shift) eax) - ac)] - [($fxmodulo) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl eax ecx) - (xorl ebx ecx) - (sarl (int (fxsub1 (fx* wordsize 8))) ecx) - (andl ebx ecx) - (cltd) - (idivl ebx) - (movl edx eax) - (addl ecx eax) - ac)] - [($fxlogor) - (list* (movl (Simple (car arg*)) eax) - (orl (Simple (cadr arg*)) eax) - ac)] - [($fxlogand) - (list* (movl (Simple (car arg*)) eax) - (andl (Simple (cadr arg*)) eax) - ac)] - [($fxlogxor) - (list* (movl (Simple (car arg*)) eax) - (xorl (Simple (cadr arg*)) eax) - ac)] - [($fxsra) - (record-case (cadr arg*) - [(constant i) - (unless (fixnum? i) (error who "invalid arg to fxsra")) - (list* (movl (Simple (car arg*)) eax) - (sarl (int (fx+ i fx-shift)) eax) - (sall (int fx-shift) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (sarl (int fx-shift) ecx) - (sarl (int fx-shift) eax) - (sarl cl eax) - (sall (int fx-shift) eax) - ac)])] - [($fxsll) - (record-case (cadr arg*) - [(constant i) - (unless (fixnum? i) (error who "invalid arg to fxsll")) - (list* (movl (Simple (car arg*)) eax) - (sall (int i) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (sarl (int fx-shift) ecx) - (sall cl eax) - ac)])] - [($fixnum->char) - (list* (movl (Simple (car arg*)) eax) - (sall (int (fx- char-shift fx-shift)) eax) - (orl (int char-tag) eax) - ac)] - [($char->fixnum) - (list* (movl (Simple (car arg*)) eax) - (sarl (int (fx- char-shift fx-shift)) eax) - ac)] - [($fxlognot) - (list* (movl (Simple (car arg*)) eax) - (orl (int fx-mask) eax) - (notl eax) - ac)] - [($car) (indirect-ref arg* (fx- disp-car pair-tag) ac)] - [($cdr) (indirect-ref arg* (fx- disp-cdr pair-tag) ac)] - [($vector-length) - (indirect-ref arg* (fx- disp-vector-length vector-tag) ac)] - [($string-length) - (indirect-ref arg* (fx- disp-string-length string-tag) ac)] - [($symbol-string) - (indirect-ref arg* (fx- disp-symbol-string symbol-tag) ac)] - [($symbol-unique-string) - (indirect-ref arg* (fx- disp-symbol-unique-string symbol-tag) ac)] - [($symbol-value) - (indirect-ref arg* (fx- disp-symbol-value symbol-tag) ac)] - [(primitive-ref) - (indirect-ref arg* (fx- disp-symbol-system-value symbol-tag) ac)] - [($tcbucket-key) - (indirect-ref arg* (fx- disp-tcbucket-key vector-tag) ac)] - [($tcbucket-val) - (indirect-ref arg* (fx- disp-tcbucket-val vector-tag) ac)] - [($tcbucket-next) - (indirect-ref arg* (fx- disp-tcbucket-next vector-tag) ac)] - [($port-handler) - (indirect-ref arg* (fx- disp-port-handler vector-tag) ac)] - [($port-input-buffer) - (indirect-ref arg* (fx- disp-port-input-buffer vector-tag) ac)] - [($port-input-index) - (indirect-ref arg* (fx- disp-port-input-index vector-tag) ac)] - [($port-input-size) - (indirect-ref arg* (fx- disp-port-input-size vector-tag) ac)] - [($port-output-buffer) - (indirect-ref arg* (fx- disp-port-output-buffer vector-tag) ac)] - [($port-output-index) - (indirect-ref arg* (fx- disp-port-output-index vector-tag) ac)] - [($port-output-size) - (indirect-ref arg* (fx- disp-port-output-size vector-tag) ac)] - [(pointer-value) - (list* - (movl (Simple (car arg*)) eax) - (sarl (int fx-shift) eax) - (sall (int fx-shift) eax) - ac)] - [($symbol-plist) - (indirect-ref arg* (fx- disp-symbol-plist symbol-tag) ac)] - [($record-rtd) - (indirect-ref arg* (fx- disp-record-rtd record-ptag) ac)] - [($constant-ref) - (list* (movl (Simple (car arg*)) eax) ac)] - [(car cdr) - (let ([x (car arg*)]) - (NonTail x - (list* - (movl eax ebx) - (andl (int pair-mask) eax) - (cmpl (int pair-tag) eax) - (if (eq? op 'car) - (list* - (jne (label SL_car_error)) - (movl (mem (fx- disp-car pair-tag) ebx) eax) - ac) - (list* - (jne (label SL_cdr_error)) - (movl (mem (fx- disp-cdr pair-tag) ebx) eax) - ac)))))] - [(top-level-value) - (let ([x (car arg*)]) - (cond - [(constant? x) - (let ([v (constant-value x)]) - (cond - [(symbol? v) - (list* - (movl (mem (fx- disp-symbol-value symbol-tag) (obj v)) eax) - (movl (obj v) ebx) - (cmpl (int unbound) eax) - (je (label SL_top_level_value_error)) - ac)] - [else - (list* - (movl (obj v) ebx) - (jmp (label SL_top_level_value_error)) - ac)]))] - [else - (NonTail x - (list* - (movl eax ebx) - (andl (int symbol-mask) eax) - (cmpl (int symbol-tag) eax) - (jne (label SL_top_level_value_error)) - (movl (mem (fx- disp-symbol-value symbol-tag) ebx) eax) - (cmpl (int unbound) eax) - (je (label SL_top_level_value_error)) - ac))]))] - [($vector-ref) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (mem (fx- disp-vector-data vector-tag) ebx) eax) - ac)] - [($record-ref) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (mem (fx- disp-record-data record-ptag) ebx) eax) - ac)] - [($code-ref) - (list* (movl (Simple (cadr arg*)) ebx) - (sarl (int fx-shift) ebx) - (addl (Simple (car arg*)) ebx) - (movl (int 0) eax) - (movb (mem (fx- disp-code-data vector-tag) ebx) ah) - (sarl (int (fx- 8 fx-shift)) eax) - ac)] - [($string-ref) - (list* (movl (Simple (cadr arg*)) ebx) - (sarl (int fx-shift) ebx) - (addl (Simple (car arg*)) ebx) - (movl (int char-tag) eax) - (movb (mem (fx- disp-string-data string-tag) ebx) ah) - ac)] - [($make-string) - (list* (movl (Simple (car arg*)) ebx) - (movl ebx (mem disp-string-length apr)) - (movl apr eax) - (addl (int string-tag) eax) - (sarl (int fx-shift) ebx) - (addl ebx apr) - (movb (int 0) (mem disp-string-data apr)) - (addl (int (fx+ disp-string-data object-alignment)) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [($make-vector) - (list* (movl (Simple (car arg*)) ebx) - (movl ebx (mem disp-vector-length apr)) - (movl apr eax) - (addl (int vector-tag) eax) - (addl ebx apr) - (addl (int (fx+ disp-vector-data (fxsub1 object-alignment))) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [($make-record) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-record-rtd apr)) - (movl apr eax) - (addl (int record-ptag) eax) - (addl (Simple (cadr arg*)) apr) - (addl (int (fx+ disp-record-data (fxsub1 object-alignment))) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [(cons) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl eax (mem disp-car apr)) - (movl apr eax) - (movl ebx (mem disp-cdr apr)) - (addl (int pair-tag) eax) - (addl (int (align pair-size)) apr) - ac)] - [(list) - (cond - [(null? arg*) (NonTail (make-constant '()) ac)] - [else - (list* - (addl (int pair-tag) apr) - (movl apr eax) - (let f ([a (car arg*)] [d (cdr arg*)]) - (list* - (movl (Simple a) ebx) - (movl ebx (mem (fx- disp-car pair-tag) apr)) - (if (null? d) - (list* - (movl (int nil) (mem (fx- disp-cdr pair-tag) apr)) - (addl (int (fx- pair-size pair-tag)) apr) - ac) - (list* - (addl (int pair-size) apr) - (movl apr - (mem (fx- disp-cdr (fx+ pair-tag pair-size)) apr)) - (f (car d) (cdr d)))))))])] - [(list*) - (cond - [(fx= (length arg*) 1) (NonTail (car arg*) ac)] - [(fx= (length arg*) 2) (NonTail (make-primcall 'cons arg*) ac)] - [else - (list* - (addl (int pair-tag) apr) - (movl apr eax) - (let f ([a (car arg*)] [b (cadr arg*)] [d (cddr arg*)]) - (list* - (movl (Simple a) ebx) - (movl ebx (mem (fx- disp-car pair-tag) apr)) - (if (null? d) - (list* - (movl (Simple b) ebx) - (movl ebx (mem (fx- disp-cdr pair-tag) apr)) - (addl (int (fx- pair-size pair-tag)) apr) - ac) - (list* - (addl (int pair-size) apr) - (movl apr - (mem (fx- disp-cdr (fx+ pair-tag pair-size)) apr)) - (f b (car d) (cdr d)))))))])] - [($make-symbol) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-symbol-string apr)) - (movl (int 0) (mem disp-symbol-unique-string apr)) - (movl (int unbound) (mem disp-symbol-value apr)) - (movl (int nil) (mem disp-symbol-plist apr)) - (movl (int unbound) (mem disp-symbol-system-value apr)) - (movl (int nil) (mem disp-symbol-system-plist apr)) - (movl apr eax) - (addl (int symbol-tag) eax) - (addl (int (align symbol-size)) apr) - ac)] - [($make-port/input) (do-make-port input-port-tag arg* ac)] - [($make-port/output) (do-make-port output-port-tag arg* ac)] - [($make-port/both) (do-make-port input/output-port-tag arg* ac)] - [($make-tcbucket) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-tcbucket-tconc apr)) - (movl (Simple (cadr arg*)) eax) - (movl eax (mem disp-tcbucket-key apr)) - (movl (Simple (caddr arg*)) eax) - (movl eax (mem disp-tcbucket-val apr)) - (movl (Simple (cadddr arg*)) eax) - (movl eax (mem disp-tcbucket-next apr)) - (movl apr eax) - (addl (int vector-tag) eax) - (addl (int (align tcbucket-size)) apr) - ac)] - [($record) - (let ([rtd (car arg*)] - [ac - (let f ([arg* (cdr arg*)] [idx disp-record-data]) - (cond - [(null? arg*) - (list* (movl apr eax) - (addl (int vector-tag) eax) - (addl (int (align idx)) apr) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem idx apr)) - (f (cdr arg*) (fx+ idx wordsize)))]))]) - (cond - [(constant? rtd) - (list* (movl (Simple rtd) (mem 0 apr)) ac)] - [else - (list* (movl (Simple rtd) eax) (movl eax (mem 0 apr)) ac)]))] - [(vector) - (let f ([arg* arg*] [idx disp-vector-data]) - (cond - [(null? arg*) - (list* (movl apr eax) - (addl (int vector-tag) eax) - (movl (int (fx- idx disp-vector-data)) - (mem disp-vector-length apr)) - (addl (int (align idx)) apr) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem idx apr)) - (f (cdr arg*) (fx+ idx wordsize)))]))] - [($string) - (let f ([arg* arg*] [idx disp-string-data]) - (cond - [(null? arg*) - (list* (movb (int 0) (mem idx apr)) - (movl apr eax) - (addl (int string-tag) eax) - (movl (int (fx* (fx- idx disp-string-data) wordsize)) - (mem disp-string-length apr)) - (addl (int (align (fxadd1 idx))) apr) - ac)] - [else - (record-case (car arg*) - [(constant c) - (unless (char? c) (error who "invalid arg to string ~s" x)) - (list* (movb (int (char->integer c)) (mem idx apr)) - (f (cdr arg*) (fxadd1 idx)))] - [else - (list* (movl (Simple (car arg*)) ebx) - (movb bh (mem idx apr)) - (f (cdr arg*) (fxadd1 idx)))])]))] - [($current-frame) - (list* (movl (pcb-ref 'next-continuation) eax) - ac)] - [($seal-frame-and-call) - (list* (movl (Simple (car arg*)) cpr) ; proc - (movl (pcb-ref 'frame-base) eax) - ; eax=baseofstack - (movl (mem (fx- 0 wordsize) eax) ebx) ; underflow handler - (movl ebx (mem (fx- 0 wordsize) fpr)) ; set - ; create a new cont record - (movl (int continuation-tag) (mem 0 apr)) - (movl fpr (mem disp-continuation-top apr)) - ; compute the size of the captured frame - (movl eax ebx) - (subl fpr ebx) - (subl (int wordsize) ebx) - ; and store it - (movl ebx (mem disp-continuation-size apr)) - ; load next cont - (movl (pcb-ref 'next-continuation) ebx) - ; and store it - (movl ebx (mem disp-continuation-next apr)) - ; adjust ap - (movl apr eax) - (addl (int vector-tag) eax) - (addl (int continuation-size) apr) - ; store new cont in current-cont - (movl eax (pcb-ref 'next-continuation)) - ; adjust fp - (movl fpr (pcb-ref 'frame-base)) - (subl (int wordsize) fpr) - ; tail-call f - (movl eax (mem (fx- 0 wordsize) fpr)) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call) - ac)] - [($code-size) - (indirect-ref arg* (fx- disp-code-instrsize vector-tag) ac)] - [($code-reloc-vector) - (indirect-ref arg* (fx- disp-code-relocsize vector-tag) ac)] - [($code-freevars) - (indirect-ref arg* (fx- disp-code-freevars vector-tag) ac)] - [($set-car! $set-cdr! $vector-set! $string-set! $exit - $set-symbol-value! $set-symbol-plist! - $code-set! primitive-set! - $set-code-object! $set-code-object+offset! $set-code-object+offset/rel! - $record-set! - $set-port-input-index! $set-port-input-size! - $set-port-output-index! $set-port-output-size!) - (do-effect-prim op arg* - (cons (movl (int void-object) eax) ac))] - [(fixnum? immediate? $fxzero? boolean? char? pair? vector? string? symbol? - procedure? null? not eof-object? $fx= $fx< $fx<= $fx> $fx>= eq? - $char= $char< $char<= $char> $char>= $unbound-object? $code? - $record? $record/rtd? bwp-object? port? input-port? output-port?) - (do-pred->value-prim op arg* ac)] - [($code->closure) - (list* - (movl (Simple (car arg*)) eax) - (addl (int (fx- disp-code-data vector-tag)) eax) - (movl eax (mem 0 apr)) - (movl apr eax) - (addl (int closure-tag) eax) - (addl (int (align disp-closure-data)) apr) - ac)] - [($frame->continuation) - (NonTail - (make-closure (make-code-loc SL_continuation_code) arg*) - ac)] - [($make-call-with-values-procedure) - (NonTail - (make-closure (make-code-loc SL_call_with_values) arg*) - ac)] - [($make-values-procedure) - (NonTail - (make-closure (make-code-loc SL_values) arg*) - ac)] - [else - (error 'value-prim "unhandled ~s" op)])) - (define (indirect-assignment arg* offset ac) - (list* - (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem offset eax)) - ;;; record side effect - (addl (int offset) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)) - (define (do-effect-prim op arg* ac) - (case op - [($vector-set!) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (addl (int (fx- disp-vector-data vector-tag)) ebx) - (movl (Simple (caddr arg*)) eax) - (movl eax (mem 0 ebx)) - ;;; record side effect - (shrl (int pageshift) ebx) - (sall (int wordshift) ebx) - (addl (pcb-ref 'dirty-vector) ebx) - (movl (int dirty-word) (mem 0 ebx)) - ac)] - [($code-set!) - (list* (movl (Simple (cadr arg*)) eax) - (sarl (int fx-shift) eax) - (addl (Simple (car arg*)) eax) - (movl (Simple (caddr arg*)) ebx) - (sall (int (fx- 8 fx-shift)) ebx) - (movb bh (mem (fx- disp-code-data vector-tag) eax)) - ac)] - [($string-set!) - (list* (movl (Simple (cadr arg*)) eax) - (sarl (int fx-shift) eax) - (addl (Simple (car arg*)) eax) - (movl (Simple (caddr arg*)) ebx) - (movb bh (mem (fx- disp-string-data string-tag) eax)) - ac)] - [($set-car!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-car pair-tag) eax)) - ;;; record side effect - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-cdr!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-cdr pair-tag) eax)) - ;;; record side effect - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-tcbucket-key!) - (indirect-assignment arg* (fx- disp-tcbucket-key vector-tag) ac)] - [($set-tcbucket-val!) - (indirect-assignment arg* (fx- disp-tcbucket-val vector-tag) ac)] - [($set-tcbucket-next!) - (indirect-assignment arg* (fx- disp-tcbucket-next vector-tag) ac)] - [($set-tcbucket-tconc!) - (indirect-assignment arg* (fx- disp-tcbucket-tconc vector-tag) ac)] - [($set-port-input-index!) - (list* - (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-port-input-index vector-tag) eax)) - ac)] - [($set-port-input-size!) - (list* - (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl (int 0) (mem (fx- disp-port-input-index vector-tag) eax)) - (movl ebx (mem (fx- disp-port-input-size vector-tag) eax)) - ac)] - [($set-port-output-index!) - (list* - (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-port-output-index vector-tag) eax)) - ac)] - [($set-port-output-size!) - (list* - (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl (int 0) (mem (fx- disp-port-output-index vector-tag) eax)) - (movl ebx (mem (fx- disp-port-output-size vector-tag) eax)) - ac)] - [($set-symbol-value!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-value symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-value symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [(primitive-set!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-system-value symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-system-value symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-symbol-plist!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-plist symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-plist symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-symbol-unique-string!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-unique-string symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-unique-string symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-symbol-string!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-string symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-string symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($record-set!) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (Simple (caddr arg*)) eax) - (addl (int (fx- disp-record-data record-ptag)) ebx) - (movl eax (mem 0 ebx)) - ;;; record side effect - (shrl (int pageshift) ebx) - (sall (int wordshift) ebx) - (addl (pcb-ref 'dirty-vector) ebx) - (movl (int dirty-word) (mem 0 ebx)) - ac)] - [(cons void $fxadd1 $fxsub1 $record-ref) - (let f ([arg* arg*]) - (cond - [(null? arg*) ac] - [else - (Effect (car arg*) (f (cdr arg*)))]))] - [else - (error 'do-effect-prim "unhandled op ~s" op)])) - (define (do-simple-test x Lt Lf ac) - (unless (or Lt Lf) - (error 'Pred "no labels")) - (cond - [(not Lt) - (list* (cmpl (int bool-f) x) (je Lf) ac)] - [(not Lf) - (list* (cmpl (int bool-f) x) (jne Lt) ac)] - [else - (list* (cmpl (int bool-f) x) (je Lf) (jmp Lt) ac)])) - (define (Simple x) - (record-case x - [(cp-var i) - (mem (fx+ (fx* i wordsize) (fx- disp-closure-data closure-tag)) cpr)] - [(frame-var i) (mem (fx* i (fx- 0 wordsize)) fpr)] - [(constant c) (constant-val c)] - [(code-loc label) (label-address label)] - [(primref op) (primref-loc op)] - [else (error 'Simple "what ~s" x)])) - (define (closure-size x) - (align (fx+ disp-closure-data - (fx* wordsize (length (closure-free* x)))))) - (define (assign-codes rhs* n* i ac) - (cond - [(null? rhs*) ac] - [else - (record-case (car rhs*) - [(closure label free*) - (cons (movl (Simple label) (mem i apr)) - (assign-codes - (cdr rhs*) (cdr n*) (fx+ i (car n*)) ac))])])) - (define (whack-free x i n* rhs* ac) - (cond - [(null? rhs*) ac] - [else - (let ([free (closure-free* (car rhs*))]) - (let f ([free free] [j (fx+ i disp-closure-data)]) - (cond - [(null? free) - (whack-free x (fx+ i (car n*)) (cdr n*) (cdr rhs*) ac)] - [(eq? (car free) x) - (cons - (movl eax (mem j apr)) - (f (cdr free) (fx+ j wordsize)))] - [else (f (cdr free) (fx+ j wordsize))])))])) - (define (assign-nonrec-free* rhs* all-rhs* n* seen ac) - (cond - [(null? rhs*) ac] - [else - (let f ([ls (closure-free* (car rhs*))] [seen seen]) - (cond - [(null? ls) - (assign-nonrec-free* (cdr rhs*) all-rhs* n* seen ac)] - [(memq (car ls) seen) (f (cdr ls) seen)] - [else - (cons - (movl (Simple (car ls)) eax) - (whack-free (car ls) 0 n* all-rhs* - (f (cdr ls) (cons (car ls) seen))))]))])) - (define (assign-rec-free* lhs* rhs* all-n* ac) - (list* (movl apr eax) - (addl (int closure-tag) eax) - (let f ([lhs* lhs*] [n* all-n*]) - (cond - [(null? (cdr lhs*)) - (cons - (movl eax (Simple (car lhs*))) - (whack-free (car lhs*) 0 all-n* rhs* ac))] - [else - (cons - (movl eax (Simple (car lhs*))) - (whack-free (car lhs*) 0 all-n* rhs* - (cons - (addl (int (car n*)) eax) - (f (cdr lhs*) (cdr n*)))))])))) - (define (sum ac ls) - (cond - [(null? ls) ac] - [else (sum (fx+ ac (car ls)) (cdr ls))])) - (define (do-fix lhs* rhs* ac) - ;;; 1. first, set the code pointers in the right places - ;;; 2. next, for every variable appearing in the rhs* but is not in - ;;; the lhs*, load it once and set it everywhere it occurs. - ;;; 3. next, compute the values of the lhs*, and for every computed - ;;; value, store it on the stack, and set it everywhere it occurs - ;;; in the rhs* - ;;; 4. that's it. - (let* ([n* (map closure-size rhs*)]) - (assign-codes rhs* n* 0 - (assign-nonrec-free* rhs* rhs* n* lhs* - (assign-rec-free* lhs* rhs* n* - (cons (addl (int (sum 0 n*)) apr) ac)))))) - (define (frame-adjustment offset) - (fx* (fxsub1 offset) (fx- 0 wordsize))) - (define (NonTail x ac) - (record-case x - [(constant c) - (cons (movl (constant-val c) eax) ac)] - [(frame-var) - (cons (movl (Simple x) eax) ac)] - [(cp-var) - (cons (movl (Simple x) eax) ac)] - [(foreign-label L) - (cons (movl (list 'foreign-label L) eax) ac)] - [(primref c) - (cons (movl (primref-loc c) eax) ac)] - [(closure label arg*) - (let f ([arg* arg*] [off disp-closure-data]) - (cond - [(null? arg*) - (list* (movl (Simple label) (mem 0 apr)) - (movl apr eax) - (addl (int (align off)) apr) - (addl (int closure-tag) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem off apr)) - (f (cdr arg*) (fx+ off wordsize)))]))] - [(conditional test conseq altern) - (let ([Lj (unique-label)] [Lf (unique-label)]) - (Pred test #f Lf - (NonTail conseq - (list* (jmp Lj) Lf (NonTail altern (cons Lj ac))))))] - [(seq e0 e1) - (Effect e0 (NonTail e1 ac))] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* (NonTail body ac))] - [(primcall op rand*) - (do-value-prim op rand* ac)] - [(new-frame base-idx size body) - (NonTail body ac)] - [(call-cp call-convention rp-convention offset size mask) - (let ([L_CALL (unique-label)]) - (case call-convention - [(normal) - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (jmp L_CALL) - ; NEW FRAME - `(byte-vector ,mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) - `(byte 0) ; padding for indirect calls only - `(byte 0) ; direct calls are ok - L_CALL - (indirect-cpr-call) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [(foreign) - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (movl '(foreign-label "ik_foreign_call") ebx) - (jmp L_CALL) - ; NEW FRAME - (byte-vector mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) ; should be 0, since C has 1 rv - '(byte 0) - '(byte 0) - '(byte 0) - L_CALL - (call ebx) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [else - (error who "invalid convention ~s for call-cp" call-convention)]))] - [else (error 'NonTail "invalid expression ~s" x)])) - (define (Pred x Lt Lf ac) - (record-case x - [(frame-var i) - (do-simple-test (idx->frame-loc i) Lt Lf ac)] - [(cp-var i) - (do-simple-test (Simple x) Lt Lf ac)] - [(constant c) - (if c - (if Lt (cons (jmp Lt) ac) ac) - (if Lf (cons (jmp Lf) ac) ac))] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* (Pred body Lt Lf ac))] - [(primcall op rand*) - (do-pred-prim op rand* Lt Lf ac)] - [(conditional test conseq altern) - (cond - [(not Lt) - (let ([Lj^ (unique-label)] [Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lj^ Lf - (cons Lf^ - (Pred altern #f Lf - (cons Lj^ ac))))))] - [(not Lf) - (let ([Lj^ (unique-label)] [Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lt Lj^ - (cons Lf^ - (Pred altern Lt #f - (cons Lj^ ac))))))] - [else - (let ([Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lt Lf - (cons Lf^ - (Pred altern Lt Lf ac)))))])] - [(seq e0 e1) - (Effect e0 (Pred e1 Lt Lf ac))] - [(new-frame) - (NonTail x (do-simple-test eax Lt Lf ac))] - [else (error 'Pred "invalid expression ~s" x)])) - (define (idx->frame-loc i) - (mem (fx* i (fx- 0 wordsize)) fpr)) - (define (Effect x ac) - (record-case x - [(constant) ac] - [(primcall op rand*) - (do-effect-prim op rand* ac)] - [(conditional test conseq altern) - (let* ([Ljoin (unique-label)] - [ac (cons Ljoin ac)] - [altern-ac (Effect altern ac)]) - (cond - [(eq? altern-ac ac) ;; altern is nop - (let* ([conseq-ac (Effect conseq ac)]) - (cond - [(eq? conseq-ac ac) ;; conseq is nop too! - (Effect test ac)] - [else ; "when" pattern - (Pred test #f Ljoin conseq-ac)]))] - [else - (let* ([Lf (unique-label)] - [nac (list* (jmp Ljoin) Lf altern-ac)] - [conseq-ac (Effect conseq nac)]) - (cond - [(eq? conseq-ac nac) ;; "unless" pattern" - (Pred test Ljoin #f altern-ac)] - [else - (Pred test #f Lf conseq-ac)]))]))] -;;; [(conditional test conseq altern) -;;; (let ([Lf (unique-label)] [Ljoin (unique-label)]) -;;; (Pred test #f Lf -;;; (Effect conseq -;;; (list* (jmp Ljoin) Lf (Effect altern (cons Ljoin ac))))))] - [(seq e0 e1) - (Effect e0 (Effect e1 ac))] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* (Effect body ac))] - [(assign loc val) - (record-case loc - [(frame-var i) - (record-case val - [(constant c) - (cons (movl (constant-val c) (idx->frame-loc i)) ac)] - [else - (NonTail val - (cons (movl eax (idx->frame-loc i)) ac))])] - [else (error who "invalid assign loc ~s" loc)])] - [(eval-cp check body) - (cond - [check - (NonTail body - (list* - (movl eax cpr) - (andl (int closure-mask) eax) - (cmpl (int closure-tag) eax) - (jne (label SL_nonprocedure)) - ac))] - [(primref? body) - (list* (movl (primref-loc (primref-name body)) cpr) ac)] - [else - (NonTail body (list* (movl eax cpr) ac))])] - [(save-cp loc) - (record-case loc - [(frame-var i) - (cons (movl cpr (idx->frame-loc i)) ac)] - [else (error who "invalid cpr loc ~s" x)])] - [(new-frame) (NonTail x ac)] - [(frame-var) ac] - [else (error 'Effect "invalid expression ~s" x)])) - (define (Tail x ac) - (record-case x - [(return x) - (NonTail x (cons (ret) ac))] - [(conditional test conseq altern) - (let ([L (unique-label)]) - (Pred test #f L - (Tail conseq - (cons L (Tail altern ac)))))] - [(seq e0 e1) - (Effect e0 (Tail e1 ac))] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* (Tail body ac))] - [(new-frame idx size body) - (Tail body ac)] - [(tailcall-cp call-convention argc) - (list* - (movl (int (argc-convention argc)) eax) - (case call-convention - [(normal) (tail-indirect-cpr-call)] - [(apply) (jmp (label SL_apply))] - [else - (error who "invalid tail-call convention ~s" call-convention)]) - ac)] -;;; [(call-cp call-convention rp-convention idx argc mask) -;;; (unless (eq? rp-convention 'tail) -;;; (error who "nontail rp (~s) in tail context" rp-convention)) -;;; (let f ([i 0]) -;;; (cond -;;; [(fx= i argc) -;;; (case call-convention -;;; [(normal) -;;; (list* -;;; (movl (int (argc-convention argc)) eax) -;;; (tail-indirect-cpr-call) -;;; ac)] -;;; [(apply) -;;; (list* -;;; (movl (int (argc-convention argc)) eax) -;;; (jmp (label SL_apply)) -;;; ac)] -;;; [else -;;; (error who "invalid conv ~s in tail call-cpr" call-convention)])] -;;; [else -;;; (list* (movl (mem (fx* (fx+ idx (fxadd1 i)) -;;; (fx- 0 wordsize)) fpr) -;;; eax) -;;; (movl eax (mem (fx* (fx+ i 1) (fx- 0 wordsize)) fpr)) -;;; (f (fxadd1 i)))]))] - [else (error 'Tail "invalid expression ~s" x)])) - (define (handle-vararg fml-count ac) - (define CONTINUE_LABEL (unique-label)) - (define DONE_LABEL (unique-label)) - (define CONS_LABEL (unique-label)) - (define LOOP_HEAD (unique-label)) - (define L_CALL (unique-label)) - (list* (cmpl (int (argc-convention (fxsub1 fml-count))) eax) - (jg (label SL_invalid_args)) - (jl CONS_LABEL) - (movl (int nil) ebx) - (jmp DONE_LABEL) - CONS_LABEL - (movl (pcb-ref 'allocation-redline) ebx) - (addl eax ebx) - (addl eax ebx) - (cmpl ebx apr) - (jle LOOP_HEAD) - ; overflow - (addl eax esp) ; advance esp to cover args - (pushl cpr) ; push current cp - (pushl eax) ; push argc - (negl eax) ; make argc positive - (addl (int (fx* 4 wordsize)) eax) ; add 4 words to adjust frame size - (pushl eax) ; push frame size - (addl eax eax) ; double the number of args - (movl eax (mem (fx* -2 wordsize) fpr)) ; pass it as first arg - (movl (int (argc-convention 1)) eax) ; setup argc - (movl (primref-loc 'do-vararg-overflow) cpr) ; load handler - (jmp L_CALL) ; go to overflow handler - ; NEW FRAME - (int 0) ; if the framesize=0, then the framesize is dynamic - '(current-frame-offset) - (int 0) ; multiarg rp - (byte 0) - (byte 0) - L_CALL - (indirect-cpr-call) - (popl eax) ; pop framesize and drop it - (popl eax) ; reload argc - (popl cpr) ; reload cp - (subl eax fpr) ; readjust fp - LOOP_HEAD - (movl (int nil) ebx) - CONTINUE_LABEL - (movl ebx (mem disp-cdr apr)) - (movl (mem fpr eax) ebx) - (movl ebx (mem disp-car apr)) - (movl apr ebx) - (addl (int pair-tag) ebx) - (addl (int pair-size) apr) - (addl (int (fxsll 1 fx-shift)) eax) - (cmpl (int (fx- 0 (fxsll fml-count fx-shift))) eax) - (jle CONTINUE_LABEL) - DONE_LABEL - (movl ebx (mem (fx- 0 (fxsll fml-count fx-shift)) fpr)) - ac)) - (define (Entry check? x ac) - (record-case x - [(clambda-case fml* proper body) - (let ([ac (Tail body ac)]) - (cond - [(and proper check?) - (list* (cmpl (int (argc-convention (length fml*))) eax) - (jne (label SL_invalid_args)) - ac)] - [proper ac] - [else - (handle-vararg (length fml*) ac)]))])) - (define make-dispatcher - (lambda (j? L L* x x* ac) - (cond - [(null? L*) (if j? (cons (jmp (label L)) ac) ac)] - [else - (record-case x - [(clambda-case fml* proper _) - (cond - [proper - (list* (cmpl (int (argc-convention (length fml*))) eax) - (je (label L)) - (make-dispatcher #t - (car L*) (cdr L*) (car x*) (cdr x*) ac))] - [else - (list* (cmpl (int (argc-convention (fxsub1 (length fml*)))) eax) - (jle (label L)) - (make-dispatcher #t - (car L*) (cdr L*) (car x*) (cdr x*) ac))])])]))) - (define (handle-cases x x*) - (let ([L* (map (lambda (_) (gensym)) x*)] - [L (gensym)]) - (make-dispatcher #f L L* x x* - (let f ([x x] [x* x*] [L L] [L* L*]) - (cond - [(null? x*) - (cons (label L) (Entry 'check x '()))] - [else - (cons (label L) - (Entry #f x - (f (car x*) (cdr x*) (car L*) (cdr L*))))]))))) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (list* - (length free) - (label L) - (handle-cases (car cases) (cdr cases)))])) - (record-case x - [(codes list body) - (cons (cons 0 (Tail body '())) - (map CodeExpr list))])) - - -(define SL_nonprocedure (gensym "SL_nonprocedure")) - -(define SL_top_level_value_error (gensym "SL_top_level_value_error")) -(define SL_car_error (gensym "SL_car_error")) -(define SL_cdr_error (gensym "SL_cdr_error")) - -(define SL_invalid_args (gensym "SL_invalid_args")) -(define SL_foreign_call (gensym "SL_foreign_call")) -(define SL_continuation_code (gensym "SL_continuation_code")) -(define SL_multiple_values_error_rp (gensym "SL_multiple_values_error_rp")) -(define SL_multiple_values_ignore_rp (gensym "SL_multiple_ignore_error_rp")) -(define SL_underflow_multiple_values (gensym "SL_underflow_multiple_values")) -(define SL_underflow_handler (gensym "SL_underflow_handler")) -(define SL_scheme_exit (gensym "SL_scheme_exit")) -(define SL_apply (gensym "SL_apply")) -(define SL_values (gensym "SL_values")) -(define SL_call_with_values (gensym "SL_call_with_values")) - -(module () -(list*->code* - (list - (list 0 - (label SL_car_error) - (movl ebx (mem (fx- 0 wordsize) fpr)) - (movl (primref-loc 'car-error) cpr) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_cdr_error) - (movl ebx (mem (fx- 0 wordsize) fpr)) - (movl (primref-loc 'cdr-error) cpr) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_top_level_value_error) - (movl ebx (mem (fx- 0 wordsize) fpr)) - (movl (primref-loc 'top-level-value-error) cpr) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call)) - - (let ([L_cwv_done (gensym)] - [L_cwv_loop (gensym)] - [L_cwv_multi_rp (gensym)] - [L_cwv_call (gensym)]) - (list - 0 ; no free vars - (label SL_call_with_values) - (cmpl (int (argc-convention 2)) eax) - (jne (label SL_invalid_args)) - (movl (mem (fx- 0 wordsize) fpr) ebx) ; producer - (movl ebx cpr) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (movl (int (argc-convention 0)) eax) - (subl (int (fx* wordsize 2)) fpr) - (jmp (label L_cwv_call)) - ; MV NEW FRAME - (byte-vector '#(#b110)) - (int (fx* wordsize 3)) - '(current-frame-offset) - (label-address L_cwv_multi_rp) - (byte 0) - (byte 0) - (label L_cwv_call) - (indirect-cpr-call) - ;;; one value returned - (addl (int (fx* wordsize 2)) fpr) - (movl (mem (fx* -2 wordsize) fpr) ebx) ; consumer - (movl ebx cpr) - (movl eax (mem (fx- 0 wordsize) fpr)) - (movl (int (argc-convention 1)) eax) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (tail-indirect-cpr-call) - ;;; multiple values returned - (label L_cwv_multi_rp) - ; because values does not pop the return point - ; we have to adjust fp one more word here - (addl (int (fx* wordsize 3)) fpr) - (movl (mem (fx* -2 wordsize) fpr) cpr) ; consumer - (cmpl (int (argc-convention 0)) eax) - (je (label L_cwv_done)) - (movl (int (fx* -4 wordsize)) ebx) - (addl fpr ebx) ; ebx points to first value - (movl ebx ecx) - (addl eax ecx) ; ecx points to the last value - (label L_cwv_loop) - (movl (mem 0 ebx) edx) - (movl edx (mem (fx* 3 wordsize) ebx)) - (subl (int wordsize) ebx) - (cmpl ecx ebx) - (jge (label L_cwv_loop)) - (label L_cwv_done) - (movl cpr ebx) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (tail-indirect-cpr-call))) - - (let ([L_values_one_value (gensym)] - [L_values_many_values (gensym)]) - (list 0 ; no freevars - (label SL_values) - (cmpl (int (argc-convention 1)) eax) - (je (label L_values_one_value)) - (label L_values_many_values) - (movl (mem 0 fpr) ebx) ; return point - (jmp (mem disp-multivalue-rp ebx)) ; go - (label L_values_one_value) - (movl (mem (fx- 0 wordsize) fpr) eax) - (ret))) - - (let ([L_apply_done (gensym)] - [L_apply_loop (gensym)]) - (list 0 - (label SL_apply) - (movl (mem fpr eax) ebx) - (cmpl (int nil) ebx) - (je (label L_apply_done)) - (label L_apply_loop) - (movl (mem (fx- disp-car pair-tag) ebx) ecx) - (movl (mem (fx- disp-cdr pair-tag) ebx) ebx) - (movl ecx (mem fpr eax)) - (subl (int wordsize) eax) - (cmpl (int nil) ebx) - (jne (label L_apply_loop)) - (label L_apply_done) - (addl (int wordsize) eax) - (tail-indirect-cpr-call))) - - (list 0 - (label SL_nonprocedure) - (movl cpr (mem (fx- 0 wordsize) fpr)) ; first arg - (movl (primref-loc '$apply-nonprocedure-error-handler) cpr) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_multiple_values_error_rp) - (movl (primref-loc '$multiple-values-error) cpr) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_multiple_values_ignore_rp) - (ret)) - - (list 0 - (label SL_invalid_args) - ;;; - (movl cpr (mem (fx- 0 wordsize) fpr)) ; first arg - (negl eax) - (movl eax (mem (fx- 0 (fx* 2 wordsize)) fpr)) - (movl (primref-loc '$incorrect-args-error-handler) cpr) - (movl (int (argc-convention 2)) eax) - (tail-indirect-cpr-call)) - - (let ([Lset (gensym)] [Lloop (gensym)]) - (list 0 - (label SL_foreign_call) - (movl fpr (pcb-ref 'frame-pointer)) - (movl apr (pcb-ref 'allocation-pointer)) - (movl fpr ebx) - (movl (pcb-ref 'system-stack) esp) - (pushl pcr) - (cmpl (int 0) eax) - (je (label Lset)) - (label Lloop) - (movl (mem ebx eax) ecx) - (pushl ecx) - (addl (int 4) eax) - (cmpl (int 0) eax) - (jne (label Lloop)) - (label Lset) - ; FOREIGN NEW FRAME - (call cpr) - (movl (pcb-ref 'frame-pointer) fpr) - (movl (pcb-ref 'allocation-pointer) apr) - (ret))) - - (let ([L_cont_zero_args (gensym)] - [L_cont_mult_args (gensym)] - [L_cont_one_arg (gensym)] - [L_cont_mult_move_args (gensym)] - [L_cont_mult_copy_loop (gensym)]) - (list 1 ; freevars - (label SL_continuation_code) - (movl (mem (fx- disp-closure-data closure-tag) cpr) ebx) ; captured-k - (movl ebx (pcb-ref 'next-continuation)) ; set - (movl (pcb-ref 'frame-base) ebx) - (cmpl (int (argc-convention 1)) eax) - (jg (label L_cont_zero_args)) - (jl (label L_cont_mult_args)) - (label L_cont_one_arg) - (movl (mem (fx- 0 wordsize) fpr) eax) - (movl ebx fpr) - (subl (int wordsize) fpr) - (ret) - (label L_cont_zero_args) - (subl (int wordsize) ebx) - (movl ebx fpr) - (movl (mem 0 ebx) ebx) ; return point - (jmp (mem disp-multivalue-rp ebx)) ; go - (label L_cont_mult_args) - (subl (int wordsize) ebx) - (cmpl ebx fpr) - (jne (label L_cont_mult_move_args)) - (movl (mem 0 ebx) ebx) - (jmp (mem disp-multivalue-rp ebx)) - (label L_cont_mult_move_args) - ; move args from fpr to ebx - (movl (int 0) ecx) - (label L_cont_mult_copy_loop) - (subl (int wordsize) ecx) - (movl (mem fpr ecx) edx) - (movl edx (mem ebx ecx)) - (cmpl ecx eax) - (jne (label L_cont_mult_copy_loop)) - (movl ebx fpr) - (movl (mem 0 ebx) ebx) - (jmp (mem disp-multivalue-rp ebx)) - )) - ))) - - - -(define (compile-expr expr) - (let* ([p (recordize expr)] - [p (optimize-direct-calls p)] -;;; [foo (analyze-cwv p)] - [p (optimize-letrec p)] - ;[p (remove-letrec p)] - [p (remove-assignments p)] - [p (convert-closures p)] - [p (lift-codes p)] - [p (introduce-primcalls p)] - [p (simplify-operands p)] - [p (insert-stack-overflow-checks p)] - [p (insert-allocation-checks p)] - [p (remove-local-variables p)] - [p (optimize-ap-check p)] - [ls* (generate-code p)] - [f (when (assembler-output) - (for-each - (lambda (ls) - (for-each (lambda (x) (printf " ~s\n" x)) ls)) - ls*))] - [code* (list*->code* ls*)]) - (car code*))) - -(define compile-file - (lambda (input-file output-file . rest) - (let ([ip (open-input-file input-file)] - [op (apply open-output-file output-file rest)]) - (let f () - (let ([x (read ip)]) - (unless (eof-object? x) - (fasl-write (compile-expr (expand x)) op) - (f)))) - (close-input-port ip) - (close-output-port op)))) - -(primitive-set! 'compile-file compile-file) -(primitive-set! 'assembler-output (make-parameter #f)) -(primitive-set! 'compile - (lambda (x) - (let ([code (compile-expr (expand x))]) - (let ([proc ($code->closure code)]) - (proc))))) - -) - diff --git a/src/libcompile-9.1.ss b/src/libcompile.ss similarity index 100% rename from src/libcompile-9.1.ss rename to src/libcompile.ss diff --git a/src/libcontrol-6.1.ss b/src/libcontrol.ss similarity index 100% rename from src/libcontrol-6.1.ss rename to src/libcontrol.ss diff --git a/src/libcore-6.9.ss b/src/libcore.ss similarity index 100% rename from src/libcore-6.9.ss rename to src/libcore.ss diff --git a/src/libcxr-6.0.ss b/src/libcxr.ss similarity index 100% rename from src/libcxr-6.0.ss rename to src/libcxr.ss diff --git a/src/libfasl-6.7.ss b/src/libfasl.ss similarity index 100% rename from src/libfasl-6.7.ss rename to src/libfasl.ss diff --git a/src/libhandlers-6.9.ss b/src/libhandlers.ss similarity index 100% rename from src/libhandlers-6.9.ss rename to src/libhandlers.ss diff --git a/src/libhash-6.2.ss b/src/libhash-6.2.ss deleted file mode 100644 index 3692620..0000000 --- a/src/libhash-6.2.ss +++ /dev/null @@ -1,207 +0,0 @@ - -(let ([hash-rtd (make-record-type '"hash-table" '(hash-vec count tc))]) - ;;; accessors - (define get-vec (record-field-accessor hash-rtd 0)) - (define set-vec! (record-field-mutator hash-rtd 0)) - (define get-count (record-field-accessor hash-rtd 1)) - (define set-count! (record-field-mutator hash-rtd 1)) - (define get-tc (record-field-accessor hash-rtd 2)) - ;;; implementation - - ;;; directly from Dybvig's paper - (define tc-pop - (lambda (tc) - (let ([x ($car tc)]) - (if (eq? x ($cdr tc)) - #f - (let ([v ($car x)]) - ($set-car! tc ($cdr x)) - ($set-car! x #f) - ($set-cdr! x #f) - v))))) - - (define inthash - (lambda (key) - ;static int inthash(int key) { /* from Bob Jenkin's */ - ; key += ~(key << 15); - ; key ^= (key >> 10); - ; key += (key << 3); - ; key ^= (key >> 6); - ; key += ~(key << 11); - ; key ^= (key >> 16); - ; return key; - ;} - (let* ([key ($fx+ key ($fxlognot ($fxsll key 15)))] - [key ($fxlogxor key ($fxsra key 10))] - [key ($fx+ key ($fxsll key 3))] - [key ($fxlogxor key ($fxsra key 6))] - [key ($fx+ key ($fxlognot ($fxsll key 11)))] - [key ($fxlogxor key ($fxsra key 16))]) - key))) - - ;;; assq-like lookup - (define direct-lookup - (lambda (x b) - (if (fixnum? b) - #f - (if (eq? x ($tcbucket-key b)) - b - (direct-lookup x ($tcbucket-next b)))))) - - (define rehash-lookup - (lambda (h tc x) - (cond - [(tc-pop tc) => - (lambda (b) - (re-add! h b) - (if (eq? x ($tcbucket-key b)) - b - (rehash-lookup h tc x)))] - [else #f]))) - - (define get-bucket-index - (lambda (b) - (let ([next ($tcbucket-next b)]) - (if (fixnum? next) - next - (get-bucket-index next))))) - - (define replace! - (lambda (lb x y) - (let ([n ($tcbucket-next lb)]) - (cond - [(eq? n x) - ($set-tcbucket-next! lb y) - (void)] - [else - (replace! n x y)])))) - - (define re-add! - (lambda (h b) - (let ([vec (get-vec h)] - [next ($tcbucket-next b)]) - ;;; first remove it from its old place - (let ([idx - (if (fixnum? next) - next - (get-bucket-index next))]) - (let ([fst ($vector-ref vec idx)]) - (cond - [(eq? fst b) - ($vector-set! vec idx next)] - [else - (replace! fst b next)]))) - ;;; reset the tcbucket-tconc FIRST - ($set-tcbucket-tconc! b (get-tc h)) - ;;; then add it to the new place - (let ([k ($tcbucket-key b)]) - (let ([ih (inthash (pointer-value k))]) - (let ([idx ($fxlogand ih ($fx- ($vector-length vec) 1))]) - (let ([n ($vector-ref vec idx)]) - ($set-tcbucket-next! b n) - ($vector-set! vec idx b) - (void)))))))) - - (define get-hash - (lambda (h x v) - (let ([pv (pointer-value x)] - [vec (get-vec h)]) - (let ([ih (inthash pv)]) - (let ([idx ($fxlogand ih ($fx- ($vector-length vec) 1))]) - (let ([b ($vector-ref vec idx)]) - (cond - [(or (direct-lookup x b) (rehash-lookup h (get-tc h) x)) - => - (lambda (b) - ($tcbucket-val b))] - [else v]))))))) - - (define put-hash! - (lambda (h x v) - (let ([pv (pointer-value x)] - [vec (get-vec h)]) - (let ([ih (inthash pv)]) - (let ([idx ($fxlogand ih ($fx- ($vector-length vec) 1))]) - (let ([b ($vector-ref vec idx)]) - (cond - [(or (direct-lookup x b) (rehash-lookup h (get-tc h) x)) - => - (lambda (b) - ($set-tcbucket-val! b v) - (void))] - [else - (let ([bucket - ($make-tcbucket (get-tc h) x v ($vector-ref vec idx))]) - (if ($fx= (pointer-value x) pv) - ($vector-set! vec idx bucket) - (let* ([ih (inthash (pointer-value x))] - [idx - ($fxlogand ih ($fx- ($vector-length vec) 1))]) - ($set-tcbucket-next! bucket ($vector-ref vec idx)) - ($vector-set! vec idx bucket)))) - (let ([ct (get-count h)]) - (set-count! h ($fxadd1 ct)) - (when ($fx> ct ($vector-length vec)) - (enlarge-table h)))]))))))) - - (define insert-b - (lambda (b vec mask) - (let* ([x ($tcbucket-key b)] - [pv (pointer-value x)] - [ih (inthash pv)] - [idx ($fxlogand ih mask)] - [next ($tcbucket-next b)]) - ($set-tcbucket-next! b ($vector-ref vec idx)) - ($vector-set! vec idx b) - (unless (fixnum? next) - (insert-b next vec mask))))) - - (define move-all - (lambda (vec1 i n vec2 mask) - (unless ($fx= i n) - (let ([b ($vector-ref vec1 i)]) - (unless (fixnum? b) - (insert-b b vec2 mask)) - (move-all vec1 ($fxadd1 i) n vec2 mask))))) - - (define enlarge-table - (lambda (h) - (let* ([vec1 (get-vec h)] - [n1 ($vector-length vec1)] - [n2 ($fxsll n1 1)] - [vec2 (make-base-vec n2)]) - (move-all vec1 0 n1 vec2 ($fx- n2 1)) - (set-vec! h vec2)))) - - - - (define init-vec - (lambda (v i n) - (if ($fx= i n) - v - (begin - ($vector-set! v i i) - (init-vec v ($fxadd1 i) n))))) - - (define make-base-vec - (lambda (n) - (init-vec (make-vector n) 0 n))) - - ;;; public interface - (primitive-set! 'hash-table? (record-predicate hash-rtd)) - (primitive-set! 'make-hash-table - (let ([make (record-constructor hash-rtd)]) - (lambda () - (let ([x (cons #f #f)]) - (let ([tc (cons x x)]) - (make (make-base-vec 32) 0 tc)))))) - (primitive-set! 'get-hash-table - (lambda (h x v) - (if (hash-table? h) - (get-hash h x v) - (error 'get-hash-table "~s is not a hash table" h)))) - (primitive-set! 'put-hash-table! - (lambda (h x v) - (if (hash-table? h) - (put-hash! h x v) - (error 'put-hash-table! "~s is not a hash table" h))))) diff --git a/src/libhash-9.2.ss b/src/libhash.ss similarity index 100% rename from src/libhash-9.2.ss rename to src/libhash.ss diff --git a/src/libintelasm-6.9.ss b/src/libintelasm.ss similarity index 100% rename from src/libintelasm-6.9.ss rename to src/libintelasm.ss diff --git a/src/libinterpret-6.5.ss b/src/libinterpret.ss similarity index 100% rename from src/libinterpret-6.5.ss rename to src/libinterpret.ss diff --git a/src/libnumerics-9.1.ss b/src/libnumerics.ss similarity index 100% rename from src/libnumerics-9.1.ss rename to src/libnumerics.ss diff --git a/src/libposix-6.0.ss b/src/libposix.ss similarity index 100% rename from src/libposix-6.0.ss rename to src/libposix.ss diff --git a/src/librecord-6.4.ss b/src/librecord.ss similarity index 100% rename from src/librecord-6.4.ss rename to src/librecord.ss diff --git a/src/libtokenizer-6.1.ss b/src/libtokenizer-6.1.ss deleted file mode 100644 index dfb66e8..0000000 --- a/src/libtokenizer-6.1.ss +++ /dev/null @@ -1,513 +0,0 @@ -(let () - (define char-whitespace? - (lambda (c) - (or ($char= #\space c) - (memq ($char->fixnum c) '(9 10 11 12 13))))) - (define delimiter? - (lambda (c) - (or (char-whitespace? c) - (memq c '(#\( #\) #\[ #\] #\' #\` #\, #\"))))) - (define digit? - (lambda (c) - (and ($char<= #\0 c) ($char<= c #\9)))) - (define char->num - (lambda (c) - (fx- ($char->fixnum c) ($char->fixnum #\0)))) - (define initial? - (lambda (c) - (or (letter? c) (special-initial? c)))) - (define letter? - (lambda (c) - (or (and ($char<= #\a c) ($char<= c #\z)) - (and ($char<= #\A c) ($char<= c #\Z))))) - (define af? - (lambda (c) - (or (and ($char<= #\a c) ($char<= c #\f)) - (and ($char<= #\A c) ($char<= c #\F))))) - (define af->num - (lambda (c) - (if (and ($char<= #\a c) ($char<= c #\f)) - (fx+ 10 (fx- ($char->fixnum c) ($char->fixnum #\a))) - (fx+ 10 (fx- ($char->fixnum c) ($char->fixnum #\A)))))) - (define special-initial? - (lambda (c) - (memq c '(#\! #\$ #\% #\& #\* #\/ #\: #\< #\= #\> #\? #\^ #\_ #\~)))) - (define subsequent? - (lambda (c) - (or (initial? c) (digit? c) (special-subsequent? c)))) - (define special-subsequent? - (lambda (c) - (memq c '(#\+ #\- #\. #\@)))) - (define tokenize-number - (lambda (n p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) n] - [(digit? c) - (tokenize-number (fx+ (fx* n 10) (char->num c)) p)] - [(delimiter? c) - (unread-char c p) - n] - [else - (unread-char c p) - (error 'tokenize "invalid number syntax: ~a~a" n c)])))) - (define tokenize-hex - (lambda (n p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) n] - [(digit? c) - (tokenize-hex (fx+ (fx* n 16) (char->num c)) p)] - [(af? c) - (tokenize-hex (fx+ (fx* n 16) (af->num c)) p)] - [(delimiter? c) - (unread-char c p) - n] - [else - (unread-char c p) - (error 'tokenize "invalid hex number sequence: ~a~a" n c)])))) - (define tokenize-hex-init - (lambda (p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) - (unread-char c p) - (error 'tokenize "invalid #x near end of file")] - [(digit? c) - (cons 'datum (tokenize-hex (char->num c) p))] - [(af? c) - (cons 'datum (tokenize-hex (af->num c) p))] - [($char= c #\-) - (cons 'datum (fx- 0 (tokenize-hex 0 p)))] - [($char= c #\+) - (cons 'datum (tokenize-hex 0 p))] - [else - (unread-char c p) - (error 'tokenize "invalid number syntax: #x~a" c)])))) - (define tokenize-identifier - (lambda (ls p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) ls] - [(subsequent? c) - (tokenize-identifier (cons c ls) p)] - [(delimiter? c) - (unread-char c p) - ls] - [else - (unread-char c p) - (error 'tokenize "invalid identifier syntax: ~a" - (list->string (reverse (cons c ls))))])))) - (define tokenize-string - (lambda (ls p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) - (error 'tokenize "end-of-file while inside a string")] - [($char= #\" c) ls] - [($char= #\\ c) - (let ([c (read-char p)]) - (cond - [($char= #\" c) (tokenize-string (cons #\" ls) p)] - [($char= #\\ c) (tokenize-string (cons #\\ ls) p)] - [($char= #\n c) (tokenize-string (cons #\newline ls) p)] - [($char= #\t c) (tokenize-string (cons #\tab ls) p)] - [else (error 'tokenize "invalid string escape \\~a" c)]))] - [else - (tokenize-string (cons c ls) p)])))) - (define skip-comment - (lambda (p) - (let ([c (read-char p)]) - (unless (eof-object? c) - (let ([i ($char->fixnum c)]) - (unless (or (fx= i 10) (fx= i 13)) - (skip-comment p))))))) - (define tokenize-plus - (lambda (p) - (let ([c (peek-char p)]) - (cond - [(eof-object? c) '(datum . +)] - [(delimiter? c) '(datum . +)] - [(digit? c) - (read-char p) - (cons 'datum (tokenize-number (char->num c) p))] - [else (error 'tokenize "invalid sequence +~a" c)])))) - (define tokenize-minus - (lambda (p) - (let ([c (peek-char p)]) - (cond - [(eof-object? c) '(datum . -)] - [(delimiter? c) '(datum . -)] - [(digit? c) - (read-char p) - (cons 'datum (fx- 0 (tokenize-number (char->num c) p)))] - [else (error 'tokenize "invalid sequence -~a" c)])))) - (define tokenize-dot - (lambda (p) - (let ([c (peek-char p)]) - (cond - [(eof-object? c) 'dot] - [(delimiter? c) 'dot] - [($char= c #\.) ; this is second dot - (read-char p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) - (error 'tokenize "invalid syntax .. near end of file")] - [($char= c #\.) ; this is the third - (let ([c (peek-char p)]) - (cond - [(eof-object? c) '(datum . ...)] - [(delimiter? c) '(datum . ...)] - [else - (error 'tokenize "invalid syntax ...~a" c)]))] - [else - (unread-char c) - (error 'tokenize "invalid syntax ..~a" c)]))] - [else - (error 'tokenize "invalid syntax .~a" c)])))) - (define tokenize-char* - (lambda (i str p d) - (cond - [(fx= i (string-length str)) - (let ([c (peek-char p)]) - (cond - [(eof-object? c) d] - [(delimiter? c) d] - [else (error 'tokenize "invalid character after #\\~a" str)]))] - [else - (let ([c (read-char p)]) - (cond - [(eof-object? c) - (error 'tokenize "invalid eof in the middle of #\\~a" str)] - [($char= c (string-ref str i)) - (tokenize-char* (fxadd1 i) str p d)] - [else - (error 'tokenize - "invalid char ~a while scanning #\\~a" c str)]))]))) - (define tokenize-char-seq - (lambda (p str d) - (let ([c (peek-char p)]) - (cond - [(eof-object? c) (cons 'datum (string-ref str 0))] - [(delimiter? c) (cons 'datum (string-ref str 0))] - [($char= (string-ref str 1) c) - (read-char p) - (tokenize-char* 2 str p d)] - [else (error 'tokenize "invalid syntax near #\\~a~a" - (string-ref str 0) c)])))) - (define tokenize-char - (lambda (p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) - (error 'tokenize "invalid #\\ near end of file")] - [($char= #\s c) - (tokenize-char-seq p "space" '(datum . #\space))] - [($char= #\n c) - (tokenize-char-seq p "newline" '(datum . #\newline))] - [($char= #\t c) - (tokenize-char-seq p "tab" '(datum . #\tab))] - [($char= #\r c) - (tokenize-char-seq p "return" '(datum . #\return))] - [else - (let ([n (peek-char p)]) - (cond - [(eof-object? n) (cons 'datum c)] - [(delimiter? n) (cons 'datum c)] - [else - (error 'tokenize "invalid syntax #\\~a~a" c n)]))])))) - (define multiline-error - (lambda () - (error 'tokenize - "end of file encountered while inside a #|-style comment"))) - (define multiline-comment - (lambda (p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) (multiline-error)] - [($char= #\| c) - (let ([c (read-char p)]) - (cond - [(eof-object? c) (multiline-error)] - [($char= #\# c) (void)] - [else (multiline-comment p)]))] - [($char= #\# c) - (let ([c (read-char p)]) - (cond - [(eof-object? c) (multiline-error)] - [($char= #\| c) - (multiline-comment p) - (multiline-comment p)] - [else - (multiline-comment p)]))] - [else (multiline-comment p)])))) - (define read-binary - (lambda (ac chars p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) ac] - [($char= #\0 c) (read-binary (fxsll ac 1) (cons c chars) p)] - [($char= #\1 c) (read-binary (fx+ (fxsll ac 1) 1) (cons c chars) p)] - [(delimiter? c) (unread-char c p) ac] - [else - (unread-char c) - (error 'tokenize "invalid syntax #b~a" - (list->string (reverse (cons c chars))))])))) - (define tokenize-hash - (lambda (p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) (error 'tokenize "invalid # near end of file")] - [($char= c #\t) - (let ([c (peek-char p)]) - (cond - [(eof-object? c) '(datum . #t)] - [(delimiter? c) '(datum . #t)] - [else (error 'tokenize "invalid syntax near #t")]))] - [($char= c #\f) - (let ([c (peek-char p)]) - (cond - [(eof-object? c) '(datum . #f)] - [(delimiter? c) '(datum . #f)] - [else (error 'tokenize "invalid syntax near #f")]))] - [($char= #\\ c) (tokenize-char p)] - [($char= #\( c) 'vparen] - [($char= #\x c) (tokenize-hex-init p)] - [($char= #\' c) '(macro . syntax)] - [($char= #\; c) 'hash-semi] - [($char= #\% c) '(macro . |#primitive|)] - [($char= #\| c) (multiline-comment p) (tokenize p)] - [($char= #\b c) - (let ([c (read-char p)]) - (cond - [(eof-object? c) - (error 'tokenize "invalid eof while reading #b")] - [($char= #\- c) - (let ([c (read-char p)]) - (cond - [(eof-object? c) - (error 'tokenize "invalid eof while reading #b-")] - [($char= #\0 c) - (cons 'datum - (fx- 0 (read-binary 0 '(#\0 #\-) p)))] - [($char= #\1 c) - (cons 'datum - (fx- 0 (read-binary 1 '(#\1 #\-) p)))] - [else - (unread-char c p) - (error 'tokenize "invalid binary syntax #b-~a" c)]))] - [($char= #\0 c) - (cons 'datum (read-binary 0 '(#\0) p))] - [($char= #\1 c) - (cons 'datum (read-binary 1 '(#\1) p))] - [else - (unread-char c p) - (error 'tokenize "invalid syntax #b~a" c)] - ))] - [($char= #\! c) - (let ([e (read-char p)]) - (when (eof-object? e) - (error 'tokenize "invalid eof near #!")) - (unless ($char= #\e e) - (error 'tokenize "invalid syntax near #!~a" e)) - (let ([o (read-char p)]) - (when (eof-object? o) - (error 'tokenize "invalid eof near #!e")) - (unless ($char= #\o o) - (error 'tokenize "invalid syntax near #!e~a" o)) - (let ([f (read-char p)]) - (when (eof-object? f) - (error 'tokenize "invalid syntax near #!eo")) - (unless ($char= #\f f) - (error 'tokenize "invalid syntax near #!eo~a" f)) - (cons 'datum (eof-object)))))] - [else - (unread-char c p) - (error 'tokenize "invalid syntax #~a" c)])))) - (define tokenize-bar - (lambda (p ac) - (let ([c (read-char p)]) - (cond - [(eof-object? c) - (error 'tokenize "unexpected eof while reading symbol")] - [($char= #\\ c) - (let ([c (read-char p)]) - (cond - [(eof-object? c) - (error 'tokenize "unexpected eof while reading symbol")] - [else (tokenize-bar p (cons c ac))]))] - [($char= #\| c) ac] - [else (tokenize-bar p (cons c ac))])))) - (define tokenize - (lambda (p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) (eof-object)] - [(char-whitespace? c) (tokenize p)] - [($char= #\( c) 'lparen] - [($char= #\) c) 'rparen] - [($char= #\[ c) 'lbrack] - [($char= #\] c) 'rbrack] - [($char= #\' c) '(macro . quote)] - [($char= #\` c) '(macro . quasiquote)] - [($char= #\, c) - (let ([c (peek-char p)]) - (cond - [(eof-object? c) '(macro . unquote)] - [($char= c #\@) - (read-char p) - '(macro . unquote-splicing)] - [else '(macro . unquote)]))] - [($char= #\# c) (tokenize-hash p)] - [(digit? c) - (cons 'datum (tokenize-number (char->num c) p))] - [(initial? c) - (let ([ls (reverse (tokenize-identifier (cons c '()) p))]) - (cons 'datum (string->symbol (list->string ls))))] - [($char= #\" c) - (let ([ls (tokenize-string '() p)]) - (cons 'datum (list->string (reverse ls))))] - [($char= #\; c) - (skip-comment p) - (tokenize p)] - [($char= #\+ c) - (tokenize-plus p)] - [($char= #\- c) - (tokenize-minus p)] - [($char= #\. c) - (tokenize-dot p)] - [($char= #\| c) - (let ([ls (reverse (tokenize-bar p '()))]) - (cons 'datum (string->symbol (list->string ls))))] - [else - (unread-char c p) - (error 'tokenize "invalid syntax ~a" c)])))) - - ;;; - ;;;--------------------------------------------------------------* READ *--- - ;;; - (define read-list-rest - (lambda (p end mis) - (let ([t (read-token p)]) - (cond - [(eof-object? t) - (error 'read "end of file encountered while reading list")] - [(eq? t end) '()] - [(eq? t mis) - (error 'read "paren mismatch")] - [(eq? t 'dot) - (let ([d (read p)]) - (let ([t (read-token p)]) - (cond - [(eq? t end) d] - [(eq? t mis) - (error 'read "paren mismatch")] - [(eq? t 'dot) - (error 'read "cannot have two dots in a list")] - [else - (error 'read "expecting ~a, got ~a" end t)])))] - [(eq? t 'hash-semi) - (read p) - (read-list-rest p end mis)] - [else - (let ([a (parse-token p t)]) - (let ([d (read-list-rest p end mis)]) - (cons a d)))])))) - (define read-list-init - (lambda (p end mis) - (let ([t (read-token p)]) - (cond - [(eof-object? t) - (error 'read "end of file encountered while reading list")] - [(eq? t end) '()] - [(eq? t mis) - (error 'read "paren mismatch")] - [(eq? t 'dot) - (error 'read "invalid dot while reading list")] - [(eq? t 'hash-semi) - (read p) - (read-list-init p end mis)] - [else - (let ([a (parse-token p t)]) - (cons a (read-list-rest p end mis)))])))) - (define vector-put! - (lambda (v i ls) - (cond - [(null? ls) v] - [else - (vector-set! v i (car ls)) - (vector-put! v (fxsub1 i) (cdr ls))]))) - (define read-vector - (lambda (p count ls) - (let ([t (read-token p)]) - (cond - [(eof-object? t) - (error 'read "end of file encountered while reading a vector")] - [(eq? t 'rparen) - (let ([v (make-vector count)]) - (vector-put! v (fxsub1 count) ls))] - [(eq? t 'rbrack) - (error 'read "unexpected ] while reading a vector")] - [(eq? t 'dot) - (error 'read "unexpected . while reading a vector")] - [(eq? t 'hash-semi) - (read p) - (read-vector p count ls)] - [else - (let ([a (parse-token p t)]) - (read-vector p (fxadd1 count) (cons a ls)))])))) - (define parse-token - (lambda (p t) - (cond - [(eof-object? t) (eof-object)] - [(eq? t 'lparen) (read-list-init p 'rparen 'rbrack)] - [(eq? t 'lbrack) (read-list-init p 'rbrack 'rparen)] - [(eq? t 'vparen) (read-vector p 0 '())] - [(eq? t 'hash-semi) - (read p) ; ignored expression - (read p)] - [(pair? t) - (cond - [(eq? (car t) 'datum) (cdr t)] - [(eq? (car t) 'macro) - (cons (cdr t) (cons (read p) '()))] - [else (error 'read "invalid token! ~s" t)])] - [else - (error 'read "unexpected ~s found" t)]))) - (define read - (lambda (p) (parse-token p (read-token p)))) - - ;;; - ;;;--------------------------------------------------------------* INIT *--- - ;;; - (primitive-set! 'read-token - (case-lambda - [() (tokenize (current-input-port))] - [(p) - (if (input-port? p) - (tokenize p) - (error 'read-token "~s is not an input port" p))])) - (primitive-set! 'read - (case-lambda - [() (read (current-input-port))] - [(p) - (if (input-port? p) - (read p) - (error 'read "~s is not an input port" p))])) - (let () - (define read-and-eval - (lambda (p) - (let ([x (read p)]) - (unless (eof-object? x) - (eval x) - (read-and-eval p))))) - (primitive-set! 'load - (lambda (x) - (unless (string? x) - (error 'load "~s is not a string" x)) - (let ([p (open-input-file x)]) - (read-and-eval p) - (close-input-port p))))) - ) - diff --git a/src/libtokenizer-9.0.ss b/src/libtokenizer-9.0.ss deleted file mode 100644 index b4da506..0000000 --- a/src/libtokenizer-9.0.ss +++ /dev/null @@ -1,626 +0,0 @@ -(let () - (define char-whitespace? - (lambda (c) - (or ($char= #\space c) - (memq ($char->fixnum c) '(9 10 11 12 13))))) - (define delimiter? - (lambda (c) - (or (char-whitespace? c) - (memq c '(#\( #\) #\[ #\] #\' #\` #\, #\"))))) - (define digit? - (lambda (c) - (and ($char<= #\0 c) ($char<= c #\9)))) - (define char->num - (lambda (c) - (fx- ($char->fixnum c) ($char->fixnum #\0)))) - (define initial? - (lambda (c) - (or (letter? c) (special-initial? c)))) - (define letter? - (lambda (c) - (or (and ($char<= #\a c) ($char<= c #\z)) - (and ($char<= #\A c) ($char<= c #\Z))))) - (define af? - (lambda (c) - (or (and ($char<= #\a c) ($char<= c #\f)) - (and ($char<= #\A c) ($char<= c #\F))))) - (define af->num - (lambda (c) - (if (and ($char<= #\a c) ($char<= c #\f)) - (fx+ 10 (fx- ($char->fixnum c) ($char->fixnum #\a))) - (fx+ 10 (fx- ($char->fixnum c) ($char->fixnum #\A)))))) - (define special-initial? - (lambda (c) - (memq c '(#\! #\$ #\% #\& #\* #\/ #\: #\< #\= #\> #\? #\^ #\_ #\~)))) - (define subsequent? - (lambda (c) - (or (initial? c) (digit? c) (special-subsequent? c)))) - (define special-subsequent? - (lambda (c) - (memq c '(#\+ #\- #\. #\@)))) - (define tokenize-number - (lambda (n p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) n] - [(digit? c) - (tokenize-number (fx+ (fx* n 10) (char->num c)) p)] - [(delimiter? c) - (unread-char c p) - n] - [else - (unread-char c p) - (error 'tokenize "invalid number syntax: ~a~a" n c)])))) - (define tokenize-hex - (lambda (n p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) n] - [(digit? c) - (tokenize-hex (fx+ (fx* n 16) (char->num c)) p)] - [(af? c) - (tokenize-hex (fx+ (fx* n 16) (af->num c)) p)] - [(delimiter? c) - (unread-char c p) - n] - [else - (unread-char c p) - (error 'tokenize "invalid hex number sequence: ~a~a" n c)])))) - (define tokenize-hex-init - (lambda (p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) - (unread-char c p) - (error 'tokenize "invalid #x near end of file")] - [(digit? c) - (cons 'datum (tokenize-hex (char->num c) p))] - [(af? c) - (cons 'datum (tokenize-hex (af->num c) p))] - [($char= c #\-) - (cons 'datum (fx- 0 (tokenize-hex 0 p)))] - [($char= c #\+) - (cons 'datum (tokenize-hex 0 p))] - [else - (unread-char c p) - (error 'tokenize "invalid number syntax: #x~a" c)])))) - (define tokenize-identifier - (lambda (ls p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) ls] - [(subsequent? c) - (tokenize-identifier (cons c ls) p)] - [(delimiter? c) - (unread-char c p) - ls] - [else - (unread-char c p) - (error 'tokenize "invalid identifier syntax: ~a" - (list->string (reverse (cons c ls))))])))) - (define tokenize-string - (lambda (ls p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) - (error 'tokenize "end-of-file while inside a string")] - [($char= #\" c) ls] - [($char= #\\ c) - (let ([c (read-char p)]) - (cond - [($char= #\" c) (tokenize-string (cons #\" ls) p)] - [($char= #\\ c) (tokenize-string (cons #\\ ls) p)] - [($char= #\n c) (tokenize-string (cons #\newline ls) p)] - [($char= #\t c) (tokenize-string (cons #\tab ls) p)] - [else (error 'tokenize "invalid string escape \\~a" c)]))] - [else - (tokenize-string (cons c ls) p)])))) - (define skip-comment - (lambda (p) - (let ([c (read-char p)]) - (unless (eof-object? c) - (let ([i ($char->fixnum c)]) - (unless (or (fx= i 10) (fx= i 13)) - (skip-comment p))))))) - (define tokenize-plus - (lambda (p) - (let ([c (peek-char p)]) - (cond - [(eof-object? c) '(datum . +)] - [(delimiter? c) '(datum . +)] - [(digit? c) - (read-char p) - (cons 'datum (tokenize-number (char->num c) p))] - [else (error 'tokenize "invalid sequence +~a" c)])))) - (define tokenize-minus - (lambda (p) - (let ([c (peek-char p)]) - (cond - [(eof-object? c) '(datum . -)] - [(delimiter? c) '(datum . -)] - [(digit? c) - (read-char p) - (cons 'datum (fx- 0 (tokenize-number (char->num c) p)))] - [else (error 'tokenize "invalid sequence -~a" c)])))) - (define tokenize-dot - (lambda (p) - (let ([c (peek-char p)]) - (cond - [(eof-object? c) 'dot] - [(delimiter? c) 'dot] - [($char= c #\.) ; this is second dot - (read-char p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) - (error 'tokenize "invalid syntax .. near end of file")] - [($char= c #\.) ; this is the third - (let ([c (peek-char p)]) - (cond - [(eof-object? c) '(datum . ...)] - [(delimiter? c) '(datum . ...)] - [else - (error 'tokenize "invalid syntax ...~a" c)]))] - [else - (unread-char c) - (error 'tokenize "invalid syntax ..~a" c)]))] - [else - (error 'tokenize "invalid syntax .~a" c)])))) - (define tokenize-char* - (lambda (i str p d) - (cond - [(fx= i (string-length str)) - (let ([c (peek-char p)]) - (cond - [(eof-object? c) d] - [(delimiter? c) d] - [else (error 'tokenize "invalid character after #\\~a" str)]))] - [else - (let ([c (read-char p)]) - (cond - [(eof-object? c) - (error 'tokenize "invalid eof in the middle of #\\~a" str)] - [($char= c (string-ref str i)) - (tokenize-char* (fxadd1 i) str p d)] - [else - (error 'tokenize - "invalid char ~a while scanning #\\~a" c str)]))]))) - (define tokenize-char-seq - (lambda (p str d) - (let ([c (peek-char p)]) - (cond - [(eof-object? c) (cons 'datum (string-ref str 0))] - [(delimiter? c) (cons 'datum (string-ref str 0))] - [($char= (string-ref str 1) c) - (read-char p) - (tokenize-char* 2 str p d)] - [else (error 'tokenize "invalid syntax near #\\~a~a" - (string-ref str 0) c)])))) - (define tokenize-char - (lambda (p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) - (error 'tokenize "invalid #\\ near end of file")] - [($char= #\s c) - (tokenize-char-seq p "space" '(datum . #\space))] - [($char= #\n c) - (tokenize-char-seq p "newline" '(datum . #\newline))] - [($char= #\t c) - (tokenize-char-seq p "tab" '(datum . #\tab))] - [($char= #\r c) - (tokenize-char-seq p "return" '(datum . #\return))] - [else - (let ([n (peek-char p)]) - (cond - [(eof-object? n) (cons 'datum c)] - [(delimiter? n) (cons 'datum c)] - [else - (error 'tokenize "invalid syntax #\\~a~a" c n)]))])))) - (define multiline-error - (lambda () - (error 'tokenize - "end of file encountered while inside a #|-style comment"))) - (define multiline-comment - (lambda (p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) (multiline-error)] - [($char= #\| c) - (let ([c (read-char p)]) - (cond - [(eof-object? c) (multiline-error)] - [($char= #\# c) (void)] - [else (multiline-comment p)]))] - [($char= #\# c) - (let ([c (read-char p)]) - (cond - [(eof-object? c) (multiline-error)] - [($char= #\| c) - (multiline-comment p) - (multiline-comment p)] - [else - (multiline-comment p)]))] - [else (multiline-comment p)])))) - (define read-binary - (lambda (ac chars p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) ac] - [($char= #\0 c) (read-binary (fxsll ac 1) (cons c chars) p)] - [($char= #\1 c) (read-binary (fx+ (fxsll ac 1) 1) (cons c chars) p)] - [(delimiter? c) (unread-char c p) ac] - [else - (unread-char c) - (error 'tokenize "invalid syntax #b~a" - (list->string (reverse (cons c chars))))])))) - (define tokenize-hash - (lambda (p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) (error 'tokenize "invalid # near end of file")] - [($char= c #\t) - (let ([c (peek-char p)]) - (cond - [(eof-object? c) '(datum . #t)] - [(delimiter? c) '(datum . #t)] - [else (error 'tokenize "invalid syntax near #t")]))] - [($char= c #\f) - (let ([c (peek-char p)]) - (cond - [(eof-object? c) '(datum . #f)] - [(delimiter? c) '(datum . #f)] - [else (error 'tokenize "invalid syntax near #f")]))] - [($char= #\\ c) (tokenize-char p)] - [($char= #\( c) 'vparen] - [($char= #\x c) (tokenize-hex-init p)] - [($char= #\' c) '(macro . syntax)] - [($char= #\; c) 'hash-semi] - [($char= #\% c) '(macro . |#primitive|)] - [($char= #\| c) (multiline-comment p) (tokenize p)] - [($char= #\b c) - (let ([c (read-char p)]) - (cond - [(eof-object? c) - (error 'tokenize "invalid eof while reading #b")] - [($char= #\- c) - (let ([c (read-char p)]) - (cond - [(eof-object? c) - (error 'tokenize "invalid eof while reading #b-")] - [($char= #\0 c) - (cons 'datum - (fx- 0 (read-binary 0 '(#\0 #\-) p)))] - [($char= #\1 c) - (cons 'datum - (fx- 0 (read-binary 1 '(#\1 #\-) p)))] - [else - (unread-char c p) - (error 'tokenize "invalid binary syntax #b-~a" c)]))] - [($char= #\0 c) - (cons 'datum (read-binary 0 '(#\0) p))] - [($char= #\1 c) - (cons 'datum (read-binary 1 '(#\1) p))] - [else - (unread-char c p) - (error 'tokenize "invalid syntax #b~a" c)] - ))] - [($char= #\! c) - (let ([e (read-char p)]) - (when (eof-object? e) - (error 'tokenize "invalid eof near #!")) - (unless ($char= #\e e) - (error 'tokenize "invalid syntax near #!~a" e)) - (let ([o (read-char p)]) - (when (eof-object? o) - (error 'tokenize "invalid eof near #!e")) - (unless ($char= #\o o) - (error 'tokenize "invalid syntax near #!e~a" o)) - (let ([f (read-char p)]) - (when (eof-object? f) - (error 'tokenize "invalid syntax near #!eo")) - (unless ($char= #\f f) - (error 'tokenize "invalid syntax near #!eo~a" f)) - (cons 'datum (eof-object)))))] - [(digit? c) - (tokenize-hashnum p (char->num c))] - [else - (unread-char c p) - (error 'tokenize "invalid syntax #~a" c)])))) - (define (tokenize-hashnum p n) - (let ([c (read-char p)]) - (cond - [(eof-object? c) - (error 'tokenize "invalid eof inside #n mark/ref")] - [($char= #\= c) (cons 'mark n)] - [($char= #\# c) (cons 'ref n)] - [(digit? c) - (tokenize-hashnum p (fx+ (fx* n 10) (char->num c)))] - [else - (unread-char c p) - (error 'tokenize "invalid char ~a while inside a #n mark/ref" c)]))) - (define tokenize-bar - (lambda (p ac) - (let ([c (read-char p)]) - (cond - [(eof-object? c) - (error 'tokenize "unexpected eof while reading symbol")] - [($char= #\\ c) - (let ([c (read-char p)]) - (cond - [(eof-object? c) - (error 'tokenize "unexpected eof while reading symbol")] - [else (tokenize-bar p (cons c ac))]))] - [($char= #\| c) ac] - [else (tokenize-bar p (cons c ac))])))) - (define tokenize - (lambda (p) - (let ([c (read-char p)]) - (cond - [(eof-object? c) (eof-object)] - [(char-whitespace? c) (tokenize p)] - [($char= #\( c) 'lparen] - [($char= #\) c) 'rparen] - [($char= #\[ c) 'lbrack] - [($char= #\] c) 'rbrack] - [($char= #\' c) '(macro . quote)] - [($char= #\` c) '(macro . quasiquote)] - [($char= #\, c) - (let ([c (peek-char p)]) - (cond - [(eof-object? c) '(macro . unquote)] - [($char= c #\@) - (read-char p) - '(macro . unquote-splicing)] - [else '(macro . unquote)]))] - [($char= #\# c) (tokenize-hash p)] - [(digit? c) - (cons 'datum (tokenize-number (char->num c) p))] - [(initial? c) - (let ([ls (reverse (tokenize-identifier (cons c '()) p))]) - (cons 'datum (string->symbol (list->string ls))))] - [($char= #\" c) - (let ([ls (tokenize-string '() p)]) - (cons 'datum (list->string (reverse ls))))] - [($char= #\; c) - (skip-comment p) - (tokenize p)] - [($char= #\+ c) - (tokenize-plus p)] - [($char= #\- c) - (tokenize-minus p)] - [($char= #\. c) - (tokenize-dot p)] - [($char= #\| c) - (let ([ls (reverse (tokenize-bar p '()))]) - (cons 'datum (string->symbol (list->string ls))))] - [else - (unread-char c p) - (error 'tokenize "invalid syntax ~a" c)])))) - - ;;; - ;;;--------------------------------------------------------------* READ *--- - ;;; - (define read-list-rest - (lambda (p locs k end mis) - (let ([t (read-token p)]) - (cond - [(eof-object? t) - (error 'read "end of file encountered while reading list")] - [(eq? t end) (values '() locs k)] - [(eq? t mis) - (error 'read "paren mismatch")] - [(eq? t 'dot) - (let-values ([(d locs k) (read-expr p locs k)]) - (let ([t (read-token p)]) - (cond - [(eq? t end) (values d locs k)] - [(eq? t mis) - (error 'read "paren mismatch")] - [(eq? t 'dot) - (error 'read "cannot have two dots in a list")] - [else - (error 'read "expecting ~a, got ~a" end t)])))] - [(eq? t 'hash-semi) - (let-values ([(ignored locs k) (read-expr p locs k)]) - (read-list-rest p locs k end mis))] - [else - (let-values ([(a locs k) (parse-token p locs k t)]) - (let-values ([(d locs k) (read-list-rest p locs k end mis)]) - (let ([x (cons a d)]) - (values x locs - (if (or (loc? a) (loc? d)) - (extend-k-pair x k) - k)))))])))) - (define read-list-init - (lambda (p locs k end mis) - (let ([t (read-token p)]) - (cond - [(eof-object? t) - (error 'read "end of file encountered while reading list")] - [(eq? t end) (values '() locs k)] - [(eq? t mis) - (error 'read "paren mismatch")] - [(eq? t 'dot) - (error 'read "invalid dot while reading list")] - [(eq? t 'hash-semi) - (let-values ([(ignored locs k) (read-expr p locs k)]) - (read-list-init p locs k end mis))] - [else - (let-values ([(a locs k) (parse-token p locs k t)]) - (let-values ([(d locs k) (read-list-rest p locs k end mis)]) - (let ([x (cons a d)]) - (values x locs - (if (or (loc? a) (loc? d)) - (extend-k-pair x k) - k)))))])))) - (define extend-k-pair - (lambda (x k) - (lambda () - (let ([a (car x)]) - (when (loc? a) - (set-car! x (loc-value a)))) - (let ([d (cdr x)]) - (when (loc? d) - (set-cdr! x (loc-value d)))) - (k)))) - (define vector-put - (lambda (v k i ls) - (cond - [(null? ls) k] - [else - (let ([a (car ls)]) - (vector-set! v i a) - (vector-put v - (if (loc? a) - (lambda () - (vector-set! v i (loc-value (vector-ref v i))) - (k)) - k) - (fxsub1 i) (cdr ls)))]))) - (define read-vector - (lambda (p locs k count ls) - (let ([t (read-token p)]) - (cond - [(eof-object? t) - (error 'read "end of file encountered while reading a vector")] - [(eq? t 'rparen) - (let ([v (make-vector count)]) - (let ([k (vector-put v k (fxsub1 count) ls)]) - (values v locs k)))] - [(eq? t 'rbrack) - (error 'read "unexpected ] while reading a vector")] - [(eq? t 'dot) - (error 'read "unexpected . while reading a vector")] - [(eq? t 'hash-semi) - (let-values ([(ignored locs k) (read-expr p locs k)]) - (read-vector p locs k count ls))] - [else - (let-values ([(a locs k) (parse-token p locs k t)]) - (read-vector p locs k (fxadd1 count) (cons a ls)))])))) - (define-record loc (value set?)) - (define parse-token - (lambda (p locs k t) - (cond - [(eof-object? t) (values (eof-object) locs k)] - [(eq? t 'lparen) (read-list-init p locs k 'rparen 'rbrack)] - [(eq? t 'lbrack) (read-list-init p locs k 'rbrack 'rparen)] - [(eq? t 'vparen) (read-vector p locs k 0 '())] - [(eq? t 'hash-semi) - (let-values ([(ignored locs k) (read-expr p locs k)]) - (read-expr p locs k))] - [(pair? t) - (cond - [(eq? (car t) 'datum) (values (cdr t) locs k)] - [(eq? (car t) 'macro) - (let-values ([(expr locs k) (read-expr p locs k)]) - (let ([x (list expr)]) - (values (cons (cdr t) x) locs - (if (loc? expr) - (lambda () - (set-car! x (loc-value expr)) - (k)) - k))))] - [(eq? (car t) 'mark) - (let ([n (cdr t)]) - (let-values ([(expr locs k) (read-expr p locs k)]) - (cond - [(assq n locs) => - (lambda (x) - (let ([loc (cdr x)]) - (when (loc-set? loc) - (error 'read "duplicate mark ~s" n)) - (set-loc-value! loc expr) - (set-loc-set?! loc #t) - (values expr locs k)))] - [else - (let ([loc (make-loc expr #t)]) - (let ([locs (cons (cons n loc) locs)]) - (values expr locs k)))])))] - [(eq? (car t) 'ref) - (let ([n (cdr t)]) - (cond - [(assq n locs) => - (lambda (x) - (values (cdr x) locs k))] - [else - (let ([loc (make-loc #f #f)]) - (let ([locs (cons (cons n loc) locs)]) - (values loc locs k)))]))] - [else (error 'read "invalid token! ~s" t)])] - [else - (error 'read "unexpected ~s found" t)]))) - (define read-expr - (lambda (p locs k) - (parse-token p locs k (read-token p)))) - - (define reduce-loc! - (lambda (x) - (let ([loc (cdr x)]) - (unless (loc-set? loc) - (error 'read "referenced mark ~s not set" (car x))) - (when (loc? (loc-value loc)) - (let f ([h loc] [t loc]) - (if (loc? h) - (let ([h1 (loc-value h)]) - (if (loc? h1) - (begin - (when (eq? h1 t) - (error 'read "circular marks")) - (let ([v (f (loc-value h1) (loc-value t))]) - (set-loc-value! h1 v) - (set-loc-value! h v) - v)) - (begin - (set-loc-value! h h1) - h1))) - h)))))) - - (define read - (lambda (p) - (let-values ([(expr locs k) (read-expr p '() void)]) - (cond - [(null? locs) expr] - [else - (for-each reduce-loc! locs) - (k) - (if (loc? expr) - (loc-value expr) - expr)])))) - - - - - ;;; - ;;;--------------------------------------------------------------* INIT *--- - ;;; - (primitive-set! 'read-token - (case-lambda - [() (tokenize (current-input-port))] - [(p) - (if (input-port? p) - (tokenize p) - (error 'read-token "~s is not an input port" p))])) - (primitive-set! 'read - (case-lambda - [() (read (current-input-port))] - [(p) - (if (input-port? p) - (read p) - (error 'read "~s is not an input port" p))])) - (let () - (define read-and-eval - (lambda (p) - (let ([x (read p)]) - (unless (eof-object? x) - (eval x) - (read-and-eval p))))) - (primitive-set! 'load - (lambda (x) - (unless (string? x) - (error 'load "~s is not a string" x)) - (let ([p (open-input-file x)]) - (read-and-eval p) - (close-input-port p))))) - ) - diff --git a/src/libtokenizer-9.1.ss b/src/libtokenizer.ss similarity index 100% rename from src/libtokenizer-9.1.ss rename to src/libtokenizer.ss diff --git a/src/libtoplevel-6.9.ss b/src/libtoplevel.ss similarity index 100% rename from src/libtoplevel-6.9.ss rename to src/libtoplevel.ss diff --git a/src/libtrace-6.9.ss b/src/libtrace.ss similarity index 100% rename from src/libtrace-6.9.ss rename to src/libtrace.ss diff --git a/src/libwriter-6.2.ss b/src/libwriter-6.2.ss deleted file mode 100644 index 2f114f8..0000000 --- a/src/libwriter-6.2.ss +++ /dev/null @@ -1,373 +0,0 @@ - -;;; 6.2: * added a printer for bwp-objects - -;;; WRITER provides display and write. - -(let () - (define char-table ; first nonprintable chars - '#("nul" "soh" "stx" "etx" "eot" "enq" "ack" "bel" "bs" "tab" "newline" - "vt" "ff" "return" "so" "si" "dle" "dc1" "dc2" "dc3" "dc4" "nak" - "syn" "etb" "can" "em" "sub" "esc" "fs" "gs" "rs" "us" "space")) - (define write-character - (lambda (x p m) - (if m - (let ([i ($char->fixnum x)]) - (write-char #\# p) - (cond - [(fx< i (vector-length char-table)) - (write-char #\\ p) - (write-char* (vector-ref char-table i) p)] - [(fx< i 127) - (write-char #\\ p) - (write-char x p)] - [(fx= i 127) - (write-char #\\ p) - (write-char* "del" p)] - [else - (write-char #\+ p) - (write-fixnum i p)])) - (write-char x p)))) - (define write-list - (lambda (x p m) - (cond - [(pair? x) - (write-char #\space p) - (writer (car x) p m) - (write-list (cdr x) p m)] - [(not (null? x)) - (write-char #\space p) - (write-char #\. p) - (write-char #\space p) - (writer x p m)]))) - (define write-vector - (lambda (x p m) - (write-char #\# p) - (write-char #\( p) - (let ([n (vector-length x)]) - (when (fx> n 0) - (writer (vector-ref x 0) p m) - (letrec ([f - (lambda (i) - (unless (fx= i n) - (write-char #\space p) - (writer (vector-ref x i) p m) - (f (fxadd1 i))))]) - (f 1)))) - (write-char #\) p))) - (define write-record - (lambda (x p m) - (write-char #\# p) - (write-char #\[ p) - (writer (record-name x) p m) - (let ([n (record-length x)]) - (letrec ([f - (lambda (i) - (unless (fx= i n) - (write-char #\space p) - (writer (record-ref x i) p m) - (f (fxadd1 i))))]) - (f 0))) - (write-char #\] p))) - (define initial? - (lambda (c) - (or (letter? c) (special-initial? c)))) - (define letter? - (lambda (c) - (or (and ($char<= #\a c) ($char<= c #\z)) - (and ($char<= #\A c) ($char<= c #\Z))))) - (define digit? - (lambda (c) - (and ($char<= #\0 c) ($char<= c #\9)))) - (define special-initial? - (lambda (x) - (memq x '(#\! #\$ #\% #\& #\* #\/ #\: #\< #\= #\> #\? #\^ #\_ #\~)))) - (define subsequent? - (lambda (x) - (or (initial? x) - (digit? x) - (special-subsequent? x)))) - (define special-subsequent? - (lambda (x) - (memq x '(#\+ #\- #\. #\@)))) - (define subsequent*? - (lambda (str i n) - (or ($fx= i n) - (and (subsequent? ($string-ref str i)) - (subsequent*? str ($fxadd1 i) n))))) - (define valid-symbol-string? - (lambda (str) - (or (let ([n ($string-length str)]) - (and ($fx>= n 1) - (initial? ($string-ref str 0)) - (subsequent*? str 1 n))) - (string=? str "+") - (string=? str "-") - (string=? str "...")))) - (define write-symbol-esc-loop - (lambda (x i n p) - (unless ($fx= i n) - (let ([c ($string-ref x i)]) - (when (memq c '(#\\ #\|)) - (write-char #\\ p)) - (write-char c p)) - (write-symbol-esc-loop x ($fxadd1 i) n p)))) - (define write-symbol-esc - (lambda (x p) - (write-char #\| p) - (write-symbol-esc-loop x 0 ($string-length x) p) - (write-char #\| p))) - (define write-symbol - (lambda (x p m) - (let ([str (symbol->string x)]) - (if m - (if (valid-symbol-string? str) - (write-char* str p) - (write-symbol-esc str p)) - (write-char* str p))))) - (define write-gensym - (lambda (x p m) - (cond - [(and m (print-gensym)) - (let ([str (symbol->string x)]) - (write-char #\# p) - (write-char #\{ p) - (if (valid-symbol-string? str) - (write-char* str p) - (write-symbol-esc str p)) - (write-char #\space p) - (write-symbol-esc (gensym->unique-string x) p) - (write-char #\} p))] - [else (write-symbol x p m)]))) - (define write-string-escape - (lambda (x p) - (define loop - (lambda (x i n p) - (unless (fx= i n) - (let ([c (string-ref x i)]) - (cond - [(or ($char= #\" c) ($char= #\\ c)) - (write-char #\\ p) - (write-char c p)] - [($char= #\tab c) - (write-char #\\ p) - (write-char #\t p)] - [else - (write-char c p)])) - (loop x (fxadd1 i) n p)))) - (write-char #\" p) - (loop x 0 (string-length x) p) - (write-char #\" p))) - (define write-string - (lambda (x p m) - (if m - (write-string-escape x p) - (write-char* x p)))) - (define write-fixnum - (lambda (x p) - (define loop - (lambda (x p) - (unless (fxzero? x) - (loop (fxquotient x 10) p) - (write-char - ($fixnum->char - ($fx+ (fxremainder x 10) - ($char->fixnum #\0))) - p)))) - (cond - [(fxzero? x) (write-char #\0 p)] - [(fx< x 0) - (write-char #\- p) - (if (fx= x -536870912) - (write-char* "536870912" p) - (loop (fx- 0 x) p))] - [else (loop x p)]))) - (define write-char* - (lambda (x p) - (define loop - (lambda (x i n p) - (unless (fx= i n) - (write-char (string-ref x i) p) - (loop x (fxadd1 i) n p)))) - (loop x 0 (string-length x) p))) - (define macro - (lambda (x) - (define macro-forms - '([quote . "'"] - [quasiquote . "`"] - [unquote . ","] - [unquote-splicing . ",@"] - [syntax . "#'"] - [|#primitive| . "#%"])) - (and (pair? x) - (let ([d ($cdr x)]) - (and (pair? d) - (null? ($cdr d)))) - (assq ($car x) macro-forms)))) - (define writer - (lambda (x p m) - (cond - [(macro x) => - (lambda (y) - (write-char* (cdr y) p) - (writer (cadr x) p m))] - [(pair? x) - (write-char #\( p) - (writer (car x) p m) - (write-list (cdr x) p m) - (write-char #\) p)] - [(symbol? x) - (if (gensym? x) - (write-gensym x p m) - (write-symbol x p m))] - [(fixnum? x) - (write-fixnum x p)] - [(string? x) - (write-string x p m)] - [(boolean? x) - (write-char* (if x "#t" "#f") p)] - [(char? x) - (write-character x p m)] - [(procedure? x) - (write-char* "#" p)] - [(output-port? x) - (write-char* "# p)] - [(input-port? x) - (write-char* "# p)] - [(vector? x) - (write-vector x p m)] - [(null? x) - (write-char #\( p) - (write-char #\) p)] - [(eq? x (void)) - (write-char* "#" p)] - [(eof-object? x) - (write-char* "#!eof" p)] - [(bwp-object? x) - (write-char* "#!bwp" p)] - [(record? x) - (let ([printer (record-printer x)]) - (if (procedure? printer) - (printer x p) - (write-record x p m)))] - ;[(code? x) - ; (write-char* "#" p)] - [(hash-table? x) - (write-char* "#" p)] - [($unbound-object? x) - (write-char* "#" p)] - [($forward-ptr? x) - (write-char* "#" p)] - [else - (write-char* "#" p)]))) - - (define (write x p) - (writer x p #t) - (flush-output-port p)) - (define (display x p) - (writer x p #f) - (flush-output-port p)) - ;;; - (define formatter - (lambda (who p fmt args) - (let f ([i 0] [args args]) - (unless (fx= i (string-length fmt)) - (let ([c (string-ref fmt i)]) - (cond - [($char= c #\~) - (let ([i (fxadd1 i)]) - (when (fx= i (string-length fmt)) - (error who "invalid ~~ at end of format string ~s" fmt)) - (let ([c (string-ref fmt i)]) - (cond - [($char= c #\~) - (write-char #\~ p) - (f (fxadd1 i) args)] - [($char= c #\a) - (when (null? args) - (error who "insufficient arguments")) - (display (car args) p) - (f (fxadd1 i) (cdr args))] - [($char= c #\s) - (when (null? args) - (error who "insufficient arguments")) - (write (car args) p) - (f (fxadd1 i) (cdr args))] - [else - (error who "invalid sequence ~~~a" c)])))] - [else - (write-char c p) - (f (fxadd1 i) args)])))))) - - (define fprintf - (lambda (port fmt . args) - (unless (output-port? port) - (error 'fprintf "~s is not an output port" port)) - (unless (string? fmt) - (error 'fprintf "~s is not a string" fmt)) - (formatter 'fprintf port fmt args))) - - (define printf - (lambda (fmt . args) - (unless (string? fmt) - (error 'printf "~s is not a string" fmt)) - (formatter 'printf (current-output-port) fmt args))) - - (define format - (lambda (fmt . args) - (unless (string? fmt) - (error 'format "~s is not a string" fmt)) - (let ([p (open-output-string)]) - (formatter 'format p fmt args) - (get-output-string p)))) - - (define print-error - (lambda (who fmt . args) - (unless (string? fmt) - (error 'print-error "~s is not a string" fmt)) - (let ([p (standard-error-port)]) - (if who - (fprintf p "Error in ~a: " who) - (fprintf p "Error: ")) - (formatter 'print-error p fmt args) - (write-char #\. p) - (newline p)))) - - - ;;; - (primitive-set! 'format format) - (primitive-set! 'printf printf) - (primitive-set! 'fprintf fprintf) - (primitive-set! 'write - (case-lambda - [(x) (write x (current-output-port))] - [(x p) - (unless (output-port? p) - (error 'write "~s is not an output port" p)) - (write x p)])) - (primitive-set! 'display - (case-lambda - [(x) (display x (current-output-port))] - [(x p) - (unless (output-port? p) - (error 'display "~s is not an output port" p)) - (display x p)])) - (primitive-set! 'print-error print-error) - (primitive-set! 'current-error-handler - (make-parameter - (lambda args - (apply print-error args) - (display "exiting\n" (console-output-port)) - (flush-output-port (console-output-port)) - (exit -100)) - (lambda (x) - (if (procedure? x) - x - (error 'current-error-handler "~s is not a procedure" x))))) - (primitive-set! 'error - (lambda args - (apply (current-error-handler) args)))) - diff --git a/src/libwriter-9.0.ss b/src/libwriter-9.0.ss deleted file mode 100644 index 9654775..0000000 --- a/src/libwriter-9.0.ss +++ /dev/null @@ -1,496 +0,0 @@ - -;;; 6.2: * added a printer for bwp-objects - -;;; WRITER provides display and write. - -(let () - (define char-table ; first nonprintable chars - '#("nul" "soh" "stx" "etx" "eot" "enq" "ack" "bel" "bs" "tab" "newline" - "vt" "ff" "return" "so" "si" "dle" "dc1" "dc2" "dc3" "dc4" "nak" - "syn" "etb" "can" "em" "sub" "esc" "fs" "gs" "rs" "us" "space")) - (define write-character - (lambda (x p m) - (if m - (let ([i ($char->fixnum x)]) - (write-char #\# p) - (cond - [(fx< i (vector-length char-table)) - (write-char #\\ p) - (write-char* (vector-ref char-table i) p)] - [(fx< i 127) - (write-char #\\ p) - (write-char x p)] - [(fx= i 127) - (write-char #\\ p) - (write-char* "del" p)] - [else - (write-char #\+ p) - (write-fixnum i p)])) - (write-char x p)))) - (define write-list - (lambda (x p m h i) - (cond - [(and (pair? x) - (or (not (get-hash-table h x #f)) - (fxzero? (get-hash-table h x 0)))) - (write-char #\space p) - (write-list (cdr x) p m h - (writer (car x) p m h i))] - [(null? x) i] - [else - (write-char #\space p) - (write-char #\. p) - (write-char #\space p) - (writer x p m h i)]))) - (define write-vector - (lambda (x p m h i) - (write-char #\# p) - (write-char #\( p) - (let ([n (vector-length x)]) - (let ([i - (cond - [(fx> n 0) - (let f ([idx 1] [i (writer (vector-ref x 0) p m h i)]) - (cond - [(fx= idx n) - i] - [else - (write-char #\space p) - (f (fxadd1 idx) - (writer (vector-ref x idx) p m h i))]))] - [else i])]) - (write-char #\) p) - i)))) - (define write-record - (lambda (x p m h i) - (write-char #\# p) - (write-char #\[ p) - (let ([i (writer (record-name x) p m h i)]) - (let ([n (record-length x)]) - (let f ([idx 0] [i i]) - (cond - [(fx= idx n) - (write-char #\] p) - i] - [else - (write-char #\space p) - (f (fxadd1 idx) - (writer (record-ref x idx) p m h i))])))))) - (define initial? - (lambda (c) - (or (letter? c) (special-initial? c)))) - (define letter? - (lambda (c) - (or (and ($char<= #\a c) ($char<= c #\z)) - (and ($char<= #\A c) ($char<= c #\Z))))) - (define digit? - (lambda (c) - (and ($char<= #\0 c) ($char<= c #\9)))) - (define special-initial? - (lambda (x) - (memq x '(#\! #\$ #\% #\& #\* #\/ #\: #\< #\= #\> #\? #\^ #\_ #\~)))) - (define subsequent? - (lambda (x) - (or (initial? x) - (digit? x) - (special-subsequent? x)))) - (define special-subsequent? - (lambda (x) - (memq x '(#\+ #\- #\. #\@)))) - (define subsequent*? - (lambda (str i n) - (or ($fx= i n) - (and (subsequent? ($string-ref str i)) - (subsequent*? str ($fxadd1 i) n))))) - (define valid-symbol-string? - (lambda (str) - (or (let ([n ($string-length str)]) - (and ($fx>= n 1) - (initial? ($string-ref str 0)) - (subsequent*? str 1 n))) - (string=? str "+") - (string=? str "-") - (string=? str "...")))) - (define write-symbol-esc-loop - (lambda (x i n p) - (unless ($fx= i n) - (let ([c ($string-ref x i)]) - (when (memq c '(#\\ #\|)) - (write-char #\\ p)) - (write-char c p)) - (write-symbol-esc-loop x ($fxadd1 i) n p)))) - (define write-symbol-esc - (lambda (x p) - (write-char #\| p) - (write-symbol-esc-loop x 0 ($string-length x) p) - (write-char #\| p))) - (define write-symbol - (lambda (x p m) - (let ([str (symbol->string x)]) - (if m - (if (valid-symbol-string? str) - (write-char* str p) - (write-symbol-esc str p)) - (write-char* str p))))) - (define write-gensym - (lambda (x p m h i) - (cond - [(and m (print-gensym)) - (let ([str (symbol->string x)]) - (write-char #\# p) - (write-char #\{ p) - (if (valid-symbol-string? str) - (write-char* str p) - (write-symbol-esc str p)) - (write-char #\space p) - (write-symbol-esc (gensym->unique-string x) p) - (write-char #\} p)) - i] - [else - (write-symbol x p m) - i]))) - (define write-string-escape - (lambda (x p) - (define loop - (lambda (x i n p) - (unless (fx= i n) - (let ([c (string-ref x i)]) - (cond - [(or ($char= #\" c) ($char= #\\ c)) - (write-char #\\ p) - (write-char c p)] - [($char= #\tab c) - (write-char #\\ p) - (write-char #\t p)] - [else - (write-char c p)])) - (loop x (fxadd1 i) n p)))) - (write-char #\" p) - (loop x 0 (string-length x) p) - (write-char #\" p))) - (define write-string - (lambda (x p m) - (if m - (write-string-escape x p) - (write-char* x p)))) - (define write-fixnum - (lambda (x p) - (define loop - (lambda (x p) - (unless (fxzero? x) - (loop (fxquotient x 10) p) - (write-char - ($fixnum->char - ($fx+ (fxremainder x 10) - ($char->fixnum #\0))) - p)))) - (cond - [(fxzero? x) (write-char #\0 p)] - [(fx< x 0) - (write-char #\- p) - (if (fx= x -536870912) - (write-char* "536870912" p) - (loop (fx- 0 x) p))] - [else (loop x p)]))) - (define write-char* - (lambda (x p) - (define loop - (lambda (x i n p) - (unless (fx= i n) - (write-char (string-ref x i) p) - (loop x (fxadd1 i) n p)))) - (loop x 0 (string-length x) p))) - (define macro - (lambda (x) - (define macro-forms - '([quote . "'"] - [quasiquote . "`"] - [unquote . ","] - [unquote-splicing . ",@"] - [syntax . "#'"] - [|#primitive| . "#%"])) - (and (pair? x) - (let ([d ($cdr x)]) - (and (pair? d) - (null? ($cdr d)))) - (assq ($car x) macro-forms)))) - (define write-pair - (lambda (x p m h i) - (write-char #\( p) - (let ([i (writer (car x) p m h i)]) - (let ([i (write-list (cdr x) p m h i)]) - (write-char #\) p) - i)))) - (define write-ref - (lambda (n p) - (write-char #\# p) - (write-fixnum (fx- -1 n) p) - (write-char #\# p))) - (define write-mark - (lambda (n p) - (write-char #\# p) - (write-fixnum (fx- -1 n) p) - (write-char #\= p))) - (define write-shareable - (lambda (x p m h i k) - (cond - [(get-hash-table h x #f) => - (lambda (n) - (cond - [(fx< n 0) - (write-ref n p) - i] - [(fx= n 0) - (k x p m h i)] - [else - (let ([i (fx- i 1)]) - (put-hash-table! h x i) - (write-mark i p) - (k x p m h i))]))] - [else (k x p m h i)]))) - (define writer - (lambda (x p m h i) - (cond - [(pair? x) - (write-shareable x p m h i write-pair)] - [(symbol? x) - (if (gensym? x) - (write-gensym x p m h i) - (begin (write-symbol x p m) i))] - [(fixnum? x) - (write-fixnum x p) - i] - [(string? x) - (write-string x p m) - i] - [(boolean? x) - (write-char* (if x "#t" "#f") p) - i] - [(char? x) - (write-character x p m) - i] - [(procedure? x) - (write-char* "#" p) - i] - [(output-port? x) - (write-char* "# p) - i)] - [(input-port? x) - (write-char* "# p) - i)] - [(vector? x) - (write-shareable x p m h i write-vector)] - [(null? x) - (write-char #\( p) - (write-char #\) p) - i] - [(eq? x (void)) - (write-char* "#" p) - i] - [(eof-object? x) - (write-char* "#!eof" p) - i] - [(bwp-object? x) - (write-char* "#!bwp" p) - i] - [(record? x) - (let ([printer (record-printer x)]) - (if (procedure? printer) - (begin (printer x p) i) - (write-shareable x p m h i write-record)))] - ;[(code? x) - ; (write-char* "#" p)] - [(hash-table? x) - (write-char* "#" p) - i] - [($unbound-object? x) - (write-char* "#" p) - i] - [($forward-ptr? x) - (write-char* "#" p) - i] - [else - (write-char* "#" p) - i]))) - - (define print-graph (make-parameter #f)) - - (define (hasher x h) - (define (vec-graph x i j h) - (unless (fx= i j) - (graph (vector-ref x i) h) - (vec-graph x (fxadd1 i) j h))) - (define (vec-dynamic x i j h) - (unless (fx= i j) - (dynamic (vector-ref x i) h) - (vec-dynamic x (fxadd1 i) j h))) - (define (graph x h) - (cond - [(pair? x) - (cond - [(get-hash-table h x #f) => - (lambda (n) - (put-hash-table! h x (fxadd1 n)))] - [else - (put-hash-table! h x 0) - (graph (car x) h) - (graph (cdr x) h)])] - [(vector? x) - (cond - [(get-hash-table h x #f) => - (lambda (n) - (put-hash-table! h x (fxadd1 n)))] - [else - (put-hash-table! h x 0) - (vec-graph x 0 (vector-length x) h)])] - [(gensym? x) - (cond - [(get-hash-table h x #f) => - (lambda (n) - (put-hash-table! h x (fxadd1 n)))])])) - (define (dynamic x h) - (cond - [(pair? x) - (cond - [(get-hash-table h x #f) => - (lambda (n) - (put-hash-table! h x (fxadd1 n)))] - [else - (put-hash-table! h x 0) - (dynamic (car x) h) - (dynamic (cdr x) h) - (when (and (get-hash-table h x #f) - (fxzero? (get-hash-table h x #f))) - (put-hash-table! h x #f))])] - [(vector? x) - (cond - [(get-hash-table h x #f) => - (lambda (n) - (put-hash-table! h x (fxadd1 n)))] - [else - (put-hash-table! h x 0) - (vec-dynamic x 0 (vector-length x) h) - (when (and (get-hash-table h x #f) - (fxzero? (get-hash-table h x #f))) - (put-hash-table! h x #f))])])) - (if (print-graph) - (graph x h) - (dynamic x h))) - - (define (write x p) - (let ([h (make-hash-table)]) - (hasher x h) - (writer x p #t h 0)) - (flush-output-port p)) - ;;; - (define (display x p) - (let ([h (make-hash-table)]) - (hasher x h) - (writer x p #f h 0)) - (flush-output-port p)) - ;;; - (define formatter - (lambda (who p fmt args) - (let f ([i 0] [args args]) - (unless (fx= i (string-length fmt)) - (let ([c (string-ref fmt i)]) - (cond - [($char= c #\~) - (let ([i (fxadd1 i)]) - (when (fx= i (string-length fmt)) - (error who "invalid ~~ at end of format string ~s" fmt)) - (let ([c (string-ref fmt i)]) - (cond - [($char= c #\~) - (write-char #\~ p) - (f (fxadd1 i) args)] - [($char= c #\a) - (when (null? args) - (error who "insufficient arguments")) - (display (car args) p) - (f (fxadd1 i) (cdr args))] - [($char= c #\s) - (when (null? args) - (error who "insufficient arguments")) - (write (car args) p) - (f (fxadd1 i) (cdr args))] - [else - (error who "invalid sequence ~~~a" c)])))] - [else - (write-char c p) - (f (fxadd1 i) args)])))))) - - (define fprintf - (lambda (port fmt . args) - (unless (output-port? port) - (error 'fprintf "~s is not an output port" port)) - (unless (string? fmt) - (error 'fprintf "~s is not a string" fmt)) - (formatter 'fprintf port fmt args))) - - (define printf - (lambda (fmt . args) - (unless (string? fmt) - (error 'printf "~s is not a string" fmt)) - (formatter 'printf (current-output-port) fmt args))) - - (define format - (lambda (fmt . args) - (unless (string? fmt) - (error 'format "~s is not a string" fmt)) - (let ([p (open-output-string)]) - (formatter 'format p fmt args) - (get-output-string p)))) - - (define print-error - (lambda (who fmt . args) - (unless (string? fmt) - (error 'print-error "~s is not a string" fmt)) - (let ([p (standard-error-port)]) - (if who - (fprintf p "Error in ~a: " who) - (fprintf p "Error: ")) - (formatter 'print-error p fmt args) - (write-char #\. p) - (newline p)))) - - - ;;; - (primitive-set! 'format format) - (primitive-set! 'printf printf) - (primitive-set! 'fprintf fprintf) - (primitive-set! 'print-graph print-graph) - (primitive-set! 'write - (case-lambda - [(x) (write x (current-output-port))] - [(x p) - (unless (output-port? p) - (error 'write "~s is not an output port" p)) - (write x p)])) - (primitive-set! 'display - (case-lambda - [(x) (display x (current-output-port))] - [(x p) - (unless (output-port? p) - (error 'display "~s is not an output port" p)) - (display x p)])) - (primitive-set! 'print-error print-error) - (primitive-set! 'current-error-handler - (make-parameter - (lambda args - (apply print-error args) - (display "exiting\n" (console-output-port)) - (flush-output-port (console-output-port)) - (exit -100)) - (lambda (x) - (if (procedure? x) - x - (error 'current-error-handler "~s is not a procedure" x))))) - (primitive-set! 'error - (lambda args - (apply (current-error-handler) args)))) - diff --git a/src/libwriter-9.1.ss b/src/libwriter.ss similarity index 100% rename from src/libwriter-9.1.ss rename to src/libwriter.ss diff --git a/src/makefile.ss b/src/makefile.ss index dcd206b..86252bb 100644 --- a/src/makefile.ss +++ b/src/makefile.ss @@ -241,27 +241,27 @@ (whack-system-env #t) (define scheme-library-files - '(["libhandlers-6.9.ss" #t "libhandlers.fasl"] - ["libcontrol-6.1.ss" #t "libcontrol.fasl"] - ["libcollect-6.1.ss" #t "libcollect.fasl"] - ["librecord-6.4.ss" #t "librecord.fasl"] - ["libcxr-6.0.ss" #t "libcxr.fasl"] - ["libnumerics-9.1.ss" #t "libnumerics.fasl"] - ["libcore-6.9.ss" #t "libcore.fasl"] - ["libchezio-8.1.ss" #t "libchezio.fasl"] - ["libhash-9.2.ss" #t "libhash.fasl"] - ["libwriter-9.1.ss" #t "libwriter.fasl"] - ["libtokenizer-9.1.ss" #t "libtokenizer.fasl"] - ["libassembler-6.7.ss" #t "libassembler.fasl"] - ["libintelasm-6.9.ss" #t "libintelasm.fasl"] - ["libfasl-6.7.ss" #t "libfasl.fasl"] - ["libcompile-9.1.ss" #t "libcompile.fasl"] - ["psyntax-7.1-9.1.ss" #t "psyntax.fasl"] - ["libinterpret-6.5.ss" #t "libinterpret.fasl"] - ["libcafe-6.1.ss" #t "libcafe.fasl"] - ["libtrace-6.9.ss" #t "libtrace.fasl"] - ["libposix-6.0.ss" #t "libposix.fasl"] - ["libtoplevel-6.9.ss" #t "libtoplevel.fasl"] + '(["libhandlers.ss" #t "libhandlers.fasl"] + ["libcontrol.ss" #t "libcontrol.fasl"] + ["libcollect.ss" #t "libcollect.fasl"] + ["librecord.ss" #t "librecord.fasl"] + ["libcxr.ss" #t "libcxr.fasl"] + ["libnumerics.ss" #t "libnumerics.fasl"] + ["libcore.ss" #t "libcore.fasl"] + ["libchezio.ss" #t "libchezio.fasl"] + ["libhash.ss" #t "libhash.fasl"] + ["libwriter.ss" #t "libwriter.fasl"] + ["libtokenizer.ss" #t "libtokenizer.fasl"] + ["libassembler.ss" #t "libassembler.fasl"] + ["libintelasm.ss" #t "libintelasm.fasl"] + ["libfasl.ss" #t "libfasl.fasl"] + ["libcompile.ss" #t "libcompile.fasl"] + ["psyntax-7.1.ss" #t "psyntax.fasl"] + ["libinterpret.ss" #t "libinterpret.fasl"] + ["libcafe.ss" #t "libcafe.fasl"] + ["libtrace.ss" #t "libtrace.fasl"] + ["libposix.ss" #t "libposix.fasl"] + ["libtoplevel.ss" #t "libtoplevel.fasl"] )) diff --git a/src/psyntax-7.1-6.9.ss b/src/psyntax-7.1-6.9.ss deleted file mode 100644 index e50e456..0000000 --- a/src/psyntax-7.1-6.9.ss +++ /dev/null @@ -1,4711 +0,0 @@ -;;; Portable implementation of syntax-case -;;; Extracted from Chez Scheme Version 7.1 (Aug 01, 2006) -;;; Authors: R. Kent Dybvig, Oscar Waddell, Bob Hieb, Carl Bruggeman - -;;; Copyright (c) 1992-2002 Cadence Research Systems -;;; Permission to copy this software, in whole or in part, to use this -;;; software for any lawful purpose, and to redistribute this software -;;; is granted subject to the restriction that all copies made of this -;;; software must include this copyright notice in full. This software -;;; is provided AS IS, with NO WARRANTY, EITHER EXPRESS OR IMPLIED, -;;; INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES OF MERCHANTABILITY -;;; OR FITNESS FOR ANY PARTICULAR PURPOSE. IN NO EVENT SHALL THE -;;; AUTHORS BE LIABLE FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES OF ANY -;;; NATURE WHATSOEVER. - -;;; Before attempting to port this code to a new implementation of -;;; Scheme, please read the notes below carefully. - -;;; This file defines the syntax-case expander, sc-expand, and a set -;;; of associated syntactic forms and procedures. Of these, the -;;; following are documented in The Scheme Programming Language, -;;; Third Edition (R. Kent Dybvig, MIT Press, 2003), which can be -;;; found online at http://www.scheme.com/tspl3/. Most are also documented -;;; in the R4RS and draft R5RS. -;;; -;;; bound-identifier=? -;;; datum->syntax-object -;;; define-syntax -;;; fluid-let-syntax -;;; free-identifier=? -;;; generate-temporaries -;;; identifier? -;;; identifier-syntax -;;; let-syntax -;;; letrec-syntax -;;; syntax -;;; syntax-case -;;; syntax-object->datum -;;; syntax-rules -;;; with-syntax -;;; -;;; All standard Scheme syntactic forms are supported by the expander -;;; or syntactic abstractions defined in this file. Only the R4RS -;;; delay is omitted, since its expansion is implementation-dependent. - -;;; Also defined are three forms that support modules: module, import, -;;; and import-only. These are documented in the Chez Scheme User's -;;; Guide (R. Kent Dybvig, Cadence Research Systems, 1998), which can -;;; also be found online at http://www.scheme.com/csug/. They are -;;; described briefly here as well. - -;;; All are definitions and may appear where and only where other -;;; definitions may appear. modules may be named: -;;; -;;; (module id (ex ...) defn ... init ...) -;;; -;;; or anonymous: -;;; -;;; (module (ex ...) defn ... init ...) -;;; -;;; The latter form is semantically equivalent to: -;;; -;;; (module T (ex ...) defn ... init ...) -;;; (import T) -;;; -;;; where T is a fresh identifier. -;;; -;;; In either form, each of the exports in (ex ...) is either an -;;; identifier or of the form (id ex ...). In the former case, the -;;; single identifier ex is exported. In the latter, the identifier -;;; id is exported and the exports ex ... are "implicitly" exported. -;;; This listing of implicit exports is useful only when id is a -;;; keyword bound to a transformer that expands into references to -;;; the listed implicit exports. In the present implementation, -;;; listing of implicit exports is necessary only for top-level -;;; modules and allows the implementation to avoid placing all -;;; identifiers into the top-level environment where subsequent passes -;;; of the compiler will be unable to deal effectively with them. -;;; -;;; Named modules may be referenced in import statements, which -;;; always take one of the forms: -;;; -;;; (import id) -;;; (import-only id) -;;; -;;; id must name a module. Each exported identifier becomes visible -;;; within the scope of the import form. In the case of import-only, -;;; all other identifiers become invisible in the scope of the -;;; import-only form, except for those established by definitions -;;; that appear textually after the import-only form. - -;;; import and import-only also support a variety of identifier -;;; selection and renaming forms: only, except, add-prefix, -;;; drop-prefix, rename, and alias. -;;; -;;; (import (only m x y)) -;;; -;;; imports x and y (and nothing else) from m. -;;; -;;; (import (except m x y)) -;;; -;;; imports all of m's imports except for x and y. -;;; -;;; (import (add-prefix (only m x y) m:)) -;;; -;;; imports x and y as m:x and m:y. -;;; -;;; (import (drop-prefix m foo:)) -;;; -;;; imports all of m's imports, dropping the common foo: prefix -;;; (which must appear on all of m's exports). -;;; -;;; (import (rename (except m a b) (m-c c) (m-d d))) -;;; -;;; imports all of m's imports except for x and y, renaming c -;;; m-c and d m-d. -;;; -;;; (import (alias (except m a b) (m-c c) (m-d d))) -;;; -;;; imports all of m's imports except for x and y, with additional -;;; aliases m-c for c and m-d for d. -;;; -;;; multiple imports may be specified with one import form: -;;; -;;; (import (except m1 x) (only m2 x)) -;;; -;;; imports all of m1's exports except for x plus x from m2. - -;;; Another form, meta, may be used as a prefix for any definition and -;;; causes any resulting variable bindings to be created at expansion -;;; time. Meta variables (variables defined using meta) are available -;;; only at expansion time. Meta definitions are often used to create -;;; data and helpers that can be shared by multiple macros, for example: - -;;; (module (alpha beta) -;;; (meta define key-error -;;; (lambda (key) -;;; (syntax-error key "invalid key"))) -;;; (meta define parse-keys -;;; (lambda (keys) -;;; (let f ((keys keys) (c #'white) (s 10)) -;;; (syntax-case keys (color size) -;;; (() (list c s)) -;;; (((color c) . keys) (f #'keys #'c s)) -;;; (((size s) . keys) (f #'keys c #'s)) -;;; ((k . keys) (key-error #'k)))))) -;;; (define-syntax alpha -;;; (lambda (x) -;;; (syntax-case x () -;;; ((_ (k ...) ) -;;; (with-syntax (((c s) (parse-keys (syntax (k ...))))) -;;; ---))))) -;;; (define-syntax beta -;;; (lambda (x) -;;; (syntax-case x () -;;; ((_ (k ...) ) -;;; (with-syntax (((c s) (parse-keys (syntax (k ...))))) -;;; ---)))))) - -;;; As with define-syntax rhs expressions, meta expressions can evaluate -;;; references only to identifiers whose values are (already) available -;;; in the compile-time environment, e.g., macros and meta variables. -;;; They can, however, like define-syntax rhs expressions, build syntax -;;; objects containing occurrences of any identifiers in their scope. - -;;; meta definitions propagate through macro expansion, so one can write, -;;; for example: -;;; -;;; (module (a) -;;; (meta define-structure (foo x)) -;;; (define-syntax a -;;; (let ((q (make-foo (syntax 'q)))) -;;; (lambda (x) -;;; (foo-x q))))) -;;; a -> q -;;; -;;; where define-record is a macro that expands into a set of defines. -;;; -;;; It is also sometimes convenient to write -;;; -;;; (meta begin defn ...) -;;; -;;; or -;;; -;;; (meta module {exports} defn ...) -;;; -;;; to create groups of meta bindings. - -;;; Another form, alias, is used to create aliases from one identifier -;;; to another. This is used primarily to support the extended import -;;; syntaxes (add-prefix, drop-prefix, rename, and alias). - -;;; (let ((x 3)) (alias y x) y) -> 3 - -;;; The remaining exports are listed below. sc-expand, eval-when, and -;;; syntax-error are described in the Chez Scheme User's Guide. -;;; -;;; (sc-expand datum) -;;; if datum represents a valid expression, sc-expand returns an -;;; expanded version of datum in a core language that includes no -;;; syntactic abstractions. The core language includes begin, -;;; define, if, lambda, letrec, quote, and set!. -;;; (eval-when situations expr ...) -;;; conditionally evaluates expr ... at compile-time or run-time -;;; depending upon situations -;;; (syntax-error object message) -;;; used to report errors found during expansion -;;; ($syntax-dispatch e p) -;;; used by expanded code to handle syntax-case matching -;;; ($sc-put-cte symbol val top-token) -;;; used to establish top-level compile-time (expand-time) bindings. - -;;; The following nonstandard procedures must be provided by the -;;; implementation for this code to run. -;;; -;;; (void) -;;; returns the implementation's cannonical "unspecified value". The -;;; following usually works: -;;; -;;; (define void (lambda () (if #f #f))). -;;; -;;; (andmap proc list1 list2 ...) -;;; returns true if proc returns true when applied to each element of list1 -;;; along with the corresponding elements of list2 .... The following -;;; definition works but does no error checking: -;;; -;;; (define andmap -;;; (lambda (f first . rest) -;;; (or (null? first) -;;; (if (null? rest) -;;; (let andmap ((first first)) -;;; (let ((x (car first)) (first (cdr first))) -;;; (if (null? first) -;;; (f x) -;;; (and (f x) (andmap first))))) -;;; (let andmap ((first first) (rest rest)) -;;; (let ((x (car first)) -;;; (xr (map car rest)) -;;; (first (cdr first)) -;;; (rest (map cdr rest))) -;;; (if (null? first) -;;; (apply f (cons x xr)) -;;; (and (apply f (cons x xr)) (andmap first rest))))))))) -;;; -;;; (ormap proc list1) -;;; returns the first non-false return result of proc applied to -;;; the elements of list1 or false if none. The following definition -;;; works but does no error checking: -;;; -;;; (define ormap -;;; (lambda (proc list1) -;;; (and (not (null? list1)) -;;; (or (proc (car list1)) (ormap proc (cdr list1)))))) -;;; -;;; The following nonstandard procedures must also be provided by the -;;; implementation for this code to run using the standard portable -;;; hooks and output constructors. They are not used by expanded code, -;;; and so need be present only at expansion time. -;;; -;;; (eval x) -;;; where x is always in the form ("noexpand" expr). -;;; returns the value of expr. the "noexpand" flag is used to tell the -;;; evaluator/expander that no expansion is necessary, since expr has -;;; already been fully expanded to core forms. -;;; -;;; eval will not be invoked during the loading of psyntax.pp. After -;;; psyntax.pp has been loaded, the expansion of any macro definition, -;;; whether local or global, results in a call to eval. If, however, -;;; sc-expand has already been registered as the expander to be used -;;; by eval, and eval accepts one argument, nothing special must be done -;;; to support the "noexpand" flag, since it is handled by sc-expand. -;;; -;;; (error who format-string why what) -;;; where who is either a symbol or #f, format-string is always "~a ~s", -;;; why is always a string, and what may be any object. error should -;;; signal an error with a message something like -;;; -;;; "error in : " -;;; -;;; (gensym) -;;; returns a unique symbol each time it's called. In Chez Scheme, gensym -;;; returns a symbol with a "globally" unique name so that gensyms that -;;; end up in the object code of separately compiled files cannot conflict. -;;; This is necessary only if you intend to support compiled files. -;;; -;;; (gensym? x) -;;; returns #t if x is a gensym, otherwise false. -;;; -;;; (putprop symbol key value) -;;; (getprop symbol key) -;;; (remprop symbol key) -;;; key is always a symbol; value may be any object. putprop should -;;; associate the given value with the given symbol and key in some way -;;; that it can be retrieved later with getprop. getprop should return -;;; #f if no value is associated with the given symbol and key. remprop -;;; should remove the association between the given symbol and key. - -;;; When porting to a new Scheme implementation, you should define the -;;; procedures listed above, load the expanded version of psyntax.ss -;;; (psyntax.pp, which should be available whereever you found -;;; psyntax.ss), and register sc-expand as the current expander (how -;;; you do this depends upon your implementation of Scheme). You may -;;; change the hooks and constructors defined toward the beginning of -;;; the code below, but to avoid bootstrapping problems, do so only -;;; after you have a working version of the expander. - -;;; Chez Scheme allows the syntactic form (syntax