diff --git a/lisp/sparc-assem.S b/lisp/sparc-assem.S
index 3f41a021ef6a2a52156f892b40dba21ba48f5479..38ae96b05058a2af45f43ffbb82c6de1dcdb9ccb 100644
--- a/lisp/sparc-assem.S
+++ b/lisp/sparc-assem.S
@@ -280,11 +280,13 @@ _undefined_tramp:
         /* Number of argument bytes */
         .byte	4
         .byte	UNDEFINED_SYMBOL_ERROR
-        /* Escape to create 16bit BE number from following two values */
+        /* Escape to create 16bit number from following two bytes, 
+	   in little-endian order */
         .byte	254
         /* SC_OFFSET(sc_DescriptorReg,reg_FDEFN) */
-	.byte	sc_DescriptorReg
-	.byte	3
+	.byte	SC_OFFSET_LO(sc_DescriptorReg,reg_FDEFN_NUM)
+	.byte	SC_OFFSET_HI(sc_DescriptorReg,reg_FDEFN_NUM)
+		
 	.align	4
 1:
 	ld	[reg_FDEFN+FDEFN_RAW_ADDR_OFFSET], reg_CODE
@@ -405,8 +407,6 @@ _resolve_linkage_tramp:
 		
 	.global _undefined_foreign_symbol_trap
 	FUNCDEF(_undefined_foreign_symbol_trap)
-#define	SC_OFFSET_HI(sc, reg)	((sc | (reg << 5)) >> 8)
-#define	SC_OFFSET_LO(sc, reg)	((sc | (reg << 5)) & 0xff)
 /*
  * When we get called, %o0 contains the address of the data_vector object 
  * which is a string naming the bad symbol.
@@ -434,14 +434,11 @@ _undefined_foreign_symbol_trap:
 	unimp	trap_Error
 	.byte	4	/* Number of argument bytes */
 	.byte	UNDEFINED_FOREIGN_SYMBOL_ERROR
-        /* Escape to create 16bit BE number from following two values
-	   but bytes are given in little-endian order (!) */
+        /* Escape to create 16bit number from following two bytes, in 
+	   little-endian order */
         .byte	254
-        /* SC_OFFSET(sc_DescriptorReg,A0) = (offset << 5) | sc_DescriptorReg */
-	/* reg_A0 = 16.  See the defref for a0 in sparc/vm.lisp */
-		
-	.byte	SC_OFFSET_LO(sc_DescriptorReg, 16)
-	.byte	SC_OFFSET_HI(sc_DescriptorReg, 16)
+	.byte	SC_OFFSET_LO(sc_DescriptorReg, reg_A0_NUM)
+	.byte	SC_OFFSET_HI(sc_DescriptorReg, reg_A0_NUM)
 	.align	4
 					
 #endif
diff --git a/lisp/sparc-lispregs.h b/lisp/sparc-lispregs.h
index a8ad17c7f54b7aea1050ef3fdd03d16e959c9ca9..ff24f164f9b0f897238b8685ad5ae604d664ff01 100644
--- a/lisp/sparc-lispregs.h
+++ b/lisp/sparc-lispregs.h
@@ -1,4 +1,4 @@
-/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/sparc-lispregs.h,v 1.5 2000/10/27 19:42:31 dtc Exp $ */
+/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/sparc-lispregs.h,v 1.6 2002/11/13 17:14:18 toy Exp $ */
 
 
 
@@ -32,41 +32,87 @@
 
 #endif
 
+#define GREG_NUM(num) (num)
+#define OREG_NUM(num) ((num)+8)
+#define LREG_NUM(num) ((num)+16)
+#define IREG_NUM(num) ((num)+24)
+
 #define NREGS	(32)
 
+/*
+ * Define all the Lisp registers appropriately for assembly and C.
+ * The registers ending with NUM are meant for use in assembly
+ * routines where we need the register number for getting SC_OFFSET
+ */
 #define reg_ZERO	GREG(0)
+#define reg_ZERO_NUM	GREG_NUM(0)
 #define reg_ALLOC	GREG(1)
+#define reg_ALLOC_NUM	GREG_NUM(1)
 #define reg_NIL		GREG(2)
+#define reg_NIL_NUM	GREG_NUM(2)
 #define reg_CSP		GREG(3)
+#define reg_CSP_NUM	GREG_NUM(3)
 #define reg_CFP		GREG(4)
+#define reg_CFP_NUM	GREG_NUM(4)
 #define reg_BSP		GREG(5)
+#define reg_BSP_NUM	GREG_NUM(5)
 /* %g6 and %g7 are supposed to be reserved for the system */
 
 #define reg_NL0		OREG(0)
+#define reg_NL0_NUM	OREG_NUM(0)
 #define reg_NL1		OREG(1)
+#define reg_NL1_NUM	OREG_NUM(1)
 #define reg_NL2		OREG(2)
+#define reg_NL2_NUM	OREG_NUM(2)
 #define reg_NL3		OREG(3)
+#define reg_NL3_NUM	OREG_NUM(3)
 #define reg_NL4		OREG(4)
+#define reg_NL4_NUM	OREG_NUM(4)
 #define reg_NL5		OREG(5)
+#define reg_NL5_NUM	OREG_NUM(5)
 #define reg_NSP		OREG(6)
+#define reg_NSP_NUM	OREG_NUM(6)
 #define reg_NARGS	OREG(7)
+#define reg_NARGS_NUM	OREG_NUM(7)
 
 #define reg_A0		LREG(0)
+#define reg_A0_NUM	LREG_NUM(0)
 #define reg_A1		LREG(1)
+#define reg_A1_NUM	LREG_NUM(1)
 #define reg_A2		LREG(2)
+#define reg_A2_NUM	LREG_NUM(2)
 #define reg_A3		LREG(3)
+#define reg_A3_NUM	LREG_NUM(3)
 #define reg_A4		LREG(4)
+#define reg_A4_NUM	LREG_NUM(4)
 #define reg_A5		LREG(5)
+#define reg_A5_NUM	LREG_NUM(5)
 #define reg_OCFP	LREG(6)
+#define reg_OCFP_NUM	LREG_NUM(6)
 #define reg_LRA		LREG(7)
+#define reg_LRA_NUM	LREG_NUM(7)
 
 #define reg_FDEFN	IREG(0)
+#define reg_FDEFN_NUM	IREG_NUM(0)
 #define reg_LEXENV	IREG(1)
+#define reg_LEXENV_NUM	IREG_NUM(1)
 #define reg_L0		IREG(2)
+#define reg_L0_NUM	IREG_NUM(2)
 #define reg_NFP		IREG(3)
+#define reg_NFP_NUM	IREG_NUM(3)
 #define reg_CFUNC	IREG(4)
+#define reg_CFUNC_NUM	IREG_NUM(4)
 #define reg_CODE	IREG(5)
+#define reg_CODE_NUM	IREG_NUM(5)
 #define reg_LIP		IREG(7)
+#define reg_LIP_NUM	IREG_NUM(7)
+
+/*
+ * Macros to compute the SC_OFFSET value.  See read-var-integer and
+ * sc-offset and friends in debug-info.lisp
+ */
+#define	SC_OFFSET_HI(sc, reg)	((SC_OFFSET(sc,reg)) >> 8)
+#define	SC_OFFSET_LO(sc, reg)	((SC_OFFSET(sc,reg)) & 0xff)
 
 #define REGNAMES \
 	"ZERO",		"ALLOC",	"NULL",		"CSP", \