diff --git a/compiler/ppc/c-call.lisp b/compiler/ppc/c-call.lisp
index 15e20da4fe23010a7f1bccef2d23b922fb083344..c765ee73f5a7329aaaef48517b5df299a7d21d4e 100644
--- a/compiler/ppc/c-call.lisp
+++ b/compiler/ppc/c-call.lisp
@@ -7,7 +7,7 @@
 ;;; Scott Fahlman or slisp-group@cs.cmu.edu.
 ;;;
 (ext:file-comment
-  "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/ppc/c-call.lisp,v 1.16 2005/11/17 03:33:45 rtoy Exp $")
+  "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/ppc/c-call.lisp,v 1.17 2005/11/20 03:17:41 rtoy Exp $")
 ;;;
 ;;; **********************************************************************
 ;;;
@@ -496,11 +496,14 @@ a pointer to the arguments."
 				      linkage-area-size)))
 		       (cond
 			 (integerp
-			  (loop repeat words
-			    for gpr = (pop gprs)
-			    when gpr do
-			    (inst stw gpr sp offset)
-			    do (incf words-processed)))
+			  (dotimes (k words)
+			    (let ((gpr (pop gprs)))
+			      (cond (gpr
+				     (inst stw gpr sp offset)
+				     (incf words-processed)
+				     (incf offset vm:word-bytes))
+				    (t
+				     (error "Out of integer arg registers!?!?"))))))
 			 ;; The handling of floats is a little ugly because we
 			 ;; hard-code the number of words for single- and
 			 ;; double-floats.
@@ -537,7 +540,7 @@ a pointer to the arguments."
 	      (inst li arg2 (fixnumize index))
 	      (inst addi arg3 sp linkage-area-size)
 	      (inst addi arg4 sp (- (* return-area-size vm:word-bytes)))
-	      ;; FIXME!
+
 	      ;; Save sp, setup the frame
 	      (inst mflr r0)
 	      (inst stw r0 sp (* 2 vm:word-bytes))
@@ -558,7 +561,8 @@ a pointer to the arguments."
 		 (loop repeat return-area-size
 		   with gprs = (mapcar #'make-gpr '(3 4))
 		   for gpr = (pop gprs)
-		   for offset downfrom (- vm:word-bytes) by vm:word-bytes
+		   for offset from (- (* return-area-size vm:word-bytes))
+		              by vm:word-bytes
 		   do (inst lwz gpr sp offset)))
 		(alien::single$
 		 ;; Get the FP value into F1