1 /* This is a software fixed-point library.
2 Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
4 This file is part of GCC.
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
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
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.
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/>. */
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,
32 Then, all operators for this machine mode will be created.
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
44 #ifndef LIBGCC2_LONG_DOUBLE_TYPE_SIZE
45 #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE
48 #ifndef LIBGCC2_HAS_SF_MODE
49 #define LIBGCC2_HAS_SF_MODE (BITS_PER_UNIT == 8)
52 #ifndef LIBGCC2_HAS_DF_MODE
53 #define LIBGCC2_HAS_DF_MODE \
55 && (__SIZEOF_DOUBLE__ * __CHAR_BIT__ == 64 \
56 || LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 64))
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)));
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)));
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)));
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)));
125 #if LIBGCC2_HAS_SF_MODE
126 typedef float SFtype __attribute__ ((mode (SF)));
129 #if LIBGCC2_HAS_DF_MODE
130 typedef float DFtype __attribute__ ((mode (DF)));
134 typedef int word_type __attribute__ ((mode (__word__)));
136 /* Based on modes, we create many defines. */
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
145 #define MODE_NAME_S qq
146 #define MODE_UNSIGNED 0
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
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
166 #define DINT_C_TYPE SItype
167 #define DUINT_C_TYPE USItype
169 #define HINT_C_TYPE QItype
170 #define HUINT_C_TYPE UQItype
174 #define MODE_NAME_S hq
175 #define MODE_UNSIGNED 0
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
184 #define DINT_C_TYPE USItype
185 #define DUINT_C_TYPE USItype
187 #define HINT_C_TYPE UQItype
188 #define HUINT_C_TYPE UQItype
191 #define MODE_NAME UHQ
192 #define MODE_NAME_S uhq
193 #define MODE_UNSIGNED 1
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
202 #define DINT_C_TYPE DItype
203 #define DUINT_C_TYPE UDItype
205 #define HINT_C_TYPE HItype
206 #define HUINT_C_TYPE UHItype
210 #define MODE_NAME_S sq
211 #define MODE_UNSIGNED 0
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
220 #define DINT_C_TYPE UDItype
221 #define DUINT_C_TYPE UDItype
223 #define HINT_C_TYPE UHItype
224 #define HUINT_C_TYPE UHItype
227 #define MODE_NAME USQ
228 #define MODE_NAME_S usq
229 #define MODE_UNSIGNED 1
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
238 #define DINT_C_TYPE TItype
239 #define DUINT_C_TYPE UTItype
241 #define HINT_C_TYPE SItype
242 #define HUINT_C_TYPE USItype
246 #define MODE_NAME_S dq
247 #define MODE_UNSIGNED 0
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
256 #define DINT_C_TYPE UTItype
257 #define DUINT_C_TYPE UTItype
259 #define HINT_C_TYPE USItype
260 #define HUINT_C_TYPE USItype
263 #define MODE_NAME UDQ
264 #define MODE_NAME_S udq
265 #define MODE_UNSIGNED 1
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
275 #define MODE_NAME_S tq
276 #define MODE_UNSIGNED 0
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
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
296 #define DINT_C_TYPE SItype
297 #define DUINT_C_TYPE USItype
299 #define HINT_C_TYPE QItype
300 #define HUINT_C_TYPE UQItype
304 #define MODE_NAME_S ha
305 #define MODE_UNSIGNED 0
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
314 #define DINT_C_TYPE USItype
315 #define DUINT_C_TYPE USItype
317 #define HINT_C_TYPE UQItype
318 #define HUINT_C_TYPE UQItype
321 #define MODE_NAME UHA
322 #define MODE_NAME_S uha
323 #define MODE_UNSIGNED 1
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
332 #define DINT_C_TYPE DItype
333 #define DUINT_C_TYPE UDItype
335 #define HINT_C_TYPE HItype
336 #define HUINT_C_TYPE UHItype
340 #define MODE_NAME_S sa
341 #define MODE_UNSIGNED 0
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
350 #define DINT_C_TYPE UDItype
351 #define DUINT_C_TYPE UDItype
353 #define HINT_C_TYPE UHItype
354 #define HUINT_C_TYPE UHItype
357 #define MODE_NAME USA
358 #define MODE_NAME_S usa
359 #define MODE_UNSIGNED 1
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
368 #define DINT_C_TYPE TItype
369 #define DUINT_C_TYPE UTItype
371 #define HINT_C_TYPE SItype
372 #define HUINT_C_TYPE USItype
376 #define MODE_NAME_S da
377 #define MODE_UNSIGNED 0
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
386 #define DINT_C_TYPE UTItype
387 #define DUINT_C_TYPE UTItype
389 #define HINT_C_TYPE USItype
390 #define HUINT_C_TYPE USItype
393 #define MODE_NAME UDA
394 #define MODE_NAME_S uda
395 #define MODE_UNSIGNED 1
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
405 #define MODE_NAME_S ta
406 #define MODE_UNSIGNED 0
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
420 /* The following defines are based on the previous defines. */
422 #if defined (HINT_C_TYPE)
423 #if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
424 struct INTstruct {HINT_C_TYPE high, low;};
426 struct INTstruct {HINT_C_TYPE low, high;};
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)
448 #ifdef LIBGCC2_GNU_PREFIX
449 #define FIXED_OP(OP,MODE,NUM) __gnu_ ## OP ## MODE ## NUM
451 #define FIXED_OP(OP,MODE,NUM) __ ## OP ## MODE ## NUM
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)
482 #if defined (MODE_NAME)
483 #if defined (DINT_C_TYPE)
484 #define FIXED_SATURATE1 FIXED_SATURATE1_TEMP(MODE_NAME_S)
486 #define FIXED_SATURATE2 FIXED_SATURATE2_TEMP(MODE_NAME_S)
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)
498 /* The following functions are for all fixed-point modes. */
499 #if defined (DINT_C_TYPE)
500 extern void FIXED_SATURATE1 (DINT_C_TYPE *);
502 extern void FIXED_SATURATE2 (INT_C_TYPE *, INT_C_TYPE *);
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);
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)
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)
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);
540 #else /* Unsigned types. */
541 #define PADDING_BITS (FIXED_WIDTH - I_F_BITS)
542 #define NONPADDING_BITS (I_F_BITS)
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)
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);
565 #endif /* End of testing MODE_UNSIGNED. */
567 /* This define is to check if this mode have any padding bits. */
568 #define HAVE_PADDING_BITS (PADDING_BITS > 0)
570 /* ------------------------------------------------------------------------ */
571 /* The following defines are for conversions. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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
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
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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
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
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
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
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
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
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
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
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
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
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
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
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
1107 #if defined (FROM_MODE_NAME_S) && defined (TO_MODE_NAME_S)
1109 #if FROM_TYPE == 1 /* Signed integer. */
1110 #define FROM_INT_WIDTH (FROM_INT_SIZE * BITS_PER_UNIT)
1113 #if FROM_TYPE == 2 /* Unsigned integer. */
1114 #define FROM_INT_WIDTH (FROM_INT_SIZE * BITS_PER_UNIT)
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)
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)
1132 #define FROM_HAVE_PADDING_BITS (FROM_PADDING_BITS > 0)
1133 #endif /* FROM_TYPE == 4 */
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)
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)
1150 #define TO_HAVE_PADDING_BITS (TO_PADDING_BITS > 0)
1151 #endif /* TO_TYPE == 4 */
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
1157 #define FIXED_CONVERT_OP(OP,FROM,TO) __ ## OP ## FROM ## TO
1158 #define FIXED_CONVERT_OP2(OP,FROM,TO) __ ## OP ## FROM ## TO ## 2
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)
1167 /* Define conversions from fixed-point to fixed-point. */
1168 #if FROM_TYPE == 4 && TO_TYPE == 4
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
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
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)
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)
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 */
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 */
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 */
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 */
1217 /* Define conversions from signed integer to fixed-point. */
1218 #if FROM_TYPE == 1 && TO_TYPE == 4
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
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
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 */
1236 /* Define conversions from unsigned integer to fixed-point. */
1237 #if FROM_TYPE == 2 && TO_TYPE == 4
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
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
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 */
1255 /* Define conversions from floating-point to fixed-point. */
1256 #if FROM_TYPE == 3 && TO_TYPE == 4
1258 #define BASE1(NUM) (0x1.0p ## NUM)
1259 #define BASE2(NUM) BASE1(NUM)
1260 #define BASE BASE2(TO_FBITS)
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)
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)
1271 #define FIXED_MIN 0.0
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 */
1280 #endif /* defined (FROM_MODE_NAME_S) && defined (TO_MODE_NAME_S) */
1282 #endif /* _FIXED_BIT_H */