diff -ruN /home/hwilliams/openembedded/build/tmp/work/ep9312-angstrom-linux-gnueabi/gcc-cross-4.1.2-r0/gcc-4.1.2/gcc/config/arm/arm.c gcc-4.1.2/gcc/config/arm/arm.c
--- /home/hwilliams/openembedded/build/tmp/work/ep9312-angstrom-linux-gnueabi/gcc-cross-4.1.2-r0/gcc-4.1.2/gcc/config/arm/arm.c	2007-05-09 16:32:29.000000000 +1000
+++ gcc-4.1.2/gcc/config/arm/arm.c	2007-05-15 09:39:41.000000000 +1000
@@ -426,7 +435,7 @@
 #define FL_STRONG     (1 << 8)	      /* StrongARM */
 #define FL_ARCH5E     (1 << 9)        /* DSP extensions to v5 */
 #define FL_XSCALE     (1 << 10)	      /* XScale */
-#define FL_CIRRUS     (1 << 11)	      /* Cirrus/DSP.  */
+#define FL_CIRRUS     (1 << 11)	      /* Cirrus Crunch coprocessor.  */
 #define FL_ARCH6      (1 << 12)       /* Architecture rel 6.  Adds
 					 media instructions.  */
 #define FL_VFPV2      (1 << 13)       /* Vector Floating Point V2.  */
@@ -490,7 +499,7 @@
 /* Nonzero if this chip is a StrongARM.  */
 int arm_tune_strongarm = 0;
 
-/* Nonzero if this chip is a Cirrus variant.  */
+/* Nonzero if this chip supports Cirrus Crunch coprocessor.  */
 int arm_arch_cirrus = 0;
 
 /* Nonzero if this chip supports Intel Wireless MMX technology.  */
@@ -1184,7 +1193,8 @@
       else
       */
       if (arm_arch_cirrus)
-	arm_fpu_arch = FPUTYPE_MAVERICK;
+        /* Cirrus crunch coprocessor still requires soft-float division.  */
+        arm_fpu_arch = FPUTYPE_MAVERICK;
       else
 	arm_fpu_arch = FPUTYPE_FPA_EMU2;
 #endif
@@ -1567,6 +1577,9 @@
       if (regs_ever_live[regno] && !call_used_regs[regno])
 	return 0;
 
+  if (TARGET_MAVERICK)
+    return 0;
+
   if (TARGET_REALLY_IWMMXT)
     for (regno = FIRST_IWMMXT_REGNUM; regno <= LAST_IWMMXT_REGNUM; regno++)
       if (regs_ever_live[regno] && ! call_used_regs [regno])
@@ -9775,7 +9886,19 @@
       /* This variable is for the Virtual Frame Pointer, not VFP regs.  */
       int vfp_offset = offsets->frame;
 
-      if (arm_fpu_arch == FPUTYPE_FPA_EMU2)
+      if (arm_fpu_arch == FPUTYPE_MAVERICK)
+    { 
+      for (reg = LAST_CIRRUS_FP_REGNUM; reg >= FIRST_CIRRUS_FP_REGNUM; reg--)
+        if (regs_ever_live[reg] && !call_used_regs[reg])
+          {
+        floats_offset += 8; /* more problems - futaris? */
+        /* if (TARGET_CIRRUS_D0 || TARGET_CIRRUS_D1) */
+            asm_fprintf (f, "\tnop\n");
+        asm_fprintf (f, "\tcfldrd\tmvd%d, [%r, #-%d]\n",
+                 reg - FIRST_CIRRUS_FP_REGNUM, FP_REGNUM, floats_offset - vfp_offset);
+          }
+    }
+      else if (arm_fpu_arch == FPUTYPE_FPA_EMU2)
 	{
 	  for (reg = LAST_FPA_REGNUM; reg >= FIRST_FPA_REGNUM; reg--)
 	    if (regs_ever_live[reg] && !call_used_regs[reg])
@@ -9924,7 +10047,18 @@
 	  output_add_immediate (operands);
 	}
 
-      if (arm_fpu_arch == FPUTYPE_FPA_EMU2)
+      if (arm_fpu_arch == FPUTYPE_MAVERICK)
+    { /* order changed - futaris */
+      for (reg = FIRST_CIRRUS_FP_REGNUM; reg <= LAST_CIRRUS_FP_REGNUM; reg++)
+        if (regs_ever_live[reg] && !call_used_regs[reg])
+          {
+            /* if (TARGET_CIRRUS_D0 || TARGET_CIRRUS_D1) */
+              asm_fprintf (f, "\tnop\n");
+            asm_fprintf (f, "\tcfldrd\tmvd%u, [%r], #8\n",
+                reg - FIRST_CIRRUS_FP_REGNUM, SP_REGNUM);
+	      } /* reg problems - futaris */
+	}
+      else if (arm_fpu_arch == FPUTYPE_FPA_EMU2)
 	{
 	  for (reg = FIRST_FPA_REGNUM; reg <= LAST_FPA_REGNUM; reg++)
 	    if (regs_ever_live[reg] && !call_used_regs[reg])
@@ -10429,9 +10563,19 @@
       if (! IS_VOLATILE (func_type))
 	{
+     /* Space for saved MAVERICK registers.  */
+      if (arm_fpu_arch == FPUTYPE_MAVERICK)
+	{
+	  for (regno = FIRST_CIRRUS_FP_REGNUM; regno <= LAST_CIRRUS_FP_REGNUM; regno++)
+	    if (regs_ever_live[regno] && !call_used_regs[regno])
+	      saved += 8; // 8 in 3.4.3 patch - futaris;
+	}
+      else
 	  /* Space for saved FPA registers.  */
+	{
 	  for (regno = FIRST_FPA_REGNUM; regno <= LAST_FPA_REGNUM; regno++)
 	  if (regs_ever_live[regno] && ! call_used_regs[regno])
 	    saved += 12;
+    }
 
 	  /* Space for saved VFP registers.  */
 	  if (TARGET_HARD_FLOAT && TARGET_VFP)
@@ -10739,7 +10882,19 @@
 
       /* Save any floating point call-saved registers used by this
 	 function.  */
-      if (arm_fpu_arch == FPUTYPE_FPA_EMU2)
+      if (arm_fpu_arch == FPUTYPE_MAVERICK)
+    { 
+      for (reg = LAST_CIRRUS_FP_REGNUM; reg >= FIRST_CIRRUS_FP_REGNUM; reg--)
+        if (regs_ever_live[reg] && !call_used_regs[reg])
+          {
+        insn = gen_rtx_PRE_DEC (DFmode, stack_pointer_rtx); /* think these causes problems */
+        insn = gen_rtx_MEM (DFmode, insn);
+        insn = emit_insn (gen_rtx_SET (VOIDmode, insn,
+                          gen_rtx_REG (DFmode, reg)));
+        RTX_FRAME_RELATED_P (insn) = 1; saved_regs += 8; /* added by futaris */
+	      }
+	}
+      else if (arm_fpu_arch == FPUTYPE_FPA_EMU2)
 	{
 	  for (reg = LAST_FPA_REGNUM; reg >= FIRST_FPA_REGNUM; reg--)
 	    if (regs_ever_live[reg] && !call_used_regs[reg])
@@ -15179,6 +15331,9 @@
   if (IS_FPA_REGNUM (regno))
     return (TARGET_AAPCS_BASED ? 96 : 16) + regno - FIRST_FPA_REGNUM;
 
+  if (IS_CIRRUS_REGNUM (regno))
+    return 28 + regno - FIRST_CIRRUS_FP_REGNUM;
+
   if (IS_VFP_REGNUM (regno))
     return 64 + regno - FIRST_VFP_REGNUM;
 
--- gcc-4.1.2/gcc/config/arm/arm.md-original	2007-06-28 15:42:36.000000000 +1000
+++ gcc-4.1.2/gcc/config/arm/arm.md	2007-06-28 15:42:48.000000000 +1000
@@ -9800,7 +9800,7 @@
   return arm_output_epilogue (next_nonnote_insn (insn));
   "
 ;; Length is absolute worst case
-  [(set_attr "length" "44")
+  [(set_attr "length" "108")
    (set_attr "type" "block")
    ;; We don't clobber the conditions, but the potential length of this
    ;; operation is sufficient to make conditionalizing the sequence 
@@ -9818,7 +9818,7 @@
     return thumb_unexpanded_epilogue ();
   "
   ; Length is absolute worst case
-  [(set_attr "length" "44")
+  [(set_attr "length" "108")
    (set_attr "type" "block")
    ;; We don't clobber the conditions, but the potential length of this
    ;; operation is sufficient to make conditionalizing the sequence 
