diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-03-27 20:42:45 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-03-27 20:42:45 -0700 |
commit | ee5e854dad5c2e5cb25bd928cc633f13e660a31d (patch) | |
tree | 3a2f4c640631f5652af451a052ef13a08274435e | |
parent | 137ca989b8eb496e5e2237eaf200121e3529dd1f (diff) | |
download | txr-ee5e854dad5c2e5cb25bd928cc633f13e660a31d.tar.gz txr-ee5e854dad5c2e5cb25bd928cc633f13e660a31d.tar.bz2 txr-ee5e854dad5c2e5cb25bd928cc633f13e660a31d.zip |
compiler: use counter instead of preallocating tregs.
* share/txr/stdlib/compiler.tl (compiler): new slot,
treg-cntr; slot nregs removed; tregs stack initialized to
empty list.
(compiler alloc-treg): Take from stack if possible,
otherwise create new treg using counter, up to 255.
(usr:compile-toplevel): Referenceco.treg-cntr for register
count, rather than removed co.nreg.
-rw-r--r-- | share/txr/stdlib/compiler.tl | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl index 8f64adca..fe75cd62 100644 --- a/share/txr/stdlib/compiler.tl +++ b/share/txr/stdlib/compiler.tl @@ -106,11 +106,12 @@ (< me.lev lev))))) (defstruct compiler nil + (treg-cntr 1) (dreg-cntr 0) (fidx-cntr 0) (nlev 2) (nreg 1) - (tregs (mapcar (op list t) (range 1 255))) + (tregs nil) (dreg (hash :eql-based)) (data (hash :eql-based)) (fidx (hash :eql-based)) @@ -140,11 +141,10 @@ (vec-list [mapcar me.ftab (range* 0 me.fidx-cntr)])) (defmeth compiler alloc-treg (me) - (let ((treg (pop me.tregs))) - (unless treg - (compile-error me.last-form "code too complex: out of registers")) - (set me.nreg (max me.nreg (succ (cadr treg)))) - treg)) + (cond + (me.tregs (pop me.tregs)) + ((< me.treg-cntr 256) ^(t ,(pinc me.treg-cntr))) + (t (compile-error me.last-form "code too complex: out of registers")))) (defmeth compiler free-treg (me treg) (when (and (eq t (car treg)) (neq 0 (cadr treg))) @@ -1251,4 +1251,4 @@ (release-deferred-warnings)))) (frag co.(compile oreg (new env co co) xexp))) as.(asm ^(,*frag.code (end ,frag.oreg))) - (vm-make-desc co.nlev co.nreg as.buf co.(get-datavec) co.(get-funvec))))) + (vm-make-desc co.nlev co.treg-cntr as.buf co.(get-datavec) co.(get-funvec))))) |