(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
(inst xor value unbound-marker-widetag temp)
(inst beq temp err-lab))))
-;;; Like CHECKED-CELL-REF, only we are a predicate to see if the cell
-;;; is bound.
+;;; like CHECKED-CELL-REF, only we are a predicate to see if the cell
+;;; is bound
(define-vop (boundp-frob)
(:args (object :scs (descriptor-reg)))
(:conditional)
(: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))))
(:temporary (:scs (descriptor-reg)) temp)
(:generator 5
(loadw temp symbol symbol-value-slot other-pointer-lowtag)
- (inst addq bsp-tn (* 2 word-bytes) bsp-tn)
+ (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 word-bytes) bsp-tn)))
+ (inst subq bsp-tn (* 2 n-word-bytes) bsp-tn)))
(define-vop (unbind-to-here)
(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))
(emit-label skip)
- (inst subq bsp-tn (* 2 word-bytes) bsp-tn)
+ (inst subq bsp-tn (* 2 n-word-bytes) bsp-tn)
(inst cmpeq where bsp-tn temp)
(inst beq temp loop)
\f
;;;; mutator accessing
-#+gengc
+#!+gengc
(progn
(eval-when (:compile-toplevel :load-toplevel :execute)
(define-mutator-accessors binding-stack-end :sap nil)
(define-mutator-accessors number-stack-base :sap nil)
(define-mutator-accessors number-stack-end :sap nil)
- (define-mutator-accessors eval-stack :des t)
- (define-mutator-accessors eval-stack-top :ub32 t)
(define-mutator-accessors nursery-start :sap nil)
(define-mutator-accessors nursery-end :sap nil)
(define-mutator-accessors storebuf-start :sap nil)