Optimize special variable binding on sb-thread.
[sbcl.git] / src / compiler / ppc / cell.lisp
index 2da18ed..9e2712f 100644 (file)
 ;;; BIND -- Establish VAL as a binding for SYMBOL.  Save the old value and
 ;;; the symbol on the binding stack and stuff the new value into the
 ;;; symbol.
-
+;;; See the "Chapter 9: Specials" of the SBCL Internals Manual.
 #!+sb-thread
 (define-vop (bind)
   (:args (val :scs (any-reg descriptor-reg))
 
      TLS-VALID
      (inst lwzx temp thread-base-tn tls-index)
-     (inst addi bsp-tn bsp-tn (* 2 n-word-bytes))
+     (inst addi bsp-tn bsp-tn (* binding-size n-word-bytes))
      (storew temp bsp-tn (- binding-value-slot binding-size))
-     (storew symbol bsp-tn (- binding-symbol-slot binding-size))
+     (storew tls-index bsp-tn (- binding-symbol-slot binding-size))
      (inst stwx val thread-base-tn tls-index)))
 
 #!-sb-thread
   (:temporary (:scs (descriptor-reg)) temp)
   (:generator 5
     (loadw temp symbol symbol-value-slot other-pointer-lowtag)
-    (inst addi bsp-tn bsp-tn (* 2 n-word-bytes))
+    (inst addi bsp-tn bsp-tn (* binding-size n-word-bytes))
     (storew temp bsp-tn (- binding-value-slot binding-size))
     (storew symbol bsp-tn (- binding-symbol-slot binding-size))
     (storew val symbol symbol-value-slot other-pointer-lowtag)))
   (:temporary (:scs (descriptor-reg)) tls-index value)
   (:generator 0
     (loadw tls-index bsp-tn (- binding-symbol-slot binding-size))
-    (loadw tls-index tls-index symbol-tls-index-slot other-pointer-lowtag)
     (loadw value bsp-tn (- binding-value-slot binding-size))
     (inst stwx value thread-base-tn tls-index)
     (storew zero-tn bsp-tn (- binding-symbol-slot binding-size))
     (storew zero-tn bsp-tn (- binding-value-slot binding-size))
-    (inst subi bsp-tn bsp-tn (* 2 n-word-bytes))))
+    (inst subi bsp-tn bsp-tn (* binding-size n-word-bytes))))
 
 #!-sb-thread
 (define-vop (unbind)
     (storew value symbol symbol-value-slot other-pointer-lowtag)
     (storew zero-tn bsp-tn (- binding-symbol-slot binding-size))
     (storew zero-tn bsp-tn (- binding-value-slot binding-size))
-    (inst subi bsp-tn bsp-tn (* 2 n-word-bytes))))
+    (inst subi bsp-tn bsp-tn (* binding-size n-word-bytes))))
 
 
 (define-vop (unbind-to-here)
       (inst beq skip)
       (loadw value bsp-tn (- binding-value-slot binding-size))
       #!+sb-thread
-      (loadw symbol symbol symbol-tls-index-slot other-pointer-lowtag)
-      #!+sb-thread
       (inst stwx value thread-base-tn symbol)
       #!-sb-thread
       (storew value symbol symbol-value-slot other-pointer-lowtag)
 
       (emit-label skip)
       (storew zero-tn bsp-tn (- binding-value-slot binding-size))
-      (inst subi bsp-tn bsp-tn (* 2 n-word-bytes))
+      (inst subi bsp-tn bsp-tn (* binding-size n-word-bytes))
       (inst cmpw where bsp-tn)
       (inst bne loop)