diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bb59539acc798468eacf377c4c7e6cbdeb3d4ed1..7f50b61561ba7cbf1021df3b8e4b9e7e26aba3f0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2007-09-13  Sandra Loosemore  <sandra@codesourcery.com>
+	    David Ung  <davidu@mips.com>
+
+	* config/mips/mips.h (ASM_OUTPUT_REG_PUSH): Replace {d}subu with
+	{d}addiu and a negative	immediate such that it works with MIPS16
+	instructions.
+	
 2007-09-13  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR bootstrap/33418
diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
index c9d2742860fcb94a9ca5ece00df1c26dc37db079..c8cad32133ff37f7c853a444b1f52fbe802f9536 100644
--- a/gcc/config/mips/mips.h
+++ b/gcc/config/mips/mips.h
@@ -2781,8 +2781,8 @@ do {									\
 #define ASM_OUTPUT_REG_PUSH(STREAM,REGNO)				\
 do									\
   {									\
-    fprintf (STREAM, "\t%s\t%s,%s,8\n\t%s\t%s,0(%s)\n",			\
-	     TARGET_64BIT ? "dsubu" : "subu",				\
+    fprintf (STREAM, "\t%s\t%s,%s,-8\n\t%s\t%s,0(%s)\n",		\
+	     TARGET_64BIT ? "daddiu" : "addiu",				\
 	     reg_names[STACK_POINTER_REGNUM],				\
 	     reg_names[STACK_POINTER_REGNUM],				\
 	     TARGET_64BIT ? "sd" : "sw",				\