(:result-types positive-fixnum)
(:generator 6
(move eax type)
- (inst mov
- (make-ea :byte :base function :disp (- fun-pointer-lowtag))
- al-tn)
+ (storeb al-tn function 0 fun-pointer-lowtag)
(move result eax)))
(define-vop (get-header-data)
(storew eax x 0 other-pointer-lowtag)
(move res x)))
\f
-(define-vop (make-fixnum)
+(define-vop (pointer-hash)
+ (:translate pointer-hash)
(:args (ptr :scs (any-reg descriptor-reg) :target res))
(:results (res :scs (any-reg descriptor-reg)))
+ (:policy :fast-safe)
(:generator 1
- ;; Some code (the hash table code) depends on this returning a
- ;; positive number so make sure it does.
(move res ptr)
- (inst shl res 3)
+ ;; Mask the lowtag, and shift the whole address into a positive
+ ;; fixnum.
+ (inst and res (lognot lowtag-mask))
(inst shr res 1)))
(define-vop (make-other-immediate-type)
(:temporary (:sc any-reg :from (:argument 0) :to :result) temp)
(:results (result :scs (descriptor-reg)))
(:generator 3
- (inst lea temp
- (make-ea :byte :base new-self
- :disp (- (ash simple-fun-code-offset word-shift)
- fun-pointer-lowtag)))
+ (inst lea temp (make-ea-for-object-slot new-self simple-fun-code-offset
+ fun-pointer-lowtag))
(storew temp function simple-fun-self-slot fun-pointer-lowtag)
(move result new-self)))
\f
(:args (count-vector :scs (descriptor-reg)))
(:info index)
(:generator 0
- (inst inc (make-ea-for-object-slot count-vector
- (+ vector-data-offset index)
- other-pointer-lowtag))))
+ (inst inc (make-ea-for-vector-data count-vector :offset index))))