X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86-64%2Falloc.lisp;h=f15e19e25f77118e71ec7ba3e4eaa0c372851482;hb=94ea2b2082deaa0331dfb66fa6af6ca12dd8dc83;hp=a2300fb220284f4b4a6681319051933ddb252366;hpb=78fa16bf55be44cc16845be84d98023e83fb14bc;p=sbcl.git diff --git a/src/compiler/x86-64/alloc.lisp b/src/compiler/x86-64/alloc.lisp index a2300fb..f15e19e 100644 --- a/src/compiler/x86-64/alloc.lisp +++ b/src/compiler/x86-64/alloc.lisp @@ -12,6 +12,10 @@ (in-package "SB!VM") ;;;; 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)) @@ -40,7 +44,9 @@ (storew reg ,list ,slot list-pointer-lowtag)))) (let ((cons-cells (if star (1- num) num))) (pseudo-atomic - (allocation res (* (pad-data-block cons-size) cons-cells) node) + (allocation res (* (pad-data-block cons-size) cons-cells) node + (awhen (sb!c::node-lvar node) + (sb!c::lvar-dynamic-extent it))) (inst lea res (make-ea :byte :base res :disp list-pointer-lowtag)) (move ptr res) @@ -105,19 +111,19 @@ (with-fixed-allocation (result fdefn-widetag fdefn-size node) (storew name result fdefn-name-slot other-pointer-lowtag) (storew nil-value result fdefn-fun-slot other-pointer-lowtag) - (storew (make-fixup (extern-alien-name "undefined_tramp") :foreign) + (storew (make-fixup "undefined_tramp" :foreign) result fdefn-raw-addr-slot other-pointer-lowtag)))) (define-vop (make-closure) (:args (function :to :save :scs (descriptor-reg))) - (:info length) + (:info length stack-allocate-p) (:temporary (:sc any-reg) temp) (:results (result :scs (descriptor-reg))) (:node-var node) (:generator 10 - (pseudo-atomic + (maybe-pseudo-atomic stack-allocate-p (let ((size (+ length closure-info-offset))) - (allocation result (pad-data-block size) node) + (allocation result (pad-data-block size) node stack-allocate-p) (inst lea result (make-ea :byte :base result :disp fun-pointer-lowtag)) (storew (logior (ash (1- size) n-widetag-bits) closure-header-widetag) @@ -132,8 +138,8 @@ (:node-var node) (:generator 10 (with-fixed-allocation - (result value-cell-header-widetag value-cell-size node)) - (storew value result value-cell-value-slot other-pointer-lowtag))) + (result value-cell-header-widetag value-cell-size node) + (storew value result value-cell-value-slot other-pointer-lowtag)))) ;;;; automatic allocators for primitive objects @@ -201,10 +207,10 @@ ;; we might as well add in the object address here, too. (Adding entropy ;; is good, even if ANSI doesn't understand that.) (inst imul temp - (make-fixup (extern-alien-name "fast_random_state") :foreign) + (make-fixup "fast_random_state" :foreign) 1103515245) (inst add temp 12345) - (inst mov (make-fixup (extern-alien-name "fast_random_state") :foreign) + (inst mov (make-fixup "fast_random_state" :foreign) temp) ;; We want a positive fixnum for the hash value, so discard the LS bits. ;;