OSDN Git Service

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