cgen-fpu.h revision 1.6 1 1.1 christos /* CGEN fpu support
2 1.1 christos Copyright (C) 1999 Cygnus Solutions.
3 1.1 christos Copyright (C) 2010 Doug Evans. */
4 1.1 christos
5 1.1 christos #ifndef CGEN_FPU_H
6 1.1 christos #define CGEN_FPU_H
7 1.1 christos
8 1.1 christos /* Floating point support is a little more complicated.
9 1.1 christos We want to support using either host fp insns or an accurate fp library.
10 1.1 christos We also want to support easily added variants (e.g. modified ieee).
11 1.1 christos This is done by vectoring all calls through a table. */
12 1.1 christos
13 1.1 christos typedef USI SF;
14 1.1 christos typedef UDI DF;
15 1.1 christos typedef struct { SI parts[3]; } XF;
16 1.1 christos typedef struct { SI parts[4]; } TF;
17 1.1 christos
18 1.1 christos #ifndef TARGET_EXT_FP_WORDS
19 1.1 christos #define TARGET_EXT_FP_WORDS 4
20 1.1 christos #endif
21 1.1 christos
22 1.1 christos /* Supported floating point conversion kinds (rounding modes).
23 1.1 christos FIXME: The IEEE rounding modes need to be implemented. */
24 1.1 christos
25 1.1 christos typedef enum {
26 1.1 christos FPCONV_DEFAULT = 0,
27 1.1 christos FPCONV_TIES_TO_EVEN = 1,
28 1.1 christos FPCONV_TIES_TO_AWAY = 2,
29 1.1 christos FPCONV_TOWARD_ZERO = 3,
30 1.1 christos FPCONV_TOWARD_POSITIVE = 4,
31 1.1 christos FPCONV_TOWARD_NEGATIVE = 5
32 1.1 christos } CGEN_FPCONV_KIND;
33 1.1 christos
34 1.1 christos /* forward decl */
35 1.1 christos typedef struct cgen_fp_ops CGEN_FP_OPS;
36 1.1 christos
37 1.1 christos /* Instance of an fpu. */
38 1.1 christos
39 1.1 christos typedef struct {
40 1.1 christos /* Usually a pointer back to the SIM_CPU struct. */
41 1.1 christos void* owner;
42 1.1 christos /* Pointer to ops struct, rather than copy of it, to avoid bloating
43 1.1 christos SIM_CPU struct. */
44 1.1 christos CGEN_FP_OPS* ops;
45 1.1 christos } CGEN_FPU;
46 1.1 christos
47 1.1 christos /* result of cmp */
48 1.1 christos
49 1.1 christos typedef enum {
50 1.1 christos /* ??? May wish to distinguish qnan/snan here. */
51 1.1 christos FP_CMP_EQ, FP_CMP_LT, FP_CMP_GT, FP_CMP_NAN
52 1.1 christos } CGEN_FP_CMP;
53 1.1 christos
54 1.1 christos /* error handler */
55 1.1 christos
56 1.1 christos typedef void (CGEN_FPU_ERROR_FN) (CGEN_FPU*, int);
57 1.1 christos
58 1.1 christos /* fpu operation table */
59 1.1 christos
60 1.1 christos struct cgen_fp_ops {
61 1.1 christos
62 1.1 christos /* error (e.g. signalling nan) handler, supplied by owner */
63 1.1 christos
64 1.1 christos CGEN_FPU_ERROR_FN *error;
65 1.1 christos
66 1.1 christos /* basic SF ops */
67 1.1 christos
68 1.1 christos SF (*addsf) (CGEN_FPU*, SF, SF);
69 1.1 christos SF (*subsf) (CGEN_FPU*, SF, SF);
70 1.1 christos SF (*mulsf) (CGEN_FPU*, SF, SF);
71 1.1 christos SF (*divsf) (CGEN_FPU*, SF, SF);
72 1.6 christos SF (*remsf) (CGEN_FPU*, SF, SF);
73 1.1 christos SF (*negsf) (CGEN_FPU*, SF);
74 1.1 christos SF (*abssf) (CGEN_FPU*, SF);
75 1.1 christos SF (*sqrtsf) (CGEN_FPU*, SF);
76 1.1 christos SF (*invsf) (CGEN_FPU*, SF);
77 1.1 christos SF (*cossf) (CGEN_FPU*, SF);
78 1.1 christos SF (*sinsf) (CGEN_FPU*, SF);
79 1.1 christos SF (*minsf) (CGEN_FPU*, SF, SF);
80 1.1 christos SF (*maxsf) (CGEN_FPU*, SF, SF);
81 1.1 christos
82 1.1 christos /* ??? to be revisited */
83 1.1 christos CGEN_FP_CMP (*cmpsf) (CGEN_FPU*, SF, SF);
84 1.1 christos int (*eqsf) (CGEN_FPU*, SF, SF);
85 1.1 christos int (*nesf) (CGEN_FPU*, SF, SF);
86 1.1 christos int (*ltsf) (CGEN_FPU*, SF, SF);
87 1.1 christos int (*lesf) (CGEN_FPU*, SF, SF);
88 1.1 christos int (*gtsf) (CGEN_FPU*, SF, SF);
89 1.1 christos int (*gesf) (CGEN_FPU*, SF, SF);
90 1.1 christos
91 1.1 christos /* basic DF ops */
92 1.1 christos
93 1.1 christos DF (*adddf) (CGEN_FPU*, DF, DF);
94 1.1 christos DF (*subdf) (CGEN_FPU*, DF, DF);
95 1.1 christos DF (*muldf) (CGEN_FPU*, DF, DF);
96 1.1 christos DF (*divdf) (CGEN_FPU*, DF, DF);
97 1.6 christos DF (*remdf) (CGEN_FPU*, DF, DF);
98 1.1 christos DF (*negdf) (CGEN_FPU*, DF);
99 1.1 christos DF (*absdf) (CGEN_FPU*, DF);
100 1.1 christos DF (*sqrtdf) (CGEN_FPU*, DF);
101 1.1 christos DF (*invdf) (CGEN_FPU*, DF);
102 1.1 christos DF (*cosdf) (CGEN_FPU*, DF);
103 1.1 christos DF (*sindf) (CGEN_FPU*, DF);
104 1.1 christos DF (*mindf) (CGEN_FPU*, DF, DF);
105 1.1 christos DF (*maxdf) (CGEN_FPU*, DF, DF);
106 1.1 christos
107 1.1 christos /* ??? to be revisited */
108 1.1 christos CGEN_FP_CMP (*cmpdf) (CGEN_FPU*, DF, DF);
109 1.1 christos int (*eqdf) (CGEN_FPU*, DF, DF);
110 1.1 christos int (*nedf) (CGEN_FPU*, DF, DF);
111 1.1 christos int (*ltdf) (CGEN_FPU*, DF, DF);
112 1.1 christos int (*ledf) (CGEN_FPU*, DF, DF);
113 1.1 christos int (*gtdf) (CGEN_FPU*, DF, DF);
114 1.1 christos int (*gedf) (CGEN_FPU*, DF, DF);
115 1.1 christos
116 1.1 christos /* SF/DF conversion ops */
117 1.1 christos
118 1.1 christos DF (*fextsfdf) (CGEN_FPU*, int, SF);
119 1.1 christos SF (*ftruncdfsf) (CGEN_FPU*, int, DF);
120 1.1 christos
121 1.1 christos SF (*floatsisf) (CGEN_FPU*, int, SI);
122 1.1 christos SF (*floatdisf) (CGEN_FPU*, int, DI);
123 1.1 christos SF (*ufloatsisf) (CGEN_FPU*, int, USI);
124 1.1 christos SF (*ufloatdisf) (CGEN_FPU*, int, UDI);
125 1.1 christos
126 1.1 christos SI (*fixsfsi) (CGEN_FPU*, int, SF);
127 1.1 christos DI (*fixsfdi) (CGEN_FPU*, int, SF);
128 1.1 christos USI (*ufixsfsi) (CGEN_FPU*, int, SF);
129 1.1 christos UDI (*ufixsfdi) (CGEN_FPU*, int, SF);
130 1.1 christos
131 1.1 christos DF (*floatsidf) (CGEN_FPU*, int, SI);
132 1.1 christos DF (*floatdidf) (CGEN_FPU*, int, DI);
133 1.1 christos DF (*ufloatsidf) (CGEN_FPU*, int, USI);
134 1.1 christos DF (*ufloatdidf) (CGEN_FPU*, int, UDI);
135 1.1 christos
136 1.1 christos SI (*fixdfsi) (CGEN_FPU*, int, DF);
137 1.1 christos DI (*fixdfdi) (CGEN_FPU*, int, DF);
138 1.1 christos USI (*ufixdfsi) (CGEN_FPU*, int, DF);
139 1.1 christos UDI (*ufixdfdi) (CGEN_FPU*, int, DF);
140 1.1 christos
141 1.1 christos /* XF mode support (kept separate 'cus not always present) */
142 1.1 christos
143 1.1 christos XF (*addxf) (CGEN_FPU*, XF, XF);
144 1.1 christos XF (*subxf) (CGEN_FPU*, XF, XF);
145 1.1 christos XF (*mulxf) (CGEN_FPU*, XF, XF);
146 1.1 christos XF (*divxf) (CGEN_FPU*, XF, XF);
147 1.6 christos XF (*remxf) (CGEN_FPU*, XF, XF);
148 1.1 christos XF (*negxf) (CGEN_FPU*, XF);
149 1.1 christos XF (*absxf) (CGEN_FPU*, XF);
150 1.1 christos XF (*sqrtxf) (CGEN_FPU*, XF);
151 1.1 christos XF (*invxf) (CGEN_FPU*, XF);
152 1.1 christos XF (*cosxf) (CGEN_FPU*, XF);
153 1.1 christos XF (*sinxf) (CGEN_FPU*, XF);
154 1.1 christos XF (*minxf) (CGEN_FPU*, XF, XF);
155 1.1 christos XF (*maxxf) (CGEN_FPU*, XF, XF);
156 1.1 christos
157 1.1 christos CGEN_FP_CMP (*cmpxf) (CGEN_FPU*, XF, XF);
158 1.1 christos int (*eqxf) (CGEN_FPU*, XF, XF);
159 1.1 christos int (*nexf) (CGEN_FPU*, XF, XF);
160 1.1 christos int (*ltxf) (CGEN_FPU*, XF, XF);
161 1.1 christos int (*lexf) (CGEN_FPU*, XF, XF);
162 1.1 christos int (*gtxf) (CGEN_FPU*, XF, XF);
163 1.1 christos int (*gexf) (CGEN_FPU*, XF, XF);
164 1.1 christos
165 1.1 christos XF (*extsfxf) (CGEN_FPU*, int, SF);
166 1.1 christos XF (*extdfxf) (CGEN_FPU*, int, DF);
167 1.1 christos SF (*truncxfsf) (CGEN_FPU*, int, XF);
168 1.1 christos DF (*truncxfdf) (CGEN_FPU*, int, XF);
169 1.1 christos
170 1.1 christos XF (*floatsixf) (CGEN_FPU*, int, SI);
171 1.1 christos XF (*floatdixf) (CGEN_FPU*, int, DI);
172 1.1 christos XF (*ufloatsixf) (CGEN_FPU*, int, USI);
173 1.1 christos XF (*ufloatdixf) (CGEN_FPU*, int, UDI);
174 1.1 christos
175 1.1 christos SI (*fixxfsi) (CGEN_FPU*, int, XF);
176 1.1 christos DI (*fixxfdi) (CGEN_FPU*, int, XF);
177 1.1 christos USI (*ufixxfsi) (CGEN_FPU*, int, XF);
178 1.1 christos UDI (*ufixxfdi) (CGEN_FPU*, int, XF);
179 1.1 christos
180 1.1 christos /* TF mode support (kept separate 'cus not always present) */
181 1.1 christos
182 1.1 christos TF (*addtf) (CGEN_FPU*, TF, TF);
183 1.1 christos TF (*subtf) (CGEN_FPU*, TF, TF);
184 1.1 christos TF (*multf) (CGEN_FPU*, TF, TF);
185 1.1 christos TF (*divtf) (CGEN_FPU*, TF, TF);
186 1.6 christos TF (*remtf) (CGEN_FPU*, TF, TF);
187 1.1 christos TF (*negtf) (CGEN_FPU*, TF);
188 1.1 christos TF (*abstf) (CGEN_FPU*, TF);
189 1.1 christos TF (*sqrttf) (CGEN_FPU*, TF);
190 1.1 christos TF (*invtf) (CGEN_FPU*, TF);
191 1.1 christos TF (*costf) (CGEN_FPU*, TF);
192 1.1 christos TF (*sintf) (CGEN_FPU*, TF);
193 1.1 christos TF (*mintf) (CGEN_FPU*, TF, TF);
194 1.1 christos TF (*maxtf) (CGEN_FPU*, TF, TF);
195 1.1 christos
196 1.1 christos CGEN_FP_CMP (*cmptf) (CGEN_FPU*, TF, TF);
197 1.1 christos int (*eqtf) (CGEN_FPU*, TF, TF);
198 1.1 christos int (*netf) (CGEN_FPU*, TF, TF);
199 1.1 christos int (*lttf) (CGEN_FPU*, TF, TF);
200 1.1 christos int (*letf) (CGEN_FPU*, TF, TF);
201 1.1 christos int (*gttf) (CGEN_FPU*, TF, TF);
202 1.1 christos int (*getf) (CGEN_FPU*, TF, TF);
203 1.1 christos
204 1.1 christos TF (*extsftf) (CGEN_FPU*, int, SF);
205 1.1 christos TF (*extdftf) (CGEN_FPU*, int, DF);
206 1.1 christos SF (*trunctfsf) (CGEN_FPU*, int, TF);
207 1.1 christos DF (*trunctfdf) (CGEN_FPU*, int, TF);
208 1.1 christos
209 1.1 christos TF (*floatsitf) (CGEN_FPU*, int, SI);
210 1.1 christos TF (*floatditf) (CGEN_FPU*, int, DI);
211 1.1 christos TF (*ufloatsitf) (CGEN_FPU*, int, USI);
212 1.1 christos TF (*ufloatditf) (CGEN_FPU*, int, UDI);
213 1.1 christos
214 1.1 christos SI (*fixtfsi) (CGEN_FPU*, int, TF);
215 1.1 christos DI (*fixtfdi) (CGEN_FPU*, int, TF);
216 1.1 christos USI (*ufixtfsi) (CGEN_FPU*, int, TF);
217 1.1 christos UDI (*ufixtfdi) (CGEN_FPU*, int, TF);
218 1.1 christos
219 1.1 christos };
220 1.1 christos
221 1.1 christos extern void cgen_init_accurate_fpu (SIM_CPU*, CGEN_FPU*, CGEN_FPU_ERROR_FN*);
222 1.1 christos
223 1.1 christos BI cgen_sf_snan_p (CGEN_FPU*, SF);
224 1.1 christos BI cgen_df_snan_p (CGEN_FPU*, DF);
225 1.1 christos
226 1.1 christos /* no-op fp error handler */
227 1.1 christos extern CGEN_FPU_ERROR_FN cgen_fpu_ignore_errors;
228 1.1 christos
229 1.1 christos #endif /* CGEN_FPU_H */
230