+ #(#(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))