From: Nathan F. <nf...@us...> - 2007-01-27 03:46:03
|
Update of /cvsroot/sbcl/sbcl/src/code In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv12188/src/code Modified Files: bignum.lisp early-extensions.lisp Log Message: 1.0.2.1: DATA-VECTOR-{REF,SET}-WITH-OFFSET for the x86 Compile calls of (AREF FOO (+ INDEX <constant>) more efficiently: ... turn DATA-VECTOR-{REF,SET} into DATA-VECTOR-{REF,SET}-WITH-OFFSET when the element type of FOO is at least 8 bits wide; ... introduce general mechanism for optimization of such calls; ... redo the x86 DATA-VECTOR-FOO VOPs, reducing the number of such VOPs in the process; ... do the same for BIGNUM-REF and SAP-REF-FOO. Upshot: 5-10% increase in performance on array-heavy code such as Ironclad; a 20% increase in performance has been observed on cellular automata codes. Some restrictions apply; see the KLUDGE in src/compiler/generic/vm-tran for an example. Index: bignum.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/code/bignum.lisp,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- bignum.lisp 28 Jul 2006 01:08:41 -0000 1.23 +++ bignum.lisp 27 Jan 2007 03:45:49 -0000 1.24 @@ -2315,7 +2315,7 @@ ;;;; %FLOOR for machines with a 32x32 divider. -#!-sb-fluid +#!+(and 32x16-divide (not sb-fluid)) (declaim (inline 32x16-subtract-with-borrow 32x16-add-with-carry 32x16-divide 32x16-multiply 32x16-multiply-split)) Index: early-extensions.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/code/early-extensions.lisp,v retrieving revision 1.81 retrieving revision 1.82 diff -u -d -r1.81 -r1.82 --- early-extensions.lisp 5 Dec 2006 17:50:20 -0000 1.81 +++ early-extensions.lisp 27 Jan 2007 03:45:49 -0000 1.82 @@ -65,6 +65,30 @@ (* max-offset sb!vm:n-word-bytes)) scale))) +#!+x86 +(defun displacement-bounds (lowtag element-size data-offset) + (let* ((adjustment (- (* data-offset sb!vm:n-word-bytes) lowtag)) + (bytes-per-element (ceiling element-size sb!vm:n-byte-bits)) + (min (truncate (+ sb!vm::minimum-immediate-offset adjustment) + bytes-per-element)) + (max (truncate (+ sb!vm::maximum-immediate-offset adjustment) + bytes-per-element))) + (values min max))) + +#!+x86 +(def!type constant-displacement (lowtag element-size data-offset) + (flet ((integerify (x) + (etypecase x + (integer x) + (symbol (symbol-value x))))) + (let ((lowtag (integerify lowtag)) + (element-size (integerify element-size)) + (data-offset (integerify data-offset))) + (multiple-value-bind (min max) (displacement-bounds lowtag + element-size + data-offset) + `(integer ,min ,max))))) + ;;; Similar to FUNCTION, but the result type is "exactly" specified: ;;; if it is an object type, then the function returns exactly one ;;; value, if it is a short form of VALUES, then this short form |