Enable signed modular arithmetic for LOGIOR
authorPaul Khuong <pvk@pvk.ca>
Fri, 7 Jun 2013 23:03:44 +0000 (19:03 -0400)
committerPaul Khuong <pvk@pvk.ca>
Sat, 8 Jun 2013 06:29:23 +0000 (02:29 -0400)
 When the result of a bitwise or is known to be negative, we don't
 need to compute the most significant bits (they're all ones).

NEWS
src/compiler/srctran.lisp

diff --git a/NEWS b/NEWS
index 1f805df..b23e3ee 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,8 @@ changes relative to sbcl-1.1.8:
     comparison, instead of two.
   * optimization: enable more modular arithmetic transforms in the presence of
     conditionals.
+  * optimization: bitwise OR forms can now trigger modular arithmetic as well,
+    when the result is known to be negative.
   * bug fix: problems with NCONC type derivation (reported by Jerry James).
   * bug fix: EXPT type derivation no longer constructs bogus floating-point
     types.  (reported by Vsevolod Dyomkin)
index 713a106..c1aa106 100644 (file)
               (cut-to-width x kind w t)
               nil                ; After fixing above, replace with T.
               )))))))
+
+(defoptimizer (logior optimizer) ((x y) node)
+  (let ((result-type (single-value-type (node-derived-type node))))
+    (multiple-value-bind (low high)
+        (integer-type-numeric-bounds result-type)
+      (when (and (numberp low)
+                 (numberp high)
+                 (<= high 0))
+        (let ((width (integer-length low)))
+          (multiple-value-bind (w kind)
+              (best-modular-version (1+ width) t)
+            (when w
+              ;; FIXME: see comment in LOGAND optimizer
+              (let ((xact (cut-to-width x kind w t))
+                    (yact (cut-to-width y kind w t)))
+                (declare (ignore xact yact))
+                nil) ; After fixing above, replace with T
+              )))))))
 \f
 ;;; miscellanous numeric transforms