-;;;
-;;; FIXME: Why should constant argument be second? It would be nice to
-;;; find out and explain.
-#+sb-xc-host ; (See CROSS-FLOAT-INFINITY-KLUDGE.)
-(defun ir1-transform-< (x y first second inverse)
- (if (same-leaf-ref-p x y)
- nil
- (let* ((x-type (numeric-type-or-lose x))
- (x-lo (numeric-type-low x-type))
- (x-hi (numeric-type-high x-type))
- (y-type (numeric-type-or-lose y))
- (y-lo (numeric-type-low y-type))
- (y-hi (numeric-type-high y-type)))
- (cond ((and x-hi y-lo (< x-hi y-lo))
- t)
- ((and y-hi x-lo (>= x-lo y-hi))
- nil)
- ((and (constant-lvar-p first)
- (not (constant-lvar-p second)))
- `(,inverse y x))
- (t
- (give-up-ir1-transform))))))
-#-sb-xc-host ; (See CROSS-FLOAT-INFINITY-KLUDGE.)
-(defun ir1-transform-< (x y first second inverse)
- (if (same-leaf-ref-p x y)
- nil
- (let ((xi (numeric-type->interval (numeric-type-or-lose x)))
- (yi (numeric-type->interval (numeric-type-or-lose y))))
- (cond ((interval-< xi yi)
- t)
- ((interval->= xi yi)
- nil)
- ((and (constant-lvar-p first)
- (not (constant-lvar-p second)))
- `(,inverse y x))
- (t
- (give-up-ir1-transform))))))
-
-(deftransform < ((x y) (integer integer) *)
- (ir1-transform-< x y x y '>))
-
-(deftransform > ((x y) (integer integer) *)
- (ir1-transform-< y x x y '<))
-
-#-sb-xc-host ; (See CROSS-FLOAT-INFINITY-KLUDGE.)
-(deftransform < ((x y) (float float) *)
- (ir1-transform-< x y x y '>))
-
-#-sb-xc-host ; (See CROSS-FLOAT-INFINITY-KLUDGE.)
-(deftransform > ((x y) (float float) *)
- (ir1-transform-< y x x y '<))
+(macrolet ((def (name reflexive-p surely-true surely-false)
+ `(deftransform ,name ((x y))
+ (if (same-leaf-ref-p x y)
+ ,reflexive-p
+ (let ((x (or (type-approximate-interval (lvar-type x))
+ (give-up-ir1-transform)))
+ (y (or (type-approximate-interval (lvar-type y))
+ (give-up-ir1-transform))))
+ (cond (,surely-true
+ t)
+ (,surely-false
+ nil)
+ ((and (constant-lvar-p x)
+ (not (constant-lvar-p y)))
+ `(,',name y x))
+ (t
+ (give-up-ir1-transform))))))))
+ (def < nil (interval-< x y) (interval->= x y))
+ (def > nil (interval-< y x) (interval->= y x))
+ (def <= t (interval->= y x) (interval-< y x))
+ (def >= t (interval->= x y) (interval-< x y)))