static union sh_fpu_union init_fpuregs = {
        .hard = {
-         .fp_regs = { [0 ... 63] = sNAN32 },
-         .fpscr = FPSCR_INIT
+               .fp_regs = { [0 ... 63] = sNAN32 },
+               .fpscr = FPSCR_INIT
        }
 };
 
-inline void fpsave(struct sh_fpu_hard_struct *fpregs)
+void save_fpu(struct task_struct *tsk, struct pt_regs *regs)
 {
        asm volatile("fst.p     %0, (0*8), fp0\n\t"
                     "fst.p     %0, (1*8), fp2\n\t"
                     "fgetscr   fr63\n\t"
                     "fst.s     %0, (32*8), fr63\n\t"
                : /* no output */
-               : "r" (fpregs)
+               : "r" (&tsk->thread.fpu.hard)
                : "memory");
 }
 
-
 static inline void
 fpload(struct sh_fpu_hard_struct *fpregs)
 {
                return;
 
        enable_fpu();
-       if (last_task_used_math != NULL) {
+       if (last_task_used_math != NULL)
                /* Other processes fpu state, save away */
-               fpsave(&last_task_used_math->thread.fpu.hard);
-        }
+               save_fpu(last_task_used_math, regs);
+
         last_task_used_math = current;
         if (used_math()) {
                 fpload(¤t->thread.fpu.hard);
         }
        disable_fpu();
 }
-
 
        if (fpvalid) {
                if (current == last_task_used_math) {
                        enable_fpu();
-                       fpsave(&tsk->thread.fpu.hard);
+                       save_fpu(tsk, regs);
                        disable_fpu();
                        last_task_used_math = 0;
                        regs->sr |= SR_FD;
 #ifdef CONFIG_SH_FPU
        if(last_task_used_math == current) {
                enable_fpu();
-               fpsave(¤t->thread.fpu.hard);
+               save_fpu(current, regs);
                disable_fpu();
                last_task_used_math = NULL;
                regs->sr |= SR_FD;
 
 
        if (last_task_used_math == task) {
                enable_fpu();
-               fpsave(&task->thread.fpu.hard);
+               save_fpu(task, regs);
                disable_fpu();
                last_task_used_math = 0;
                regs->sr |= SR_FD;
                set_stopped_child_used_math(task);
        } else if (last_task_used_math == task) {
                enable_fpu();
-               fpsave(&task->thread.fpu.hard);
+               save_fpu(task, regs);
                disable_fpu();
                last_task_used_math = 0;
                regs->sr |= SR_FD;
 
 
        if (current == last_task_used_math) {
                enable_fpu();
-               fpsave(¤t->thread.fpu.hard);
+               save_fpu(current, regs);
                disable_fpu();
                last_task_used_math = NULL;
                regs->sr |= SR_FD;
 
                   indexed by register number. */
                if (last_task_used_math == current) {
                        enable_fpu();
-                       fpsave(¤t->thread.fpu.hard);
+                       save_fpu(current, regs);
                        disable_fpu();
                        last_task_used_math = NULL;
                        regs->sr |= SR_FD;
                   indexed by register number. */
                if (last_task_used_math == current) {
                        enable_fpu();
-                       fpsave(¤t->thread.fpu.hard);
+                       save_fpu(current, regs);
                        disable_fpu();
                        last_task_used_math = NULL;
                        regs->sr |= SR_FD;
 
--- /dev/null
+#ifndef __ASM_SH_FPU_H
+#define __ASM_SH_FPU_H
+
+#define SR_FD    0x00008000
+
+#ifndef __ASSEMBLY__
+#include <asm/ptrace.h>
+
+#ifdef CONFIG_SH_FPU
+static inline void release_fpu(struct pt_regs *regs)
+{
+       regs->sr |= SR_FD;
+}
+
+static inline void grab_fpu(struct pt_regs *regs)
+{
+       regs->sr &= ~SR_FD;
+}
+
+struct task_struct;
+
+extern void save_fpu(struct task_struct *__tsk, struct pt_regs *regs);
+#else
+#define release_fpu(regs)      do { } while (0)
+#define grab_fpu(regs)         do { } while (0)
+#define save_fpu(tsk, regs)    do { } while (0)
+#endif
+
+#define unlazy_fpu(tsk, regs) do {                     \
+       if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) {   \
+               save_fpu(tsk, regs);                    \
+       }                                               \
+} while (0)
+
+#define clear_fpu(tsk, regs) do {                              \
+       if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) {           \
+               clear_tsk_thread_flag(tsk, TIF_USEDFPU);        \
+               release_fpu(regs);                              \
+       }                                                       \
+} while (0)
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* __ASM_SH_FPU_H */
 
 #define __ASM_SH_PROCESSOR_H
 
 #include <asm/cpu-features.h>
+#include <asm/fpu.h>
 
 #ifndef __ASSEMBLY__
-
 /*
  *  CPU type and hardware bug flags. Kept separately for each CPU.
  *
 
  * IMASK-bit:
  *     Interrupt level mask
  */
-#define SR_FD          0x00008000
 #define SR_DSP         0x00001000
 #define SR_IMASK       0x000000f0
 
                             : "r" (~SR_FD));
 }
 
-static __inline__ void release_fpu(struct pt_regs *regs)
-{
-       regs->sr |= SR_FD;
-}
-
-static __inline__ void grab_fpu(struct pt_regs *regs)
-{
-       regs->sr &= ~SR_FD;
-}
-
-extern void save_fpu(struct task_struct *__tsk, struct pt_regs *regs);
-
-#define unlazy_fpu(tsk, regs) do {                     \
-       if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) {   \
-               save_fpu(tsk, regs);                    \
-       }                                               \
-} while (0)
-
-#define clear_fpu(tsk, regs) do {                              \
-       if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) {           \
-               clear_tsk_thread_flag(tsk, TIF_USEDFPU);        \
-               release_fpu(regs);                              \
-       }                                                       \
-} while (0)
-
 /* Double presision, NANS as NANS, rounding to nearest, no exceptions */
 #define FPSCR_INIT  0x00080000
 
 
  *     Single step bit
  *
  */
-#define SR_FD    0x00008000
-
 #if defined(CONFIG_SH64_SR_WATCH)
 #define SR_MMU   0x84000000
 #else
                             : "r" (~SR_FD));
 }
 
-static inline void release_fpu(struct pt_regs *regs)
-{
-       regs->sr |= SR_FD;
-}
-
-static inline void grab_fpu(struct pt_regs *regs)
-{
-       regs->sr &= ~SR_FD;
-}
-
 /* Round to nearest, no exceptions on inexact, overflow, underflow,
    zero-divide, invalid.  Configure option for whether to flush denorms to
    zero, or except if a denorm is encountered.  */
 #endif
 
 #ifdef CONFIG_SH_FPU
-/* Save the current FP regs */
-void fpsave(struct sh_fpu_hard_struct *fpregs);
-
 /* Initialise the FP state of a task */
 void fpinit(struct sh_fpu_hard_struct *fpregs);
 #else
-#define fpsave(fpregs) do { } while (0)
 #define fpinit(fpregs) do { } while (0)
 #endif