1 /*	$NetBSD: fpu.h,v 1.1 2003/04/26 18:39:40 fvdl Exp $	*/
2 
3 #ifndef	_AMD64_FPU_H_
4 #define	_AMD64_FPU_H_
5 
6 /*
7  * NetBSD/amd64 only uses the extended save/restore format used
8  * by fxsave/fsrestore, to always deal with the SSE registers,
9  * which are part of the ABI to pass floating point values.
10  * Must be stored in memory on a 16-byte boundary.
11  */
12 
13 struct fxsave64 {
14 	u_int16_t  fx_fcw;
15 	u_int16_t  fx_fsw;
16 	u_int8_t   fx_ftw;
17 	u_int8_t   fx_unused1;
18 	u_int16_t  fx_fop;
19 	u_int64_t  fx_rip;
20 	u_int64_t  fx_rdp;
21 	u_int32_t  fx_mxcsr;
22 	u_int32_t  fx_mxcsr_mask;
23 	u_int64_t  fx_st[8][2];   /* 8 normal FP regs */
24 	u_int64_t  fx_xmm[16][2]; /* 16 SSE2 registers */
25 	u_int8_t   fx_unused3[96];
26 } __attribute__((packed));
27 
28 struct savefpu {
29 	struct fxsave64 fp_fxsave;	/* see above */
30 	u_int16_t fp_ex_sw;		/* saved status from last exception */
31 	u_int16_t fp_ex_tw;		/* saved tag from last exception */
32 };
33 
34 #ifdef _KERNEL
35 
36 /*
37  * This one only used for backward compat coredumping.
38  */
39 struct oldfsave {
40 	u_int16_t	fs_control;
41 	u_int16_t	fs_unused0;
42 	u_int16_t	fs_status;
43 	u_int16_t	fs_unused1;
44 	u_int16_t	fs_tag;
45 	u_int16_t	fs_unused2;
46 	u_int32_t	fs_ipoff;
47 	u_int16_t	fs_ipsel;
48 	u_int16_t	fs_op;
49 	u_int32_t	fs_opoff;
50 	u_int16_t	fs_opsel;
51 } __attribute__ ((packed));
52 
53 #endif
54 
55 
56 /*
57  * The i387 defaults to Intel extended precision mode and round to nearest,
58  * with all exceptions masked.
59  */
60 #define	__INITIAL_NPXCW__	0x037f
61 #define __INITIAL_MXCSR__ 	0x1f80
62 #define __INITIAL_MXCSR_MASK__	0xffbf
63 
64 /* NetBSD uses IEEE double precision. */
65 #define	__NetBSD_NPXCW__	0x127f
66 /* Linux just uses the default control word. */
67 #define	__Linux_NPXCW__		0x037f
68 
69 /*
70  * The standard control word from finit is 0x37F, giving:
71  *	round to nearest
72  *	64-bit precision
73  *	all exceptions masked.
74  *
75  * Now we want:
76  *	affine mode (if we decide to support 287's)
77  *	round to nearest
78  *	53-bit precision
79  *	all exceptions masked.
80  *
81  * 64-bit precision often gives bad results with high level languages
82  * because it makes the results of calculations depend on whether
83  * intermediate values are stored in memory or in FPU registers.
84  */
85 
86 #ifdef _KERNEL
87 /*
88  * XXX
89  */
90 struct trapframe;
91 struct cpu_info;
92 
93 void fpuinit(struct cpu_info *);
94 void fpudrop(void);
95 void fpusave(struct lwp *);
96 void fpudiscard(struct lwp *);
97 void fputrap(struct trapframe *);
98 void fpusave_lwp(struct lwp *, int);
99 void fpusave_cpu(struct cpu_info *, int);
100 
101 #endif
102 
103 #endif /* _AMD64_FPU_H_ */
104