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