From: Thiemo S. <th...@us...> - 2007-09-01 18:11:16
|
Update of /cvsroot/sbcl/sbcl/src/compiler/mips In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv14283/src/compiler/mips Modified Files: alloc.lisp float.lisp macros.lisp move.lisp sap.lisp Log Message: 1.0.9.22: Dynamic-extent value-cells for MIPS. Index: alloc.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/mips/alloc.lisp,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- alloc.lisp 1 Sep 2007 11:19:56 -0000 1.13 +++ alloc.lisp 1 Sep 2007 18:11:11 -0000 1.14 @@ -118,7 +118,7 @@ (:temporary (:sc non-descriptor-reg :offset nl4-offset) pa-flag) (:results (result :scs (descriptor-reg) :from :argument)) (:generator 37 - (with-fixed-allocation (result pa-flag temp fdefn-widetag fdefn-size) + (with-fixed-allocation (result pa-flag temp fdefn-widetag fdefn-size nil) (inst li temp (make-fixup "undefined_tramp" :foreign)) (storew name result fdefn-name-slot other-pointer-lowtag) (storew null-tn result fdefn-fun-slot other-pointer-lowtag) @@ -153,12 +153,11 @@ (:temporary (:scs (non-descriptor-reg)) temp) (:temporary (:sc non-descriptor-reg :offset nl4-offset) pa-flag) (:info stack-allocate-p) - (:ignore stack-allocate-p) (:results (result :scs (descriptor-reg))) (:generator 10 - (with-fixed-allocation (result pa-flag temp value-cell-header-widetag value-cell-size) + (with-fixed-allocation (result pa-flag temp value-cell-header-widetag + value-cell-size stack-allocate-p) (storew value result value-cell-value-slot other-pointer-lowtag)))) - ;;;; Automatic allocators for primitive objects. Index: float.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/mips/float.lisp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- float.lisp 19 Aug 2007 23:46:05 -0000 1.5 +++ float.lisp 1 Sep 2007 18:11:11 -0000 1.6 @@ -78,7 +78,7 @@ (:variant-vars double-p size type data) (:note "float to pointer coercion") (:generator 13 - (with-fixed-allocation (y pa-flag ndescr type size) + (with-fixed-allocation (y pa-flag ndescr type size nil) (if double-p (str-double x y (- (* data n-word-bytes) other-pointer-lowtag)) (inst swc1 x y (- (* data n-word-bytes) other-pointer-lowtag)))))) @@ -259,7 +259,7 @@ (:note "complex single float to pointer coercion") (:generator 13 (with-fixed-allocation (y pa-flag ndescr complex-single-float-widetag - complex-single-float-size) + complex-single-float-size nil) (let ((real-tn (complex-single-reg-real-tn x))) (inst swc1 real-tn y (- (* complex-single-float-real-slot n-word-bytes) @@ -279,7 +279,7 @@ (:note "complex double float to pointer coercion") (:generator 13 (with-fixed-allocation (y pa-flag ndescr complex-double-float-widetag - complex-double-float-size) + complex-double-float-size nil) (let ((real-tn (complex-double-reg-real-tn x))) (str-double real-tn y (- (* complex-double-float-real-slot n-word-bytes) Index: macros.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/mips/macros.lisp,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- macros.lisp 1 Sep 2007 18:09:20 -0000 1.20 +++ macros.lisp 1 Sep 2007 18:11:11 -0000 1.21 @@ -143,8 +143,11 @@ ;;;; Storage allocation: -(defmacro with-fixed-allocation ((result-tn flag-tn temp-tn type-code size) +(defmacro with-fixed-allocation ((result-tn flag-tn temp-tn type-code + size dynamic-extent-p + &key (lowtag other-pointer-lowtag)) &body body) + #!+sb-doc "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 Result-TN, Flag-Tn must be wired to NL4-OFFSET, and Temp-TN is a non- @@ -152,12 +155,28 @@ placed inside the PSEUDO-ATOMIC, and presumably initializes the object." (unless body (bug "empty &body in WITH-FIXED-ALLOCATION")) - (once-only ((result-tn result-tn) (temp-tn temp-tn) (size size)) - `(pseudo-atomic (,flag-tn :extra (pad-data-block ,size)) - (inst or ,result-tn alloc-tn other-pointer-lowtag) - (inst li ,temp-tn (logior (ash (1- ,size) n-widetag-bits) ,type-code)) - (storew ,temp-tn ,result-tn 0 other-pointer-lowtag) - ,@body))) + (once-only ((result-tn result-tn) (flag-tn flag-tn) (temp-tn temp-tn) + (type-code type-code) (size size) + (dynamic-extent-p dynamic-extent-p) + (lowtag lowtag)) + `(if ,dynamic-extent-p + (pseudo-atomic (,flag-tn) + (align-csp ,temp-tn) + (inst or ,result-tn csp-tn ,lowtag) + (inst li ,temp-tn (logior (ash (1- ,size) n-widetag-bits) ,type-code)) + (inst addu csp-tn (pad-data-block ,size)) + (storew ,temp-tn ,result-tn 0 ,lowtag) + ,@body) + (pseudo-atomic (,flag-tn :extra (pad-data-block ,size)) + ;; The pseudo-atomic bit in alloc-tn is set. If the lowtag also + ;; has a 1 bit in the same position, we're all set. Otherwise, + ;; we need to subtract the pseudo-atomic bit. + (inst or ,result-tn alloc-tn ,lowtag) + (unless (logbitp (1- n-lowtag-bits) ,lowtag) + (inst sub ,result-tn 1)) + (inst li ,temp-tn (logior (ash (1- ,size) n-widetag-bits) ,type-code)) + (storew ,temp-tn ,result-tn 0 ,lowtag) + ,@body)))) (defun align-csp (temp) ;; is used for stack allocation of dynamic-extent objects Index: move.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/mips/move.lisp,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- move.lisp 14 Jul 2005 18:48:32 -0000 1.4 +++ move.lisp 1 Sep 2007 18:11:11 -0000 1.5 @@ -210,7 +210,7 @@ (inst sll y x 2) (with-fixed-allocation - (y pa-flag temp bignum-widetag (1+ bignum-digits-offset)) + (y pa-flag temp bignum-widetag (1+ bignum-digits-offset) nil) (storew x y bignum-digits-offset other-pointer-lowtag)) (inst b done) (inst nop) Index: sap.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/mips/sap.lisp,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- sap.lisp 7 Sep 2005 22:20:47 -0000 1.6 +++ sap.lisp 1 Sep 2007 18:11:11 -0000 1.7 @@ -32,7 +32,7 @@ (:results (res :scs (descriptor-reg))) (:note "SAP to pointer coercion") (:generator 20 - (with-fixed-allocation (res pa-flag ndescr sap-widetag sap-size) + (with-fixed-allocation (res pa-flag ndescr sap-widetag sap-size nil) (storew sap res sap-pointer-slot other-pointer-lowtag)))) (define-move-vop move-from-sap :move |