From 4d5a8689d1d303f65c2fa933bb8757063641a8f9 Mon Sep 17 00:00:00 2001 From: Gabor Melis Date: Tue, 15 Nov 2005 12:49:30 +0000 Subject: [PATCH] 0.9.6.44: * 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 | 14 ++++++-------- src/compiler/x86-64/macros.lisp | 15 +++++++++++++++ src/compiler/x86-64/nlx.lisp | 2 +- src/compiler/x86-64/system.lisp | 5 ++--- src/compiler/x86/cell.lisp | 14 ++++++-------- src/compiler/x86/macros.lisp | 19 +++++++++++++++++++ src/compiler/x86/nlx.lisp | 2 +- src/compiler/x86/system.lisp | 5 ++--- version.lisp-expr | 2 +- 9 files changed, 53 insertions(+), 25 deletions(-) diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp index 3d4b698..9596bc9 100644 --- a/src/compiler/x86-64/cell.lisp +++ b/src/compiler/x86-64/cell.lisp @@ -289,10 +289,10 @@ (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) @@ -345,7 +345,7 @@ ;; 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)) @@ -355,8 +355,7 @@ (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) @@ -375,7 +374,7 @@ (: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) @@ -397,8 +396,7 @@ (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)) diff --git a/src/compiler/x86-64/macros.lisp b/src/compiler/x86-64/macros.lisp index ef889ec..8e9f735 100644 --- a/src/compiler/x86-64/macros.lisp +++ b/src/compiler/x86-64/macros.lisp @@ -91,6 +91,21 @@ (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 diff --git a/src/compiler/x86-64/nlx.lisp b/src/compiler/x86-64/nlx.lisp index 30579c4..abd9c62 100644 --- a/src/compiler/x86-64/nlx.lisp +++ b/src/compiler/x86-64/nlx.lisp @@ -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))) ;;;; unwind block hackery diff --git a/src/compiler/x86-64/system.lisp b/src/compiler/x86-64/system.lisp index f86f774..e411567 100644 --- a/src/compiler/x86-64/system.lisp +++ b/src/compiler/x86-64/system.lisp @@ -163,7 +163,7 @@ (: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 ()) @@ -173,11 +173,10 @@ (: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) diff --git a/src/compiler/x86/cell.lisp b/src/compiler/x86/cell.lisp index f8b139e..9301d09 100644 --- a/src/compiler/x86/cell.lisp +++ b/src/compiler/x86/cell.lisp @@ -293,10 +293,10 @@ (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) @@ -349,7 +349,7 @@ ;; 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)) @@ -359,8 +359,7 @@ (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) @@ -379,7 +378,7 @@ (: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) @@ -400,8 +399,7 @@ (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)) diff --git a/src/compiler/x86/macros.lisp b/src/compiler/x86/macros.lisp index 6acfca8..48224fb 100644 --- a/src/compiler/x86/macros.lisp +++ b/src/compiler/x86/macros.lisp @@ -108,6 +108,25 @@ (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 diff --git a/src/compiler/x86/nlx.lisp b/src/compiler/x86/nlx.lisp index f1ecca5..470e905 100644 --- a/src/compiler/x86/nlx.lisp +++ b/src/compiler/x86/nlx.lisp @@ -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))) ;;;; unwind block hackery diff --git a/src/compiler/x86/system.lisp b/src/compiler/x86/system.lisp index e2f7037..b9e9c5f 100644 --- a/src/compiler/x86/system.lisp +++ b/src/compiler/x86/system.lisp @@ -163,7 +163,7 @@ (: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 ()) @@ -173,11 +173,10 @@ (: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) diff --git a/version.lisp-expr b/version.lisp-expr index 1982f36..05879e4 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -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" -- 1.7.10.4