X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86-64%2Fmacros.lisp;h=1152889fce03e1f1dd9ebb1c7afb11cb86531ebc;hb=a757a48ad4a4531894203461ba5fb626a3ffc511;hp=ef889ec1455828da5bf4023bee39790922aaaef6;hpb=e4542bc034db18cf98f005b2dac53a6d7d5c7260;p=sbcl.git diff --git a/src/compiler/x86-64/macros.lisp b/src/compiler/x86-64/macros.lisp index ef889ec..1152889 100644 --- a/src/compiler/x86-64/macros.lisp +++ b/src/compiler/x86-64/macros.lisp @@ -19,7 +19,13 @@ (once-only ((n-dst dst) (n-src src)) `(unless (location= ,n-dst ,n-src) - (inst mov ,n-dst ,n-src)))) + (sc-case ,n-dst + (single-reg + (inst movss ,n-dst ,n-src)) + (double-reg + (inst movsd ,n-dst ,n-src)) + (t + (inst mov ,n-dst ,n-src)))))) (defmacro make-ea-for-object-slot (ptr slot lowtag) `(make-ea :qword :base ,ptr :disp (- (* ,slot n-word-bytes) ,lowtag))) @@ -91,6 +97,21 @@ (declare (ignore temp)) `(store-symbol-value ,reg ,symbol)) +(defmacro load-binding-stack-pointer (reg) + #!+sb-thread + `(inst mov ,reg (make-ea :qword :base thread-base-tn + :disp (* 8 thread-binding-stack-pointer-slot))) + #!-sb-thread + `(load-symbol-value ,reg *binding-stack-pointer*)) + +(defmacro store-binding-stack-pointer (reg) + #!+sb-thread + `(inst mov (make-ea :qword :base thread-base-tn + :disp (* 8 thread-binding-stack-pointer-slot)) + ,reg) + #!-sb-thread + `(store-symbol-value ,reg *binding-stack-pointer*)) + (defmacro load-type (target source &optional (offset 0)) #!+sb-doc "Loads the type bits of a pointer into target independent of @@ -269,11 +290,6 @@ ;;; place and there's no logical single place to attach documentation. ;;; grep (mostly in src/runtime) is your friend -;;; FIXME: *PSEUDO-ATOMIC-FOO* could be made into *PSEUDO-ATOMIC-BITS*, -;;; set with a single operation and cleared with SHR *PSEUDO-ATOMIC-BITS*,-2; -;;; the ATOMIC bit is bit 0, the INTERRUPTED bit is bit 1, and you check -;;; the C flag after the shift to see whether you were interrupted. - ;;; FIXME: THIS NAME IS BACKWARDS! (defmacro maybe-pseudo-atomic (really-p &body body) `(if ,really-p @@ -284,18 +300,16 @@ (defmacro pseudo-atomic (&rest forms) (with-unique-names (label) `(let ((,label (gen-label))) - (inst mov (make-ea :byte + (inst or (make-ea :byte :base thread-base-tn - :disp (* 8 thread-pseudo-atomic-atomic-slot)) + :disp (* 8 thread-pseudo-atomic-bits-slot)) (fixnumize 1)) ,@forms - (inst mov (make-ea :byte - :base thread-base-tn - :disp (* 8 thread-pseudo-atomic-atomic-slot)) 0) - (inst cmp (make-ea :byte + (inst xor (make-ea :byte :base thread-base-tn - :disp (* 8 thread-pseudo-atomic-interrupted-slot)) 0) - (inst jmp :eq ,label) + :disp (* 8 thread-pseudo-atomic-bits-slot)) + (fixnumize 1)) + (inst jmp :z ,label) ;; if PAI was set, interrupts were disabled at the same ;; time using the process signal mask. (inst break pending-interrupt-trap) @@ -308,27 +322,20 @@ `(let ((,label (gen-label))) ;; FIXME: The MAKE-EA noise should become a MACROLET macro or ;; something. (perhaps SVLB, for static variable low byte) - (inst mov (make-ea :byte :disp (+ nil-value - (static-symbol-offset - '*pseudo-atomic-atomic*) - (ash symbol-value-slot word-shift) - (- other-pointer-lowtag))) - (fixnumize 1)) + (inst or (make-ea :byte :disp (+ nil-value + (static-symbol-offset + '*pseudo-atomic-bits*) + (ash symbol-value-slot word-shift) + (- other-pointer-lowtag))) + (fixnumize 1)) ,@forms - (inst mov (make-ea :byte :disp (+ nil-value + (inst xor (make-ea :byte :disp (+ nil-value (static-symbol-offset - '*pseudo-atomic-atomic*) + '*pseudo-atomic-bits*) (ash symbol-value-slot word-shift) (- other-pointer-lowtag))) - 0) - (inst cmp (make-ea :byte - :disp (+ nil-value - (static-symbol-offset - '*pseudo-atomic-interrupted*) - (ash symbol-value-slot word-shift) - (- other-pointer-lowtag))) - 0) - (inst jmp :eq ,label) + (fixnumize 1)) + (inst jmp :z ,label) ;; if PAI was set, interrupts were disabled at the same time ;; using the process signal mask. (inst break pending-interrupt-trap)