Floating-point micro-optimizations
authorRaymond Toy <toy.raymond@gmail.com>
Sun, 19 Aug 2012 14:58:06 +0000 (07:58 -0700)
committerRaymond Toy <toy.raymond@gmail.com>
Sun, 19 Aug 2012 14:58:06 +0000 (07:58 -0700)
o Convert x/n to x*(1/n) when n is a power of two since 1/n has an
  exact representation.
o Convert 2*x to x+x.

src/compiler/float-tran.lisp

index 7a82135..d0a3703 100644 (file)
   (frob >)
   (frob =))
 
+;; Convert (/ x n) to (* x (/ n)) when x is a float and n is a power
+;; of two, because (/ n) can be reprsented exactly.
+(deftransform / ((x y) (float float) * :when :both)
+  (unless (constant-continuation-p y)
+    (give-up))
+  (let ((val (continuation-value y)))
+    (multiple-value-bind (frac exp sign)
+       (decode-float val)
+      (unless (= frac 0.5)
+       (give-up))
+      `(* x (float (/ ,val) x)))))
+
+;; Convert 2*x to x+x.
+(deftransform * ((x y) (float real) * :when :both)
+  (unless (constant-continuation-p y)
+    (give-up))
+  (let ((val (continuation-value y)))
+    (unless (= val 2)
+      (give-up))
+    '(+ x x)))
+
+             
 \f
 ;;;; Irrational transforms: