X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86%2Fcell.lisp;h=7b1df1c90cbcb0c3c8ef630952dd43480e548b2e;hb=fc999187f3f80dfcf170348df676386b8403e261;hp=332432f2696ce6a159f732826ddee40f8ded016d;hpb=5813c792f8a5d69dd796d2b545b8f7867ddef389;p=sbcl.git diff --git a/src/compiler/x86/cell.lisp b/src/compiler/x86/cell.lisp index 332432f..7b1df1c 100644 --- a/src/compiler/x86/cell.lisp +++ b/src/compiler/x86/cell.lisp @@ -63,8 +63,7 @@ (define-vop (set) (:args (symbol :scs (descriptor-reg)) (value :scs (descriptor-reg any-reg))) - (:translate sb!kernel:%set-symbol-value) - (:temporary (:sc descriptor-reg ) tls) + (:temporary (:sc descriptor-reg) tls) ;;(:policy :fast-safe) (:generator 4 (let ((global-val (gen-label)) @@ -122,8 +121,22 @@ #!+sb-thread (define-vop (fast-symbol-value symbol-value) + ;; KLUDGE: not really fast, in fact, because we're going to have to + ;; do a full lookup of the thread-local area anyway. But half of + ;; the meaning of FAST-SYMBOL-VALUE is "do not signal an error if + ;; unbound", which is used in the implementation of COPY-SYMBOL. -- + ;; CSR, 2003-04-22 (:policy :fast) - (:translate symbol-value)) + (:translate symbol-value) + (:generator 8 + (let ((ret-lab (gen-label))) + (loadw value object symbol-tls-index-slot other-pointer-lowtag) + (inst fs-segment-prefix) + (inst mov value (make-ea :dword :index value :scale 1)) + (inst cmp value unbound-marker-widetag) + (inst jmp :ne ret-lab) + (loadw value object symbol-value-slot other-pointer-lowtag) + (emit-label ret-lab)))) #!-sb-thread (define-vop (symbol-value)