Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /* This is a software fixed-point library.
  2.    Copyright (C) 2007-2015 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 * BITS_PER_UNIT) /* 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 * BITS_PER_UNIT)
  1112. #endif
  1113.  
  1114. #if FROM_TYPE == 2      /* Unsigned integer.  */
  1115. #define FROM_INT_WIDTH          (FROM_INT_SIZE * BITS_PER_UNIT)
  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 * BITS_PER_UNIT)
  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 * BITS_PER_UNIT)
  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.