#'%unary-truncate-derive-type-aux
#'%unary-truncate))
+(defoptimizer (%unary-ftruncate derive-type) ((number))
+ (let ((divisor (specifier-type '(integer 1 1))))
+ (one-arg-derive-type number
+ #'(lambda (n)
+ (ftruncate-derive-type-quot-aux n divisor nil))
+ #'%unary-ftruncate)))
+
;;; Define optimizers for FLOOR and CEILING.
(macrolet
((def (name q-name r-name)
(let* ((y (lvar-value y))
(y-abs (abs y))
(len (1- (integer-length y-abs))))
- (unless (= y-abs (ash 1 len))
+ (unless (and (> y-abs 0) (= y-abs (ash 1 len)))
(give-up-ir1-transform))
(if (minusp y)
`(- (ash x ,len))
(let* ((y (lvar-value y))
(y-abs (abs y))
(len (1- (integer-length y-abs))))
- (unless (= y-abs (ash 1 len))
+ (unless (and (> y-abs 0) (= y-abs (ash 1 len)))
(give-up-ir1-transform))
(let ((shift (- len))
(mask (1- y-abs))
(let* ((y (lvar-value y))
(y-abs (abs y))
(len (1- (integer-length y-abs))))
- (unless (= y-abs (ash 1 len))
+ (unless (and (> y-abs 0) (= y-abs (ash 1 len)))
(give-up-ir1-transform))
(let ((mask (1- y-abs)))
(if (minusp y)
(let* ((y (lvar-value y))
(y-abs (abs y))
(len (1- (integer-length y-abs))))
- (unless (= y-abs (ash 1 len))
+ (unless (and (> y-abs 0) (= y-abs (ash 1 len)))
(give-up-ir1-transform))
(let* ((shift (- len))
(mask (1- y-abs)))
(let* ((y (lvar-value y))
(y-abs (abs y))
(len (1- (integer-length y-abs))))
- (unless (= y-abs (ash 1 len))
+ (unless (and (> y-abs 0) (= y-abs (ash 1 len)))
(give-up-ir1-transform))
(let ((mask (1- y-abs)))
`(if (minusp x)