(allocation result bytes node)
(inst lea result (make-ea :byte :base result :disp lowtag))
(storew header result 0 lowtag))))
-
-(define-vop (%make-symbol)
- (:policy :fast-safe)
- (:translate %make-symbol)
- (:args (name :scs (descriptor-reg) :to :eval))
- (:temporary (:sc unsigned-reg :from :eval) temp)
- (:results (result :scs (descriptor-reg) :from :argument))
- (:node-var node)
- (:generator 37
- (with-fixed-allocation (result symbol-header-widetag symbol-size node)
- (storew name result symbol-name-slot other-pointer-lowtag)
- (storew unbound-marker-widetag
- result
- symbol-value-slot
- other-pointer-lowtag)
- ;; Set up a random hash value for the symbol. Perhaps the object
- ;; address could be used for even faster and smaller code!
- ;; FIXME: We don't mind the symbol hash not being repeatable, so
- ;; we might as well add in the object address here, too. (Adding entropy
- ;; is good, even if ANSI doesn't understand that.)
- (inst imul temp
- (make-fixup "fast_random_state" :foreign)
- 1103515245)
- (inst add temp 12345)
- (inst mov (make-fixup "fast_random_state" :foreign)
- temp)
- ;; We want a positive fixnum for the hash value, so discard the LS bits.
- ;;
- ;; FIXME: OK, who wants to tell me (CSR) why these two
- ;; instructions aren't replaced by (INST AND TEMP #x8FFFFFFC)?
- ;; Are the following two instructions actually faster? Does the
- ;; difference in behaviour really matter?
- (inst shr temp 1)
- (inst and temp #xfffffffc)
- (storew temp result symbol-hash-slot other-pointer-lowtag)
- (storew nil-value result symbol-plist-slot other-pointer-lowtag)
- (storew nil-value result symbol-package-slot other-pointer-lowtag))))