From ee5e854dad5c2e5cb25bd928cc633f13e660a31d Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Tue, 27 Mar 2018 20:42:45 -0700 Subject: 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. --- share/txr/stdlib/compiler.tl | 14 +++++++------- 1 file 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))))) -- cgit v1.2.3