X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcompiler%2Fppc%2Fvalues.lisp;fp=src%2Fcompiler%2Fppc%2Fvalues.lisp;h=c3b2340335e885583b646403a281e6b67920b6c6;hb=1b3b1bae94f0964c1727a32c6356d337042fbd34;hp=9e0efc2e09df25e0b38aaa23b2084ed5bee212f4;hpb=f1acc17f83cdfa9454a53bd0ee9bd0e9b9482817;p=sbcl.git diff --git a/src/compiler/ppc/values.lisp b/src/compiler/ppc/values.lisp index 9e0efc2..c3b2340 100644 --- a/src/compiler/ppc/values.lisp +++ b/src/compiler/ppc/values.lisp @@ -11,6 +11,41 @@ (:generator 1 (move csp-tn ptr))) +;;; sparc version translated to ppc by David Steuber with help from #lisp. +(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 mr dest last-nipped-ptr) + (inst mr src last-preserved-ptr) + (inst cmplw csp-tn src) + (inst ble DONE) + LOOP + (loadw temp src) + (inst addi dest dest n-word-bytes) + (inst addi src src n-word-bytes) + (storew temp dest -1) + (inst cmplw csp-tn src) + (inst bgt LOOP) + DONE + (inst mr 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 to the standard