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