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