Really really really really fix the ASH bug on MIPS
... really. Even for constant shifts.
+;;;; the VM definition arithmetic VOPs for MIPS
+;;;; This software is part of the SBCL system. See the README file for
+;;;; more information.
+;;;;
+;;;; This software is derived from the CMU CL system, which was
+;;;; written at Carnegie Mellon University and released into the
+;;;; public domain. The software is in the public domain and is
+;;;; provided with absolutely no warranty. See the COPYING and CREDITS
+;;;; files for more information.
\f
;;;; Unary operations.
\f
;;;; Unary operations.
(:results (result :scs (unsigned-reg)))
(:result-types unsigned-num)
(:generator 1
(:results (result :scs (unsigned-reg)))
(:result-types unsigned-num)
(:generator 1
- (cond ((< count 0)
- ;; It is a right shift.
- (inst srl result number (min (- count) 31)))
- ((> count 0)
- ;; It is a left shift.
- (inst sll result number (min count 31)))
- (t
- ;; Count=0? Shouldn't happen, but it's easy:
- (move result number)))))
+ (cond
+ ((< count -31) (move result zero-tn))
+ ((< count 0) (inst srl result number (min (- count) 31)))
+ ((> count 0) (inst sll result number (min count 31)))
+ (t (bug "identity ASH not transformed away")))))
(define-vop (fast-ash-c/signed=>signed)
(:policy :fast-safe)
(define-vop (fast-ash-c/signed=>signed)
(:policy :fast-safe)
(:results (result :scs (signed-reg)))
(:result-types signed-num)
(:generator 1
(:results (result :scs (signed-reg)))
(:result-types signed-num)
(:generator 1
- (cond ((< count 0)
- ;; It is a right shift.
- (inst sra result number (min (- count) 31)))
- ((> count 0)
- ;; It is a left shift.
- (inst sll result number (min count 31)))
- (t
- ;; Count=0? Shouldn't happen, but it's easy:
- (move result number)))))
+ (cond
+ ((< count 0) (inst sra result number (min (- count) 31)))
+ ((> count 0) (inst sll result number (min count 31)))
+ (t (bug "identity ASH not transformed away")))))
(define-vop (signed-byte-32-len)
(:translate integer-length)
(define-vop (signed-byte-32-len)
(:translate integer-length)
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)