0.8.16.17
[sbcl.git] / src / compiler / alpha / cell.lisp
index cdee958..3220e7d 100644 (file)
 (define-vop (set-slot)
   (:args (object :scs (descriptor-reg))
         (value :scs (descriptor-reg any-reg null zero)))
-  (:info name offset lowtag #+gengc remember)
+  (:info name offset lowtag #!+gengc remember)
   (:ignore name)
   (:results)
   (:generator 1
-    #+gengc
+    #!+gengc
     (if remember
        (storew-and-remember-slot value object offset lowtag)
        (storew value object offset lowtag))
-    #-gengc
+    #!-gengc
     (storew value object offset lowtag)))
 \f
 ;;;; symbol hacking VOPs
   (:policy :fast)
   (:translate symbol-value))
 
-
+(define-vop (symbol-hash)
+  (:policy :fast-safe)
+  (:translate symbol-hash)
+  (:args (symbol :scs (descriptor-reg)))
+  (:results (res :scs (any-reg)))
+  (:result-types positive-fixnum)
+  (:generator 2
+    ;; The symbol-hash slot of NIL holds NIL because it is also the
+    ;; cdr slot, so we have to strip off the two low bits to make sure
+    ;; it is a fixnum.  The lowtag selection magic that is required to
+    ;; ensure this is explained in the comment in objdef.lisp
+    (loadw res symbol symbol-hash-slot other-pointer-lowtag)
+    (inst bic res #.(ash lowtag-mask -1) res)))
 \f
 ;;;; fdefinition (FDEFN) objects
 
   (:generator 10
     (move object obj-temp)
     (loadw value obj-temp fdefn-fun-slot other-pointer-lowtag)
-    (let ((err-lab (generate-error-code vop undefined-symbol-error obj-temp)))
+    (let ((err-lab (generate-error-code vop undefined-fun-error obj-temp)))
       (inst cmpeq value null-tn temp)
       (inst bne temp err-lab))))
 
     (inst addq bsp-tn (* 2 n-word-bytes) bsp-tn)
     (storew temp bsp-tn (- binding-value-slot binding-size))
     (storew symbol bsp-tn (- binding-symbol-slot binding-size))
-    (#+gengc storew-and-remember-slot #-gengc storew
+    (#!+gengc storew-and-remember-slot #!-gengc storew
             val symbol symbol-value-slot other-pointer-lowtag)))
 
 
   (:generator 0
     (loadw symbol bsp-tn (- binding-symbol-slot binding-size))
     (loadw value bsp-tn (- binding-value-slot binding-size))
-    (#+gengc storew-and-remember-slot #-gengc storew
+    (#!+gengc storew-and-remember-slot #!-gengc storew
             value symbol symbol-value-slot other-pointer-lowtag)
     (storew zero-tn bsp-tn (- binding-symbol-slot binding-size))
     (inst subq bsp-tn (* 2 n-word-bytes) bsp-tn)))
       (loadw symbol bsp-tn (- binding-symbol-slot binding-size))
       (loadw value bsp-tn (- binding-value-slot binding-size))
       (inst beq symbol skip)
-      (#+gengc storew-and-remember-slot #-gengc storew
+      (#!+gengc storew-and-remember-slot #!-gengc storew
               value symbol symbol-value-slot other-pointer-lowtag)
       (storew zero-tn bsp-tn (- binding-symbol-slot binding-size))
 
 \f
 ;;;; mutator accessing
 
-#+gengc
+#!+gengc
 (progn
 
 (eval-when (:compile-toplevel :load-toplevel :execute)