0.9.2.7:
[sbcl.git] / src / compiler / sparc / macros.lisp
index 70e1fbd..7005f2b 100644 (file)
        (inst move ,n-dst ,n-src))))
 
 (macrolet
-    ((frob (op inst shift)
+    ((def (op inst shift)
        `(defmacro ,op (object base &optional (offset 0) (lowtag 0))
          `(inst ,',inst ,object ,base (- (ash ,offset ,,shift) ,lowtag)))))
-  (frob loadw ld word-shift)
-  (frob storew st word-shift))
+  (def loadw ld word-shift)
+  (def storew st word-shift))
 
 (defmacro load-symbol (reg symbol)
   `(inst add ,reg null-tn (static-symbol-offset ,symbol)))
   Result-TN, and 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."
+  (unless body
+    (bug "empty &body in WITH-FIXED-ALLOCATION"))
   (once-only ((result-tn result-tn) (temp-tn temp-tn)
              (type-code type-code) (size size))
     `(pseudo-atomic (:extra (pad-data-block ,size))
        (storew ,temp-tn ,result-tn 0 other-pointer-lowtag)
        ,@body)))
 
+(defun align-csp (temp)
+  (let ((aligned (gen-label)))
+    ;; FIXME: why use a TEMP?  Why not just ZERO-TN?
+    (inst andcc temp csp-tn lowtag-mask)
+    (if (member :sparc-v9 *backend-subfeatures*)
+       (inst b :eq aligned :pt)
+       (inst b :eq aligned))
+    (storew zero-tn csp-tn 0) ; sneaky use of delay slot
+    (inst add csp-tn csp-tn n-word-bytes)
+    (emit-label aligned)))
 \f
 ;;;; Error Code
 (eval-when (:compile-toplevel :load-toplevel :execute)