X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86%2Fmacros.lisp;h=ca4519cbc7c38f2d47acd4dbb2d49d7c8a1183d1;hb=fb91e1987cc40f3f698f2972d0de50426ec3086f;hp=f58e94a29b02827e21d90ac2414e08106f703440;hpb=6fb6e66f531dfb6140ec3e0cc8f84f6ecd1927ca;p=sbcl.git diff --git a/src/compiler/x86/macros.lisp b/src/compiler/x86/macros.lisp index f58e94a..ca4519c 100644 --- a/src/compiler/x86/macros.lisp +++ b/src/compiler/x86/macros.lisp @@ -11,12 +11,12 @@ (in-package "SB!VM") -;;; We can load/store into fp registers through the top of -;;; stack %st(0) (fr0 here). Loads imply a push to an empty register -;;; which then changes all the reg numbers. These macros help manage that. +;;; We can load/store into fp registers through the top of stack +;;; %st(0) (fr0 here). Loads imply a push to an empty register which +;;; then changes all the reg numbers. These macros help manage that. -;;; Use this when we don't have to load anything. It preserves old tos value, -;;; but probably destroys tn with operation. +;;; Use this when we don't have to load anything. It preserves old tos +;;; value, but probably destroys tn with operation. (defmacro with-tn@fp-top((tn) &body body) `(progn (unless (zerop (tn-offset ,tn)) @@ -47,7 +47,7 @@ (inst mov ,n-dst ,n-src)))) (defmacro make-ea-for-object-slot (ptr slot lowtag) - `(make-ea :dword :base ,ptr :disp (- (* ,slot word-bytes) ,lowtag))) + `(make-ea :dword :base ,ptr :disp (- (* ,slot n-word-bytes) ,lowtag))) (defmacro loadw (value ptr &optional (slot 0) (lowtag 0)) `(inst mov ,value (make-ea-for-object-slot ,ptr ,slot ,lowtag))) @@ -257,15 +257,15 @@ :foreign))))))))) (values)) -(defmacro with-fixed-allocation ((result-tn type-code size &optional inline) +;;; Allocate an other-pointer object of fixed SIZE with a single word +;;; header having the specified WIDETAG value. The result is placed in +;;; RESULT-TN. +(defmacro with-fixed-allocation ((result-tn widetag size &optional inline) &rest forms) - #!+sb-doc - "Allocate an other-pointer object of fixed Size with a single - word header having the specified Type-Code. The result is placed in - Result-TN." `(pseudo-atomic (allocation ,result-tn (pad-data-block ,size) ,inline) - (storew (logior (ash (1- ,size) sb!vm:type-bits) ,type-code) ,result-tn) + (storew (logior (ash (1- ,size) n-widetag-bits) ,widetag) + ,result-tn) (inst lea ,result-tn (make-ea :byte :base ,result-tn :disp other-pointer-lowtag)) ,@forms)) @@ -280,6 +280,7 @@ :element-type '(unsigned-byte 8) :fill-pointer 0 :adjustable t)))) + (declare (type (vector (unsigned-byte 8) 16) ,var)) (setf (fill-pointer ,var) 0) (unwind-protect (progn @@ -434,7 +435,8 @@ (:result-types ,el-type) (:generator 3 ; pw was 5 (inst mov value (make-ea :dword :base object :index index - :disp (- (* ,offset word-bytes) ,lowtag))))) + :disp (- (* ,offset n-word-bytes) + ,lowtag))))) (define-vop (,(symbolicate name "-C")) ,@(when translate `((:translate ,translate))) @@ -446,7 +448,7 @@ (:result-types ,el-type) (:generator 2 ; pw was 5 (inst mov value (make-ea :dword :base object - :disp (- (* (+ ,offset index) word-bytes) + :disp (- (* (+ ,offset index) n-word-bytes) ,lowtag))))))) (defmacro define-full-setter (name type offset lowtag scs el-type &optional translate) @@ -463,7 +465,7 @@ (:result-types ,el-type) (:generator 4 ; was 5 (inst mov (make-ea :dword :base object :index index - :disp (- (* ,offset word-bytes) ,lowtag)) + :disp (- (* ,offset n-word-bytes) ,lowtag)) value) (move result value))) (define-vop (,(symbolicate name "-C")) @@ -478,7 +480,8 @@ (:result-types ,el-type) (:generator 3 ; was 5 (inst mov (make-ea :dword :base object - :disp (- (* (+ ,offset index) word-bytes) ,lowtag)) + :disp (- (* (+ ,offset index) n-word-bytes) + ,lowtag)) value) (move result value)))))