Merged with libbbid branch at revision 126349.
[platform/upstream/gcc.git] / libgcc / config / libbid / bid_conf.h
1 /* Copyright (C) 2007  Free Software Foundation, Inc.
2
3 This file is part of GCC.
4
5 GCC is free software; you can redistribute it and/or modify it under
6 the terms of the GNU General Public License as published by the Free
7 Software Foundation; either version 2, or (at your option) any later
8 version.
9
10 In addition to the permissions in the GNU General Public License, the
11 Free Software Foundation gives you unlimited permission to link the
12 compiled version of this file into combinations with other programs,
13 and to distribute those combinations without any restriction coming
14 from the use of this file.  (The General Public License restrictions
15 do apply in other respects; for example, they cover modification of
16 the file, and distribution when not linked into a combine
17 executable.)
18
19 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
20 WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
22 for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with GCC; see the file COPYING.  If not, write to the Free
26 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
27 02110-1301, USA.  */
28
29 #ifndef _BID_CONF_H
30 #define _BID_CONF_H
31
32 #include "bid_intrinsics.h"
33
34 #ifdef IN_LIBGCC2
35 #if !defined ENABLE_DECIMAL_BID_FORMAT || !ENABLE_DECIMAL_BID_FORMAT
36 #error BID not enabled in libbid
37 #endif
38
39 #ifndef BID_BIG_ENDIAN
40 #define BID_BIG_ENDIAN LIBGCC2_FLOAT_WORDS_BIG_ENDIAN
41 #endif
42
43 #define _intptr_t_defined
44 #define DECIMAL_CALL_BY_REFERENCE 0
45 #define DECIMAL_GLOBAL_ROUNDING 1
46 #define DECIMAL_GLOBAL_EXCEPTION_FLAGS 1
47 #endif  /* IN_LIBGCC2 */
48
49 // Configuration Options
50
51 #define SET_STATUS_FLAGS
52
53 // If DECIMAL_CALL_BY_REFERENCE is defined then numerical arguments and results
54 // are passed by reference otherwise they are passed by value (except that
55 // a pointer is always passed to the status flags)
56
57 #ifndef DECIMAL_CALL_BY_REFERENCE
58 #define DECIMAL_CALL_BY_REFERENCE 0
59 #endif
60
61 // If DECIMAL_GLOBAL_ROUNDING is defined then the rounding mode is a global 
62 // variable __bid_IDEC_glbround, otherwise it is passed as a parameter when needed
63
64 #ifndef DECIMAL_GLOBAL_ROUNDING
65 #define DECIMAL_GLOBAL_ROUNDING 0
66 #endif
67
68 // If DECIMAL_GLOBAL_EXCEPTION_FLAGS is defined then the exception status flags
69 // are represented by a global variable __bid_IDEC_glbflags, otherwise they are 
70 // passed as a parameter when needed
71
72 #ifndef DECIMAL_GLOBAL_EXCEPTION_FLAGS
73 #define DECIMAL_GLOBAL_EXCEPTION_FLAGS 0
74 #endif
75
76 // If DECIMAL_ALTERNATE_EXCEPTION_HANDLING is defined then the exception masks
77 // are examined and exception handling information is provided to the caller 
78 // if alternate exception handling is necessary
79
80 #ifndef DECIMAL_ALTERNATE_EXCEPTION_HANDLING
81 #define DECIMAL_ALTERNATE_EXCEPTION_HANDLING 0
82 #endif
83
84 typedef unsigned int _IDEC_round;
85 typedef unsigned int _IDEC_flags; // could be a struct with diagnostic info
86
87 #if DECIMAL_ALTERNATE_EXCEPTION_HANDLING
88   // If DECIMAL_GLOBAL_EXCEPTION_MASKS is defined then the exception mask bits
89   // are represented by a global variable _IDEC_exceptionmasks, otherwise they
90   // are passed as a parameter when needed; DECIMAL_GLOBAL_EXCEPTION_MASKS is 
91   // ignored
92   // if DECIMAL_ALTERNATE_EXCEPTION_HANDLING is not defined
93   // **************************************************************************
94 #define DECIMAL_GLOBAL_EXCEPTION_MASKS 0
95   // **************************************************************************
96
97   // If DECIMAL_GLOBAL_EXCEPTION_INFO is defined then the alternate exception  
98   // handling information is represented by a global data structure 
99   // _IDEC_glbexcepthandling, otherwise it is passed by reference as a
100   // parameter when needed; DECIMAL_GLOBAL_EXCEPTION_INFO is ignored
101   // if DECIMAL_ALTERNATE_EXCEPTION_HANDLING is not defined
102   // **************************************************************************
103 #define DECIMAL_GLOBAL_EXCEPTION_INFO 0
104   // **************************************************************************
105 #endif
106
107 // Notes: 1) rnd_mode from _RND_MODE_ARG is used by the caller of a function
108 //           from this library, and can be any name
109 //        2) rnd_mode and prnd_mode from _RND_MODE_PARAM are fixed names 
110 //           and *must* be used in the library functions
111 //        3) __bid_IDEC_glbround is the fixed name for the global variable holding 
112 //           the rounding mode
113 #if !DECIMAL_GLOBAL_ROUNDING
114 #if DECIMAL_CALL_BY_REFERENCE
115 #define _RND_MODE_ARG , &rnd_mode
116 #define _RND_MODE_PARAM , _IDEC_round *prnd_mode
117 #else
118 #define _RND_MODE_ARG , rnd_mode
119 #define _RND_MODE_PARAM , _IDEC_round rnd_mode
120 #endif
121 #else
122 #define _RND_MODE_ARG
123 #define _RND_MODE_PARAM
124 #define rnd_mode __bid_IDEC_glbround
125 #endif
126
127 // Notes: 1) pfpsf from _EXC_FLAGS_ARG is used by the caller of a function
128 //           from this library, and can be any name 
129 //        2) pfpsf from _EXC_FLAGS_PARAM is a fixed name and *must* be used  
130 //           in the library functions
131 //        3) __bid_IDEC_glbflags is the fixed name for the global variable holding 
132 //           the floating-point status flags
133 #if !DECIMAL_GLOBAL_EXCEPTION_FLAGS
134 #define _EXC_FLAGS_ARG , pfpsf
135 #define _EXC_FLAGS_PARAM , _IDEC_flags *pfpsf
136 #else
137 #define _EXC_FLAGS_ARG
138 #define _EXC_FLAGS_PARAM
139 #define pfpsf &__bid_IDEC_glbflags
140 #endif
141
142 #if DECIMAL_GLOBAL_ROUNDING
143 extern _IDEC_round __bid_IDEC_glbround;
144 #endif
145
146 #if DECIMAL_GLOBAL_EXCEPTION_FLAGS
147 extern _IDEC_flags __bid_IDEC_glbflags;
148 #endif
149
150 #if DECIMAL_ALTERNATE_EXCEPTION_HANDLING
151 #if DECIMAL_GLOBAL_EXCEPTION_MASKS
152 extern _IDEC_exceptionmasks _IDEC_glbexceptionmasks;
153 #endif
154 #if DECIMAL_GLOBAL_EXCEPTION_INFO
155 extern _IDEC_excepthandling _IDEC_glbexcepthandling;
156 #endif
157 #endif
158
159 #if DECIMAL_ALTERNATE_EXCEPTION_HANDLING
160
161   // Notes: 1) exc_mask from _EXC_MASKS_ARG is used by the caller of a function
162   //           from this library, and can be any name
163   //        2) exc_mask and pexc_mask from _EXC_MASKS_PARAM are fixed names
164   //           and *must* be used in the library functions
165   //        3) _IDEC_glbexceptionmasks is the fixed name for the global 
166   //           variable holding the floating-point exception masks
167 #if !DECIMAL_GLOBAL_EXCEPTION_MASKS
168 #if DECIMAL_CALL_BY_REFERENCE
169 #define _EXC_MASKS_ARG , &exc_mask
170 #define _EXC_MASKS_PARAM , _IDEC_exceptionmasks *pexc_mask
171 #else
172 #define _EXC_MASKS_ARG , exc_mask
173 #define _EXC_MASKS_PARAM , _IDEC_exceptionmasks exc_mask
174 #endif
175 #else
176 #define _EXC_MASKS_ARG
177 #define _EXC_MASKS_PARAM
178 #define exc_mask _IDEC_glbexceptionmasks
179 #endif
180
181   // Notes: 1) pexc_info from _EXC_INFO_ARG is used by the caller of a function
182   //           from this library, and can be any name
183   //        2) pexc_info from _EXC_INFO_PARAM is a fixed name and *must* be  
184   //           used in the library functions
185   //        3) _IDEC_glbexcepthandling is the fixed name for the global  
186   //           variable holding the floating-point exception information
187 #if !DECIMAL_GLOBAL_EXCEPTION_INFO
188 #define _EXC_INFO_ARG , pexc_info
189 #define _EXC_INFO_PARAM , _IDEC_excepthandling *pexc_info
190 #else
191 #define _EXC_INFO_ARG
192 #define _EXC_INFO_PARAM
193 #define pexc_info &_IDEC_glbexcepthandling
194 #endif
195 #else
196 #define _EXC_MASKS_ARG
197 #define _EXC_MASKS_PARAM
198 #define _EXC_INFO_ARG
199 #define _EXC_INFO_PARAM
200 #endif
201
202
203 #ifndef BID_BIG_ENDIAN
204 #define BID_BIG_ENDIAN 0
205 #endif
206
207 #if BID_BIG_ENDIAN
208 #define BID_SWAP128(x) {  \
209   UINT64 sw;              \
210   sw = (x).w[1];          \
211   (x).w[1] = (x).w[0];    \
212   (x).w[0] = sw;          \
213   }                       
214 #else
215 #define BID_SWAP128(x)  
216 #endif
217
218 #if DECIMAL_CALL_BY_REFERENCE
219 #define BID_RETURN_VAL(x) { *pres = (x); return; }
220 #if BID_BIG_ENDIAN && defined BID_128RES
221 #define BID_RETURN(x) { BID_SWAP128(x); *pres = (x); return; }
222 #else
223 #define BID_RETURN(x) { *pres = (x); return; }
224 #endif 
225 #else
226 #define BID_RETURN_VAL(x) return(x);
227 #if BID_BIG_ENDIAN && defined BID_128RES
228 #define BID_RETURN(x) { BID_SWAP128(x); return(x); }
229 #else
230 #define BID_RETURN(x) return(x);
231 #endif 
232 #endif 
233
234 #if DECIMAL_CALL_BY_REFERENCE
235 #define BIDECIMAL_CALL1(_FUNC, _RES, _OP1) \
236     _FUNC(&(_RES), &(_OP1) _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
237 #define BIDECIMAL_CALL1NR(_FUNC, _RES, _OP1) \
238     _FUNC(&(_RES), &(_OP1) _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
239 #define BIDECIMAL_CALL2(_FUNC, _RES, _OP1, _OP2) \
240     _FUNC(&(_RES), &(_OP1), &(_OP2) _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
241 #define BIDECIMAL_CALL2NR(_FUNC, _RES, _OP1, _OP2) \
242     _FUNC(&(_RES), &(_OP1), &(_OP2) _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
243 #define BIDECIMAL_CALL2_NORND(_FUNC, _RES, _OP1, _OP2) \
244     _FUNC(&(_RES), &(_OP1), &(_OP2) _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
245 #define BIDECIMAL_CALL1_NORND_RESREF(_FUNC, _RES, _OP1) \
246     _FUNC((_RES), &(_OP1) _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
247 #define BIDECIMAL_CALL1_RESARG(_FUNC, _RES, _OP1) \
248     _FUNC(&(_RES), (_OP1) _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
249 #define BIDECIMAL_CALL1_RESREF(_FUNC, _RES, _OP1) \
250     _FUNC((_RES), &(_OP1) _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
251 #define BIDECIMAL_CALL1_NORND(_FUNC, _RES, _OP1) \
252     _FUNC(&(_RES), &(_OP1) _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
253 #define BIDECIMAL_CALL1_NORND_NOSTAT(_FUNC, _RES, _OP1) \
254     _FUNC(&(_RES), &(_OP1) _EXC_MASKS_ARG _EXC_INFO_ARG)
255 #define BIDECIMAL_CALL2_NORND_NOSTAT(_FUNC, _RES, _OP1, _OP2) \
256     _FUNC(&(_RES), &(_OP1), &(_OP2) _EXC_MASKS_ARG _EXC_INFO_ARG)
257 #define BIDECIMAL_CALL3(_FUNC, _RES, _OP1, _OP2, _OP3) \
258     _FUNC(&(_RES), &(_OP1), &(_OP2), &(_OP3) _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
259 #else
260 #define BIDECIMAL_CALL1(_FUNC, _RES, _OP1) \
261     _RES = _FUNC((_OP1) _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
262 #define BIDECIMAL_CALL1NR(_FUNC, _RES, _OP1) \
263     _RES = _FUNC((_OP1) _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
264 #define BIDECIMAL_CALL2(_FUNC, _RES, _OP1, _OP2) \
265     _RES = _FUNC((_OP1), (_OP2) _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
266 #define BIDECIMAL_CALL2NR(_FUNC, _RES, _OP1, _OP2) \
267     _RES = _FUNC((_OP1), (_OP2) _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
268 #define BIDECIMAL_CALL2_NORND(_FUNC, _RES, _OP1, _OP2) \
269     _RES = _FUNC((_OP1), (_OP2) _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
270 #define BIDECIMAL_CALL1_NORND_RESREF(_FUNC, _RES, _OP1) \
271     _FUNC((_RES), _OP1 _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
272 #define BIDECIMAL_CALL1_RESARG(_FUNC, _RES, _OP1) \
273     _RES = _FUNC((_OP1) _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
274 #define BIDECIMAL_CALL1_RESREF(_FUNC, _RES, _OP1) \
275     _FUNC((_RES), _OP1 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
276 #define BIDECIMAL_CALL1_NORND(_FUNC, _RES, _OP1) \
277     _RES = _FUNC((_OP1) _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
278 #define BIDECIMAL_CALL1_NORND_NOSTAT(_FUNC, _RES, _OP1) \
279     _RES = _FUNC((_OP1) _EXC_MASKS_ARG _EXC_INFO_ARG)
280 #define BIDECIMAL_CALL2_NORND_NOSTAT(_FUNC, _RES, _OP1, _OP2) \
281     _RES = _FUNC((_OP1), (_OP2) _EXC_MASKS_ARG _EXC_INFO_ARG)
282 #define BIDECIMAL_CALL3(_FUNC, _RES, _OP1, _OP2, _OP3) \
283     _RES = _FUNC((_OP1), (_OP2), (_OP3) _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG)
284 #endif
285
286 #if BID_BIG_ENDIAN
287 #define HIGH_128W 0
288 #define LOW_128W  1
289 #else
290 #define HIGH_128W 1
291 #define LOW_128W  0
292 #endif
293
294 #if BID_BIG_ENDIAN
295 #define COPY_ARG_REF(arg_name) \
296        UINT128 arg_name={ pbid_##arg_name->w[1], pbid_##arg_name->w[0]};
297 #define COPY_ARG_VAL(arg_name) \
298        UINT128 arg_name={ bid_##arg_name.w[1], bid_##arg_name.w[0]};
299 #else
300 #define COPY_ARG_REF(arg_name) \
301        UINT128 arg_name=*pbid_##arg_name;
302 #define COPY_ARG_VAL(arg_name) \
303        UINT128 arg_name= bid_##arg_name;
304 #endif 
305
306 #define COPY_ARG_TYPE_REF(type, arg_name) \
307        type arg_name=*pbid_##arg_name;
308 #define COPY_ARG_TYPE_VAL(type, arg_name) \
309        type arg_name= bid_##arg_name;
310
311 #if !DECIMAL_GLOBAL_ROUNDING
312   #define SET_RND_MODE() \
313   _IDEC_round rnd_mode = *prnd_mode;
314 #else
315   #define SET_RND_MODE()
316 #endif
317
318 #define PROLOG_REF(arg_name) \
319        COPY_ARG_REF(arg_name) 
320
321  #define PROLOG_VAL(arg_name) \
322        COPY_ARG_VAL(arg_name) 
323
324 #define PROLOG_TYPE_REF(type, arg_name) \
325        COPY_ARG_TYPE_REF(type, arg_name) 
326
327 #define PROLOG_TYPE_VAL(type, arg_name) \
328       COPY_ARG_TYPE_VAL(type, arg_name) 
329
330 #define OTHER_PROLOG_REF()     
331 #define OTHER_PROLOG_VAL()     
332
333 #if DECIMAL_CALL_BY_REFERENCE
334 #define       BID128_FUNCTION_ARG1(fn_name, arg_name)\
335       void fn_name (UINT128 * pres, \
336            UINT128 *  \
337            pbid_##arg_name _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
338            _EXC_INFO_PARAM) {\
339      PROLOG_REF(arg_name)   \
340      SET_RND_MODE()         \
341      OTHER_PROLOG_REF()     
342
343 #define       BID128_FUNCTION_ARG1_NORND(fn_name, arg_name)\
344       void fn_name (UINT128 * pres, \
345            UINT128 *  \
346            pbid_##arg_name _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
347            _EXC_INFO_PARAM) {\
348      PROLOG_REF(arg_name)   \
349      OTHER_PROLOG_REF()     
350
351 #define       BID128_FUNCTION_ARG1_NORND_CUSTOMRESTYPE(restype, fn_name, arg_name)\
352       void fn_name (restype * pres, \
353            UINT128 *  \
354            pbid_##arg_name _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
355            _EXC_INFO_PARAM) {\
356      PROLOG_REF(arg_name)   \
357      OTHER_PROLOG_REF()     
358
359 #define       BID128_FUNCTION_ARG2(fn_name, arg_name1, arg_name2)\
360       void fn_name (UINT128 * pres, \
361            UINT128 *pbid_##arg_name1,  UINT128 *pbid_##arg_name2  \
362            _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
363            _EXC_INFO_PARAM) {\
364      PROLOG_REF(arg_name1)   \
365      PROLOG_REF(arg_name2)   \
366      SET_RND_MODE()         \
367      OTHER_PROLOG_REF()     
368
369 #define       BID128_FUNCTION_ARG2_NORND_CUSTOMRESTYPE(restype, fn_name, arg_name1, arg_name2)\
370       void fn_name (restype * pres, \
371            UINT128 *pbid_##arg_name1,  UINT128 *pbid_##arg_name2  \
372            _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
373            _EXC_INFO_PARAM) {\
374      PROLOG_REF(arg_name1)   \
375      PROLOG_REF(arg_name2)   \
376      OTHER_PROLOG_REF()     
377
378 #define       BID128_FUNCTION_ARG128_ARGTYPE2(fn_name, arg_name1, type2, arg_name2)\
379       void fn_name (UINT128 * pres, \
380            UINT128 *pbid_##arg_name1,  type2 *pbid_##arg_name2  \
381            _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
382            _EXC_INFO_PARAM) {\
383      PROLOG_REF(arg_name1)   \
384      PROLOG_TYPE_REF(type2, arg_name2)   \
385      SET_RND_MODE()         \
386      OTHER_PROLOG_REF()     
387
388 #define       TYPE0_FUNCTION_ARGTYPE1_ARGTYPE2(type0, fn_name, type1, arg_name1, type2, arg_name2)\
389       void fn_name (type0 *pres, \
390            type1 *pbid_##arg_name1,  type2 *pbid_##arg_name2  \
391            _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
392            _EXC_INFO_PARAM) {\
393      PROLOG_TYPE_REF(type1, arg_name1)   \
394      PROLOG_TYPE_REF(type2, arg_name2)   \
395      SET_RND_MODE()         \
396      OTHER_PROLOG_REF()     
397
398 #define       BID128_FUNCTION_ARGTYPE1_ARG128(fn_name, type1, arg_name1, arg_name2)\
399       void fn_name (UINT128 * pres, \
400            type1 *pbid_##arg_name1,  UINT128 *pbid_##arg_name2  \
401            _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
402            _EXC_INFO_PARAM) {\
403      PROLOG_TYPE_REF(type1, arg_name1)   \
404      PROLOG_REF(arg_name2)   \
405      SET_RND_MODE()         \
406      OTHER_PROLOG_REF()     
407
408 #define       TYPE0_FUNCTION_ARG128_ARGTYPE2(type0, fn_name, arg_name1, type2, arg_name2)\
409       void fn_name (type0 *pres, \
410            UINT128 *pbid_##arg_name1,  type2 *pbid_##arg_name2  \
411            _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
412            _EXC_INFO_PARAM) {\
413      PROLOG_REF(arg_name1)   \
414      PROLOG_TYPE_REF(type2, arg_name2)   \
415      SET_RND_MODE()         \
416      OTHER_PROLOG_REF()     
417
418 #define       TYPE0_FUNCTION_ARGTYPE1_ARG128(type0, fn_name, type1, arg_name1, arg_name2)\
419       void fn_name (type0 *pres, \
420            type1 *pbid_##arg_name1,  UINT128 *pbid_##arg_name2  \
421            _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
422            _EXC_INFO_PARAM) {\
423      PROLOG_TYPE_REF(type1, arg_name1)   \
424      PROLOG_REF(arg_name2)   \
425      SET_RND_MODE()         \
426      OTHER_PROLOG_REF()     
427
428 #define       TYPE0_FUNCTION_ARG128_ARG128(type0, fn_name, arg_name1, arg_name2)\
429       void fn_name (type0 * pres, \
430            UINT128 *pbid_##arg_name1,  UINT128 *pbid_##arg_name2  \
431            _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
432            _EXC_INFO_PARAM) {\
433      PROLOG_REF(arg_name1)   \
434      PROLOG_REF(arg_name2)   \
435      SET_RND_MODE()         \
436      OTHER_PROLOG_REF()     
437
438 #define       TYPE0_FUNCTION_ARG1(type0, fn_name, arg_name)\
439       void fn_name (type0 * pres, \
440            UINT128 *  \
441            pbid_##arg_name _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
442            _EXC_INFO_PARAM) {\
443      PROLOG_REF(arg_name)   \
444      SET_RND_MODE()         \
445      OTHER_PROLOG_REF()     
446
447 #define       BID128_FUNCTION_ARGTYPE1(fn_name, type1, arg_name)\
448       void fn_name (UINT128 * pres, \
449            type1 *  \
450            pbid_##arg_name _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
451            _EXC_INFO_PARAM) {\
452      PROLOG_TYPE_REF(type1, arg_name)   \
453      SET_RND_MODE()         \
454      OTHER_PROLOG_REF()     
455
456 #define       TYPE0_FUNCTION_ARGTYPE1(type0, fn_name, type1, arg_name)\
457       void fn_name (type0 * pres, \
458            type1 *  \
459            pbid_##arg_name _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
460            _EXC_INFO_PARAM) {\
461      PROLOG_TYPE_REF(type1, arg_name)   \
462      SET_RND_MODE()         \
463      OTHER_PROLOG_REF()     
464
465 #define       TYPE0_FUNCTION_ARGTYPE1_NORND(type0, fn_name, type1, arg_name)\
466       void fn_name (type0 * pres, \
467            type1 *  \
468            pbid_##arg_name _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
469            _EXC_INFO_PARAM) {\
470      PROLOG_TYPE_REF(type1, arg_name)   \
471      OTHER_PROLOG_REF()
472  
473 //////////////////////////////////////////
474 /////////////////////////////////////////
475 ////////////////////////////////////////
476  
477 #else
478  
479 //////////////////////////////////////////
480 /////////////////////////////////////////
481 ////////////////////////////////////////
482  
483 #define       BID128_FUNCTION_ARG1(fn_name, arg_name)\
484      UINT128                                     \
485      fn_name (UINT128 bid_##arg_name _RND_MODE_PARAM _EXC_FLAGS_PARAM  \
486            _EXC_MASKS_PARAM _EXC_INFO_PARAM) { \
487      PROLOG_VAL(arg_name)                      \
488      OTHER_PROLOG_VAL()     
489
490 #define       BID128_FUNCTION_ARG1_NORND(fn_name, arg_name)\
491      UINT128                                     \
492      fn_name (UINT128 bid_##arg_name _EXC_FLAGS_PARAM  \
493            _EXC_MASKS_PARAM _EXC_INFO_PARAM) { \
494      PROLOG_VAL(arg_name)                      \
495      OTHER_PROLOG_VAL()     
496
497 #define       BID128_FUNCTION_ARG1_NORND_CUSTOMRESTYPE(restype, fn_name, arg_name)\
498      restype                                     \
499      fn_name (UINT128 bid_##arg_name _EXC_FLAGS_PARAM  \
500            _EXC_MASKS_PARAM _EXC_INFO_PARAM) { \
501      PROLOG_VAL(arg_name)                      \
502      OTHER_PROLOG_VAL()     
503
504 #define       BID128_FUNCTION_ARG2(fn_name, arg_name1, arg_name2)\
505      UINT128                                     \
506      fn_name (UINT128 bid_##arg_name1,      \
507             UINT128 bid_##arg_name2 _RND_MODE_PARAM _EXC_FLAGS_PARAM  \
508            _EXC_MASKS_PARAM _EXC_INFO_PARAM) {  \
509      PROLOG_VAL(arg_name1)                      \
510      PROLOG_VAL(arg_name2)                      \
511      OTHER_PROLOG_VAL() 
512
513 #define       BID128_FUNCTION_ARG2_NORND_CUSTOMRESTYPE(restype, fn_name, arg_name1, arg_name2)\
514      restype                                    \
515      fn_name (UINT128 bid_##arg_name1,      \
516             UINT128 bid_##arg_name2 _EXC_FLAGS_PARAM  \
517            _EXC_MASKS_PARAM _EXC_INFO_PARAM) {  \
518      PROLOG_VAL(arg_name1)                      \
519      PROLOG_VAL(arg_name2)                      \
520      OTHER_PROLOG_VAL() 
521
522 #define       BID128_FUNCTION_ARG128_ARGTYPE2(fn_name, arg_name1, type2, arg_name2)\
523      UINT128                                     \
524      fn_name (UINT128 bid_##arg_name1,      \
525             type2 bid_##arg_name2 _RND_MODE_PARAM _EXC_FLAGS_PARAM  \
526            _EXC_MASKS_PARAM _EXC_INFO_PARAM) {  \
527      PROLOG_VAL(arg_name1)                      \
528      PROLOG_TYPE_VAL(type2, arg_name2)          \
529      OTHER_PROLOG_VAL() 
530
531 #define       TYPE0_FUNCTION_ARGTYPE1_ARGTYPE2(type0, fn_name, type1, arg_name1, type2, arg_name2)\
532      type0                                     \
533      fn_name (type1 bid_##arg_name1,      \
534             type2 bid_##arg_name2 _RND_MODE_PARAM _EXC_FLAGS_PARAM  \
535            _EXC_MASKS_PARAM _EXC_INFO_PARAM) {  \
536      PROLOG_TYPE_VAL(type1, arg_name1)                      \
537      PROLOG_TYPE_VAL(type2, arg_name2)          \
538      OTHER_PROLOG_VAL() 
539
540 #define       BID128_FUNCTION_ARGTYPE1_ARG128(fn_name, type1, arg_name1, arg_name2)\
541      UINT128                                     \
542      fn_name (type1 bid_##arg_name1,      \
543             UINT128 bid_##arg_name2 _RND_MODE_PARAM _EXC_FLAGS_PARAM  \
544            _EXC_MASKS_PARAM _EXC_INFO_PARAM) {  \
545      PROLOG_TYPE_VAL(type1, arg_name1)          \
546      PROLOG_VAL(arg_name2)                      \
547      OTHER_PROLOG_VAL() 
548
549 #define       TYPE0_FUNCTION_ARG128_ARGTYPE2(type0, fn_name, arg_name1, type2, arg_name2)\
550      type0                                     \
551      fn_name (UINT128 bid_##arg_name1,      \
552             type2 bid_##arg_name2 _RND_MODE_PARAM _EXC_FLAGS_PARAM  \
553            _EXC_MASKS_PARAM _EXC_INFO_PARAM) {  \
554      PROLOG_VAL(arg_name1)                      \
555      PROLOG_TYPE_VAL(type2, arg_name2)          \
556      OTHER_PROLOG_VAL() 
557
558 #define       TYPE0_FUNCTION_ARGTYPE1_ARG128(type0, fn_name, type1, arg_name1, arg_name2)\
559      type0                                     \
560      fn_name (type1 bid_##arg_name1,      \
561             UINT128 bid_##arg_name2 _RND_MODE_PARAM _EXC_FLAGS_PARAM  \
562            _EXC_MASKS_PARAM _EXC_INFO_PARAM) {  \
563      PROLOG_TYPE_VAL(type1, arg_name1)                      \
564      PROLOG_VAL(arg_name2)          \
565      OTHER_PROLOG_VAL() 
566
567 #define       TYPE0_FUNCTION_ARG128_ARG128(type0, fn_name, arg_name1, arg_name2)\
568      type0                                     \
569      fn_name (UINT128 bid_##arg_name1,      \
570             UINT128 bid_##arg_name2 _RND_MODE_PARAM _EXC_FLAGS_PARAM  \
571            _EXC_MASKS_PARAM _EXC_INFO_PARAM) {  \
572      PROLOG_VAL(arg_name1)                      \
573      PROLOG_VAL(arg_name2)                      \
574      OTHER_PROLOG_VAL() 
575
576 #define       TYPE0_FUNCTION_ARG1(type0, fn_name, arg_name)\
577      type0                                     \
578      fn_name (UINT128 bid_##arg_name _RND_MODE_PARAM _EXC_FLAGS_PARAM  \
579            _EXC_MASKS_PARAM _EXC_INFO_PARAM) { \
580      PROLOG_VAL(arg_name)                      \
581      OTHER_PROLOG_VAL()     
582
583 #define       BID128_FUNCTION_ARGTYPE1(fn_name, type1, arg_name)\
584      UINT128                                     \
585      fn_name (type1 bid_##arg_name _RND_MODE_PARAM _EXC_FLAGS_PARAM  \
586            _EXC_MASKS_PARAM _EXC_INFO_PARAM) { \
587      PROLOG_TYPE_VAL(type1, arg_name)                      \
588      OTHER_PROLOG_VAL()     
589
590 #define       TYPE0_FUNCTION_ARGTYPE1(type0, fn_name, type1, arg_name)\
591      type0                                     \
592      fn_name (type1 bid_##arg_name _RND_MODE_PARAM _EXC_FLAGS_PARAM  \
593            _EXC_MASKS_PARAM _EXC_INFO_PARAM) { \
594      PROLOG_TYPE_VAL(type1, arg_name)                      \
595      OTHER_PROLOG_VAL()     
596
597 #define       TYPE0_FUNCTION_ARGTYPE1_NORND(type0, fn_name, type1, arg_name)\
598      type0                                     \
599      fn_name (type1 bid_##arg_name _EXC_FLAGS_PARAM  \
600            _EXC_MASKS_PARAM _EXC_INFO_PARAM) { \
601      PROLOG_TYPE_VAL(type1, arg_name)                      \
602      OTHER_PROLOG_VAL()
603       
604 #endif 
605
606
607
608 #define   BID_TO_SMALL_UINT_CVT_FUNCTION(type0, fn_name, type1, arg_name, cvt_fn_name, type2, size_mask, invalid_res)\
609     TYPE0_FUNCTION_ARGTYPE1_NORND(type0, fn_name, type1, arg_name)\
610         type2 res;                                                    \
611         _IDEC_flags saved_fpsc=*pfpsf;                                \
612     BIDECIMAL_CALL1_NORND(cvt_fn_name, res, arg_name);            \
613         if(res & size_mask) {                                         \
614       *pfpsf = saved_fpsc | INVALID_EXCEPTION;                    \
615           res = invalid_res; }                                        \
616     BID_RETURN_VAL((type0)res);                                   \
617                    } 
618       
619 #define   BID_TO_SMALL_INT_CVT_FUNCTION(type0, fn_name, type1, arg_name, cvt_fn_name, type2, size_mask, invalid_res)\
620     TYPE0_FUNCTION_ARGTYPE1_NORND(type0, fn_name, type1, arg_name)\
621         type2 res, sgn_mask;                                          \
622         _IDEC_flags saved_fpsc=*pfpsf;                                \
623     BIDECIMAL_CALL1_NORND(cvt_fn_name, res, arg_name);            \
624         sgn_mask = res & size_mask;                                   \
625         if(sgn_mask && (sgn_mask != size_mask)) {                     \
626       *pfpsf = saved_fpsc | INVALID_EXCEPTION;                    \
627           res = invalid_res; }                                        \
628     BID_RETURN_VAL((type0)res);                                   \
629                    } 
630
631
632
633 #endif
634