]> bbs.cooldavid.org Git - net-next-2.6.git/blame - arch/sh/include/asm/fpu.h
sh: add sleazy FPU optimization
[net-next-2.6.git] / arch / sh / include / asm / fpu.h
CommitLineData
332fd57b
PM
1#ifndef __ASM_SH_FPU_H
2#define __ASM_SH_FPU_H
3
332fd57b 4#ifndef __ASSEMBLY__
9bbafce2 5#include <linux/preempt.h>
332fd57b
PM
6#include <asm/ptrace.h>
7
8#ifdef CONFIG_SH_FPU
9static inline void release_fpu(struct pt_regs *regs)
10{
11 regs->sr |= SR_FD;
12}
13
14static inline void grab_fpu(struct pt_regs *regs)
15{
16 regs->sr &= ~SR_FD;
17}
18
19struct task_struct;
20
21extern void save_fpu(struct task_struct *__tsk, struct pt_regs *regs);
a0458b07 22void fpu_state_restore(struct pt_regs *regs);
332fd57b 23#else
138bed15 24
332fd57b
PM
25#define release_fpu(regs) do { } while (0)
26#define grab_fpu(regs) do { } while (0)
138bed15
PM
27
28static inline void save_fpu(struct task_struct *tsk, struct pt_regs *regs)
29{
30 clear_tsk_thread_flag(tsk, TIF_USEDFPU);
31}
332fd57b
PM
32#endif
33
e7ab3cd2
PM
34struct user_regset;
35
74d99a5e
PM
36extern int do_fpu_inst(unsigned short, struct pt_regs *);
37
e7ab3cd2
PM
38extern 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
9bbafce2
PM
43static 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);
a0458b07
GC
48 else
49 tsk->fpu_counter = 0;
9bbafce2
PM
50 preempt_enable();
51}
52
53static 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}
332fd57b 62
e7ab3cd2
PM
63static 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
332fd57b
PM
75#endif /* __ASSEMBLY__ */
76
77#endif /* __ASM_SH_FPU_H */