sh: Minor optimisations to FPU handling
[safe/jmp/linux-2.6] / arch / sh / include / asm / fpu.h
index bfd78e1..d7709c0 100644 (file)
@@ -18,17 +18,14 @@ static inline void grab_fpu(struct pt_regs *regs)
 
 struct task_struct;
 
-extern void save_fpu(struct task_struct *__tsk, struct pt_regs *regs);
+extern void save_fpu(struct task_struct *__tsk);
 void fpu_state_restore(struct pt_regs *regs);
 #else
 
+#define save_fpu(tsk)          do { } while (0)
 #define release_fpu(regs)      do { } while (0)
 #define grab_fpu(regs)         do { } while (0)
 
-static inline void save_fpu(struct task_struct *tsk, struct pt_regs *regs)
-{
-       clear_tsk_thread_flag(tsk, TIF_USEDFPU);
-}
 #endif
 
 struct user_regset;
@@ -40,21 +37,28 @@ extern int fpregs_get(struct task_struct *target,
                      unsigned int pos, unsigned int count,
                      void *kbuf, void __user *ubuf);
 
+static inline void __unlazy_fpu(struct task_struct *tsk, struct pt_regs *regs)
+{
+       if (task_thread_info(tsk)->status & TS_USEDFPU) {
+               task_thread_info(tsk)->status &= ~TS_USEDFPU;
+               save_fpu(tsk);
+               release_fpu(regs);
+       } else
+               tsk->fpu_counter = 0;
+}
+
 static inline void unlazy_fpu(struct task_struct *tsk, struct pt_regs *regs)
 {
        preempt_disable();
-       if (test_tsk_thread_flag(tsk, TIF_USEDFPU))
-               save_fpu(tsk, regs);
-       else
-               tsk->fpu_counter = 0;
+       __unlazy_fpu(tsk, regs);
        preempt_enable();
 }
 
 static inline void clear_fpu(struct task_struct *tsk, struct pt_regs *regs)
 {
        preempt_disable();
-       if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) {
-               clear_tsk_thread_flag(tsk, TIF_USEDFPU);
+       if (task_thread_info(tsk)->status & TS_USEDFPU) {
+               task_thread_info(tsk)->status &= ~TS_USEDFPU;
                release_fpu(regs);
        }
        preempt_enable();