1 /* Copyright (C) 2007 Free Software Foundation, Inc.
3 This file is part of GCC.
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
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
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
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
32 #include "bid_intrinsics.h"
35 #if !defined ENABLE_DECIMAL_BID_FORMAT || !ENABLE_DECIMAL_BID_FORMAT
36 #error BID not enabled in libbid
39 #ifndef BID_BIG_ENDIAN
40 #define BID_BIG_ENDIAN LIBGCC2_FLOAT_WORDS_BIG_ENDIAN
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 */
49 // Configuration Options
51 #define SET_STATUS_FLAGS
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)
57 #ifndef DECIMAL_CALL_BY_REFERENCE
58 #define DECIMAL_CALL_BY_REFERENCE 0
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
64 #ifndef DECIMAL_GLOBAL_ROUNDING
65 #define DECIMAL_GLOBAL_ROUNDING 0
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
72 #ifndef DECIMAL_GLOBAL_EXCEPTION_FLAGS
73 #define DECIMAL_GLOBAL_EXCEPTION_FLAGS 0
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
80 #ifndef DECIMAL_ALTERNATE_EXCEPTION_HANDLING
81 #define DECIMAL_ALTERNATE_EXCEPTION_HANDLING 0
84 typedef unsigned int _IDEC_round;
85 typedef unsigned int _IDEC_flags; // could be a struct with diagnostic info
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
92 // if DECIMAL_ALTERNATE_EXCEPTION_HANDLING is not defined
93 // **************************************************************************
94 #define DECIMAL_GLOBAL_EXCEPTION_MASKS 0
95 // **************************************************************************
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 // **************************************************************************
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
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
118 #define _RND_MODE_ARG , rnd_mode
119 #define _RND_MODE_PARAM , _IDEC_round rnd_mode
122 #define _RND_MODE_ARG
123 #define _RND_MODE_PARAM
124 #define rnd_mode __bid_IDEC_glbround
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
137 #define _EXC_FLAGS_ARG
138 #define _EXC_FLAGS_PARAM
139 #define pfpsf &__bid_IDEC_glbflags
142 #if DECIMAL_GLOBAL_ROUNDING
143 extern _IDEC_round __bid_IDEC_glbround;
146 #if DECIMAL_GLOBAL_EXCEPTION_FLAGS
147 extern _IDEC_flags __bid_IDEC_glbflags;
150 #if DECIMAL_ALTERNATE_EXCEPTION_HANDLING
151 #if DECIMAL_GLOBAL_EXCEPTION_MASKS
152 extern _IDEC_exceptionmasks _IDEC_glbexceptionmasks;
154 #if DECIMAL_GLOBAL_EXCEPTION_INFO
155 extern _IDEC_excepthandling _IDEC_glbexcepthandling;
159 #if DECIMAL_ALTERNATE_EXCEPTION_HANDLING
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
172 #define _EXC_MASKS_ARG , exc_mask
173 #define _EXC_MASKS_PARAM , _IDEC_exceptionmasks exc_mask
176 #define _EXC_MASKS_ARG
177 #define _EXC_MASKS_PARAM
178 #define exc_mask _IDEC_glbexceptionmasks
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
191 #define _EXC_INFO_ARG
192 #define _EXC_INFO_PARAM
193 #define pexc_info &_IDEC_glbexcepthandling
196 #define _EXC_MASKS_ARG
197 #define _EXC_MASKS_PARAM
198 #define _EXC_INFO_ARG
199 #define _EXC_INFO_PARAM
203 #ifndef BID_BIG_ENDIAN
204 #define BID_BIG_ENDIAN 0
208 #define BID_SWAP128(x) { \
211 (x).w[1] = (x).w[0]; \
215 #define BID_SWAP128(x)
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; }
223 #define BID_RETURN(x) { *pres = (x); return; }
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); }
230 #define BID_RETURN(x) return(x);
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)
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)
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]};
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;
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;
311 #if !DECIMAL_GLOBAL_ROUNDING
312 #define SET_RND_MODE() \
313 _IDEC_round rnd_mode = *prnd_mode;
315 #define SET_RND_MODE()
318 #define PROLOG_REF(arg_name) \
319 COPY_ARG_REF(arg_name)
321 #define PROLOG_VAL(arg_name) \
322 COPY_ARG_VAL(arg_name)
324 #define PROLOG_TYPE_REF(type, arg_name) \
325 COPY_ARG_TYPE_REF(type, arg_name)
327 #define PROLOG_TYPE_VAL(type, arg_name) \
328 COPY_ARG_TYPE_VAL(type, arg_name)
330 #define OTHER_PROLOG_REF()
331 #define OTHER_PROLOG_VAL()
333 #if DECIMAL_CALL_BY_REFERENCE
334 #define BID128_FUNCTION_ARG1(fn_name, arg_name)\
335 void fn_name (UINT128 * pres, \
337 pbid_##arg_name _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
339 PROLOG_REF(arg_name) \
343 #define BID128_FUNCTION_ARG1_NORND(fn_name, arg_name)\
344 void fn_name (UINT128 * pres, \
346 pbid_##arg_name _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
348 PROLOG_REF(arg_name) \
351 #define BID128_FUNCTION_ARG1_NORND_CUSTOMRESTYPE(restype, fn_name, arg_name)\
352 void fn_name (restype * pres, \
354 pbid_##arg_name _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
356 PROLOG_REF(arg_name) \
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 \
364 PROLOG_REF(arg_name1) \
365 PROLOG_REF(arg_name2) \
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 \
374 PROLOG_REF(arg_name1) \
375 PROLOG_REF(arg_name2) \
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 \
383 PROLOG_REF(arg_name1) \
384 PROLOG_TYPE_REF(type2, arg_name2) \
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 \
393 PROLOG_TYPE_REF(type1, arg_name1) \
394 PROLOG_TYPE_REF(type2, arg_name2) \
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 \
403 PROLOG_TYPE_REF(type1, arg_name1) \
404 PROLOG_REF(arg_name2) \
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 \
413 PROLOG_REF(arg_name1) \
414 PROLOG_TYPE_REF(type2, arg_name2) \
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 \
423 PROLOG_TYPE_REF(type1, arg_name1) \
424 PROLOG_REF(arg_name2) \
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 \
433 PROLOG_REF(arg_name1) \
434 PROLOG_REF(arg_name2) \
438 #define TYPE0_FUNCTION_ARG1(type0, fn_name, arg_name)\
439 void fn_name (type0 * pres, \
441 pbid_##arg_name _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
443 PROLOG_REF(arg_name) \
447 #define BID128_FUNCTION_ARGTYPE1(fn_name, type1, arg_name)\
448 void fn_name (UINT128 * pres, \
450 pbid_##arg_name _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
452 PROLOG_TYPE_REF(type1, arg_name) \
456 #define TYPE0_FUNCTION_ARGTYPE1(type0, fn_name, type1, arg_name)\
457 void fn_name (type0 * pres, \
459 pbid_##arg_name _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
461 PROLOG_TYPE_REF(type1, arg_name) \
465 #define TYPE0_FUNCTION_ARGTYPE1_NORND(type0, fn_name, type1, arg_name)\
466 void fn_name (type0 * pres, \
468 pbid_##arg_name _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
470 PROLOG_TYPE_REF(type1, arg_name) \
473 //////////////////////////////////////////
474 /////////////////////////////////////////
475 ////////////////////////////////////////
479 //////////////////////////////////////////
480 /////////////////////////////////////////
481 ////////////////////////////////////////
483 #define BID128_FUNCTION_ARG1(fn_name, arg_name)\
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) \
490 #define BID128_FUNCTION_ARG1_NORND(fn_name, arg_name)\
492 fn_name (UINT128 bid_##arg_name _EXC_FLAGS_PARAM \
493 _EXC_MASKS_PARAM _EXC_INFO_PARAM) { \
494 PROLOG_VAL(arg_name) \
497 #define BID128_FUNCTION_ARG1_NORND_CUSTOMRESTYPE(restype, fn_name, arg_name)\
499 fn_name (UINT128 bid_##arg_name _EXC_FLAGS_PARAM \
500 _EXC_MASKS_PARAM _EXC_INFO_PARAM) { \
501 PROLOG_VAL(arg_name) \
504 #define BID128_FUNCTION_ARG2(fn_name, arg_name1, arg_name2)\
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) \
513 #define BID128_FUNCTION_ARG2_NORND_CUSTOMRESTYPE(restype, fn_name, arg_name1, arg_name2)\
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) \
522 #define BID128_FUNCTION_ARG128_ARGTYPE2(fn_name, arg_name1, type2, arg_name2)\
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) \
531 #define TYPE0_FUNCTION_ARGTYPE1_ARGTYPE2(type0, fn_name, type1, arg_name1, type2, arg_name2)\
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) \
540 #define BID128_FUNCTION_ARGTYPE1_ARG128(fn_name, type1, arg_name1, arg_name2)\
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) \
549 #define TYPE0_FUNCTION_ARG128_ARGTYPE2(type0, fn_name, arg_name1, type2, arg_name2)\
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) \
558 #define TYPE0_FUNCTION_ARGTYPE1_ARG128(type0, fn_name, type1, arg_name1, arg_name2)\
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) \
567 #define TYPE0_FUNCTION_ARG128_ARG128(type0, fn_name, arg_name1, arg_name2)\
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) \
576 #define TYPE0_FUNCTION_ARG1(type0, fn_name, arg_name)\
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) \
583 #define BID128_FUNCTION_ARGTYPE1(fn_name, type1, arg_name)\
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) \
590 #define TYPE0_FUNCTION_ARGTYPE1(type0, fn_name, type1, arg_name)\
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) \
597 #define TYPE0_FUNCTION_ARGTYPE1_NORND(type0, fn_name, type1, arg_name)\
599 fn_name (type1 bid_##arg_name _EXC_FLAGS_PARAM \
600 _EXC_MASKS_PARAM _EXC_INFO_PARAM) { \
601 PROLOG_TYPE_VAL(type1, arg_name) \
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)\
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); \
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); \