1.0.4.85: small PCL cleanups and thread-safety notes
[sbcl.git] / src / compiler / x86 / cell.lisp
index c998c2c..e30f508 100644 (file)
   (:ignore name)
   (:results)
   (:generator 1
-     (if (sc-is value immediate)
-        (let ((val (tn-value value)))
-           (etypecase val
-              (integer
-               (inst mov
-                     (make-ea :dword :base object
-                              :disp (- (* offset n-word-bytes) lowtag))
-                     (fixnumize val)))
-              (symbol
-               (inst mov
-                     (make-ea :dword :base object
-                              :disp (- (* offset n-word-bytes) lowtag))
-                     (+ nil-value (static-symbol-offset val))))
-              (character
-               (inst mov
-                     (make-ea :dword :base object
-                              :disp (- (* offset n-word-bytes) lowtag))
-                     (logior (ash (char-code val) n-widetag-bits)
-                             character-widetag)))))
-       ;; Else, value not immediate.
-       (storew value object offset lowtag))))
+     (storew (encode-value-if-immediate value) object offset lowtag)))
 \f
 
 
 (define-vop (set cell-set)
   (:variant symbol-value-slot other-pointer-lowtag))
 
-;;; Do a cell ref with an error check for being unbound.
-;;; XXX stil used? I can't see where -dan
-(define-vop (checked-cell-ref)
-  (:args (object :scs (descriptor-reg) :target obj-temp))
-  (:results (value :scs (descriptor-reg any-reg)))
-  (:policy :fast-safe)
-  (:vop-var vop)
-  (:save-p :compute-only)
-  (:temporary (:sc descriptor-reg :from (:argument 0)) obj-temp))
-
 ;;; With Symbol-Value, we check that the value isn't the trap object. So
 ;;; Symbol-Value of NIL is NIL.
 #!+sb-thread
   (:generator 4
     (move result value)
     (inst lock)
-    (inst add (make-ea :dword :base object
-                       :disp (- (* symbol-value-slot n-word-bytes)
-                                other-pointer-lowtag))
+    (inst add (make-ea-for-object-slot object symbol-value-slot
+                                       other-pointer-lowtag)
           value)))
 
 #!+sb-thread
   (:generator 38
     (load-type type function (- fun-pointer-lowtag))
     (inst lea raw
-          (make-ea :byte :base function
-                   :disp (- (* simple-fun-code-offset n-word-bytes)
-                            fun-pointer-lowtag)))
+          (make-ea-for-object-slot function simple-fun-code-offset
+                                   fun-pointer-lowtag))
     (inst cmp type simple-fun-header-widetag)
     (inst jmp :e normal-fn)
     (inst lea raw (make-fixup "closure_tramp" :foreign))
     (inst fs-segment-prefix)
     (inst mov (make-ea :dword :base tls-index) value)
 
-    (storew 0 bsp (- binding-value-slot binding-size))
     (storew 0 bsp (- binding-symbol-slot binding-size))
+    (storew 0 bsp (- binding-value-slot binding-size))
     (inst sub bsp (* binding-size n-word-bytes))
     (store-binding-stack-pointer bsp)))
 
     (loadw symbol bsp (- binding-symbol-slot binding-size))
     (loadw value bsp (- binding-value-slot binding-size))
     (storew value symbol symbol-value-slot other-pointer-lowtag)
-    (storew 0 bsp (- binding-value-slot binding-size))
     (storew 0 bsp (- binding-symbol-slot binding-size))
+    (storew 0 bsp (- binding-value-slot binding-size))
     (inst sub bsp (* binding-size n-word-bytes))
     (store-symbol-value bsp *binding-stack-pointer*)))
 
                   tls-index symbol symbol-tls-index-slot other-pointer-lowtag)
     #!+sb-thread (inst fs-segment-prefix)
     #!+sb-thread (inst mov (make-ea :dword :base tls-index) value)
-    (storew 0 bsp (- binding-value-slot binding-size))
     (storew 0 bsp (- binding-symbol-slot binding-size))
 
     SKIP
+    (storew 0 bsp (- binding-value-slot binding-size))
     (inst sub bsp (* binding-size n-word-bytes))
     (inst cmp where bsp)
     (inst jmp :ne loop)
   funcallable-instance-info-offset fun-pointer-lowtag
   (descriptor-reg any-reg) * %funcallable-instance-info)
 
-(define-vop (funcallable-instance-lexenv cell-ref)
-  (:variant funcallable-instance-lexenv-slot fun-pointer-lowtag))
-
 (define-vop (closure-ref slot-ref)
   (:variant closure-info-offset fun-pointer-lowtag))