1.0.36.9: UD2-BREAKPOINTS feature for x86oid systems
[sbcl.git] / src / compiler / x86-64 / macros.lisp
index 03da6d7..675700f 100644 (file)
               (n-src src))
     `(unless (location= ,n-dst ,n-src)
        (sc-case ,n-dst
-         (single-reg
-          (inst movss ,n-dst ,n-src))
-         (double-reg
-          (inst movsd ,n-dst ,n-src))
+         ((single-reg complex-single-reg)
+          (aver (xmm-register-p ,n-src))
+          (inst movaps ,n-dst ,n-src))
+         ((double-reg complex-double-reg)
+          (aver (xmm-register-p ,n-src))
+          (inst movapd ,n-dst ,n-src))
          (t
           (inst mov ,n-dst ,n-src))))))
 
 ;;;; error code
 (defun emit-error-break (vop kind code values)
   (assemble ()
-    #!-darwin
+    #!-ud2-breakpoints
     (inst int 3)                  ; i386 breakpoint instruction
     ;; On Darwin, we need to use #x0b0f instead of int3 in order
     ;; to generate a SIGILL instead of a SIGTRAP as darwin/x86
     ;; handlers. Hopefully this will be fixed by Apple at a
     ;; later date. Do the same on x86-64 as we do on x86 until this gets
     ;; sorted out.
-    #!+darwin
+    #!+ud2-breakpoints
     (inst word #x0b0f)
     ;; The return PC points here; note the location for the debugger.
     (when vop
        (progn ,@body)
        (pseudo-atomic ,@body)))
 
+;;; Unsafely clear pa flags so that the image can properly lose in a
+;;; pa section.
+#!+sb-thread
+(defmacro %clear-pseudo-atomic ()
+  '(inst mov (make-ea :qword :base thread-base-tn
+              :disp (* 8 thread-pseudo-atomic-bits-slot))
+    0))
+
 #!+sb-thread
 (defmacro pseudo-atomic (&rest forms)
   (with-unique-names (label)
     `(let ((,label (gen-label)))
-      (inst or (make-ea :byte
-                 :base thread-base-tn
-                 :disp (* 8 thread-pseudo-atomic-bits-slot))
-            (fixnumize 1))
-      ,@forms
-      (inst xor (make-ea :byte
-                 :base thread-base-tn
-                 :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)
-      (emit-label ,label))))
+       (inst mov (make-ea :qword
+                          :base thread-base-tn
+                          :disp (* 8 thread-pseudo-atomic-bits-slot))
+             rbp-tn)
+       ,@forms
+       (inst xor (make-ea :qword
+                          :base thread-base-tn
+                          :disp (* 8 thread-pseudo-atomic-bits-slot))
+             rbp-tn)
+       (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)
+       (emit-label ,label))))
 
 
 #!-sb-thread
 (defmacro pseudo-atomic (&rest forms)
   (with-unique-names (label)
     `(let ((,label (gen-label)))
-      ;; FIXME: The MAKE-EA noise should become a MACROLET macro or
-      ;; something. (perhaps SVLB, for static variable low byte)
-      (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 xor (make-ea :byte :disp (+ nil-value
-                                        (static-symbol-offset
-                                         '*pseudo-atomic-bits*)
-                                        (ash symbol-value-slot word-shift)
-                                        (- other-pointer-lowtag)))
-            (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)
-      (emit-label ,label))))
-
-
+       ;; FIXME: The MAKE-EA noise should become a MACROLET macro or
+       ;; something. (perhaps SVLB, for static variable low byte)
+       (inst mov (make-ea :qword :disp (+ nil-value
+                                          (static-symbol-offset
+                                           '*pseudo-atomic-bits*)
+                                          (ash symbol-value-slot word-shift)
+                                          (- other-pointer-lowtag)))
+             rbp-tn)
+       ,@forms
+       (inst xor (make-ea :qword :disp (+ nil-value
+                                          (static-symbol-offset
+                                           '*pseudo-atomic-bits*)
+                                          (ash symbol-value-slot word-shift)
+                                          (- other-pointer-lowtag)))
+             rbp-tn)
+       (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)
+       (emit-label ,label))))
 \f
 ;;;; indexed references
 
@@ -523,6 +531,7 @@ collection."
         ;; BODY is stuffed in a function to preserve the lexical
         ;; environment.
         `(flet ((,wpo () (progn ,@body)))
+           (declare (muffle-conditions compiler-note))
            ;; PINS are dx-allocated in case the compiler for some
            ;; unfathomable reason decides to allocate value-cells
            ;; for them -- since we have DX value-cells on x86oid