1.0.10.5: dynamic-extent CONS
[sbcl.git] / src / compiler / hppa / alloc.lisp
index ec80da7..779234f 100644 (file)
@@ -1,3 +1,14 @@
+;;;; allocation VOPs for the HPPA
+
+;;;; This software is part of the SBCL system. See the README file for
+;;;; more information.
+;;;;
+;;;; This software is derived from the CMU CL system, which was
+;;;; written at Carnegie Mellon University and released into the
+;;;; public domain. The software is in the public domain and is
+;;;; provided with absolutely no warranty. See the COPYING and CREDITS
+;;;; files for more information.
+
 (in-package "SB!VM")
 
 \f
@@ -8,7 +19,7 @@
   (:temporary (:scs (descriptor-reg) :type list) ptr)
   (:temporary (:scs (descriptor-reg)) temp)
   (:temporary (:scs (descriptor-reg) :type list :to (:result 0) :target result)
-             res)
+              res)
   (:info num)
   (:results (result :scs (descriptor-reg)))
   (:variant-vars star)
       (move (tn-ref-tn things) result))
      (t
       (macrolet
-         ((maybe-load (tn)
-            (once-only ((tn tn))
-              `(sc-case ,tn
-                 ((any-reg descriptor-reg zero null)
-                  ,tn)
-                 (control-stack
-                  (load-stack-tn temp ,tn)
-                  temp)))))
-       (let* ((cons-cells (if star (1- num) num))
-              (alloc (* (pad-data-block cons-size) cons-cells)))
-         (pseudo-atomic (:extra alloc)
-           (move alloc-tn res)
-           (inst dep list-pointer-lowtag 31 3 res)
-           (move res ptr)
-           (dotimes (i (1- cons-cells))
-             (storew (maybe-load (tn-ref-tn things)) ptr
-                     cons-car-slot list-pointer-lowtag)
-             (setf things (tn-ref-across things))
-             (inst addi (pad-data-block cons-size) ptr ptr)
-             (storew ptr ptr
-                     (- cons-cdr-slot cons-size)
-                     list-pointer-lowtag))
-           (storew (maybe-load (tn-ref-tn things)) ptr
-                   cons-car-slot list-pointer-lowtag)
-           (storew (if star
-                       (maybe-load (tn-ref-tn (tn-ref-across things)))
-                       null-tn)
-                   ptr cons-cdr-slot list-pointer-lowtag))
-         (move res result)))))))
+          ((maybe-load (tn)
+             (once-only ((tn tn))
+               `(sc-case ,tn
+                  ((any-reg descriptor-reg zero null)
+                   ,tn)
+                  (control-stack
+                   (load-stack-tn temp ,tn)
+                   temp)))))
+        (let* ((cons-cells (if star (1- num) num))
+               (alloc (* (pad-data-block cons-size) cons-cells)))
+          (pseudo-atomic (:extra alloc)
+            (move alloc-tn res)
+            (inst dep list-pointer-lowtag 31 3 res)
+            (move res ptr)
+            (dotimes (i (1- cons-cells))
+              (storew (maybe-load (tn-ref-tn things)) ptr
+                      cons-car-slot list-pointer-lowtag)
+              (setf things (tn-ref-across things))
+              (inst addi (pad-data-block cons-size) ptr ptr)
+              (storew ptr ptr
+                      (- cons-cdr-slot cons-size)
+                      list-pointer-lowtag))
+            (storew (maybe-load (tn-ref-tn things)) ptr
+                    cons-car-slot list-pointer-lowtag)
+            (storew (if star
+                        (maybe-load (tn-ref-tn (tn-ref-across things)))
+                        null-tn)
+                    ptr cons-cdr-slot list-pointer-lowtag))
+          (move res result)))))))
 
 
 (define-vop (list list-or-list*)
@@ -63,7 +74,7 @@
 
 (define-vop (allocate-code-object)
   (:args (boxed-arg :scs (any-reg))
-        (unboxed-arg :scs (any-reg)))
+         (unboxed-arg :scs (any-reg)))
   (:results (result :scs (descriptor-reg)))
   (:temporary (:scs (non-descriptor-reg)) ndescr)
   (:temporary (:scs (any-reg) :from (:argument 0)) boxed)
   (:generator 10
     (let ((size (+ length closure-info-offset)))
       (pseudo-atomic (:extra (pad-data-block size))
-       (inst move alloc-tn result)
-       (inst dep fun-pointer-lowtag 31 3 result)
-       (inst li (logior (ash (1- size) n-widetag-bits) closure-header-widetag) temp)
-       (storew temp result 0 fun-pointer-lowtag)))
-    (storew function result closure-fun-slot fun-pointer-lowtag)))
+        (inst move alloc-tn result)
+        (inst dep fun-pointer-lowtag 31 3 result)
+        (inst li (logior (ash (1- size) n-widetag-bits) closure-header-widetag) temp)
+        (storew temp result 0 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)))
   (:temporary (:scs (non-descriptor-reg)) temp)
   (:results (result :scs (descriptor-reg)))
+  (:info stack-allocate-p)
+  (:ignore stack-allocate-p)
   (:generator 10
     (with-fixed-allocation
-       (result temp value-cell-header-widetag value-cell-size))
+        (result temp value-cell-header-widetag value-cell-size))
     (storew value result value-cell-value-slot other-pointer-lowtag)))
 
 
   (:generator 1
     (inst li unbound-marker-widetag result)))
 
+(define-vop (make-funcallable-instance-tramp)
+  (:args)
+  (:results (result :scs (any-reg)))
+  (:generator 1
+    (inst li (make-fixup "funcallable_instance_tramp" :foreign) result)))
+
 (define-vop (fixed-alloc)
   (:args)
-  (:info name words type lowtag)
-  (:ignore name)
+  (:info name words type lowtag stack-allocate-p)
+  (:ignore name stack-allocate-p)
   (:results (result :scs (descriptor-reg)))
   (:temporary (:scs (non-descriptor-reg)) temp)
   (:generator 4
       (inst move alloc-tn result)
       (inst dep lowtag 31 3 result)
       (when type
-       (inst li (logior (ash (1- words) n-widetag-bits) type) temp)
-       (storew temp result 0 lowtag)))))
+        (inst li (logior (ash (1- words) n-widetag-bits) type) temp)
+        (storew temp result 0 lowtag)))))
 
 (define-vop (var-alloc)
   (:args (extra :scs (any-reg)))