1 /* This is a software fixed-point library. 2 Copyright (C) 2007-2021 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