diff --git a/compiler/mips/macros.lisp b/compiler/mips/macros.lisp
index e50bff2ac91e8665d139460e5c240877cfb83ac3..6f91705a2f3394c10d756bdff31593fdf83eccc2 100644
--- a/compiler/mips/macros.lisp
+++ b/compiler/mips/macros.lisp
@@ -7,7 +7,7 @@
 ;;; Scott Fahlman (FAHLMAN@CMUC). 
 ;;; **********************************************************************
 ;;;
-;;; $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/mips/macros.lisp,v 1.27 1990/03/29 16:24:42 wlott Exp $
+;;; $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/mips/macros.lisp,v 1.28 1990/04/05 23:53:30 wlott Exp $
 ;;;
 ;;;    This file contains various useful macros for generating MIPS code.
 ;;;
@@ -154,22 +154,40 @@
 ;;;    Move a stack TN to a register and vice-versa.
 ;;;
 (defmacro load-stack-tn (reg stack)
-  (once-only ((n-reg reg)
-	      (n-stack stack))
-    `(sc-case ,n-reg
-       ((any-reg descriptor-reg base-character-reg sap-reg)
-	(sc-case ,n-stack
-	  ((control-stack number-stack base-character-stack sap-stack)
-	   (loadw ,n-reg cont-tn (tn-offset ,n-stack))))))))
+  `(let ((reg ,reg)
+	 (stack ,stack))
+     (let ((offset (tn-offset stack)))
+       (sc-case stack
+	 ((control-stack)
+	  (loadw reg cont-tn offset))
+	 ((number-stack base-character-stack sap-stack)
+	  (multiple-value-bind (cs-size ns-size)
+			       (current-frame-size)
+	    (declare (ignore cs-size))
+	    (unless (< (* offset vm:word-bytes) ns-size)
+	      (cerror "Go ahead."
+		      "~S is ~D words offset in the number stack, but ~
+		      the number stack is only ~D words long."
+		      stack offset (/ ns-size 4)))
+	    (loadw reg nsp-tn (- offset (/ ns-size vm:word-bytes)))))))))
 
 (defmacro store-stack-tn (stack reg)
-  (once-only ((n-stack stack)
-	      (n-reg reg))
-    `(sc-case ,n-reg
-       ((any-reg descriptor-reg base-character-reg sap-reg)
-	(sc-case ,n-stack
-	  ((control-stack number-stack base-character-stack sap-stack)
-	   (storew ,n-reg cont-tn (tn-offset ,n-stack))))))))
+  `(let ((stack ,stack)
+	 (reg ,reg))
+     (let ((offset (tn-offset stack)))
+       (sc-case stack
+	 ((control-stack)
+	  (storew reg cont-tn offset))
+	 ((number-stack base-character-stack sap-stack)
+	  (multiple-value-bind (cs-size ns-size)
+			       (current-frame-size)
+	    (declare (ignore cs-size))
+	    (unless (< (* offset vm:word-bytes) ns-size)
+	      (cerror "Go ahead."
+		      "~S is ~D words offset in the number stack, but ~
+		      the number stack is only ~D words long."
+		      stack offset (/ ns-size 4)))
+	    (storew reg nsp-tn (- offset (/ ns-size vm:word-bytes)))))))))
 
 
 ;;;; Three Way Comparison