summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-03-20 06:30:57 -0700
committerKaz Kylheku <kaz@kylheku.com>2018-03-20 06:30:57 -0700
commit46041496359dc5738c467815d4868549d3550e40 (patch)
tree404c9056b36d7832e8746aa67a08d87e0a2d2fe6
parent46c773ac117c9d2502160b929c87d1611c65c718 (diff)
downloadtxr-46041496359dc5738c467815d4868549d3550e40.tar.gz
txr-46041496359dc5738c467815d4868549d3550e40.tar.bz2
txr-46041496359dc5738c467815d4868549d3550e40.zip
compiler: factor recurring conditional mov.
Anyway, this kind of thing should really be (and will be) taken care of peephole optimization. But for now, it's nice to get somewhat better code without doing too much work. * share/txr/stdlib/compiler.tl (compiler comp-setq, compiler comp-cond, compiler cond-if, compiler cond-let, compiler comp-lambda, compiler comp-for): Replace occurrences of (if (nequal reg1 reg2) ^((mov ,reg ,reg2))) with call to maybe-mov. (maybe-mov): New function.
-rw-r--r--share/txr/stdlib/compiler.tl48
1 files changed, 19 insertions, 29 deletions
diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl
index b74d2b84..33f02a2c 100644
--- a/share/txr/stdlib/compiler.tl
+++ b/share/txr/stdlib/compiler.tl
@@ -193,8 +193,7 @@
(new (frag vloc
^(,*vfrag.code
,*(if bind
- (if (nequal vfrag.oreg vloc)
- ^((mov ,vloc ,vfrag.oreg)))
+ (maybe-mov vfrag.oreg vloc)
^((setv ,vloc ,vfrag.oreg))))
(uni (list sym) vfrag.fvars)
vfrag.ffuns)))))
@@ -207,15 +206,13 @@
((and (eq test t) (null forms))
(let ((dreg me.(get-dreg t)))
(new (frag oreg
- ^(,*(if (nequal oreg dreg)
- ^((mov ,oreg ,dreg)))
+ ^(,*(maybe-mov oreg dreg)
(jmp ,lout))))))
((eq test t)
(let ((ffrag me.(comp-progn oreg env forms)))
(new (frag oreg
^(,*ffrag.code
- ,*(if (nequal oreg ffrag.oreg)
- ^((mov ,oreg ,ffrag.oreg)))
+ ,*(maybe-mov oreg ffrag.oreg)
(jmp ,lout))
ffrag.fvars
ffrag.ffuns))))
@@ -226,8 +223,7 @@
^(,*tfrag.code
,*(if (neq (car tfrag.oreg) 'd)
^((if ,tfrag.oreg ,lskip)))
- ,*(if (nequal oreg tfrag.oreg)
- ^((mov ,oreg ,tfrag.oreg)))
+ ,*(maybe-mov oreg tfrag.oreg)
(jmp ,lout)
,lskip)
tfrag.fvars
@@ -240,8 +236,7 @@
,*(if (neq (car tfrag.oreg) 'd)
^((if ,tfrag.oreg ,lskip)))
,*ffrag.code
- ,*(if (nequal oreg ffrag.oreg)
- ^((mov ,oreg ,ffrag.oreg)))
+ ,*(maybe-mov oreg ffrag.oreg)
(jmp ,lout)
,lskip)
(uni tfrag.fvars ffrag.fvars)
@@ -266,16 +261,13 @@
^(,*te-frag.code
(if ,te-frag.oreg ,lelse)
,*th-frag.code
- ,*(if (nequal oreg th-frag.oreg)
- ^((mov ,oreg ,th-frag.oreg)))
+ ,*(maybe-mov oreg th-frag.oreg)
(jmp ,lskip)
,lelse
,*el-frag.code
- ,*(if (nequal oreg el-frag.oreg)
- ^((mov ,oreg ,el-frag.oreg)))
+ ,*(maybe-mov oreg el-frag.oreg)
,lskip
- ,*(if (nequal te-oreg te-frag.oreg)
- ^((mov ,te-oreg ,te-frag.oreg))))
+ ,*(maybe-mov te-oreg te-frag.oreg))
(uni te-frag.fvars (uni th-frag.fvars el-frag.fvars))
(uni te-frag.ffuns (uni th-frag.ffuns el-frag.ffuns))))))
((op test then)
@@ -284,12 +276,10 @@
(th-frag me.(compile oreg env then)))
(new (frag oreg
^(,*te-frag.code
- ,*(if (nequal oreg te-frag.oreg)
- ^((mov ,oreg ,te-frag.oreg)))
+ ,*(maybe-mov oreg te-frag.oreg)
(if ,oreg ,lskip)
,*th-frag.code
- ,*(if (nequal oreg th-frag.oreg)
- ^((mov ,oreg ,th-frag.oreg)))
+ ,*(maybe-mov oreg th-frag.oreg)
,lskip)
(uni te-frag.fvars th-frag.fvars)
(uni te-frag.ffuns th-frag.ffuns)))))
@@ -348,17 +338,15 @@
(if seq nenv.(extend-var sym))
nenv.(lookup-var sym)))
(frag me.(compile bind.loc fenv form)))
- (pend frag.code)
- (if (nequal bind.loc frag.oreg)
- (add ^(mov ,bind.loc ,frag.oreg)))
+ (pend frag.code
+ (maybe-mov bind.loc frag.oreg))
(set ffuns (uni ffuns frag.ffuns)
fvars (uni fvars frag.fvars)))))))))
(bfrag me.(comp-progn oreg nenv body))
(boreg (if env.(out-of-scope bfrag.oreg) oreg bfrag.oreg)))
(new (frag oreg
(append code bfrag.code
- (if (nequal boreg bfrag.oreg)
- ^((mov ,boreg ,bfrag.oreg)))
+ (maybe-mov boreg bfrag.oreg)
^((end ,boreg)))
(uni (diff bfrag.fvars lexsyms) fvars)
(uni ffuns bfrag.ffuns)))))))
@@ -414,8 +402,7 @@
,*(if have-sym
^((mov ,have-bind.loc nil)))
,*ifrg.code
- ,*(if (nequal vbind.loc ifrg.oreg)
- ^((mov ,vbind.loc ,ifrg.oreg)))
+ ,*(maybe-mov vbind.loc ifrg.oreg)
,lskip)))))
(benv (if specials (new env up nenv co me) nenv))
(btreg me.(alloc-treg))
@@ -445,8 +432,7 @@
,*bfrag.code
,*(if specials
^((end ,boreg)))
- ,*(if (nequal boreg bfrag.oreg)
- ^((mov ,boreg ,bfrag.oreg)))
+ ,*(maybe-mov boreg bfrag.oreg)
(end ,boreg)
,lskip)
(uni [reduce-left uni ifrags nil .fvars]
@@ -526,6 +512,10 @@
[reduce-left uni frags nil .fvars]
[reduce-left uni frags nil .ffuns])))))
+(defun maybe-mov (to-reg from-reg)
+ (if (nequal to-reg from-reg)
+ ^((mov ,to-reg ,from-reg))))
+
(defun expand-quasi-mods (obj mods : form)
(let (plist num sep rng-ix scalar-ix-p flex gens)
(flet ((get-sym (exp)