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