summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-03-27 20:42:45 -0700
committerKaz Kylheku <kaz@kylheku.com>2018-03-27 20:42:45 -0700
commitee5e854dad5c2e5cb25bd928cc633f13e660a31d (patch)
tree3a2f4c640631f5652af451a052ef13a08274435e
parent137ca989b8eb496e5e2237eaf200121e3529dd1f (diff)
downloadtxr-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.tl14
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)))))