(:translate widetag-of)
(:policy :fast-safe)
(:args (object :scs (descriptor-reg)))
- (:temporary (:sc unsigned-reg :offset eax-offset :to (:result 0)) rax)
+ (:temporary (:sc unsigned-reg :offset rax-offset :target result
+ :to (:result 0)) rax)
(:results (result :scs (unsigned-reg)))
(:result-types positive-fixnum)
(:generator 6
- (inst mov rax object)
+ (inst movzx rax (reg-in-size object :byte))
(inst and al-tn lowtag-mask)
(inst cmp al-tn other-pointer-lowtag)
(inst jmp :e OTHER-PTR)
(inst cmp al-tn fun-pointer-lowtag)
(inst jmp :e FUNCTION-PTR)
- ;; Pick off structures and list pointers.
- (inst test al-tn 1)
- (inst jmp :ne DONE)
-
;; Pick off fixnums.
- (inst and al-tn 7)
+ (inst test al-tn fixnum-tag-mask)
(inst jmp :e DONE)
+ ;; Pick off structures and list pointers.
+ (inst test al-tn 2)
+ (inst jmp :ne DONE)
+
;; must be an other immediate
- (inst mov rax object)
+ (inst movzx rax (reg-in-size object :byte))
(inst jmp DONE)
FUNCTION-PTR
- (load-type al-tn object (- fun-pointer-lowtag))
+ (load-type rax object (- fun-pointer-lowtag))
(inst jmp DONE)
OTHER-PTR
- (load-type al-tn object (- other-pointer-lowtag))
+ (load-type rax object (- other-pointer-lowtag))
DONE
- (inst movzx result al-tn)))
+ (move result rax)))
\f
(define-vop (fun-subtype)
(:translate fun-subtype)
(:policy :fast-safe)
(:args (function :scs (descriptor-reg)))
- (:temporary (:sc byte-reg :from (:eval 0) :to (:eval 1)) temp)
(:results (result :scs (unsigned-reg)))
(:result-types positive-fixnum)
(:generator 6
- (load-type temp function (- fun-pointer-lowtag))
- (inst movzx result temp)))
+ (load-type result function (- fun-pointer-lowtag))))
(define-vop (set-fun-subtype)
(:translate (setf fun-subtype))
(:generator 1
(inst break pending-interrupt-trap)))
+#!+sb-safepoint
+(define-vop (insert-safepoint)
+ (:policy :fast-safe)
+ (:translate sb!kernel::gc-safepoint)
+ (:generator 0
+ (emit-safepoint)))
+
#!+sb-thread
(defknown current-thread-offset-sap ((unsigned-byte 64))
system-area-pointer (flushable))
(:result-types unsigned-num unsigned-num)
(:generator 5
(zeroize eax)
+ ;; Intel docs seem quite consistent on only using CPUID before RDTSC,
+ ;; not both before and after. Go figure.
(inst cpuid)
(inst rdtsc)
- (inst push edx)
- (inst push eax)
- (zeroize eax)
- (inst cpuid)
- (inst pop lo)
- (inst pop hi)))
+ (move lo eax)
+ (move hi edx)))
(defmacro with-cycle-counter (&body body)
"Returns the primary value of BODY as the primary value, and the
(inst inc (make-ea :qword :base count-vector
:disp (- (* (+ vector-data-offset index) n-word-bytes)
other-pointer-lowtag)))))
+\f
+;;;; Memory barrier support
+
+#!+memory-barrier-vops
+(define-vop (%compiler-barrier)
+ (:policy :fast-safe)
+ (:translate %compiler-barrier)
+ (:generator 3))
+
+#!+memory-barrier-vops
+(define-vop (%memory-barrier)
+ (:policy :fast-safe)
+ (:translate %memory-barrier)
+ (:generator 3
+ (inst mfence)))
+
+#!+memory-barrier-vops
+(define-vop (%read-barrier)
+ (:policy :fast-safe)
+ (:translate %read-barrier)
+ (:generator 3))
+
+#!+memory-barrier-vops
+(define-vop (%write-barrier)
+ (:policy :fast-safe)
+ (:translate %write-barrier)
+ (:generator 3))
+
+#!+memory-barrier-vops
+(define-vop (%data-dependency-barrier)
+ (:policy :fast-safe)
+ (:translate %data-dependency-barrier)
+ (:generator 3))
+
+(define-vop (pause)
+ (:translate spin-loop-hint)
+ (:policy :fast-safe)
+ (:generator 0
+ (inst pause)))