0.9.5.7:
authorThiemo Seufer <ths@networkno.de>
Wed, 28 Sep 2005 15:10:39 +0000 (15:10 +0000)
committerThiemo Seufer <ths@networkno.de>
Wed, 28 Sep 2005 15:10:39 +0000 (15:10 +0000)
Actually implement stack allocatable closures.

make-config.sh
src/compiler/mips/alloc.lisp
src/compiler/mips/call.lisp
src/compiler/mips/macros.lisp
version.lisp-expr

index 131f6fe..87730b9 100644 (file)
@@ -208,6 +208,7 @@ elif [ "$sbcl_arch" = "mips" ]; then
     # cross-compilers!
     #
     # FIXME: integrate to grovel-features, mayhaps
+    printf ' :stack-allocatable-closures' >> $ltf
     $GNUMAKE -C tools-for-build determine-endianness -I src/runtime
     tools-for-build/determine-endianness >> $ltf
 elif [ "$sbcl_arch" = "ppc" -a "$sbcl_os" = "linux" ]; then
index 1f6e3a7..d0f21a3 100644 (file)
 
 \f
 ;;;; LIST and LIST*
+(defoptimizer (list stack-allocate-result) ((&rest args))
+  (not (null args)))
+(defoptimizer (list* stack-allocate-result) ((&rest args))
+  (not (null (rest args))))
 
 (define-vop (list-or-list*)
   (:args (things :more t))
@@ -25,6 +29,7 @@
   (:results (result :scs (descriptor-reg)))
   (:variant-vars star)
   (:policy :safe)
+  (:node-var node)
   (:generator 0
     (cond ((zerop num)
            (move result null-tn))
                ((store-car (tn list &optional (slot cons-car-slot))
                   `(let ((reg
                           (sc-case ,tn
-                            ((any-reg descriptor-reg) ,tn)
-                            (zero zero-tn)
-                            (null null-tn)
+                            ((any-reg descriptor-reg zero null)
+                             ,tn)
                             (control-stack
                              (load-stack-tn temp ,tn)
                              temp))))
                      (storew reg ,list ,slot list-pointer-lowtag))))
-             (let ((cons-cells (if star (1- num) num)))
-               (pseudo-atomic (pa-flag
-                               :extra (* (pad-data-block cons-size)
-                                         cons-cells))
-                 (inst or res alloc-tn list-pointer-lowtag)
+             (let* ((dx-p (node-stack-allocate-p node))
+                    (cons-cells (if star (1- num) num))
+                    (alloc (* (pad-data-block cons-size) cons-cells)))
+               (pseudo-atomic (pa-flag :extra (if dx-p 0 alloc))
+                 (when dx-p
+                   (align-csp res))
+                 (inst srl res (if dx-p csp-tn alloc-tn) n-lowtag-bits)
+                 (inst sll res n-lowtag-bits)
+                 (inst or res list-pointer-lowtag)
+                 (when dx-p
+                   (inst addu csp-tn alloc))
                  (move ptr res)
                  (dotimes (i (1- cons-cells))
                    (store-car (tn-ref-tn things) ptr)
index 03408ca..8035520 100644 (file)
@@ -481,6 +481,7 @@ default-value-8
   (:ignore args save)
   (:vop-var vop)
   (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save)
+  (:temporary (:scs (non-descriptor-reg)) temp)
   (:generator 20
     (let ((label (gen-label))
           (cur-nfp (current-nfp-tn vop)))
@@ -947,19 +948,26 @@ default-value-8
       (when cur-nfp
         (inst addu nsp-tn cur-nfp
               (bytes-needed-for-non-descriptor-stack-frame))))
-    ;; Establish the values pointer and values count.
-    (move val-ptr cfp-tn)
-    (inst li nargs (fixnumize nvals))
-    ;; restore the frame pointer and clear as much of the control
-    ;; stack as possible.
-    (move cfp-tn ocfp)
-    (inst addu csp-tn val-ptr (* nvals n-word-bytes))
-    ;; pre-default any argument register that need it.
-    (when (< nvals register-arg-count)
-      (dolist (reg (subseq (list a0 a1 a2 a3 a4 a5) nvals))
-        (move reg null-tn)))
-    ;; And away we go.
-    (lisp-return return-pc lip)
+    (cond ((= nvals 1)
+           ;; Clear the control stack, and restore the frame pointer.
+           (move csp-tn cfp-tn)
+           (move cfp-tn ocfp)
+           ;; Out of here.
+           (lisp-return return-pc lip :offset 2))
+          (t
+           ;; Establish the values pointer and values count.
+           (move val-ptr cfp-tn)
+           (inst li nargs (fixnumize nvals))
+           ;; restore the frame pointer and clear as much of the control
+           ;; stack as possible.
+           (move cfp-tn ocfp)
+           (inst addu csp-tn val-ptr (* nvals n-word-bytes))
+           ;; pre-default any argument register that need it.
+           (when (< nvals register-arg-count)
+             (dolist (reg (subseq (list a0 a1 a2 a3 a4 a5) nvals))
+               (move reg null-tn)))
+           ;; And away we go.
+           (lisp-return return-pc lip)))
     (trace-table-entry trace-table-normal)))
 
 ;;; Do unknown-values return of an arbitrary number of values (passed on the
@@ -1102,14 +1110,15 @@ default-value-8
       (emit-label done))))
 
 
-;;; More args are stored consequtively on the stack, starting immediately at
-;;; the context pointer.  The context pointer is not typed, so the lowtag is 0.
-;;;
+;;; More args are stored consecutively on the stack, starting
+;;; immediately at the context pointer.  The context pointer is not
+;;; typed, so the lowtag is 0.
 (define-full-reffer more-arg * 0 0 (descriptor-reg any-reg) * %more-arg)
 
-
 ;;; Turn more arg (context, count) into a list.
-;;;
+(defoptimizer (%listify-rest-args stack-allocate-result) ((&rest args))
+  t)
+
 (define-vop (listify-rest-args)
   (:args (context-arg :target context :scs (descriptor-reg))
          (count-arg :target count :scs (any-reg)))
@@ -1121,10 +1130,13 @@ default-value-8
   (:results (result :scs (descriptor-reg)))
   (:translate %listify-rest-args)
   (:policy :safe)
+  (:node-var node)
   (:generator 20
-    (let ((enter (gen-label))
-          (loop (gen-label))
-          (done (gen-label)))
+    (let* ((enter (gen-label))
+           (loop (gen-label))
+           (done (gen-label))
+           (dx-p (node-stack-allocate-p node))
+           (alloc-area-tn (if dx-p csp-tn alloc-tn)))
       (move context context-arg)
       (move count count-arg)
       ;; Check to see if there are any arguments.
@@ -1133,12 +1145,16 @@ default-value-8
 
       ;; We need to do this atomically.
       (pseudo-atomic (pa-flag)
+        (when dx-p
+          (align-csp temp))
         ;; Allocate a cons (2 words) for each item.
-        (inst or result alloc-tn list-pointer-lowtag)
+        (inst srl result alloc-area-tn n-lowtag-bits)
+        (inst sll result n-lowtag-bits)
+        (inst or result list-pointer-lowtag)
         (move dst result)
         (inst sll temp count 1)
         (inst b enter)
-        (inst addu alloc-tn alloc-tn temp)
+        (inst addu alloc-area-tn temp)
 
         ;; Store the current cons in the cdr of the previous cons.
         (emit-label loop)
@@ -1148,7 +1164,7 @@ default-value-8
         (emit-label enter)
         ;; Grab one value.
         (loadw temp context)
-        (inst addu context context n-word-bytes)
+        (inst addu context n-word-bytes)
 
         ;; Dec count, and if != zero, go back for more.
         (inst addu count count (fixnumize -1))
index 0bcc9c3..a015232 100644 (file)
        (storew ,temp-tn ,result-tn 0 other-pointer-lowtag)
        ,@body)))
 
+(defun align-csp (temp)
+  ;; is used for stack allocation of dynamic-extent objects
+  (let ((aligned (gen-label)))
+    (inst and temp csp-tn lowtag-mask)
+    (inst beq temp aligned)
+    (inst nop)
+    (inst addu csp-tn n-word-bytes)
+    (storew zero-tn csp-tn -1)
+    (emit-label aligned)))
+
 \f
 ;;;; Three Way Comparison
 (defun three-way-comparison (x y condition flavor not-p target temp)
index d73e05c..18753c6 100644 (file)
@@ -17,4 +17,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"0.9.5.6"
+"0.9.5.7"