]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgcc/fixed-bit.h
re PR middle-end/63237 (error: invalid operand in unary operation)
[thirdparty/gcc.git] / libgcc / fixed-bit.h
CommitLineData
154e4a0a 1/* This is a software fixed-point library.
ac1dca3c 2 Copyright (C) 2007-2014 Free Software Foundation, Inc.
154e4a0a
CF
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
748086b7 8Software Foundation; either version 3, or (at your option) any later
154e4a0a
CF
9version.
10
154e4a0a
CF
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
748086b7
JJ
16Under Section 7 of GPL version 3, you are granted additional
17permissions described in the GCC Runtime Library Exception, version
183.1, as published by the Free Software Foundation.
19
20You should have received a copy of the GNU General Public License and
21a copy of the GCC Runtime Library Exception along with this program;
22see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23<http://www.gnu.org/licenses/>. */
154e4a0a
CF
24
25#ifndef _FIXED_BIT_H
26#define _FIXED_BIT_H
27
247eb06f
JB
28#ifdef LIBGCC2_GNU_PREFIX
29#define LIBGCC2_FIXEDBIT_GNU_PREFIX
30#endif
31
154e4a0a
CF
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
154e4a0a
CF
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 \
a18bdccd 59 && (__SIZEOF_DOUBLE__ * __CHAR_BIT__ == 64 \
154e4a0a
CF
60 || LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 64))
61#endif
62
63typedef int QItype __attribute__ ((mode (QI)));
64typedef unsigned int UQItype __attribute__ ((mode (QI)));
65typedef int HItype __attribute__ ((mode (HI)));
66typedef unsigned int UHItype __attribute__ ((mode (HI)));
67typedef _Fract QQtype __attribute__ ((mode (QQ)));
68typedef unsigned _Fract UQQtype __attribute__ ((mode (UQQ)));
69typedef _Fract HQtype __attribute__ ((mode (HQ)));
70typedef unsigned _Fract UHQtype __attribute__ ((mode (UHQ)));
71typedef _Fract HAtype __attribute__ ((mode (HA)));
72typedef 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. */
85typedef int SItype __attribute__ ((mode (SI)));
86typedef unsigned int USItype __attribute__ ((mode (SI)));
87typedef _Fract SQtype __attribute__ ((mode (SQ)));
88typedef unsigned _Fract USQtype __attribute__ ((mode (USQ)));
89typedef _Fract SAtype __attribute__ ((mode (SA)));
90typedef 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. */
99typedef int DItype __attribute__ ((mode (DI)));
100typedef unsigned int UDItype __attribute__ ((mode (DI)));
101typedef _Fract DQtype __attribute__ ((mode (DQ)));
102typedef unsigned _Fract UDQtype __attribute__ ((mode (UDQ)));
103typedef _Fract DAtype __attribute__ ((mode (DA)));
104typedef 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. */
113typedef int TItype __attribute__ ((mode (TI)));
114typedef unsigned int UTItype __attribute__ ((mode (TI)));
115typedef _Fract TQtype __attribute__ ((mode (TQ)));
116typedef unsigned _Fract UTQtype __attribute__ ((mode (UTQ)));
117typedef _Fract TAtype __attribute__ ((mode (TA)));
118typedef 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
130typedef float SFtype __attribute__ ((mode (SF)));
131#define HAVE_SF 1
132#endif
133#if LIBGCC2_HAS_DF_MODE
134typedef float DFtype __attribute__ ((mode (DF)));
135#define HAVE_DF 1
136#endif
137
138typedef 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)
18ed6ee4 427#if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
154e4a0a
CF
428 struct INTstruct {HINT_C_TYPE high, low;};
429#else
430 struct INTstruct {HINT_C_TYPE low, high;};
431#endif
432
433typedef 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
247eb06f 452#ifdef LIBGCC2_FIXEDBIT_GNU_PREFIX
cdbf4541
BS
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)
154e4a0a
CF
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)
504extern void FIXED_SATURATE1 (DINT_C_TYPE *);
505#else
506extern void FIXED_SATURATE2 (INT_C_TYPE *, INT_C_TYPE *);
507#endif
508extern FIXED_C_TYPE FIXED_MULHELPER (FIXED_C_TYPE, FIXED_C_TYPE, word_type);
509extern FIXED_C_TYPE FIXED_DIVHELPER (FIXED_C_TYPE, FIXED_C_TYPE, word_type);
510extern FIXED_C_TYPE FIXED_ASHLHELPER (FIXED_C_TYPE, word_type, word_type);
511extern FIXED_C_TYPE FIXED_ADD (FIXED_C_TYPE, FIXED_C_TYPE);
512extern FIXED_C_TYPE FIXED_SUB (FIXED_C_TYPE, FIXED_C_TYPE);
513extern FIXED_C_TYPE FIXED_MUL (FIXED_C_TYPE, FIXED_C_TYPE);
514extern FIXED_C_TYPE FIXED_NEG (FIXED_C_TYPE);
515extern FIXED_C_TYPE FIXED_ASHL (FIXED_C_TYPE, word_type);
516extern 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. */
534extern FIXED_C_TYPE FIXED_DIV (FIXED_C_TYPE, FIXED_C_TYPE);
535extern FIXED_C_TYPE FIXED_ASHR (FIXED_C_TYPE, word_type);
536extern FIXED_C_TYPE FIXED_SSADD (FIXED_C_TYPE, FIXED_C_TYPE);
537extern FIXED_C_TYPE FIXED_SSSUB (FIXED_C_TYPE, FIXED_C_TYPE);
538extern FIXED_C_TYPE FIXED_SSMUL (FIXED_C_TYPE, FIXED_C_TYPE);
539extern FIXED_C_TYPE FIXED_SSDIV (FIXED_C_TYPE, FIXED_C_TYPE);
540extern FIXED_C_TYPE FIXED_SSNEG (FIXED_C_TYPE);
541extern 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. */
559extern FIXED_C_TYPE FIXED_UDIV (FIXED_C_TYPE, FIXED_C_TYPE);
560extern FIXED_C_TYPE FIXED_LSHR (FIXED_C_TYPE, word_type);
561extern FIXED_C_TYPE FIXED_USADD (FIXED_C_TYPE, FIXED_C_TYPE);
562extern FIXED_C_TYPE FIXED_USSUB (FIXED_C_TYPE, FIXED_C_TYPE);
563extern FIXED_C_TYPE FIXED_USMUL (FIXED_C_TYPE, FIXED_C_TYPE);
564extern FIXED_C_TYPE FIXED_USDIV (FIXED_C_TYPE, FIXED_C_TYPE);
565extern FIXED_C_TYPE FIXED_USNEG (FIXED_C_TYPE);
566extern 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
247eb06f 1157#ifdef LIBGCC2_FIXEDBIT_GNU_PREFIX
cdbf4541
BS
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)
154e4a0a
CF
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
1196extern TO_FIXED_C_TYPE FRACT (FROM_FIXED_C_TYPE);
1197extern 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)
1203extern 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)
1209extern 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)
1218extern 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)
1236extern TO_FIXED_C_TYPE FRACT (FROM_INT_C_TYPE);
1237extern 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)
1255extern TO_FIXED_C_TYPE FRACTUNS (FROM_INT_C_TYPE);
1256extern 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)
1280extern TO_FIXED_C_TYPE FRACT (FROM_FLOAT_C_TYPE);
1281extern 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 */