OSDN Git Service

* config/spu/spu.c (spu_init_libfuncs): Install __clrsbdi2.
[pf3gnuchains/gcc-fork.git] / libgcc / fixed-bit.h
1 /* This is a software fixed-point library.
2    Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 Under Section 7 of GPL version 3, you are granted additional
17 permissions described in the GCC Runtime Library Exception, version
18 3.1, as published by the Free Software Foundation.
19
20 You should have received a copy of the GNU General Public License and
21 a copy of the GCC Runtime Library Exception along with this program;
22 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23 <http://www.gnu.org/licenses/>.  */
24
25 #ifndef _FIXED_BIT_H
26 #define _FIXED_BIT_H
27
28 /* To use this file we need to define one of the following:
29    QQ_MODE, UQQ_MODE, HQ_MODE, UHQ_MODE, SQ_MODE, USQ_MODE, DQ_MODE, UDQ_MODE,
30    TQ_MODE, UTQ_MODE, HA_MODE, UHA_MODE, SA_MODE, USA_MODE, DA_MODE, UDA_MODE,
31    TA_MODE, UTA_MODE.
32    Then, all operators for this machine mode will be created.
33
34    Or, we need to define FROM_* TO_* for conversions from one mode to another
35    mode.  The mode could be one of the following:
36    Fract: QQ, UQQ, HQ, UHQ, SQ, USQ, DQ, UDQ, TQ, UTQ
37    Accum: HA, UHA, SA, USA, DA, UDA, TA, UTA
38    Signed integer: QI, HI, SI, DI, TI
39    Unsigned integer: UQI, UHI, USI, UDI, UTI
40    Floating-point: SF, DF
41    Ex: If we define FROM_QQ and TO_SI, the conversion from QQ to SI is
42    generated.  */
43
44 #ifndef LIBGCC2_LONG_DOUBLE_TYPE_SIZE
45 #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE
46 #endif
47
48 #ifndef LIBGCC2_HAS_SF_MODE
49 #define LIBGCC2_HAS_SF_MODE (BITS_PER_UNIT == 8)
50 #endif
51
52 #ifndef LIBGCC2_HAS_DF_MODE
53 #define LIBGCC2_HAS_DF_MODE \
54   (BITS_PER_UNIT == 8 \
55    && (__SIZEOF_DOUBLE__ * __CHAR_BIT__ == 64 \
56        || LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 64))
57 #endif
58
59 typedef          int QItype     __attribute__ ((mode (QI)));
60 typedef unsigned int UQItype    __attribute__ ((mode (QI)));
61 typedef          int HItype     __attribute__ ((mode (HI)));
62 typedef unsigned int UHItype    __attribute__ ((mode (HI)));
63 typedef          _Fract QQtype  __attribute__ ((mode (QQ)));
64 typedef unsigned _Fract UQQtype __attribute__ ((mode (UQQ)));
65 typedef          _Fract HQtype  __attribute__ ((mode (HQ)));
66 typedef unsigned _Fract UHQtype __attribute__ ((mode (UHQ)));
67 typedef          _Fract HAtype  __attribute__ ((mode (HA)));
68 typedef unsigned _Fract UHAtype __attribute__ ((mode (UHA)));
69 #define HAVE_QQ         1
70 #define HAVE_UQQ        1
71 #define HAVE_HQ         1
72 #define HAVE_UHQ        1
73 #define HAVE_HA         1
74 #define HAVE_UHA        1
75 #define HAVE_QI         1
76 #define HAVE_UQI        1
77 #define HAVE_HI         1
78 #define HAVE_UHI        1
79 #if MIN_UNITS_PER_WORD > 1
80 /* These typedefs are usually forbidden on dsp's with UNITS_PER_WORD 1.  */
81 typedef          int SItype     __attribute__ ((mode (SI)));
82 typedef unsigned int USItype    __attribute__ ((mode (SI)));
83 typedef          _Fract SQtype  __attribute__ ((mode (SQ)));
84 typedef unsigned _Fract USQtype __attribute__ ((mode (USQ)));
85 typedef          _Fract SAtype  __attribute__ ((mode (SA)));
86 typedef unsigned _Fract USAtype __attribute__ ((mode (USA)));
87 #define HAVE_SQ         1
88 #define HAVE_USQ        1
89 #define HAVE_SA         1
90 #define HAVE_USA        1
91 #define HAVE_SI         1
92 #define HAVE_USI        1
93 #if LONG_LONG_TYPE_SIZE > 32
94 /* These typedefs are usually forbidden on archs with UNITS_PER_WORD 2.  */
95 typedef          int DItype     __attribute__ ((mode (DI)));
96 typedef unsigned int UDItype    __attribute__ ((mode (DI)));
97 typedef          _Fract DQtype  __attribute__ ((mode (DQ)));
98 typedef unsigned _Fract UDQtype __attribute__ ((mode (UDQ)));
99 typedef          _Fract DAtype  __attribute__ ((mode (DA)));
100 typedef unsigned _Fract UDAtype __attribute__ ((mode (UDA)));
101 #define HAVE_DQ         1
102 #define HAVE_UDQ        1
103 #define HAVE_DA         1
104 #define HAVE_UDA        1
105 #define HAVE_DI         1
106 #define HAVE_UDI        1
107 #if MIN_UNITS_PER_WORD > 4
108 /* These typedefs are usually forbidden on archs with UNITS_PER_WORD 4.  */
109 typedef          int TItype     __attribute__ ((mode (TI)));
110 typedef unsigned int UTItype    __attribute__ ((mode (TI)));
111 typedef          _Fract TQtype  __attribute__ ((mode (TQ)));
112 typedef unsigned _Fract UTQtype __attribute__ ((mode (UTQ)));
113 typedef          _Fract TAtype  __attribute__ ((mode (TA)));
114 typedef unsigned _Fract UTAtype __attribute__ ((mode (UTA)));
115 #define HAVE_TQ         1
116 #define HAVE_UTQ        1
117 #define HAVE_TA         1
118 #define HAVE_UTA        1
119 #define HAVE_TI         1
120 #define HAVE_UTI        1
121 #endif
122 #endif
123 #endif
124
125 #if LIBGCC2_HAS_SF_MODE
126 typedef float SFtype __attribute__ ((mode (SF)));
127 #define HAVE_SF         1
128 #endif
129 #if LIBGCC2_HAS_DF_MODE
130 typedef float DFtype __attribute__ ((mode (DF)));
131 #define HAVE_DF         1
132 #endif
133
134 typedef int word_type __attribute__ ((mode (__word__)));
135
136 /* Based on modes, we create many defines.  */
137
138 #if defined (QQ_MODE) && (HAVE_QQ == 1)
139 #define FIXED_SIZE      1       /* in bytes.  */
140 #define INT_C_TYPE      QItype
141 #define UINT_C_TYPE     UQItype
142 #define DINT_C_TYPE     HItype
143 #define DUINT_C_TYPE    UHItype
144 #define MODE_NAME       QQ
145 #define MODE_NAME_S     qq
146 #define MODE_UNSIGNED   0
147 #endif
148
149 #if defined (UQQ_MODE) && (HAVE_UQQ == 1)
150 #define FIXED_SIZE      1       /* in bytes.  */
151 #define INT_C_TYPE      UQItype
152 #define UINT_C_TYPE     UQItype
153 #define DINT_C_TYPE     UHItype
154 #define DUINT_C_TYPE    UHItype
155 #define MODE_NAME       UQQ
156 #define MODE_NAME_S     uqq
157 #define MODE_UNSIGNED   1
158 #endif
159
160 #if defined (HQ_MODE) && (HAVE_HQ == 1)
161 #define FIXED_SIZE      2       /* in bytes.  */
162 #define INT_C_TYPE      HItype
163 #define UINT_C_TYPE     UHItype
164
165 #if HAVE_SI == 1
166 #define DINT_C_TYPE     SItype
167 #define DUINT_C_TYPE    USItype
168 #else
169 #define HINT_C_TYPE     QItype
170 #define HUINT_C_TYPE    UQItype
171 #endif
172
173 #define MODE_NAME       HQ
174 #define MODE_NAME_S     hq
175 #define MODE_UNSIGNED   0
176 #endif
177
178 #if defined (UHQ_MODE) && (HAVE_UHQ == 1)
179 #define FIXED_SIZE      2       /* in bytes.  */
180 #define INT_C_TYPE      UHItype
181 #define UINT_C_TYPE     UHItype
182
183 #if HAVE_SI == 1
184 #define DINT_C_TYPE     USItype
185 #define DUINT_C_TYPE    USItype
186 #else
187 #define HINT_C_TYPE     UQItype
188 #define HUINT_C_TYPE    UQItype
189 #endif
190
191 #define MODE_NAME       UHQ
192 #define MODE_NAME_S     uhq
193 #define MODE_UNSIGNED   1
194 #endif
195
196 #if defined (SQ_MODE) && (HAVE_SQ == 1)
197 #define FIXED_SIZE      4       /* in bytes.  */
198 #define INT_C_TYPE      SItype
199 #define UINT_C_TYPE     USItype
200
201 #if HAVE_DI == 1
202 #define DINT_C_TYPE     DItype
203 #define DUINT_C_TYPE    UDItype
204 #else
205 #define HINT_C_TYPE     HItype
206 #define HUINT_C_TYPE    UHItype
207 #endif
208
209 #define MODE_NAME       SQ
210 #define MODE_NAME_S     sq
211 #define MODE_UNSIGNED   0
212 #endif
213
214 #if defined (USQ_MODE) && (HAVE_USQ == 1)
215 #define FIXED_SIZE      4       /* in bytes.  */
216 #define INT_C_TYPE      USItype
217 #define UINT_C_TYPE     USItype
218
219 #if HAVE_DI == 1
220 #define DINT_C_TYPE     UDItype
221 #define DUINT_C_TYPE    UDItype
222 #else
223 #define HINT_C_TYPE     UHItype
224 #define HUINT_C_TYPE    UHItype
225 #endif
226
227 #define MODE_NAME       USQ
228 #define MODE_NAME_S     usq
229 #define MODE_UNSIGNED   1
230 #endif
231
232 #if defined (DQ_MODE) && (HAVE_DQ == 1)
233 #define FIXED_SIZE      8       /* in bytes.  */
234 #define INT_C_TYPE      DItype
235 #define UINT_C_TYPE     UDItype
236
237 #if HAVE_TI == 1
238 #define DINT_C_TYPE     TItype
239 #define DUINT_C_TYPE    UTItype
240 #else
241 #define HINT_C_TYPE     SItype
242 #define HUINT_C_TYPE    USItype
243 #endif
244
245 #define MODE_NAME       DQ
246 #define MODE_NAME_S     dq
247 #define MODE_UNSIGNED   0
248 #endif
249
250 #if defined (UDQ_MODE) && (HAVE_UDQ == 1)
251 #define FIXED_SIZE      8       /* in bytes.  */
252 #define INT_C_TYPE      UDItype
253 #define UINT_C_TYPE     UDItype
254
255 #if HAVE_TI == 1
256 #define DINT_C_TYPE     UTItype
257 #define DUINT_C_TYPE    UTItype
258 #else
259 #define HINT_C_TYPE     USItype
260 #define HUINT_C_TYPE    USItype
261 #endif
262
263 #define MODE_NAME       UDQ
264 #define MODE_NAME_S     udq
265 #define MODE_UNSIGNED   1
266 #endif
267
268 #if defined (TQ_MODE) && (HAVE_TQ == 1)
269 #define FIXED_SIZE      16      /* in bytes.  */
270 #define INT_C_TYPE      TItype
271 #define UINT_C_TYPE     UTItype
272 #define HINT_C_TYPE     DItype
273 #define HUINT_C_TYPE    UDItype
274 #define MODE_NAME       TQ
275 #define MODE_NAME_S     tq
276 #define MODE_UNSIGNED   0
277 #endif
278
279 #if defined (UTQ_MODE) && (HAVE_UTQ == 1)
280 #define FIXED_SIZE      16      /* in bytes.  */
281 #define INT_C_TYPE      UTItype
282 #define UINT_C_TYPE     UTItype
283 #define HINT_C_TYPE     UDItype
284 #define HUINT_C_TYPE    UDItype
285 #define MODE_NAME       UTQ
286 #define MODE_NAME_S     utq
287 #define MODE_UNSIGNED   1
288 #endif
289
290 #if defined (HA_MODE) && (HAVE_HA == 1)
291 #define FIXED_SIZE      2       /* in bytes.  */
292 #define INT_C_TYPE      HItype
293 #define UINT_C_TYPE     UHItype
294
295 #if HAVE_SI == 1
296 #define DINT_C_TYPE     SItype
297 #define DUINT_C_TYPE    USItype
298 #else
299 #define HINT_C_TYPE     QItype
300 #define HUINT_C_TYPE    UQItype
301 #endif
302
303 #define MODE_NAME       HA
304 #define MODE_NAME_S     ha
305 #define MODE_UNSIGNED   0
306 #endif
307
308 #if defined (UHA_MODE) && (HAVE_UHA == 1)
309 #define FIXED_SIZE      2       /* in bytes.  */
310 #define INT_C_TYPE      UHItype
311 #define UINT_C_TYPE     UHItype
312
313 #if HAVE_SI == 1
314 #define DINT_C_TYPE     USItype
315 #define DUINT_C_TYPE    USItype
316 #else
317 #define HINT_C_TYPE     UQItype
318 #define HUINT_C_TYPE    UQItype
319 #endif
320
321 #define MODE_NAME       UHA
322 #define MODE_NAME_S     uha
323 #define MODE_UNSIGNED   1
324 #endif
325
326 #if defined (SA_MODE) && (HAVE_SA == 1)
327 #define FIXED_SIZE      4       /* in bytes.  */
328 #define INT_C_TYPE      SItype
329 #define UINT_C_TYPE     USItype
330
331 #if HAVE_DI == 1
332 #define DINT_C_TYPE     DItype
333 #define DUINT_C_TYPE    UDItype
334 #else
335 #define HINT_C_TYPE     HItype
336 #define HUINT_C_TYPE    UHItype
337 #endif
338
339 #define MODE_NAME       SA
340 #define MODE_NAME_S     sa
341 #define MODE_UNSIGNED   0
342 #endif
343
344 #if defined (USA_MODE) && (HAVE_USA == 1)
345 #define FIXED_SIZE      4       /* in bytes.  */
346 #define INT_C_TYPE      USItype
347 #define UINT_C_TYPE     USItype
348
349 #if HAVE_DI == 1
350 #define DINT_C_TYPE     UDItype
351 #define DUINT_C_TYPE    UDItype
352 #else
353 #define HINT_C_TYPE     UHItype
354 #define HUINT_C_TYPE    UHItype
355 #endif
356
357 #define MODE_NAME       USA
358 #define MODE_NAME_S     usa
359 #define MODE_UNSIGNED   1
360 #endif
361
362 #if defined (DA_MODE) && (HAVE_DA == 1)
363 #define FIXED_SIZE      8       /* in bytes.  */
364 #define INT_C_TYPE      DItype
365 #define UINT_C_TYPE     UDItype
366
367 #if HAVE_TI == 1
368 #define DINT_C_TYPE     TItype
369 #define DUINT_C_TYPE    UTItype
370 #else
371 #define HINT_C_TYPE     SItype
372 #define HUINT_C_TYPE    USItype
373 #endif
374
375 #define MODE_NAME       DA
376 #define MODE_NAME_S     da
377 #define MODE_UNSIGNED   0
378 #endif
379
380 #if defined (UDA_MODE) && (HAVE_UDA == 1)
381 #define FIXED_SIZE      8       /* in bytes.  */
382 #define INT_C_TYPE      UDItype
383 #define UINT_C_TYPE     UDItype
384
385 #if HAVE_TI == 1
386 #define DINT_C_TYPE     UTItype
387 #define DUINT_C_TYPE    UTItype
388 #else
389 #define HINT_C_TYPE     USItype
390 #define HUINT_C_TYPE    USItype
391 #endif
392
393 #define MODE_NAME       UDA
394 #define MODE_NAME_S     uda
395 #define MODE_UNSIGNED   1
396 #endif
397
398 #if defined (TA_MODE) && (HAVE_TA == 1)
399 #define FIXED_SIZE      16      /* in bytes.  */
400 #define INT_C_TYPE      TItype
401 #define UINT_C_TYPE     UTItype
402 #define HINT_C_TYPE     DItype
403 #define HUINT_C_TYPE    UDItype
404 #define MODE_NAME       TA
405 #define MODE_NAME_S     ta
406 #define MODE_UNSIGNED   0
407 #endif
408
409 #if defined (UTA_MODE) && (HAVE_UTA == 1)
410 #define FIXED_SIZE      16      /* in bytes.  */
411 #define INT_C_TYPE      UTItype
412 #define UINT_C_TYPE     UTItype
413 #define HINT_C_TYPE     UDItype
414 #define HUINT_C_TYPE    UDItype
415 #define MODE_NAME       UTA
416 #define MODE_NAME_S     uta
417 #define MODE_UNSIGNED   1
418 #endif
419
420 /* The following defines are based on the previous defines.  */
421
422 #if defined (HINT_C_TYPE)
423 #if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
424   struct INTstruct {HINT_C_TYPE high, low;};
425 #else
426   struct INTstruct {HINT_C_TYPE low, high;};
427 #endif
428
429 typedef union
430 {
431   struct INTstruct s;
432   INT_C_TYPE ll;
433 } INTunion;
434 #endif
435
436 #define FIXED_WIDTH     (FIXED_SIZE * BITS_PER_UNIT) /* in bits.  */
437 #define FIXED_C_TYPE1(NAME)     NAME ## type
438 #define FIXED_C_TYPE2(NAME)     FIXED_C_TYPE1(NAME)
439 #define FIXED_C_TYPE    FIXED_C_TYPE2(MODE_NAME)
440 #define FBITS1(NAME)    __ ## NAME ## _FBIT__
441 #define FBITS2(NAME)    FBITS1(NAME)
442 #define FBITS           FBITS2(MODE_NAME)
443 #define IBITS1(NAME)    __ ## NAME ## _IBIT__
444 #define IBITS2(NAME)    IBITS1(NAME)
445 #define IBITS           IBITS2(MODE_NAME)
446 #define I_F_BITS        (FBITS + IBITS)
447
448 #ifdef LIBGCC2_GNU_PREFIX
449 #define FIXED_OP(OP,MODE,NUM)   __gnu_ ## OP ## MODE ## NUM
450 #else
451 #define FIXED_OP(OP,MODE,NUM)   __ ## OP ## MODE ## NUM
452 #endif
453
454 #define FIXED_SATURATE1_TEMP(NAME)      FIXED_OP(saturate1,NAME,)
455 #define FIXED_SATURATE2_TEMP(NAME)      FIXED_OP(saturate2,NAME,)
456 #define FIXED_MULHELPER_TEMP(NAME)      FIXED_OP(mulhelper,NAME,)
457 #define FIXED_DIVHELPER_TEMP(NAME)      FIXED_OP(divhelper,NAME,)
458 #define FIXED_ASHLHELPER_TEMP(NAME)     FIXED_OP(ashlhelper,NAME,)
459 #define FIXED_ADD_TEMP(NAME)    FIXED_OP(add,NAME,3)
460 #define FIXED_SSADD_TEMP(NAME)  FIXED_OP(ssadd,NAME,3)
461 #define FIXED_USADD_TEMP(NAME)  FIXED_OP(usadd,NAME,3)
462 #define FIXED_SUB_TEMP(NAME)    FIXED_OP(sub,NAME,3)
463 #define FIXED_SSSUB_TEMP(NAME)  FIXED_OP(sssub,NAME,3)
464 #define FIXED_USSUB_TEMP(NAME)  FIXED_OP(ussub,NAME,3)
465 #define FIXED_MUL_TEMP(NAME)    FIXED_OP(mul,NAME,3)
466 #define FIXED_SSMUL_TEMP(NAME)  FIXED_OP(ssmul,NAME,3)
467 #define FIXED_USMUL_TEMP(NAME)  FIXED_OP(usmul,NAME,3)
468 #define FIXED_DIV_TEMP(NAME)    FIXED_OP(div,NAME,3)
469 #define FIXED_UDIV_TEMP(NAME)   FIXED_OP(udiv,NAME,3)
470 #define FIXED_SSDIV_TEMP(NAME)  FIXED_OP(ssdiv,NAME,3)
471 #define FIXED_USDIV_TEMP(NAME)  FIXED_OP(usdiv,NAME,3)
472 #define FIXED_NEG_TEMP(NAME)    FIXED_OP(neg,NAME,2)
473 #define FIXED_SSNEG_TEMP(NAME)  FIXED_OP(ssneg,NAME,2)
474 #define FIXED_USNEG_TEMP(NAME)  FIXED_OP(usneg,NAME,2)
475 #define FIXED_ASHL_TEMP(NAME)   FIXED_OP(ashl,NAME,3)
476 #define FIXED_ASHR_TEMP(NAME)   FIXED_OP(ashr,NAME,3)
477 #define FIXED_LSHR_TEMP(NAME)   FIXED_OP(lshr,NAME,3)
478 #define FIXED_SSASHL_TEMP(NAME) FIXED_OP(ssashl,NAME,3)
479 #define FIXED_USASHL_TEMP(NAME) FIXED_OP(usashl,NAME,3)
480 #define FIXED_CMP_TEMP(NAME)    FIXED_OP(cmp,NAME,2)
481
482 #if defined (MODE_NAME)
483 #if defined (DINT_C_TYPE)
484 #define FIXED_SATURATE1 FIXED_SATURATE1_TEMP(MODE_NAME_S)
485 #else
486 #define FIXED_SATURATE2 FIXED_SATURATE2_TEMP(MODE_NAME_S)
487 #endif
488 #define FIXED_MULHELPER FIXED_MULHELPER_TEMP(MODE_NAME_S)
489 #define FIXED_DIVHELPER FIXED_DIVHELPER_TEMP(MODE_NAME_S)
490 #define FIXED_ASHLHELPER        FIXED_ASHLHELPER_TEMP(MODE_NAME_S)
491 #define FIXED_ADD       FIXED_ADD_TEMP(MODE_NAME_S)
492 #define FIXED_SUB       FIXED_SUB_TEMP(MODE_NAME_S)
493 #define FIXED_MUL       FIXED_MUL_TEMP(MODE_NAME_S)
494 #define FIXED_NEG       FIXED_NEG_TEMP(MODE_NAME_S)
495 #define FIXED_ASHL      FIXED_ASHL_TEMP(MODE_NAME_S)
496 #define FIXED_CMP       FIXED_CMP_TEMP(MODE_NAME_S)
497
498 /* The following functions are for all fixed-point modes.  */
499 #if defined (DINT_C_TYPE)
500 extern void FIXED_SATURATE1 (DINT_C_TYPE *);
501 #else
502 extern void FIXED_SATURATE2 (INT_C_TYPE *, INT_C_TYPE *);
503 #endif
504 extern FIXED_C_TYPE FIXED_MULHELPER (FIXED_C_TYPE, FIXED_C_TYPE, word_type);
505 extern FIXED_C_TYPE FIXED_DIVHELPER (FIXED_C_TYPE, FIXED_C_TYPE, word_type);
506 extern FIXED_C_TYPE FIXED_ASHLHELPER (FIXED_C_TYPE, word_type, word_type);
507 extern FIXED_C_TYPE FIXED_ADD (FIXED_C_TYPE, FIXED_C_TYPE);
508 extern FIXED_C_TYPE FIXED_SUB (FIXED_C_TYPE, FIXED_C_TYPE);
509 extern FIXED_C_TYPE FIXED_MUL (FIXED_C_TYPE, FIXED_C_TYPE);
510 extern FIXED_C_TYPE FIXED_NEG (FIXED_C_TYPE);
511 extern FIXED_C_TYPE FIXED_ASHL (FIXED_C_TYPE, word_type);
512 extern word_type FIXED_CMP (FIXED_C_TYPE, FIXED_C_TYPE);
513 #endif
514
515 #if MODE_UNSIGNED == 0 /* Signed types.  */
516 #define PADDING_BITS    (FIXED_WIDTH - 1 - I_F_BITS)
517 #define NONPADDING_BITS (1 + I_F_BITS)
518
519 #if defined (MODE_NAME)
520 #define FIXED_DIV       FIXED_DIV_TEMP(MODE_NAME_S)
521 #define FIXED_ASHR      FIXED_ASHR_TEMP(MODE_NAME_S)
522 #define FIXED_SSADD     FIXED_SSADD_TEMP(MODE_NAME_S)
523 #define FIXED_SSSUB     FIXED_SSSUB_TEMP(MODE_NAME_S)
524 #define FIXED_SSMUL     FIXED_SSMUL_TEMP(MODE_NAME_S)
525 #define FIXED_SSDIV     FIXED_SSDIV_TEMP(MODE_NAME_S)
526 #define FIXED_SSNEG     FIXED_SSNEG_TEMP(MODE_NAME_S)
527 #define FIXED_SSASHL    FIXED_SSASHL_TEMP(MODE_NAME_S)
528
529 /* The following functions are for signed fixed-point modes.  */
530 extern FIXED_C_TYPE FIXED_DIV (FIXED_C_TYPE, FIXED_C_TYPE);
531 extern FIXED_C_TYPE FIXED_ASHR (FIXED_C_TYPE, word_type);
532 extern FIXED_C_TYPE FIXED_SSADD (FIXED_C_TYPE, FIXED_C_TYPE);
533 extern FIXED_C_TYPE FIXED_SSSUB (FIXED_C_TYPE, FIXED_C_TYPE);
534 extern FIXED_C_TYPE FIXED_SSMUL (FIXED_C_TYPE, FIXED_C_TYPE);
535 extern FIXED_C_TYPE FIXED_SSDIV (FIXED_C_TYPE, FIXED_C_TYPE);
536 extern FIXED_C_TYPE FIXED_SSNEG (FIXED_C_TYPE);
537 extern FIXED_C_TYPE FIXED_SSASHL (FIXED_C_TYPE, word_type);
538 #endif
539
540 #else /* Unsigned types.  */
541 #define PADDING_BITS    (FIXED_WIDTH - I_F_BITS)
542 #define NONPADDING_BITS (I_F_BITS)
543
544 #if defined (MODE_NAME)
545 #define FIXED_UDIV      FIXED_UDIV_TEMP(MODE_NAME_S)
546 #define FIXED_LSHR      FIXED_LSHR_TEMP(MODE_NAME_S)
547 #define FIXED_USDIV     FIXED_USDIV_TEMP(MODE_NAME_S)
548 #define FIXED_USADD     FIXED_USADD_TEMP(MODE_NAME_S)
549 #define FIXED_USSUB     FIXED_USSUB_TEMP(MODE_NAME_S)
550 #define FIXED_USMUL     FIXED_USMUL_TEMP(MODE_NAME_S)
551 #define FIXED_USNEG     FIXED_USNEG_TEMP(MODE_NAME_S)
552 #define FIXED_USASHL    FIXED_USASHL_TEMP(MODE_NAME_S)
553
554 /* The following functions are for unsigned fixed-point modes.  */
555 extern FIXED_C_TYPE FIXED_UDIV (FIXED_C_TYPE, FIXED_C_TYPE);
556 extern FIXED_C_TYPE FIXED_LSHR (FIXED_C_TYPE, word_type);
557 extern FIXED_C_TYPE FIXED_USADD (FIXED_C_TYPE, FIXED_C_TYPE);
558 extern FIXED_C_TYPE FIXED_USSUB (FIXED_C_TYPE, FIXED_C_TYPE);
559 extern FIXED_C_TYPE FIXED_USMUL (FIXED_C_TYPE, FIXED_C_TYPE);
560 extern FIXED_C_TYPE FIXED_USDIV (FIXED_C_TYPE, FIXED_C_TYPE);
561 extern FIXED_C_TYPE FIXED_USNEG (FIXED_C_TYPE);
562 extern FIXED_C_TYPE FIXED_USASHL (FIXED_C_TYPE, word_type);
563 #endif
564
565 #endif /* End of testing MODE_UNSIGNED.  */
566
567 /* This define is to check if this mode have any padding bits.  */
568 #define HAVE_PADDING_BITS       (PADDING_BITS > 0)
569
570 /* ------------------------------------------------------------------------ */
571 /* The following defines are for conversions.  */
572
573 #if defined (FROM_QI) && HAVE_QI == 1
574 #define FROM_TYPE               1       /* Signed integer.  */
575 #define FROM_INT_C_TYPE         QItype
576 #define FROM_SINT_C_TYPE        QItype
577 #define FROM_UINT_C_TYPE        UQItype
578 #define FROM_MODE_NAME_S        qi
579 #define FROM_INT_SIZE           1       /* in bytes.  */
580
581 #elif defined (FROM_HI) && HAVE_HI == 1
582 #define FROM_TYPE               1       /* Signed integer.  */
583 #define FROM_INT_C_TYPE         HItype
584 #define FROM_SINT_C_TYPE        HItype
585 #define FROM_UINT_C_TYPE        UHItype
586 #define FROM_MODE_NAME_S        hi
587 #define FROM_INT_SIZE           2       /* in bytes.  */
588
589 #elif defined (FROM_SI) && HAVE_SI == 1
590 #define FROM_TYPE               1       /* Signed integer.  */
591 #define FROM_INT_C_TYPE         SItype
592 #define FROM_SINT_C_TYPE        SItype
593 #define FROM_UINT_C_TYPE        USItype
594 #define FROM_MODE_NAME_S        si
595 #define FROM_INT_SIZE           4       /* in bytes.  */
596
597 #elif defined (FROM_DI) && HAVE_DI == 1
598 #define FROM_TYPE               1       /* Signed integer.  */
599 #define FROM_INT_C_TYPE         DItype
600 #define FROM_SINT_C_TYPE        DItype
601 #define FROM_UINT_C_TYPE        UDItype
602 #define FROM_MODE_NAME_S        di
603 #define FROM_INT_SIZE           8       /* in bytes.  */
604
605 #elif defined (FROM_TI) && HAVE_TI == 1
606 #define FROM_TYPE               1       /* Signed integer.  */
607 #define FROM_INT_C_TYPE         TItype
608 #define FROM_SINT_C_TYPE        TItype
609 #define FROM_UINT_C_TYPE        UTItype
610 #define FROM_MODE_NAME_S        ti
611 #define FROM_INT_SIZE           16      /* in bytes.  */
612
613 #elif defined (FROM_UQI) && HAVE_UQI == 1
614 #define FROM_TYPE               2       /* Unsigned integer.  */
615 #define FROM_INT_C_TYPE         QItype
616 #define FROM_SINT_C_TYPE        QItype
617 #define FROM_UINT_C_TYPE        UQItype
618 #define FROM_MODE_NAME_S        qi
619 #define FROM_INT_SIZE           1       /* in bytes.  */
620
621 #elif defined (FROM_UHI) && HAVE_UHI == 1
622 #define FROM_TYPE               2       /* Unsigned integer.  */
623 #define FROM_INT_C_TYPE         UHItype
624 #define FROM_SINT_C_TYPE        HItype
625 #define FROM_UINT_C_TYPE        UHItype
626 #define FROM_MODE_NAME_S        hi
627 #define FROM_INT_SIZE           2       /* in bytes.  */
628
629 #elif defined (FROM_USI) && HAVE_USI == 1
630 #define FROM_TYPE               2       /* Unsigned integer.  */
631 #define FROM_INT_C_TYPE         USItype
632 #define FROM_SINT_C_TYPE        SItype
633 #define FROM_UINT_C_TYPE        USItype
634 #define FROM_MODE_NAME_S        si
635 #define FROM_INT_SIZE           4       /* in bytes.  */
636
637 #elif defined (FROM_UDI) && HAVE_UDI == 1
638 #define FROM_TYPE               2       /* Unsigned integer.  */
639 #define FROM_INT_C_TYPE         UDItype
640 #define FROM_SINT_C_TYPE        DItype
641 #define FROM_UINT_C_TYPE        UDItype
642 #define FROM_MODE_NAME_S        di
643 #define FROM_INT_SIZE           8       /* in bytes.  */
644
645 #elif defined (FROM_UTI) && HAVE_UTI == 1
646 #define FROM_TYPE               2       /* Unsigned integer.  */
647 #define FROM_INT_C_TYPE         UTItype
648 #define FROM_SINT_C_TYPE        TItype
649 #define FROM_UINT_C_TYPE        UTItype
650 #define FROM_MODE_NAME_S        ti
651 #define FROM_INT_SIZE           16      /* in bytes.  */
652
653 #elif defined (FROM_SF) && HAVE_SF == 1
654 #define FROM_TYPE               3       /* Floating-point.  */
655 #define FROM_FLOAT_C_TYPE       SFtype
656 #define FROM_MODE_NAME_S        sf
657
658 #elif defined (FROM_DF) && HAVE_DF == 1
659 #define FROM_TYPE               3       /* Floating-point.  */
660 #define FROM_FLOAT_C_TYPE       DFtype
661 #define FROM_MODE_NAME_S        df
662
663 #elif defined (FROM_QQ) && HAVE_QQ == 1
664 #define FROM_TYPE               4       /* Fixed-point.  */
665 #define FROM_MODE_NAME          QQ
666 #define FROM_MODE_NAME_S        qq
667 #define FROM_INT_C_TYPE         QItype
668 #define FROM_SINT_C_TYPE        QItype
669 #define FROM_UINT_C_TYPE        UQItype
670 #define FROM_MODE_UNSIGNED      0
671 #define FROM_FIXED_SIZE         1       /* in bytes.  */
672
673 #elif defined (FROM_HQ) && HAVE_HQ == 1
674 #define FROM_TYPE               4       /* Fixed-point.  */
675 #define FROM_MODE_NAME          HQ
676 #define FROM_MODE_NAME_S        hq
677 #define FROM_INT_C_TYPE         HItype
678 #define FROM_SINT_C_TYPE        HItype
679 #define FROM_UINT_C_TYPE        UHItype
680 #define FROM_MODE_UNSIGNED      0
681 #define FROM_FIXED_SIZE         2       /* in bytes.  */
682
683 #elif defined (FROM_SQ) && HAVE_SQ == 1
684 #define FROM_TYPE               4       /* Fixed-point.  */
685 #define FROM_MODE_NAME          SQ
686 #define FROM_MODE_NAME_S        sq
687 #define FROM_INT_C_TYPE         SItype
688 #define FROM_SINT_C_TYPE        SItype
689 #define FROM_UINT_C_TYPE        USItype
690 #define FROM_MODE_UNSIGNED      0
691 #define FROM_FIXED_SIZE         4       /* in bytes.  */
692
693 #elif defined (FROM_DQ) && HAVE_DQ == 1
694 #define FROM_TYPE               4       /* Fixed-point.  */
695 #define FROM_MODE_NAME          DQ
696 #define FROM_MODE_NAME_S        dq
697 #define FROM_INT_C_TYPE         DItype
698 #define FROM_SINT_C_TYPE        DItype
699 #define FROM_UINT_C_TYPE        UDItype
700 #define FROM_MODE_UNSIGNED      0
701 #define FROM_FIXED_SIZE         8       /* in bytes.  */
702
703 #elif defined (FROM_TQ) && HAVE_TQ == 1
704 #define FROM_TYPE               4       /* Fixed-point.  */
705 #define FROM_MODE_NAME          TQ
706 #define FROM_MODE_NAME_S        tq
707 #define FROM_INT_C_TYPE         TItype
708 #define FROM_SINT_C_TYPE        TItype
709 #define FROM_UINT_C_TYPE        UTItype
710 #define FROM_MODE_UNSIGNED      0
711 #define FROM_FIXED_SIZE         16      /* in bytes.  */
712
713 #elif defined (FROM_UQQ) && HAVE_UQQ == 1
714 #define FROM_TYPE               4       /* Fixed-point.  */
715 #define FROM_MODE_NAME          UQQ
716 #define FROM_MODE_NAME_S        uqq
717 #define FROM_INT_C_TYPE         UQItype
718 #define FROM_SINT_C_TYPE        QItype
719 #define FROM_UINT_C_TYPE        UQItype
720 #define FROM_MODE_UNSIGNED      1
721 #define FROM_FIXED_SIZE         1       /* in bytes.  */
722
723 #elif defined (FROM_UHQ) && HAVE_UHQ == 1
724 #define FROM_TYPE               4       /* Fixed-point.  */
725 #define FROM_MODE_NAME          UHQ
726 #define FROM_MODE_NAME_S        uhq
727 #define FROM_INT_C_TYPE         UHItype
728 #define FROM_SINT_C_TYPE        HItype
729 #define FROM_UINT_C_TYPE        UHItype
730 #define FROM_MODE_UNSIGNED      1
731 #define FROM_FIXED_SIZE         2       /* in bytes.  */
732
733 #elif defined (FROM_USQ) && HAVE_USQ == 1
734 #define FROM_TYPE               4       /* Fixed-point.  */
735 #define FROM_MODE_NAME          USQ
736 #define FROM_MODE_NAME_S        usq
737 #define FROM_INT_C_TYPE         USItype
738 #define FROM_SINT_C_TYPE        SItype
739 #define FROM_UINT_C_TYPE        USItype
740 #define FROM_MODE_UNSIGNED      1
741 #define FROM_FIXED_SIZE         4       /* in bytes.  */
742
743 #elif defined (FROM_UDQ) && HAVE_UDQ == 1
744 #define FROM_TYPE               4       /* Fixed-point.  */
745 #define FROM_MODE_NAME          UDQ
746 #define FROM_MODE_NAME_S        udq
747 #define FROM_INT_C_TYPE         UDItype
748 #define FROM_SINT_C_TYPE        DItype
749 #define FROM_UINT_C_TYPE        UDItype
750 #define FROM_MODE_UNSIGNED      1
751 #define FROM_FIXED_SIZE         8       /* in bytes.  */
752
753 #elif defined (FROM_UTQ) && HAVE_UTQ == 1
754 #define FROM_TYPE               4       /* Fixed-point.  */
755 #define FROM_MODE_NAME          UTQ
756 #define FROM_MODE_NAME_S        utq
757 #define FROM_INT_C_TYPE         UTItype
758 #define FROM_SINT_C_TYPE        TItype
759 #define FROM_UINT_C_TYPE        UTItype
760 #define FROM_MODE_UNSIGNED      1
761 #define FROM_FIXED_SIZE         16      /* in bytes.  */
762
763 #elif defined (FROM_HA) && HAVE_HA == 1
764 #define FROM_TYPE               4       /* Fixed-point.  */
765 #define FROM_MODE_NAME          HA
766 #define FROM_MODE_NAME_S        ha
767 #define FROM_INT_C_TYPE         HItype
768 #define FROM_SINT_C_TYPE        HItype
769 #define FROM_UINT_C_TYPE        UHItype
770 #define FROM_MODE_UNSIGNED      0
771 #define FROM_FIXED_SIZE         2       /* in bytes.  */
772
773 #elif defined (FROM_SA) && HAVE_SA == 1
774 #define FROM_TYPE               4       /* Fixed-point.  */
775 #define FROM_MODE_NAME          SA
776 #define FROM_MODE_NAME_S        sa
777 #define FROM_INT_C_TYPE         SItype
778 #define FROM_SINT_C_TYPE        SItype
779 #define FROM_UINT_C_TYPE        USItype
780 #define FROM_MODE_UNSIGNED      0
781 #define FROM_FIXED_SIZE         4       /* in bytes.  */
782
783 #elif defined (FROM_DA) && HAVE_DA == 1
784 #define FROM_TYPE               4       /* Fixed-point.  */
785 #define FROM_MODE_NAME          DA
786 #define FROM_MODE_NAME_S        da
787 #define FROM_INT_C_TYPE         DItype
788 #define FROM_SINT_C_TYPE        DItype
789 #define FROM_UINT_C_TYPE        UDItype
790 #define FROM_MODE_UNSIGNED      0
791 #define FROM_FIXED_SIZE         8       /* in bytes.  */
792
793 #elif defined (FROM_TA) && HAVE_TA == 1
794 #define FROM_TYPE               4       /* Fixed-point.  */
795 #define FROM_MODE_NAME          TA
796 #define FROM_MODE_NAME_S        ta
797 #define FROM_INT_C_TYPE         TItype
798 #define FROM_SINT_C_TYPE        TItype
799 #define FROM_UINT_C_TYPE        UTItype
800 #define FROM_MODE_UNSIGNED      0
801 #define FROM_FIXED_SIZE         16      /* in bytes.  */
802
803 #elif defined (FROM_UHA) && HAVE_UHA == 1
804 #define FROM_TYPE               4       /* Fixed-point.  */
805 #define FROM_MODE_NAME          UHA
806 #define FROM_MODE_NAME_S        uha
807 #define FROM_INT_C_TYPE         UHItype
808 #define FROM_SINT_C_TYPE        HItype
809 #define FROM_UINT_C_TYPE        UHItype
810 #define FROM_MODE_UNSIGNED      1
811 #define FROM_FIXED_SIZE         2       /* in bytes.  */
812
813 #elif defined (FROM_USA) && HAVE_USA == 1
814 #define FROM_TYPE               4       /* Fixed-point.  */
815 #define FROM_MODE_NAME          USA
816 #define FROM_MODE_NAME_S        usa
817 #define FROM_INT_C_TYPE         USItype
818 #define FROM_SINT_C_TYPE        SItype
819 #define FROM_UINT_C_TYPE        USItype
820 #define FROM_MODE_UNSIGNED      1
821 #define FROM_FIXED_SIZE         4       /* in bytes.  */
822
823 #elif defined (FROM_UDA) && HAVE_UDA == 1
824 #define FROM_TYPE               4       /* Fixed-point.  */
825 #define FROM_MODE_NAME          UDA
826 #define FROM_MODE_NAME_S        uda
827 #define FROM_INT_C_TYPE         UDItype
828 #define FROM_SINT_C_TYPE        DItype
829 #define FROM_UINT_C_TYPE        UDItype
830 #define FROM_MODE_UNSIGNED      1
831 #define FROM_FIXED_SIZE         8       /* in bytes.  */
832
833 #elif defined (FROM_UTA) && HAVE_UTA == 1
834 #define FROM_TYPE               4       /* Fixed-point.  */
835 #define FROM_MODE_NAME          UTA
836 #define FROM_MODE_NAME_S        uta
837 #define FROM_INT_C_TYPE         UTItype
838 #define FROM_SINT_C_TYPE        TItype
839 #define FROM_UINT_C_TYPE        UTItype
840 #define FROM_MODE_UNSIGNED      1
841 #define FROM_FIXED_SIZE         16      /* in bytes.  */
842
843 #endif
844
845 #if defined (TO_QI) && HAVE_QI == 1 && !defined (FROM_QI)
846 #define TO_TYPE                 1       /* Signed integer.  */
847 #define TO_INT_C_TYPE           QItype
848 #define TO_SINT_C_TYPE          QItype
849 #define TO_UINT_C_TYPE          UQItype
850 #define TO_MODE_NAME_S          qi
851
852 #elif defined (TO_HI) && HAVE_HI == 1 && !defined (FROM_HI)
853 #define TO_TYPE                 1       /* Signed integer.  */
854 #define TO_INT_C_TYPE           HItype
855 #define TO_SINT_C_TYPE          HItype
856 #define TO_UINT_C_TYPE          UHItype
857 #define TO_MODE_NAME_S          hi
858
859 #elif defined (TO_SI) && HAVE_SI == 1 && !defined (FROM_SI)
860 #define TO_TYPE                 1       /* Signed integer.  */
861 #define TO_INT_C_TYPE           SItype
862 #define TO_SINT_C_TYPE          SItype
863 #define TO_UINT_C_TYPE          USItype
864 #define TO_MODE_NAME_S          si
865
866 #elif defined (TO_DI) && HAVE_DI == 1 && !defined (FROM_DI)
867 #define TO_TYPE                 1       /* Signed integer.  */
868 #define TO_INT_C_TYPE           DItype
869 #define TO_SINT_C_TYPE          DItype
870 #define TO_UINT_C_TYPE          UDItype
871 #define TO_MODE_NAME_S          di
872
873 #elif defined (TO_TI) && HAVE_TI == 1 && !defined (FROM_TI)
874 #define TO_TYPE                 1       /* Signed integer.  */
875 #define TO_INT_C_TYPE           TItype
876 #define TO_SINT_C_TYPE          TItype
877 #define TO_UINT_C_TYPE          UTItype
878 #define TO_MODE_NAME_S          ti
879
880 #elif defined (TO_UQI) && HAVE_UQI == 1 && !defined (FROM_UQI)
881 #define TO_TYPE                 2       /* Unsigned integer.  */
882 #define TO_INT_C_TYPE           UQItype
883 #define TO_SINT_C_TYPE          QItype
884 #define TO_UINT_C_TYPE          UQItype
885 #define TO_MODE_NAME_S          qi
886
887 #elif defined (TO_UHI) && HAVE_UHI == 1 && !defined (FROM_UHI)
888 #define TO_TYPE                 2       /* Unsigned integer.  */
889 #define TO_INT_C_TYPE           UHItype
890 #define TO_SINT_C_TYPE          HItype
891 #define TO_UINT_C_TYPE          UHItype
892 #define TO_MODE_NAME_S          hi
893
894 #elif defined (TO_USI) && HAVE_USI == 1 && !defined (FROM_USI)
895 #define TO_TYPE                 2       /* Unsigned integer.  */
896 #define TO_INT_C_TYPE           USItype
897 #define TO_SINT_C_TYPE          SItype
898 #define TO_UINT_C_TYPE          USItype
899 #define TO_MODE_NAME_S          si
900
901 #elif defined (TO_UDI) && HAVE_UDI == 1 && !defined (FROM_UDI)
902 #define TO_TYPE                 2       /* Unsigned integer.  */
903 #define TO_INT_C_TYPE           UDItype
904 #define TO_SINT_C_TYPE          DItype
905 #define TO_UINT_C_TYPE          UDItype
906 #define TO_MODE_NAME_S          di
907
908 #elif defined (TO_UTI) && HAVE_UTI == 1 && !defined (FROM_UTI)
909 #define TO_TYPE                 2       /* Unsigned integer.  */
910 #define TO_INT_C_TYPE           UTItype
911 #define TO_SINT_C_TYPE          TItype
912 #define TO_UINT_C_TYPE          UTItype
913 #define TO_MODE_NAME_S          ti
914
915 #elif defined (TO_SF) && HAVE_SF == 1 && !defined (FROM_SF)
916 #define TO_TYPE                 3       /* Floating-point.  */
917 #define TO_FLOAT_C_TYPE         SFtype
918 #define TO_MODE_NAME_S          sf
919
920 #elif defined (TO_DF) && HAVE_DF == 1 && !defined (FROM_DF)
921 #define TO_TYPE                 3       /* Floating-point.  */
922 #define TO_FLOAT_C_TYPE         DFtype
923 #define TO_MODE_NAME_S          df
924
925 #elif defined (TO_QQ) && HAVE_QQ == 1 && !defined (FROM_QQ)
926 #define TO_TYPE                 4       /* Fixed-point.  */
927 #define TO_MODE_NAME            QQ
928 #define TO_MODE_NAME_S          qq
929 #define TO_INT_C_TYPE           QItype
930 #define TO_SINT_C_TYPE          QItype
931 #define TO_UINT_C_TYPE          UQItype
932 #define TO_MODE_UNSIGNED        0
933 #define TO_FIXED_SIZE           1       /* in bytes.  */
934
935 #elif defined (TO_HQ) && HAVE_HQ == 1 && !defined (FROM_HQ)
936 #define TO_TYPE                 4       /* Fixed-point.  */
937 #define TO_MODE_NAME            HQ
938 #define TO_MODE_NAME_S          hq
939 #define TO_INT_C_TYPE           HItype
940 #define TO_SINT_C_TYPE          HItype
941 #define TO_UINT_C_TYPE          UHItype
942 #define TO_MODE_UNSIGNED        0
943 #define TO_FIXED_SIZE           2       /* in bytes.  */
944
945 #elif defined (TO_SQ) && HAVE_SQ == 1 && !defined (FROM_SQ)
946 #define TO_TYPE                 4       /* Fixed-point.  */
947 #define TO_MODE_NAME            SQ
948 #define TO_MODE_NAME_S          sq
949 #define TO_INT_C_TYPE           SItype
950 #define TO_SINT_C_TYPE          SItype
951 #define TO_UINT_C_TYPE          USItype
952 #define TO_MODE_UNSIGNED        0
953 #define TO_FIXED_SIZE           4       /* in bytes.  */
954
955 #elif defined (TO_DQ) && HAVE_DQ == 1 && !defined (FROM_DQ)
956 #define TO_TYPE                 4       /* Fixed-point.  */
957 #define TO_MODE_NAME            DQ
958 #define TO_MODE_NAME_S          dq
959 #define TO_INT_C_TYPE           DItype
960 #define TO_SINT_C_TYPE          DItype
961 #define TO_UINT_C_TYPE          UDItype
962 #define TO_MODE_UNSIGNED        0
963 #define TO_FIXED_SIZE           8       /* in bytes.  */
964
965 #elif defined (TO_TQ) && HAVE_TQ == 1 && !defined (FROM_TQ)
966 #define TO_TYPE                 4       /* Fixed-point.  */
967 #define TO_MODE_NAME            TQ
968 #define TO_MODE_NAME_S          tq
969 #define TO_INT_C_TYPE           TItype
970 #define TO_SINT_C_TYPE          TItype
971 #define TO_UINT_C_TYPE          UTItype
972 #define TO_MODE_UNSIGNED        0
973 #define TO_FIXED_SIZE           16      /* in bytes.  */
974
975 #elif defined (TO_UQQ) && HAVE_UQQ == 1 && !defined (FROM_UQQ)
976 #define TO_TYPE                 4       /* Fixed-point.  */
977 #define TO_MODE_NAME            UQQ
978 #define TO_MODE_NAME_S          uqq
979 #define TO_INT_C_TYPE           UQItype
980 #define TO_SINT_C_TYPE          QItype
981 #define TO_UINT_C_TYPE          UQItype
982 #define TO_MODE_UNSIGNED        1
983 #define TO_FIXED_SIZE           1       /* in bytes.  */
984
985 #elif defined (TO_UHQ) && HAVE_UHQ == 1 && !defined (FROM_UHQ)
986 #define TO_TYPE                 4       /* Fixed-point.  */
987 #define TO_MODE_NAME            UHQ
988 #define TO_MODE_NAME_S          uhq
989 #define TO_INT_C_TYPE           UHItype
990 #define TO_SINT_C_TYPE          HItype
991 #define TO_UINT_C_TYPE          UHItype
992 #define TO_MODE_UNSIGNED        1
993 #define TO_FIXED_SIZE           2       /* in bytes.  */
994
995 #elif defined (TO_USQ) && HAVE_USQ == 1 && !defined (FROM_USQ)
996 #define TO_TYPE                 4       /* Fixed-point.  */
997 #define TO_MODE_NAME            USQ
998 #define TO_MODE_NAME_S          usq
999 #define TO_INT_C_TYPE           USItype
1000 #define TO_SINT_C_TYPE          SItype
1001 #define TO_UINT_C_TYPE          USItype
1002 #define TO_MODE_UNSIGNED        1
1003 #define TO_FIXED_SIZE           4       /* in bytes.  */
1004
1005 #elif defined (TO_UDQ) && HAVE_UDQ == 1 && !defined (FROM_UDQ)
1006 #define TO_TYPE                 4       /* Fixed-point.  */
1007 #define TO_MODE_NAME            UDQ
1008 #define TO_MODE_NAME_S          udq
1009 #define TO_INT_C_TYPE           UDItype
1010 #define TO_SINT_C_TYPE          DItype
1011 #define TO_UINT_C_TYPE          UDItype
1012 #define TO_MODE_UNSIGNED        1
1013 #define TO_FIXED_SIZE           8       /* in bytes.  */
1014
1015 #elif defined (TO_UTQ) && HAVE_UTQ == 1 && !defined (FROM_UTQ)
1016 #define TO_TYPE                 4       /* Fixed-point.  */
1017 #define TO_MODE_NAME            UTQ
1018 #define TO_MODE_NAME_S          utq
1019 #define TO_INT_C_TYPE           UTItype
1020 #define TO_SINT_C_TYPE          TItype
1021 #define TO_UINT_C_TYPE          UTItype
1022 #define TO_MODE_UNSIGNED        1
1023 #define TO_FIXED_SIZE           16      /* in bytes.  */
1024
1025 #elif defined (TO_HA) && HAVE_HA == 1 && !defined (FROM_HA)
1026 #define TO_TYPE                 4       /* Fixed-point.  */
1027 #define TO_MODE_NAME            HA
1028 #define TO_MODE_NAME_S          ha
1029 #define TO_INT_C_TYPE           HItype
1030 #define TO_SINT_C_TYPE          HItype
1031 #define TO_UINT_C_TYPE          UHItype
1032 #define TO_MODE_UNSIGNED        0
1033 #define TO_FIXED_SIZE           2       /* in bytes.  */
1034
1035 #elif defined (TO_SA) && HAVE_SA == 1 && !defined (FROM_SA)
1036 #define TO_TYPE                 4       /* Fixed-point.  */
1037 #define TO_MODE_NAME            SA
1038 #define TO_MODE_NAME_S          sa
1039 #define TO_INT_C_TYPE           SItype
1040 #define TO_SINT_C_TYPE          SItype
1041 #define TO_UINT_C_TYPE          USItype
1042 #define TO_MODE_UNSIGNED        0
1043 #define TO_FIXED_SIZE           4       /* in bytes.  */
1044
1045 #elif defined (TO_DA) && HAVE_DA == 1 && !defined (FROM_DA)
1046 #define TO_TYPE                 4       /* Fixed-point.  */
1047 #define TO_MODE_NAME            DA
1048 #define TO_MODE_NAME_S          da
1049 #define TO_INT_C_TYPE           DItype
1050 #define TO_SINT_C_TYPE          DItype
1051 #define TO_UINT_C_TYPE          UDItype
1052 #define TO_MODE_UNSIGNED        0
1053 #define TO_FIXED_SIZE           8       /* in bytes.  */
1054
1055 #elif defined (TO_TA) && HAVE_TA == 1 && !defined (FROM_TA)
1056 #define TO_TYPE                 4       /* Fixed-point.  */
1057 #define TO_MODE_NAME            TA
1058 #define TO_MODE_NAME_S          ta
1059 #define TO_INT_C_TYPE           TItype
1060 #define TO_SINT_C_TYPE          TItype
1061 #define TO_UINT_C_TYPE          UTItype
1062 #define TO_MODE_UNSIGNED        0
1063 #define TO_FIXED_SIZE           16      /* in bytes.  */
1064
1065 #elif defined (TO_UHA) && HAVE_UHA == 1 && !defined (FROM_UHA)
1066 #define TO_TYPE                 4       /* Fixed-point.  */
1067 #define TO_MODE_NAME            UHA
1068 #define TO_MODE_NAME_S          uha
1069 #define TO_INT_C_TYPE           UHItype
1070 #define TO_SINT_C_TYPE          HItype
1071 #define TO_UINT_C_TYPE          UHItype
1072 #define TO_MODE_UNSIGNED        1
1073 #define TO_FIXED_SIZE           2       /* in bytes.  */
1074
1075 #elif defined (TO_USA) && HAVE_USA == 1 && !defined (FROM_USA)
1076 #define TO_TYPE                 4       /* Fixed-point.  */
1077 #define TO_MODE_NAME            USA
1078 #define TO_MODE_NAME_S          usa
1079 #define TO_INT_C_TYPE           USItype
1080 #define TO_SINT_C_TYPE          SItype
1081 #define TO_UINT_C_TYPE          USItype
1082 #define TO_MODE_UNSIGNED        1
1083 #define TO_FIXED_SIZE           4       /* in bytes.  */
1084
1085 #elif defined (TO_UDA) && HAVE_UDA == 1 && !defined (FROM_UDA)
1086 #define TO_TYPE                 4       /* Fixed-point.  */
1087 #define TO_MODE_NAME            UDA
1088 #define TO_MODE_NAME_S          uda
1089 #define TO_INT_C_TYPE           UDItype
1090 #define TO_SINT_C_TYPE          DItype
1091 #define TO_UINT_C_TYPE          UDItype
1092 #define TO_MODE_UNSIGNED        1
1093 #define TO_FIXED_SIZE           8       /* in bytes.  */
1094
1095 #elif defined (TO_UTA) && HAVE_UTA == 1 && !defined (FROM_UTA)
1096 #define TO_TYPE                 4       /* Fixed-point.  */
1097 #define TO_MODE_NAME            UTA
1098 #define TO_MODE_NAME_S          uta
1099 #define TO_INT_C_TYPE           UTItype
1100 #define TO_SINT_C_TYPE          TItype
1101 #define TO_UINT_C_TYPE          UTItype
1102 #define TO_MODE_UNSIGNED        1
1103 #define TO_FIXED_SIZE           16      /* in bytes.  */
1104
1105 #endif
1106
1107 #if defined (FROM_MODE_NAME_S) && defined (TO_MODE_NAME_S)
1108
1109 #if FROM_TYPE == 1      /* Signed integer.  */
1110 #define FROM_INT_WIDTH          (FROM_INT_SIZE * BITS_PER_UNIT)
1111 #endif
1112
1113 #if FROM_TYPE == 2      /* Unsigned integer.  */
1114 #define FROM_INT_WIDTH          (FROM_INT_SIZE * BITS_PER_UNIT)
1115 #endif
1116
1117 #if FROM_TYPE == 4      /* Fixed-point.  */
1118 #define FROM_FIXED_C_TYPE       FIXED_C_TYPE2(FROM_MODE_NAME)
1119 #define FROM_FBITS              FBITS2(FROM_MODE_NAME)
1120 #define FROM_FIXED_WIDTH        (FROM_FIXED_SIZE * BITS_PER_UNIT)
1121 #define FROM_FBITS              FBITS2(FROM_MODE_NAME)
1122 #define FROM_IBITS              IBITS2(FROM_MODE_NAME)
1123 #define FROM_I_F_BITS           (FROM_FBITS + FROM_IBITS)
1124
1125 #if FROM_MODE_UNSIGNED == 0 /* Signed types.  */
1126 #define FROM_PADDING_BITS       (FROM_FIXED_WIDTH - 1 - FROM_I_F_BITS)
1127 #define FROM_NONPADDING_BITS    (1 + FROM_I_F_BITS)
1128 #else /* Unsigned types.  */
1129 #define FROM_PADDING_BITS       (FROM_FIXED_WIDTH - FROM_I_F_BITS)
1130 #define FROM_NONPADDING_BITS    (FROM_I_F_BITS)
1131 #endif
1132 #define FROM_HAVE_PADDING_BITS  (FROM_PADDING_BITS > 0)
1133 #endif /* FROM_TYPE == 4  */
1134
1135 #if TO_TYPE == 4        /* Fixed-point.  */
1136 #define TO_FIXED_C_TYPE         FIXED_C_TYPE2(TO_MODE_NAME)
1137 #define TO_FBITS                FBITS2(TO_MODE_NAME)
1138 #define TO_FIXED_WIDTH          (TO_FIXED_SIZE * BITS_PER_UNIT)
1139 #define TO_FBITS                FBITS2(TO_MODE_NAME)
1140 #define TO_IBITS                IBITS2(TO_MODE_NAME)
1141 #define TO_I_F_BITS             (TO_FBITS + TO_IBITS)
1142
1143 #if TO_MODE_UNSIGNED == 0 /* Signed types.  */
1144 #define TO_PADDING_BITS         (TO_FIXED_WIDTH - 1 - TO_I_F_BITS)
1145 #define TO_NONPADDING_BITS      (1 + TO_I_F_BITS)
1146 #else /* Unsigned types.  */
1147 #define TO_PADDING_BITS         (TO_FIXED_WIDTH - TO_I_F_BITS)
1148 #define TO_NONPADDING_BITS      (TO_I_F_BITS)
1149 #endif
1150 #define TO_HAVE_PADDING_BITS    (TO_PADDING_BITS > 0)
1151 #endif /* TO_TYPE == 4  */
1152
1153 #ifdef LIBGCC2_GNU_PREFIX
1154 #define FIXED_CONVERT_OP(OP,FROM,TO)    __gnu_ ## OP ## FROM ## TO
1155 #define FIXED_CONVERT_OP2(OP,FROM,TO)   __gnu_ ## OP ## FROM ## TO ## 2
1156 #else
1157 #define FIXED_CONVERT_OP(OP,FROM,TO)    __ ## OP ## FROM ## TO
1158 #define FIXED_CONVERT_OP2(OP,FROM,TO)   __ ## OP ## FROM ## TO ## 2
1159 #endif
1160 #define FRACT_TEMP(N1,N2)               FIXED_CONVERT_OP(fract,N1,N2)
1161 #define FRACT2_TEMP(N1,N2)              FIXED_CONVERT_OP2(fract,N1,N2)
1162 #define SATFRACT_TEMP(N1,N2)            FIXED_CONVERT_OP(satfract,N1,N2)
1163 #define SATFRACT2_TEMP(N1,N2)           FIXED_CONVERT_OP2(satfract,N1,N2)
1164 #define FRACTUNS_TEMP(N1,N2)            FIXED_CONVERT_OP(fractuns,N1,N2)
1165 #define SATFRACTUNS_TEMP(N1,N2)         FIXED_CONVERT_OP(satfractuns,N1,N2)
1166
1167 /* Define conversions from fixed-point to fixed-point.  */
1168 #if FROM_TYPE == 4 && TO_TYPE == 4
1169
1170 #if FROM_FIXED_SIZE > TO_FIXED_SIZE
1171 #define BIG_SINT_C_TYPE FROM_SINT_C_TYPE
1172 #define BIG_UINT_C_TYPE FROM_UINT_C_TYPE
1173 #define BIG_WIDTH       FROM_FIXED_WIDTH
1174 #else
1175 #define BIG_SINT_C_TYPE TO_SINT_C_TYPE
1176 #define BIG_UINT_C_TYPE TO_UINT_C_TYPE
1177 #define BIG_WIDTH       TO_FIXED_WIDTH
1178 #endif
1179
1180 /* Check if FROM* and TO* are in the same machine class.  */
1181 #if ((FROM_MODE_UNSIGNED == TO_MODE_UNSIGNED) \
1182      && ((FROM_IBITS == 0) == (TO_IBITS == 0)))
1183 /* Same modes: append '2' to conversion function names */
1184 #define FRACT           FRACT2_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1185 #define SATFRACT        SATFRACT2_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1186 #else
1187 /* Different modes: don't append '2' to conversion function names */
1188 #define FRACT           FRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1189 #define SATFRACT        SATFRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1190 #endif
1191
1192 extern TO_FIXED_C_TYPE FRACT (FROM_FIXED_C_TYPE);
1193 extern TO_FIXED_C_TYPE SATFRACT (FROM_FIXED_C_TYPE);
1194 #endif /* FROM_TYPE == 4 && TO_TYPE == 4  */
1195
1196 /* Define conversions from fixed-point to signed integer.  */
1197 #if FROM_TYPE == 4 && TO_TYPE == 1
1198 #define FRACT           FRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1199 extern TO_INT_C_TYPE    FRACT (FROM_FIXED_C_TYPE);
1200 #endif /* FROM_TYPE == 4 && TO_TYPE == 1  */
1201
1202 /* Define conversions from fixed-point to unsigned integer.  */
1203 #if FROM_TYPE == 4 && TO_TYPE == 2
1204 #define FRACTUNS        FRACTUNS_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1205 extern TO_INT_C_TYPE    FRACTUNS (FROM_FIXED_C_TYPE);
1206 #endif /* FROM_TYPE == 4 && TO_TYPE == 2  */
1207
1208 /* Define conversions from fixed-point to floating-point.  */
1209 #if FROM_TYPE == 4 && TO_TYPE == 3
1210 #define BASE1(NUM)      0x1.0p ## NUM
1211 #define BASE2(NUM)      BASE1(NUM)
1212 #define BASE            BASE2(FROM_FBITS)
1213 #define FRACT           FRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1214 extern TO_FLOAT_C_TYPE  FRACT (FROM_FIXED_C_TYPE);
1215 #endif /* FROM_TYPE == 4 && TO_TYPE == 3  */
1216
1217 /* Define conversions from signed integer to fixed-point.  */
1218 #if FROM_TYPE == 1 && TO_TYPE == 4
1219
1220 #if FROM_INT_SIZE > TO_FIXED_SIZE
1221 #define BIG_SINT_C_TYPE FROM_SINT_C_TYPE
1222 #define BIG_UINT_C_TYPE FROM_UINT_C_TYPE
1223 #define BIG_WIDTH       FROM_INT_WIDTH
1224 #else
1225 #define BIG_SINT_C_TYPE TO_SINT_C_TYPE
1226 #define BIG_UINT_C_TYPE TO_UINT_C_TYPE
1227 #define BIG_WIDTH       TO_FIXED_WIDTH
1228 #endif
1229
1230 #define FRACT           FRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1231 #define SATFRACT        SATFRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1232 extern TO_FIXED_C_TYPE  FRACT (FROM_INT_C_TYPE);
1233 extern TO_FIXED_C_TYPE  SATFRACT (FROM_INT_C_TYPE);
1234 #endif /* FROM_TYPE == 1 && TO_TYPE == 4  */
1235
1236 /* Define conversions from unsigned integer to fixed-point.  */
1237 #if FROM_TYPE == 2 && TO_TYPE == 4
1238
1239 #if FROM_INT_SIZE > TO_FIXED_SIZE
1240 #define BIG_SINT_C_TYPE FROM_SINT_C_TYPE
1241 #define BIG_UINT_C_TYPE FROM_UINT_C_TYPE
1242 #define BIG_WIDTH       FROM_INT_WIDTH
1243 #else
1244 #define BIG_SINT_C_TYPE TO_SINT_C_TYPE
1245 #define BIG_UINT_C_TYPE TO_UINT_C_TYPE
1246 #define BIG_WIDTH       TO_FIXED_WIDTH
1247 #endif
1248
1249 #define FRACTUNS        FRACTUNS_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1250 #define SATFRACTUNS     SATFRACTUNS_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1251 extern TO_FIXED_C_TYPE  FRACTUNS (FROM_INT_C_TYPE);
1252 extern TO_FIXED_C_TYPE  SATFRACTUNS (FROM_INT_C_TYPE);
1253 #endif /* FROM_TYPE == 2 && TO_TYPE == 4  */
1254
1255 /* Define conversions from floating-point to fixed-point.  */
1256 #if FROM_TYPE == 3 && TO_TYPE == 4
1257
1258 #define BASE1(NUM)      (0x1.0p ## NUM)
1259 #define BASE2(NUM)      BASE1(NUM)
1260 #define BASE            BASE2(TO_FBITS)
1261
1262 #define FIXED_MAX1(NUM1,NUM2)   (0x1.0p ## NUM1 - 0x1.0p- ## NUM2)
1263 #define FIXED_MAX2(NUM1,NUM2)   FIXED_MAX1(NUM1,NUM2)
1264 #define FIXED_MAX       FIXED_MAX2(TO_IBITS,TO_FBITS)
1265
1266 #define FIXED_MIN1(NUM) (-0x1.0p ## NUM)
1267 #define FIXED_MIN2(NUM) FIXED_MIN1(NUM)
1268 #if TO_MODE_UNSIGNED == 0
1269 #define FIXED_MIN       FIXED_MIN2(TO_IBITS)
1270 #else
1271 #define FIXED_MIN       0.0
1272 #endif
1273
1274 #define FRACT           FRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1275 #define SATFRACT        SATFRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1276 extern TO_FIXED_C_TYPE  FRACT (FROM_FLOAT_C_TYPE);
1277 extern TO_FIXED_C_TYPE  SATFRACT (FROM_FLOAT_C_TYPE);
1278 #endif /* FROM_TYPE == 3 && TO_TYPE == 4  */
1279
1280 #endif /* defined (FROM_MODE_NAME_S) && defined (TO_MODE_NAME_S)  */
1281
1282 #endif  /* _FIXED_BIT_H */