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