X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fsparc%2Fvalues.lisp;h=a7ac2b1cbf5c8db962d10fa4f8313c5b2ba95fad;hb=2db410feb35e7e30c95af8f20f67e6177fa92488;hp=1a83482412e8aec44b81f0e91bceac17e32e52d9;hpb=68fd2d2dd6f265669a8957accd8a33e62786a97e;p=sbcl.git diff --git a/src/compiler/sparc/values.lisp b/src/compiler/sparc/values.lisp index 1a83482..a7ac2b1 100644 --- a/src/compiler/sparc/values.lisp +++ b/src/compiler/sparc/values.lisp @@ -16,6 +16,61 @@ (:generator 1 (move csp-tn ptr))) +(define-vop (%%pop-dx) + (:args (ptr :scs (any-reg))) + (:ignore ptr) + (:generator 1 + (bug "VOP %%POP-DX is not implemented."))) + +(define-vop (%%nip-dx) + (:args (last-nipped-ptr :scs (any-reg) :target dest) + (last-preserved-ptr :scs (any-reg) :target src) + (moved-ptrs :scs (any-reg) :more t)) + (:results (r-moved-ptrs :scs (any-reg) :more t)) + (:temporary (:sc any-reg) src) + (:temporary (:sc any-reg) dest) + (:temporary (:sc non-descriptor-reg) temp) + (:ignore r-moved-ptrs + last-nipped-ptr last-preserved-ptr moved-ptrs + src dest temp) + (:generator 1 + (bug "VOP %%NIP-DX is not implemented."))) + +(define-vop (%%nip-values) + (:args (last-nipped-ptr :scs (any-reg) :target dest) + (last-preserved-ptr :scs (any-reg) :target src) + (moved-ptrs :scs (any-reg) :more t)) + (:results (r-moved-ptrs :scs (any-reg) :more t)) + (:temporary (:sc any-reg) src) + (:temporary (:sc any-reg) dest) + (:temporary (:sc non-descriptor-reg) temp) + (:ignore r-moved-ptrs) + (:generator 1 + (inst move dest last-nipped-ptr) + (inst move src last-preserved-ptr) + (inst cmp csp-tn src) + (inst b :le DONE) + (inst nop) ; not strictly necessary + LOOP + (loadw temp src) + (inst add dest dest n-word-bytes) + (inst add src src n-word-bytes) + (storew temp dest -1) + (inst cmp csp-tn src) + (inst b :gt LOOP) + (inst nop) + DONE + (inst move csp-tn dest) + (inst sub src src dest) + (loop for moved = moved-ptrs then (tn-ref-across moved) + while moved + do (sc-case (tn-ref-tn moved) + ((descriptor-reg any-reg) + (inst sub (tn-ref-tn moved) (tn-ref-tn moved) src)) + ((control-stack) + (load-stack-tn temp (tn-ref-tn moved)) + (inst sub temp temp src) + (store-stack-tn (tn-ref-tn moved) temp)))))) ;;; Push some values onto the stack, returning the start and number of ;;; values pushed as results. It is assumed that the Vals are wired @@ -29,22 +84,22 @@ (define-vop (push-values) (:args (vals :more t)) (:results (start :scs (any-reg) :from :load) - (count :scs (any-reg))) + (count :scs (any-reg))) (:info nvals) (:temporary (:scs (descriptor-reg)) temp) (:generator 20 (inst move start csp-tn) (inst add csp-tn csp-tn (* nvals n-word-bytes)) (do ((val vals (tn-ref-across val)) - (i 0 (1+ i))) - ((null val)) + (i 0 (1+ i))) + ((null val)) (let ((tn (tn-ref-tn val))) - (sc-case tn - (descriptor-reg - (storew tn start i)) - (control-stack - (load-stack-tn temp tn) - (storew temp start i))))) + (sc-case tn + (descriptor-reg + (storew tn start i)) + (control-stack + (load-stack-tn temp tn) + (storew temp start i))))) (inst li count (fixnumize nvals)))) ;;; Push a list of values on the stack, returning Start and Count as @@ -54,7 +109,7 @@ (:arg-types list) (:policy :fast-safe) (:results (start :scs (any-reg)) - (count :scs (any-reg))) + (count :scs (any-reg))) (:temporary (:scs (descriptor-reg) :type list :from (:argument 0)) list) (:temporary (:scs (descriptor-reg)) temp) (:temporary (:scs (non-descriptor-reg)) ndescr) @@ -62,7 +117,7 @@ (:save-p :compute-only) (:generator 0 (let ((loop (gen-label)) - (done (gen-label))) + (done (gen-label))) (move list arg) (move start csp-tn) @@ -74,7 +129,7 @@ (loadw list list cons-cdr-slot list-pointer-lowtag) (inst add csp-tn csp-tn n-word-bytes) (storew temp csp-tn -1) - (test-type list ndescr loop nil list-pointer-lowtag) + (test-type list loop nil (list-pointer-lowtag) :temp ndescr) (error-call vop bogus-arg-to-values-list-error list) (emit-label done) @@ -86,15 +141,15 @@ ;;; as function arguments. (define-vop (%more-arg-values) (:args (context :scs (descriptor-reg any-reg) :target src) - (skip :scs (any-reg zero immediate)) - (num :scs (any-reg) :target count)) + (skip :scs (any-reg zero immediate)) + (num :scs (any-reg) :target count)) (:arg-types * positive-fixnum positive-fixnum) (:temporary (:sc any-reg :from (:argument 0)) src) (:temporary (:sc any-reg :from (:argument 2)) dst) (:temporary (:sc descriptor-reg :from (:argument 1)) temp) (:temporary (:sc any-reg) i) (:results (start :scs (any-reg)) - (count :scs (any-reg))) + (count :scs (any-reg))) (:generator 20 (sc-case skip (zero