This commit was generated by cvs2svn to track changes on a CVS vendor
[external/binutils.git] / sim / common / cgen-fpu.h
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
12 typedef USI SF;
13 typedef UDI DF;
14 typedef struct { SI parts[3]; } XF;
15 typedef 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 */
22 typedef struct cgen_fp_ops CGEN_FP_OPS;
23
24 /* Instance of an fpu.  */
25
26 typedef 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
36 typedef 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
43 typedef void (CGEN_FPU_ERROR_FN) (CGEN_FPU*, int);
44
45 /* fpu operation table */
46
47 struct 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
103   DF (*extsfdf) (CGEN_FPU*, SF);
104   SF (*truncdfsf) (CGEN_FPU*, DF);
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
204 extern void cgen_init_accurate_fpu (SIM_CPU*, CGEN_FPU*, CGEN_FPU_ERROR_FN*);
205
206 BI cgen_sf_snan_p (CGEN_FPU*, SF);
207 BI cgen_df_snan_p (CGEN_FPU*, DF);
208
209 /* no-op fp error handler */
210 extern CGEN_FPU_ERROR_FN cgen_fpu_ignore_errors;
211
212 #endif /* CGEN_FPU_H */