summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--share/txr/stdlib/optimize.tl9
1 files changed, 9 insertions, 0 deletions
diff --git a/share/txr/stdlib/optimize.tl b/share/txr/stdlib/optimize.tl
index 31702cb4..83abaa1e 100644
--- a/share/txr/stdlib/optimize.tl
+++ b/share/txr/stdlib/optimize.tl
@@ -318,6 +318,15 @@
(ifq @reg @creg
@(and @jjlabel @(not @jlabel))) . @nil)
^(ifq ,reg ,creg ,jjlabel))
+ ((@(require @jlabel (equal creg '(t 0)))
+ (if @reg
+ @(and @jjlabel @(not @jlabel))) . @jrest)
+ (let ((xbl (if jrest
+ bb.(cut-block [bb.hash jlabel] jrest jinsns)
+ bb.(next-block [bb.hash jlabel]))))
+ (if xbl
+ ^(ifq ,reg ,creg ,xbl.label)
+ insn)))
((@jlabel
(jmp @(and @jjlabel @(not @jlabel))) . @nil)
^(ifq ,reg ,creg ,jjlabel))