1 
2 /* single   : S  8*E 23*F */
3 /* double   : S 11*E 52*F */
4 /* extended : S 15*E 64*F */
5 /* E = 0 & F = 0 -> 0 */
6 /* E = MAX & F = 0 -> Infin */
7 /* E = MAX & F # 0 -> NotANumber */
8 /* E = biased by 127 (single) ,1023 (double) ,16383 (extended) */
9 
10 #define FPSR_BSUN       0x00008000
11 #define FPSR_SNAN       0x00004000
12 #define FPSR_OPERR      0x00002000
13 #define FPSR_OVFL       0x00001000
14 #define FPSR_UNFL       0x00000800
15 #define FPSR_DZ         0x00000400
16 #define FPSR_INEX2      0x00000200
17 #define FPSR_INEX1      0x00000100
18 
19 extern void fp_init_native(void);
20 #ifdef MSVC_LONG_DOUBLE
21 extern void fp_init_native_80(void);
22 #endif
23 extern void fp_init_softfloat(int);
24 extern void fpsr_set_exception(uae_u32 exception);
25 extern void fpu_modechange(void);
26 extern void fpu_clearstatus(void);
27 
28 #ifdef WINUAE_FOR_HATARI
29 extern double softfloat_tan(double v);
30 #endif
31 
32 
33 #if defined(CPU_i386) || defined(CPU_x86_64)
34 extern void init_fpucw_x87(void);
35 #ifdef MSVC_LONG_DOUBLE
36 extern void init_fpucw_x87_80(void);
37 #endif
38 #endif
39 
40 #define PREC_NORMAL 0
41 #define PREC_FLOAT 1
42 #define PREC_DOUBLE 2
43 #define PREC_EXTENDED 3
44 
45 #define FPU_FEATURE_EXCEPTIONS 1
46 #define FPU_FEATURE_DENORMALS 2
47 
48 typedef void (*FPP_ABQS)(fpdata*, fpdata*, uae_u64*, uae_u8*);
49 typedef void (*FPP_AB)(fpdata*, fpdata*);
50 typedef void (*FPP_ABP)(fpdata*, fpdata*, int);
51 typedef void (*FPP_A)(fpdata*);
52 
53 typedef bool (*FPP_IS)(fpdata*);
54 typedef void (*FPP_SET_MODE)(uae_u32);
55 typedef void (*FPP_GET_STATUS)(uae_u32*);
56 typedef void (*FPP_CLEAR_STATUS)(void);
57 typedef uae_u32 (*FPP_SUPPORT_FLAGS)(void);
58 
59 typedef void (*FPP_FROM_NATIVE)(fptype, fpdata*);
60 typedef void (*FPP_TO_NATIVE)(fptype*, fpdata*);
61 
62 typedef void (*FPP_FROM_INT)(fpdata*,uae_s32);
63 typedef uae_s64 (*FPP_TO_INT)(fpdata*, int);
64 
65 typedef void (*FPP_TO_SINGLE)(fpdata*, uae_u32);
66 typedef uae_u32 (*FPP_FROM_SINGLE)(fpdata*);
67 
68 typedef void (*FPP_TO_DOUBLE)(fpdata*, uae_u32, uae_u32);
69 typedef void (*FPP_FROM_DOUBLE)(fpdata*, uae_u32*, uae_u32*);
70 
71 typedef void (*FPP_TO_EXTEN)(fpdata*, uae_u32, uae_u32, uae_u32);
72 typedef void (*FPP_FROM_EXTEN)(fpdata*, uae_u32*, uae_u32*, uae_u32*);
73 
74 typedef void (*FPP_PACK)(fpdata*, uae_u32*, int);
75 
76 typedef const TCHAR* (*FPP_PRINT)(fpdata*,int);
77 typedef uae_u32 (*FPP_GET32)(void);
78 
79 typedef void (*FPP_DENORMALIZE)(fpdata*,int);
80 
81 extern FPP_PRINT fpp_print;
82 
83 extern FPP_IS fpp_unset_snan;
84 extern FPP_IS fpp_is_init;
85 extern FPP_IS fpp_is_snan;
86 extern FPP_IS fpp_is_nan;
87 extern FPP_IS fpp_is_infinity;
88 extern FPP_IS fpp_is_zero;
89 extern FPP_IS fpp_is_neg;
90 extern FPP_IS fpp_is_denormal;
91 extern FPP_IS fpp_is_unnormal;
92 extern FPP_A fpp_fix_infinity;
93 
94 extern FPP_GET_STATUS fpp_get_status;
95 extern FPP_CLEAR_STATUS fpp_clear_status;
96 extern FPP_SET_MODE fpp_set_mode;
97 extern FPP_SUPPORT_FLAGS fpp_get_support_flags;
98 
99 extern FPP_TO_INT fpp_to_int;
100 extern FPP_FROM_INT fpp_from_int;
101 
102 extern FPP_PACK fpp_to_pack;
103 extern FPP_PACK fpp_from_pack;
104 
105 extern FPP_TO_SINGLE fpp_to_single;
106 extern FPP_FROM_SINGLE fpp_from_single;
107 extern FPP_TO_DOUBLE fpp_to_double;
108 extern FPP_FROM_DOUBLE fpp_from_double;
109 extern FPP_TO_EXTEN fpp_to_exten;
110 extern FPP_FROM_EXTEN fpp_from_exten;
111 extern FPP_TO_EXTEN fpp_to_exten_fmovem;
112 extern FPP_FROM_EXTEN fpp_from_exten_fmovem;
113 
114 extern FPP_A fpp_round_single;
115 extern FPP_A fpp_round_double;
116 extern FPP_A fpp_round32;
117 extern FPP_A fpp_round64;
118 
119 extern FPP_A fpp_normalize;
120 extern FPP_DENORMALIZE fpp_denormalize;
121 extern FPP_A fpp_get_internal_overflow;
122 extern FPP_A fpp_get_internal_underflow;
123 extern FPP_A fpp_get_internal_round_all;
124 extern FPP_A fpp_get_internal_round;
125 extern FPP_A fpp_get_internal_round_exten;
126 extern FPP_A fpp_get_internal;
127 extern FPP_GET32 fpp_get_internal_grs;
128 
129 extern FPP_AB fpp_int;
130 extern FPP_AB fpp_sinh;
131 extern FPP_AB fpp_intrz;
132 extern FPP_ABP fpp_sqrt;
133 extern FPP_AB fpp_lognp1;
134 extern FPP_AB fpp_etoxm1;
135 extern FPP_AB fpp_tanh;
136 extern FPP_AB fpp_atan;
137 extern FPP_AB fpp_atanh;
138 extern FPP_AB fpp_sin;
139 extern FPP_AB fpp_asin;
140 extern FPP_AB fpp_tan;
141 extern FPP_AB fpp_etox;
142 extern FPP_AB fpp_twotox;
143 extern FPP_AB fpp_tentox;
144 extern FPP_AB fpp_logn;
145 extern FPP_AB fpp_log10;
146 extern FPP_AB fpp_log2;
147 extern FPP_ABP fpp_abs;
148 extern FPP_AB fpp_cosh;
149 extern FPP_ABP fpp_neg;
150 extern FPP_AB fpp_acos;
151 extern FPP_AB fpp_cos;
152 extern FPP_AB fpp_getexp;
153 extern FPP_AB fpp_getman;
154 extern FPP_ABP fpp_div;
155 extern FPP_ABQS fpp_mod;
156 extern FPP_ABP fpp_add;
157 extern FPP_ABP fpp_mul;
158 extern FPP_ABQS fpp_rem;
159 extern FPP_AB fpp_scale;
160 extern FPP_ABP fpp_sub;
161 extern FPP_AB fpp_sgldiv;
162 extern FPP_AB fpp_sglmul;
163 extern FPP_AB fpp_cmp;
164 extern FPP_AB fpp_tst;
165 extern FPP_ABP fpp_move;
166