cgen-ops.h revision 1.10 1 1.1 christos /* Semantics ops support for CGEN-based simulators.
2 1.10 christos Copyright (C) 1996-2023 Free Software Foundation, Inc.
3 1.1 christos Contributed by Cygnus Solutions.
4 1.1 christos
5 1.1 christos This file is part of the GNU Simulators.
6 1.1 christos
7 1.1 christos This program is free software; you can redistribute it and/or modify
8 1.1 christos it under the terms of the GNU General Public License as published by
9 1.1 christos the Free Software Foundation; either version 3 of the License, or
10 1.1 christos (at your option) any later version.
11 1.1 christos
12 1.1 christos This program is distributed in the hope that it will be useful,
13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 christos GNU General Public License for more details.
16 1.1 christos
17 1.1 christos You should have received a copy of the GNU General Public License
18 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>.
19 1.1 christos
20 1.1 christos */
21 1.1 christos
22 1.1 christos #ifndef CGEN_SEM_OPS_H
23 1.1 christos #define CGEN_SEM_OPS_H
24 1.1 christos
25 1.1 christos #include <assert.h>
26 1.1 christos
27 1.5 christos /* TODO: This should get moved into sim-inline.h. */
28 1.1 christos #if defined (__GNUC__) && ! defined (SEMOPS_DEFINE_INLINE)
29 1.1 christos #define SEMOPS_DEFINE_INLINE
30 1.5 christos #define SEMOPS_INLINE EXTERN_INLINE
31 1.1 christos #else
32 1.1 christos #define SEMOPS_INLINE
33 1.1 christos #endif
34 1.1 christos
35 1.1 christos /* Semantic operations.
36 1.1 christos At one point this file was machine generated. Maybe it will be again. */
37 1.1 christos
38 1.1 christos /* TODO: Lazy encoding/decoding of fp values. */
39 1.1 christos
40 1.1 christos /* These don't really have a mode. */
41 1.1 christos #define ANDIF(x, y) ((x) && (y))
42 1.1 christos #define ORIF(x, y) ((x) || (y))
43 1.1 christos
44 1.1 christos #define SUBBI(x, y) ((x) - (y))
45 1.1 christos #define ANDBI(x, y) ((x) & (y))
46 1.1 christos #define ORBI(x, y) ((x) | (y))
47 1.1 christos #define XORBI(x, y) ((x) ^ (y))
48 1.1 christos #define NEGBI(x) (- (x))
49 1.1 christos #define NOTBI(x) (! (BI) (x))
50 1.1 christos #define INVBI(x) (~ (x))
51 1.1 christos #define EQBI(x, y) ((BI) (x) == (BI) (y))
52 1.1 christos #define NEBI(x, y) ((BI) (x) != (BI) (y))
53 1.1 christos #define LTBI(x, y) ((BI) (x) < (BI) (y))
54 1.1 christos #define LEBI(x, y) ((BI) (x) <= (BI) (y))
55 1.1 christos #define GTBI(x, y) ((BI) (x) > (BI) (y))
56 1.1 christos #define GEBI(x, y) ((BI) (x) >= (BI) (y))
57 1.1 christos #define LTUBI(x, y) ((BI) (x) < (BI) (y))
58 1.1 christos #define LEUBI(x, y) ((BI) (x) <= (BI) (y))
59 1.1 christos #define GTUBI(x, y) ((BI) (x) > (BI) (y))
60 1.1 christos #define GEUBI(x, y) ((BI) (x) >= (BI) (y))
61 1.1 christos
62 1.1 christos #define ADDQI(x, y) ((QI) ((UQI) (x) + (UQI) (y)))
64 1.1 christos #define SUBQI(x, y) ((QI) ((UQI) (x) - (UQI) (y)))
65 1.1 christos #define MULQI(x, y) ((QI) ((UQI) (x) * (UQI) (y)))
66 1.1 christos #define DIVQI(x, y) ((QI) (x) / (QI) (y))
67 1.1 christos #define UDIVQI(x, y) ((UQI) (x) / (UQI) (y))
68 1.1 christos #define MODQI(x, y) ((QI) (x) % (QI) (y))
69 1.1 christos #define UMODQI(x, y) ((UQI) (x) % (UQI) (y))
70 1.1 christos #define SRAQI(x, y) ((QI) (x) >> (y))
71 1.1 christos #define SRLQI(x, y) ((UQI) (x) >> (y))
72 1.1 christos #define SLLQI(x, y) ((UQI) (x) << (y))
73 1.1 christos extern QI RORQI (QI, int);
74 1.1 christos extern QI ROLQI (QI, int);
75 1.1 christos #define ANDQI(x, y) ((x) & (y))
76 1.1 christos #define ORQI(x, y) ((x) | (y))
77 1.1 christos #define XORQI(x, y) ((x) ^ (y))
78 1.1 christos #define NEGQI(x) ((QI) (- (UQI) (x)))
79 1.1 christos #define NOTQI(x) (! (QI) (x))
80 1.1 christos #define INVQI(x) (~ (x))
81 1.1 christos #define ABSQI(x) ((QI) ((QI) (x) < 0 ? -(UQI) (x) : (UQI) (x)))
82 1.1 christos #define EQQI(x, y) ((QI) (x) == (QI) (y))
83 1.1 christos #define NEQI(x, y) ((QI) (x) != (QI) (y))
84 1.1 christos #define LTQI(x, y) ((QI) (x) < (QI) (y))
85 1.1 christos #define LEQI(x, y) ((QI) (x) <= (QI) (y))
86 1.1 christos #define GTQI(x, y) ((QI) (x) > (QI) (y))
87 1.1 christos #define GEQI(x, y) ((QI) (x) >= (QI) (y))
88 1.1 christos #define LTUQI(x, y) ((UQI) (x) < (UQI) (y))
89 1.1 christos #define LEUQI(x, y) ((UQI) (x) <= (UQI) (y))
90 1.1 christos #define GTUQI(x, y) ((UQI) (x) > (UQI) (y))
91 1.1 christos #define GEUQI(x, y) ((UQI) (x) >= (UQI) (y))
92 1.1 christos
93 1.1 christos #define ADDHI(x, y) ((HI) ((UHI) (x) + (UHI) (y)))
95 1.1 christos #define SUBHI(x, y) ((HI) ((UHI) (x) - (UHI) (y)))
96 1.1 christos #define MULHI(x, y) ((HI) ((UHI) (x) * (UHI) (y)))
97 1.1 christos #define DIVHI(x, y) ((HI) (x) / (HI) (y))
98 1.1 christos #define UDIVHI(x, y) ((UHI) (x) / (UHI) (y))
99 1.1 christos #define MODHI(x, y) ((HI) (x) % (HI) (y))
100 1.1 christos #define UMODHI(x, y) ((UHI) (x) % (UHI) (y))
101 1.1 christos #define SRAHI(x, y) ((HI) (x) >> (y))
102 1.1 christos #define SRLHI(x, y) ((UHI) (x) >> (y))
103 1.1 christos #define SLLHI(x, y) ((UHI) (x) << (y))
104 1.1 christos extern HI RORHI (HI, int);
105 1.1 christos extern HI ROLHI (HI, int);
106 1.1 christos #define ANDHI(x, y) ((x) & (y))
107 1.1 christos #define ORHI(x, y) ((x) | (y))
108 1.1 christos #define XORHI(x, y) ((x) ^ (y))
109 1.1 christos #define NEGHI(x) ((HI) (- (UHI) (x)))
110 1.1 christos #define NOTHI(x) (! (HI) (x))
111 1.1 christos #define INVHI(x) (~ (x))
112 1.1 christos #define ABSHI(x) ((HI) ((HI) (x) < 0 ? -(UHI) (x) : (UHI) (x)))
113 1.1 christos #define EQHI(x, y) ((HI) (x) == (HI) (y))
114 1.1 christos #define NEHI(x, y) ((HI) (x) != (HI) (y))
115 1.1 christos #define LTHI(x, y) ((HI) (x) < (HI) (y))
116 1.1 christos #define LEHI(x, y) ((HI) (x) <= (HI) (y))
117 1.1 christos #define GTHI(x, y) ((HI) (x) > (HI) (y))
118 1.1 christos #define GEHI(x, y) ((HI) (x) >= (HI) (y))
119 1.1 christos #define LTUHI(x, y) ((UHI) (x) < (UHI) (y))
120 1.1 christos #define LEUHI(x, y) ((UHI) (x) <= (UHI) (y))
121 1.1 christos #define GTUHI(x, y) ((UHI) (x) > (UHI) (y))
122 1.1 christos #define GEUHI(x, y) ((UHI) (x) >= (UHI) (y))
123 1.1 christos
124 1.1 christos #define ADDSI(x, y) ((SI) ((USI) (x) + (USI) (y)))
126 1.1 christos #define SUBSI(x, y) ((SI) ((USI) (x) - (USI) (y)))
127 1.1 christos #define MULSI(x, y) ((SI) ((USI) (x) * (USI) (y)))
128 1.1 christos #define DIVSI(x, y) ((SI) (x) / (SI) (y))
129 1.1 christos #define UDIVSI(x, y) ((USI) (x) / (USI) (y))
130 1.1 christos #define MODSI(x, y) ((SI) (x) % (SI) (y))
131 1.1 christos #define UMODSI(x, y) ((USI) (x) % (USI) (y))
132 1.1 christos #define SRASI(x, y) ((SI) (x) >> (y))
133 1.1 christos #define SRLSI(x, y) ((USI) (x) >> (y))
134 1.1 christos #define SLLSI(x, y) ((USI) (x) << (y))
135 1.1 christos extern SI RORSI (SI, int);
136 1.1 christos extern SI ROLSI (SI, int);
137 1.1 christos #define ANDSI(x, y) ((x) & (y))
138 1.1 christos #define ORSI(x, y) ((x) | (y))
139 1.1 christos #define XORSI(x, y) ((x) ^ (y))
140 1.1 christos #define NEGSI(x) ((SI) (- (USI) (x)))
141 1.1 christos #define NOTSI(x) (! (SI) (x))
142 1.1 christos #define INVSI(x) (~ (x))
143 1.1 christos #define ABSSI(x) ((SI) ((SI) (x) < 0 ? -(USI) (x) : (USI) (x)))
144 1.1 christos #define EQSI(x, y) ((SI) (x) == (SI) (y))
145 1.1 christos #define NESI(x, y) ((SI) (x) != (SI) (y))
146 1.1 christos #define LTSI(x, y) ((SI) (x) < (SI) (y))
147 1.1 christos #define LESI(x, y) ((SI) (x) <= (SI) (y))
148 1.1 christos #define GTSI(x, y) ((SI) (x) > (SI) (y))
149 1.1 christos #define GESI(x, y) ((SI) (x) >= (SI) (y))
150 1.1 christos #define LTUSI(x, y) ((USI) (x) < (USI) (y))
151 1.1 christos #define LEUSI(x, y) ((USI) (x) <= (USI) (y))
152 1.1 christos #define GTUSI(x, y) ((USI) (x) > (USI) (y))
153 1.1 christos #define GEUSI(x, y) ((USI) (x) >= (USI) (y))
154 1.1 christos
155 1.1 christos #ifdef DI_FN_SUPPORT
157 1.1 christos extern DI ADDDI (DI, DI);
158 1.1 christos extern DI SUBDI (DI, DI);
159 1.1 christos extern DI MULDI (DI, DI);
160 1.1 christos extern DI DIVDI (DI, DI);
161 1.1 christos extern DI UDIVDI (DI, DI);
162 1.1 christos extern DI MODDI (DI, DI);
163 1.1 christos extern DI UMODDI (DI, DI);
164 1.1 christos extern DI SRADI (DI, int);
165 1.1 christos extern UDI SRLDI (UDI, int);
166 1.1 christos extern UDI SLLDI (UDI, int);
167 1.1 christos extern DI RORDI (DI, int);
168 1.1 christos extern DI ROLDI (DI, int);
169 1.1 christos extern DI ANDDI (DI, DI);
170 1.1 christos extern DI ORDI (DI, DI);
171 1.1 christos extern DI XORDI (DI, DI);
172 1.1 christos extern DI NEGDI (DI);
173 1.1 christos extern int NOTDI (DI);
174 1.1 christos extern DI INVDI (DI);
175 1.1 christos extern int EQDI (DI, DI);
176 1.1 christos extern int NEDI (DI, DI);
177 1.1 christos extern int LTDI (DI, DI);
178 1.1 christos extern int LEDI (DI, DI);
179 1.1 christos extern int GTDI (DI, DI);
180 1.1 christos extern int GEDI (DI, DI);
181 1.1 christos extern int LTUDI (UDI, UDI);
182 1.1 christos extern int LEUDI (UDI, UDI);
183 1.1 christos extern int GTUDI (UDI, UDI);
184 1.1 christos extern int GEUDI (UDI, UDI);
185 1.1 christos #else /* ! DI_FN_SUPPORT */
186 1.1 christos #define ADDDI(x, y) ((DI) ((UDI) (x) + (UDI) (y)))
187 1.1 christos #define SUBDI(x, y) ((DI) ((UDI) (x) - (UDI) (y)))
188 1.1 christos #define MULDI(x, y) ((DI) ((UDI) (x) * (UDI) (y)))
189 1.1 christos #define DIVDI(x, y) ((DI) (x) / (DI) (y))
190 1.1 christos #define UDIVDI(x, y) ((UDI) (x) / (UDI) (y))
191 1.1 christos #define MODDI(x, y) ((DI) (x) % (DI) (y))
192 1.1 christos #define UMODDI(x, y) ((UDI) (x) % (UDI) (y))
193 1.1 christos #define SRADI(x, y) ((DI) (x) >> (y))
194 1.1 christos #define SRLDI(x, y) ((UDI) (x) >> (y))
195 1.1 christos #define SLLDI(x, y) ((UDI) (x) << (y))
196 1.1 christos extern DI RORDI (DI, int);
197 1.1 christos extern DI ROLDI (DI, int);
198 1.1 christos #define ANDDI(x, y) ((x) & (y))
199 1.1 christos #define ORDI(x, y) ((x) | (y))
200 1.1 christos #define XORDI(x, y) ((x) ^ (y))
201 1.1 christos #define NEGDI(x) ((DI) (- (UDI) (x)))
202 1.1 christos #define NOTDI(x) (! (DI) (x))
203 1.1 christos #define INVDI(x) (~ (x))
204 1.1 christos #define ABSDI(x) ((DI) ((DI) (x) < 0 ? -(UDI) (x) : (UDI) (x)))
205 1.1 christos #define EQDI(x, y) ((DI) (x) == (DI) (y))
206 1.1 christos #define NEDI(x, y) ((DI) (x) != (DI) (y))
207 1.1 christos #define LTDI(x, y) ((DI) (x) < (DI) (y))
208 1.1 christos #define LEDI(x, y) ((DI) (x) <= (DI) (y))
209 1.1 christos #define GTDI(x, y) ((DI) (x) > (DI) (y))
210 1.1 christos #define GEDI(x, y) ((DI) (x) >= (DI) (y))
211 1.1 christos #define LTUDI(x, y) ((UDI) (x) < (UDI) (y))
212 1.1 christos #define LEUDI(x, y) ((UDI) (x) <= (UDI) (y))
213 1.1 christos #define GTUDI(x, y) ((UDI) (x) > (UDI) (y))
214 1.1 christos #define GEUDI(x, y) ((UDI) (x) >= (UDI) (y))
215 1.1 christos #endif /* DI_FN_SUPPORT */
216 1.1 christos
217 1.1 christos #define EXTBIQI(x) ((QI) (BI) (x))
219 1.1 christos #define EXTBIHI(x) ((HI) (BI) (x))
220 1.1 christos #define EXTBISI(x) ((SI) (BI) (x))
221 1.1 christos #if defined (DI_FN_SUPPORT)
222 1.1 christos extern DI EXTBIDI (BI);
223 1.1 christos #else
224 1.1 christos #define EXTBIDI(x) ((DI) (BI) (x))
225 1.1 christos #endif
226 1.1 christos #define EXTQIHI(x) ((HI) (QI) (x))
227 1.1 christos #define EXTQISI(x) ((SI) (QI) (x))
228 1.1 christos #if defined (DI_FN_SUPPORT)
229 1.1 christos extern DI EXTQIDI (QI);
230 1.1 christos #else
231 1.1 christos #define EXTQIDI(x) ((DI) (QI) (x))
232 1.1 christos #endif
233 1.1 christos #define EXTHIHI(x) ((HI) (HI) (x))
234 1.1 christos #define EXTHISI(x) ((SI) (HI) (x))
235 1.1 christos #define EXTSISI(x) ((SI) (SI) (x))
236 1.1 christos #if defined (DI_FN_SUPPORT)
237 1.1 christos extern DI EXTHIDI (HI);
238 1.1 christos #else
239 1.1 christos #define EXTHIDI(x) ((DI) (HI) (x))
240 1.1 christos #endif
241 1.1 christos #if defined (DI_FN_SUPPORT)
242 1.1 christos extern DI EXTSIDI (SI);
243 1.1 christos #else
244 1.1 christos #define EXTSIDI(x) ((DI) (SI) (x))
245 1.1 christos #endif
246 1.1 christos
247 1.1 christos #define ZEXTBIQI(x) ((QI) (BI) (x))
249 1.1 christos #define ZEXTBIHI(x) ((HI) (BI) (x))
250 1.1 christos #define ZEXTBISI(x) ((SI) (BI) (x))
251 1.1 christos #if defined (DI_FN_SUPPORT)
252 1.1 christos extern DI ZEXTBIDI (BI);
253 1.1 christos #else
254 1.1 christos #define ZEXTBIDI(x) ((DI) (BI) (x))
255 1.1 christos #endif
256 1.1 christos #define ZEXTQIHI(x) ((HI) (UQI) (x))
257 1.1 christos #define ZEXTQISI(x) ((SI) (UQI) (x))
258 1.1 christos #if defined (DI_FN_SUPPORT)
259 1.1 christos extern DI ZEXTQIDI (QI);
260 1.1 christos #else
261 1.1 christos #define ZEXTQIDI(x) ((DI) (UQI) (x))
262 1.1 christos #endif
263 1.1 christos #define ZEXTHISI(x) ((SI) (UHI) (x))
264 1.1 christos #define ZEXTHIHI(x) ((HI) (UHI) (x))
265 1.1 christos #define ZEXTSISI(x) ((SI) (USI) (x))
266 1.1 christos #if defined (DI_FN_SUPPORT)
267 1.1 christos extern DI ZEXTHIDI (HI);
268 1.1 christos #else
269 1.1 christos #define ZEXTHIDI(x) ((DI) (UHI) (x))
270 1.1 christos #endif
271 1.1 christos #if defined (DI_FN_SUPPORT)
272 1.1 christos extern DI ZEXTSIDI (SI);
273 1.1 christos #else
274 1.1 christos #define ZEXTSIDI(x) ((DI) (USI) (x))
275 1.1 christos #endif
276 1.1 christos
277 1.1 christos #define TRUNCQIBI(x) ((BI) (QI) (x))
279 1.1 christos #define TRUNCHIBI(x) ((BI) (HI) (x))
280 1.1 christos #define TRUNCHIQI(x) ((QI) (HI) (x))
281 1.1 christos #define TRUNCSIBI(x) ((BI) (SI) (x))
282 1.1 christos #define TRUNCSIQI(x) ((QI) (SI) (x))
283 1.1 christos #define TRUNCSIHI(x) ((HI) (SI) (x))
284 1.1 christos #define TRUNCSISI(x) ((SI) (SI) (x))
285 1.1 christos #if defined (DI_FN_SUPPORT)
286 1.1 christos extern BI TRUNCDIBI (DI);
287 1.1 christos #else
288 1.1 christos #define TRUNCDIBI(x) ((BI) (DI) (x))
289 1.1 christos #endif
290 1.1 christos #if defined (DI_FN_SUPPORT)
291 1.1 christos extern QI TRUNCDIQI (DI);
292 1.1 christos #else
293 1.1 christos #define TRUNCDIQI(x) ((QI) (DI) (x))
294 1.1 christos #endif
295 1.1 christos #if defined (DI_FN_SUPPORT)
296 1.1 christos extern HI TRUNCDIHI (DI);
297 1.1 christos #else
298 1.1 christos #define TRUNCDIHI(x) ((HI) (DI) (x))
299 1.1 christos #endif
300 1.1 christos #if defined (DI_FN_SUPPORT)
301 1.1 christos extern SI TRUNCDISI (DI);
302 1.1 christos #else
303 1.1 christos #define TRUNCDISI(x) ((SI) (DI) (x))
304 1.10 christos #endif
305 1.10 christos
306 1.10 christos /* Composing/decomposing the various types.
308 1.10 christos Word ordering is endian-independent. Words are specified most to least
309 1.10 christos significant and word number 0 is the most significant word.
310 1.10 christos ??? May also wish an endian-dependent version. Later. */
311 1.10 christos
312 1.10 christos QI SUBWORDSIQI (SI, int);
313 1.10 christos HI SUBWORDSIHI (SI, int);
314 1.10 christos SI SUBWORDSFSI (SF);
315 1.10 christos SF SUBWORDSISF (SI);
316 1.10 christos DI SUBWORDDFDI (DF);
317 1.10 christos DF SUBWORDDIDF (DI);
318 1.10 christos QI SUBWORDDIQI (DI, int);
319 1.10 christos HI SUBWORDDIHI (DI, int);
320 1.10 christos SI SUBWORDDISI (DI, int);
321 1.10 christos SI SUBWORDDFSI (DF, int);
322 1.10 christos SI SUBWORDXFSI (XF, int);
323 1.10 christos SI SUBWORDTFSI (TF, int);
324 1.10 christos
325 1.1 christos UQI SUBWORDSIUQI (SI, int);
326 1.1 christos UQI SUBWORDDIUQI (DI, int);
327 1.1 christos
328 1.1 christos DI JOINSIDI (SI, SI);
329 1.1 christos DF JOINSIDF (SI, SI);
330 1.1 christos XF JOINSIXF (SI, SI, SI);
331 1.1 christos TF JOINSITF (SI, SI, SI, SI);
332 1.1 christos
333 1.1 christos #ifdef SEMOPS_DEFINE_INLINE
334 1.1 christos
335 1.1 christos SEMOPS_INLINE SF
336 1.1 christos SUBWORDSISF (SI in)
337 1.1 christos {
338 1.1 christos union { SI in; SF out; } x;
339 1.1 christos x.in = in;
340 1.1 christos return x.out;
341 1.1 christos }
342 1.1 christos
343 1.1 christos SEMOPS_INLINE DF
344 1.1 christos SUBWORDDIDF (DI in)
345 1.1 christos {
346 1.1 christos union { DI in; DF out; } x;
347 1.1 christos x.in = in;
348 1.1 christos return x.out;
349 1.1 christos }
350 1.1 christos
351 1.1 christos SEMOPS_INLINE QI
352 1.1 christos SUBWORDSIQI (SI in, int byte)
353 1.1 christos {
354 1.1 christos assert (byte >= 0 && byte <= 3);
355 1.1 christos return (UQI) (in >> (8 * (3 - byte))) & 0xFF;
356 1.1 christos }
357 1.1 christos
358 1.1 christos SEMOPS_INLINE UQI
359 1.1 christos SUBWORDSIUQI (SI in, int byte)
360 1.1 christos {
361 1.1 christos assert (byte >= 0 && byte <= 3);
362 1.1 christos return (UQI) (in >> (8 * (3 - byte))) & 0xFF;
363 1.1 christos }
364 1.1 christos
365 1.1 christos SEMOPS_INLINE QI
366 1.1 christos SUBWORDDIQI (DI in, int byte)
367 1.1 christos {
368 1.1 christos assert (byte >= 0 && byte <= 7);
369 1.1 christos return (UQI) (in >> (8 * (7 - byte))) & 0xFF;
370 1.1 christos }
371 1.1 christos
372 1.1 christos SEMOPS_INLINE HI
373 1.1 christos SUBWORDDIHI (DI in, int word)
374 1.1 christos {
375 1.1 christos assert (word >= 0 && word <= 3);
376 1.1 christos return (UHI) (in >> (16 * (3 - word))) & 0xFFFF;
377 1.1 christos }
378 1.1 christos
379 1.1 christos SEMOPS_INLINE HI
380 1.1 christos SUBWORDSIHI (SI in, int word)
381 1.1 christos {
382 1.1 christos if (word == 0)
383 1.1 christos return (USI) in >> 16;
384 1.1 christos else
385 1.1 christos return in;
386 1.1 christos }
387 1.1 christos
388 1.1 christos SEMOPS_INLINE SI
389 1.1 christos SUBWORDSFSI (SF in)
390 1.1 christos {
391 1.1 christos union { SF in; SI out; } x;
392 1.1 christos x.in = in;
393 1.1 christos return x.out;
394 1.1 christos }
395 1.1 christos
396 1.1 christos SEMOPS_INLINE DI
397 1.1 christos SUBWORDDFDI (DF in)
398 1.1 christos {
399 1.1 christos union { DF in; DI out; } x;
400 1.1 christos x.in = in;
401 1.1 christos return x.out;
402 1.1 christos }
403 1.1 christos
404 1.1 christos SEMOPS_INLINE UQI
405 1.1 christos SUBWORDDIUQI (DI in, int byte)
406 1.1 christos {
407 1.1 christos assert (byte >= 0 && byte <= 7);
408 1.1 christos return (UQI) (in >> (8 * (7 - byte)));
409 1.1 christos }
410 1.1 christos
411 1.1 christos SEMOPS_INLINE SI
412 1.1 christos SUBWORDDISI (DI in, int word)
413 1.1 christos {
414 1.1 christos if (word == 0)
415 1.1 christos return (UDI) in >> 32;
416 1.1 christos else
417 1.1 christos return in;
418 1.1 christos }
419 1.1 christos
420 1.1 christos SEMOPS_INLINE SI
421 1.1 christos SUBWORDDFSI (DF in, int word)
422 1.1 christos {
423 1.1 christos /* Note: typedef UDI DF; */
424 1.1 christos if (word == 0)
425 1.1 christos return (UDI) in >> 32;
426 1.1 christos else
427 1.1 christos return in;
428 1.9 christos }
429 1.1 christos
430 1.1 christos SEMOPS_INLINE SI
431 1.1 christos SUBWORDXFSI (XF in, int word)
432 1.1 christos {
433 1.1 christos /* Note: typedef struct { SI parts[3]; } XF; */
434 1.1 christos union { XF in; SI out[3]; } x;
435 1.1 christos x.in = in;
436 1.1 christos if (HOST_BYTE_ORDER == BFD_ENDIAN_BIG)
437 1.1 christos return x.out[word];
438 1.1 christos else
439 1.1 christos return x.out[2 - word];
440 1.9 christos }
441 1.1 christos
442 1.1 christos SEMOPS_INLINE SI
443 1.1 christos SUBWORDTFSI (TF in, int word)
444 1.1 christos {
445 1.1 christos /* Note: typedef struct { SI parts[4]; } TF; */
446 1.1 christos union { TF in; SI out[4]; } x;
447 1.1 christos x.in = in;
448 1.1 christos if (HOST_BYTE_ORDER == BFD_ENDIAN_BIG)
449 1.1 christos return x.out[word];
450 1.1 christos else
451 1.1 christos return x.out[3 - word];
452 1.1 christos }
453 1.1 christos
454 1.1 christos SEMOPS_INLINE DI
455 1.1 christos JOINSIDI (SI x0, SI x1)
456 1.9 christos {
457 1.1 christos return MAKEDI (x0, x1);
458 1.1 christos }
459 1.1 christos
460 1.1 christos SEMOPS_INLINE DF
461 1.1 christos JOINSIDF (SI x0, SI x1)
462 1.1 christos {
463 1.1 christos union { SI in[2]; DF out; } x;
464 1.1 christos if (HOST_BYTE_ORDER == BFD_ENDIAN_BIG)
465 1.1 christos x.in[0] = x0, x.in[1] = x1;
466 1.1 christos else
467 1.9 christos x.in[1] = x0, x.in[0] = x1;
468 1.1 christos return x.out;
469 1.1 christos }
470 1.1 christos
471 1.1 christos SEMOPS_INLINE XF
472 1.1 christos JOINSIXF (SI x0, SI x1, SI x2)
473 1.1 christos {
474 1.1 christos union { SI in[3]; XF out; } x;
475 1.1 christos if (HOST_BYTE_ORDER == BFD_ENDIAN_BIG)
476 1.1 christos x.in[0] = x0, x.in[1] = x1, x.in[2] = x2;
477 1.1 christos else
478 1.9 christos x.in[2] = x0, x.in[1] = x1, x.in[0] = x2;
479 1.1 christos return x.out;
480 1.1 christos }
481 1.1 christos
482 1.1 christos SEMOPS_INLINE TF
483 1.1 christos JOINSITF (SI x0, SI x1, SI x2, SI x3)
484 1.1 christos {
485 1.1 christos union { SI in[4]; TF out; } x;
486 1.1 christos if (HOST_BYTE_ORDER == BFD_ENDIAN_BIG)
487 1.1 christos x.in[0] = x0, x.in[1] = x1, x.in[2] = x2, x.in[3] = x3;
488 1.1 christos else
489 1.10 christos x.in[3] = x0, x.in[2] = x1, x.in[1] = x2, x.in[0] = x3;
490 1.10 christos return x.out;
491 1.10 christos }
492 1.10 christos
493 1.10 christos #endif /* SUBWORD,JOIN */
494 1.10 christos
495 1.10 christos /* Semantic support utilities. */
497 1.10 christos
498 1.10 christos SI ADDCSI (SI, SI, BI);
499 1.10 christos BI ADDCFSI (SI, SI, BI);
500 1.10 christos BI ADDOFSI (SI, SI, BI);
501 1.10 christos SI SUBCSI (SI, SI, BI);
502 1.10 christos BI SUBCFSI (SI, SI, BI);
503 1.10 christos BI SUBOFSI (SI, SI, BI);
504 1.10 christos HI ADDCHI (HI, HI, BI);
505 1.10 christos BI ADDCFHI (HI, HI, BI);
506 1.10 christos BI ADDOFHI (HI, HI, BI);
507 1.10 christos HI SUBCHI (HI, HI, BI);
508 1.10 christos BI SUBCFHI (HI, HI, BI);
509 1.10 christos BI SUBOFHI (HI, HI, BI);
510 1.10 christos QI ADDCQI (QI, QI, BI);
511 1.10 christos BI ADDCFQI (QI, QI, BI);
512 1.10 christos BI ADDOFQI (QI, QI, BI);
513 1.10 christos QI SUBCQI (QI, QI, BI);
514 1.1 christos BI SUBCFQI (QI, QI, BI);
515 1.1 christos BI SUBOFQI (QI, QI, BI);
516 1.1 christos BI MUL1OFSI (USI a, USI b);
517 1.1 christos BI MUL2OFSI (SI a, SI b);
518 1.1 christos BI ADDCFDI (DI a, DI b, BI c);
519 1.1 christos BI ADDOFDI (DI a, DI b, BI c);
520 1.1 christos BI SUBCFDI (DI a, DI b, BI c);
521 1.1 christos BI SUBOFDI (DI a, DI b, BI c);
522 1.1 christos
523 1.1 christos #ifdef SEMOPS_DEFINE_INLINE
524 1.1 christos
525 1.1 christos SEMOPS_INLINE SI
526 1.1 christos ADDCSI (SI a, SI b, BI c)
527 1.1 christos {
528 1.1 christos SI res = ADDSI (a, ADDSI (b, c));
529 1.1 christos return res;
530 1.1 christos }
531 1.1 christos
532 1.1 christos SEMOPS_INLINE BI
533 1.1 christos ADDCFSI (SI a, SI b, BI c)
534 1.1 christos {
535 1.1 christos SI tmp = ADDSI (a, ADDSI (b, c));
536 1.1 christos BI res = ((USI) tmp < (USI) a) || (c && tmp == a);
537 1.1 christos return res;
538 1.1 christos }
539 1.1 christos
540 1.1 christos SEMOPS_INLINE BI
541 1.1 christos ADDOFSI (SI a, SI b, BI c)
542 1.1 christos {
543 1.1 christos SI tmp = ADDSI (a, ADDSI (b, c));
544 1.1 christos BI res = (((a < 0) == (b < 0))
545 1.1 christos && ((a < 0) != (tmp < 0)));
546 1.1 christos return res;
547 1.1 christos }
548 1.1 christos
549 1.1 christos SEMOPS_INLINE SI
550 1.1 christos SUBCSI (SI a, SI b, BI c)
551 1.1 christos {
552 1.1 christos SI res = SUBSI (a, ADDSI (b, c));
553 1.1 christos return res;
554 1.1 christos }
555 1.1 christos
556 1.1 christos SEMOPS_INLINE BI
557 1.1 christos SUBCFSI (SI a, SI b, BI c)
558 1.1 christos {
559 1.1 christos BI res = ((USI) a < (USI) b) || (c && a == b);
560 1.1 christos return res;
561 1.1 christos }
562 1.1 christos
563 1.1 christos SEMOPS_INLINE BI
564 1.1 christos SUBOFSI (SI a, SI b, BI c)
565 1.1 christos {
566 1.1 christos SI tmp = SUBSI (a, ADDSI (b, c));
567 1.1 christos BI res = (((a < 0) != (b < 0))
568 1.1 christos && ((a < 0) != (tmp < 0)));
569 1.1 christos return res;
570 1.1 christos }
571 1.1 christos
572 1.1 christos SEMOPS_INLINE HI
573 1.1 christos ADDCHI (HI a, HI b, BI c)
574 1.1 christos {
575 1.1 christos HI res = ADDHI (a, ADDHI (b, c));
576 1.1 christos return res;
577 1.1 christos }
578 1.1 christos
579 1.1 christos SEMOPS_INLINE BI
580 1.1 christos ADDCFHI (HI a, HI b, BI c)
581 1.1 christos {
582 1.1 christos HI tmp = ADDHI (a, ADDHI (b, c));
583 1.1 christos BI res = ((UHI) tmp < (UHI) a) || (c && tmp == a);
584 1.1 christos return res;
585 1.1 christos }
586 1.1 christos
587 1.1 christos SEMOPS_INLINE BI
588 1.1 christos ADDOFHI (HI a, HI b, BI c)
589 1.1 christos {
590 1.1 christos HI tmp = ADDHI (a, ADDHI (b, c));
591 1.1 christos BI res = (((a < 0) == (b < 0))
592 1.1 christos && ((a < 0) != (tmp < 0)));
593 1.1 christos return res;
594 1.1 christos }
595 1.1 christos
596 1.1 christos SEMOPS_INLINE HI
597 1.1 christos SUBCHI (HI a, HI b, BI c)
598 1.1 christos {
599 1.1 christos HI res = SUBHI (a, ADDHI (b, c));
600 1.1 christos return res;
601 1.1 christos }
602 1.1 christos
603 1.1 christos SEMOPS_INLINE BI
604 1.1 christos SUBCFHI (HI a, HI b, BI c)
605 1.1 christos {
606 1.1 christos BI res = ((UHI) a < (UHI) b) || (c && a == b);
607 1.1 christos return res;
608 1.1 christos }
609 1.1 christos
610 1.1 christos SEMOPS_INLINE BI
611 1.1 christos SUBOFHI (HI a, HI b, BI c)
612 1.1 christos {
613 1.1 christos HI tmp = SUBHI (a, ADDHI (b, c));
614 1.1 christos BI res = (((a < 0) != (b < 0))
615 1.1 christos && ((a < 0) != (tmp < 0)));
616 1.1 christos return res;
617 1.1 christos }
618 1.1 christos
619 1.1 christos SEMOPS_INLINE QI
620 1.1 christos ADDCQI (QI a, QI b, BI c)
621 1.1 christos {
622 1.1 christos QI res = ADDQI (a, ADDQI (b, c));
623 1.1 christos return res;
624 1.1 christos }
625 1.1 christos
626 1.1 christos SEMOPS_INLINE BI
627 1.1 christos ADDCFQI (QI a, QI b, BI c)
628 1.1 christos {
629 1.1 christos QI tmp = ADDQI (a, ADDQI (b, c));
630 1.1 christos BI res = ((UQI) tmp < (UQI) a) || (c && tmp == a);
631 1.1 christos return res;
632 1.1 christos }
633 1.1 christos
634 1.1 christos SEMOPS_INLINE BI
635 1.1 christos ADDOFQI (QI a, QI b, BI c)
636 1.1 christos {
637 1.1 christos QI tmp = ADDQI (a, ADDQI (b, c));
638 1.1 christos BI res = (((a < 0) == (b < 0))
639 1.1 christos && ((a < 0) != (tmp < 0)));
640 1.1 christos return res;
641 1.1 christos }
642 1.1 christos
643 1.1 christos SEMOPS_INLINE QI
644 1.1 christos SUBCQI (QI a, QI b, BI c)
645 1.1 christos {
646 1.1 christos QI res = SUBQI (a, ADDQI (b, c));
647 1.1 christos return res;
648 1.1 christos }
649 1.1 christos
650 1.1 christos SEMOPS_INLINE BI
651 1.1 christos SUBCFQI (QI a, QI b, BI c)
652 1.1 christos {
653 1.1 christos BI res = ((UQI) a < (UQI) b) || (c && a == b);
654 1.1 christos return res;
655 1.1 christos }
656 1.1 christos
657 1.8 christos SEMOPS_INLINE BI
658 1.8 christos SUBOFQI (QI a, QI b, BI c)
659 1.8 christos {
660 1.8 christos QI tmp = SUBQI (a, ADDQI (b, c));
661 1.8 christos BI res = (((a < 0) != (b < 0))
662 1.8 christos && ((a < 0) != (tmp < 0)));
663 1.8 christos return res;
664 1.8 christos }
665 1.8 christos
666 1.8 christos SEMOPS_INLINE BI
667 1.8 christos MUL2OFSI (SI a, SI b)
668 1.8 christos {
669 1.8 christos DI tmp = MULDI (EXTSIDI (a), EXTSIDI (b));
670 1.8 christos BI res = tmp < -0x80000000LL || tmp > 0x7fffffffLL;
671 1.8 christos return res;
672 1.8 christos }
673 1.8 christos
674 1.8 christos SEMOPS_INLINE BI
675 1.8 christos MUL1OFSI (USI a, USI b)
676 1.8 christos {
677 1.8 christos UDI tmp = MULDI (ZEXTSIDI (a), ZEXTSIDI (b));
678 1.8 christos BI res = (tmp > 0xFFFFFFFFULL);
679 1.8 christos return res;
680 1.8 christos }
681 1.8 christos
682 1.8 christos SEMOPS_INLINE BI
683 1.8 christos ADDCFDI (DI a, DI b, BI c)
684 1.8 christos {
685 1.8 christos DI tmp = ADDDI (a, ADDDI (b, c));
686 1.8 christos BI res = ((UDI) tmp < (UDI) a) || (c && tmp == a);
687 1.8 christos return res;
688 1.8 christos }
689 1.8 christos
690 1.8 christos SEMOPS_INLINE BI
691 1.8 christos ADDOFDI (DI a, DI b, BI c)
692 1.8 christos {
693 1.8 christos DI tmp = ADDDI (a, ADDDI (b, c));
694 1.8 christos BI res = (((a < 0) == (b < 0))
695 1.8 christos && ((a < 0) != (tmp < 0)));
696 1.8 christos return res;
697 1.8 christos }
698 1.8 christos
699 1.8 christos SEMOPS_INLINE BI
700 1.8 christos SUBCFDI (DI a, DI b, BI c)
701 1.8 christos {
702 1.8 christos BI res = ((UDI) a < (UDI) b) || (c && a == b);
703 1.8 christos return res;
704 1.8 christos }
705 1.1 christos
706 1.10 christos SEMOPS_INLINE BI
707 1.1 christos SUBOFDI (DI a, DI b, BI c)
708 1.10 christos {
709 1.1 christos DI tmp = SUBDI (a, ADDSI (b, c));
710 1.1 christos BI res = (((a < 0) != (b < 0))
711 && ((a < 0) != (tmp < 0)));
712 return res;
713 }
714
715 #endif
716
717 extern void cgen_rtx_error (SIM_CPU *, const char *);
718
719 #endif /* CGEN_SEM_OPS_H */
720