1.0.9.14: Marginally improved VOPs, and a bit of code cleanup.
[sbcl.git] / src / compiler / mips / alloc.lisp
index 1f6e3a7..8b1cff9 100644 (file)
 ;;;; files for more information.
 
 (in-package "SB!VM")
-
 \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 +28,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)
@@ -70,7 +79,6 @@
 
 (define-vop (list* list-or-list*)
   (:variant t))
-
 \f
 ;;;; Special purpose inline allocators.
 
         (inst li temp (logior (ash (1- size) n-widetag-bits)
                               closure-header-widetag))
         (storew temp result 0 fun-pointer-lowtag))
-      (storew result result closure-self-slot fun-pointer-lowtag)
       (storew function result closure-fun-slot fun-pointer-lowtag))))
 
 ;;; The compiler likes to be able to directly make value cells.
-;;;
 (define-vop (make-value-cell)
   (:args (value :to :save :scs (descriptor-reg any-reg null zero)))
   (:temporary (:scs (non-descriptor-reg)) temp)
   (:temporary (:sc non-descriptor-reg :offset nl4-offset) pa-flag)
+  (:info stack-allocate-p)
+  (:ignore stack-allocate-p)
   (:results (result :scs (descriptor-reg)))
   (:generator 10
     (with-fixed-allocation (result pa-flag temp value-cell-header-widetag value-cell-size)
   (:generator 1
     (inst li result unbound-marker-widetag)))
 
+(define-vop (make-funcallable-instance-tramp)
+  (:args)
+  (:results (result :scs (any-reg)))
+  (:generator 1
+    (inst li result (make-fixup "funcallable_instance_tramp" :foreign))))
+
 (define-vop (fixed-alloc)
   (:args)
   (:info name words type lowtag)