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
44 #if defined (HAVE_CC_TLS) && defined (USE_TLS)
45 #define BID_THREAD __thread
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 */
55 // Configuration Options
57 #define SET_STATUS_FLAGS
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)
67 #ifndef DECIMAL_CALL_BY_REFERENCE
68 #define DECIMAL_CALL_BY_REFERENCE 0
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
74 #ifndef DECIMAL_GLOBAL_ROUNDING
75 #define DECIMAL_GLOBAL_ROUNDING 0
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
82 #ifndef DECIMAL_GLOBAL_EXCEPTION_FLAGS
83 #define DECIMAL_GLOBAL_EXCEPTION_FLAGS 0
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
90 #ifndef DECIMAL_ALTERNATE_EXCEPTION_HANDLING
91 #define DECIMAL_ALTERNATE_EXCEPTION_HANDLING 0
94 typedef unsigned int _IDEC_round;
95 typedef unsigned int _IDEC_flags; // could be a struct with diagnostic info
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
102 // if DECIMAL_ALTERNATE_EXCEPTION_HANDLING is not defined
103 // **************************************************************************
104 #define DECIMAL_GLOBAL_EXCEPTION_MASKS 0
105 // **************************************************************************
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 // **************************************************************************
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
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
128 #define _RND_MODE_ARG , rnd_mode
129 #define _RND_MODE_PARAM , _IDEC_round rnd_mode
132 #define _RND_MODE_ARG
133 #define _RND_MODE_PARAM
134 #define rnd_mode __bid_IDEC_glbround
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
147 #define _EXC_FLAGS_ARG
148 #define _EXC_FLAGS_PARAM
149 #define pfpsf &__bid_IDEC_glbflags
152 #if DECIMAL_GLOBAL_ROUNDING
153 extern BID_THREAD _IDEC_round __bid_IDEC_glbround;
156 #if DECIMAL_GLOBAL_EXCEPTION_FLAGS
157 extern BID_THREAD _IDEC_flags __bid_IDEC_glbflags;
160 #if DECIMAL_ALTERNATE_EXCEPTION_HANDLING
161 #if DECIMAL_GLOBAL_EXCEPTION_MASKS
162 extern _IDEC_exceptionmasks _IDEC_glbexceptionmasks;
164 #if DECIMAL_GLOBAL_EXCEPTION_INFO
165 extern _IDEC_excepthandling _IDEC_glbexcepthandling;
169 #if DECIMAL_ALTERNATE_EXCEPTION_HANDLING
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
182 #define _EXC_MASKS_ARG , exc_mask
183 #define _EXC_MASKS_PARAM , _IDEC_exceptionmasks exc_mask
186 #define _EXC_MASKS_ARG
187 #define _EXC_MASKS_PARAM
188 #define exc_mask _IDEC_glbexceptionmasks
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
201 #define _EXC_INFO_ARG
202 #define _EXC_INFO_PARAM
203 #define pexc_info &_IDEC_glbexcepthandling
206 #define _EXC_MASKS_ARG
207 #define _EXC_MASKS_PARAM
208 #define _EXC_INFO_ARG
209 #define _EXC_INFO_PARAM
213 #ifndef BID_BIG_ENDIAN
214 #define BID_BIG_ENDIAN 0
218 #define BID_SWAP128(x) { \
221 (x).w[1] = (x).w[0]; \
225 #define BID_SWAP128(x)
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; }
233 #define BID_RETURN(x) { *pres = (x); return; }
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); }
240 #define BID_RETURN(x) return(x);
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)
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)
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]};
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;
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;
321 #if !DECIMAL_GLOBAL_ROUNDING
322 #define SET_RND_MODE() \
323 _IDEC_round rnd_mode = *prnd_mode;
325 #define SET_RND_MODE()
328 #define PROLOG_REF(arg_name) \
329 COPY_ARG_REF(arg_name)
331 #define PROLOG_VAL(arg_name) \
332 COPY_ARG_VAL(arg_name)
334 #define PROLOG_TYPE_REF(type, arg_name) \
335 COPY_ARG_TYPE_REF(type, arg_name)
337 #define PROLOG_TYPE_VAL(type, arg_name) \
338 COPY_ARG_TYPE_VAL(type, arg_name)
340 #define OTHER_PROLOG_REF()
341 #define OTHER_PROLOG_VAL()
343 #if DECIMAL_CALL_BY_REFERENCE
344 #define BID128_FUNCTION_ARG1(fn_name, arg_name)\
345 void fn_name (UINT128 * pres, \
347 pbid_##arg_name _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
349 PROLOG_REF(arg_name) \
353 #define BID128_FUNCTION_ARG1_NORND(fn_name, arg_name)\
354 void fn_name (UINT128 * pres, \
356 pbid_##arg_name _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
358 PROLOG_REF(arg_name) \
361 #define BID128_FUNCTION_ARG1_NORND_CUSTOMRESTYPE(restype, fn_name, arg_name)\
362 void fn_name (restype * pres, \
364 pbid_##arg_name _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
366 PROLOG_REF(arg_name) \
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 \
374 PROLOG_REF(arg_name1) \
375 PROLOG_REF(arg_name2) \
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 \
384 PROLOG_REF(arg_name1) \
385 PROLOG_REF(arg_name2) \
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 \
393 PROLOG_REF(arg_name1) \
394 PROLOG_TYPE_REF(type2, arg_name2) \
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 \
403 PROLOG_TYPE_REF(type1, arg_name1) \
404 PROLOG_TYPE_REF(type2, arg_name2) \
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 \
413 PROLOG_TYPE_REF(type1, arg_name1) \
414 PROLOG_REF(arg_name2) \
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 \
423 PROLOG_REF(arg_name1) \
424 PROLOG_TYPE_REF(type2, arg_name2) \
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 \
433 PROLOG_TYPE_REF(type1, arg_name1) \
434 PROLOG_REF(arg_name2) \
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 \
443 PROLOG_REF(arg_name1) \
444 PROLOG_REF(arg_name2) \
448 #define TYPE0_FUNCTION_ARG1(type0, fn_name, arg_name)\
449 void fn_name (type0 * pres, \
451 pbid_##arg_name _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
453 PROLOG_REF(arg_name) \
457 #define BID128_FUNCTION_ARGTYPE1(fn_name, type1, arg_name)\
458 void fn_name (UINT128 * pres, \
460 pbid_##arg_name _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
462 PROLOG_TYPE_REF(type1, arg_name) \
466 #define TYPE0_FUNCTION_ARGTYPE1(type0, fn_name, type1, arg_name)\
467 void fn_name (type0 * pres, \
469 pbid_##arg_name _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
471 PROLOG_TYPE_REF(type1, arg_name) \
475 #define TYPE0_FUNCTION_ARGTYPE1_NORND(type0, fn_name, type1, arg_name)\
476 void fn_name (type0 * pres, \
478 pbid_##arg_name _EXC_FLAGS_PARAM _EXC_MASKS_PARAM \
480 PROLOG_TYPE_REF(type1, arg_name) \
483 //////////////////////////////////////////
484 /////////////////////////////////////////
485 ////////////////////////////////////////
489 //////////////////////////////////////////
490 /////////////////////////////////////////
491 ////////////////////////////////////////
493 #define BID128_FUNCTION_ARG1(fn_name, arg_name)\
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) \
500 #define BID128_FUNCTION_ARG1_NORND(fn_name, arg_name)\
502 fn_name (UINT128 bid_##arg_name _EXC_FLAGS_PARAM \
503 _EXC_MASKS_PARAM _EXC_INFO_PARAM) { \
504 PROLOG_VAL(arg_name) \
507 #define BID128_FUNCTION_ARG1_NORND_CUSTOMRESTYPE(restype, fn_name, arg_name)\
509 fn_name (UINT128 bid_##arg_name _EXC_FLAGS_PARAM \
510 _EXC_MASKS_PARAM _EXC_INFO_PARAM) { \
511 PROLOG_VAL(arg_name) \
514 #define BID128_FUNCTION_ARG2(fn_name, arg_name1, arg_name2)\
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) \
523 #define BID128_FUNCTION_ARG2_NORND_CUSTOMRESTYPE(restype, fn_name, arg_name1, arg_name2)\
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) \
532 #define BID128_FUNCTION_ARG128_ARGTYPE2(fn_name, arg_name1, type2, arg_name2)\
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) \
541 #define TYPE0_FUNCTION_ARGTYPE1_ARGTYPE2(type0, fn_name, type1, arg_name1, type2, arg_name2)\
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) \
550 #define BID128_FUNCTION_ARGTYPE1_ARG128(fn_name, type1, arg_name1, arg_name2)\
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) \
559 #define TYPE0_FUNCTION_ARG128_ARGTYPE2(type0, fn_name, arg_name1, type2, arg_name2)\
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) \
568 #define TYPE0_FUNCTION_ARGTYPE1_ARG128(type0, fn_name, type1, arg_name1, arg_name2)\
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) \
577 #define TYPE0_FUNCTION_ARG128_ARG128(type0, fn_name, arg_name1, arg_name2)\
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) \
586 #define TYPE0_FUNCTION_ARG1(type0, fn_name, arg_name)\
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) \
593 #define BID128_FUNCTION_ARGTYPE1(fn_name, type1, arg_name)\
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) \
600 #define TYPE0_FUNCTION_ARGTYPE1(type0, fn_name, type1, arg_name)\
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) \
607 #define TYPE0_FUNCTION_ARGTYPE1_NORND(type0, fn_name, type1, arg_name)\
609 fn_name (type1 bid_##arg_name _EXC_FLAGS_PARAM \
610 _EXC_MASKS_PARAM _EXC_INFO_PARAM) { \
611 PROLOG_TYPE_VAL(type1, arg_name) \
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)\
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); \
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); \