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