1 |
gbeauche |
1.1 |
/* |
2 |
|
|
* fpu_x86.h - 68881/68040 fpu code for x86/Windows and Linux/x86. |
3 |
|
|
* |
4 |
|
|
* Basilisk II (C) 1997-2001 Christian Bauer |
5 |
|
|
* |
6 |
|
|
* MC68881 emulation |
7 |
|
|
* |
8 |
|
|
* Based on UAE FPU, original copyright 1996 Herman ten Brugge, |
9 |
|
|
* rewritten by Lauri Pesonen 1999-2000, |
10 |
|
|
* accomodated to GCC's Extended Asm syntax by Gwenole Beauchesne 2000. |
11 |
|
|
* |
12 |
|
|
* This program is free software; you can redistribute it and/or modify |
13 |
|
|
* it under the terms of the GNU General Public License as published by |
14 |
|
|
* the Free Software Foundation; either version 2 of the License, or |
15 |
|
|
* (at your option) any later version. |
16 |
|
|
* |
17 |
|
|
* This program is distributed in the hope that it will be useful, |
18 |
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
19 |
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
20 |
|
|
* GNU General Public License for more details. |
21 |
|
|
* |
22 |
|
|
* You should have received a copy of the GNU General Public License |
23 |
|
|
* along with this program; if not, write to the Free Software |
24 |
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
25 |
|
|
*/ |
26 |
|
|
|
27 |
|
|
/* gb-- defined in newcpu.h |
28 |
|
|
// is_integral: true == 68040, false == 68881 |
29 |
|
|
void fpu_set_integral_fpu( bool is_integral ); |
30 |
|
|
|
31 |
|
|
// MUST be called before the cpu starts up. |
32 |
|
|
void fpu_init( void ); |
33 |
|
|
|
34 |
|
|
// Finalize. |
35 |
|
|
void fpu_exit( void ); |
36 |
|
|
|
37 |
|
|
// Soft reset. |
38 |
|
|
void fpu_reset( void ); |
39 |
|
|
*/ |
40 |
|
|
|
41 |
|
|
// The same as original. "ftrapcc_opp" is bound to change soon. |
42 |
|
|
/* gb-- defined in newcpu.h |
43 |
|
|
void REGPARAM2 fpp_opp (uae_u32, uae_u16); |
44 |
|
|
void REGPARAM2 fdbcc_opp (uae_u32, uae_u16); |
45 |
|
|
void REGPARAM2 fscc_opp (uae_u32, uae_u16); |
46 |
|
|
void REGPARAM2 ftrapcc_opp (uae_u32,uaecptr); |
47 |
|
|
void REGPARAM2 fbcc_opp (uae_u32, uaecptr, uae_u32); |
48 |
|
|
void REGPARAM2 fsave_opp (uae_u32); |
49 |
|
|
void REGPARAM2 frestore_opp (uae_u32); |
50 |
|
|
*/ |
51 |
|
|
|
52 |
|
|
/* ---------------------------- Motorola ---------------------------- */ |
53 |
|
|
|
54 |
|
|
// Exception byte |
55 |
|
|
#define BSUN 0x00008000 |
56 |
|
|
#define SNAN 0x00004000 |
57 |
|
|
#define OPERR 0x00002000 |
58 |
|
|
#define OVFL 0x00001000 |
59 |
|
|
#define UNFL 0x00000800 |
60 |
|
|
#define DZ 0x00000400 |
61 |
|
|
#define INEX2 0x00000200 |
62 |
|
|
#define INEX1 0x00000100 |
63 |
|
|
|
64 |
|
|
// Accrued exception byte |
65 |
|
|
#define ACCR_IOP 0x80 |
66 |
|
|
#define ACCR_OVFL 0x40 |
67 |
|
|
#define ACCR_UNFL 0x20 |
68 |
|
|
#define ACCR_DZ 0x10 |
69 |
|
|
#define ACCR_INEX 0x08 |
70 |
|
|
|
71 |
|
|
// fpcr rounding modes |
72 |
|
|
#define ROUND_CONTROL_MASK 0x30 |
73 |
|
|
#define ROUND_TO_NEAREST 0 |
74 |
|
|
#define ROUND_TO_ZERO 0x10 |
75 |
|
|
#define ROUND_TO_NEGATIVE_INFINITY 0x20 |
76 |
|
|
#define ROUND_TO_POSITIVE_INFINITY 0x30 |
77 |
|
|
|
78 |
|
|
// fpcr precision control |
79 |
|
|
#define PRECISION_CONTROL_MASK 0xC0 |
80 |
|
|
#define PRECISION_CONTROL_EXTENDED 0 |
81 |
|
|
#define PRECISION_CONTROL_DOUBLE 0x80 |
82 |
|
|
#define PRECISION_CONTROL_SINGLE 0x40 |
83 |
|
|
#define PRECISION_CONTROL_UNDEFINED 0xC0 |
84 |
|
|
|
85 |
|
|
|
86 |
|
|
/* ---------------------------- Intel ---------------------------- */ |
87 |
|
|
|
88 |
|
|
#define CW_RESET 0x0040 // initial CW value after RESET |
89 |
|
|
#define CW_FINIT 0x037F // initial CW value after FINIT |
90 |
|
|
#define SW_RESET 0x0000 // initial SW value after RESET |
91 |
|
|
#define SW_FINIT 0x0000 // initial SW value after FINIT |
92 |
|
|
#define TW_RESET 0x5555 // initial TW value after RESET |
93 |
|
|
#define TW_FINIT 0x0FFF // initial TW value after FINIT |
94 |
|
|
|
95 |
|
|
#define CW_X 0x1000 // infinity control |
96 |
|
|
#define CW_RC_ZERO 0x0C00 // rounding control toward zero |
97 |
|
|
#define CW_RC_UP 0x0800 // rounding control toward + |
98 |
|
|
#define CW_RC_DOWN 0x0400 // rounding control toward - |
99 |
|
|
#define CW_RC_NEAR 0x0000 // rounding control toward even |
100 |
|
|
#define CW_PC_EXTENDED 0x0300 // precision control 64bit |
101 |
|
|
#define CW_PC_DOUBLE 0x0200 // precision control 53bit |
102 |
|
|
#define CW_PC_RESERVED 0x0100 // precision control reserved |
103 |
|
|
#define CW_PC_SINGLE 0x0000 // precision control 24bit |
104 |
|
|
#define CW_PM 0x0020 // precision exception mask |
105 |
|
|
#define CW_UM 0x0010 // underflow exception mask |
106 |
|
|
#define CW_OM 0x0008 // overflow exception mask |
107 |
|
|
#define CW_ZM 0x0004 // zero divide exception mask |
108 |
|
|
#define CW_DM 0x0002 // denormalized operand exception mask |
109 |
|
|
#define CW_IM 0x0001 // invalid operation exception mask |
110 |
|
|
|
111 |
|
|
#define SW_B 0x8000 // busy flag |
112 |
|
|
#define SW_C3 0x4000 // condition code flag 3 |
113 |
|
|
#define SW_TOP_7 0x3800 // top of stack = ST(7) |
114 |
|
|
#define SW_TOP_6 0x3000 // top of stack = ST(6) |
115 |
|
|
#define SW_TOP_5 0x2800 // top of stack = ST(5) |
116 |
|
|
#define SW_TOP_4 0x2000 // top of stack = ST(4) |
117 |
|
|
#define SW_TOP_3 0x1800 // top of stack = ST(3) |
118 |
|
|
#define SW_TOP_2 0x1000 // top of stack = ST(2) |
119 |
|
|
#define SW_TOP_1 0x0800 // top of stack = ST(1) |
120 |
|
|
#define SW_TOP_0 0x0000 // top of stack = ST(0) |
121 |
|
|
#define SW_C2 0x0400 // condition code flag 2 |
122 |
|
|
#define SW_C1 0x0200 // condition code flag 1 |
123 |
|
|
#define SW_C0 0x0100 // condition code flag 0 |
124 |
|
|
#define SW_ES 0x0080 // error summary status flag |
125 |
|
|
#define SW_SF 0x0040 // stack fault flag |
126 |
|
|
#define SW_PE 0x0020 // precision exception flag |
127 |
|
|
#define SW_UE 0x0010 // underflow exception flag |
128 |
|
|
#define SW_OE 0x0008 // overflow exception flag |
129 |
|
|
#define SW_ZE 0x0004 // zero divide exception flag |
130 |
|
|
#define SW_DE 0x0002 // denormalized operand exception flag |
131 |
|
|
#define SW_IE 0x0001 // invalid operation exception flag |
132 |
|
|
|
133 |
|
|
#define X86_ROUND_CONTROL_MASK 0x0C00 |
134 |
|
|
#define X86_PRECISION_CONTROL_MASK 0x0300 |