Changeset 15574


Ignore:
Timestamp:
Jan 9, 2013, 2:02:57 PM (6 years ago)
Author:
gb
Message:

TRANSFORM-REAL-N-ARY-COMPARISON: when transforming 3-arg comparisons,
reference the third arg in all cases.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/compiler/optimizers.lisp

    r15394 r15574  
    272272
    273273
    274 (defun transform-real-n-ary-comparision (whole binary-name)
     274(defun transform-real-n-ary-comparision (whole binary-name )
    275275  (destructuring-bind (n0 &optional (n1 0 n1-p) &rest more) (cdr whole)
    276276    (if more
    277       (if (cdr more)
     277      (if (or (cdr more))               ; punt for now
    278278        whole
    279279        (let* ((n2 (car more))
    280280               (n (gensym)))
    281           `(let* ((,n ,n0))
    282             (if (,binary-name ,n (setq ,n ,n1))
    283               (,binary-name ,n ,n2)))))
     281          (if (and (typep n0 'real) (typep n1 'real))
     282            (let* ((result (funcall binary-name n0 n1)))
     283              (if result
     284                `(,binary-name ,n1 ,n2)
     285                `(progn ,n2 nil)))
     286            `(let* ((,n ,n0))
     287              (if (,binary-name ,n (setq ,n ,n1))
     288                (,binary-name ,n ,n2)
     289                (progn ,n2 nil))))))
    284290      (if (not n1-p)
    285291        `(require-type ,n0 'real)
    286292        `(,binary-name ,n0 ,n1)))))
    287293
    288 
     294ç
    289295
    290296(define-compiler-macro < (&whole whole &rest ignore)
Note: See TracChangeset for help on using the changeset viewer.