From: Alastair Bridgewater Date: Thu, 2 Sep 2010 00:34:28 +0000 (+0000) Subject: 1.0.42.23: x86-64: Fix passing of unboxed complex float arguments. X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=829d76d5f12e1c1b6b21ca4c71b34719b8fed5e1;p=sbcl.git 1.0.42.23: x86-64: Fix passing of unboxed complex float arguments. * This has been broken since 1.0.27.14 (x86oid frame pointer bias). * The "move-arg" VOPs for complex floats required a different adjustment when being placed relative to the normal frame base pointer, due to the bias, than when being placed relative to other base pointers. Unfortunately, a new requirement was also added that restricted the appropriate registers for use as frame base pointers to one, and one which would not normally be selected, leading to "Unexpected offset" errors. * Removed the restriction. * The logic in EA-FOR-CXF-STACK is still broken: The frame bias is only applied when the frame pointer is RSP, which will never happen, and is not applied when the frame pointer is any other register. At the same time, so far as I can tell, the bias seems to be unneccessary. * Bug reported by sykopomp in #lispgames. --- diff --git a/src/compiler/x86-64/float.lisp b/src/compiler/x86-64/float.lisp index 583a7a4..601dabd 100644 --- a/src/compiler/x86-64/float.lisp +++ b/src/compiler/x86-64/float.lisp @@ -51,9 +51,7 @@ (+ (tn-offset ,tn) (cond ((= (tn-offset ,base) rsp-offset) sp->fp-offset) - ((= (tn-offset ,base) rbp-offset) - 0) - (t (error "Unexpected offset."))) + (t 0)) (ecase ,kind (:single (ecase ,slot diff --git a/tests/compiler.pure.lisp b/tests/compiler.pure.lisp index 118fce2..ff5d41b 100644 --- a/tests/compiler.pure.lisp +++ b/tests/compiler.pure.lisp @@ -3519,7 +3519,7 @@ (let ((iterator+976 #'iterator+976)) (funcall iterator+976)))))))) -(with-test (:name :complex-float-local-fun-args :fails-on :x86-64) +(with-test (:name :complex-float-local-fun-args) ;; As of 1.0.27.14, the lambda below failed to compile due to the ;; compiler attempting to pass unboxed complex floats to Z and the ;; MOVE-ARG method not expecting the register being used as a diff --git a/version.lisp-expr b/version.lisp-expr index c403779..f609b1b 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.42.22" +"1.0.42.23"