(values nil t t)))
(defun logand-derive-type-aux (x y &optional same-leaf)
- (declare (ignore same-leaf))
+ (when same-leaf
+ (return-from logand-derive-type-aux x))
(multiple-value-bind (x-len x-pos x-neg) (integer-type-length x)
(declare (ignore x-pos))
(multiple-value-bind (y-len y-pos y-neg) (integer-type-length y)
(specifier-type 'integer)))))))
(defun logior-derive-type-aux (x y &optional same-leaf)
- (declare (ignore same-leaf))
+ (when same-leaf
+ (return-from logior-derive-type-aux x))
(multiple-value-bind (x-len x-pos x-neg) (integer-type-length x)
(multiple-value-bind (y-len y-pos y-neg) (integer-type-length y)
(cond
(specifier-type 'integer))))))))
(defun logxor-derive-type-aux (x y &optional same-leaf)
- (declare (ignore same-leaf))
+ (when same-leaf
+ (return-from logxor-derive-type-aux (specifier-type '(eql 0))))
(multiple-value-bind (x-len x-pos x-neg) (integer-type-length x)
(multiple-value-bind (y-len y-pos y-neg) (integer-type-length y)
(cond
(defoptimizer (logeqv derive-type) ((x y))
(two-arg-derive-type x y (lambda (x y same-leaf)
(lognot-derive-type-aux
- (logxor-derive-type-aux x y same-leaf)))
+ (logxor-derive-type-aux x y same-leaf)))
#'logeqv))
(defoptimizer (lognand derive-type) ((x y))
(two-arg-derive-type x y (lambda (x y same-leaf)
(lognot-derive-type-aux
(logior-derive-type-aux x y same-leaf)))
#'lognor))
+;;; FIXME: use SAME-LEAF instead of ignoring it.
(defoptimizer (logandc1 derive-type) ((x y))
(two-arg-derive-type x y (lambda (x y same-leaf)
- (logand-derive-type-aux
- (lognot-derive-type-aux x) y nil))
+ (if same-leaf
+ (specifier-type '(eql 0))
+ (logand-derive-type-aux
+ (lognot-derive-type-aux x) y nil)))
#'logandc1))
(defoptimizer (logandc2 derive-type) ((x y))
(two-arg-derive-type x y (lambda (x y same-leaf)
- (logand-derive-type-aux
- x (lognot-derive-type-aux y) nil))
+ (if same-leaf
+ (specifier-type '(eql 0))
+ (logand-derive-type-aux
+ x (lognot-derive-type-aux y) nil)))
#'logandc2))
(defoptimizer (logorc1 derive-type) ((x y))
(two-arg-derive-type x y (lambda (x y same-leaf)
- (logior-derive-type-aux
- (lognot-derive-type-aux x) y nil))
+ (if same-leaf
+ (specifier-type '(eql -1))
+ (logior-derive-type-aux
+ (lognot-derive-type-aux x) y nil)))
#'logorc1))
(defoptimizer (logorc2 derive-type) ((x y))
(two-arg-derive-type x y (lambda (x y same-leaf)
- (logior-derive-type-aux
- x (lognot-derive-type-aux y) nil))
+ (if same-leaf
+ (specifier-type '(eql -1))
+ (logior-derive-type-aux
+ x (lognot-derive-type-aux y) nil)))
#'logorc2))
\f
;;;; miscellaneous derive-type methods
(cut-node (node &aux did-something)
(when (and (not (block-delete-p (node-block node)))
(combination-p node)
- (fun-info-p (basic-combination-kind node)))
+ (eq (basic-combination-kind node) :known))
(let* ((fun-ref (lvar-use (combination-fun node)))
(fun-name (leaf-source-name (ref-leaf fun-ref)))
(modular-fun (find-modular-version fun-name width)))
(if (null rest)
`(values (the real ,arg0))
`(let ((maxrest (max ,@rest)))
- (if (> ,arg0 maxrest) ,arg0 maxrest)))))
+ (if (>= ,arg0 maxrest) ,arg0 maxrest)))))
(define-source-transform min (arg0 &rest rest)
(once-only ((arg0 arg0))
(if (null rest)
`(values (the real ,arg0))
`(let ((minrest (min ,@rest)))
- (if (< ,arg0 minrest) ,arg0 minrest)))))
+ (if (<= ,arg0 minrest) ,arg0 minrest)))))
\f
;;;; converting N-arg arithmetic functions
;;;;
(t
*universal-type*)))))
+;;; Like CMU CL, we use HEAPSORT. However, other than that, this code
+;;; isn't really related to the CMU CL code, since instead of trying
+;;; to generalize the CMU CL code to allow START and END values, this
+;;; code has been written from scratch following Chapter 7 of
+;;; _Introduction to Algorithms_ by Corman, Rivest, and Shamir.
(define-source-transform sb!impl::sort-vector (vector start end predicate key)
+ ;; Like CMU CL, we use HEAPSORT. However, other than that, this code
+ ;; isn't really related to the CMU CL code, since instead of trying
+ ;; to generalize the CMU CL code to allow START and END values, this
+ ;; code has been written from scratch following Chapter 7 of
+ ;; _Introduction to Algorithms_ by Corman, Rivest, and Shamir.
`(macrolet ((%index (x) `(truly-the index ,x))
(%parent (i) `(ash ,i -1))
(%left (i) `(%index (ash ,i 1)))
(%elt largest) i-elt
i largest)))))))))
(%sort-vector (keyfun &optional (vtype 'vector))
- `(macrolet (;; KLUDGE: In SBCL ca. 0.6.10, I had trouble getting
- ;; type inference to propagate all the way
- ;; through this tangled mess of
- ;; inlining. The TRULY-THE here works
- ;; around that. -- WHN
+ `(macrolet (;; KLUDGE: In SBCL ca. 0.6.10, I had
+ ;; trouble getting type inference to
+ ;; propagate all the way through this
+ ;; tangled mess of inlining. The TRULY-THE
+ ;; here works around that. -- WHN
(%elt (i)
`(aref (truly-the ,',vtype ,',',vector)
(%index (+ (%index ,i) start-1)))))
- (let ((start-1 (1- ,',start)) ; Heaps prefer 1-based addressing.
+ (let (;; Heaps prefer 1-based addressing.
+ (start-1 (1- ,',start))
(current-heap-size (- ,',end ,',start))
(keyfun ,keyfun))
(declare (type (integer -1 #.(1- most-positive-fixnum))