1.0.10.5: dynamic-extent CONS
[sbcl.git] / src / compiler / x86 / alloc.lisp
index f3cf5f9..59d47f5 100644 (file)
@@ -11,7 +11,9 @@
 
 (in-package "SB!VM")
 \f
-;;;; LIST and LIST*
+;;;; CONS, LIST and LIST*
+(defoptimizer (cons stack-allocate-result) ((&rest args))
+  t)
 (defoptimizer (list stack-allocate-result) ((&rest args))
   (not (null args)))
 (defoptimizer (list* stack-allocate-result) ((&rest args))
 
 (define-vop (fixed-alloc)
   (:args)
-  (:info name words type lowtag)
+  (:info name words type lowtag stack-allocate-p)
   (:ignore name)
   (:results (result :scs (descriptor-reg)))
   (:node-var node)
     ;; also check for (< SPEED SPACE) is because we want the space
     ;; savings that these out-of-line allocation routines bring whilst
     ;; compiling SBCL itself.  --njf, 2006-07-08
-    (if (and (= lowtag list-pointer-lowtag) (policy node (< speed 3)))
+    (if (and (not stack-allocate-p)
+             (= lowtag list-pointer-lowtag) (policy node (< speed 3)))
         (let ((dst
+               ;; FIXME: out-of-line dx-allocation
                #.(loop for offset in *dword-regs*
                     collect `(,offset
                               ',(intern (format nil "ALLOCATE-CONS-TO-~A"
           (aver (null type))
           (inst call (make-fixup dst :assembly-routine)))
         (pseudo-atomic
-         (allocation result (pad-data-block words) node)
+         (allocation result (pad-data-block words) node stack-allocate-p)
          (inst lea result (make-ea :byte :base result :disp lowtag))
          (when type
            (storew (logior (ash (1- words) n-widetag-bits) type)