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 #define FIXED_OP(OP,MODE,NUM) OP ## MODE ## NUM
450 #define FIXED_SATURATE1_TEMP(NAME) FIXED_OP(__saturate1,NAME,)
451 #define FIXED_SATURATE2_TEMP(NAME) FIXED_OP(__saturate2,NAME,)
452 #define FIXED_MULHELPER_TEMP(NAME) FIXED_OP(__mulhelper,NAME,)
453 #define FIXED_DIVHELPER_TEMP(NAME) FIXED_OP(__divhelper,NAME,)
454 #define FIXED_ASHLHELPER_TEMP(NAME) FIXED_OP(__ashlhelper,NAME,)
455 #define FIXED_ADD_TEMP(NAME) FIXED_OP(__add,NAME,3)
456 #define FIXED_SSADD_TEMP(NAME) FIXED_OP(__ssadd,NAME,3)
457 #define FIXED_USADD_TEMP(NAME) FIXED_OP(__usadd,NAME,3)
458 #define FIXED_SUB_TEMP(NAME) FIXED_OP(__sub,NAME,3)
459 #define FIXED_SSSUB_TEMP(NAME) FIXED_OP(__sssub,NAME,3)
460 #define FIXED_USSUB_TEMP(NAME) FIXED_OP(__ussub,NAME,3)
461 #define FIXED_MUL_TEMP(NAME) FIXED_OP(__mul,NAME,3)
462 #define FIXED_SSMUL_TEMP(NAME) FIXED_OP(__ssmul,NAME,3)
463 #define FIXED_USMUL_TEMP(NAME) FIXED_OP(__usmul,NAME,3)
464 #define FIXED_DIV_TEMP(NAME) FIXED_OP(__div,NAME,3)
465 #define FIXED_UDIV_TEMP(NAME) FIXED_OP(__udiv,NAME,3)
466 #define FIXED_SSDIV_TEMP(NAME) FIXED_OP(__ssdiv,NAME,3)
467 #define FIXED_USDIV_TEMP(NAME) FIXED_OP(__usdiv,NAME,3)
468 #define FIXED_NEG_TEMP(NAME) FIXED_OP(__neg,NAME,2)
469 #define FIXED_SSNEG_TEMP(NAME) FIXED_OP(__ssneg,NAME,2)
470 #define FIXED_USNEG_TEMP(NAME) FIXED_OP(__usneg,NAME,2)
471 #define FIXED_ASHL_TEMP(NAME) FIXED_OP(__ashl,NAME,3)
472 #define FIXED_ASHR_TEMP(NAME) FIXED_OP(__ashr,NAME,3)
473 #define FIXED_LSHR_TEMP(NAME) FIXED_OP(__lshr,NAME,3)
474 #define FIXED_SSASHL_TEMP(NAME) FIXED_OP(__ssashl,NAME,3)
475 #define FIXED_USASHL_TEMP(NAME) FIXED_OP(__usashl,NAME,3)
476 #define FIXED_CMP_TEMP(NAME) FIXED_OP(__cmp,NAME,2)
478 #if defined (MODE_NAME)
479 #if defined (DINT_C_TYPE)
480 #define FIXED_SATURATE1 FIXED_SATURATE1_TEMP(MODE_NAME_S)
482 #define FIXED_SATURATE2 FIXED_SATURATE2_TEMP(MODE_NAME_S)
484 #define FIXED_MULHELPER FIXED_MULHELPER_TEMP(MODE_NAME_S)
485 #define FIXED_DIVHELPER FIXED_DIVHELPER_TEMP(MODE_NAME_S)
486 #define FIXED_ASHLHELPER FIXED_ASHLHELPER_TEMP(MODE_NAME_S)
487 #define FIXED_ADD FIXED_ADD_TEMP(MODE_NAME_S)
488 #define FIXED_SUB FIXED_SUB_TEMP(MODE_NAME_S)
489 #define FIXED_MUL FIXED_MUL_TEMP(MODE_NAME_S)
490 #define FIXED_NEG FIXED_NEG_TEMP(MODE_NAME_S)
491 #define FIXED_ASHL FIXED_ASHL_TEMP(MODE_NAME_S)
492 #define FIXED_CMP FIXED_CMP_TEMP(MODE_NAME_S)
494 /* The following functions are for all fixed-point modes. */
495 #if defined (DINT_C_TYPE)
496 extern void FIXED_SATURATE1 (DINT_C_TYPE
*);
498 extern void FIXED_SATURATE2 (INT_C_TYPE
*, INT_C_TYPE
*);
500 extern FIXED_C_TYPE
FIXED_MULHELPER (FIXED_C_TYPE
, FIXED_C_TYPE
, word_type
);
501 extern FIXED_C_TYPE
FIXED_DIVHELPER (FIXED_C_TYPE
, FIXED_C_TYPE
, word_type
);
502 extern FIXED_C_TYPE
FIXED_ASHLHELPER (FIXED_C_TYPE
, word_type
, word_type
);
503 extern FIXED_C_TYPE
FIXED_ADD (FIXED_C_TYPE
, FIXED_C_TYPE
);
504 extern FIXED_C_TYPE
FIXED_SUB (FIXED_C_TYPE
, FIXED_C_TYPE
);
505 extern FIXED_C_TYPE
FIXED_MUL (FIXED_C_TYPE
, FIXED_C_TYPE
);
506 extern FIXED_C_TYPE
FIXED_NEG (FIXED_C_TYPE
);
507 extern FIXED_C_TYPE
FIXED_ASHL (FIXED_C_TYPE
, word_type
);
508 extern word_type
FIXED_CMP (FIXED_C_TYPE
, FIXED_C_TYPE
);
511 #if MODE_UNSIGNED == 0 /* Signed types. */
512 #define PADDING_BITS (FIXED_WIDTH - 1 - I_F_BITS)
513 #define NONPADDING_BITS (1 + I_F_BITS)
515 #if defined (MODE_NAME)
516 #define FIXED_DIV FIXED_DIV_TEMP(MODE_NAME_S)
517 #define FIXED_ASHR FIXED_ASHR_TEMP(MODE_NAME_S)
518 #define FIXED_SSADD FIXED_SSADD_TEMP(MODE_NAME_S)
519 #define FIXED_SSSUB FIXED_SSSUB_TEMP(MODE_NAME_S)
520 #define FIXED_SSMUL FIXED_SSMUL_TEMP(MODE_NAME_S)
521 #define FIXED_SSDIV FIXED_SSDIV_TEMP(MODE_NAME_S)
522 #define FIXED_SSNEG FIXED_SSNEG_TEMP(MODE_NAME_S)
523 #define FIXED_SSASHL FIXED_SSASHL_TEMP(MODE_NAME_S)
525 /* The following functions are for signed fixed-point modes. */
526 extern FIXED_C_TYPE
FIXED_DIV (FIXED_C_TYPE
, FIXED_C_TYPE
);
527 extern FIXED_C_TYPE
FIXED_ASHR (FIXED_C_TYPE
, word_type
);
528 extern FIXED_C_TYPE
FIXED_SSADD (FIXED_C_TYPE
, FIXED_C_TYPE
);
529 extern FIXED_C_TYPE
FIXED_SSSUB (FIXED_C_TYPE
, FIXED_C_TYPE
);
530 extern FIXED_C_TYPE
FIXED_SSMUL (FIXED_C_TYPE
, FIXED_C_TYPE
);
531 extern FIXED_C_TYPE
FIXED_SSDIV (FIXED_C_TYPE
, FIXED_C_TYPE
);
532 extern FIXED_C_TYPE
FIXED_SSNEG (FIXED_C_TYPE
);
533 extern FIXED_C_TYPE
FIXED_SSASHL (FIXED_C_TYPE
, word_type
);
536 #else /* Unsigned types. */
537 #define PADDING_BITS (FIXED_WIDTH - I_F_BITS)
538 #define NONPADDING_BITS (I_F_BITS)
540 #if defined (MODE_NAME)
541 #define FIXED_UDIV FIXED_UDIV_TEMP(MODE_NAME_S)
542 #define FIXED_LSHR FIXED_LSHR_TEMP(MODE_NAME_S)
543 #define FIXED_USDIV FIXED_USDIV_TEMP(MODE_NAME_S)
544 #define FIXED_USADD FIXED_USADD_TEMP(MODE_NAME_S)
545 #define FIXED_USSUB FIXED_USSUB_TEMP(MODE_NAME_S)
546 #define FIXED_USMUL FIXED_USMUL_TEMP(MODE_NAME_S)
547 #define FIXED_USNEG FIXED_USNEG_TEMP(MODE_NAME_S)
548 #define FIXED_USASHL FIXED_USASHL_TEMP(MODE_NAME_S)
550 /* The following functions are for unsigned fixed-point modes. */
551 extern FIXED_C_TYPE
FIXED_UDIV (FIXED_C_TYPE
, FIXED_C_TYPE
);
552 extern FIXED_C_TYPE
FIXED_LSHR (FIXED_C_TYPE
, word_type
);
553 extern FIXED_C_TYPE
FIXED_USADD (FIXED_C_TYPE
, FIXED_C_TYPE
);
554 extern FIXED_C_TYPE
FIXED_USSUB (FIXED_C_TYPE
, FIXED_C_TYPE
);
555 extern FIXED_C_TYPE
FIXED_USMUL (FIXED_C_TYPE
, FIXED_C_TYPE
);
556 extern FIXED_C_TYPE
FIXED_USDIV (FIXED_C_TYPE
, FIXED_C_TYPE
);
557 extern FIXED_C_TYPE
FIXED_USNEG (FIXED_C_TYPE
);
558 extern FIXED_C_TYPE
FIXED_USASHL (FIXED_C_TYPE
, word_type
);
561 #endif /* End of testing MODE_UNSIGNED. */
563 /* This define is to check if this mode have any padding bits. */
564 #define HAVE_PADDING_BITS (PADDING_BITS > 0)
566 /* ------------------------------------------------------------------------ */
567 /* The following defines are for conversions. */
569 #if defined (FROM_QI) && HAVE_QI == 1
570 #define FROM_TYPE 1 /* Signed integer. */
571 #define FROM_INT_C_TYPE QItype
572 #define FROM_SINT_C_TYPE QItype
573 #define FROM_UINT_C_TYPE UQItype
574 #define FROM_MODE_NAME_S qi
575 #define FROM_INT_SIZE 1 /* in bytes. */
577 #elif defined (FROM_HI) && HAVE_HI == 1
578 #define FROM_TYPE 1 /* Signed integer. */
579 #define FROM_INT_C_TYPE HItype
580 #define FROM_SINT_C_TYPE HItype
581 #define FROM_UINT_C_TYPE UHItype
582 #define FROM_MODE_NAME_S hi
583 #define FROM_INT_SIZE 2 /* in bytes. */
585 #elif defined (FROM_SI) && HAVE_SI == 1
586 #define FROM_TYPE 1 /* Signed integer. */
587 #define FROM_INT_C_TYPE SItype
588 #define FROM_SINT_C_TYPE SItype
589 #define FROM_UINT_C_TYPE USItype
590 #define FROM_MODE_NAME_S si
591 #define FROM_INT_SIZE 4 /* in bytes. */
593 #elif defined (FROM_DI) && HAVE_DI == 1
594 #define FROM_TYPE 1 /* Signed integer. */
595 #define FROM_INT_C_TYPE DItype
596 #define FROM_SINT_C_TYPE DItype
597 #define FROM_UINT_C_TYPE UDItype
598 #define FROM_MODE_NAME_S di
599 #define FROM_INT_SIZE 8 /* in bytes. */
601 #elif defined (FROM_TI) && HAVE_TI == 1
602 #define FROM_TYPE 1 /* Signed integer. */
603 #define FROM_INT_C_TYPE TItype
604 #define FROM_SINT_C_TYPE TItype
605 #define FROM_UINT_C_TYPE UTItype
606 #define FROM_MODE_NAME_S ti
607 #define FROM_INT_SIZE 16 /* in bytes. */
609 #elif defined (FROM_UQI) && HAVE_UQI == 1
610 #define FROM_TYPE 2 /* Unsigned integer. */
611 #define FROM_INT_C_TYPE QItype
612 #define FROM_SINT_C_TYPE QItype
613 #define FROM_UINT_C_TYPE UQItype
614 #define FROM_MODE_NAME_S qi
615 #define FROM_INT_SIZE 1 /* in bytes. */
617 #elif defined (FROM_UHI) && HAVE_UHI == 1
618 #define FROM_TYPE 2 /* Unsigned integer. */
619 #define FROM_INT_C_TYPE UHItype
620 #define FROM_SINT_C_TYPE HItype
621 #define FROM_UINT_C_TYPE UHItype
622 #define FROM_MODE_NAME_S hi
623 #define FROM_INT_SIZE 2 /* in bytes. */
625 #elif defined (FROM_USI) && HAVE_USI == 1
626 #define FROM_TYPE 2 /* Unsigned integer. */
627 #define FROM_INT_C_TYPE USItype
628 #define FROM_SINT_C_TYPE SItype
629 #define FROM_UINT_C_TYPE USItype
630 #define FROM_MODE_NAME_S si
631 #define FROM_INT_SIZE 4 /* in bytes. */
633 #elif defined (FROM_UDI) && HAVE_UDI == 1
634 #define FROM_TYPE 2 /* Unsigned integer. */
635 #define FROM_INT_C_TYPE UDItype
636 #define FROM_SINT_C_TYPE DItype
637 #define FROM_UINT_C_TYPE UDItype
638 #define FROM_MODE_NAME_S di
639 #define FROM_INT_SIZE 8 /* in bytes. */
641 #elif defined (FROM_UTI) && HAVE_UTI == 1
642 #define FROM_TYPE 2 /* Unsigned integer. */
643 #define FROM_INT_C_TYPE UTItype
644 #define FROM_SINT_C_TYPE TItype
645 #define FROM_UINT_C_TYPE UTItype
646 #define FROM_MODE_NAME_S ti
647 #define FROM_INT_SIZE 16 /* in bytes. */
649 #elif defined (FROM_SF) && HAVE_SF == 1
650 #define FROM_TYPE 3 /* Floating-point. */
651 #define FROM_FLOAT_C_TYPE SFtype
652 #define FROM_MODE_NAME_S sf
654 #elif defined (FROM_DF) && HAVE_DF == 1
655 #define FROM_TYPE 3 /* Floating-point. */
656 #define FROM_FLOAT_C_TYPE DFtype
657 #define FROM_MODE_NAME_S df
659 #elif defined (FROM_QQ) && HAVE_QQ == 1
660 #define FROM_TYPE 4 /* Fixed-point. */
661 #define FROM_MODE_NAME QQ
662 #define FROM_MODE_NAME_S qq
663 #define FROM_INT_C_TYPE QItype
664 #define FROM_SINT_C_TYPE QItype
665 #define FROM_UINT_C_TYPE UQItype
666 #define FROM_MODE_UNSIGNED 0
667 #define FROM_FIXED_SIZE 1 /* in bytes. */
669 #elif defined (FROM_HQ) && HAVE_HQ == 1
670 #define FROM_TYPE 4 /* Fixed-point. */
671 #define FROM_MODE_NAME HQ
672 #define FROM_MODE_NAME_S hq
673 #define FROM_INT_C_TYPE HItype
674 #define FROM_SINT_C_TYPE HItype
675 #define FROM_UINT_C_TYPE UHItype
676 #define FROM_MODE_UNSIGNED 0
677 #define FROM_FIXED_SIZE 2 /* in bytes. */
679 #elif defined (FROM_SQ) && HAVE_SQ == 1
680 #define FROM_TYPE 4 /* Fixed-point. */
681 #define FROM_MODE_NAME SQ
682 #define FROM_MODE_NAME_S sq
683 #define FROM_INT_C_TYPE SItype
684 #define FROM_SINT_C_TYPE SItype
685 #define FROM_UINT_C_TYPE USItype
686 #define FROM_MODE_UNSIGNED 0
687 #define FROM_FIXED_SIZE 4 /* in bytes. */
689 #elif defined (FROM_DQ) && HAVE_DQ == 1
690 #define FROM_TYPE 4 /* Fixed-point. */
691 #define FROM_MODE_NAME DQ
692 #define FROM_MODE_NAME_S dq
693 #define FROM_INT_C_TYPE DItype
694 #define FROM_SINT_C_TYPE DItype
695 #define FROM_UINT_C_TYPE UDItype
696 #define FROM_MODE_UNSIGNED 0
697 #define FROM_FIXED_SIZE 8 /* in bytes. */
699 #elif defined (FROM_TQ) && HAVE_TQ == 1
700 #define FROM_TYPE 4 /* Fixed-point. */
701 #define FROM_MODE_NAME TQ
702 #define FROM_MODE_NAME_S tq
703 #define FROM_INT_C_TYPE TItype
704 #define FROM_SINT_C_TYPE TItype
705 #define FROM_UINT_C_TYPE UTItype
706 #define FROM_MODE_UNSIGNED 0
707 #define FROM_FIXED_SIZE 16 /* in bytes. */
709 #elif defined (FROM_UQQ) && HAVE_UQQ == 1
710 #define FROM_TYPE 4 /* Fixed-point. */
711 #define FROM_MODE_NAME UQQ
712 #define FROM_MODE_NAME_S uqq
713 #define FROM_INT_C_TYPE UQItype
714 #define FROM_SINT_C_TYPE QItype
715 #define FROM_UINT_C_TYPE UQItype
716 #define FROM_MODE_UNSIGNED 1
717 #define FROM_FIXED_SIZE 1 /* in bytes. */
719 #elif defined (FROM_UHQ) && HAVE_UHQ == 1
720 #define FROM_TYPE 4 /* Fixed-point. */
721 #define FROM_MODE_NAME UHQ
722 #define FROM_MODE_NAME_S uhq
723 #define FROM_INT_C_TYPE UHItype
724 #define FROM_SINT_C_TYPE HItype
725 #define FROM_UINT_C_TYPE UHItype
726 #define FROM_MODE_UNSIGNED 1
727 #define FROM_FIXED_SIZE 2 /* in bytes. */
729 #elif defined (FROM_USQ) && HAVE_USQ == 1
730 #define FROM_TYPE 4 /* Fixed-point. */
731 #define FROM_MODE_NAME USQ
732 #define FROM_MODE_NAME_S usq
733 #define FROM_INT_C_TYPE USItype
734 #define FROM_SINT_C_TYPE SItype
735 #define FROM_UINT_C_TYPE USItype
736 #define FROM_MODE_UNSIGNED 1
737 #define FROM_FIXED_SIZE 4 /* in bytes. */
739 #elif defined (FROM_UDQ) && HAVE_UDQ == 1
740 #define FROM_TYPE 4 /* Fixed-point. */
741 #define FROM_MODE_NAME UDQ
742 #define FROM_MODE_NAME_S udq
743 #define FROM_INT_C_TYPE UDItype
744 #define FROM_SINT_C_TYPE DItype
745 #define FROM_UINT_C_TYPE UDItype
746 #define FROM_MODE_UNSIGNED 1
747 #define FROM_FIXED_SIZE 8 /* in bytes. */
749 #elif defined (FROM_UTQ) && HAVE_UTQ == 1
750 #define FROM_TYPE 4 /* Fixed-point. */
751 #define FROM_MODE_NAME UTQ
752 #define FROM_MODE_NAME_S utq
753 #define FROM_INT_C_TYPE UTItype
754 #define FROM_SINT_C_TYPE TItype
755 #define FROM_UINT_C_TYPE UTItype
756 #define FROM_MODE_UNSIGNED 1
757 #define FROM_FIXED_SIZE 16 /* in bytes. */
759 #elif defined (FROM_HA) && HAVE_HA == 1
760 #define FROM_TYPE 4 /* Fixed-point. */
761 #define FROM_MODE_NAME HA
762 #define FROM_MODE_NAME_S ha
763 #define FROM_INT_C_TYPE HItype
764 #define FROM_SINT_C_TYPE HItype
765 #define FROM_UINT_C_TYPE UHItype
766 #define FROM_MODE_UNSIGNED 0
767 #define FROM_FIXED_SIZE 2 /* in bytes. */
769 #elif defined (FROM_SA) && HAVE_SA == 1
770 #define FROM_TYPE 4 /* Fixed-point. */
771 #define FROM_MODE_NAME SA
772 #define FROM_MODE_NAME_S sa
773 #define FROM_INT_C_TYPE SItype
774 #define FROM_SINT_C_TYPE SItype
775 #define FROM_UINT_C_TYPE USItype
776 #define FROM_MODE_UNSIGNED 0
777 #define FROM_FIXED_SIZE 4 /* in bytes. */
779 #elif defined (FROM_DA) && HAVE_DA == 1
780 #define FROM_TYPE 4 /* Fixed-point. */
781 #define FROM_MODE_NAME DA
782 #define FROM_MODE_NAME_S da
783 #define FROM_INT_C_TYPE DItype
784 #define FROM_SINT_C_TYPE DItype
785 #define FROM_UINT_C_TYPE UDItype
786 #define FROM_MODE_UNSIGNED 0
787 #define FROM_FIXED_SIZE 8 /* in bytes. */
789 #elif defined (FROM_TA) && HAVE_TA == 1
790 #define FROM_TYPE 4 /* Fixed-point. */
791 #define FROM_MODE_NAME TA
792 #define FROM_MODE_NAME_S ta
793 #define FROM_INT_C_TYPE TItype
794 #define FROM_SINT_C_TYPE TItype
795 #define FROM_UINT_C_TYPE UTItype
796 #define FROM_MODE_UNSIGNED 0
797 #define FROM_FIXED_SIZE 16 /* in bytes. */
799 #elif defined (FROM_UHA) && HAVE_UHA == 1
800 #define FROM_TYPE 4 /* Fixed-point. */
801 #define FROM_MODE_NAME UHA
802 #define FROM_MODE_NAME_S uha
803 #define FROM_INT_C_TYPE UHItype
804 #define FROM_SINT_C_TYPE HItype
805 #define FROM_UINT_C_TYPE UHItype
806 #define FROM_MODE_UNSIGNED 1
807 #define FROM_FIXED_SIZE 2 /* in bytes. */
809 #elif defined (FROM_USA) && HAVE_USA == 1
810 #define FROM_TYPE 4 /* Fixed-point. */
811 #define FROM_MODE_NAME USA
812 #define FROM_MODE_NAME_S usa
813 #define FROM_INT_C_TYPE USItype
814 #define FROM_SINT_C_TYPE SItype
815 #define FROM_UINT_C_TYPE USItype
816 #define FROM_MODE_UNSIGNED 1
817 #define FROM_FIXED_SIZE 4 /* in bytes. */
819 #elif defined (FROM_UDA) && HAVE_UDA == 1
820 #define FROM_TYPE 4 /* Fixed-point. */
821 #define FROM_MODE_NAME UDA
822 #define FROM_MODE_NAME_S uda
823 #define FROM_INT_C_TYPE UDItype
824 #define FROM_SINT_C_TYPE DItype
825 #define FROM_UINT_C_TYPE UDItype
826 #define FROM_MODE_UNSIGNED 1
827 #define FROM_FIXED_SIZE 8 /* in bytes. */
829 #elif defined (FROM_UTA) && HAVE_UTA == 1
830 #define FROM_TYPE 4 /* Fixed-point. */
831 #define FROM_MODE_NAME UTA
832 #define FROM_MODE_NAME_S uta
833 #define FROM_INT_C_TYPE UTItype
834 #define FROM_SINT_C_TYPE TItype
835 #define FROM_UINT_C_TYPE UTItype
836 #define FROM_MODE_UNSIGNED 1
837 #define FROM_FIXED_SIZE 16 /* in bytes. */
841 #if defined (TO_QI) && HAVE_QI == 1 && !defined (FROM_QI)
842 #define TO_TYPE 1 /* Signed integer. */
843 #define TO_INT_C_TYPE QItype
844 #define TO_SINT_C_TYPE QItype
845 #define TO_UINT_C_TYPE UQItype
846 #define TO_MODE_NAME_S qi
848 #elif defined (TO_HI) && HAVE_HI == 1 && !defined (FROM_HI)
849 #define TO_TYPE 1 /* Signed integer. */
850 #define TO_INT_C_TYPE HItype
851 #define TO_SINT_C_TYPE HItype
852 #define TO_UINT_C_TYPE UHItype
853 #define TO_MODE_NAME_S hi
855 #elif defined (TO_SI) && HAVE_SI == 1 && !defined (FROM_SI)
856 #define TO_TYPE 1 /* Signed integer. */
857 #define TO_INT_C_TYPE SItype
858 #define TO_SINT_C_TYPE SItype
859 #define TO_UINT_C_TYPE USItype
860 #define TO_MODE_NAME_S si
862 #elif defined (TO_DI) && HAVE_DI == 1 && !defined (FROM_DI)
863 #define TO_TYPE 1 /* Signed integer. */
864 #define TO_INT_C_TYPE DItype
865 #define TO_SINT_C_TYPE DItype
866 #define TO_UINT_C_TYPE UDItype
867 #define TO_MODE_NAME_S di
869 #elif defined (TO_TI) && HAVE_TI == 1 && !defined (FROM_TI)
870 #define TO_TYPE 1 /* Signed integer. */
871 #define TO_INT_C_TYPE TItype
872 #define TO_SINT_C_TYPE TItype
873 #define TO_UINT_C_TYPE UTItype
874 #define TO_MODE_NAME_S ti
876 #elif defined (TO_UQI) && HAVE_UQI == 1 && !defined (FROM_UQI)
877 #define TO_TYPE 2 /* Unsigned integer. */
878 #define TO_INT_C_TYPE UQItype
879 #define TO_SINT_C_TYPE QItype
880 #define TO_UINT_C_TYPE UQItype
881 #define TO_MODE_NAME_S qi
883 #elif defined (TO_UHI) && HAVE_UHI == 1 && !defined (FROM_UHI)
884 #define TO_TYPE 2 /* Unsigned integer. */
885 #define TO_INT_C_TYPE UHItype
886 #define TO_SINT_C_TYPE HItype
887 #define TO_UINT_C_TYPE UHItype
888 #define TO_MODE_NAME_S hi
890 #elif defined (TO_USI) && HAVE_USI == 1 && !defined (FROM_USI)
891 #define TO_TYPE 2 /* Unsigned integer. */
892 #define TO_INT_C_TYPE USItype
893 #define TO_SINT_C_TYPE SItype
894 #define TO_UINT_C_TYPE USItype
895 #define TO_MODE_NAME_S si
897 #elif defined (TO_UDI) && HAVE_UDI == 1 && !defined (FROM_UDI)
898 #define TO_TYPE 2 /* Unsigned integer. */
899 #define TO_INT_C_TYPE UDItype
900 #define TO_SINT_C_TYPE DItype
901 #define TO_UINT_C_TYPE UDItype
902 #define TO_MODE_NAME_S di
904 #elif defined (TO_UTI) && HAVE_UTI == 1 && !defined (FROM_UTI)
905 #define TO_TYPE 2 /* Unsigned integer. */
906 #define TO_INT_C_TYPE UTItype
907 #define TO_SINT_C_TYPE TItype
908 #define TO_UINT_C_TYPE UTItype
909 #define TO_MODE_NAME_S ti
911 #elif defined (TO_SF) && HAVE_SF == 1 && !defined (FROM_SF)
912 #define TO_TYPE 3 /* Floating-point. */
913 #define TO_FLOAT_C_TYPE SFtype
914 #define TO_MODE_NAME_S sf
916 #elif defined (TO_DF) && HAVE_DF == 1 && !defined (FROM_DF)
917 #define TO_TYPE 3 /* Floating-point. */
918 #define TO_FLOAT_C_TYPE DFtype
919 #define TO_MODE_NAME_S df
921 #elif defined (TO_QQ) && HAVE_QQ == 1 && !defined (FROM_QQ)
922 #define TO_TYPE 4 /* Fixed-point. */
923 #define TO_MODE_NAME QQ
924 #define TO_MODE_NAME_S qq
925 #define TO_INT_C_TYPE QItype
926 #define TO_SINT_C_TYPE QItype
927 #define TO_UINT_C_TYPE UQItype
928 #define TO_MODE_UNSIGNED 0
929 #define TO_FIXED_SIZE 1 /* in bytes. */
931 #elif defined (TO_HQ) && HAVE_HQ == 1 && !defined (FROM_HQ)
932 #define TO_TYPE 4 /* Fixed-point. */
933 #define TO_MODE_NAME HQ
934 #define TO_MODE_NAME_S hq
935 #define TO_INT_C_TYPE HItype
936 #define TO_SINT_C_TYPE HItype
937 #define TO_UINT_C_TYPE UHItype
938 #define TO_MODE_UNSIGNED 0
939 #define TO_FIXED_SIZE 2 /* in bytes. */
941 #elif defined (TO_SQ) && HAVE_SQ == 1 && !defined (FROM_SQ)
942 #define TO_TYPE 4 /* Fixed-point. */
943 #define TO_MODE_NAME SQ
944 #define TO_MODE_NAME_S sq
945 #define TO_INT_C_TYPE SItype
946 #define TO_SINT_C_TYPE SItype
947 #define TO_UINT_C_TYPE USItype
948 #define TO_MODE_UNSIGNED 0
949 #define TO_FIXED_SIZE 4 /* in bytes. */
951 #elif defined (TO_DQ) && HAVE_DQ == 1 && !defined (FROM_DQ)
952 #define TO_TYPE 4 /* Fixed-point. */
953 #define TO_MODE_NAME DQ
954 #define TO_MODE_NAME_S dq
955 #define TO_INT_C_TYPE DItype
956 #define TO_SINT_C_TYPE DItype
957 #define TO_UINT_C_TYPE UDItype
958 #define TO_MODE_UNSIGNED 0
959 #define TO_FIXED_SIZE 8 /* in bytes. */
961 #elif defined (TO_TQ) && HAVE_TQ == 1 && !defined (FROM_TQ)
962 #define TO_TYPE 4 /* Fixed-point. */
963 #define TO_MODE_NAME TQ
964 #define TO_MODE_NAME_S tq
965 #define TO_INT_C_TYPE TItype
966 #define TO_SINT_C_TYPE TItype
967 #define TO_UINT_C_TYPE UTItype
968 #define TO_MODE_UNSIGNED 0
969 #define TO_FIXED_SIZE 16 /* in bytes. */
971 #elif defined (TO_UQQ) && HAVE_UQQ == 1 && !defined (FROM_UQQ)
972 #define TO_TYPE 4 /* Fixed-point. */
973 #define TO_MODE_NAME UQQ
974 #define TO_MODE_NAME_S uqq
975 #define TO_INT_C_TYPE UQItype
976 #define TO_SINT_C_TYPE QItype
977 #define TO_UINT_C_TYPE UQItype
978 #define TO_MODE_UNSIGNED 1
979 #define TO_FIXED_SIZE 1 /* in bytes. */
981 #elif defined (TO_UHQ) && HAVE_UHQ == 1 && !defined (FROM_UHQ)
982 #define TO_TYPE 4 /* Fixed-point. */
983 #define TO_MODE_NAME UHQ
984 #define TO_MODE_NAME_S uhq
985 #define TO_INT_C_TYPE UHItype
986 #define TO_SINT_C_TYPE HItype
987 #define TO_UINT_C_TYPE UHItype
988 #define TO_MODE_UNSIGNED 1
989 #define TO_FIXED_SIZE 2 /* in bytes. */
991 #elif defined (TO_USQ) && HAVE_USQ == 1 && !defined (FROM_USQ)
992 #define TO_TYPE 4 /* Fixed-point. */
993 #define TO_MODE_NAME USQ
994 #define TO_MODE_NAME_S usq
995 #define TO_INT_C_TYPE USItype
996 #define TO_SINT_C_TYPE SItype
997 #define TO_UINT_C_TYPE USItype
998 #define TO_MODE_UNSIGNED 1
999 #define TO_FIXED_SIZE 4 /* in bytes. */
1001 #elif defined (TO_UDQ) && HAVE_UDQ == 1 && !defined (FROM_UDQ)
1002 #define TO_TYPE 4 /* Fixed-point. */
1003 #define TO_MODE_NAME UDQ
1004 #define TO_MODE_NAME_S udq
1005 #define TO_INT_C_TYPE UDItype
1006 #define TO_SINT_C_TYPE DItype
1007 #define TO_UINT_C_TYPE UDItype
1008 #define TO_MODE_UNSIGNED 1
1009 #define TO_FIXED_SIZE 8 /* in bytes. */
1011 #elif defined (TO_UTQ) && HAVE_UTQ == 1 && !defined (FROM_UTQ)
1012 #define TO_TYPE 4 /* Fixed-point. */
1013 #define TO_MODE_NAME UTQ
1014 #define TO_MODE_NAME_S utq
1015 #define TO_INT_C_TYPE UTItype
1016 #define TO_SINT_C_TYPE TItype
1017 #define TO_UINT_C_TYPE UTItype
1018 #define TO_MODE_UNSIGNED 1
1019 #define TO_FIXED_SIZE 16 /* in bytes. */
1021 #elif defined (TO_HA) && HAVE_HA == 1 && !defined (FROM_HA)
1022 #define TO_TYPE 4 /* Fixed-point. */
1023 #define TO_MODE_NAME HA
1024 #define TO_MODE_NAME_S ha
1025 #define TO_INT_C_TYPE HItype
1026 #define TO_SINT_C_TYPE HItype
1027 #define TO_UINT_C_TYPE UHItype
1028 #define TO_MODE_UNSIGNED 0
1029 #define TO_FIXED_SIZE 2 /* in bytes. */
1031 #elif defined (TO_SA) && HAVE_SA == 1 && !defined (FROM_SA)
1032 #define TO_TYPE 4 /* Fixed-point. */
1033 #define TO_MODE_NAME SA
1034 #define TO_MODE_NAME_S sa
1035 #define TO_INT_C_TYPE SItype
1036 #define TO_SINT_C_TYPE SItype
1037 #define TO_UINT_C_TYPE USItype
1038 #define TO_MODE_UNSIGNED 0
1039 #define TO_FIXED_SIZE 4 /* in bytes. */
1041 #elif defined (TO_DA) && HAVE_DA == 1 && !defined (FROM_DA)
1042 #define TO_TYPE 4 /* Fixed-point. */
1043 #define TO_MODE_NAME DA
1044 #define TO_MODE_NAME_S da
1045 #define TO_INT_C_TYPE DItype
1046 #define TO_SINT_C_TYPE DItype
1047 #define TO_UINT_C_TYPE UDItype
1048 #define TO_MODE_UNSIGNED 0
1049 #define TO_FIXED_SIZE 8 /* in bytes. */
1051 #elif defined (TO_TA) && HAVE_TA == 1 && !defined (FROM_TA)
1052 #define TO_TYPE 4 /* Fixed-point. */
1053 #define TO_MODE_NAME TA
1054 #define TO_MODE_NAME_S ta
1055 #define TO_INT_C_TYPE TItype
1056 #define TO_SINT_C_TYPE TItype
1057 #define TO_UINT_C_TYPE UTItype
1058 #define TO_MODE_UNSIGNED 0
1059 #define TO_FIXED_SIZE 16 /* in bytes. */
1061 #elif defined (TO_UHA) && HAVE_UHA == 1 && !defined (FROM_UHA)
1062 #define TO_TYPE 4 /* Fixed-point. */
1063 #define TO_MODE_NAME UHA
1064 #define TO_MODE_NAME_S uha
1065 #define TO_INT_C_TYPE UHItype
1066 #define TO_SINT_C_TYPE HItype
1067 #define TO_UINT_C_TYPE UHItype
1068 #define TO_MODE_UNSIGNED 1
1069 #define TO_FIXED_SIZE 2 /* in bytes. */
1071 #elif defined (TO_USA) && HAVE_USA == 1 && !defined (FROM_USA)
1072 #define TO_TYPE 4 /* Fixed-point. */
1073 #define TO_MODE_NAME USA
1074 #define TO_MODE_NAME_S usa
1075 #define TO_INT_C_TYPE USItype
1076 #define TO_SINT_C_TYPE SItype
1077 #define TO_UINT_C_TYPE USItype
1078 #define TO_MODE_UNSIGNED 1
1079 #define TO_FIXED_SIZE 4 /* in bytes. */
1081 #elif defined (TO_UDA) && HAVE_UDA == 1 && !defined (FROM_UDA)
1082 #define TO_TYPE 4 /* Fixed-point. */
1083 #define TO_MODE_NAME UDA
1084 #define TO_MODE_NAME_S uda
1085 #define TO_INT_C_TYPE UDItype
1086 #define TO_SINT_C_TYPE DItype
1087 #define TO_UINT_C_TYPE UDItype
1088 #define TO_MODE_UNSIGNED 1
1089 #define TO_FIXED_SIZE 8 /* in bytes. */
1091 #elif defined (TO_UTA) && HAVE_UTA == 1 && !defined (FROM_UTA)
1092 #define TO_TYPE 4 /* Fixed-point. */
1093 #define TO_MODE_NAME UTA
1094 #define TO_MODE_NAME_S uta
1095 #define TO_INT_C_TYPE UTItype
1096 #define TO_SINT_C_TYPE TItype
1097 #define TO_UINT_C_TYPE UTItype
1098 #define TO_MODE_UNSIGNED 1
1099 #define TO_FIXED_SIZE 16 /* in bytes. */
1103 #if defined (FROM_MODE_NAME_S) && defined (TO_MODE_NAME_S)
1105 #if FROM_TYPE == 1 /* Signed integer. */
1106 #define FROM_INT_WIDTH (FROM_INT_SIZE * BITS_PER_UNIT)
1109 #if FROM_TYPE == 2 /* Unsigned integer. */
1110 #define FROM_INT_WIDTH (FROM_INT_SIZE * BITS_PER_UNIT)
1113 #if FROM_TYPE == 4 /* Fixed-point. */
1114 #define FROM_FIXED_C_TYPE FIXED_C_TYPE2(FROM_MODE_NAME)
1115 #define FROM_FBITS FBITS2(FROM_MODE_NAME)
1116 #define FROM_FIXED_WIDTH (FROM_FIXED_SIZE * BITS_PER_UNIT)
1117 #define FROM_FBITS FBITS2(FROM_MODE_NAME)
1118 #define FROM_IBITS IBITS2(FROM_MODE_NAME)
1119 #define FROM_I_F_BITS (FROM_FBITS + FROM_IBITS)
1121 #if FROM_MODE_UNSIGNED == 0 /* Signed types. */
1122 #define FROM_PADDING_BITS (FROM_FIXED_WIDTH - 1 - FROM_I_F_BITS)
1123 #define FROM_NONPADDING_BITS (1 + FROM_I_F_BITS)
1124 #else /* Unsigned types. */
1125 #define FROM_PADDING_BITS (FROM_FIXED_WIDTH - FROM_I_F_BITS)
1126 #define FROM_NONPADDING_BITS (FROM_I_F_BITS)
1128 #define FROM_HAVE_PADDING_BITS (FROM_PADDING_BITS > 0)
1129 #endif /* FROM_TYPE == 4 */
1131 #if TO_TYPE == 4 /* Fixed-point. */
1132 #define TO_FIXED_C_TYPE FIXED_C_TYPE2(TO_MODE_NAME)
1133 #define TO_FBITS FBITS2(TO_MODE_NAME)
1134 #define TO_FIXED_WIDTH (TO_FIXED_SIZE * BITS_PER_UNIT)
1135 #define TO_FBITS FBITS2(TO_MODE_NAME)
1136 #define TO_IBITS IBITS2(TO_MODE_NAME)
1137 #define TO_I_F_BITS (TO_FBITS + TO_IBITS)
1139 #if TO_MODE_UNSIGNED == 0 /* Signed types. */
1140 #define TO_PADDING_BITS (TO_FIXED_WIDTH - 1 - TO_I_F_BITS)
1141 #define TO_NONPADDING_BITS (1 + TO_I_F_BITS)
1142 #else /* Unsigned types. */
1143 #define TO_PADDING_BITS (TO_FIXED_WIDTH - TO_I_F_BITS)
1144 #define TO_NONPADDING_BITS (TO_I_F_BITS)
1146 #define TO_HAVE_PADDING_BITS (TO_PADDING_BITS > 0)
1147 #endif /* TO_TYPE == 4 */
1149 #define FIXED_CONVERT_OP(OP,FROM,TO) OP ## FROM ## TO
1150 #define FIXED_CONVERT_OP2(OP,FROM,TO) OP ## FROM ## TO ## 2
1151 #define FRACT_TEMP(N1,N2) FIXED_CONVERT_OP(__fract,N1,N2)
1152 #define FRACT2_TEMP(N1,N2) FIXED_CONVERT_OP2(__fract,N1,N2)
1153 #define SATFRACT_TEMP(N1,N2) FIXED_CONVERT_OP(__satfract,N1,N2)
1154 #define SATFRACT2_TEMP(N1,N2) FIXED_CONVERT_OP2(__satfract,N1,N2)
1155 #define FRACTUNS_TEMP(N1,N2) FIXED_CONVERT_OP(__fractuns,N1,N2)
1156 #define SATFRACTUNS_TEMP(N1,N2) FIXED_CONVERT_OP(__satfractuns,N1,N2)
1158 /* Define conversions from fixed-point to fixed-point. */
1159 #if FROM_TYPE == 4 && TO_TYPE == 4
1161 #if FROM_FIXED_SIZE > TO_FIXED_SIZE
1162 #define BIG_SINT_C_TYPE FROM_SINT_C_TYPE
1163 #define BIG_UINT_C_TYPE FROM_UINT_C_TYPE
1164 #define BIG_WIDTH FROM_FIXED_WIDTH
1166 #define BIG_SINT_C_TYPE TO_SINT_C_TYPE
1167 #define BIG_UINT_C_TYPE TO_UINT_C_TYPE
1168 #define BIG_WIDTH TO_FIXED_WIDTH
1171 /* Check if FROM* and TO* are in the same machine class. */
1172 #if ((FROM_MODE_UNSIGNED == TO_MODE_UNSIGNED) \
1173 && ((FROM_IBITS == 0) == (TO_IBITS == 0)))
1174 /* Same modes: append '2' to conversion function names */
1175 #define FRACT FRACT2_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1176 #define SATFRACT SATFRACT2_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1178 /* Different modes: don't append '2' to conversion function names */
1179 #define FRACT FRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1180 #define SATFRACT SATFRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1183 extern TO_FIXED_C_TYPE
FRACT (FROM_FIXED_C_TYPE
);
1184 extern TO_FIXED_C_TYPE
SATFRACT (FROM_FIXED_C_TYPE
);
1185 #endif /* FROM_TYPE == 4 && TO_TYPE == 4 */
1187 /* Define conversions from fixed-point to signed integer. */
1188 #if FROM_TYPE == 4 && TO_TYPE == 1
1189 #define FRACT FRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1190 extern TO_INT_C_TYPE
FRACT (FROM_FIXED_C_TYPE
);
1191 #endif /* FROM_TYPE == 4 && TO_TYPE == 1 */
1193 /* Define conversions from fixed-point to unsigned integer. */
1194 #if FROM_TYPE == 4 && TO_TYPE == 2
1195 #define FRACTUNS FRACTUNS_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1196 extern TO_INT_C_TYPE
FRACTUNS (FROM_FIXED_C_TYPE
);
1197 #endif /* FROM_TYPE == 4 && TO_TYPE == 2 */
1199 /* Define conversions from fixed-point to floating-point. */
1200 #if FROM_TYPE == 4 && TO_TYPE == 3
1201 #define BASE1(NUM) 0x1.0p ## NUM
1202 #define BASE2(NUM) BASE1(NUM)
1203 #define BASE BASE2(FROM_FBITS)
1204 #define FRACT FRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1205 extern TO_FLOAT_C_TYPE
FRACT (FROM_FIXED_C_TYPE
);
1206 #endif /* FROM_TYPE == 4 && TO_TYPE == 3 */
1208 /* Define conversions from signed integer to fixed-point. */
1209 #if FROM_TYPE == 1 && TO_TYPE == 4
1211 #if FROM_INT_SIZE > TO_FIXED_SIZE
1212 #define BIG_SINT_C_TYPE FROM_SINT_C_TYPE
1213 #define BIG_UINT_C_TYPE FROM_UINT_C_TYPE
1214 #define BIG_WIDTH FROM_INT_WIDTH
1216 #define BIG_SINT_C_TYPE TO_SINT_C_TYPE
1217 #define BIG_UINT_C_TYPE TO_UINT_C_TYPE
1218 #define BIG_WIDTH TO_FIXED_WIDTH
1221 #define FRACT FRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1222 #define SATFRACT SATFRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1223 extern TO_FIXED_C_TYPE
FRACT (FROM_INT_C_TYPE
);
1224 extern TO_FIXED_C_TYPE
SATFRACT (FROM_INT_C_TYPE
);
1225 #endif /* FROM_TYPE == 1 && TO_TYPE == 4 */
1227 /* Define conversions from unsigned integer to fixed-point. */
1228 #if FROM_TYPE == 2 && TO_TYPE == 4
1230 #if FROM_INT_SIZE > TO_FIXED_SIZE
1231 #define BIG_SINT_C_TYPE FROM_SINT_C_TYPE
1232 #define BIG_UINT_C_TYPE FROM_UINT_C_TYPE
1233 #define BIG_WIDTH FROM_INT_WIDTH
1235 #define BIG_SINT_C_TYPE TO_SINT_C_TYPE
1236 #define BIG_UINT_C_TYPE TO_UINT_C_TYPE
1237 #define BIG_WIDTH TO_FIXED_WIDTH
1240 #define FRACTUNS FRACTUNS_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1241 #define SATFRACTUNS SATFRACTUNS_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1242 extern TO_FIXED_C_TYPE
FRACTUNS (FROM_INT_C_TYPE
);
1243 extern TO_FIXED_C_TYPE
SATFRACTUNS (FROM_INT_C_TYPE
);
1244 #endif /* FROM_TYPE == 2 && TO_TYPE == 4 */
1246 /* Define conversions from floating-point to fixed-point. */
1247 #if FROM_TYPE == 3 && TO_TYPE == 4
1249 #define BASE1(NUM) (0x1.0p ## NUM)
1250 #define BASE2(NUM) BASE1(NUM)
1251 #define BASE BASE2(TO_FBITS)
1253 #define FIXED_MAX1(NUM1,NUM2) (0x1.0p ## NUM1 - 0x1.0p- ## NUM2)
1254 #define FIXED_MAX2(NUM1,NUM2) FIXED_MAX1(NUM1,NUM2)
1255 #define FIXED_MAX FIXED_MAX2(TO_IBITS,TO_FBITS)
1257 #define FIXED_MIN1(NUM) (-0x1.0p ## NUM)
1258 #define FIXED_MIN2(NUM) FIXED_MIN1(NUM)
1259 #if TO_MODE_UNSIGNED == 0
1260 #define FIXED_MIN FIXED_MIN2(TO_IBITS)
1262 #define FIXED_MIN 0.0
1265 #define FRACT FRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1266 #define SATFRACT SATFRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1267 extern TO_FIXED_C_TYPE
FRACT (FROM_FLOAT_C_TYPE
);
1268 extern TO_FIXED_C_TYPE
SATFRACT (FROM_FLOAT_C_TYPE
);
1269 #endif /* FROM_TYPE == 3 && TO_TYPE == 4 */
1271 #endif /* defined (FROM_MODE_NAME_S) && defined (TO_MODE_NAME_S) */
1273 #endif /* _FIXED_BIT_H */