(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))))))
(once-only ((value value))
`(cond ((and (integerp ,value)
(not (typep ,value '(signed-byte 32))))
- (multiple-value-bind (lo hi) (dwords-for-quad ,value)
- (inst mov (make-ea-for-object-slot-half
- ,ptr ,slot ,lowtag) lo)
- (inst mov (make-ea-for-object-slot-half
- ,ptr (+ ,slot 1/2) ,lowtag) hi)))
+ (inst mov temp-reg-tn ,value)
+ (inst mov (make-ea-for-object-slot ,ptr ,slot ,lowtag) temp-reg-tn))
(t
(inst mov (make-ea-for-object-slot ,ptr ,slot ,lowtag) ,value)))))
(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)))
+ :disp (* n-word-bytes 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))
+ :disp (* n-word-bytes thread-binding-stack-pointer-slot))
,reg)
#!-sb-thread
`(store-symbol-value ,reg *binding-stack-pointer*))
;;;; 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 (* n-word-bytes thread-pseudo-atomic-bits-slot))
+ 0))
+
#!+sb-thread
(defmacro pseudo-atomic (&rest forms)
(with-unique-names (label)
`(let ((,label (gen-label)))
(inst mov (make-ea :qword
:base thread-base-tn
- :disp (* 8 thread-pseudo-atomic-bits-slot))
+ :disp (* n-word-bytes thread-pseudo-atomic-bits-slot))
rbp-tn)
,@forms
(inst xor (make-ea :qword
:base thread-base-tn
- :disp (* 8 thread-pseudo-atomic-bits-slot))
+ :disp (* n-word-bytes thread-pseudo-atomic-bits-slot))
rbp-tn)
(inst jmp :z ,label)
;; if PAI was set, interrupts were disabled at the same time
(:generator 5
(move rax old-value)
(inst cmpxchg (make-ea :qword :base object :index index
+ :scale (ash 1 (- word-shift n-fixnum-tag-bits))
:disp (- (* ,offset n-word-bytes) ,lowtag))
new-value :lock)
(move value rax)))))
(:result-types ,el-type)
(:generator 3 ; pw was 5
(inst mov value (make-ea :qword :base object :index index
+ :scale (ash 1 (- word-shift n-fixnum-tag-bits))
:disp (- (* ,offset n-word-bytes)
,lowtag)))))
(define-vop (,(symbolicate name "-C"))
(:result-types ,el-type)
(:generator 3 ; pw was 5
(inst mov value (make-ea :qword :base object :index index
+ :scale (ash 1 (- word-shift n-fixnum-tag-bits))
:disp (- (* (+ ,offset offset) n-word-bytes)
,lowtag)))))
(define-vop (,(symbolicate name "-C"))
(:result-types ,el-type)
(:generator 4 ; was 5
(inst mov (make-ea :qword :base object :index index
+ :scale (ash 1 (- word-shift n-fixnum-tag-bits))
:disp (- (* ,offset n-word-bytes) ,lowtag))
value)
(move result value)))
(:result-types ,el-type)
(:generator 4 ; was 5
(inst mov (make-ea :qword :base object :index index
+ :scale (ash 1 (- word-shift n-fixnum-tag-bits))
:disp (- (* (+ ,offset offset) n-word-bytes) ,lowtag))
value)
(move result value)))
collection."
(if objects
(let ((pins (make-gensym-list (length objects)))
- (wpo (block-gensym "WPO")))
+ (wpo (gensym "WITH-PINNED-OBJECTS-THUNK")))
;; BODY is stuffed in a function to preserve the lexical
;; environment.
`(flet ((,wpo () (progn ,@body)))