1.0.29.54.rc4: correct loading of first FP operand as inline constant
authorNikodemus Siivola <nikodemus@random-state.net>
Wed, 8 Jul 2009 12:55:11 +0000 (12:55 +0000)
committerNikodemus Siivola <nikodemus@random-state.net>
Wed, 8 Jul 2009 12:55:11 +0000 (12:55 +0000)
* x86-64 only.

src/compiler/x86-64/float.lisp
tests/compiler.impure.lisp
version.lisp-expr

index 40d6ade..999771b 100644 (file)
                    (inst ,opinst r y))
                   (t
                    (if (sc-is x ,constant-sc)
-                       (inst ,load-inst r (get-constant x))
+                       (inst ,load-inst tmp (get-constant x))
                        (move tmp x))
                    (inst ,opinst tmp y)
                    (move r tmp)))))
index a4bc1f4..55bbd0e 100644 (file)
                   (compile nil
                            `(lambda ()
                               (make-array 12 :initial-element 'a)))))))
+
+;;; This non-minimal test-case catches a nasty error when loading
+;;; inline constants.
+(deftype matrix ()
+  `(simple-array single-float (16)))
+(declaim (ftype (sb-int:sfunction (single-float single-float single-float single-float
+                                   single-float single-float single-float single-float
+                                   single-float single-float single-float single-float
+                                   single-float single-float single-float single-float)
+                                  matrix)
+                matrix)
+         (inline matrix))
+(defun matrix (m11 m12 m13 m14
+               m21 m22 m23 m24
+               m31 m32 m33 m34
+               m41 m42 m43 m44)
+  (make-array 16
+              :element-type 'single-float
+              :initial-contents (list m11 m21 m31 m41
+                                      m12 m22 m32 m42
+                                      m13 m23 m33 m43
+                                      m14 m24 m34 m44)))
+(declaim (ftype (sb-int:sfunction ((simple-array single-float (3)) single-float) matrix)
+                rotate-around-bad))
+(defun rotate-around (a radians)
+  (let ((c (cos radians))
+       (s (sin radians))
+        ;; The 1.0 here was misloaded on x86-64.
+       (g (- 1.0 (cos radians))))
+    (let* ((x (aref a 0))
+           (y (aref a 1))
+           (z (aref a 2))
+           (gxx (* g x x)) (gxy (* g x y)) (gxz (* g x z))
+           (gyy (* g y y)) (gyz (* g y z)) (gzz (* g z z)))
+      (matrix
+       (+ gxx c)        (- gxy (* s z))  (+ gxz (* s y)) 0.0
+       (+ gxy (* s z))  (+ gyy c)        (- gyz (* s x)) 0.0
+       (- gxz (* s y))  (+ gyz (* s x))  (+ gzz c)       0.0
+       0.0              0.0              0.0             1.0))))
+(with-test (:name :regression-1.0.29.54)
+  (assert (every #'=
+                 '(-1.0 0.0 0.0 0.0 0.0 -1.0 0.0 0.0 0.0 0.0 -1.0 0.0 0.0 0.0 0.0 1.0)
+                 (rotate-around
+                  (make-array 3 :element-type 'single-float) (coerce pi 'single-float))))
+  ;; Same bug manifests in COMPLEX-ATANH as well.
+  (assert (= (atanh #C(-0.7d0 1.1d0)) #C(-0.28715567731069275d0 0.9394245539093365d0))))
 \f
 ;;;; tests not in the problem domain, but of the consistency of the
 ;;;; compiler machinery itself
index c69c38e..93629ef 100644 (file)
@@ -17,4 +17,4 @@
 ;;; 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".)
-"1.0.29.54.rc3"
+"1.0.29.54.rc4"