1.0.41.37: ppc: allocation fixes for threaded builds.
[sbcl.git] / src / compiler / ppc / macros.lisp
index 8b70474..7921078 100644 (file)
                         (ash ,',offset word-shift)
                         (- other-pointer-lowtag))))))))
   (frob value)
-  (frob function))
+  (frob function)
+
+  ;; FIXME: These are only good for static-symbols, so why not
+  ;; statically-allocate the static-symbol TLS slot indices at
+  ;; cross-compile time so we can just use a fixed offset within the
+  ;; TLS block instead of mucking about with the extra memory access
+  ;; (and temp register, for stores)?
+  #!+sb-thread
+  (defmacro load-tl-symbol-value (reg symbol)
+    `(progn
+       (inst lwz ,reg null-tn
+             (+ (static-symbol-offset ',symbol)
+                (ash symbol-tls-index-slot word-shift)
+                (- other-pointer-lowtag)))
+       (inst lwzx ,reg thread-base-tn ,reg)))
+  #!-sb-thread
+  (defmacro load-tl-symbol-value (reg symbol)
+    `(load-symbol-value ,reg ,symbol))
+
+  #!+sb-thread
+  (defmacro store-tl-symbol-value (reg symbol temp)
+    `(progn
+       (inst lwz ,temp null-tn
+             (+ (static-symbol-offset ',symbol)
+                (ash symbol-tls-index-slot word-shift)
+                (- other-pointer-lowtag)))
+       (inst stwx ,reg thread-base-tn ,temp)))
+  #!-sb-thread
+  (defmacro store-tl-symbol-value (reg symbol temp)
+    (declare (ignore temp))
+    `(store-symbol-value ,reg ,symbol)))
 
 (defmacro load-type (target source &optional (offset 0))
   "Loads the type bits of a pointer into target independent of
                (t
                 (move ,temp-tn ,size)))
 
+         #!-sb-thread
          (inst lr ,flag-tn (make-fixup "boxed_region" :foreign))
+         #!-sb-thread
          (inst lwz ,result-tn ,flag-tn 0)
+         #!+sb-thread
+         (inst lwz ,result-tn thread-base-tn (* thread-alloc-region-slot
+                                                n-word-bytes))
 
          ;; we can optimize this to only use one fixup here, once we get
          ;; it working
          ;; (inst lr ,flag-tn (make-fixup "boxed_region" :foreign 4))
          ;; (inst lwz ,flag-tn ,flag-tn 0)
+         #!-sb-thread
          (inst lwz ,flag-tn ,flag-tn 4)
+         #!+sb-thread
+         (inst lwz ,flag-tn thread-base-tn (* (1+ thread-alloc-region-slot)
+                                              n-word-bytes))
 
          (without-scheduling ()
            ;; CAUTION: The C code depends on the exact order of
          (inst b ,fix-addr)
 
          (emit-label ,inline-alloc)
+         #!-sb-thread
          (inst lr ,flag-tn (make-fixup "boxed_region" :foreign))
+         #!-sb-thread
          (inst stw ,result-tn ,flag-tn 0)
+         #!+sb-thread
+         (inst stw ,result-tn thread-base-tn (* thread-alloc-region-slot
+                                                n-word-bytes))
 
          (emit-label ,fix-addr)
          ;; At this point, result-tn points at the end of the object.