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
103  DF (*fextsfdf) (CGEN_FPU*, SF);
104  SF (*ftruncdfsf) (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
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 */
213