sh: add sleazy FPU optimization
[safe/jmp/linux-2.6] / arch / sh / include / asm / fpu.h
1 #ifndef __ASM_SH_FPU_H
2 #define __ASM_SH_FPU_H
3
4 #ifndef __ASSEMBLY__
5 #include <linux/preempt.h>
6 #include <asm/ptrace.h>
7
8 #ifdef CONFIG_SH_FPU
9 static inline void release_fpu(struct pt_regs *regs)
10 {
11         regs->sr |= SR_FD;
12 }
13
14 static inline void grab_fpu(struct pt_regs *regs)
15 {
16         regs->sr &= ~SR_FD;
17 }
18
19 struct task_struct;
20
21 extern void save_fpu(struct task_struct *__tsk, struct pt_regs *regs);
22 void fpu_state_restore(struct pt_regs *regs);
23 #else
24
25 #define release_fpu(regs)       do { } while (0)
26 #define grab_fpu(regs)          do { } while (0)
27
28 static inline void save_fpu(struct task_struct *tsk, struct pt_regs *regs)
29 {
30         clear_tsk_thread_flag(tsk, TIF_USEDFPU);
31 }
32 #endif
33
34 struct user_regset;
35
36 extern int do_fpu_inst(unsigned short, struct pt_regs *);
37
38 extern int fpregs_get(struct task_struct *target,
39                       const struct user_regset *regset,
40                       unsigned int pos, unsigned int count,
41                       void *kbuf, void __user *ubuf);
42
43 static inline void unlazy_fpu(struct task_struct *tsk, struct pt_regs *regs)
44 {
45         preempt_disable();
46         if (test_tsk_thread_flag(tsk, TIF_USEDFPU))
47                 save_fpu(tsk, regs);
48         else
49                 tsk->fpu_counter = 0;
50         preempt_enable();
51 }
52
53 static inline void clear_fpu(struct task_struct *tsk, struct pt_regs *regs)
54 {
55         preempt_disable();
56         if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) {
57                 clear_tsk_thread_flag(tsk, TIF_USEDFPU);
58                 release_fpu(regs);
59         }
60         preempt_enable();
61 }
62
63 static inline int init_fpu(struct task_struct *tsk)
64 {
65         if (tsk_used_math(tsk)) {
66                 if ((boot_cpu_data.flags & CPU_HAS_FPU) && tsk == current)
67                         unlazy_fpu(tsk, task_pt_regs(tsk));
68                 return 0;
69         }
70
71         set_stopped_child_used_math(tsk);
72         return 0;
73 }
74
75 #endif /* __ASSEMBLY__ */
76
77 #endif /* __ASM_SH_FPU_H */