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 #ifdef LIBGCC2_GNU_PREFIX
29 #define LIBGCC2_FIXEDBIT_GNU_PREFIX
32 /* To use this file we need to define one of the following:
33 QQ_MODE, UQQ_MODE, HQ_MODE, UHQ_MODE, SQ_MODE, USQ_MODE, DQ_MODE, UDQ_MODE,
34 TQ_MODE, UTQ_MODE, HA_MODE, UHA_MODE, SA_MODE, USA_MODE, DA_MODE, UDA_MODE,
36 Then, all operators for this machine mode will be created.
38 Or, we need to define FROM_* TO_* for conversions from one mode to another
39 mode. The mode could be one of the following:
40 Fract: QQ, UQQ, HQ, UHQ, SQ, USQ, DQ, UDQ, TQ, UTQ
41 Accum: HA, UHA, SA, USA, DA, UDA, TA, UTA
42 Signed integer: QI, HI, SI, DI, TI
43 Unsigned integer: UQI, UHI, USI, UDI, UTI
44 Floating-point: SF, DF
45 Ex: If we define FROM_QQ and TO_SI, the conversion from QQ to SI is
48 #ifndef LIBGCC2_LONG_DOUBLE_TYPE_SIZE
49 #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE
52 #ifndef LIBGCC2_HAS_SF_MODE
53 #define LIBGCC2_HAS_SF_MODE (BITS_PER_UNIT == 8)
56 #ifndef LIBGCC2_HAS_DF_MODE
57 #define LIBGCC2_HAS_DF_MODE \
59 && (__SIZEOF_DOUBLE__ * __CHAR_BIT__ == 64 \
60 || LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 64))
63 typedef int QItype
__attribute__ ((mode (QI
)));
64 typedef unsigned int UQItype
__attribute__ ((mode (QI
)));
65 typedef int HItype
__attribute__ ((mode (HI
)));
66 typedef unsigned int UHItype
__attribute__ ((mode (HI
)));
67 typedef _Fract QQtype
__attribute__ ((mode (QQ
)));
68 typedef unsigned _Fract UQQtype
__attribute__ ((mode (UQQ
)));
69 typedef _Fract HQtype
__attribute__ ((mode (HQ
)));
70 typedef unsigned _Fract UHQtype
__attribute__ ((mode (UHQ
)));
71 typedef _Fract HAtype
__attribute__ ((mode (HA
)));
72 typedef unsigned _Fract UHAtype
__attribute__ ((mode (UHA
)));
83 #if MIN_UNITS_PER_WORD > 1
84 /* These typedefs are usually forbidden on dsp's with UNITS_PER_WORD 1. */
85 typedef int SItype
__attribute__ ((mode (SI
)));
86 typedef unsigned int USItype
__attribute__ ((mode (SI
)));
87 typedef _Fract SQtype
__attribute__ ((mode (SQ
)));
88 typedef unsigned _Fract USQtype
__attribute__ ((mode (USQ
)));
89 typedef _Fract SAtype
__attribute__ ((mode (SA
)));
90 typedef unsigned _Fract USAtype
__attribute__ ((mode (USA
)));
97 #if LONG_LONG_TYPE_SIZE > 32
98 /* These typedefs are usually forbidden on archs with UNITS_PER_WORD 2. */
99 typedef int DItype
__attribute__ ((mode (DI
)));
100 typedef unsigned int UDItype
__attribute__ ((mode (DI
)));
101 typedef _Fract DQtype
__attribute__ ((mode (DQ
)));
102 typedef unsigned _Fract UDQtype
__attribute__ ((mode (UDQ
)));
103 typedef _Fract DAtype
__attribute__ ((mode (DA
)));
104 typedef unsigned _Fract UDAtype
__attribute__ ((mode (UDA
)));
111 #if MIN_UNITS_PER_WORD > 4
112 /* These typedefs are usually forbidden on archs with UNITS_PER_WORD 4. */
113 typedef int TItype
__attribute__ ((mode (TI
)));
114 typedef unsigned int UTItype
__attribute__ ((mode (TI
)));
115 typedef _Fract TQtype
__attribute__ ((mode (TQ
)));
116 typedef unsigned _Fract UTQtype
__attribute__ ((mode (UTQ
)));
117 typedef _Fract TAtype
__attribute__ ((mode (TA
)));
118 typedef unsigned _Fract UTAtype
__attribute__ ((mode (UTA
)));
129 #if LIBGCC2_HAS_SF_MODE
130 typedef float SFtype
__attribute__ ((mode (SF
)));
133 #if LIBGCC2_HAS_DF_MODE
134 typedef float DFtype
__attribute__ ((mode (DF
)));
138 typedef int word_type
__attribute__ ((mode (__word__
)));
140 /* Based on modes, we create many defines. */
142 #if defined (QQ_MODE) && (HAVE_QQ == 1)
143 #define FIXED_SIZE 1 /* in bytes. */
144 #define INT_C_TYPE QItype
145 #define UINT_C_TYPE UQItype
146 #define DINT_C_TYPE HItype
147 #define DUINT_C_TYPE UHItype
149 #define MODE_NAME_S qq
150 #define MODE_UNSIGNED 0
153 #if defined (UQQ_MODE) && (HAVE_UQQ == 1)
154 #define FIXED_SIZE 1 /* in bytes. */
155 #define INT_C_TYPE UQItype
156 #define UINT_C_TYPE UQItype
157 #define DINT_C_TYPE UHItype
158 #define DUINT_C_TYPE UHItype
159 #define MODE_NAME UQQ
160 #define MODE_NAME_S uqq
161 #define MODE_UNSIGNED 1
164 #if defined (HQ_MODE) && (HAVE_HQ == 1)
165 #define FIXED_SIZE 2 /* in bytes. */
166 #define INT_C_TYPE HItype
167 #define UINT_C_TYPE UHItype
170 #define DINT_C_TYPE SItype
171 #define DUINT_C_TYPE USItype
173 #define HINT_C_TYPE QItype
174 #define HUINT_C_TYPE UQItype
178 #define MODE_NAME_S hq
179 #define MODE_UNSIGNED 0
182 #if defined (UHQ_MODE) && (HAVE_UHQ == 1)
183 #define FIXED_SIZE 2 /* in bytes. */
184 #define INT_C_TYPE UHItype
185 #define UINT_C_TYPE UHItype
188 #define DINT_C_TYPE USItype
189 #define DUINT_C_TYPE USItype
191 #define HINT_C_TYPE UQItype
192 #define HUINT_C_TYPE UQItype
195 #define MODE_NAME UHQ
196 #define MODE_NAME_S uhq
197 #define MODE_UNSIGNED 1
200 #if defined (SQ_MODE) && (HAVE_SQ == 1)
201 #define FIXED_SIZE 4 /* in bytes. */
202 #define INT_C_TYPE SItype
203 #define UINT_C_TYPE USItype
206 #define DINT_C_TYPE DItype
207 #define DUINT_C_TYPE UDItype
209 #define HINT_C_TYPE HItype
210 #define HUINT_C_TYPE UHItype
214 #define MODE_NAME_S sq
215 #define MODE_UNSIGNED 0
218 #if defined (USQ_MODE) && (HAVE_USQ == 1)
219 #define FIXED_SIZE 4 /* in bytes. */
220 #define INT_C_TYPE USItype
221 #define UINT_C_TYPE USItype
224 #define DINT_C_TYPE UDItype
225 #define DUINT_C_TYPE UDItype
227 #define HINT_C_TYPE UHItype
228 #define HUINT_C_TYPE UHItype
231 #define MODE_NAME USQ
232 #define MODE_NAME_S usq
233 #define MODE_UNSIGNED 1
236 #if defined (DQ_MODE) && (HAVE_DQ == 1)
237 #define FIXED_SIZE 8 /* in bytes. */
238 #define INT_C_TYPE DItype
239 #define UINT_C_TYPE UDItype
242 #define DINT_C_TYPE TItype
243 #define DUINT_C_TYPE UTItype
245 #define HINT_C_TYPE SItype
246 #define HUINT_C_TYPE USItype
250 #define MODE_NAME_S dq
251 #define MODE_UNSIGNED 0
254 #if defined (UDQ_MODE) && (HAVE_UDQ == 1)
255 #define FIXED_SIZE 8 /* in bytes. */
256 #define INT_C_TYPE UDItype
257 #define UINT_C_TYPE UDItype
260 #define DINT_C_TYPE UTItype
261 #define DUINT_C_TYPE UTItype
263 #define HINT_C_TYPE USItype
264 #define HUINT_C_TYPE USItype
267 #define MODE_NAME UDQ
268 #define MODE_NAME_S udq
269 #define MODE_UNSIGNED 1
272 #if defined (TQ_MODE) && (HAVE_TQ == 1)
273 #define FIXED_SIZE 16 /* in bytes. */
274 #define INT_C_TYPE TItype
275 #define UINT_C_TYPE UTItype
276 #define HINT_C_TYPE DItype
277 #define HUINT_C_TYPE UDItype
279 #define MODE_NAME_S tq
280 #define MODE_UNSIGNED 0
283 #if defined (UTQ_MODE) && (HAVE_UTQ == 1)
284 #define FIXED_SIZE 16 /* in bytes. */
285 #define INT_C_TYPE UTItype
286 #define UINT_C_TYPE UTItype
287 #define HINT_C_TYPE UDItype
288 #define HUINT_C_TYPE UDItype
289 #define MODE_NAME UTQ
290 #define MODE_NAME_S utq
291 #define MODE_UNSIGNED 1
294 #if defined (HA_MODE) && (HAVE_HA == 1)
295 #define FIXED_SIZE 2 /* in bytes. */
296 #define INT_C_TYPE HItype
297 #define UINT_C_TYPE UHItype
300 #define DINT_C_TYPE SItype
301 #define DUINT_C_TYPE USItype
303 #define HINT_C_TYPE QItype
304 #define HUINT_C_TYPE UQItype
308 #define MODE_NAME_S ha
309 #define MODE_UNSIGNED 0
312 #if defined (UHA_MODE) && (HAVE_UHA == 1)
313 #define FIXED_SIZE 2 /* in bytes. */
314 #define INT_C_TYPE UHItype
315 #define UINT_C_TYPE UHItype
318 #define DINT_C_TYPE USItype
319 #define DUINT_C_TYPE USItype
321 #define HINT_C_TYPE UQItype
322 #define HUINT_C_TYPE UQItype
325 #define MODE_NAME UHA
326 #define MODE_NAME_S uha
327 #define MODE_UNSIGNED 1
330 #if defined (SA_MODE) && (HAVE_SA == 1)
331 #define FIXED_SIZE 4 /* in bytes. */
332 #define INT_C_TYPE SItype
333 #define UINT_C_TYPE USItype
336 #define DINT_C_TYPE DItype
337 #define DUINT_C_TYPE UDItype
339 #define HINT_C_TYPE HItype
340 #define HUINT_C_TYPE UHItype
344 #define MODE_NAME_S sa
345 #define MODE_UNSIGNED 0
348 #if defined (USA_MODE) && (HAVE_USA == 1)
349 #define FIXED_SIZE 4 /* in bytes. */
350 #define INT_C_TYPE USItype
351 #define UINT_C_TYPE USItype
354 #define DINT_C_TYPE UDItype
355 #define DUINT_C_TYPE UDItype
357 #define HINT_C_TYPE UHItype
358 #define HUINT_C_TYPE UHItype
361 #define MODE_NAME USA
362 #define MODE_NAME_S usa
363 #define MODE_UNSIGNED 1
366 #if defined (DA_MODE) && (HAVE_DA == 1)
367 #define FIXED_SIZE 8 /* in bytes. */
368 #define INT_C_TYPE DItype
369 #define UINT_C_TYPE UDItype
372 #define DINT_C_TYPE TItype
373 #define DUINT_C_TYPE UTItype
375 #define HINT_C_TYPE SItype
376 #define HUINT_C_TYPE USItype
380 #define MODE_NAME_S da
381 #define MODE_UNSIGNED 0
384 #if defined (UDA_MODE) && (HAVE_UDA == 1)
385 #define FIXED_SIZE 8 /* in bytes. */
386 #define INT_C_TYPE UDItype
387 #define UINT_C_TYPE UDItype
390 #define DINT_C_TYPE UTItype
391 #define DUINT_C_TYPE UTItype
393 #define HINT_C_TYPE USItype
394 #define HUINT_C_TYPE USItype
397 #define MODE_NAME UDA
398 #define MODE_NAME_S uda
399 #define MODE_UNSIGNED 1
402 #if defined (TA_MODE) && (HAVE_TA == 1)
403 #define FIXED_SIZE 16 /* in bytes. */
404 #define INT_C_TYPE TItype
405 #define UINT_C_TYPE UTItype
406 #define HINT_C_TYPE DItype
407 #define HUINT_C_TYPE UDItype
409 #define MODE_NAME_S ta
410 #define MODE_UNSIGNED 0
413 #if defined (UTA_MODE) && (HAVE_UTA == 1)
414 #define FIXED_SIZE 16 /* in bytes. */
415 #define INT_C_TYPE UTItype
416 #define UINT_C_TYPE UTItype
417 #define HINT_C_TYPE UDItype
418 #define HUINT_C_TYPE UDItype
419 #define MODE_NAME UTA
420 #define MODE_NAME_S uta
421 #define MODE_UNSIGNED 1
424 /* The following defines are based on the previous defines. */
426 #if defined (HINT_C_TYPE)
427 #if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
428 struct INTstruct
{HINT_C_TYPE high
, low
;};
430 struct INTstruct
{HINT_C_TYPE low
, high
;};
440 #define FIXED_WIDTH (FIXED_SIZE * BITS_PER_UNIT) /* in bits. */
441 #define FIXED_C_TYPE1(NAME) NAME ## type
442 #define FIXED_C_TYPE2(NAME) FIXED_C_TYPE1(NAME)
443 #define FIXED_C_TYPE FIXED_C_TYPE2(MODE_NAME)
444 #define FBITS1(NAME) __ ## NAME ## _FBIT__
445 #define FBITS2(NAME) FBITS1(NAME)
446 #define FBITS FBITS2(MODE_NAME)
447 #define IBITS1(NAME) __ ## NAME ## _IBIT__
448 #define IBITS2(NAME) IBITS1(NAME)
449 #define IBITS IBITS2(MODE_NAME)
450 #define I_F_BITS (FBITS + IBITS)
452 #ifdef LIBGCC2_FIXEDBIT_GNU_PREFIX
453 #define FIXED_OP(OP,MODE,NUM) __gnu_ ## OP ## MODE ## NUM
455 #define FIXED_OP(OP,MODE,NUM) __ ## OP ## MODE ## NUM
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)
486 #if defined (MODE_NAME)
487 #if defined (DINT_C_TYPE)
488 #define FIXED_SATURATE1 FIXED_SATURATE1_TEMP(MODE_NAME_S)
490 #define FIXED_SATURATE2 FIXED_SATURATE2_TEMP(MODE_NAME_S)
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)
502 /* The following functions are for all fixed-point modes. */
503 #if defined (DINT_C_TYPE)
504 extern void FIXED_SATURATE1 (DINT_C_TYPE
*);
506 extern void FIXED_SATURATE2 (INT_C_TYPE
*, INT_C_TYPE
*);
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
);
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)
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)
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
);
544 #else /* Unsigned types. */
545 #define PADDING_BITS (FIXED_WIDTH - I_F_BITS)
546 #define NONPADDING_BITS (I_F_BITS)
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)
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
);
569 #endif /* End of testing MODE_UNSIGNED. */
571 /* This define is to check if this mode have any padding bits. */
572 #define HAVE_PADDING_BITS (PADDING_BITS > 0)
574 /* ------------------------------------------------------------------------ */
575 /* The following defines are for conversions. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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
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
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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
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
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
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
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
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
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
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
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
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
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
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
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
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. */
1111 #if defined (FROM_MODE_NAME_S) && defined (TO_MODE_NAME_S)
1113 #if FROM_TYPE == 1 /* Signed integer. */
1114 #define FROM_INT_WIDTH (FROM_INT_SIZE * BITS_PER_UNIT)
1117 #if FROM_TYPE == 2 /* Unsigned integer. */
1118 #define FROM_INT_WIDTH (FROM_INT_SIZE * BITS_PER_UNIT)
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)
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)
1136 #define FROM_HAVE_PADDING_BITS (FROM_PADDING_BITS > 0)
1137 #endif /* FROM_TYPE == 4 */
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)
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)
1154 #define TO_HAVE_PADDING_BITS (TO_PADDING_BITS > 0)
1155 #endif /* TO_TYPE == 4 */
1157 #ifdef LIBGCC2_FIXEDBIT_GNU_PREFIX
1158 #define FIXED_CONVERT_OP(OP,FROM,TO) __gnu_ ## OP ## FROM ## TO
1159 #define FIXED_CONVERT_OP2(OP,FROM,TO) __gnu_ ## OP ## FROM ## TO ## 2
1161 #define FIXED_CONVERT_OP(OP,FROM,TO) __ ## OP ## FROM ## TO
1162 #define FIXED_CONVERT_OP2(OP,FROM,TO) __ ## OP ## FROM ## TO ## 2
1164 #define FRACT_TEMP(N1,N2) FIXED_CONVERT_OP(fract,N1,N2)
1165 #define FRACT2_TEMP(N1,N2) FIXED_CONVERT_OP2(fract,N1,N2)
1166 #define SATFRACT_TEMP(N1,N2) FIXED_CONVERT_OP(satfract,N1,N2)
1167 #define SATFRACT2_TEMP(N1,N2) FIXED_CONVERT_OP2(satfract,N1,N2)
1168 #define FRACTUNS_TEMP(N1,N2) FIXED_CONVERT_OP(fractuns,N1,N2)
1169 #define SATFRACTUNS_TEMP(N1,N2) FIXED_CONVERT_OP(satfractuns,N1,N2)
1171 /* Define conversions from fixed-point to fixed-point. */
1172 #if FROM_TYPE == 4 && TO_TYPE == 4
1174 #if FROM_FIXED_SIZE > TO_FIXED_SIZE
1175 #define BIG_SINT_C_TYPE FROM_SINT_C_TYPE
1176 #define BIG_UINT_C_TYPE FROM_UINT_C_TYPE
1177 #define BIG_WIDTH FROM_FIXED_WIDTH
1179 #define BIG_SINT_C_TYPE TO_SINT_C_TYPE
1180 #define BIG_UINT_C_TYPE TO_UINT_C_TYPE
1181 #define BIG_WIDTH TO_FIXED_WIDTH
1184 /* Check if FROM* and TO* are in the same machine class. */
1185 #if ((FROM_MODE_UNSIGNED == TO_MODE_UNSIGNED) \
1186 && ((FROM_IBITS == 0) == (TO_IBITS == 0)))
1187 /* Same modes: append '2' to conversion function names */
1188 #define FRACT FRACT2_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1189 #define SATFRACT SATFRACT2_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1191 /* Different modes: don't append '2' to conversion function names */
1192 #define FRACT FRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1193 #define SATFRACT SATFRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1196 extern TO_FIXED_C_TYPE
FRACT (FROM_FIXED_C_TYPE
);
1197 extern TO_FIXED_C_TYPE
SATFRACT (FROM_FIXED_C_TYPE
);
1198 #endif /* FROM_TYPE == 4 && TO_TYPE == 4 */
1200 /* Define conversions from fixed-point to signed integer. */
1201 #if FROM_TYPE == 4 && TO_TYPE == 1
1202 #define FRACT FRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1203 extern TO_INT_C_TYPE
FRACT (FROM_FIXED_C_TYPE
);
1204 #endif /* FROM_TYPE == 4 && TO_TYPE == 1 */
1206 /* Define conversions from fixed-point to unsigned integer. */
1207 #if FROM_TYPE == 4 && TO_TYPE == 2
1208 #define FRACTUNS FRACTUNS_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1209 extern TO_INT_C_TYPE
FRACTUNS (FROM_FIXED_C_TYPE
);
1210 #endif /* FROM_TYPE == 4 && TO_TYPE == 2 */
1212 /* Define conversions from fixed-point to floating-point. */
1213 #if FROM_TYPE == 4 && TO_TYPE == 3
1214 #define BASE1(NUM) 0x1.0p ## NUM
1215 #define BASE2(NUM) BASE1(NUM)
1216 #define BASE BASE2(FROM_FBITS)
1217 #define FRACT FRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1218 extern TO_FLOAT_C_TYPE
FRACT (FROM_FIXED_C_TYPE
);
1219 #endif /* FROM_TYPE == 4 && TO_TYPE == 3 */
1221 /* Define conversions from signed integer to fixed-point. */
1222 #if FROM_TYPE == 1 && TO_TYPE == 4
1224 #if FROM_INT_SIZE > TO_FIXED_SIZE
1225 #define BIG_SINT_C_TYPE FROM_SINT_C_TYPE
1226 #define BIG_UINT_C_TYPE FROM_UINT_C_TYPE
1227 #define BIG_WIDTH FROM_INT_WIDTH
1229 #define BIG_SINT_C_TYPE TO_SINT_C_TYPE
1230 #define BIG_UINT_C_TYPE TO_UINT_C_TYPE
1231 #define BIG_WIDTH TO_FIXED_WIDTH
1234 #define FRACT FRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1235 #define SATFRACT SATFRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1236 extern TO_FIXED_C_TYPE
FRACT (FROM_INT_C_TYPE
);
1237 extern TO_FIXED_C_TYPE
SATFRACT (FROM_INT_C_TYPE
);
1238 #endif /* FROM_TYPE == 1 && TO_TYPE == 4 */
1240 /* Define conversions from unsigned integer to fixed-point. */
1241 #if FROM_TYPE == 2 && TO_TYPE == 4
1243 #if FROM_INT_SIZE > TO_FIXED_SIZE
1244 #define BIG_SINT_C_TYPE FROM_SINT_C_TYPE
1245 #define BIG_UINT_C_TYPE FROM_UINT_C_TYPE
1246 #define BIG_WIDTH FROM_INT_WIDTH
1248 #define BIG_SINT_C_TYPE TO_SINT_C_TYPE
1249 #define BIG_UINT_C_TYPE TO_UINT_C_TYPE
1250 #define BIG_WIDTH TO_FIXED_WIDTH
1253 #define FRACTUNS FRACTUNS_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1254 #define SATFRACTUNS SATFRACTUNS_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1255 extern TO_FIXED_C_TYPE
FRACTUNS (FROM_INT_C_TYPE
);
1256 extern TO_FIXED_C_TYPE
SATFRACTUNS (FROM_INT_C_TYPE
);
1257 #endif /* FROM_TYPE == 2 && TO_TYPE == 4 */
1259 /* Define conversions from floating-point to fixed-point. */
1260 #if FROM_TYPE == 3 && TO_TYPE == 4
1262 #define BASE1(NUM) (0x1.0p ## NUM)
1263 #define BASE2(NUM) BASE1(NUM)
1264 #define BASE BASE2(TO_FBITS)
1266 #define FIXED_MAX1(NUM1,NUM2) (0x1.0p ## NUM1 - 0x1.0p- ## NUM2)
1267 #define FIXED_MAX2(NUM1,NUM2) FIXED_MAX1(NUM1,NUM2)
1268 #define FIXED_MAX FIXED_MAX2(TO_IBITS,TO_FBITS)
1270 #define FIXED_MIN1(NUM) (-0x1.0p ## NUM)
1271 #define FIXED_MIN2(NUM) FIXED_MIN1(NUM)
1272 #if TO_MODE_UNSIGNED == 0
1273 #define FIXED_MIN FIXED_MIN2(TO_IBITS)
1275 #define FIXED_MIN 0.0
1278 #define FRACT FRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1279 #define SATFRACT SATFRACT_TEMP(FROM_MODE_NAME_S,TO_MODE_NAME_S)
1280 extern TO_FIXED_C_TYPE
FRACT (FROM_FLOAT_C_TYPE
);
1281 extern TO_FIXED_C_TYPE
SATFRACT (FROM_FLOAT_C_TYPE
);
1282 #endif /* FROM_TYPE == 3 && TO_TYPE == 4 */
1284 #endif /* defined (FROM_MODE_NAME_S) && defined (TO_MODE_NAME_S) */
1286 #endif /* _FIXED_BIT_H */