fixed-bit.h 39 KB

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