OSDN Git Service

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