1.0.4.99: fix big-endian build
authorJuho Snellman <jsnell@iki.fi>
Wed, 18 Apr 2007 05:20:38 +0000 (05:20 +0000)
committerJuho Snellman <jsnell@iki.fi>
Wed, 18 Apr 2007 05:20:38 +0000 (05:20 +0000)
         * Reported by Harald Hanche-Olsen

src/code/array.lisp
version.lisp-expr

index 00444b0..4b01135 100644 (file)
@@ -341,22 +341,31 @@ of specialized arrays is supported."
                                      ;; is done implicitly via the widetag
                                      ;; dispatch.
                                      (safety 0)))
-                  #1=(funcall (the function
-                                (let ((tag 0))
-                                  ;; WIDETAG-OF needs extra code to
-                                  ;; handle LIST and FUNCTION
-                                  ;; lowtags. We're only dispatching
-                                  ;; on other pointers, so let's do
-                                  ;; the lowtag extraction manually.
-                                  (when (sb!vm::%other-pointer-p array)
-                                    (setf tag (sb!sys:sap-ref-8
-                                               (int-sap (get-lisp-obj-address array))
-                                               (- sb!vm:other-pointer-lowtag))))
-                                  ;; SYMBOL-GLOBAL-VALUE is a performance hack
-                                  ;; for threaded builds.
-                                  (svref (sb!vm::symbol-global-value ',table-name)
-                                         tag)))
-                                array index ,@extra-params))
+                  #1=(funcall
+                      (the function
+                        (let ((tag 0)
+                              (offset
+                               #.(ecase sb!c:*backend-byte-order*
+                                   (:little-endian
+                                    (- sb!vm:other-pointer-lowtag))
+                                   (:big-endian
+                                    ;; I'm not completely sure of what this
+                                    ;; 3 represents symbolically. It's
+                                    ;; just what all the LOAD-TYPE vops
+                                    ;; are doing.
+                                    (- 3 sb!vm:other-pointer-lowtag)))))
+                          ;; WIDETAG-OF needs extra code to handle
+                          ;; LIST and FUNCTION lowtags. We're only
+                          ;; dispatching on other pointers, so let's
+                          ;; do the lowtag extraction manually.
+                          (when (sb!vm::%other-pointer-p array)
+                            (setf tag
+                                  (sb!sys:sap-ref-8 (int-sap (get-lisp-obj-address array))
+                                                    offset)))
+                          ;; SYMBOL-GLOBAL-VALUE is a performance hack
+                          ;; for threaded builds.
+                          (svref (sb!vm::symbol-global-value ',table-name) tag)))
+                      array index ,@extra-params))
                 (defun ,slow-accessor-name (array index ,@extra-params)
                   (declare (optimize speed (safety 0)))
                   (if (not (%array-displaced-p array))
index 84dbe48..2878932 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.4.98"
+"1.0.4.99"