X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86-64%2Falloc.lisp;h=f15e19e25f77118e71ec7ba3e4eaa0c372851482;hb=94ea2b2082deaa0331dfb66fa6af6ca12dd8dc83;hp=bc7de22b1b612fea746dc8a19a89b313b0926ccb;hpb=4ebdc81b1a9c6dbed6e98b112afc8dd32b17a2dd;p=sbcl.git diff --git a/src/compiler/x86-64/alloc.lisp b/src/compiler/x86-64/alloc.lisp index bc7de22..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 @@ -172,7 +178,7 @@ (inst lea bytes (make-ea :qword :base extra :disp (* (1+ words) n-word-bytes))) (inst mov header bytes) - (inst shl header (- n-widetag-bits 2)) ; w+1 to length field + (inst shl header (- n-widetag-bits 3)) ; w+1 to length field (inst lea header ; (w-1 << 8) | type (make-ea :qword :base header :disp (+ (ash -2 n-widetag-bits) type))) (inst and bytes (lognot lowtag-mask)) @@ -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. ;;