X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fprint.lisp;h=3aaaf74cc7a27268e9062dc93587a89ceb30d71c;hb=11aa29a68039d6fb3cf41d67352a6b263b1094b6;hp=43f379f31c0bd5223b9e082b5d888ae30047b615;hpb=628c9c353690b012965ccd74d68e1b81e4a2a368;p=sbcl.git diff --git a/src/code/print.lisp b/src/code/print.lisp index 43f379f..3aaaf74 100644 --- a/src/code/print.lisp +++ b/src/code/print.lisp @@ -524,6 +524,9 @@ variable: an unreadable object representing the error is printed instead.") (output-code-component object stream)) (fdefn (output-fdefn object stream)) + #!+sb-simd-pack + (simd-pack + (output-simd-pack object stream)) (t (output-random object stream)))) @@ -584,7 +587,8 @@ variable: an unreadable object representing the error is printed instead.") (defun output-symbol (object stream) (if (or *print-escape* *print-readably*) (let ((package (symbol-package object)) - (name (symbol-name object))) + (name (symbol-name object)) + (current (sane-package))) (cond ;; The ANSI spec "22.1.3.3.1 Package Prefixes for Symbols" ;; requires that keywords be printed with preceding colons @@ -593,19 +597,24 @@ variable: an unreadable object representing the error is printed instead.") (write-char #\: stream)) ;; Otherwise, if the symbol's home package is the current ;; one, then a prefix is never necessary. - ((eq package (sane-package))) + ((eq package current)) ;; Uninterned symbols print with a leading #:. ((null package) (when (or *print-gensym* *print-readably*) (write-string "#:" stream))) (t (multiple-value-bind (symbol accessible) - (find-symbol name (sane-package)) + (find-symbol name current) ;; If we can find the symbol by looking it up, it need not ;; be qualified. This can happen if the symbol has been ;; inherited from a package other than its home package. + ;; + ;; To preserve print-read consistency, use the local nickname if + ;; one exists. (unless (and accessible (eq symbol object)) - (output-symbol-name (package-name package) stream) + (let ((prefix (or (car (rassoc package (package-%local-nicknames current))) + (package-name package)))) + (output-symbol-name prefix stream)) (multiple-value-bind (symbol externalp) (find-external-symbol name package) (declare (ignore symbol)) @@ -1769,6 +1778,58 @@ variable: an unreadable object representing the error is printed instead.") (print-unreadable-object (fdefn stream) (write-string "FDEFINITION object for " stream) (output-object (fdefn-name fdefn) stream))) + +#!+sb-simd-pack +(defun output-simd-pack (pack stream) + (declare (type simd-pack pack)) + (cond ((and *print-readably* *read-eval*) + (etypecase pack + ((simd-pack double-float) + (multiple-value-call #'format stream + "#.(~S ~S ~S)" + '%make-simd-pack-double + (%simd-pack-doubles pack))) + ((simd-pack single-float) + (multiple-value-call #'format stream + "#.(~S ~S ~S ~S ~S)" + '%make-simd-pack-single + (%simd-pack-singles pack))) + (t + (multiple-value-call #'format stream + "#.(~S #X~16,'0X #X~16,'0X)" + '%make-simd-pack-ub64 + (%simd-pack-ub64s pack))))) + (t + (print-unreadable-object (pack stream) + (flet ((all-ones-p (value start end &aux (mask (- (ash 1 end) (ash 1 start)))) + (= (logand value mask) mask)) + (split-num (value start) + (loop + for i from 0 to 3 + and v = (ash value (- start)) then (ash v -8) + collect (logand v #xFF)))) + (multiple-value-bind (low high) + (%simd-pack-ub64s pack) + (etypecase pack + ((simd-pack double-float) + (multiple-value-bind (v0 v1) (%simd-pack-doubles pack) + (format stream "~S~@{ ~:[~,13E~;~*TRUE~]~}" + 'simd-pack + (all-ones-p low 0 64) v0 + (all-ones-p high 0 64) v1))) + ((simd-pack single-float) + (multiple-value-bind (v0 v1 v2 v3) (%simd-pack-singles pack) + (format stream "~S~@{ ~:[~,7E~;~*TRUE~]~}" + 'simd-pack + (all-ones-p low 0 32) v0 + (all-ones-p low 32 64) v1 + (all-ones-p high 0 32) v2 + (all-ones-p high 32 64) v3))) + (t + (format stream "~S~@{ ~{ ~2,'0X~}~}" + 'simd-pack + (split-num low 0) (split-num low 32) + (split-num high 0) (split-num high 32)))))))))) ;;;; functions