;;;; While most of SBCL is derived from the CMU CL system, the test
;;;; files (like this one) were written from scratch after the fork
;;;; from CMU CL.
-;;;;
+;;;;
;;;; This software is in the public domain and is provided with
;;;; absolutely no warranty. See the COPYING and CREDITS files for
;;;; more information.
;;; e.g. someone inadvertently ports the bad code.
(defun point39 (x y)
(make-array 2
- :element-type 'double-float
+ :element-type 'double-float
:initial-contents (list x y)))
(declaim (inline point39-x point39-y))
(declare (type (simple-array double-float (2)) p))
(aref p 1))
(defun order39 (points)
- (sort points #'(lambda (p1 p2)
- (let* ((y1 (point39-y p1))
- (y2 (point39-y p2)))
- (if (= y1 y2)
- (< (point39-x p1)
- (point39-x p2))
- (< y1 y2))))))
+ (sort points (lambda (p1 p2)
+ (let* ((y1 (point39-y p1))
+ (y2 (point39-y p2)))
+ (if (= y1 y2)
+ (< (point39-x p1)
+ (point39-x p2))
+ (< y1 y2))))))
(defun test39 ()
(order39 (make-array 4
- :initial-contents (list (point39 0.0d0 0.0d0)
- (point39 1.0d0 1.0d0)
- (point39 2.0d0 2.0d0)
- (point39 3.0d0 3.0d0)))))
+ :initial-contents (list (point39 0.0d0 0.0d0)
+ (point39 1.0d0 1.0d0)
+ (point39 2.0d0 2.0d0)
+ (point39 3.0d0 3.0d0)))))
(assert (equalp (test39)
- #(#(0.0d0 0.0d0)
- #(1.0d0 1.0d0)
- #(2.0d0 2.0d0)
- #(3.0d0 3.0d0))))
+ #(#(0.0d0 0.0d0)
+ #(1.0d0 1.0d0)
+ #(2.0d0 2.0d0)
+ #(3.0d0 3.0d0))))
+
+(defun complex-double-float-ppc (x y)
+ (declare (type (complex double-float) x y))
+ (declare (optimize speed))
+ (+ x y))
+(compile 'complex-double-float-ppc)
+(assert (= (complex-double-float-ppc #c(0.0d0 1.0d0) #c(2.0d0 3.0d0))
+ #c(2.0d0 4.0d0)))
+
+(defun single-float-ppc (x)
+ (declare (type (signed-byte 32) x) (optimize speed))
+ (float x 1f0))
+(compile 'single-float-ppc)
+(assert (= (single-float-ppc -30) -30f0))
+
+;;; constant-folding irrational functions
+(declaim (inline df))
+(defun df (x)
+ ;; do not remove the ECASE here: the bug this checks for indeed
+ ;; depended on this configuration
+ (ecase x (1 least-positive-double-float)))
+(macrolet ((test (fun)
+ (let ((name (intern (format nil "TEST-CONSTANT-~A" fun))))
+ `(progn
+ (defun ,name () (,fun (df 1)))
+ (,name)))))
+ (test sqrt)
+ (test log)
+ (test sin)
+ (test cos)
+ (test tan)
+ (test asin)
+ (test acos)
+ (test atan)
+ (test sinh)
+ (test cosh)
+ (test tanh)
+ (test asinh)
+ (test acosh)
+ (test atanh)
+ (test exp))
+
+;;; Broken move-arg-double-float for non-rsp frame pointers on x86-64
+(defun test (y)
+ (declare (optimize speed))
+ (multiple-value-bind (x)
+ (labels ((aux (x)
+ (declare (double-float x))
+ (etypecase y
+ (double-float
+ nil)
+ (fixnum
+ (aux x))
+ (complex
+ (format t "y=~s~%" y)))
+ (values x)))
+ (aux 2.0d0))
+ x))
+
+(assert (= (test 1.0d0) 2.0d0))
-;;; success
-(quit :unix-status 104)
+(deftype myarraytype (&optional (length '*))
+ `(simple-array double-float (,length)))
+(defun new-pu-label-from-pu-labels (array)
+ (setf (aref (the myarraytype array) 0)
+ sb-ext:double-float-positive-infinity))