printf ' :stack-allocatable-lists :stack-allocatable-fixed-objects' >> $ltf
printf ' :alien-callbacks' >> $ltf
elif [ "$sbcl_arch" = "ppc" ]; then
- printf ' :gencgc :stack-allocatable-closures :stack-allocatable-lists' >> $ltf
+ printf ' :gencgc :stack-allocatable-closures' >> $ltf
+ printf ' :stack-allocatable-lists :stack-allocatable-fixed-objects' >> $ltf
printf ' :linkage-table :raw-instance-init-vops :memory-barrier-vops' >> $ltf
printf ' :compare-and-swap-vops :multiply-high-vops' >> $ltf
if [ "$sbcl_os" = "linux" ]; then
(define-vop (fixed-alloc)
(:args)
(:info name words type lowtag stack-allocate-p)
- (:ignore name stack-allocate-p)
+ (:ignore name)
(:results (result :scs (descriptor-reg)))
(:temporary (:scs (non-descriptor-reg)) temp)
(:temporary (:sc non-descriptor-reg :offset nl3-offset) pa-flag)
(:generator 4
- (with-fixed-allocation (result pa-flag temp type words :lowtag lowtag)
+ (with-fixed-allocation (result pa-flag temp type words
+ :lowtag lowtag
+ :stack-allocate-p stack-allocate-p)
)))
(define-vop (var-alloc)
(inst ori ,result-tn ,result-tn ,lowtag)))
(defmacro with-fixed-allocation ((result-tn flag-tn temp-tn type-code size
- &key (lowtag other-pointer-lowtag))
+ &key (lowtag other-pointer-lowtag)
+ stack-allocate-p)
&body body)
"Do stuff to allocate an other-pointer object of fixed Size with a single
word header having the specified Type-Code. The result is placed in
(once-only ((result-tn result-tn) (temp-tn temp-tn) (flag-tn flag-tn)
(type-code type-code) (size size) (lowtag lowtag))
`(pseudo-atomic (,flag-tn)
- (allocation ,result-tn (pad-data-block ,size) ,lowtag
- :temp-tn ,temp-tn
- :flag-tn ,flag-tn)
+ (if ,stack-allocate-p
+ (progn
+ (align-csp ,temp-tn)
+ (inst ori ,result-tn csp-tn ,lowtag)
+ (inst addi csp-tn csp-tn (pad-data-block ,size)))
+ (allocation ,result-tn (pad-data-block ,size) ,lowtag
+ :temp-tn ,temp-tn
+ :flag-tn ,flag-tn))
(when ,type-code
(inst lr ,temp-tn (logior (ash (1- ,size) n-widetag-bits) ,type-code))
(storew ,temp-tn ,result-tn 0 ,lowtag))