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