From bdafd7d230b1b8baa9faf9366884591bf3782992 Mon Sep 17 00:00:00 2001 From: Nikodemus Siivola Date: Wed, 8 Jul 2009 12:55:11 +0000 Subject: [PATCH] 1.0.29.54.rc4: correct loading of first FP operand as inline constant * x86-64 only. --- src/compiler/x86-64/float.lisp | 2 +- tests/compiler.impure.lisp | 46 ++++++++++++++++++++++++++++++++++++++++ version.lisp-expr | 2 +- 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/compiler/x86-64/float.lisp b/src/compiler/x86-64/float.lisp index 40d6ade..999771b 100644 --- a/src/compiler/x86-64/float.lisp +++ b/src/compiler/x86-64/float.lisp @@ -394,7 +394,7 @@ (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))))) diff --git a/tests/compiler.impure.lisp b/tests/compiler.impure.lisp index a4bc1f4..55bbd0e 100644 --- a/tests/compiler.impure.lisp +++ b/tests/compiler.impure.lisp @@ -1099,6 +1099,52 @@ (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)))) ;;;; tests not in the problem domain, but of the consistency of the ;;;; compiler machinery itself diff --git a/version.lisp-expr b/version.lisp-expr index c69c38e..93629ef 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -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" -- 1.7.10.4