1.0.15.7: threaded BIND and UNBIND improvements on x86
[sbcl.git] / src / compiler / x86 / system.lisp
index f3a65a3..597e3c2 100644 (file)
@@ -85,9 +85,7 @@
   (: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))))