|
|
1.1 root 1: /* automatically generated by ieee754-misc-auto.sh, do not edit! */
2: #include <tme/common.h>
3: _TME_RCSID("$Id: ieee754-misc-auto.sh,v 1.2 2005/05/11 00:13:33 fredette Exp $");
4:
5:
6: /* decide which builtin C floating-point type is the best match for
7: the IEEE 754 single precision format. if a builtin type matches
8: this format exactly, use that type, otherwise we assume that the
9: smallest builtin type that is at least 4 bytes wide is the best
10: match. if no builtin type is at least that wide, we use long
11: double, or double if long double is not available: */
12: #if ((TME_FLOAT_FORMATS_BUILTIN & TME_FLOAT_FORMAT_IEEE754_SINGLE) != 0)
13: #define TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN TME_FLOAT_FORMAT_IEEE754_SINGLE
14: #elif (_TME_SIZEOF_FLOAT >= 4)
15: #define TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN TME_FLOAT_FORMAT_FLOAT
16: #elif (_TME_SIZEOF_DOUBLE >= 4 || !defined(_TME_HAVE_LONG_DOUBLE))
17: #define TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN TME_FLOAT_FORMAT_DOUBLE
18: #else
19: #define TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN TME_FLOAT_FORMAT_LONG_DOUBLE
20: #endif
21:
22: /* typedef the builtin C floating-point type that is the best match
23: for the IEEE 754 single precision format: */
24: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
25: typedef float tme_ieee754_single_builtin_t;
26: #define tme_float_value_ieee754_single_builtin tme_float_value_float
27: #elif (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_DOUBLE)
28: typedef double tme_ieee754_single_builtin_t;
29: #define tme_float_value_ieee754_single_builtin tme_float_value_double
30: #elif (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_LONG_DOUBLE)
31: typedef long double tme_ieee754_single_builtin_t;
32: #define tme_float_value_ieee754_single_builtin tme_float_value_long_double
33: #endif
34:
35: /* this asserts that the float is either in IEEE 754 single
36: precision format, or in the best-match builtin type format. it
37: evaluates to nonzero if the float is in IEEE 754 single
38: precision format: */
39: #define tme_ieee754_single_is_format(x) \
40: (tme_float_assert_formats(x, \
41: TME_FLOAT_FORMAT_IEEE754_SINGLE | TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN) \
42: && tme_float_is_format(x, \
43: TME_FLOAT_FORMAT_IEEE754_SINGLE | TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN, \
44: TME_FLOAT_FORMAT_IEEE754_SINGLE))
45:
46: /* this asserts that the float is either in IEEE 754 single
47: precision format, or in the best-match builtin type format. it
48: evaluates to nonzero if the float is in the best-match builtin
49: type format: */
50: #define tme_ieee754_single_is_format_builtin(x) \
51: (tme_float_assert_formats(x, \
52: TME_FLOAT_FORMAT_IEEE754_SINGLE | TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN) \
53: && tme_float_is_format(x, \
54: TME_FLOAT_FORMAT_IEEE754_SINGLE | TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN, \
55: TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN))
56:
57: /* this asserts that the float is either in IEEE 754 single
58: precision format, or in the best-match builtin type format. it
59: evaluates to nonzero if the float is a NaN: */
60: #define tme_ieee754_single_is_nan(x) \
61: (tme_float_assert_formats(x, \
62: TME_FLOAT_FORMAT_IEEE754_SINGLE | TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN) \
63: && tme_float_is_nan(x, \
64: TME_FLOAT_FORMAT_IEEE754_SINGLE | TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN))
65:
66: /* this asserts that the float is either in IEEE 754 single
67: precision format, or in the best-match builtin type format. it
68: evaluates to nonzero if the float is an infinity: */
69: #define tme_ieee754_single_is_inf(x) \
70: (tme_float_assert_formats(x, \
71: TME_FLOAT_FORMAT_IEEE754_SINGLE | TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN) \
72: && tme_float_is_inf(x, \
73: TME_FLOAT_FORMAT_IEEE754_SINGLE | TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN))
74:
75: /* this asserts that the float is either in IEEE 754 single
76: precision format, or in the best-match builtin type format. it
77: evaluates to nonzero if the float is a zero: */
78: #define tme_ieee754_single_is_zero(x) \
79: (tme_float_assert_formats(x, \
80: TME_FLOAT_FORMAT_IEEE754_SINGLE | TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN) \
81: && tme_float_is_zero(x, \
82: TME_FLOAT_FORMAT_IEEE754_SINGLE | TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN))
83:
84: /* tme_ieee754_single_value_get(x, buffer) returns a pointer to
85: the value of x in IEEE 754 single precision format (i.e., it
86: returns a pointer to tme_uint32_t). if x isn't already in this
87: format, it is converted into that format in the given buffer: */
88: #define tme_ieee754_single_value_get(x, buffer) \
89: (tme_ieee754_single_is_format(x) \
90: ? &(x)->tme_float_value_ieee754_single \
91: : tme_ieee754_single_value_from_builtin((x)->tme_float_value_ieee754_single_builtin, buffer))
92:
93: /* tme_ieee754_single_value_set(x, y) sets the value of x to
94: y, in IEEE 754 single precision format (i.e., y is a tme_uint32_t).
95: (the internal function _tme_ieee754_single_value_set(x, t, y)
96: takes the type of y, which must be compatible with tme_uint32_t): */
97: #define tme_ieee754_single_value_set(x, y) \
98: do { \
99: (x)->tme_float_value_ieee754_single = (y); \
100: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_SINGLE; \
101: } while (/* CONSTCOND */ 0)
102: #define _tme_ieee754_single_value_set(x, t, y) \
103: do { \
104: *((t *) &(x)->tme_float_value_ieee754_single) = (y); \
105: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_SINGLE; \
106: } while (/* CONSTCOND */ 0)
107:
108: /* tme_ieee754_single_value_set_constant(x, y) sets the value of
109: x to the constant y (i.e., y is a const tme_uint32_t *): */
110: #define tme_ieee754_single_value_set_constant(x, y) \
111: do { \
112: (x)->tme_float_value_ieee754_single = *(y); \
113: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_SINGLE; \
114: } while (/* CONSTCOND */ 0)
115:
116: /* tme_ieee754_single_value_builtin_get(x) returns the value of
117: x as the builtin C type that is the best match for the IEEE 754
118: single precision format: */
119: #define tme_ieee754_single_value_builtin_get(x) \
120: (tme_ieee754_single_is_format_builtin(x) \
121: ? (x)->tme_float_value_ieee754_single_builtin \
122: : tme_ieee754_single_value_to_builtin(&(x)->tme_float_value_ieee754_single))
123:
124: /* tme_ieee754_single_value_builtin_set(x, format, y) sets the value of
125: x to y, whose type is a builtin C type with format format. if the value of
126: y is a NaN or an infinity, y is stored in x in IEEE 754 single
127: precision format, otherwise y is stored in x as the builtin C type
128: that is the best match for the IEEE 754 single precision format: */
129: #define tme_ieee754_single_value_builtin_set(x, format, y) \
130: do { \
131: /* set the value: */ \
132: tme_float_value_builtin_set(x, format, y); \
133: \
134: /* if the result is a NaN: */ \
135: if (tme_float_is_nan(x, format)) { \
136: \
137: /* use the proper default IEEE 754 single precision NaN: */ \
138: (x)->tme_float_value_ieee754_single = ieee754_ctl->tme_ieee754_ctl_default_nan_single; \
139: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_SINGLE; \
140: } \
141: \
142: /* otherwise, if the result isn't already in IEEE 754 single precision format: */ \
143: else if ((format) != TME_FLOAT_FORMAT_IEEE754_SINGLE) { \
144: \
145: /* if the result is infinite: */ \
146: if (tme_float_is_inf(x, format)) { \
147: \
148: /* use the IEEE 754 single precision infinity: */ \
149: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_SINGLE; \
150: (x)->tme_float_value_ieee754_single = ((tme_uint32_t) 0x7f800000) | (tme_float_is_negative(x, (format)) ? (((tme_uint32_t) 0x7f800000) + _TME_FIELD_MASK_FACTOR(((tme_uint32_t) 0x7f800000))) : 0); \
151: } \
152: \
153: /* otherwise, if the result isn't already the builtin C type that \
154: is the best match for the IEEE 754 single precision format: */ \
155: else if ((format) != TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN) { \
156: \
157: /* convert the result: */ \
158: if ((format) == TME_FLOAT_FORMAT_FLOAT) { \
159: (x)->tme_float_value_ieee754_single_builtin = (x)->tme_float_value_float; \
160: } \
161: TME_FLOAT_IF_LONG_DOUBLE(else if ((format) == TME_FLOAT_FORMAT_LONG_DOUBLE) { \
162: (x)->tme_float_value_ieee754_single_builtin = (x)->tme_float_value_long_double; \
163: }) \
164: else { \
165: assert((format) == TME_FLOAT_FORMAT_DOUBLE); \
166: (x)->tme_float_value_ieee754_single_builtin = (x)->tme_float_value_double; \
167: } \
168: } \
169: } \
170: } while (/* CONSTCOND */ 0)
171:
172: /* this converts a value from IEEE 754 single precision format
173: into the builtin C type that is the best match for that format: */
174: tme_ieee754_single_builtin_t tme_ieee754_single_value_to_builtin _TME_P((const tme_uint32_t *));
175:
176: /* this converts a value from the builtin C type that is the best
177: match for the IEEE 754 single precision format, into that
178: format: */
179: const tme_uint32_t *tme_ieee754_single_value_from_builtin _TME_P((tme_ieee754_single_builtin_t, tme_uint32_t *));
180:
181: /* this does a NaN check for an IEEE 754 single precision monadic function: */
182: int tme_ieee754_single_check_nan_monadic _TME_P((struct tme_ieee754_ctl *, const struct tme_float *, struct tme_float *));
183:
184: /* this does a NaN check for an IEEE 754 single precision dyadic function: */
185: int tme_ieee754_single_check_nan_dyadic _TME_P((struct tme_ieee754_ctl *, const struct tme_float *, const struct tme_float *, struct tme_float *));
186:
187: /* this converts a tme_uint32_t to a single: */
188: void tme_ieee754_single_from_int32 _TME_P((tme_uint32_t, struct tme_float *));
189:
190: #if defined(TME_HAVE_INT64_T)
191:
192: /* this converts a tme_uint64_t to a single: */
193: void tme_ieee754_single_from_int64 _TME_P((tme_uint64_t, struct tme_float *));
194:
195: #endif /* defined(TME_HAVE_INT64_T) */
196:
197: /* this converts an in-range IEEE 754 single precision value into its
198: radix 10 mantissa and exponent. the mantissa is either zero, or
199: in the range [1,10): */
200: void tme_ieee754_single_radix10_mantissa_exponent _TME_P((struct tme_ieee754_ctl *, const struct tme_float *, struct tme_float *, struct tme_float *));
201:
202: /* this scales an IEEE 754 single precision value by adding n to its
203: radix 10 exponent: */
204: void tme_ieee754_single_radix10_scale _TME_P((struct tme_ieee754_ctl *, const struct tme_float *, const struct tme_float *, struct tme_float *));
205:
206:
207: /* decide which builtin C floating-point type is the best match for
208: the IEEE 754 double precision format. if a builtin type matches
209: this format exactly, use that type, otherwise we assume that the
210: smallest builtin type that is at least 8 bytes wide is the best
211: match. if no builtin type is at least that wide, we use long
212: double, or double if long double is not available: */
213: #if ((TME_FLOAT_FORMATS_BUILTIN & TME_FLOAT_FORMAT_IEEE754_DOUBLE) != 0)
214: #define TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN TME_FLOAT_FORMAT_IEEE754_DOUBLE
215: #elif (_TME_SIZEOF_FLOAT >= 8)
216: #define TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN TME_FLOAT_FORMAT_FLOAT
217: #elif (_TME_SIZEOF_DOUBLE >= 8 || !defined(_TME_HAVE_LONG_DOUBLE))
218: #define TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN TME_FLOAT_FORMAT_DOUBLE
219: #else
220: #define TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN TME_FLOAT_FORMAT_LONG_DOUBLE
221: #endif
222:
223: /* typedef the builtin C floating-point type that is the best match
224: for the IEEE 754 double precision format: */
225: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
226: typedef float tme_ieee754_double_builtin_t;
227: #define tme_float_value_ieee754_double_builtin tme_float_value_float
228: #elif (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_DOUBLE)
229: typedef double tme_ieee754_double_builtin_t;
230: #define tme_float_value_ieee754_double_builtin tme_float_value_double
231: #elif (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_LONG_DOUBLE)
232: typedef long double tme_ieee754_double_builtin_t;
233: #define tme_float_value_ieee754_double_builtin tme_float_value_long_double
234: #endif
235:
236: /* this asserts that the float is either in IEEE 754 double
237: precision format, or in the best-match builtin type format. it
238: evaluates to nonzero if the float is in IEEE 754 double
239: precision format: */
240: #define tme_ieee754_double_is_format(x) \
241: (tme_float_assert_formats(x, \
242: TME_FLOAT_FORMAT_IEEE754_DOUBLE | TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN) \
243: && tme_float_is_format(x, \
244: TME_FLOAT_FORMAT_IEEE754_DOUBLE | TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN, \
245: TME_FLOAT_FORMAT_IEEE754_DOUBLE))
246:
247: /* this asserts that the float is either in IEEE 754 double
248: precision format, or in the best-match builtin type format. it
249: evaluates to nonzero if the float is in the best-match builtin
250: type format: */
251: #define tme_ieee754_double_is_format_builtin(x) \
252: (tme_float_assert_formats(x, \
253: TME_FLOAT_FORMAT_IEEE754_DOUBLE | TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN) \
254: && tme_float_is_format(x, \
255: TME_FLOAT_FORMAT_IEEE754_DOUBLE | TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN, \
256: TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN))
257:
258: /* this asserts that the float is either in IEEE 754 double
259: precision format, or in the best-match builtin type format. it
260: evaluates to nonzero if the float is a NaN: */
261: #define tme_ieee754_double_is_nan(x) \
262: (tme_float_assert_formats(x, \
263: TME_FLOAT_FORMAT_IEEE754_DOUBLE | TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN) \
264: && tme_float_is_nan(x, \
265: TME_FLOAT_FORMAT_IEEE754_DOUBLE | TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN))
266:
267: /* this asserts that the float is either in IEEE 754 double
268: precision format, or in the best-match builtin type format. it
269: evaluates to nonzero if the float is an infinity: */
270: #define tme_ieee754_double_is_inf(x) \
271: (tme_float_assert_formats(x, \
272: TME_FLOAT_FORMAT_IEEE754_DOUBLE | TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN) \
273: && tme_float_is_inf(x, \
274: TME_FLOAT_FORMAT_IEEE754_DOUBLE | TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN))
275:
276: /* this asserts that the float is either in IEEE 754 double
277: precision format, or in the best-match builtin type format. it
278: evaluates to nonzero if the float is a zero: */
279: #define tme_ieee754_double_is_zero(x) \
280: (tme_float_assert_formats(x, \
281: TME_FLOAT_FORMAT_IEEE754_DOUBLE | TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN) \
282: && tme_float_is_zero(x, \
283: TME_FLOAT_FORMAT_IEEE754_DOUBLE | TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN))
284:
285: /* tme_ieee754_double_value_get(x, buffer) returns a pointer to
286: the value of x in IEEE 754 double precision format (i.e., it
287: returns a pointer to union tme_value64). if x isn't already in this
288: format, it is converted into that format in the given buffer: */
289: #define tme_ieee754_double_value_get(x, buffer) \
290: (tme_ieee754_double_is_format(x) \
291: ? &(x)->tme_float_value_ieee754_double \
292: : tme_ieee754_double_value_from_builtin((x)->tme_float_value_ieee754_double_builtin, buffer))
293:
294: /* tme_ieee754_double_value_set(x, y) sets the value of x to
295: y, in IEEE 754 double precision format (i.e., y is a union tme_value64).
296: (the internal function _tme_ieee754_double_value_set(x, t, y)
297: takes the type of y, which must be compatible with union tme_value64): */
298: #define tme_ieee754_double_value_set(x, y) \
299: do { \
300: (x)->tme_float_value_ieee754_double = (y); \
301: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_DOUBLE; \
302: } while (/* CONSTCOND */ 0)
303: #define _tme_ieee754_double_value_set(x, t, y) \
304: do { \
305: *((t *) &(x)->tme_float_value_ieee754_double) = (y); \
306: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_DOUBLE; \
307: } while (/* CONSTCOND */ 0)
308:
309: /* tme_ieee754_double_value_set_constant(x, y) sets the value of
310: x to the constant y (i.e., y is a const struct tme_ieee754_double_constant *): */
311: #define tme_ieee754_double_value_set_constant(x, y) \
312: do { \
313: (x)->tme_float_value_ieee754_double.tme_value64_uint32_hi = (y)->tme_ieee754_double_constant_hi; \
314: (x)->tme_float_value_ieee754_double.tme_value64_uint32_lo = (y)->tme_ieee754_double_constant_lo; \
315: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_DOUBLE; \
316: } while (/* CONSTCOND */ 0)
317:
318: /* tme_ieee754_double_value_builtin_get(x) returns the value of
319: x as the builtin C type that is the best match for the IEEE 754
320: double precision format: */
321: #define tme_ieee754_double_value_builtin_get(x) \
322: (tme_ieee754_double_is_format_builtin(x) \
323: ? (x)->tme_float_value_ieee754_double_builtin \
324: : tme_ieee754_double_value_to_builtin(&(x)->tme_float_value_ieee754_double))
325:
326: /* tme_ieee754_double_value_builtin_set(x, format, y) sets the value of
327: x to y, whose type is a builtin C type with format format. if the value of
328: y is a NaN or an infinity, y is stored in x in IEEE 754 double
329: precision format, otherwise y is stored in x as the builtin C type
330: that is the best match for the IEEE 754 double precision format: */
331: #define tme_ieee754_double_value_builtin_set(x, format, y) \
332: do { \
333: /* set the value: */ \
334: tme_float_value_builtin_set(x, format, y); \
335: \
336: /* if the result is a NaN: */ \
337: if (tme_float_is_nan(x, format)) { \
338: \
339: /* use the proper default IEEE 754 double precision NaN: */ \
340: (x)->tme_float_value_ieee754_double = ieee754_ctl->tme_ieee754_ctl_default_nan_double; \
341: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_DOUBLE; \
342: } \
343: \
344: /* otherwise, if the result isn't already in IEEE 754 double precision format: */ \
345: else if ((format) != TME_FLOAT_FORMAT_IEEE754_DOUBLE) { \
346: \
347: /* if the result is infinite: */ \
348: if (tme_float_is_inf(x, format)) { \
349: \
350: /* use the IEEE 754 double precision infinity: */ \
351: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_DOUBLE; \
352: (x)->tme_float_value_ieee754_double.tme_value64_uint32_hi = ((tme_uint32_t) 0x7ff00000) | (tme_float_is_negative(x, (format)) ? (((tme_uint32_t) 0x7ff00000) + _TME_FIELD_MASK_FACTOR(((tme_uint32_t) 0x7ff00000))) : 0); \
353: (x)->tme_float_value_ieee754_double.tme_value64_uint32_lo = 0; \
354: } \
355: \
356: /* otherwise, if the result isn't already the builtin C type that \
357: is the best match for the IEEE 754 double precision format: */ \
358: else if ((format) != TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN) { \
359: \
360: /* convert the result: */ \
361: if ((format) == TME_FLOAT_FORMAT_FLOAT) { \
362: (x)->tme_float_value_ieee754_double_builtin = (x)->tme_float_value_float; \
363: } \
364: TME_FLOAT_IF_LONG_DOUBLE(else if ((format) == TME_FLOAT_FORMAT_LONG_DOUBLE) { \
365: (x)->tme_float_value_ieee754_double_builtin = (x)->tme_float_value_long_double; \
366: }) \
367: else { \
368: assert((format) == TME_FLOAT_FORMAT_DOUBLE); \
369: (x)->tme_float_value_ieee754_double_builtin = (x)->tme_float_value_double; \
370: } \
371: } \
372: } \
373: } while (/* CONSTCOND */ 0)
374:
375: /* this converts a value from IEEE 754 double precision format
376: into the builtin C type that is the best match for that format: */
377: tme_ieee754_double_builtin_t tme_ieee754_double_value_to_builtin _TME_P((const union tme_value64 *));
378:
379: /* this converts a value from the builtin C type that is the best
380: match for the IEEE 754 double precision format, into that
381: format: */
382: const union tme_value64 *tme_ieee754_double_value_from_builtin _TME_P((tme_ieee754_double_builtin_t, union tme_value64 *));
383:
384: /* this does a NaN check for an IEEE 754 double precision monadic function: */
385: int tme_ieee754_double_check_nan_monadic _TME_P((struct tme_ieee754_ctl *, const struct tme_float *, struct tme_float *));
386:
387: /* this does a NaN check for an IEEE 754 double precision dyadic function: */
388: int tme_ieee754_double_check_nan_dyadic _TME_P((struct tme_ieee754_ctl *, const struct tme_float *, const struct tme_float *, struct tme_float *));
389:
390: /* this converts a tme_uint32_t to a double: */
391: void tme_ieee754_double_from_int32 _TME_P((tme_uint32_t, struct tme_float *));
392:
393: #if defined(TME_HAVE_INT64_T)
394:
395: /* this converts a tme_uint64_t to a double: */
396: void tme_ieee754_double_from_int64 _TME_P((tme_uint64_t, struct tme_float *));
397:
398: #endif /* defined(TME_HAVE_INT64_T) */
399:
400: /* this converts an in-range IEEE 754 double precision value into its
401: radix 10 mantissa and exponent. the mantissa is either zero, or
402: in the range [1,10): */
403: void tme_ieee754_double_radix10_mantissa_exponent _TME_P((struct tme_ieee754_ctl *, const struct tme_float *, struct tme_float *, struct tme_float *));
404:
405: /* this scales an IEEE 754 double precision value by adding n to its
406: radix 10 exponent: */
407: void tme_ieee754_double_radix10_scale _TME_P((struct tme_ieee754_ctl *, const struct tme_float *, const struct tme_float *, struct tme_float *));
408:
409:
410: /* decide which builtin C floating-point type is the best match for
411: the IEEE 754 extended80 precision format. if a builtin type matches
412: this format exactly, use that type, otherwise we assume that the
413: smallest builtin type that is at least 12 bytes wide is the best
414: match. if no builtin type is at least that wide, we use long
415: double, or double if long double is not available: */
416: #if ((TME_FLOAT_FORMATS_BUILTIN & TME_FLOAT_FORMAT_IEEE754_EXTENDED80) != 0)
417: #define TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN TME_FLOAT_FORMAT_IEEE754_EXTENDED80
418: #elif (_TME_SIZEOF_FLOAT >= 12)
419: #define TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN TME_FLOAT_FORMAT_FLOAT
420: #elif (_TME_SIZEOF_DOUBLE >= 12 || !defined(_TME_HAVE_LONG_DOUBLE))
421: #define TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN TME_FLOAT_FORMAT_DOUBLE
422: #else
423: #define TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN TME_FLOAT_FORMAT_LONG_DOUBLE
424: #endif
425:
426: /* typedef the builtin C floating-point type that is the best match
427: for the IEEE 754 extended80 precision format: */
428: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
429: typedef float tme_ieee754_extended80_builtin_t;
430: #define tme_float_value_ieee754_extended80_builtin tme_float_value_float
431: #elif (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_DOUBLE)
432: typedef double tme_ieee754_extended80_builtin_t;
433: #define tme_float_value_ieee754_extended80_builtin tme_float_value_double
434: #elif (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_LONG_DOUBLE)
435: typedef long double tme_ieee754_extended80_builtin_t;
436: #define tme_float_value_ieee754_extended80_builtin tme_float_value_long_double
437: #endif
438:
439: /* this asserts that the float is either in IEEE 754 extended80
440: precision format, or in the best-match builtin type format. it
441: evaluates to nonzero if the float is in IEEE 754 extended80
442: precision format: */
443: #define tme_ieee754_extended80_is_format(x) \
444: (tme_float_assert_formats(x, \
445: TME_FLOAT_FORMAT_IEEE754_EXTENDED80 | TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN) \
446: && tme_float_is_format(x, \
447: TME_FLOAT_FORMAT_IEEE754_EXTENDED80 | TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN, \
448: TME_FLOAT_FORMAT_IEEE754_EXTENDED80))
449:
450: /* this asserts that the float is either in IEEE 754 extended80
451: precision format, or in the best-match builtin type format. it
452: evaluates to nonzero if the float is in the best-match builtin
453: type format: */
454: #define tme_ieee754_extended80_is_format_builtin(x) \
455: (tme_float_assert_formats(x, \
456: TME_FLOAT_FORMAT_IEEE754_EXTENDED80 | TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN) \
457: && tme_float_is_format(x, \
458: TME_FLOAT_FORMAT_IEEE754_EXTENDED80 | TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN, \
459: TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN))
460:
461: /* this asserts that the float is either in IEEE 754 extended80
462: precision format, or in the best-match builtin type format. it
463: evaluates to nonzero if the float is a NaN: */
464: #define tme_ieee754_extended80_is_nan(x) \
465: (tme_float_assert_formats(x, \
466: TME_FLOAT_FORMAT_IEEE754_EXTENDED80 | TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN) \
467: && tme_float_is_nan(x, \
468: TME_FLOAT_FORMAT_IEEE754_EXTENDED80 | TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN))
469:
470: /* this asserts that the float is either in IEEE 754 extended80
471: precision format, or in the best-match builtin type format. it
472: evaluates to nonzero if the float is an infinity: */
473: #define tme_ieee754_extended80_is_inf(x) \
474: (tme_float_assert_formats(x, \
475: TME_FLOAT_FORMAT_IEEE754_EXTENDED80 | TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN) \
476: && tme_float_is_inf(x, \
477: TME_FLOAT_FORMAT_IEEE754_EXTENDED80 | TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN))
478:
479: /* this asserts that the float is either in IEEE 754 extended80
480: precision format, or in the best-match builtin type format. it
481: evaluates to nonzero if the float is a zero: */
482: #define tme_ieee754_extended80_is_zero(x) \
483: (tme_float_assert_formats(x, \
484: TME_FLOAT_FORMAT_IEEE754_EXTENDED80 | TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN) \
485: && tme_float_is_zero(x, \
486: TME_FLOAT_FORMAT_IEEE754_EXTENDED80 | TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN))
487:
488: /* tme_ieee754_extended80_value_get(x, buffer) returns a pointer to
489: the value of x in IEEE 754 extended80 precision format (i.e., it
490: returns a pointer to struct tme_float_ieee754_extended80). if x isn't already in this
491: format, it is converted into that format in the given buffer: */
492: #define tme_ieee754_extended80_value_get(x, buffer) \
493: (tme_ieee754_extended80_is_format(x) \
494: ? &(x)->tme_float_value_ieee754_extended80 \
495: : tme_ieee754_extended80_value_from_builtin((x)->tme_float_value_ieee754_extended80_builtin, buffer))
496:
497: /* tme_ieee754_extended80_value_set(x, y) sets the value of x to
498: y, in IEEE 754 extended80 precision format (i.e., y is a struct tme_float_ieee754_extended80).
499: (the internal function _tme_ieee754_extended80_value_set(x, t, y)
500: takes the type of y, which must be compatible with struct tme_float_ieee754_extended80): */
501: #define tme_ieee754_extended80_value_set(x, y) \
502: do { \
503: (x)->tme_float_value_ieee754_extended80 = (y); \
504: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_EXTENDED80; \
505: } while (/* CONSTCOND */ 0)
506: #define _tme_ieee754_extended80_value_set(x, t, y) \
507: do { \
508: *((t *) &(x)->tme_float_value_ieee754_extended80) = (y); \
509: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_EXTENDED80; \
510: } while (/* CONSTCOND */ 0)
511:
512: /* tme_ieee754_extended80_value_set_constant(x, y) sets the value of
513: x to the constant y (i.e., y is a const struct tme_ieee754_extended80_constant *): */
514: #define tme_ieee754_extended80_value_set_constant(x, y) \
515: do { \
516: (x)->tme_float_value_ieee754_extended80.tme_float_ieee754_extended80_sexp = (y)->tme_ieee754_extended80_constant_sexp; \
517: (x)->tme_float_value_ieee754_extended80.tme_float_ieee754_extended80_significand.tme_value64_uint32_hi = (y)->tme_ieee754_extended80_constant_significand_hi; \
518: (x)->tme_float_value_ieee754_extended80.tme_float_ieee754_extended80_significand.tme_value64_uint32_lo = (y)->tme_ieee754_extended80_constant_significand_lo; \
519: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_EXTENDED80; \
520: } while (/* CONSTCOND */ 0)
521:
522: /* tme_ieee754_extended80_value_builtin_get(x) returns the value of
523: x as the builtin C type that is the best match for the IEEE 754
524: extended80 precision format: */
525: #define tme_ieee754_extended80_value_builtin_get(x) \
526: (tme_ieee754_extended80_is_format_builtin(x) \
527: ? (x)->tme_float_value_ieee754_extended80_builtin \
528: : tme_ieee754_extended80_value_to_builtin(&(x)->tme_float_value_ieee754_extended80))
529:
530: /* tme_ieee754_extended80_value_builtin_set(x, format, y) sets the value of
531: x to y, whose type is a builtin C type with format format. if the value of
532: y is a NaN or an infinity, y is stored in x in IEEE 754 extended80
533: precision format, otherwise y is stored in x as the builtin C type
534: that is the best match for the IEEE 754 extended80 precision format: */
535: #define tme_ieee754_extended80_value_builtin_set(x, format, y) \
536: do { \
537: /* set the value: */ \
538: tme_float_value_builtin_set(x, format, y); \
539: \
540: /* if the result is a NaN: */ \
541: if (tme_float_is_nan(x, format)) { \
542: \
543: /* use the proper default IEEE 754 extended80 precision NaN: */ \
544: (x)->tme_float_value_ieee754_extended80 = ieee754_ctl->tme_ieee754_ctl_default_nan_extended80; \
545: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_EXTENDED80; \
546: } \
547: \
548: /* otherwise, if the result isn't already in IEEE 754 extended80 precision format: */ \
549: else if ((format) != TME_FLOAT_FORMAT_IEEE754_EXTENDED80) { \
550: \
551: /* if the result is infinite: */ \
552: if (tme_float_is_inf(x, format)) { \
553: \
554: /* use the IEEE 754 extended80 precision infinity: */ \
555: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_EXTENDED80; \
556: (x)->tme_float_value_ieee754_extended80.tme_float_ieee754_extended80_sexp = ((tme_uint32_t) 0x7fff) | (tme_float_is_negative(x, (format)) ? (((tme_uint32_t) 0x7fff) + _TME_FIELD_MASK_FACTOR(((tme_uint32_t) 0x7fff))) : 0); \
557: (x)->tme_float_value_ieee754_extended80.tme_float_ieee754_extended80_significand.tme_value64_uint32_hi = 0; \
558: (x)->tme_float_value_ieee754_extended80.tme_float_ieee754_extended80_significand.tme_value64_uint32_lo = 0; \
559: } \
560: \
561: /* otherwise, if the result isn't already the builtin C type that \
562: is the best match for the IEEE 754 extended80 precision format: */ \
563: else if ((format) != TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN) { \
564: \
565: /* convert the result: */ \
566: if ((format) == TME_FLOAT_FORMAT_FLOAT) { \
567: (x)->tme_float_value_ieee754_extended80_builtin = (x)->tme_float_value_float; \
568: } \
569: TME_FLOAT_IF_LONG_DOUBLE(else if ((format) == TME_FLOAT_FORMAT_LONG_DOUBLE) { \
570: (x)->tme_float_value_ieee754_extended80_builtin = (x)->tme_float_value_long_double; \
571: }) \
572: else { \
573: assert((format) == TME_FLOAT_FORMAT_DOUBLE); \
574: (x)->tme_float_value_ieee754_extended80_builtin = (x)->tme_float_value_double; \
575: } \
576: } \
577: } \
578: } while (/* CONSTCOND */ 0)
579:
580: /* this converts a value from IEEE 754 extended80 precision format
581: into the builtin C type that is the best match for that format: */
582: tme_ieee754_extended80_builtin_t tme_ieee754_extended80_value_to_builtin _TME_P((const struct tme_float_ieee754_extended80 *));
583:
584: /* this converts a value from the builtin C type that is the best
585: match for the IEEE 754 extended80 precision format, into that
586: format: */
587: const struct tme_float_ieee754_extended80 *tme_ieee754_extended80_value_from_builtin _TME_P((tme_ieee754_extended80_builtin_t, struct tme_float_ieee754_extended80 *));
588:
589: /* this does a NaN check for an IEEE 754 extended80 precision monadic function: */
590: int tme_ieee754_extended80_check_nan_monadic _TME_P((struct tme_ieee754_ctl *, const struct tme_float *, struct tme_float *));
591:
592: /* this does a NaN check for an IEEE 754 extended80 precision dyadic function: */
593: int tme_ieee754_extended80_check_nan_dyadic _TME_P((struct tme_ieee754_ctl *, const struct tme_float *, const struct tme_float *, struct tme_float *));
594:
595: /* this converts a tme_uint32_t to a extended80: */
596: void tme_ieee754_extended80_from_int32 _TME_P((tme_uint32_t, struct tme_float *));
597:
598: #if defined(TME_HAVE_INT64_T)
599:
600: /* this converts a tme_uint64_t to a extended80: */
601: void tme_ieee754_extended80_from_int64 _TME_P((tme_uint64_t, struct tme_float *));
602:
603: #endif /* defined(TME_HAVE_INT64_T) */
604:
605: /* this converts an in-range IEEE 754 extended80 precision value into its
606: radix 10 mantissa and exponent. the mantissa is either zero, or
607: in the range [1,10): */
608: void tme_ieee754_extended80_radix10_mantissa_exponent _TME_P((struct tme_ieee754_ctl *, const struct tme_float *, struct tme_float *, struct tme_float *));
609:
610: /* this scales an IEEE 754 extended80 precision value by adding n to its
611: radix 10 exponent: */
612: void tme_ieee754_extended80_radix10_scale _TME_P((struct tme_ieee754_ctl *, const struct tme_float *, const struct tme_float *, struct tme_float *));
613:
614:
615: /* decide which builtin C floating-point type is the best match for
616: the IEEE 754 quad precision format. if a builtin type matches
617: this format exactly, use that type, otherwise we assume that the
618: smallest builtin type that is at least 16 bytes wide is the best
619: match. if no builtin type is at least that wide, we use long
620: double, or double if long double is not available: */
621: #if ((TME_FLOAT_FORMATS_BUILTIN & TME_FLOAT_FORMAT_IEEE754_QUAD) != 0)
622: #define TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN TME_FLOAT_FORMAT_IEEE754_QUAD
623: #elif (_TME_SIZEOF_FLOAT >= 16)
624: #define TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN TME_FLOAT_FORMAT_FLOAT
625: #elif (_TME_SIZEOF_DOUBLE >= 16 || !defined(_TME_HAVE_LONG_DOUBLE))
626: #define TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN TME_FLOAT_FORMAT_DOUBLE
627: #else
628: #define TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN TME_FLOAT_FORMAT_LONG_DOUBLE
629: #endif
630:
631: /* typedef the builtin C floating-point type that is the best match
632: for the IEEE 754 quad precision format: */
633: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
634: typedef float tme_ieee754_quad_builtin_t;
635: #define tme_float_value_ieee754_quad_builtin tme_float_value_float
636: #elif (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_DOUBLE)
637: typedef double tme_ieee754_quad_builtin_t;
638: #define tme_float_value_ieee754_quad_builtin tme_float_value_double
639: #elif (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_LONG_DOUBLE)
640: typedef long double tme_ieee754_quad_builtin_t;
641: #define tme_float_value_ieee754_quad_builtin tme_float_value_long_double
642: #endif
643:
644: /* this asserts that the float is either in IEEE 754 quad
645: precision format, or in the best-match builtin type format. it
646: evaluates to nonzero if the float is in IEEE 754 quad
647: precision format: */
648: #define tme_ieee754_quad_is_format(x) \
649: (tme_float_assert_formats(x, \
650: TME_FLOAT_FORMAT_IEEE754_QUAD | TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN) \
651: && tme_float_is_format(x, \
652: TME_FLOAT_FORMAT_IEEE754_QUAD | TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN, \
653: TME_FLOAT_FORMAT_IEEE754_QUAD))
654:
655: /* this asserts that the float is either in IEEE 754 quad
656: precision format, or in the best-match builtin type format. it
657: evaluates to nonzero if the float is in the best-match builtin
658: type format: */
659: #define tme_ieee754_quad_is_format_builtin(x) \
660: (tme_float_assert_formats(x, \
661: TME_FLOAT_FORMAT_IEEE754_QUAD | TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN) \
662: && tme_float_is_format(x, \
663: TME_FLOAT_FORMAT_IEEE754_QUAD | TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN, \
664: TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN))
665:
666: /* this asserts that the float is either in IEEE 754 quad
667: precision format, or in the best-match builtin type format. it
668: evaluates to nonzero if the float is a NaN: */
669: #define tme_ieee754_quad_is_nan(x) \
670: (tme_float_assert_formats(x, \
671: TME_FLOAT_FORMAT_IEEE754_QUAD | TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN) \
672: && tme_float_is_nan(x, \
673: TME_FLOAT_FORMAT_IEEE754_QUAD | TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN))
674:
675: /* this asserts that the float is either in IEEE 754 quad
676: precision format, or in the best-match builtin type format. it
677: evaluates to nonzero if the float is an infinity: */
678: #define tme_ieee754_quad_is_inf(x) \
679: (tme_float_assert_formats(x, \
680: TME_FLOAT_FORMAT_IEEE754_QUAD | TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN) \
681: && tme_float_is_inf(x, \
682: TME_FLOAT_FORMAT_IEEE754_QUAD | TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN))
683:
684: /* this asserts that the float is either in IEEE 754 quad
685: precision format, or in the best-match builtin type format. it
686: evaluates to nonzero if the float is a zero: */
687: #define tme_ieee754_quad_is_zero(x) \
688: (tme_float_assert_formats(x, \
689: TME_FLOAT_FORMAT_IEEE754_QUAD | TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN) \
690: && tme_float_is_zero(x, \
691: TME_FLOAT_FORMAT_IEEE754_QUAD | TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN))
692:
693: /* tme_ieee754_quad_value_get(x, buffer) returns a pointer to
694: the value of x in IEEE 754 quad precision format (i.e., it
695: returns a pointer to struct tme_float_ieee754_quad). if x isn't already in this
696: format, it is converted into that format in the given buffer: */
697: #define tme_ieee754_quad_value_get(x, buffer) \
698: (tme_ieee754_quad_is_format(x) \
699: ? &(x)->tme_float_value_ieee754_quad \
700: : tme_ieee754_quad_value_from_builtin((x)->tme_float_value_ieee754_quad_builtin, buffer))
701:
702: /* tme_ieee754_quad_value_set(x, y) sets the value of x to
703: y, in IEEE 754 quad precision format (i.e., y is a struct tme_float_ieee754_quad).
704: (the internal function _tme_ieee754_quad_value_set(x, t, y)
705: takes the type of y, which must be compatible with struct tme_float_ieee754_quad): */
706: #define tme_ieee754_quad_value_set(x, y) \
707: do { \
708: (x)->tme_float_value_ieee754_quad = (y); \
709: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_QUAD; \
710: } while (/* CONSTCOND */ 0)
711: #define _tme_ieee754_quad_value_set(x, t, y) \
712: do { \
713: *((t *) &(x)->tme_float_value_ieee754_quad) = (y); \
714: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_QUAD; \
715: } while (/* CONSTCOND */ 0)
716:
717: /* tme_ieee754_quad_value_set_constant(x, y) sets the value of
718: x to the constant y (i.e., y is a const struct tme_ieee754_quad_constant *): */
719: #define tme_ieee754_quad_value_set_constant(x, y) \
720: do { \
721: (x)->tme_float_value_ieee754_quad.tme_float_ieee754_quad_hi.tme_value64_uint32_hi = (y)->tme_ieee754_quad_constant_hi_hi; \
722: (x)->tme_float_value_ieee754_quad.tme_float_ieee754_quad_hi.tme_value64_uint32_lo = (y)->tme_ieee754_quad_constant_hi_lo; \
723: (x)->tme_float_value_ieee754_quad.tme_float_ieee754_quad_lo.tme_value64_uint32_hi = (y)->tme_ieee754_quad_constant_lo_hi; \
724: (x)->tme_float_value_ieee754_quad.tme_float_ieee754_quad_lo.tme_value64_uint32_lo = (y)->tme_ieee754_quad_constant_lo_lo; \
725: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_QUAD; \
726: } while (/* CONSTCOND */ 0)
727:
728: /* tme_ieee754_quad_value_builtin_get(x) returns the value of
729: x as the builtin C type that is the best match for the IEEE 754
730: quad precision format: */
731: #define tme_ieee754_quad_value_builtin_get(x) \
732: (tme_ieee754_quad_is_format_builtin(x) \
733: ? (x)->tme_float_value_ieee754_quad_builtin \
734: : tme_ieee754_quad_value_to_builtin(&(x)->tme_float_value_ieee754_quad))
735:
736: /* tme_ieee754_quad_value_builtin_set(x, format, y) sets the value of
737: x to y, whose type is a builtin C type with format format. if the value of
738: y is a NaN or an infinity, y is stored in x in IEEE 754 quad
739: precision format, otherwise y is stored in x as the builtin C type
740: that is the best match for the IEEE 754 quad precision format: */
741: #define tme_ieee754_quad_value_builtin_set(x, format, y) \
742: do { \
743: /* set the value: */ \
744: tme_float_value_builtin_set(x, format, y); \
745: \
746: /* if the result is a NaN: */ \
747: if (tme_float_is_nan(x, format)) { \
748: \
749: /* use the proper default IEEE 754 quad precision NaN: */ \
750: (x)->tme_float_value_ieee754_quad = ieee754_ctl->tme_ieee754_ctl_default_nan_quad; \
751: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_QUAD; \
752: } \
753: \
754: /* otherwise, if the result isn't already in IEEE 754 quad precision format: */ \
755: else if ((format) != TME_FLOAT_FORMAT_IEEE754_QUAD) { \
756: \
757: /* if the result is infinite: */ \
758: if (tme_float_is_inf(x, format)) { \
759: \
760: /* use the IEEE 754 quad precision infinity: */ \
761: (x)->tme_float_format = TME_FLOAT_FORMAT_IEEE754_QUAD; \
762: (x)->tme_float_value_ieee754_quad.tme_float_ieee754_quad_hi.tme_value64_uint32_hi = ((tme_uint32_t) 0x7fff0000) | (tme_float_is_negative(x, (format)) ? (((tme_uint32_t) 0x7fff0000) + _TME_FIELD_MASK_FACTOR(((tme_uint32_t) 0x7fff0000))) : 0); \
763: (x)->tme_float_value_ieee754_quad.tme_float_ieee754_quad_hi.tme_value64_uint32_lo = 0; \
764: (x)->tme_float_value_ieee754_quad.tme_float_ieee754_quad_lo.tme_value64_uint32_hi = 0; \
765: (x)->tme_float_value_ieee754_quad.tme_float_ieee754_quad_lo.tme_value64_uint32_lo = 0; \
766: } \
767: \
768: /* otherwise, if the result isn't already the builtin C type that \
769: is the best match for the IEEE 754 quad precision format: */ \
770: else if ((format) != TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN) { \
771: \
772: /* convert the result: */ \
773: if ((format) == TME_FLOAT_FORMAT_FLOAT) { \
774: (x)->tme_float_value_ieee754_quad_builtin = (x)->tme_float_value_float; \
775: } \
776: TME_FLOAT_IF_LONG_DOUBLE(else if ((format) == TME_FLOAT_FORMAT_LONG_DOUBLE) { \
777: (x)->tme_float_value_ieee754_quad_builtin = (x)->tme_float_value_long_double; \
778: }) \
779: else { \
780: assert((format) == TME_FLOAT_FORMAT_DOUBLE); \
781: (x)->tme_float_value_ieee754_quad_builtin = (x)->tme_float_value_double; \
782: } \
783: } \
784: } \
785: } while (/* CONSTCOND */ 0)
786:
787: /* this converts a value from IEEE 754 quad precision format
788: into the builtin C type that is the best match for that format: */
789: tme_ieee754_quad_builtin_t tme_ieee754_quad_value_to_builtin _TME_P((const struct tme_float_ieee754_quad *));
790:
791: /* this converts a value from the builtin C type that is the best
792: match for the IEEE 754 quad precision format, into that
793: format: */
794: const struct tme_float_ieee754_quad *tme_ieee754_quad_value_from_builtin _TME_P((tme_ieee754_quad_builtin_t, struct tme_float_ieee754_quad *));
795:
796: /* this does a NaN check for an IEEE 754 quad precision monadic function: */
797: int tme_ieee754_quad_check_nan_monadic _TME_P((struct tme_ieee754_ctl *, const struct tme_float *, struct tme_float *));
798:
799: /* this does a NaN check for an IEEE 754 quad precision dyadic function: */
800: int tme_ieee754_quad_check_nan_dyadic _TME_P((struct tme_ieee754_ctl *, const struct tme_float *, const struct tme_float *, struct tme_float *));
801:
802: /* this converts a tme_uint32_t to a quad: */
803: void tme_ieee754_quad_from_int32 _TME_P((tme_uint32_t, struct tme_float *));
804:
805: #if defined(TME_HAVE_INT64_T)
806:
807: /* this converts a tme_uint64_t to a quad: */
808: void tme_ieee754_quad_from_int64 _TME_P((tme_uint64_t, struct tme_float *));
809:
810: #endif /* defined(TME_HAVE_INT64_T) */
811:
812: /* this converts an in-range IEEE 754 quad precision value into its
813: radix 10 mantissa and exponent. the mantissa is either zero, or
814: in the range [1,10): */
815: void tme_ieee754_quad_radix10_mantissa_exponent _TME_P((struct tme_ieee754_ctl *, const struct tme_float *, struct tme_float *, struct tme_float *));
816:
817: /* this scales an IEEE 754 quad precision value by adding n to its
818: radix 10 exponent: */
819: void tme_ieee754_quad_radix10_scale _TME_P((struct tme_ieee754_ctl *, const struct tme_float *, const struct tme_float *, struct tme_float *));
820:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.