-;;;; a bunch of handy macros for the x86
+;;;; a bunch of handy macros for x86-64
;;;; This software is part of the SBCL system. See the README file for
;;;; more information.
;;;; instruction-like macros
-(defmacro move (dst src)
+;;; This used to be a macro (and still is on the other platforms) but
+;;; the support for SC-dependent move instructions needed here makes
+;;; that expand into so large an expression that the resulting code
+;;; bloat is not justifiable.
+(defun move (dst src)
#!+sb-doc
"Move SRC into DST unless they are location=."
- (once-only ((n-dst dst)
- (n-src src))
- `(unless (location= ,n-dst ,n-src)
- (sc-case ,n-dst
- ((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))))))
+ (unless (location= dst src)
+ (sc-case dst
+ ((single-reg complex-single-reg)
+ (aver (xmm-register-p src))
+ (inst movaps dst src))
+ ((double-reg complex-double-reg)
+ (aver (xmm-register-p src))
+ (inst movapd dst src))
+ #!+sb-simd-pack
+ ((int-sse-reg sse-reg)
+ (aver (xmm-register-p src))
+ (inst movdqa dst src))
+ #!+sb-simd-pack
+ ((single-sse-reg double-sse-reg)
+ (aver (xmm-register-p src))
+ (inst movaps dst src))
+ (t
+ (inst mov dst src)))))
(defmacro make-ea-for-object-slot (ptr slot lowtag)
`(make-ea :qword :base ,ptr :disp (- (* ,slot n-word-bytes) ,lowtag)))
#!+sb-thread
(defmacro pseudo-atomic (&rest forms)
+ #!+sb-safepoint-strictly
+ `(progn ,@forms (emit-safepoint))
+ #!-sb-safepoint-strictly
(with-unique-names (label)
`(let ((,label (gen-label)))
(inst mov (make-ea :qword