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 eba0775..1ea6a1c 100644 Binary files a/src/ikarus.boot and b/src/ikarus.boot differ diff --git a/src/ikarus.boot.back b/src/ikarus.boot.back new file mode 100644 index 0000000..ff79ab8 Binary files /dev/null and b/src/ikarus.boot.back differ diff --git a/src/libassembler-6.7.ss b/src/libassembler.ss similarity index 100% rename from src/libassembler-6.7.ss rename to src/libassembler.ss diff --git a/src/libcafe-6.1.ss b/src/libcafe.ss similarity index 100% rename from src/libcafe-6.1.ss rename to src/libcafe.ss diff --git a/src/libchezio-8.1.ss b/src/libchezio.ss similarity index 100% rename from src/libchezio-8.1.ss rename to src/libchezio.ss diff --git a/src/libcollect-6.1.ss b/src/libcollect.ss similarity index 100% rename from src/libcollect-6.1.ss rename to src/libcollect.ss diff --git a/src/libcompile-8.1.ss b/src/libcompile-8.1.ss deleted file mode 100644 index 984d346..0000000 --- a/src/libcompile-8.1.ss +++ /dev/null @@ -1,3771 +0,0 @@ - -;;; 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 (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