X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fsrctran.lisp;h=221eaf0f94d0805b45f1f331d3ee648e706c6a35;hb=74cf7a4d01664fbf72a662ba093ad67ca243b524;hp=7c7f8fda88183dea80357c0e00250ab33dcead61;hpb=69018386b391f17fb722a4ded00474be182db355;p=sbcl.git diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index 7c7f8fd..221eaf0 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -2771,8 +2771,13 @@ (defun %ash/right (integer amount) (ash integer (- amount))) - (deftransform ash ((integer amount) (sb!vm:signed-word (integer * 0))) + (deftransform ash ((integer amount)) "Convert ASH of signed word to %ASH/RIGHT" + (unless (and (csubtypep (lvar-type integer) ; do that ourselves to avoid + (specifier-type 'sb!vm:signed-word)) ; optimization + (csubtypep (lvar-type amount) ; notes. + (specifier-type '(integer * 0)))) + (give-up-ir1-transform)) (when (constant-lvar-p amount) (give-up-ir1-transform)) (let ((use (lvar-uses amount))) @@ -2789,8 +2794,13 @@ ,(1- sb!vm:n-word-bits) (- amount))))))) - (deftransform ash ((integer amount) (word (integer * 0))) + (deftransform ash ((integer amount)) "Convert ASH of word to %ASH/RIGHT" + (unless (and (csubtypep (lvar-type integer) + (specifier-type 'sb!vm:word)) + (csubtypep (lvar-type amount) + (specifier-type '(integer * 0)))) + (give-up-ir1-transform)) (when (constant-lvar-p amount) (give-up-ir1-transform)) (let ((use (lvar-uses amount))) @@ -4022,6 +4032,48 @@ `(values (the real ,arg0)) `(let ((minrest (min ,@rest))) (if (<= ,arg0 minrest) ,arg0 minrest))))) + +;;; Simplify some cross-type comparisons +(macrolet ((def (comparator round) + `(progn + (deftransform ,comparator + ((x y) (rational (constant-arg float))) + "open-code RATIONAL to FLOAT comparison" + (let ((y (lvar-value y))) + #-sb-xc-host + (when (or (float-nan-p y) + (float-infinity-p y)) + (give-up-ir1-transform)) + (setf y (rational y)) + `(,',comparator + x ,(if (csubtypep (lvar-type x) + (specifier-type 'integer)) + (,round y) + y)))) + (deftransform ,comparator + ((x y) (integer (constant-arg ratio))) + "open-code INTEGER to RATIO comparison" + `(,',comparator x ,(,round (lvar-value y))))))) + (def < ceiling) + (def > floor)) + +(deftransform = ((x y) (rational (constant-arg float))) + "open-code RATIONAL to FLOAT comparison" + (let ((y (lvar-value y))) + #-sb-xc-host + (when (or (float-nan-p y) + (float-infinity-p y)) + (give-up-ir1-transform)) + (setf y (rational y)) + (if (and (csubtypep (lvar-type x) + (specifier-type 'integer)) + (ratiop y)) + nil + `(= x ,y)))) + +(deftransform = ((x y) (integer (constant-arg ratio))) + "constant-fold INTEGER to RATIO comparison" + nil) ;;;; converting N-arg arithmetic functions ;;;;