[Wisp-cvs] wisp/tools worth,1.20,1.21
Status: Alpha
Brought to you by:
digg
From: <di...@us...> - 2002-08-31 14:29:25
|
Update of /cvsroot/wisp/wisp/tools In directory usw-pr-cvs1:/tmp/cvs-serv4879/tools Modified Files: worth Log Message: Implemented the beginnings of Worth's delay-optimization. Index: worth =================================================================== RCS file: /cvsroot/wisp/wisp/tools/worth,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- worth 26 Aug 2002 16:18:24 -0000 1.20 +++ worth 31 Aug 2002 14:29:22 -0000 1.21 @@ -15,7 +15,9 @@ (gimme syscalls) -(define builtin-words '(if else then begin until)) +(define builtin-words + '(< <= <> = > >= begin else if then u< u<= u> u>= until)) + (define macro-box (make-box '())) (define def-box (make-box #f)) (define known-procedure-box (make-box '())) @@ -152,30 +154,41 @@ (emit `(mov ,new ,old)) (set! (cdr (assq new regref#)) (cdr (assq old regref#))) (set! (cdr (assq old regref#)) 0) - (set! regstack - (map (lambda (object) - (if (eq? object old) - new - object)) - regstack))) - ((free-register reg) + (let (loop (tree regstack)) + (if (cons? tree) + (begin + (if (eq? (car tree) old) + (set! (car tree) new) + (loop (car tree))) + (if (eq? (cdr tree) old) + (set! (cdr tree) new) + (loop (cdr tree))))))) + ((get-regref reg) (my c (assq reg regref#) (if (not c) (raise 'cpu-register? reg)) - (if (zero? (cdr c)) - reg - (and (pick-register) -> subst - (begin - (reassign subst reg) - reg))))) + c)) + ((free-register reg) ; reg specifies the register to be freed + ; Returns the register or #f in case of failure + (if (zero? (cdr (get-regref reg))) + reg + (and (pick-register) -> subst + (begin + (reassign subst reg) + reg)))) ((pick-register (reg #f)) + ; reg may be either #f (meaning 'any register will + ; do'), a register, or a list of registers. + ; Returns the chosen register or #f in case of failure (cond ((not reg) (and (rassv 0 regref#) -> c (begin (incr! (cdr c)) (car c)))) - ((assq reg regref#) + ((cons? reg) + (any pick-register reg)) + ((get-regref reg) => (lambda (c) (if (zero? (cdr c)) (begin @@ -184,15 +197,19 @@ (and (free-register reg) (begin (incr! (cdr c)) - reg))))) - (else - (raise 'cpu-register? reg)))) + reg))))))) + ; In |use--| and |use++|, we intentionally ignore + ; those items that aren't registers. ((use-- reg) - (and (assq reg regref#) -> c - (decr! (cdr c)))) + (if (cons? reg) + (for-each use-- reg) + (and (assq reg regref#) -> c + (decr! (cdr c))))) ((use++ reg) - (and (assq reg regref#) -> c - (incr! (cdr c)))) + (if (cons? reg) + (for-each use++ reg) + (and (assq reg regref#) -> c + (incr! (cdr c))))) ((enstack) ; error if regstack is empty (my rrs (reverse regstack) (my item (car rrs) @@ -206,7 +223,7 @@ (emit `(push ,item)) (use-- item)) (reverse regstack)) - (set! regstack '())) + (set! regstack '())) ((stack>=! c) (while (< (length regstack) c) (my r (pick-register) @@ -222,16 +239,48 @@ (stack<=! c) (stack>=! c)) ((->register i (reg #f)) - (if reg (type cpu-register reg)) - (stack>=! i) + ; reg may be either #f (meaning 'any register will + ; do'), a register, or a list of registers. + ; Returns the chosen register or #f in case of failure (stack>=! (+ i 1)) (let (loop) (my object (list-ref regstack i) + (if (cons? object) ; need reducing? + (my sl (length regstack) ; for checking + (case (car object) operator + ((= <> < <= > >= u< u<= u> u>=) + (my word (cdr (assq operator + '((= . \=?v) + (<> . \<>?v) + (< . \<?v) + (<= . \<=?v) + (> . \>?v) + (>= . \>=?v) + (u< . \u<?v) + (u<= . \u<=?v) + (u> . \u>?v) + (u>= . \u>=?v)))) + (my (a b) (cdr object) + (cons! regstack a) + (use++ a) + (cons! regstack b) + (use++ b) + (process-word word #t) + (if (/= (length regstack) (+ sl 1)) + (raise 'improper word)) + (use-- object) + (set! object (car regstack)) + (cdr! regstack) + (set! (list-ref regstack i) object) + (if (cons? object) + (raise 'improper word)))))))) (cond ; has the desired situation been achieved already? ((and (cpu-register? object) (or (not reg) - (eq? object reg)))) + (if (cons? reg) + (memq object reg) + (eq? object reg))))) ; can we just allocate a suitable register? ((pick-register reg) => (lambda (r) @@ -244,6 +293,10 @@ (reassign r reg) (loop))) ((> (length regstack (+ i 1))) + (if (cons? (last regstack)) + ; We've run out of registers and the bottom + ; register is an expression. This is bad. + (raise 'deadlock regstack)) (enstack) ; push one item to the machine stack (loop)) ; and try again (else @@ -287,6 +340,14 @@ (add-string name word) (cons! regstack name) (cons! regstack (string-length word)))) + ((= <> < <= > >= u< u<= u> u>=) + ; make an expression + (stack>=! 2) + (my b (car regstack) + (cdr! regstack) + (my a (car regstack) + (cdr! regstack) + (cons! regstack (list word a b))))) ((if) (stack=! 1) (->register 0) (my l (gen-label) @@ -352,20 +413,19 @@ ((flush) (if (not (null? (cdr word))) (raise 'worth-word? word)) (flush)) - ((register) (cond - ((or (null? (cdr word)) - (null? (cddr word))) - (let (loop) - (my r (pick-register - (and (cons? (cdr word)) - (cadr word))) - (if r - (cons! regstack r) - (begin - (enstack) - (loop)))))) - (else - (raise 'worth-word? word)))) + ((register) (let (loop) + (my r (pick-register + (and (cons? (cdr word)) + (cdr word))) + (if r + (cons! regstack r) + (begin + (if (cons? (last regstack)) + ; We've run out of registers and the bottom + ; register is an expression. This is bad. + (raise 'deadlock regstack)) + (enstack) + (loop)))))) ((copy) (if (not (and (cons? (cdr word)) (null? (cddr word)))) (raise 'worth-word? word)) @@ -375,9 +435,10 @@ (raise 'worth-word? word)) (delete (second word))) ((->reg) (case (length word) + ((1) (raise 'worth-word? word)) ((2) (->register (second word))) ((3) (->register (second word) - (third word))) + (cddr word))) (else (raise 'worth-word? word)))) ((->ureg) (if (not (and (cons? (cdr word)) (null? (cddr word)))) |