0.pre8.7
[sbcl.git] / src / compiler / alpha / macros.lisp
index c3816c5..d472eef 100644 (file)
@@ -11,7 +11,7 @@
 
 (in-package "SB!VM")
 
 
 (in-package "SB!VM")
 
-;;; a handy macro for defining top-level forms that depend on the
+;;; a handy macro for defining top level forms that depend on the
 ;;; compile environment
 (defmacro expand (expr)
   (let ((gensym (gensym)))
 ;;; compile environment
 (defmacro expand (expr)
   (let ((gensym (gensym)))
@@ -97,7 +97,7 @@
   "Return to RETURN-PC.  LIP is an interior-reg temporary."
   `(progn
      (inst lda ,lip  
   "Return to RETURN-PC.  LIP is an interior-reg temporary."
   `(progn
      (inst lda ,lip  
-          (- (* (1+ ,offset) word-bytes) other-pointer-lowtag)
+          (- (* (1+ ,offset) n-word-bytes) other-pointer-lowtag)
            ,return-pc)
      ,@(when frob-code
         `((move ,return-pc code-tn)))
            ,return-pc)
      ,@(when frob-code
         `((move ,return-pc code-tn)))
 ;;; Temp-TN is a non- descriptor temp (which may be randomly used by
 ;;; the body.) The body is placed inside the PSEUDO-ATOMIC, and
 ;;; presumably initializes the object.
 ;;; Temp-TN is a non- descriptor temp (which may be randomly used by
 ;;; the body.) The body is placed inside the PSEUDO-ATOMIC, and
 ;;; presumably initializes the object.
-(defmacro with-fixed-allocation ((result-tn temp-tn widetagsize)
+(defmacro with-fixed-allocation ((result-tn temp-tn widetag size)
                                 &body body)
   `(pseudo-atomic (:extra (pad-data-block ,size))
      (inst bis alloc-tn other-pointer-lowtag ,result-tn)
                                 &body body)
   `(pseudo-atomic (:extra (pad-data-block ,size))
      (inst bis alloc-tn other-pointer-lowtag ,result-tn)
      ,@body))
 \f
 ;;;; error code
      ,@body))
 \f
 ;;;; error code
-
-(defvar *adjustable-vectors* nil)
-
-(defmacro with-adjustable-vector ((var) &rest body)
-  `(let ((,var (or (pop *adjustable-vectors*)
-                  (make-array 16
-                              :element-type '(unsigned-byte 8)
-                              :fill-pointer 0
-                              :adjustable t))))
-     (setf (fill-pointer ,var) 0)
-     (unwind-protect
-        (progn
-          ,@body)
-       (push ,var *adjustable-vectors*))))
-
 (eval-when (:compile-toplevel :load-toplevel :execute) 
   (defun emit-error-break (vop kind code values)
     (let ((vector (gensym)))
 (eval-when (:compile-toplevel :load-toplevel :execute) 
   (defun emit-error-break (vop kind code values)
     (let ((vector (gensym)))
        (inst gentrap ,kind)
        (with-adjustable-vector (,vector)
          (write-var-integer (error-number-or-lose ',code) ,vector)
        (inst gentrap ,kind)
        (with-adjustable-vector (,vector)
          (write-var-integer (error-number-or-lose ',code) ,vector)
-         ,@(mapcar #'(lambda (tn)
-                       `(let ((tn ,tn))
-                          (write-var-integer (make-sc-offset (sc-number
-                                                              (tn-sc tn))
-                                                             (tn-offset tn))
-                                             ,vector)))
+         ,@(mapcar (lambda (tn)
+                     `(let ((tn ,tn))
+                        (write-var-integer (make-sc-offset (sc-number
+                                                            (tn-sc tn))
+                                                           (tn-offset tn))
+                                           ,vector)))
                    values)
          (inst byte (length ,vector))
          (dotimes (i (length ,vector))
                    values)
          (inst byte (length ,vector))
          (dotimes (i (length ,vector))
           ,error)))))
 
 \f
           ,error)))))
 
 \f
-;;; PSEUDO-ATOMIC -- Handy macro for making sequences look atomic.
-;;;
+;;; a handy macro for making sequences look atomic
 (defmacro pseudo-atomic ((&key (extra 0)) &rest forms)
   `(progn
      (inst addq alloc-tn 1 alloc-tn)
      ,@forms
      (inst lda alloc-tn (1- ,extra) alloc-tn)
      (inst stl zero-tn 0 alloc-tn)))
 (defmacro pseudo-atomic ((&key (extra 0)) &rest forms)
   `(progn
      (inst addq alloc-tn 1 alloc-tn)
      ,@forms
      (inst lda alloc-tn (1- ,extra) alloc-tn)
      (inst stl zero-tn 0 alloc-tn)))
-
-
 \f
 \f
-;;;; Memory accessor vop generators
-
-(deftype load/store-index (scale lowtag min-offset
-                                &optional (max-offset min-offset))
-  `(integer ,(- (truncate (+ (ash 1 16)
-                            (* min-offset word-bytes)
-                            (- lowtag))
-                         scale))
-           ,(truncate (- (+ (1- (ash 1 16)) lowtag)
-                         (* max-offset word-bytes))
-                      scale)))
+;;;; memory accessor vop generators
 
 (defmacro define-full-reffer (name type offset lowtag scs el-type
                                   &optional translate)
 
 (defmacro define-full-reffer (name type offset lowtag scs el-type
                                   &optional translate)
        (:result-types ,el-type)
        (:generator 5
         (inst addq object index lip)
        (:result-types ,el-type)
        (:generator 5
         (inst addq object index lip)
-        (inst ldl value (- (* ,offset word-bytes) ,lowtag) lip)
+        (inst ldl value (- (* ,offset n-word-bytes) ,lowtag) lip)
         ,@(when (equal scs '(unsigned-reg))
             '((inst mskll value 4 value)))))
      (define-vop (,(symbolicate name "-C"))
         ,@(when (equal scs '(unsigned-reg))
             '((inst mskll value 4 value)))))
      (define-vop (,(symbolicate name "-C"))
        (:args (object :scs (descriptor-reg)))
        (:info index)
        (:arg-types ,type
        (:args (object :scs (descriptor-reg)))
        (:info index)
        (:arg-types ,type
-                  (:constant (load/store-index ,word-bytes ,(eval lowtag)
+                  (:constant (load/store-index ,n-word-bytes ,(eval lowtag)
                                                ,(eval offset))))
        (:results (value :scs ,scs))
        (:result-types ,el-type)
        (:generator 4
                                                ,(eval offset))))
        (:results (value :scs ,scs))
        (:result-types ,el-type)
        (:generator 4
-        (inst ldl value (- (* (+ ,offset index) word-bytes) ,lowtag)
+        (inst ldl value (- (* (+ ,offset index) n-word-bytes) ,lowtag)
               object)
         ,@(when (equal scs '(unsigned-reg))
             '((inst mskll value 4 value)))))))
 
 (defmacro define-full-setter (name type offset lowtag scs el-type
               object)
         ,@(when (equal scs '(unsigned-reg))
             '((inst mskll value 4 value)))))))
 
 (defmacro define-full-setter (name type offset lowtag scs el-type
-                                  &optional translate #+gengc (remember t))
+                                  &optional translate #!+gengc (remember t))
   `(progn
      (define-vop (,name)
        ,@(when translate
   `(progn
      (define-vop (,name)
        ,@(when translate
        (:result-types ,el-type)
        (:generator 2
         (inst addq index object lip)
        (:result-types ,el-type)
        (:generator 2
         (inst addq index object lip)
-        (inst stl value (- (* ,offset word-bytes) ,lowtag) lip)
+        (inst stl value (- (* ,offset n-word-bytes) ,lowtag) lip)
         (move value result)))
      (define-vop (,(symbolicate name "-C"))
        ,@(when translate
         (move value result)))
      (define-vop (,(symbolicate name "-C"))
        ,@(when translate
              (value :scs ,scs))
        (:info index)
        (:arg-types ,type
              (value :scs ,scs))
        (:info index)
        (:arg-types ,type
-                  (:constant (load/store-index ,word-bytes ,(eval lowtag)
+                  (:constant (load/store-index ,n-word-bytes ,(eval lowtag)
                                                ,(eval offset)))
                   ,el-type)
        (:results (result :scs ,scs))
        (:result-types ,el-type)
        (:generator 1
                                                ,(eval offset)))
                   ,el-type)
        (:results (result :scs ,scs))
        (:result-types ,el-type)
        (:generator 1
-        (inst stl value (- (* (+ ,offset index) word-bytes) ,lowtag)
+        (inst stl value (- (* (+ ,offset index) n-word-bytes) ,lowtag)
               object)
         (move value result)))))
 
               object)
         (move value result)))))
 
           ,@(ecase size
               (:byte
                (if signed
           ,@(ecase size
               (:byte
                (if signed
-                   `((inst ldq_u temp (- (* ,offset word-bytes) ,lowtag)
+                   `((inst ldq_u temp (- (* ,offset n-word-bytes) ,lowtag)
                            lip)
                            lip)
-                     (inst lda temp1 (1+ (- (* ,offset word-bytes) ,lowtag))
+                     (inst lda temp1 (1+ (- (* ,offset n-word-bytes) ,lowtag))
                            lip)
                      (inst extqh temp temp1 temp)
                      (inst sra temp 56 value))
                            lip)
                      (inst extqh temp temp1 temp)
                      (inst sra temp 56 value))
-                   `((inst ldq_u temp (- (* ,offset word-bytes) ,lowtag) lip)
-                     (inst lda temp1 (- (* ,offset word-bytes) ,lowtag)
+                   `((inst ldq_u
+                           temp
+                           (- (* ,offset n-word-bytes) ,lowtag)
+                           lip)
+                     (inst lda temp1 (- (* ,offset n-word-bytes) ,lowtag)
                                          lip)
                      (inst extbl temp temp1 value))))
               (:short
                (if signed
                                          lip)
                      (inst extbl temp temp1 value))))
               (:short
                (if signed
-                   `((inst ldq_u temp (- (* ,offset word-bytes) ,lowtag)
+                   `((inst ldq_u temp (- (* ,offset n-word-bytes) ,lowtag)
                            lip)
                            lip)
-                     (inst lda temp1 (- (* ,offset word-bytes) ,lowtag)
+                     (inst lda temp1 (- (* ,offset n-word-bytes) ,lowtag)
                            lip)
                      (inst extwl temp temp1 temp)
                      (inst sll temp 48 temp)
                      (inst sra temp 48 value))
                            lip)
                      (inst extwl temp temp1 temp)
                      (inst sll temp 48 temp)
                      (inst sra temp 48 value))
-                   `((inst ldq_u temp (- (* ,offset word-bytes) ,lowtag)
+                   `((inst ldq_u temp (- (* ,offset n-word-bytes) ,lowtag)
                            lip)
                            lip)
-                     (inst lda temp1 (- (* ,offset word-bytes) ,lowtag) lip)
+                     (inst lda temp1 (- (* ,offset n-word-bytes) ,lowtag) lip)
                      (inst extwl temp temp1 value)))))))
        (define-vop (,(symbolicate name "-C"))
         ,@(when translate
                      (inst extwl temp temp1 value)))))))
        (define-vop (,(symbolicate name "-C"))
         ,@(when translate
           ,@(ecase size
               (:byte
                (if signed
           ,@(ecase size
               (:byte
                (if signed
-                   `((inst ldq_u temp (- (+ (* ,offset word-bytes)
+                   `((inst ldq_u temp (- (+ (* ,offset n-word-bytes)
                                             (* index ,scale)) ,lowtag)
                            object)
                                             (* index ,scale)) ,lowtag)
                            object)
-                     (inst lda temp1 (1+ (- (+ (* ,offset word-bytes)
+                     (inst lda temp1 (1+ (- (+ (* ,offset n-word-bytes)
                                                (* index ,scale)) ,lowtag))
                            object)
                      (inst extqh temp temp1 temp)
                      (inst sra temp 56 value))
                                                (* index ,scale)) ,lowtag))
                            object)
                      (inst extqh temp temp1 temp)
                      (inst sra temp 56 value))
-                   `((inst ldq_u temp (- (+ (* ,offset word-bytes)
+                   `((inst ldq_u temp (- (+ (* ,offset n-word-bytes)
                                             (* index ,scale)) ,lowtag)
                            object)
                                             (* index ,scale)) ,lowtag)
                            object)
-                     (inst lda temp1 (- (+ (* ,offset word-bytes)
+                     (inst lda temp1 (- (+ (* ,offset n-word-bytes)
                                            (* index ,scale)) ,lowtag)
                            object)
                      (inst extbl temp temp1 value))))
               (:short
                (if signed
                                            (* index ,scale)) ,lowtag)
                            object)
                      (inst extbl temp temp1 value))))
               (:short
                (if signed
-                   `((inst ldq_u temp (- (+ (* ,offset word-bytes)
+                   `((inst ldq_u temp (- (+ (* ,offset n-word-bytes)
                                             (* index ,scale)) ,lowtag)
                            object)
                                             (* index ,scale)) ,lowtag)
                            object)
-                     (inst lda temp1 (- (+ (* ,offset word-bytes)
+                     (inst lda temp1 (- (+ (* ,offset n-word-bytes)
                                            (* index ,scale)) ,lowtag)
                            object)
                      (inst extwl temp temp1 temp)
                      (inst sll temp 48 temp)
                      (inst sra temp 48 value))
                                            (* index ,scale)) ,lowtag)
                            object)
                      (inst extwl temp temp1 temp)
                      (inst sll temp 48 temp)
                      (inst sra temp 48 value))
-                   `((inst ldq_u temp (- (+ (* ,offset word-bytes)
+                   `((inst ldq_u temp (- (+ (* ,offset n-word-bytes)
                                             (* index ,scale)) ,lowtag)
                            object)
                                             (* index ,scale)) ,lowtag)
                            object)
-                     (inst lda temp1 (- (+ (* ,offset word-bytes)
+                     (inst lda temp1 (- (+ (* ,offset n-word-bytes)
                                            (* index ,scale)) ,lowtag)
                            object)
                      (inst extwl temp temp1 value))))))))))
                                            (* index ,scale)) ,lowtag)
                            object)
                      (inst extwl temp temp1 value))))))))))
               '((inst addq lip index lip)))
           ,@(ecase size
               (:byte
               '((inst addq lip index lip)))
           ,@(ecase size
               (:byte
-               `((inst lda temp (- (* ,offset word-bytes) ,lowtag) lip)
-                 (inst ldq_u temp1 (- (* ,offset word-bytes) ,lowtag) lip)
+               `((inst lda temp (- (* ,offset n-word-bytes) ,lowtag) lip)
+                 (inst ldq_u temp1 (- (* ,offset n-word-bytes) ,lowtag) lip)
                  (inst insbl value  temp temp2)
                  (inst mskbl temp1 temp temp1)
                  (inst bis temp1 temp2 temp1)
                  (inst insbl value  temp temp2)
                  (inst mskbl temp1 temp temp1)
                  (inst bis temp1 temp2 temp1)
-                 (inst stq_u temp1 (- (* ,offset word-bytes) ,lowtag) lip)))
+                 (inst stq_u temp1 (- (* ,offset n-word-bytes) ,lowtag) lip)))
               (:short
               (:short
-               `((inst lda temp (- (* ,offset word-bytes) ,lowtag) lip)
-                 (inst ldq_u temp1 (- (* ,offset word-bytes) ,lowtag) lip)
+               `((inst lda temp (- (* ,offset n-word-bytes) ,lowtag) lip)
+                 (inst ldq_u temp1 (- (* ,offset n-word-bytes) ,lowtag) lip)
                  (inst mskwl temp1 temp temp1)
                  (inst inswl value temp temp2)
                  (inst bis temp1 temp2 temp)
                  (inst mskwl temp1 temp temp1)
                  (inst inswl value temp temp2)
                  (inst bis temp1 temp2 temp)
-                 (inst stq_u temp (- (* ,offset word-bytes) ,lowtag) lip))))
+                 (inst stq_u temp (- (* ,offset n-word-bytes) ,lowtag) lip))))
           (move value result)))
        (define-vop (,(symbolicate name "-C"))
         ,@(when translate
           (move value result)))
        (define-vop (,(symbolicate name "-C"))
         ,@(when translate
         (:generator 5
           ,@(ecase size
               (:byte
         (:generator 5
           ,@(ecase size
               (:byte
-               `((inst lda temp (- (* ,offset word-bytes)
+               `((inst lda temp (- (* ,offset n-word-bytes)
                                    (* index ,scale) ,lowtag)
                        object)
                                    (* index ,scale) ,lowtag)
                        object)
-                 (inst ldq_u temp1 (- (* ,offset word-bytes) 
+                 (inst ldq_u temp1 (- (* ,offset n-word-bytes) 
                                       (* index ,scale) ,lowtag)
                        object)
                  (inst insbl value temp temp2)
                  (inst mskbl temp1 temp temp1)
                  (inst bis temp1 temp2 temp1)
                                       (* index ,scale) ,lowtag)
                        object)
                  (inst insbl value temp temp2)
                  (inst mskbl temp1 temp temp1)
                  (inst bis temp1 temp2 temp1)
-                 (inst stq_u temp1 (- (* ,offset word-bytes)
+                 (inst stq_u temp1 (- (* ,offset n-word-bytes)
                                       (* index ,scale) ,lowtag) object)))
               (:short
                                       (* index ,scale) ,lowtag) object)))
               (:short
-               `((inst lda temp (- (* ,offset word-bytes)
+               `((inst lda temp (- (* ,offset n-word-bytes)
                                    (* index ,scale) ,lowtag)
                        object)
                                    (* index ,scale) ,lowtag)
                        object)
-                 (inst ldq_u temp1 (- (* ,offset word-bytes)
+                 (inst ldq_u temp1 (- (* ,offset n-word-bytes)
                                       (* index ,scale) ,lowtag)
                        object)
                  (inst mskwl temp1 temp temp1)
                  (inst inswl value temp temp2)
                  (inst bis temp1 temp2 temp)
                                       (* index ,scale) ,lowtag)
                        object)
                  (inst mskwl temp1 temp temp1)
                  (inst inswl value temp temp2)
                  (inst bis temp1 temp2 temp)
-                 (inst stq_u temp (- (* ,offset word-bytes)
+                 (inst stq_u temp (- (* ,offset n-word-bytes)
                                      (* index ,scale) ,lowtag) object))))
           (move value result))))))
                                      (* index ,scale) ,lowtag) object))))
           (move value result))))))