X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86-64%2Fsystem.lisp;h=1edf735b59671384a49035d25354a3a97ae099dd;hb=a7ec2f1af6881c93585d97fb2fdcdfd98006f217;hp=88f999779c6b004f154d5943ec3306ff2b126d3b;hpb=f866d5d986cc920a8823549df5045b8182e7d92d;p=sbcl.git diff --git a/src/compiler/x86-64/system.lisp b/src/compiler/x86-64/system.lisp index 88f9997..1edf735 100644 --- a/src/compiler/x86-64/system.lisp +++ b/src/compiler/x86-64/system.lisp @@ -44,7 +44,7 @@ (inst jmp :ne DONE) ;; Pick off fixnums. - (inst and al-tn 7) + (inst and al-tn fixnum-tag-mask) (inst jmp :e DONE) ;; must be an other immediate @@ -336,14 +336,12 @@ (: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 @@ -363,3 +361,36 @@ number of CPU cycles elapsed as secondary value. EXPERIMENTAL." (inst inc (make-ea :qword :base count-vector :disp (- (* (+ vector-data-offset index) n-word-bytes) other-pointer-lowtag))))) + +;;;; 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))