0.9.6.44:
authorGabor Melis <mega@hotpop.com>
Tue, 15 Nov 2005 12:49:30 +0000 (12:49 +0000)
committerGabor Melis <mega@hotpop.com>
Tue, 15 Nov 2005 12:49:30 +0000 (12:49 +0000)
  * access *BINDING-STACK-POINTER* directly without looking up the tls
    index on threaded builds. This shaves 120K off the core and makes
    using specials a bit faster.

src/compiler/x86-64/cell.lisp
src/compiler/x86-64/macros.lisp
src/compiler/x86-64/nlx.lisp
src/compiler/x86-64/system.lisp
src/compiler/x86/cell.lisp
src/compiler/x86/macros.lisp
src/compiler/x86/nlx.lisp
src/compiler/x86/system.lisp
version.lisp-expr

index 3d4b698..9596bc9 100644 (file)
     (let ((tls-index-valid (gen-label))
           (get-tls-index-lock (gen-label))
           (release-tls-index-lock (gen-label)))
-      (load-tl-symbol-value bsp *binding-stack-pointer*)
+      (load-binding-stack-pointer bsp)
       (loadw tls-index symbol symbol-tls-index-slot other-pointer-lowtag)
       (inst add bsp (* binding-size n-word-bytes))
-      (store-tl-symbol-value bsp *binding-stack-pointer* temp)
+      (store-binding-stack-pointer bsp)
       (inst or tls-index tls-index)
       (inst jmp :ne tls-index-valid)
 
     ;; four temporaries?
   (:temporary (:sc unsigned-reg) symbol value bsp tls-index)
   (:generator 0
-    (load-tl-symbol-value bsp *binding-stack-pointer*)
+    (load-binding-stack-pointer bsp)
     (loadw symbol bsp (- binding-symbol-slot binding-size))
     (loadw value bsp (- binding-value-slot binding-size))
 
 
     (storew 0 bsp (- binding-symbol-slot binding-size))
     (inst sub bsp (* binding-size n-word-bytes))
-    ;; we're done with value, so we can use it as a temp here
-    (store-tl-symbol-value bsp *binding-stack-pointer* value)))
+    (store-binding-stack-pointer bsp)))
 
 #!-sb-thread
 (define-vop (unbind)
   (:args (where :scs (descriptor-reg any-reg)))
   (:temporary (:sc unsigned-reg) symbol value bsp #!+sb-thread tls-index)
   (:generator 0
-    (load-tl-symbol-value bsp *binding-stack-pointer*)
+    (load-binding-stack-pointer bsp)
     (inst cmp where bsp)
     (inst jmp :e DONE)
 
     (inst sub bsp (* binding-size n-word-bytes))
     (inst cmp where bsp)
     (inst jmp :ne LOOP)
-    ;; we're done with value, so can use it as a temporary
-    (store-tl-symbol-value bsp *binding-stack-pointer* value)
+    (store-binding-stack-pointer bsp)
 
     DONE))
 \f
index ef889ec..8e9f735 100644 (file)
   (declare (ignore temp))
   `(store-symbol-value ,reg ,symbol))
 
+(defmacro load-binding-stack-pointer (reg)
+  #!+sb-thread
+  `(inst mov ,reg (make-ea :qword :base thread-base-tn
+                   :disp (* 8 thread-binding-stack-pointer-slot)))
+  #!-sb-thread
+  `(load-symbol-value ,reg *binding-stack-pointer*))
+
+(defmacro store-binding-stack-pointer (reg)
+  #!+sb-thread
+  `(inst mov (make-ea :qword :base thread-base-tn
+              :disp (* 8 thread-binding-stack-pointer-slot))
+    ,reg)
+  #!-sb-thread
+  `(store-symbol-value ,reg *binding-stack-pointer*))
+
 (defmacro load-type (target source &optional (offset 0))
   #!+sb-doc
   "Loads the type bits of a pointer into target independent of
index 30579c4..abd9c62 100644 (file)
@@ -63,7 +63,7 @@
 (define-vop (current-binding-pointer)
   (:results (res :scs (any-reg descriptor-reg)))
   (:generator 1
-    (load-tl-symbol-value res *binding-stack-pointer*)))
+    (load-binding-stack-pointer res)))
 \f
 ;;;; unwind block hackery
 
index f86f774..e411567 100644 (file)
   (:translate binding-stack-pointer-sap)
   (:policy :fast-safe)
   (:generator 1
-    (load-tl-symbol-value int *binding-stack-pointer*)))
+    (load-binding-stack-pointer int)))
 
 (defknown (setf binding-stack-pointer-sap)
     (system-area-pointer) system-area-pointer ())
   (:arg-types system-area-pointer)
   (:results (int :scs (sap-reg)))
   (:result-types system-area-pointer)
-  #!+sb-thread (:temporary (:sc any-reg) temp)
   (:translate (setf binding-stack-pointer-sap))
   (:policy :fast-safe)
   (:generator 1
-    (store-tl-symbol-value new-value *binding-stack-pointer* temp)
+    (store-binding-stack-pointer new-value)
     (move int new-value)))
 
 (define-vop (control-stack-pointer-sap)
index f8b139e..9301d09 100644 (file)
     (let ((tls-index-valid (gen-label))
           (get-tls-index-lock (gen-label))
           (release-tls-index-lock (gen-label)))
-      (load-tl-symbol-value bsp *binding-stack-pointer*)
+      (load-binding-stack-pointer bsp)
       (loadw tls-index symbol symbol-tls-index-slot other-pointer-lowtag)
       (inst add bsp (* binding-size n-word-bytes))
-      (store-tl-symbol-value bsp *binding-stack-pointer* temp)
+      (store-binding-stack-pointer bsp)
       (inst or tls-index tls-index)
       (inst jmp :ne tls-index-valid)
 
     ;; four temporaries?
   (:temporary (:sc unsigned-reg) symbol value bsp tls-index)
   (:generator 0
-    (load-tl-symbol-value bsp *binding-stack-pointer*)
+    (load-binding-stack-pointer bsp)
     (loadw symbol bsp (- binding-symbol-slot binding-size))
     (loadw value bsp (- binding-value-slot binding-size))
 
 
     (storew 0 bsp (- binding-symbol-slot binding-size))
     (inst sub bsp (* binding-size n-word-bytes))
-    ;; we're done with value, so we can use it as a temp here
-    (store-tl-symbol-value bsp *binding-stack-pointer* value)))
+    (store-binding-stack-pointer bsp)))
 
 #!-sb-thread
 (define-vop (unbind)
   (:args (where :scs (descriptor-reg any-reg)))
   (:temporary (:sc unsigned-reg) symbol value bsp #!+sb-thread tls-index)
   (:generator 0
-    (load-tl-symbol-value bsp *binding-stack-pointer*)
+    (load-binding-stack-pointer bsp)
     (inst cmp where bsp)
     (inst jmp :e done)
 
     (inst sub bsp (* binding-size n-word-bytes))
     (inst cmp where bsp)
     (inst jmp :ne loop)
-    ;; we're done with value, so can use it as a temporary
-    (store-tl-symbol-value bsp *binding-stack-pointer* value)
+    (store-binding-stack-pointer bsp)
 
     DONE))
 \f
index 6acfca8..48224fb 100644 (file)
   (declare (ignore temp))
   `(store-symbol-value ,reg ,symbol))
 
+(defmacro load-binding-stack-pointer (reg)
+  #!+sb-thread
+  `(progn
+     (inst fs-segment-prefix)
+     (inst mov ,reg (make-ea :dword
+                             :disp (* 4 thread-binding-stack-pointer-slot))))
+  #!-sb-thread
+  `(load-symbol-value ,reg *binding-stack-pointer*))
+
+(defmacro store-binding-stack-pointer (reg)
+  #!+sb-thread
+  `(progn
+     (inst fs-segment-prefix)
+     (inst mov (make-ea :dword
+                        :disp (* 4 thread-binding-stack-pointer-slot))
+           ,reg))
+  #!-sb-thread
+  `(store-symbol-value ,reg *binding-stack-pointer*))
+
 (defmacro load-type (target source &optional (offset 0))
   #!+sb-doc
   "Loads the type bits of a pointer into target independent of
index f1ecca5..470e905 100644 (file)
@@ -63,7 +63,7 @@
 (define-vop (current-binding-pointer)
   (:results (res :scs (any-reg descriptor-reg)))
   (:generator 1
-    (load-tl-symbol-value res *binding-stack-pointer*)))
+    (load-binding-stack-pointer res)))
 \f
 ;;;; unwind block hackery
 
index e2f7037..b9e9c5f 100644 (file)
   (:translate binding-stack-pointer-sap)
   (:policy :fast-safe)
   (:generator 1
-    (load-tl-symbol-value int *binding-stack-pointer*)))
+    (load-binding-stack-pointer int)))
 
 (defknown (setf binding-stack-pointer-sap)
     (system-area-pointer) system-area-pointer ())
   (:arg-types system-area-pointer)
   (:results (int :scs (sap-reg)))
   (:result-types system-area-pointer)
-  #!+sb-thread (:temporary (:sc any-reg) temp)
   (:translate (setf binding-stack-pointer-sap))
   (:policy :fast-safe)
   (:generator 1
-    (store-tl-symbol-value new-value *binding-stack-pointer* temp)
+    (store-binding-stack-pointer new-value)
     (move int new-value)))
 
 (define-vop (control-stack-pointer-sap)
index 1982f36..05879e4 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".)
-"0.9.6.43"
+"0.9.6.44"