0.pre7.60:
[sbcl.git] / src / compiler / x86 / macros.lisp
index ca830c3..50c4322 100644 (file)
 
 (in-package "SB!VM")
 
-(file-comment
- "$Header$")
+;;; 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))
@@ -50,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)))
@@ -76,7 +73,7 @@
                  :disp (+ nil-value
                           (static-symbol-offset ',symbol)
                           (ash symbol-value-slot word-shift)
-                          (- other-pointer-type)))))
+                          (- other-pointer-lowtag)))))
 
 (defmacro store-symbol-value (reg symbol)
   `(inst mov
@@ -84,7 +81,7 @@
                  :disp (+ nil-value
                           (static-symbol-offset ',symbol)
                           (ash symbol-value-slot word-shift)
-                          (- other-pointer-type)))
+                          (- other-pointer-lowtag)))
         ,reg))
 
 
 ;;; on DYNAMIC-EXTENT would probably give a better payoff.)
 (defvar *maybe-use-inline-allocation* t)
 
-;;; Call into C.
+;;; Emit code to allocate an object with a size in bytes given by
+;;; Size. The size may be an integer of a TN. If Inline is a VOP
+;;; node-var then it is used to make an appropriate speed vs size
+;;; decision.
 ;;;
-;;; FIXME: Except when inline allocation is enabled..?
+;;; FIXME: We call into C.. except when inline allocation is enabled..?
 ;;;
 ;;; FIXME: Also, calls to
 ;;; ALLOCATION are always wrapped with PSEUDO-ATOMIC -- why? Is it to
 ;;; formalized, in documentation and in macro definition,
 ;;; with the macro becoming e.g. PSEUDO-ATOMIC-ALLOCATION.
 (defun allocation (alloc-tn size &optional inline)
-  #!+sb-doc
-  "Emit code to allocate an object with a size in bytes given by Size.
-   The size may be an integer of a TN.
-   If Inline is a VOP node-var then it is used to make an appropriate
-   speed vs size decision."
   (flet ((load-size (dst-tn size)
           (unless (and (tn-p size) (location= alloc-tn size))
             (inst mov dst-tn size))))
                                       :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-type))
+     (make-ea :byte :base ,result-tn :disp other-pointer-lowtag))
     ,@forms))
-
 \f
 ;;;; error code
 
 ;;; something to compile with :SB-NO-PSEUDO-ATOMIC.
 (defvar *enable-pseudo-atomic* t)
 
-;;; FIXME: *PSEUDO-ATOMIC-ATOMIC* and *PSEUDO-ATOMIC-INTERRUPTED*
-;;; should be in package SB!VM or SB!KERNEL, not SB!IMPL.
-
 ;;; 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
         ;; something. (perhaps SVLB, for static variable low byte)
         (inst mov (make-ea :byte :disp (+ nil-value
                                           (static-symbol-offset
-                                           'sb!impl::*pseudo-atomic-interrupted*)
+                                           '*pseudo-atomic-interrupted*)
                                           (ash symbol-value-slot word-shift)
                                           ;; FIXME: Use mask, not minus, to
                                           ;; take out type bits.
-                                          (- other-pointer-type)))
+                                          (- other-pointer-lowtag)))
               0)
         (inst mov (make-ea :byte :disp (+ nil-value
                                           (static-symbol-offset
-                                           'sb!impl::*pseudo-atomic-atomic*)
+                                           '*pseudo-atomic-atomic*)
                                           (ash symbol-value-slot word-shift)
-                                          (- other-pointer-type)))
+                                          (- other-pointer-lowtag)))
               (fixnumize 1)))
        ,@forms
        (when *enable-pseudo-atomic*
         (inst mov (make-ea :byte :disp (+ nil-value
                                           (static-symbol-offset
-                                           'sb!impl::*pseudo-atomic-atomic*)
+                                           '*pseudo-atomic-atomic*)
                                           (ash symbol-value-slot word-shift)
-                                          (- other-pointer-type)))
+                                          (- other-pointer-lowtag)))
               0)
         ;; KLUDGE: Is there any requirement for interrupts to be
         ;; handled in order? It seems as though an interrupt coming
         (inst cmp (make-ea :byte
                            :disp (+ nil-value
                                     (static-symbol-offset
-                                     'sb!impl::*pseudo-atomic-interrupted*)
+                                     '*pseudo-atomic-interrupted*)
                                     (ash symbol-value-slot word-shift)
-                                    (- other-pointer-type)))
+                                    (- other-pointer-lowtag)))
               0)
         (inst jmp :eq ,label)
         (inst break pending-interrupt-trap)
        (: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)))
        (: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)
        (: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"))
        (: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)))))