|
|
1.1 root 1: /* automatically generated by ieee754-ops-auto.sh, do not edit! */
2: #include <tme/common.h>
1.1.1.3 ! root 3: _TME_RCSID("$Id: ieee754-ops-auto.sh,v 1.5 2009/08/28 01:34:01 fredette Exp $");
1.1 root 4:
5: #include "softfloat-tme.h"
6: #include <math.h>
7:
8: /* this does a strict compliance single-precision add: */
9: static void
10: _tme_ieee754_strict_single_add(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
11: {
12: tme_uint32_t src0_buffer;
13: tme_uint32_t src1_buffer;
14: int exceptions;
15:
16: /* enter softfloat operation: */
17: tme_mutex_lock(&tme_ieee754_global_mutex);
18: tme_ieee754_global_ctl = ieee754_ctl;
19: tme_ieee754_global_exceptions = 0;
20: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
21:
22: /* assume that this operation raises no exceptions: */
23: exceptions = 0;
24:
25: /* the operation: */
26: _tme_ieee754_single_value_set(dst, float32,
27: float32_add((*((const float32 *) tme_ieee754_single_value_get(src0, &src0_buffer))),
28: (*((const float32 *) tme_ieee754_single_value_get(src1, &src1_buffer)))));
29:
30: /* leave softfloat operation: */
31: tme_ieee754_global_ctl = NULL;
32: exceptions |= tme_ieee754_global_exceptions;
33: tme_mutex_unlock(&tme_ieee754_global_mutex);
34: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
35:
36: /* signal any exceptions: */
37: if (exceptions != 0) {
38: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
39: }
40: }
41:
42: /* this does a strict compliance single-precision sub: */
43: static void
44: _tme_ieee754_strict_single_sub(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
45: {
46: tme_uint32_t src0_buffer;
47: tme_uint32_t src1_buffer;
48: int exceptions;
49:
50: /* enter softfloat operation: */
51: tme_mutex_lock(&tme_ieee754_global_mutex);
52: tme_ieee754_global_ctl = ieee754_ctl;
53: tme_ieee754_global_exceptions = 0;
54: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
55:
56: /* assume that this operation raises no exceptions: */
57: exceptions = 0;
58:
59: /* the operation: */
60: _tme_ieee754_single_value_set(dst, float32,
61: float32_sub((*((const float32 *) tme_ieee754_single_value_get(src0, &src0_buffer))),
62: (*((const float32 *) tme_ieee754_single_value_get(src1, &src1_buffer)))));
63:
64: /* leave softfloat operation: */
65: tme_ieee754_global_ctl = NULL;
66: exceptions |= tme_ieee754_global_exceptions;
67: tme_mutex_unlock(&tme_ieee754_global_mutex);
68: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
69:
70: /* signal any exceptions: */
71: if (exceptions != 0) {
72: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
73: }
74: }
75:
76: /* this does a strict compliance single-precision mul: */
77: static void
78: _tme_ieee754_strict_single_mul(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
79: {
80: tme_uint32_t src0_buffer;
81: tme_uint32_t src1_buffer;
82: int exceptions;
83:
84: /* enter softfloat operation: */
85: tme_mutex_lock(&tme_ieee754_global_mutex);
86: tme_ieee754_global_ctl = ieee754_ctl;
87: tme_ieee754_global_exceptions = 0;
88: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
89:
90: /* assume that this operation raises no exceptions: */
91: exceptions = 0;
92:
93: /* the operation: */
94: _tme_ieee754_single_value_set(dst, float32,
95: float32_mul((*((const float32 *) tme_ieee754_single_value_get(src0, &src0_buffer))),
96: (*((const float32 *) tme_ieee754_single_value_get(src1, &src1_buffer)))));
97:
98: /* leave softfloat operation: */
99: tme_ieee754_global_ctl = NULL;
100: exceptions |= tme_ieee754_global_exceptions;
101: tme_mutex_unlock(&tme_ieee754_global_mutex);
102: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
103:
104: /* signal any exceptions: */
105: if (exceptions != 0) {
106: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
107: }
108: }
109:
110: /* this does a strict compliance single-precision div: */
111: static void
112: _tme_ieee754_strict_single_div(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
113: {
114: tme_uint32_t src0_buffer;
115: tme_uint32_t src1_buffer;
116: int exceptions;
117:
118: /* enter softfloat operation: */
119: tme_mutex_lock(&tme_ieee754_global_mutex);
120: tme_ieee754_global_ctl = ieee754_ctl;
121: tme_ieee754_global_exceptions = 0;
122: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
123:
124: /* assume that this operation raises no exceptions: */
125: exceptions = 0;
126:
127: /* the operation: */
128: _tme_ieee754_single_value_set(dst, float32,
129: float32_div((*((const float32 *) tme_ieee754_single_value_get(src0, &src0_buffer))),
130: (*((const float32 *) tme_ieee754_single_value_get(src1, &src1_buffer)))));
131:
132: /* leave softfloat operation: */
133: tme_ieee754_global_ctl = NULL;
134: exceptions |= tme_ieee754_global_exceptions;
135: tme_mutex_unlock(&tme_ieee754_global_mutex);
136: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
137:
138: /* signal any exceptions: */
139: if (exceptions != 0) {
140: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
141: }
142: }
143:
144: /* this does a strict compliance single-precision rem: */
145: static void
146: _tme_ieee754_strict_single_rem(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
147: {
148: tme_uint32_t src0_buffer;
149: tme_uint32_t src1_buffer;
150: int exceptions;
151:
152: /* enter softfloat operation: */
153: tme_mutex_lock(&tme_ieee754_global_mutex);
154: tme_ieee754_global_ctl = ieee754_ctl;
155: tme_ieee754_global_exceptions = 0;
156: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
157:
158: /* assume that this operation raises no exceptions: */
159: exceptions = 0;
160:
161: /* the operation: */
162: _tme_ieee754_single_value_set(dst, float32,
163: float32_rem((*((const float32 *) tme_ieee754_single_value_get(src0, &src0_buffer))),
164: (*((const float32 *) tme_ieee754_single_value_get(src1, &src1_buffer)))));
165:
166: /* leave softfloat operation: */
167: tme_ieee754_global_ctl = NULL;
168: exceptions |= tme_ieee754_global_exceptions;
169: tme_mutex_unlock(&tme_ieee754_global_mutex);
170: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
171:
172: /* signal any exceptions: */
173: if (exceptions != 0) {
174: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
175: }
176: }
177:
178: /* this does a strict compliance single-precision sqrt: */
179: static void
180: _tme_ieee754_strict_single_sqrt(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
181: {
182: tme_uint32_t src0_buffer;
183: int exceptions;
184:
185: /* enter softfloat operation: */
186: tme_mutex_lock(&tme_ieee754_global_mutex);
187: tme_ieee754_global_ctl = ieee754_ctl;
188: tme_ieee754_global_exceptions = 0;
189: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
190:
191: /* assume that this operation raises no exceptions: */
192: exceptions = 0;
193:
194: /* the operation: */
195: _tme_ieee754_single_value_set(dst, float32,
196: float32_sqrt((*((const float32 *) tme_ieee754_single_value_get(src0, &src0_buffer)))));
197:
198: /* leave softfloat operation: */
199: tme_ieee754_global_ctl = NULL;
200: exceptions |= tme_ieee754_global_exceptions;
201: tme_mutex_unlock(&tme_ieee754_global_mutex);
202: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
203:
204: /* signal any exceptions: */
205: if (exceptions != 0) {
206: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
207: }
208: }
209:
210: /* this does a strict compliance single-precision neg: */
211: static void
212: _tme_ieee754_strict_single_neg(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
213: {
214: tme_uint32_t src0_buffer;
215: int exceptions;
216:
217: /* enter softfloat operation: */
218: tme_mutex_lock(&tme_ieee754_global_mutex);
219: tme_ieee754_global_ctl = ieee754_ctl;
220: tme_ieee754_global_exceptions = 0;
221: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
222:
223: /* assume that this operation raises no exceptions: */
224: exceptions = 0;
225:
226: /* the operation: */
227: _tme_ieee754_single_value_set(dst, float32,
1.1.1.2 root 228: float32_mul(int32_to_float32(-1),
1.1 root 229: (*((const float32 *) tme_ieee754_single_value_get(src0, &src0_buffer)))));
230:
231: /* leave softfloat operation: */
232: tme_ieee754_global_ctl = NULL;
233: exceptions |= tme_ieee754_global_exceptions;
234: tme_mutex_unlock(&tme_ieee754_global_mutex);
235: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
236:
237: /* signal any exceptions: */
238: if (exceptions != 0) {
239: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
240: }
241: }
242:
243: /* this does a strict compliance single-precision move: */
244: static void
245: _tme_ieee754_strict_single_move(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
246: {
247: tme_uint32_t src0_buffer;
248: int exceptions;
249:
250: /* enter softfloat operation: */
251: tme_mutex_lock(&tme_ieee754_global_mutex);
252: tme_ieee754_global_ctl = ieee754_ctl;
253: tme_ieee754_global_exceptions = 0;
254: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
255:
256: /* assume that this operation raises no exceptions: */
257: exceptions = 0;
258:
259: /* the operation: */
260: _tme_ieee754_single_value_set(dst, float32,
261: float32_add((*((const float32 *) tme_ieee754_single_value_get(src0, &src0_buffer))),
262: int32_to_float32(0)));
263:
264: /* leave softfloat operation: */
265: tme_ieee754_global_ctl = NULL;
266: exceptions |= tme_ieee754_global_exceptions;
267: tme_mutex_unlock(&tme_ieee754_global_mutex);
268: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
269:
270: /* signal any exceptions: */
271: if (exceptions != 0) {
272: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
273: }
274: }
275:
276: /* this does a strict compliance single-precision rint: */
277: static void
278: _tme_ieee754_strict_single_rint(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
279: {
280: tme_uint32_t src0_buffer;
281: int exceptions;
282:
283: /* enter softfloat operation: */
284: tme_mutex_lock(&tme_ieee754_global_mutex);
285: tme_ieee754_global_ctl = ieee754_ctl;
286: tme_ieee754_global_exceptions = 0;
287: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
288:
289: /* assume that this operation raises no exceptions: */
290: exceptions = 0;
291:
292: /* the operation: */
293: _tme_ieee754_single_value_set(dst, float32,
294: float32_round_to_int((*((const float32 *) tme_ieee754_single_value_get(src0, &src0_buffer)))));
295:
296: /* leave softfloat operation: */
297: tme_ieee754_global_ctl = NULL;
298: exceptions |= tme_ieee754_global_exceptions;
299: tme_mutex_unlock(&tme_ieee754_global_mutex);
300: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
301:
302: /* signal any exceptions: */
303: if (exceptions != 0) {
304: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
305: }
306: }
307:
308: /* this does a strict compliance single-precision getexp: */
309: static void
310: _tme_ieee754_strict_single_getexp(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
311: {
312: tme_uint32_t src0_buffer;
313: int exceptions;
314:
315: /* check for a NaN operand: */
316: if (__tme_predict_false(tme_ieee754_single_check_nan_monadic(ieee754_ctl, src0, dst))) {
317: return;
318: }
319:
320: /* if the operand is an infinity: */
321: if (tme_ieee754_single_is_inf(src0)) {
322:
323: /* return a NaN: */
324: dst->tme_float_format = TME_FLOAT_FORMAT_IEEE754_SINGLE;
325: dst->tme_float_value_ieee754_single = ieee754_ctl->tme_ieee754_ctl_default_nan_single;
326: return;
327: }
328:
329: /* assume that this operation raises no exceptions: */
330: exceptions = 0;
331:
332: /* the operation: */
333:
334: /* if the operand is a zero, return a zero: */
335: if (tme_ieee754_single_is_zero(src0)) {
336: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN, 0);
337: }
338:
339: /* otherwise, return the unbiased exponent: */
340: else {
341: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN, TME_FIELD_MASK_EXTRACTU((*tme_ieee754_single_value_get(src0, &src0_buffer)), ((tme_uint32_t) 0x7f800000)) - ((((tme_uint32_t) 0x7f800000) / _TME_FIELD_MASK_FACTOR(((tme_uint32_t) 0x7f800000))) >> 1));
342: }
343: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
344:
345: /* signal any exceptions: */
346: if (exceptions != 0) {
347: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
348: }
349: }
350:
351: /* this does a strict compliance single-precision getman: */
352: static void
353: _tme_ieee754_strict_single_getman(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
354: {
355: tme_uint32_t src0_buffer;
356: int exceptions;
357:
358: /* check for a NaN operand: */
359: if (__tme_predict_false(tme_ieee754_single_check_nan_monadic(ieee754_ctl, src0, dst))) {
360: return;
361: }
362:
363: /* if the operand is an infinity: */
364: if (tme_ieee754_single_is_inf(src0)) {
365:
366: /* return a NaN: */
367: dst->tme_float_format = TME_FLOAT_FORMAT_IEEE754_SINGLE;
368: dst->tme_float_value_ieee754_single = ieee754_ctl->tme_ieee754_ctl_default_nan_single;
369: return;
370: }
371:
372: /* assume that this operation raises no exceptions: */
373: exceptions = 0;
374:
375: /* the operation: */
376:
377: /* if the operand is a zero, return it: */
378: if (tme_ieee754_single_is_zero(src0)) {
379: *dst = *src0;
380: }
381:
382: /* otherwise, return the operand, with its exponent set to biased zero: */
383: else {
384: tme_ieee754_single_value_set(dst, (*tme_ieee754_single_value_get(src0, &src0_buffer)));
385: TME_FIELD_MASK_DEPOSITU(dst->tme_float_value_ieee754_single, ((tme_uint32_t) 0x7f800000), ((((tme_uint32_t) 0x7f800000) / _TME_FIELD_MASK_FACTOR(((tme_uint32_t) 0x7f800000))) >> 1));
386: }
387: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
388:
389: /* signal any exceptions: */
390: if (exceptions != 0) {
391: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
392: }
393: }
394:
395: /* this does a strict compliance single-precision from-double: */
396: static void
397: _tme_ieee754_strict_single_from_double(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
398: {
399: union tme_value64 src0_buffer;
400: int exceptions;
401:
402: /* enter softfloat operation: */
403: tme_mutex_lock(&tme_ieee754_global_mutex);
404: tme_ieee754_global_ctl = ieee754_ctl;
405: tme_ieee754_global_exceptions = 0;
406: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
407:
408: /* assume that this operation raises no exceptions: */
409: exceptions = 0;
410:
411: /* the operation: */
412: _tme_ieee754_single_value_set(dst, float32,
413: float64_to_float32((*((const float64 *) tme_ieee754_double_value_get(src0, &src0_buffer)))));
414:
415: /* leave softfloat operation: */
416: tme_ieee754_global_ctl = NULL;
417: exceptions |= tme_ieee754_global_exceptions;
418: tme_mutex_unlock(&tme_ieee754_global_mutex);
419: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
420:
421: /* signal any exceptions: */
422: if (exceptions != 0) {
423: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
424: }
425: }
426:
427: /* this does a strict compliance single-precision from-extended80: */
428: static void
429: _tme_ieee754_strict_single_from_extended80(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
430: {
431: struct tme_float_ieee754_extended80 src0_buffer;
432: int exceptions;
433:
434: /* enter softfloat operation: */
435: tme_mutex_lock(&tme_ieee754_global_mutex);
436: tme_ieee754_global_ctl = ieee754_ctl;
437: tme_ieee754_global_exceptions = 0;
438: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
439:
440: /* assume that this operation raises no exceptions: */
441: exceptions = 0;
442:
443: /* the operation: */
444: _tme_ieee754_single_value_set(dst, float32,
445: floatx80_to_float32((*((const floatx80 *) tme_ieee754_extended80_value_get(src0, &src0_buffer)))));
446:
447: /* leave softfloat operation: */
448: tme_ieee754_global_ctl = NULL;
449: exceptions |= tme_ieee754_global_exceptions;
450: tme_mutex_unlock(&tme_ieee754_global_mutex);
451: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
452:
453: /* signal any exceptions: */
454: if (exceptions != 0) {
455: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
456: }
457: }
458:
459: /* this does a strict compliance single-precision from-quad: */
460: static void
461: _tme_ieee754_strict_single_from_quad(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
462: {
463: struct tme_float_ieee754_quad src0_buffer;
464: int exceptions;
465:
466: /* enter softfloat operation: */
467: tme_mutex_lock(&tme_ieee754_global_mutex);
468: tme_ieee754_global_ctl = ieee754_ctl;
469: tme_ieee754_global_exceptions = 0;
470: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
471:
472: /* assume that this operation raises no exceptions: */
473: exceptions = 0;
474:
475: /* the operation: */
476: _tme_ieee754_single_value_set(dst, float32,
477: float128_to_float32((*((const float128 *) tme_ieee754_quad_value_get(src0, &src0_buffer)))));
478:
479: /* leave softfloat operation: */
480: tme_ieee754_global_ctl = NULL;
481: exceptions |= tme_ieee754_global_exceptions;
482: tme_mutex_unlock(&tme_ieee754_global_mutex);
483: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
484:
485: /* signal any exceptions: */
486: if (exceptions != 0) {
487: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
488: }
489: }
490:
1.1.1.2 root 491: /* this does a strict compliance single-precision from-int32: */
492: static void
493: _tme_ieee754_strict_single_from_int32(struct tme_ieee754_ctl *ieee754_ctl, const tme_int32_t src0, struct tme_float *dst)
494: {
495: int exceptions;
496:
497: /* enter softfloat operation: */
498: tme_mutex_lock(&tme_ieee754_global_mutex);
499: tme_ieee754_global_ctl = ieee754_ctl;
500: tme_ieee754_global_exceptions = 0;
501: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
502:
503: /* assume that this operation raises no exceptions: */
504: exceptions = 0;
505:
506: /* the operation: */
507: _tme_ieee754_single_value_set(dst, float32,
508: int32_to_float32(src0));
509:
510: /* leave softfloat operation: */
511: tme_ieee754_global_ctl = NULL;
512: exceptions |= tme_ieee754_global_exceptions;
513: tme_mutex_unlock(&tme_ieee754_global_mutex);
514: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
515:
516: /* signal any exceptions: */
517: if (exceptions != 0) {
518: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
519: }
520: }
521:
522: #if defined(TME_HAVE_INT64_T)
523:
524: /* this does a strict compliance single-precision from-int64: */
525: static void
526: _tme_ieee754_strict_single_from_int64(struct tme_ieee754_ctl *ieee754_ctl, const tme_int64_t src0, struct tme_float *dst)
527: {
528: int exceptions;
529:
530: /* enter softfloat operation: */
531: tme_mutex_lock(&tme_ieee754_global_mutex);
532: tme_ieee754_global_ctl = ieee754_ctl;
533: tme_ieee754_global_exceptions = 0;
534: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
535:
536: /* assume that this operation raises no exceptions: */
537: exceptions = 0;
538:
539: /* the operation: */
540: _tme_ieee754_single_value_set(dst, float32,
541: int64_to_float32(src0));
542:
543: /* leave softfloat operation: */
544: tme_ieee754_global_ctl = NULL;
545: exceptions |= tme_ieee754_global_exceptions;
546: tme_mutex_unlock(&tme_ieee754_global_mutex);
547: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
548:
549: /* signal any exceptions: */
550: if (exceptions != 0) {
551: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
552: }
553: }
554:
555: #endif /* defined(TME_HAVE_INT64_T) */
556:
1.1 root 557: /* this does a strict compliance single-precision to-int32: */
558: static void
559: _tme_ieee754_strict_single_to_int32(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, tme_int32_t *dst)
560: {
561: tme_uint32_t src0_buffer;
562: int exceptions;
563:
564: /* enter softfloat operation: */
565: tme_mutex_lock(&tme_ieee754_global_mutex);
566: tme_ieee754_global_ctl = ieee754_ctl;
567: tme_ieee754_global_exceptions = 0;
568: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
569:
570: /* assume that this operation raises no exceptions: */
571: exceptions = 0;
572:
573: /* the operation: */
574: *dst = float32_to_int32((*((const float32 *) tme_ieee754_single_value_get(src0, &src0_buffer))));
575:
576: /* leave softfloat operation: */
577: tme_ieee754_global_ctl = NULL;
578: exceptions |= tme_ieee754_global_exceptions;
579: tme_mutex_unlock(&tme_ieee754_global_mutex);
580: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
581:
582: /* signal any exceptions: */
583: if (exceptions != 0) {
584: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
585: }
586: }
587:
1.1.1.3 ! root 588: #if defined(TME_HAVE_INT64_T)
! 589:
! 590: /* this does a strict compliance single-precision to-int64: */
! 591: static void
! 592: _tme_ieee754_strict_single_to_int64(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, tme_int64_t *dst)
! 593: {
! 594: tme_uint32_t src0_buffer;
! 595: int exceptions;
! 596:
! 597: /* enter softfloat operation: */
! 598: tme_mutex_lock(&tme_ieee754_global_mutex);
! 599: tme_ieee754_global_ctl = ieee754_ctl;
! 600: tme_ieee754_global_exceptions = 0;
! 601: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
! 602:
! 603: /* assume that this operation raises no exceptions: */
! 604: exceptions = 0;
! 605:
! 606: /* the operation: */
! 607: *dst = float32_to_int64((*((const float32 *) tme_ieee754_single_value_get(src0, &src0_buffer))));
! 608:
! 609: /* leave softfloat operation: */
! 610: tme_ieee754_global_ctl = NULL;
! 611: exceptions |= tme_ieee754_global_exceptions;
! 612: tme_mutex_unlock(&tme_ieee754_global_mutex);
! 613: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
! 614:
! 615: /* signal any exceptions: */
! 616: if (exceptions != 0) {
! 617: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
! 618: }
! 619: }
! 620:
! 621: #endif /* defined(TME_HAVE_INT64_T) */
! 622:
1.1 root 623: /* this does a strict compliance double-precision add: */
624: static void
625: _tme_ieee754_strict_double_add(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
626: {
627: union tme_value64 src0_buffer;
628: union tme_value64 src1_buffer;
629: int exceptions;
630:
631: /* enter softfloat operation: */
632: tme_mutex_lock(&tme_ieee754_global_mutex);
633: tme_ieee754_global_ctl = ieee754_ctl;
634: tme_ieee754_global_exceptions = 0;
635: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
636:
637: /* assume that this operation raises no exceptions: */
638: exceptions = 0;
639:
640: /* the operation: */
641: _tme_ieee754_double_value_set(dst, float64,
642: float64_add((*((const float64 *) tme_ieee754_double_value_get(src0, &src0_buffer))),
643: (*((const float64 *) tme_ieee754_double_value_get(src1, &src1_buffer)))));
644:
645: /* leave softfloat operation: */
646: tme_ieee754_global_ctl = NULL;
647: exceptions |= tme_ieee754_global_exceptions;
648: tme_mutex_unlock(&tme_ieee754_global_mutex);
649: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
650:
651: /* signal any exceptions: */
652: if (exceptions != 0) {
653: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
654: }
655: }
656:
657: /* this does a strict compliance double-precision sub: */
658: static void
659: _tme_ieee754_strict_double_sub(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
660: {
661: union tme_value64 src0_buffer;
662: union tme_value64 src1_buffer;
663: int exceptions;
664:
665: /* enter softfloat operation: */
666: tme_mutex_lock(&tme_ieee754_global_mutex);
667: tme_ieee754_global_ctl = ieee754_ctl;
668: tme_ieee754_global_exceptions = 0;
669: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
670:
671: /* assume that this operation raises no exceptions: */
672: exceptions = 0;
673:
674: /* the operation: */
675: _tme_ieee754_double_value_set(dst, float64,
676: float64_sub((*((const float64 *) tme_ieee754_double_value_get(src0, &src0_buffer))),
677: (*((const float64 *) tme_ieee754_double_value_get(src1, &src1_buffer)))));
678:
679: /* leave softfloat operation: */
680: tme_ieee754_global_ctl = NULL;
681: exceptions |= tme_ieee754_global_exceptions;
682: tme_mutex_unlock(&tme_ieee754_global_mutex);
683: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
684:
685: /* signal any exceptions: */
686: if (exceptions != 0) {
687: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
688: }
689: }
690:
691: /* this does a strict compliance double-precision mul: */
692: static void
693: _tme_ieee754_strict_double_mul(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
694: {
695: union tme_value64 src0_buffer;
696: union tme_value64 src1_buffer;
697: int exceptions;
698:
699: /* enter softfloat operation: */
700: tme_mutex_lock(&tme_ieee754_global_mutex);
701: tme_ieee754_global_ctl = ieee754_ctl;
702: tme_ieee754_global_exceptions = 0;
703: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
704:
705: /* assume that this operation raises no exceptions: */
706: exceptions = 0;
707:
708: /* the operation: */
709: _tme_ieee754_double_value_set(dst, float64,
710: float64_mul((*((const float64 *) tme_ieee754_double_value_get(src0, &src0_buffer))),
711: (*((const float64 *) tme_ieee754_double_value_get(src1, &src1_buffer)))));
712:
713: /* leave softfloat operation: */
714: tme_ieee754_global_ctl = NULL;
715: exceptions |= tme_ieee754_global_exceptions;
716: tme_mutex_unlock(&tme_ieee754_global_mutex);
717: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
718:
719: /* signal any exceptions: */
720: if (exceptions != 0) {
721: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
722: }
723: }
724:
725: /* this does a strict compliance double-precision div: */
726: static void
727: _tme_ieee754_strict_double_div(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
728: {
729: union tme_value64 src0_buffer;
730: union tme_value64 src1_buffer;
731: int exceptions;
732:
733: /* enter softfloat operation: */
734: tme_mutex_lock(&tme_ieee754_global_mutex);
735: tme_ieee754_global_ctl = ieee754_ctl;
736: tme_ieee754_global_exceptions = 0;
737: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
738:
739: /* assume that this operation raises no exceptions: */
740: exceptions = 0;
741:
742: /* the operation: */
743: _tme_ieee754_double_value_set(dst, float64,
744: float64_div((*((const float64 *) tme_ieee754_double_value_get(src0, &src0_buffer))),
745: (*((const float64 *) tme_ieee754_double_value_get(src1, &src1_buffer)))));
746:
747: /* leave softfloat operation: */
748: tme_ieee754_global_ctl = NULL;
749: exceptions |= tme_ieee754_global_exceptions;
750: tme_mutex_unlock(&tme_ieee754_global_mutex);
751: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
752:
753: /* signal any exceptions: */
754: if (exceptions != 0) {
755: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
756: }
757: }
758:
759: /* this does a strict compliance double-precision rem: */
760: static void
761: _tme_ieee754_strict_double_rem(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
762: {
763: union tme_value64 src0_buffer;
764: union tme_value64 src1_buffer;
765: int exceptions;
766:
767: /* enter softfloat operation: */
768: tme_mutex_lock(&tme_ieee754_global_mutex);
769: tme_ieee754_global_ctl = ieee754_ctl;
770: tme_ieee754_global_exceptions = 0;
771: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
772:
773: /* assume that this operation raises no exceptions: */
774: exceptions = 0;
775:
776: /* the operation: */
777: _tme_ieee754_double_value_set(dst, float64,
778: float64_rem((*((const float64 *) tme_ieee754_double_value_get(src0, &src0_buffer))),
779: (*((const float64 *) tme_ieee754_double_value_get(src1, &src1_buffer)))));
780:
781: /* leave softfloat operation: */
782: tme_ieee754_global_ctl = NULL;
783: exceptions |= tme_ieee754_global_exceptions;
784: tme_mutex_unlock(&tme_ieee754_global_mutex);
785: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
786:
787: /* signal any exceptions: */
788: if (exceptions != 0) {
789: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
790: }
791: }
792:
793: /* this does a strict compliance double-precision sqrt: */
794: static void
795: _tme_ieee754_strict_double_sqrt(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
796: {
797: union tme_value64 src0_buffer;
798: int exceptions;
799:
800: /* enter softfloat operation: */
801: tme_mutex_lock(&tme_ieee754_global_mutex);
802: tme_ieee754_global_ctl = ieee754_ctl;
803: tme_ieee754_global_exceptions = 0;
804: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
805:
806: /* assume that this operation raises no exceptions: */
807: exceptions = 0;
808:
809: /* the operation: */
810: _tme_ieee754_double_value_set(dst, float64,
811: float64_sqrt((*((const float64 *) tme_ieee754_double_value_get(src0, &src0_buffer)))));
812:
813: /* leave softfloat operation: */
814: tme_ieee754_global_ctl = NULL;
815: exceptions |= tme_ieee754_global_exceptions;
816: tme_mutex_unlock(&tme_ieee754_global_mutex);
817: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
818:
819: /* signal any exceptions: */
820: if (exceptions != 0) {
821: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
822: }
823: }
824:
825: /* this does a strict compliance double-precision neg: */
826: static void
827: _tme_ieee754_strict_double_neg(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
828: {
829: union tme_value64 src0_buffer;
830: int exceptions;
831:
832: /* enter softfloat operation: */
833: tme_mutex_lock(&tme_ieee754_global_mutex);
834: tme_ieee754_global_ctl = ieee754_ctl;
835: tme_ieee754_global_exceptions = 0;
836: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
837:
838: /* assume that this operation raises no exceptions: */
839: exceptions = 0;
840:
841: /* the operation: */
842: _tme_ieee754_double_value_set(dst, float64,
1.1.1.2 root 843: float64_mul(int32_to_float64(-1),
1.1 root 844: (*((const float64 *) tme_ieee754_double_value_get(src0, &src0_buffer)))));
845:
846: /* leave softfloat operation: */
847: tme_ieee754_global_ctl = NULL;
848: exceptions |= tme_ieee754_global_exceptions;
849: tme_mutex_unlock(&tme_ieee754_global_mutex);
850: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
851:
852: /* signal any exceptions: */
853: if (exceptions != 0) {
854: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
855: }
856: }
857:
858: /* this does a strict compliance double-precision move: */
859: static void
860: _tme_ieee754_strict_double_move(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
861: {
862: union tme_value64 src0_buffer;
863: int exceptions;
864:
865: /* enter softfloat operation: */
866: tme_mutex_lock(&tme_ieee754_global_mutex);
867: tme_ieee754_global_ctl = ieee754_ctl;
868: tme_ieee754_global_exceptions = 0;
869: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
870:
871: /* assume that this operation raises no exceptions: */
872: exceptions = 0;
873:
874: /* the operation: */
875: _tme_ieee754_double_value_set(dst, float64,
876: float64_add((*((const float64 *) tme_ieee754_double_value_get(src0, &src0_buffer))),
877: int32_to_float64(0)));
878:
879: /* leave softfloat operation: */
880: tme_ieee754_global_ctl = NULL;
881: exceptions |= tme_ieee754_global_exceptions;
882: tme_mutex_unlock(&tme_ieee754_global_mutex);
883: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
884:
885: /* signal any exceptions: */
886: if (exceptions != 0) {
887: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
888: }
889: }
890:
891: /* this does a strict compliance double-precision rint: */
892: static void
893: _tme_ieee754_strict_double_rint(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
894: {
895: union tme_value64 src0_buffer;
896: int exceptions;
897:
898: /* enter softfloat operation: */
899: tme_mutex_lock(&tme_ieee754_global_mutex);
900: tme_ieee754_global_ctl = ieee754_ctl;
901: tme_ieee754_global_exceptions = 0;
902: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
903:
904: /* assume that this operation raises no exceptions: */
905: exceptions = 0;
906:
907: /* the operation: */
908: _tme_ieee754_double_value_set(dst, float64,
909: float64_round_to_int((*((const float64 *) tme_ieee754_double_value_get(src0, &src0_buffer)))));
910:
911: /* leave softfloat operation: */
912: tme_ieee754_global_ctl = NULL;
913: exceptions |= tme_ieee754_global_exceptions;
914: tme_mutex_unlock(&tme_ieee754_global_mutex);
915: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
916:
917: /* signal any exceptions: */
918: if (exceptions != 0) {
919: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
920: }
921: }
922:
923: /* this does a strict compliance double-precision getexp: */
924: static void
925: _tme_ieee754_strict_double_getexp(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
926: {
927: union tme_value64 src0_buffer;
928: int exceptions;
929:
930: /* check for a NaN operand: */
931: if (__tme_predict_false(tme_ieee754_double_check_nan_monadic(ieee754_ctl, src0, dst))) {
932: return;
933: }
934:
935: /* if the operand is an infinity: */
936: if (tme_ieee754_double_is_inf(src0)) {
937:
938: /* return a NaN: */
939: dst->tme_float_format = TME_FLOAT_FORMAT_IEEE754_DOUBLE;
940: dst->tme_float_value_ieee754_double = ieee754_ctl->tme_ieee754_ctl_default_nan_double;
941: return;
942: }
943:
944: /* assume that this operation raises no exceptions: */
945: exceptions = 0;
946:
947: /* the operation: */
948:
949: /* if the operand is a zero, return a zero: */
950: if (tme_ieee754_double_is_zero(src0)) {
951: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN, 0);
952: }
953:
954: /* otherwise, return the unbiased exponent: */
955: else {
956: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN, TME_FIELD_MASK_EXTRACTU((*tme_ieee754_double_value_get(src0, &src0_buffer)).tme_value64_uint32_hi, ((tme_uint32_t) 0x7ff00000)) - ((((tme_uint32_t) 0x7ff00000) / _TME_FIELD_MASK_FACTOR(((tme_uint32_t) 0x7ff00000))) >> 1));
957: }
958: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
959:
960: /* signal any exceptions: */
961: if (exceptions != 0) {
962: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
963: }
964: }
965:
966: /* this does a strict compliance double-precision getman: */
967: static void
968: _tme_ieee754_strict_double_getman(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
969: {
970: union tme_value64 src0_buffer;
971: int exceptions;
972:
973: /* check for a NaN operand: */
974: if (__tme_predict_false(tme_ieee754_double_check_nan_monadic(ieee754_ctl, src0, dst))) {
975: return;
976: }
977:
978: /* if the operand is an infinity: */
979: if (tme_ieee754_double_is_inf(src0)) {
980:
981: /* return a NaN: */
982: dst->tme_float_format = TME_FLOAT_FORMAT_IEEE754_DOUBLE;
983: dst->tme_float_value_ieee754_double = ieee754_ctl->tme_ieee754_ctl_default_nan_double;
984: return;
985: }
986:
987: /* assume that this operation raises no exceptions: */
988: exceptions = 0;
989:
990: /* the operation: */
991:
992: /* if the operand is a zero, return it: */
993: if (tme_ieee754_double_is_zero(src0)) {
994: *dst = *src0;
995: }
996:
997: /* otherwise, return the operand, with its exponent set to biased zero: */
998: else {
999: tme_ieee754_double_value_set(dst, (*tme_ieee754_double_value_get(src0, &src0_buffer)));
1000: TME_FIELD_MASK_DEPOSITU(dst->tme_float_value_ieee754_double.tme_value64_uint32_hi, ((tme_uint32_t) 0x7ff00000), ((((tme_uint32_t) 0x7ff00000) / _TME_FIELD_MASK_FACTOR(((tme_uint32_t) 0x7ff00000))) >> 1));
1001: }
1002: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1003:
1004: /* signal any exceptions: */
1005: if (exceptions != 0) {
1006: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1007: }
1008: }
1009:
1010: /* this does a strict compliance double-precision from-single: */
1011: static void
1012: _tme_ieee754_strict_double_from_single(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
1013: {
1014: tme_uint32_t src0_buffer;
1015: int exceptions;
1016:
1017: /* enter softfloat operation: */
1018: tme_mutex_lock(&tme_ieee754_global_mutex);
1019: tme_ieee754_global_ctl = ieee754_ctl;
1020: tme_ieee754_global_exceptions = 0;
1021: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1022:
1023: /* assume that this operation raises no exceptions: */
1024: exceptions = 0;
1025:
1026: /* the operation: */
1027: _tme_ieee754_double_value_set(dst, float64,
1028: float32_to_float64((*((const float32 *) tme_ieee754_single_value_get(src0, &src0_buffer)))));
1029:
1030: /* leave softfloat operation: */
1031: tme_ieee754_global_ctl = NULL;
1032: exceptions |= tme_ieee754_global_exceptions;
1033: tme_mutex_unlock(&tme_ieee754_global_mutex);
1034: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1035:
1036: /* signal any exceptions: */
1037: if (exceptions != 0) {
1038: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1039: }
1040: }
1041:
1042: /* this does a strict compliance double-precision from-extended80: */
1043: static void
1044: _tme_ieee754_strict_double_from_extended80(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
1045: {
1046: struct tme_float_ieee754_extended80 src0_buffer;
1047: int exceptions;
1048:
1049: /* enter softfloat operation: */
1050: tme_mutex_lock(&tme_ieee754_global_mutex);
1051: tme_ieee754_global_ctl = ieee754_ctl;
1052: tme_ieee754_global_exceptions = 0;
1053: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1054:
1055: /* assume that this operation raises no exceptions: */
1056: exceptions = 0;
1057:
1058: /* the operation: */
1059: _tme_ieee754_double_value_set(dst, float64,
1060: floatx80_to_float64((*((const floatx80 *) tme_ieee754_extended80_value_get(src0, &src0_buffer)))));
1061:
1062: /* leave softfloat operation: */
1063: tme_ieee754_global_ctl = NULL;
1064: exceptions |= tme_ieee754_global_exceptions;
1065: tme_mutex_unlock(&tme_ieee754_global_mutex);
1066: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1067:
1068: /* signal any exceptions: */
1069: if (exceptions != 0) {
1070: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1071: }
1072: }
1073:
1074: /* this does a strict compliance double-precision from-quad: */
1075: static void
1076: _tme_ieee754_strict_double_from_quad(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
1077: {
1078: struct tme_float_ieee754_quad src0_buffer;
1079: int exceptions;
1080:
1081: /* enter softfloat operation: */
1082: tme_mutex_lock(&tme_ieee754_global_mutex);
1083: tme_ieee754_global_ctl = ieee754_ctl;
1084: tme_ieee754_global_exceptions = 0;
1085: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1086:
1087: /* assume that this operation raises no exceptions: */
1088: exceptions = 0;
1089:
1090: /* the operation: */
1091: _tme_ieee754_double_value_set(dst, float64,
1092: float128_to_float64((*((const float128 *) tme_ieee754_quad_value_get(src0, &src0_buffer)))));
1093:
1094: /* leave softfloat operation: */
1095: tme_ieee754_global_ctl = NULL;
1096: exceptions |= tme_ieee754_global_exceptions;
1097: tme_mutex_unlock(&tme_ieee754_global_mutex);
1098: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1099:
1100: /* signal any exceptions: */
1101: if (exceptions != 0) {
1102: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1103: }
1104: }
1105:
1.1.1.2 root 1106: /* this does a strict compliance double-precision from-int32: */
1107: static void
1108: _tme_ieee754_strict_double_from_int32(struct tme_ieee754_ctl *ieee754_ctl, const tme_int32_t src0, struct tme_float *dst)
1109: {
1110: int exceptions;
1111:
1112: /* enter softfloat operation: */
1113: tme_mutex_lock(&tme_ieee754_global_mutex);
1114: tme_ieee754_global_ctl = ieee754_ctl;
1115: tme_ieee754_global_exceptions = 0;
1116: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1117:
1118: /* assume that this operation raises no exceptions: */
1119: exceptions = 0;
1120:
1121: /* the operation: */
1122: _tme_ieee754_double_value_set(dst, float64,
1123: int32_to_float64(src0));
1124:
1125: /* leave softfloat operation: */
1126: tme_ieee754_global_ctl = NULL;
1127: exceptions |= tme_ieee754_global_exceptions;
1128: tme_mutex_unlock(&tme_ieee754_global_mutex);
1129: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1130:
1131: /* signal any exceptions: */
1132: if (exceptions != 0) {
1133: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1134: }
1135: }
1136:
1137: #if defined(TME_HAVE_INT64_T)
1138:
1139: /* this does a strict compliance double-precision from-int64: */
1140: static void
1141: _tme_ieee754_strict_double_from_int64(struct tme_ieee754_ctl *ieee754_ctl, const tme_int64_t src0, struct tme_float *dst)
1142: {
1143: int exceptions;
1144:
1145: /* enter softfloat operation: */
1146: tme_mutex_lock(&tme_ieee754_global_mutex);
1147: tme_ieee754_global_ctl = ieee754_ctl;
1148: tme_ieee754_global_exceptions = 0;
1149: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1150:
1151: /* assume that this operation raises no exceptions: */
1152: exceptions = 0;
1153:
1154: /* the operation: */
1155: _tme_ieee754_double_value_set(dst, float64,
1156: int64_to_float64(src0));
1157:
1158: /* leave softfloat operation: */
1159: tme_ieee754_global_ctl = NULL;
1160: exceptions |= tme_ieee754_global_exceptions;
1161: tme_mutex_unlock(&tme_ieee754_global_mutex);
1162: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1163:
1164: /* signal any exceptions: */
1165: if (exceptions != 0) {
1166: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1167: }
1168: }
1169:
1170: #endif /* defined(TME_HAVE_INT64_T) */
1171:
1.1 root 1172: /* this does a strict compliance double-precision to-int32: */
1173: static void
1174: _tme_ieee754_strict_double_to_int32(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, tme_int32_t *dst)
1175: {
1176: union tme_value64 src0_buffer;
1177: int exceptions;
1178:
1179: /* enter softfloat operation: */
1180: tme_mutex_lock(&tme_ieee754_global_mutex);
1181: tme_ieee754_global_ctl = ieee754_ctl;
1182: tme_ieee754_global_exceptions = 0;
1183: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1184:
1185: /* assume that this operation raises no exceptions: */
1186: exceptions = 0;
1187:
1188: /* the operation: */
1189: *dst = float64_to_int32((*((const float64 *) tme_ieee754_double_value_get(src0, &src0_buffer))));
1190:
1191: /* leave softfloat operation: */
1192: tme_ieee754_global_ctl = NULL;
1193: exceptions |= tme_ieee754_global_exceptions;
1194: tme_mutex_unlock(&tme_ieee754_global_mutex);
1195: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1196:
1197: /* signal any exceptions: */
1198: if (exceptions != 0) {
1199: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1200: }
1201: }
1202:
1203: #if defined(TME_HAVE_INT64_T)
1204:
1.1.1.3 ! root 1205: /* this does a strict compliance double-precision to-int64: */
! 1206: static void
! 1207: _tme_ieee754_strict_double_to_int64(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, tme_int64_t *dst)
! 1208: {
! 1209: union tme_value64 src0_buffer;
! 1210: int exceptions;
! 1211:
! 1212: /* enter softfloat operation: */
! 1213: tme_mutex_lock(&tme_ieee754_global_mutex);
! 1214: tme_ieee754_global_ctl = ieee754_ctl;
! 1215: tme_ieee754_global_exceptions = 0;
! 1216: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
! 1217:
! 1218: /* assume that this operation raises no exceptions: */
! 1219: exceptions = 0;
! 1220:
! 1221: /* the operation: */
! 1222: *dst = float64_to_int64((*((const float64 *) tme_ieee754_double_value_get(src0, &src0_buffer))));
! 1223:
! 1224: /* leave softfloat operation: */
! 1225: tme_ieee754_global_ctl = NULL;
! 1226: exceptions |= tme_ieee754_global_exceptions;
! 1227: tme_mutex_unlock(&tme_ieee754_global_mutex);
! 1228: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
! 1229:
! 1230: /* signal any exceptions: */
! 1231: if (exceptions != 0) {
! 1232: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
! 1233: }
! 1234: }
! 1235:
! 1236: #endif /* defined(TME_HAVE_INT64_T) */
! 1237:
! 1238: #if defined(TME_HAVE_INT64_T)
! 1239:
1.1 root 1240: /* this does a strict compliance extended80-precision add: */
1241: static void
1242: _tme_ieee754_strict_extended80_add(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
1243: {
1244: struct tme_float_ieee754_extended80 src0_buffer;
1245: struct tme_float_ieee754_extended80 src1_buffer;
1246: int exceptions;
1247:
1248: /* enter softfloat operation: */
1249: tme_mutex_lock(&tme_ieee754_global_mutex);
1250: tme_ieee754_global_ctl = ieee754_ctl;
1251: tme_ieee754_global_exceptions = 0;
1252: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1253:
1254: /* assume that this operation raises no exceptions: */
1255: exceptions = 0;
1256:
1257: /* the operation: */
1258: _tme_ieee754_extended80_value_set(dst, floatx80,
1259: floatx80_add((*((const floatx80 *) tme_ieee754_extended80_value_get(src0, &src0_buffer))),
1260: (*((const floatx80 *) tme_ieee754_extended80_value_get(src1, &src1_buffer)))));
1261:
1262: /* leave softfloat operation: */
1263: tme_ieee754_global_ctl = NULL;
1264: exceptions |= tme_ieee754_global_exceptions;
1265: tme_mutex_unlock(&tme_ieee754_global_mutex);
1266: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1267:
1268: /* signal any exceptions: */
1269: if (exceptions != 0) {
1270: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1271: }
1272: }
1273:
1274: #endif /* defined(TME_HAVE_INT64_T) */
1275:
1276: #if defined(TME_HAVE_INT64_T)
1277:
1278: /* this does a strict compliance extended80-precision sub: */
1279: static void
1280: _tme_ieee754_strict_extended80_sub(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
1281: {
1282: struct tme_float_ieee754_extended80 src0_buffer;
1283: struct tme_float_ieee754_extended80 src1_buffer;
1284: int exceptions;
1285:
1286: /* enter softfloat operation: */
1287: tme_mutex_lock(&tme_ieee754_global_mutex);
1288: tme_ieee754_global_ctl = ieee754_ctl;
1289: tme_ieee754_global_exceptions = 0;
1290: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1291:
1292: /* assume that this operation raises no exceptions: */
1293: exceptions = 0;
1294:
1295: /* the operation: */
1296: _tme_ieee754_extended80_value_set(dst, floatx80,
1297: floatx80_sub((*((const floatx80 *) tme_ieee754_extended80_value_get(src0, &src0_buffer))),
1298: (*((const floatx80 *) tme_ieee754_extended80_value_get(src1, &src1_buffer)))));
1299:
1300: /* leave softfloat operation: */
1301: tme_ieee754_global_ctl = NULL;
1302: exceptions |= tme_ieee754_global_exceptions;
1303: tme_mutex_unlock(&tme_ieee754_global_mutex);
1304: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1305:
1306: /* signal any exceptions: */
1307: if (exceptions != 0) {
1308: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1309: }
1310: }
1311:
1312: #endif /* defined(TME_HAVE_INT64_T) */
1313:
1314: #if defined(TME_HAVE_INT64_T)
1315:
1316: /* this does a strict compliance extended80-precision mul: */
1317: static void
1318: _tme_ieee754_strict_extended80_mul(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
1319: {
1320: struct tme_float_ieee754_extended80 src0_buffer;
1321: struct tme_float_ieee754_extended80 src1_buffer;
1322: int exceptions;
1323:
1324: /* enter softfloat operation: */
1325: tme_mutex_lock(&tme_ieee754_global_mutex);
1326: tme_ieee754_global_ctl = ieee754_ctl;
1327: tme_ieee754_global_exceptions = 0;
1328: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1329:
1330: /* assume that this operation raises no exceptions: */
1331: exceptions = 0;
1332:
1333: /* the operation: */
1334: _tme_ieee754_extended80_value_set(dst, floatx80,
1335: floatx80_mul((*((const floatx80 *) tme_ieee754_extended80_value_get(src0, &src0_buffer))),
1336: (*((const floatx80 *) tme_ieee754_extended80_value_get(src1, &src1_buffer)))));
1337:
1338: /* leave softfloat operation: */
1339: tme_ieee754_global_ctl = NULL;
1340: exceptions |= tme_ieee754_global_exceptions;
1341: tme_mutex_unlock(&tme_ieee754_global_mutex);
1342: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1343:
1344: /* signal any exceptions: */
1345: if (exceptions != 0) {
1346: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1347: }
1348: }
1349:
1350: #endif /* defined(TME_HAVE_INT64_T) */
1351:
1352: #if defined(TME_HAVE_INT64_T)
1353:
1354: /* this does a strict compliance extended80-precision div: */
1355: static void
1356: _tme_ieee754_strict_extended80_div(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
1357: {
1358: struct tme_float_ieee754_extended80 src0_buffer;
1359: struct tme_float_ieee754_extended80 src1_buffer;
1360: int exceptions;
1361:
1362: /* enter softfloat operation: */
1363: tme_mutex_lock(&tme_ieee754_global_mutex);
1364: tme_ieee754_global_ctl = ieee754_ctl;
1365: tme_ieee754_global_exceptions = 0;
1366: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1367:
1368: /* assume that this operation raises no exceptions: */
1369: exceptions = 0;
1370:
1371: /* the operation: */
1372: _tme_ieee754_extended80_value_set(dst, floatx80,
1373: floatx80_div((*((const floatx80 *) tme_ieee754_extended80_value_get(src0, &src0_buffer))),
1374: (*((const floatx80 *) tme_ieee754_extended80_value_get(src1, &src1_buffer)))));
1375:
1376: /* leave softfloat operation: */
1377: tme_ieee754_global_ctl = NULL;
1378: exceptions |= tme_ieee754_global_exceptions;
1379: tme_mutex_unlock(&tme_ieee754_global_mutex);
1380: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1381:
1382: /* signal any exceptions: */
1383: if (exceptions != 0) {
1384: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1385: }
1386: }
1387:
1388: #endif /* defined(TME_HAVE_INT64_T) */
1389:
1390: #if defined(TME_HAVE_INT64_T)
1391:
1392: /* this does a strict compliance extended80-precision rem: */
1393: static void
1394: _tme_ieee754_strict_extended80_rem(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
1395: {
1396: struct tme_float_ieee754_extended80 src0_buffer;
1397: struct tme_float_ieee754_extended80 src1_buffer;
1398: int exceptions;
1399:
1400: /* enter softfloat operation: */
1401: tme_mutex_lock(&tme_ieee754_global_mutex);
1402: tme_ieee754_global_ctl = ieee754_ctl;
1403: tme_ieee754_global_exceptions = 0;
1404: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1405:
1406: /* assume that this operation raises no exceptions: */
1407: exceptions = 0;
1408:
1409: /* the operation: */
1410: _tme_ieee754_extended80_value_set(dst, floatx80,
1411: floatx80_rem((*((const floatx80 *) tme_ieee754_extended80_value_get(src0, &src0_buffer))),
1412: (*((const floatx80 *) tme_ieee754_extended80_value_get(src1, &src1_buffer)))));
1413:
1414: /* leave softfloat operation: */
1415: tme_ieee754_global_ctl = NULL;
1416: exceptions |= tme_ieee754_global_exceptions;
1417: tme_mutex_unlock(&tme_ieee754_global_mutex);
1418: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1419:
1420: /* signal any exceptions: */
1421: if (exceptions != 0) {
1422: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1423: }
1424: }
1425:
1426: #endif /* defined(TME_HAVE_INT64_T) */
1427:
1428: #if defined(TME_HAVE_INT64_T)
1429:
1430: /* this does a strict compliance extended80-precision sqrt: */
1431: static void
1432: _tme_ieee754_strict_extended80_sqrt(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
1433: {
1434: struct tme_float_ieee754_extended80 src0_buffer;
1435: int exceptions;
1436:
1437: /* enter softfloat operation: */
1438: tme_mutex_lock(&tme_ieee754_global_mutex);
1439: tme_ieee754_global_ctl = ieee754_ctl;
1440: tme_ieee754_global_exceptions = 0;
1441: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1442:
1443: /* assume that this operation raises no exceptions: */
1444: exceptions = 0;
1445:
1446: /* the operation: */
1447: _tme_ieee754_extended80_value_set(dst, floatx80,
1448: floatx80_sqrt((*((const floatx80 *) tme_ieee754_extended80_value_get(src0, &src0_buffer)))));
1449:
1450: /* leave softfloat operation: */
1451: tme_ieee754_global_ctl = NULL;
1452: exceptions |= tme_ieee754_global_exceptions;
1453: tme_mutex_unlock(&tme_ieee754_global_mutex);
1454: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1455:
1456: /* signal any exceptions: */
1457: if (exceptions != 0) {
1458: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1459: }
1460: }
1461:
1462: #endif /* defined(TME_HAVE_INT64_T) */
1463:
1464: #if defined(TME_HAVE_INT64_T)
1465:
1466: /* this does a strict compliance extended80-precision neg: */
1467: static void
1468: _tme_ieee754_strict_extended80_neg(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
1469: {
1470: struct tme_float_ieee754_extended80 src0_buffer;
1471: int exceptions;
1472:
1473: /* enter softfloat operation: */
1474: tme_mutex_lock(&tme_ieee754_global_mutex);
1475: tme_ieee754_global_ctl = ieee754_ctl;
1476: tme_ieee754_global_exceptions = 0;
1477: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1478:
1479: /* assume that this operation raises no exceptions: */
1480: exceptions = 0;
1481:
1482: /* the operation: */
1483: _tme_ieee754_extended80_value_set(dst, floatx80,
1.1.1.2 root 1484: floatx80_mul(int32_to_floatx80(-1),
1.1 root 1485: (*((const floatx80 *) tme_ieee754_extended80_value_get(src0, &src0_buffer)))));
1486:
1487: /* leave softfloat operation: */
1488: tme_ieee754_global_ctl = NULL;
1489: exceptions |= tme_ieee754_global_exceptions;
1490: tme_mutex_unlock(&tme_ieee754_global_mutex);
1491: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1492:
1493: /* signal any exceptions: */
1494: if (exceptions != 0) {
1495: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1496: }
1497: }
1498:
1499: #endif /* defined(TME_HAVE_INT64_T) */
1500:
1501: #if defined(TME_HAVE_INT64_T)
1502:
1503: /* this does a strict compliance extended80-precision move: */
1504: static void
1505: _tme_ieee754_strict_extended80_move(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
1506: {
1507: struct tme_float_ieee754_extended80 src0_buffer;
1508: int exceptions;
1509:
1510: /* enter softfloat operation: */
1511: tme_mutex_lock(&tme_ieee754_global_mutex);
1512: tme_ieee754_global_ctl = ieee754_ctl;
1513: tme_ieee754_global_exceptions = 0;
1514: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1515:
1516: /* assume that this operation raises no exceptions: */
1517: exceptions = 0;
1518:
1519: /* the operation: */
1520: _tme_ieee754_extended80_value_set(dst, floatx80,
1521: floatx80_add((*((const floatx80 *) tme_ieee754_extended80_value_get(src0, &src0_buffer))),
1522: int32_to_floatx80(0)));
1523:
1524: /* leave softfloat operation: */
1525: tme_ieee754_global_ctl = NULL;
1526: exceptions |= tme_ieee754_global_exceptions;
1527: tme_mutex_unlock(&tme_ieee754_global_mutex);
1528: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1529:
1530: /* signal any exceptions: */
1531: if (exceptions != 0) {
1532: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1533: }
1534: }
1535:
1536: #endif /* defined(TME_HAVE_INT64_T) */
1537:
1538: #if defined(TME_HAVE_INT64_T)
1539:
1540: /* this does a strict compliance extended80-precision rint: */
1541: static void
1542: _tme_ieee754_strict_extended80_rint(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
1543: {
1544: struct tme_float_ieee754_extended80 src0_buffer;
1545: int exceptions;
1546:
1547: /* enter softfloat operation: */
1548: tme_mutex_lock(&tme_ieee754_global_mutex);
1549: tme_ieee754_global_ctl = ieee754_ctl;
1550: tme_ieee754_global_exceptions = 0;
1551: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1552:
1553: /* assume that this operation raises no exceptions: */
1554: exceptions = 0;
1555:
1556: /* the operation: */
1557: _tme_ieee754_extended80_value_set(dst, floatx80,
1558: floatx80_round_to_int((*((const floatx80 *) tme_ieee754_extended80_value_get(src0, &src0_buffer)))));
1559:
1560: /* leave softfloat operation: */
1561: tme_ieee754_global_ctl = NULL;
1562: exceptions |= tme_ieee754_global_exceptions;
1563: tme_mutex_unlock(&tme_ieee754_global_mutex);
1564: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1565:
1566: /* signal any exceptions: */
1567: if (exceptions != 0) {
1568: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1569: }
1570: }
1571:
1572: #endif /* defined(TME_HAVE_INT64_T) */
1573:
1574: /* this does a strict compliance extended80-precision getexp: */
1575: static void
1576: _tme_ieee754_strict_extended80_getexp(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
1577: {
1578: struct tme_float_ieee754_extended80 src0_buffer;
1579: int exceptions;
1580:
1581: /* check for a NaN operand: */
1582: if (__tme_predict_false(tme_ieee754_extended80_check_nan_monadic(ieee754_ctl, src0, dst))) {
1583: return;
1584: }
1585:
1586: /* if the operand is an infinity: */
1587: if (tme_ieee754_extended80_is_inf(src0)) {
1588:
1589: /* return a NaN: */
1590: dst->tme_float_format = TME_FLOAT_FORMAT_IEEE754_EXTENDED80;
1591: dst->tme_float_value_ieee754_extended80 = ieee754_ctl->tme_ieee754_ctl_default_nan_extended80;
1592: return;
1593: }
1594:
1595: /* assume that this operation raises no exceptions: */
1596: exceptions = 0;
1597:
1598: /* the operation: */
1599:
1600: /* if the operand is a zero, return a zero: */
1601: if (tme_ieee754_extended80_is_zero(src0)) {
1602: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN, 0);
1603: }
1604:
1605: /* otherwise, return the unbiased exponent: */
1606: else {
1607: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN, TME_FIELD_MASK_EXTRACTU((*tme_ieee754_extended80_value_get(src0, &src0_buffer)).tme_float_ieee754_extended80_sexp, ((tme_uint32_t) 0x7fff)) - ((((tme_uint32_t) 0x7fff) / _TME_FIELD_MASK_FACTOR(((tme_uint32_t) 0x7fff))) >> 1));
1608: }
1609: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1610:
1611: /* signal any exceptions: */
1612: if (exceptions != 0) {
1613: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1614: }
1615: }
1616:
1617: /* this does a strict compliance extended80-precision getman: */
1618: static void
1619: _tme_ieee754_strict_extended80_getman(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
1620: {
1621: struct tme_float_ieee754_extended80 src0_buffer;
1622: int exceptions;
1623:
1624: /* check for a NaN operand: */
1625: if (__tme_predict_false(tme_ieee754_extended80_check_nan_monadic(ieee754_ctl, src0, dst))) {
1626: return;
1627: }
1628:
1629: /* if the operand is an infinity: */
1630: if (tme_ieee754_extended80_is_inf(src0)) {
1631:
1632: /* return a NaN: */
1633: dst->tme_float_format = TME_FLOAT_FORMAT_IEEE754_EXTENDED80;
1634: dst->tme_float_value_ieee754_extended80 = ieee754_ctl->tme_ieee754_ctl_default_nan_extended80;
1635: return;
1636: }
1637:
1638: /* assume that this operation raises no exceptions: */
1639: exceptions = 0;
1640:
1641: /* the operation: */
1642:
1643: /* if the operand is a zero, return it: */
1644: if (tme_ieee754_extended80_is_zero(src0)) {
1645: *dst = *src0;
1646: }
1647:
1648: /* otherwise, return the operand, with its exponent set to biased zero: */
1649: else {
1650: tme_ieee754_extended80_value_set(dst, (*tme_ieee754_extended80_value_get(src0, &src0_buffer)));
1651: TME_FIELD_MASK_DEPOSITU(dst->tme_float_value_ieee754_extended80.tme_float_ieee754_extended80_sexp, ((tme_uint32_t) 0x7fff), ((((tme_uint32_t) 0x7fff) / _TME_FIELD_MASK_FACTOR(((tme_uint32_t) 0x7fff))) >> 1));
1652: }
1653: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1654:
1655: /* signal any exceptions: */
1656: if (exceptions != 0) {
1657: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1658: }
1659: }
1660:
1661: #if defined(TME_HAVE_INT64_T)
1662:
1663: /* this does a strict compliance extended80-precision from-single: */
1664: static void
1665: _tme_ieee754_strict_extended80_from_single(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
1666: {
1667: tme_uint32_t src0_buffer;
1668: int exceptions;
1669:
1670: /* enter softfloat operation: */
1671: tme_mutex_lock(&tme_ieee754_global_mutex);
1672: tme_ieee754_global_ctl = ieee754_ctl;
1673: tme_ieee754_global_exceptions = 0;
1674: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1675:
1676: /* assume that this operation raises no exceptions: */
1677: exceptions = 0;
1678:
1679: /* the operation: */
1680: _tme_ieee754_extended80_value_set(dst, floatx80,
1681: float32_to_floatx80((*((const float32 *) tme_ieee754_single_value_get(src0, &src0_buffer)))));
1682:
1683: /* leave softfloat operation: */
1684: tme_ieee754_global_ctl = NULL;
1685: exceptions |= tme_ieee754_global_exceptions;
1686: tme_mutex_unlock(&tme_ieee754_global_mutex);
1687: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1688:
1689: /* signal any exceptions: */
1690: if (exceptions != 0) {
1691: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1692: }
1693: }
1694:
1695: #endif /* defined(TME_HAVE_INT64_T) */
1696:
1697: #if defined(TME_HAVE_INT64_T)
1698:
1699: /* this does a strict compliance extended80-precision from-double: */
1700: static void
1701: _tme_ieee754_strict_extended80_from_double(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
1702: {
1703: union tme_value64 src0_buffer;
1704: int exceptions;
1705:
1706: /* enter softfloat operation: */
1707: tme_mutex_lock(&tme_ieee754_global_mutex);
1708: tme_ieee754_global_ctl = ieee754_ctl;
1709: tme_ieee754_global_exceptions = 0;
1710: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1711:
1712: /* assume that this operation raises no exceptions: */
1713: exceptions = 0;
1714:
1715: /* the operation: */
1716: _tme_ieee754_extended80_value_set(dst, floatx80,
1717: float64_to_floatx80((*((const float64 *) tme_ieee754_double_value_get(src0, &src0_buffer)))));
1718:
1719: /* leave softfloat operation: */
1720: tme_ieee754_global_ctl = NULL;
1721: exceptions |= tme_ieee754_global_exceptions;
1722: tme_mutex_unlock(&tme_ieee754_global_mutex);
1723: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1724:
1725: /* signal any exceptions: */
1726: if (exceptions != 0) {
1727: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1728: }
1729: }
1730:
1731: #endif /* defined(TME_HAVE_INT64_T) */
1732:
1733: #if defined(TME_HAVE_INT64_T)
1734:
1735: /* this does a strict compliance extended80-precision from-quad: */
1736: static void
1737: _tme_ieee754_strict_extended80_from_quad(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
1738: {
1739: struct tme_float_ieee754_quad src0_buffer;
1740: int exceptions;
1741:
1742: /* enter softfloat operation: */
1743: tme_mutex_lock(&tme_ieee754_global_mutex);
1744: tme_ieee754_global_ctl = ieee754_ctl;
1745: tme_ieee754_global_exceptions = 0;
1746: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1747:
1748: /* assume that this operation raises no exceptions: */
1749: exceptions = 0;
1750:
1751: /* the operation: */
1752: _tme_ieee754_extended80_value_set(dst, floatx80,
1753: float128_to_floatx80((*((const float128 *) tme_ieee754_quad_value_get(src0, &src0_buffer)))));
1754:
1755: /* leave softfloat operation: */
1756: tme_ieee754_global_ctl = NULL;
1757: exceptions |= tme_ieee754_global_exceptions;
1758: tme_mutex_unlock(&tme_ieee754_global_mutex);
1759: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1760:
1761: /* signal any exceptions: */
1762: if (exceptions != 0) {
1763: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1764: }
1765: }
1766:
1767: #endif /* defined(TME_HAVE_INT64_T) */
1768:
1.1.1.2 root 1769: #if defined(TME_HAVE_INT64_T)
1770:
1771: /* this does a strict compliance extended80-precision from-int32: */
1772: static void
1773: _tme_ieee754_strict_extended80_from_int32(struct tme_ieee754_ctl *ieee754_ctl, const tme_int32_t src0, struct tme_float *dst)
1774: {
1775: int exceptions;
1776:
1777: /* enter softfloat operation: */
1778: tme_mutex_lock(&tme_ieee754_global_mutex);
1779: tme_ieee754_global_ctl = ieee754_ctl;
1780: tme_ieee754_global_exceptions = 0;
1781: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1782:
1783: /* assume that this operation raises no exceptions: */
1784: exceptions = 0;
1785:
1786: /* the operation: */
1787: _tme_ieee754_extended80_value_set(dst, floatx80,
1788: int32_to_floatx80(src0));
1789:
1790: /* leave softfloat operation: */
1791: tme_ieee754_global_ctl = NULL;
1792: exceptions |= tme_ieee754_global_exceptions;
1793: tme_mutex_unlock(&tme_ieee754_global_mutex);
1794: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1795:
1796: /* signal any exceptions: */
1797: if (exceptions != 0) {
1798: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1799: }
1800: }
1801:
1802: #endif /* defined(TME_HAVE_INT64_T) */
1803:
1804: #if defined(TME_HAVE_INT64_T)
1805:
1806: /* this does a strict compliance extended80-precision from-int64: */
1807: static void
1808: _tme_ieee754_strict_extended80_from_int64(struct tme_ieee754_ctl *ieee754_ctl, const tme_int64_t src0, struct tme_float *dst)
1809: {
1810: int exceptions;
1811:
1812: /* enter softfloat operation: */
1813: tme_mutex_lock(&tme_ieee754_global_mutex);
1814: tme_ieee754_global_ctl = ieee754_ctl;
1815: tme_ieee754_global_exceptions = 0;
1816: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1817:
1818: /* assume that this operation raises no exceptions: */
1819: exceptions = 0;
1820:
1821: /* the operation: */
1822: _tme_ieee754_extended80_value_set(dst, floatx80,
1823: int64_to_floatx80(src0));
1824:
1825: /* leave softfloat operation: */
1826: tme_ieee754_global_ctl = NULL;
1827: exceptions |= tme_ieee754_global_exceptions;
1828: tme_mutex_unlock(&tme_ieee754_global_mutex);
1829: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1830:
1831: /* signal any exceptions: */
1832: if (exceptions != 0) {
1833: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1834: }
1835: }
1836:
1837: #endif /* defined(TME_HAVE_INT64_T) */
1838:
1.1 root 1839: /* this does a strict compliance extended80-precision to-int32: */
1840: static void
1841: _tme_ieee754_strict_extended80_to_int32(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, tme_int32_t *dst)
1842: {
1843: struct tme_float_ieee754_extended80 src0_buffer;
1844: int exceptions;
1845:
1846: /* enter softfloat operation: */
1847: tme_mutex_lock(&tme_ieee754_global_mutex);
1848: tme_ieee754_global_ctl = ieee754_ctl;
1849: tme_ieee754_global_exceptions = 0;
1850: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1851:
1852: /* assume that this operation raises no exceptions: */
1853: exceptions = 0;
1854:
1855: /* the operation: */
1856: *dst = floatx80_to_int32((*((const floatx80 *) tme_ieee754_extended80_value_get(src0, &src0_buffer))));
1857:
1858: /* leave softfloat operation: */
1859: tme_ieee754_global_ctl = NULL;
1860: exceptions |= tme_ieee754_global_exceptions;
1861: tme_mutex_unlock(&tme_ieee754_global_mutex);
1862: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1863:
1864: /* signal any exceptions: */
1865: if (exceptions != 0) {
1866: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1867: }
1868: }
1869:
1870: #if defined(TME_HAVE_INT64_T)
1871:
1.1.1.3 ! root 1872: /* this does a strict compliance extended80-precision to-int64: */
! 1873: static void
! 1874: _tme_ieee754_strict_extended80_to_int64(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, tme_int64_t *dst)
! 1875: {
! 1876: struct tme_float_ieee754_extended80 src0_buffer;
! 1877: int exceptions;
! 1878:
! 1879: /* enter softfloat operation: */
! 1880: tme_mutex_lock(&tme_ieee754_global_mutex);
! 1881: tme_ieee754_global_ctl = ieee754_ctl;
! 1882: tme_ieee754_global_exceptions = 0;
! 1883: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
! 1884:
! 1885: /* assume that this operation raises no exceptions: */
! 1886: exceptions = 0;
! 1887:
! 1888: /* the operation: */
! 1889: *dst = floatx80_to_int64((*((const floatx80 *) tme_ieee754_extended80_value_get(src0, &src0_buffer))));
! 1890:
! 1891: /* leave softfloat operation: */
! 1892: tme_ieee754_global_ctl = NULL;
! 1893: exceptions |= tme_ieee754_global_exceptions;
! 1894: tme_mutex_unlock(&tme_ieee754_global_mutex);
! 1895: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
! 1896:
! 1897: /* signal any exceptions: */
! 1898: if (exceptions != 0) {
! 1899: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
! 1900: }
! 1901: }
! 1902:
! 1903: #endif /* defined(TME_HAVE_INT64_T) */
! 1904:
! 1905: #if defined(TME_HAVE_INT64_T)
! 1906:
1.1 root 1907: /* this does a strict compliance quad-precision add: */
1908: static void
1909: _tme_ieee754_strict_quad_add(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
1910: {
1911: struct tme_float_ieee754_quad src0_buffer;
1912: struct tme_float_ieee754_quad src1_buffer;
1913: int exceptions;
1914:
1915: /* enter softfloat operation: */
1916: tme_mutex_lock(&tme_ieee754_global_mutex);
1917: tme_ieee754_global_ctl = ieee754_ctl;
1918: tme_ieee754_global_exceptions = 0;
1919: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1920:
1921: /* assume that this operation raises no exceptions: */
1922: exceptions = 0;
1923:
1924: /* the operation: */
1925: _tme_ieee754_quad_value_set(dst, float128,
1926: float128_add((*((const float128 *) tme_ieee754_quad_value_get(src0, &src0_buffer))),
1927: (*((const float128 *) tme_ieee754_quad_value_get(src1, &src1_buffer)))));
1928:
1929: /* leave softfloat operation: */
1930: tme_ieee754_global_ctl = NULL;
1931: exceptions |= tme_ieee754_global_exceptions;
1932: tme_mutex_unlock(&tme_ieee754_global_mutex);
1933: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1934:
1935: /* signal any exceptions: */
1936: if (exceptions != 0) {
1937: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1938: }
1939: }
1940:
1941: #endif /* defined(TME_HAVE_INT64_T) */
1942:
1943: #if defined(TME_HAVE_INT64_T)
1944:
1945: /* this does a strict compliance quad-precision sub: */
1946: static void
1947: _tme_ieee754_strict_quad_sub(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
1948: {
1949: struct tme_float_ieee754_quad src0_buffer;
1950: struct tme_float_ieee754_quad src1_buffer;
1951: int exceptions;
1952:
1953: /* enter softfloat operation: */
1954: tme_mutex_lock(&tme_ieee754_global_mutex);
1955: tme_ieee754_global_ctl = ieee754_ctl;
1956: tme_ieee754_global_exceptions = 0;
1957: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1958:
1959: /* assume that this operation raises no exceptions: */
1960: exceptions = 0;
1961:
1962: /* the operation: */
1963: _tme_ieee754_quad_value_set(dst, float128,
1964: float128_sub((*((const float128 *) tme_ieee754_quad_value_get(src0, &src0_buffer))),
1965: (*((const float128 *) tme_ieee754_quad_value_get(src1, &src1_buffer)))));
1966:
1967: /* leave softfloat operation: */
1968: tme_ieee754_global_ctl = NULL;
1969: exceptions |= tme_ieee754_global_exceptions;
1970: tme_mutex_unlock(&tme_ieee754_global_mutex);
1971: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
1972:
1973: /* signal any exceptions: */
1974: if (exceptions != 0) {
1975: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
1976: }
1977: }
1978:
1979: #endif /* defined(TME_HAVE_INT64_T) */
1980:
1981: #if defined(TME_HAVE_INT64_T)
1982:
1983: /* this does a strict compliance quad-precision mul: */
1984: static void
1985: _tme_ieee754_strict_quad_mul(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
1986: {
1987: struct tme_float_ieee754_quad src0_buffer;
1988: struct tme_float_ieee754_quad src1_buffer;
1989: int exceptions;
1990:
1991: /* enter softfloat operation: */
1992: tme_mutex_lock(&tme_ieee754_global_mutex);
1993: tme_ieee754_global_ctl = ieee754_ctl;
1994: tme_ieee754_global_exceptions = 0;
1995: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
1996:
1997: /* assume that this operation raises no exceptions: */
1998: exceptions = 0;
1999:
2000: /* the operation: */
2001: _tme_ieee754_quad_value_set(dst, float128,
2002: float128_mul((*((const float128 *) tme_ieee754_quad_value_get(src0, &src0_buffer))),
2003: (*((const float128 *) tme_ieee754_quad_value_get(src1, &src1_buffer)))));
2004:
2005: /* leave softfloat operation: */
2006: tme_ieee754_global_ctl = NULL;
2007: exceptions |= tme_ieee754_global_exceptions;
2008: tme_mutex_unlock(&tme_ieee754_global_mutex);
2009: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
2010:
2011: /* signal any exceptions: */
2012: if (exceptions != 0) {
2013: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
2014: }
2015: }
2016:
2017: #endif /* defined(TME_HAVE_INT64_T) */
2018:
2019: #if defined(TME_HAVE_INT64_T)
2020:
2021: /* this does a strict compliance quad-precision div: */
2022: static void
2023: _tme_ieee754_strict_quad_div(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
2024: {
2025: struct tme_float_ieee754_quad src0_buffer;
2026: struct tme_float_ieee754_quad src1_buffer;
2027: int exceptions;
2028:
2029: /* enter softfloat operation: */
2030: tme_mutex_lock(&tme_ieee754_global_mutex);
2031: tme_ieee754_global_ctl = ieee754_ctl;
2032: tme_ieee754_global_exceptions = 0;
2033: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
2034:
2035: /* assume that this operation raises no exceptions: */
2036: exceptions = 0;
2037:
2038: /* the operation: */
2039: _tme_ieee754_quad_value_set(dst, float128,
2040: float128_div((*((const float128 *) tme_ieee754_quad_value_get(src0, &src0_buffer))),
2041: (*((const float128 *) tme_ieee754_quad_value_get(src1, &src1_buffer)))));
2042:
2043: /* leave softfloat operation: */
2044: tme_ieee754_global_ctl = NULL;
2045: exceptions |= tme_ieee754_global_exceptions;
2046: tme_mutex_unlock(&tme_ieee754_global_mutex);
2047: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
2048:
2049: /* signal any exceptions: */
2050: if (exceptions != 0) {
2051: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
2052: }
2053: }
2054:
2055: #endif /* defined(TME_HAVE_INT64_T) */
2056:
2057: #if defined(TME_HAVE_INT64_T)
2058:
2059: /* this does a strict compliance quad-precision rem: */
2060: static void
2061: _tme_ieee754_strict_quad_rem(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
2062: {
2063: struct tme_float_ieee754_quad src0_buffer;
2064: struct tme_float_ieee754_quad src1_buffer;
2065: int exceptions;
2066:
2067: /* enter softfloat operation: */
2068: tme_mutex_lock(&tme_ieee754_global_mutex);
2069: tme_ieee754_global_ctl = ieee754_ctl;
2070: tme_ieee754_global_exceptions = 0;
2071: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
2072:
2073: /* assume that this operation raises no exceptions: */
2074: exceptions = 0;
2075:
2076: /* the operation: */
2077: _tme_ieee754_quad_value_set(dst, float128,
2078: float128_rem((*((const float128 *) tme_ieee754_quad_value_get(src0, &src0_buffer))),
2079: (*((const float128 *) tme_ieee754_quad_value_get(src1, &src1_buffer)))));
2080:
2081: /* leave softfloat operation: */
2082: tme_ieee754_global_ctl = NULL;
2083: exceptions |= tme_ieee754_global_exceptions;
2084: tme_mutex_unlock(&tme_ieee754_global_mutex);
2085: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
2086:
2087: /* signal any exceptions: */
2088: if (exceptions != 0) {
2089: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
2090: }
2091: }
2092:
2093: #endif /* defined(TME_HAVE_INT64_T) */
2094:
2095: #if defined(TME_HAVE_INT64_T)
2096:
2097: /* this does a strict compliance quad-precision sqrt: */
2098: static void
2099: _tme_ieee754_strict_quad_sqrt(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
2100: {
2101: struct tme_float_ieee754_quad src0_buffer;
2102: int exceptions;
2103:
2104: /* enter softfloat operation: */
2105: tme_mutex_lock(&tme_ieee754_global_mutex);
2106: tme_ieee754_global_ctl = ieee754_ctl;
2107: tme_ieee754_global_exceptions = 0;
2108: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
2109:
2110: /* assume that this operation raises no exceptions: */
2111: exceptions = 0;
2112:
2113: /* the operation: */
2114: _tme_ieee754_quad_value_set(dst, float128,
2115: float128_sqrt((*((const float128 *) tme_ieee754_quad_value_get(src0, &src0_buffer)))));
2116:
2117: /* leave softfloat operation: */
2118: tme_ieee754_global_ctl = NULL;
2119: exceptions |= tme_ieee754_global_exceptions;
2120: tme_mutex_unlock(&tme_ieee754_global_mutex);
2121: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
2122:
2123: /* signal any exceptions: */
2124: if (exceptions != 0) {
2125: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
2126: }
2127: }
2128:
2129: #endif /* defined(TME_HAVE_INT64_T) */
2130:
2131: #if defined(TME_HAVE_INT64_T)
2132:
2133: /* this does a strict compliance quad-precision neg: */
2134: static void
2135: _tme_ieee754_strict_quad_neg(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
2136: {
2137: struct tme_float_ieee754_quad src0_buffer;
2138: int exceptions;
2139:
2140: /* enter softfloat operation: */
2141: tme_mutex_lock(&tme_ieee754_global_mutex);
2142: tme_ieee754_global_ctl = ieee754_ctl;
2143: tme_ieee754_global_exceptions = 0;
2144: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
2145:
2146: /* assume that this operation raises no exceptions: */
2147: exceptions = 0;
2148:
2149: /* the operation: */
2150: _tme_ieee754_quad_value_set(dst, float128,
1.1.1.2 root 2151: float128_mul(int32_to_float128(-1),
1.1 root 2152: (*((const float128 *) tme_ieee754_quad_value_get(src0, &src0_buffer)))));
2153:
2154: /* leave softfloat operation: */
2155: tme_ieee754_global_ctl = NULL;
2156: exceptions |= tme_ieee754_global_exceptions;
2157: tme_mutex_unlock(&tme_ieee754_global_mutex);
2158: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
2159:
2160: /* signal any exceptions: */
2161: if (exceptions != 0) {
2162: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
2163: }
2164: }
2165:
2166: #endif /* defined(TME_HAVE_INT64_T) */
2167:
2168: #if defined(TME_HAVE_INT64_T)
2169:
2170: /* this does a strict compliance quad-precision move: */
2171: static void
2172: _tme_ieee754_strict_quad_move(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
2173: {
2174: struct tme_float_ieee754_quad src0_buffer;
2175: int exceptions;
2176:
2177: /* enter softfloat operation: */
2178: tme_mutex_lock(&tme_ieee754_global_mutex);
2179: tme_ieee754_global_ctl = ieee754_ctl;
2180: tme_ieee754_global_exceptions = 0;
2181: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
2182:
2183: /* assume that this operation raises no exceptions: */
2184: exceptions = 0;
2185:
2186: /* the operation: */
2187: _tme_ieee754_quad_value_set(dst, float128,
2188: float128_add((*((const float128 *) tme_ieee754_quad_value_get(src0, &src0_buffer))),
2189: int32_to_float128(0)));
2190:
2191: /* leave softfloat operation: */
2192: tme_ieee754_global_ctl = NULL;
2193: exceptions |= tme_ieee754_global_exceptions;
2194: tme_mutex_unlock(&tme_ieee754_global_mutex);
2195: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
2196:
2197: /* signal any exceptions: */
2198: if (exceptions != 0) {
2199: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
2200: }
2201: }
2202:
2203: #endif /* defined(TME_HAVE_INT64_T) */
2204:
2205: #if defined(TME_HAVE_INT64_T)
2206:
2207: /* this does a strict compliance quad-precision rint: */
2208: static void
2209: _tme_ieee754_strict_quad_rint(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
2210: {
2211: struct tme_float_ieee754_quad src0_buffer;
2212: int exceptions;
2213:
2214: /* enter softfloat operation: */
2215: tme_mutex_lock(&tme_ieee754_global_mutex);
2216: tme_ieee754_global_ctl = ieee754_ctl;
2217: tme_ieee754_global_exceptions = 0;
2218: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
2219:
2220: /* assume that this operation raises no exceptions: */
2221: exceptions = 0;
2222:
2223: /* the operation: */
2224: _tme_ieee754_quad_value_set(dst, float128,
2225: float128_round_to_int((*((const float128 *) tme_ieee754_quad_value_get(src0, &src0_buffer)))));
2226:
2227: /* leave softfloat operation: */
2228: tme_ieee754_global_ctl = NULL;
2229: exceptions |= tme_ieee754_global_exceptions;
2230: tme_mutex_unlock(&tme_ieee754_global_mutex);
2231: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
2232:
2233: /* signal any exceptions: */
2234: if (exceptions != 0) {
2235: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
2236: }
2237: }
2238:
2239: #endif /* defined(TME_HAVE_INT64_T) */
2240:
2241: /* this does a strict compliance quad-precision getexp: */
2242: static void
2243: _tme_ieee754_strict_quad_getexp(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
2244: {
2245: struct tme_float_ieee754_quad src0_buffer;
2246: int exceptions;
2247:
2248: /* check for a NaN operand: */
2249: if (__tme_predict_false(tme_ieee754_quad_check_nan_monadic(ieee754_ctl, src0, dst))) {
2250: return;
2251: }
2252:
2253: /* if the operand is an infinity: */
2254: if (tme_ieee754_quad_is_inf(src0)) {
2255:
2256: /* return a NaN: */
2257: dst->tme_float_format = TME_FLOAT_FORMAT_IEEE754_QUAD;
2258: dst->tme_float_value_ieee754_quad = ieee754_ctl->tme_ieee754_ctl_default_nan_quad;
2259: return;
2260: }
2261:
2262: /* assume that this operation raises no exceptions: */
2263: exceptions = 0;
2264:
2265: /* the operation: */
2266:
2267: /* if the operand is a zero, return a zero: */
2268: if (tme_ieee754_quad_is_zero(src0)) {
2269: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN, 0);
2270: }
2271:
2272: /* otherwise, return the unbiased exponent: */
2273: else {
2274: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN, TME_FIELD_MASK_EXTRACTU((*tme_ieee754_quad_value_get(src0, &src0_buffer)).tme_float_ieee754_quad_hi.tme_value64_uint32_hi, ((tme_uint32_t) 0x7fff0000)) - ((((tme_uint32_t) 0x7fff0000) / _TME_FIELD_MASK_FACTOR(((tme_uint32_t) 0x7fff0000))) >> 1));
2275: }
2276: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
2277:
2278: /* signal any exceptions: */
2279: if (exceptions != 0) {
2280: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
2281: }
2282: }
2283:
2284: /* this does a strict compliance quad-precision getman: */
2285: static void
2286: _tme_ieee754_strict_quad_getman(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
2287: {
2288: struct tme_float_ieee754_quad src0_buffer;
2289: int exceptions;
2290:
2291: /* check for a NaN operand: */
2292: if (__tme_predict_false(tme_ieee754_quad_check_nan_monadic(ieee754_ctl, src0, dst))) {
2293: return;
2294: }
2295:
2296: /* if the operand is an infinity: */
2297: if (tme_ieee754_quad_is_inf(src0)) {
2298:
2299: /* return a NaN: */
2300: dst->tme_float_format = TME_FLOAT_FORMAT_IEEE754_QUAD;
2301: dst->tme_float_value_ieee754_quad = ieee754_ctl->tme_ieee754_ctl_default_nan_quad;
2302: return;
2303: }
2304:
2305: /* assume that this operation raises no exceptions: */
2306: exceptions = 0;
2307:
2308: /* the operation: */
2309:
2310: /* if the operand is a zero, return it: */
2311: if (tme_ieee754_quad_is_zero(src0)) {
2312: *dst = *src0;
2313: }
2314:
2315: /* otherwise, return the operand, with its exponent set to biased zero: */
2316: else {
2317: tme_ieee754_quad_value_set(dst, (*tme_ieee754_quad_value_get(src0, &src0_buffer)));
2318: TME_FIELD_MASK_DEPOSITU(dst->tme_float_value_ieee754_quad.tme_float_ieee754_quad_hi.tme_value64_uint32_hi, ((tme_uint32_t) 0x7fff0000), ((((tme_uint32_t) 0x7fff0000) / _TME_FIELD_MASK_FACTOR(((tme_uint32_t) 0x7fff0000))) >> 1));
2319: }
2320: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
2321:
2322: /* signal any exceptions: */
2323: if (exceptions != 0) {
2324: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
2325: }
2326: }
2327:
2328: #if defined(TME_HAVE_INT64_T)
2329:
2330: /* this does a strict compliance quad-precision from-single: */
2331: static void
2332: _tme_ieee754_strict_quad_from_single(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
2333: {
2334: tme_uint32_t src0_buffer;
2335: int exceptions;
2336:
2337: /* enter softfloat operation: */
2338: tme_mutex_lock(&tme_ieee754_global_mutex);
2339: tme_ieee754_global_ctl = ieee754_ctl;
2340: tme_ieee754_global_exceptions = 0;
2341: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
2342:
2343: /* assume that this operation raises no exceptions: */
2344: exceptions = 0;
2345:
2346: /* the operation: */
2347: _tme_ieee754_quad_value_set(dst, float128,
2348: float32_to_float128((*((const float32 *) tme_ieee754_single_value_get(src0, &src0_buffer)))));
2349:
2350: /* leave softfloat operation: */
2351: tme_ieee754_global_ctl = NULL;
2352: exceptions |= tme_ieee754_global_exceptions;
2353: tme_mutex_unlock(&tme_ieee754_global_mutex);
2354: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
2355:
2356: /* signal any exceptions: */
2357: if (exceptions != 0) {
2358: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
2359: }
2360: }
2361:
2362: #endif /* defined(TME_HAVE_INT64_T) */
2363:
2364: #if defined(TME_HAVE_INT64_T)
2365:
2366: /* this does a strict compliance quad-precision from-double: */
2367: static void
2368: _tme_ieee754_strict_quad_from_double(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
2369: {
2370: union tme_value64 src0_buffer;
2371: int exceptions;
2372:
2373: /* enter softfloat operation: */
2374: tme_mutex_lock(&tme_ieee754_global_mutex);
2375: tme_ieee754_global_ctl = ieee754_ctl;
2376: tme_ieee754_global_exceptions = 0;
2377: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
2378:
2379: /* assume that this operation raises no exceptions: */
2380: exceptions = 0;
2381:
2382: /* the operation: */
2383: _tme_ieee754_quad_value_set(dst, float128,
2384: float64_to_float128((*((const float64 *) tme_ieee754_double_value_get(src0, &src0_buffer)))));
2385:
2386: /* leave softfloat operation: */
2387: tme_ieee754_global_ctl = NULL;
2388: exceptions |= tme_ieee754_global_exceptions;
2389: tme_mutex_unlock(&tme_ieee754_global_mutex);
2390: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
2391:
2392: /* signal any exceptions: */
2393: if (exceptions != 0) {
2394: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
2395: }
2396: }
2397:
2398: #endif /* defined(TME_HAVE_INT64_T) */
2399:
2400: #if defined(TME_HAVE_INT64_T)
2401:
2402: /* this does a strict compliance quad-precision from-extended80: */
2403: static void
2404: _tme_ieee754_strict_quad_from_extended80(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
2405: {
2406: struct tme_float_ieee754_extended80 src0_buffer;
2407: int exceptions;
2408:
2409: /* enter softfloat operation: */
2410: tme_mutex_lock(&tme_ieee754_global_mutex);
2411: tme_ieee754_global_ctl = ieee754_ctl;
2412: tme_ieee754_global_exceptions = 0;
2413: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
2414:
2415: /* assume that this operation raises no exceptions: */
2416: exceptions = 0;
2417:
2418: /* the operation: */
2419: _tme_ieee754_quad_value_set(dst, float128,
2420: floatx80_to_float128((*((const floatx80 *) tme_ieee754_extended80_value_get(src0, &src0_buffer)))));
2421:
2422: /* leave softfloat operation: */
2423: tme_ieee754_global_ctl = NULL;
2424: exceptions |= tme_ieee754_global_exceptions;
2425: tme_mutex_unlock(&tme_ieee754_global_mutex);
2426: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
2427:
2428: /* signal any exceptions: */
2429: if (exceptions != 0) {
2430: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
2431: }
2432: }
2433:
2434: #endif /* defined(TME_HAVE_INT64_T) */
2435:
1.1.1.2 root 2436: #if defined(TME_HAVE_INT64_T)
2437:
2438: /* this does a strict compliance quad-precision from-int32: */
2439: static void
2440: _tme_ieee754_strict_quad_from_int32(struct tme_ieee754_ctl *ieee754_ctl, const tme_int32_t src0, struct tme_float *dst)
2441: {
2442: int exceptions;
2443:
2444: /* enter softfloat operation: */
2445: tme_mutex_lock(&tme_ieee754_global_mutex);
2446: tme_ieee754_global_ctl = ieee754_ctl;
2447: tme_ieee754_global_exceptions = 0;
2448: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
2449:
2450: /* assume that this operation raises no exceptions: */
2451: exceptions = 0;
2452:
2453: /* the operation: */
2454: _tme_ieee754_quad_value_set(dst, float128,
2455: int32_to_float128(src0));
2456:
2457: /* leave softfloat operation: */
2458: tme_ieee754_global_ctl = NULL;
2459: exceptions |= tme_ieee754_global_exceptions;
2460: tme_mutex_unlock(&tme_ieee754_global_mutex);
2461: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
2462:
2463: /* signal any exceptions: */
2464: if (exceptions != 0) {
2465: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
2466: }
2467: }
2468:
2469: #endif /* defined(TME_HAVE_INT64_T) */
2470:
2471: #if defined(TME_HAVE_INT64_T)
2472:
2473: /* this does a strict compliance quad-precision from-int64: */
2474: static void
2475: _tme_ieee754_strict_quad_from_int64(struct tme_ieee754_ctl *ieee754_ctl, const tme_int64_t src0, struct tme_float *dst)
2476: {
2477: int exceptions;
2478:
2479: /* enter softfloat operation: */
2480: tme_mutex_lock(&tme_ieee754_global_mutex);
2481: tme_ieee754_global_ctl = ieee754_ctl;
2482: tme_ieee754_global_exceptions = 0;
2483: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
2484:
2485: /* assume that this operation raises no exceptions: */
2486: exceptions = 0;
2487:
2488: /* the operation: */
2489: _tme_ieee754_quad_value_set(dst, float128,
2490: int64_to_float128(src0));
2491:
2492: /* leave softfloat operation: */
2493: tme_ieee754_global_ctl = NULL;
2494: exceptions |= tme_ieee754_global_exceptions;
2495: tme_mutex_unlock(&tme_ieee754_global_mutex);
2496: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
2497:
2498: /* signal any exceptions: */
2499: if (exceptions != 0) {
2500: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
2501: }
2502: }
2503:
2504: #endif /* defined(TME_HAVE_INT64_T) */
2505:
1.1 root 2506: /* this does a strict compliance quad-precision to-int32: */
2507: static void
2508: _tme_ieee754_strict_quad_to_int32(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, tme_int32_t *dst)
2509: {
2510: struct tme_float_ieee754_quad src0_buffer;
2511: int exceptions;
2512:
2513: /* enter softfloat operation: */
2514: tme_mutex_lock(&tme_ieee754_global_mutex);
2515: tme_ieee754_global_ctl = ieee754_ctl;
2516: tme_ieee754_global_exceptions = 0;
2517: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
2518:
2519: /* assume that this operation raises no exceptions: */
2520: exceptions = 0;
2521:
2522: /* the operation: */
2523: *dst = float128_to_int32((*((const float128 *) tme_ieee754_quad_value_get(src0, &src0_buffer))));
2524:
2525: /* leave softfloat operation: */
2526: tme_ieee754_global_ctl = NULL;
2527: exceptions |= tme_ieee754_global_exceptions;
2528: tme_mutex_unlock(&tme_ieee754_global_mutex);
2529: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
2530:
2531: /* signal any exceptions: */
2532: if (exceptions != 0) {
2533: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
2534: }
2535: }
2536:
1.1.1.3 ! root 2537: #if defined(TME_HAVE_INT64_T)
! 2538:
! 2539: /* this does a strict compliance quad-precision to-int64: */
! 2540: static void
! 2541: _tme_ieee754_strict_quad_to_int64(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, tme_int64_t *dst)
! 2542: {
! 2543: struct tme_float_ieee754_quad src0_buffer;
! 2544: int exceptions;
! 2545:
! 2546: /* enter softfloat operation: */
! 2547: tme_mutex_lock(&tme_ieee754_global_mutex);
! 2548: tme_ieee754_global_ctl = ieee754_ctl;
! 2549: tme_ieee754_global_exceptions = 0;
! 2550: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_ieee754_unlock_softfloat;
! 2551:
! 2552: /* assume that this operation raises no exceptions: */
! 2553: exceptions = 0;
! 2554:
! 2555: /* the operation: */
! 2556: *dst = float128_to_int64((*((const float128 *) tme_ieee754_quad_value_get(src0, &src0_buffer))));
! 2557:
! 2558: /* leave softfloat operation: */
! 2559: tme_ieee754_global_ctl = NULL;
! 2560: exceptions |= tme_ieee754_global_exceptions;
! 2561: tme_mutex_unlock(&tme_ieee754_global_mutex);
! 2562: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
! 2563:
! 2564: /* signal any exceptions: */
! 2565: if (exceptions != 0) {
! 2566: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
! 2567: }
! 2568: }
! 2569:
! 2570: #endif /* defined(TME_HAVE_INT64_T) */
! 2571:
1.1 root 2572: /* the strict compliance operations: */
2573: _tme_const struct tme_ieee754_ops tme_ieee754_ops_strict = {
2574:
2575: /* the version of this structure: */
2576: TME_X_VERSION(0, 0),
2577:
2578: /* this does a strict compliance single-precision add: */
2579: _tme_ieee754_strict_single_add,
2580:
2581: /* this does a strict compliance single-precision sub: */
2582: _tme_ieee754_strict_single_sub,
2583:
2584: /* this does a strict compliance single-precision mul: */
2585: _tme_ieee754_strict_single_mul,
2586:
2587: /* this does a strict compliance single-precision div: */
2588: _tme_ieee754_strict_single_div,
2589:
2590: /* this does a strict compliance single-precision rem: */
2591: _tme_ieee754_strict_single_rem,
2592:
2593: /* this does a strict compliance single-precision sqrt: */
2594: _tme_ieee754_strict_single_sqrt,
2595:
2596: /* this does a strict compliance single-precision abs: */
2597: NULL,
2598:
2599: /* this does a strict compliance single-precision neg: */
2600: _tme_ieee754_strict_single_neg,
2601:
2602: /* this does a strict compliance single-precision move: */
2603: _tme_ieee754_strict_single_move,
2604:
2605: /* this does a strict compliance single-precision rint: */
2606: _tme_ieee754_strict_single_rint,
2607:
2608: /* this does a strict compliance single-precision cos: */
2609: NULL,
2610:
2611: /* this does a strict compliance single-precision acos: */
2612: NULL,
2613:
2614: /* this does a strict compliance single-precision cosh: */
2615: NULL,
2616:
2617: /* this does a strict compliance single-precision sin: */
2618: NULL,
2619:
2620: /* this does a strict compliance single-precision asin: */
2621: NULL,
2622:
2623: /* this does a strict compliance single-precision sinh: */
2624: NULL,
2625:
2626: /* this does a strict compliance single-precision tan: */
2627: NULL,
2628:
2629: /* this does a strict compliance single-precision atan: */
2630: NULL,
2631:
2632: /* this does a strict compliance single-precision tanh: */
2633: NULL,
2634:
2635: /* this does a strict compliance single-precision atanh: */
2636: NULL,
2637:
2638: /* this does a strict compliance single-precision exp: */
2639: NULL,
2640:
2641: /* this does a strict compliance single-precision expm1: */
2642: NULL,
2643:
2644: /* this does a strict compliance single-precision log10: */
2645: NULL,
2646:
2647: /* this does a strict compliance single-precision log: */
2648: NULL,
2649:
2650: /* this does a strict compliance single-precision log1p: */
2651: NULL,
2652:
2653: /* this does a strict compliance single-precision getexp: */
2654: _tme_ieee754_strict_single_getexp,
2655:
2656: /* this does a strict compliance single-precision getman: */
2657: _tme_ieee754_strict_single_getman,
2658:
2659: /* this does a strict compliance single-precision scale: */
2660: NULL,
2661:
2662: /* this does a strict compliance single-precision pow: */
2663: NULL,
2664:
2665: /* this does a strict compliance single-precision from_double: */
2666: _tme_ieee754_strict_single_from_double,
2667:
2668: /* this does a strict compliance single-precision from_extended80: */
2669: _tme_ieee754_strict_single_from_extended80,
2670:
2671: /* this does a strict compliance single-precision from_quad: */
2672: _tme_ieee754_strict_single_from_quad,
2673:
1.1.1.2 root 2674: /* this does a strict compliance single-precision from_int32: */
2675: _tme_ieee754_strict_single_from_int32,
2676:
2677: /* this does a strict compliance single-precision from_int64: */
2678: #if (defined(TME_HAVE_INT64_T))
2679: _tme_ieee754_strict_single_from_int64,
2680: #else /* !(defined(TME_HAVE_INT64_T)) */
2681: NULL,
2682: #endif /* !(defined(TME_HAVE_INT64_T)) */
2683:
1.1 root 2684: /* this does a strict compliance single-precision to_int32: */
2685: _tme_ieee754_strict_single_to_int32,
2686:
2687: /* this does a strict compliance single-precision to_int64: */
1.1.1.3 ! root 2688: #if (defined(TME_HAVE_INT64_T))
! 2689: _tme_ieee754_strict_single_to_int64,
! 2690: #else /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 2691: NULL,
1.1.1.3 ! root 2692: #endif /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 2693:
2694: /* this does a strict compliance double-precision add: */
2695: _tme_ieee754_strict_double_add,
2696:
2697: /* this does a strict compliance double-precision sub: */
2698: _tme_ieee754_strict_double_sub,
2699:
2700: /* this does a strict compliance double-precision mul: */
2701: _tme_ieee754_strict_double_mul,
2702:
2703: /* this does a strict compliance double-precision div: */
2704: _tme_ieee754_strict_double_div,
2705:
2706: /* this does a strict compliance double-precision rem: */
2707: _tme_ieee754_strict_double_rem,
2708:
2709: /* this does a strict compliance double-precision sqrt: */
2710: _tme_ieee754_strict_double_sqrt,
2711:
2712: /* this does a strict compliance double-precision abs: */
2713: NULL,
2714:
2715: /* this does a strict compliance double-precision neg: */
2716: _tme_ieee754_strict_double_neg,
2717:
2718: /* this does a strict compliance double-precision move: */
2719: _tme_ieee754_strict_double_move,
2720:
2721: /* this does a strict compliance double-precision rint: */
2722: _tme_ieee754_strict_double_rint,
2723:
2724: /* this does a strict compliance double-precision cos: */
2725: NULL,
2726:
2727: /* this does a strict compliance double-precision acos: */
2728: NULL,
2729:
2730: /* this does a strict compliance double-precision cosh: */
2731: NULL,
2732:
2733: /* this does a strict compliance double-precision sin: */
2734: NULL,
2735:
2736: /* this does a strict compliance double-precision asin: */
2737: NULL,
2738:
2739: /* this does a strict compliance double-precision sinh: */
2740: NULL,
2741:
2742: /* this does a strict compliance double-precision tan: */
2743: NULL,
2744:
2745: /* this does a strict compliance double-precision atan: */
2746: NULL,
2747:
2748: /* this does a strict compliance double-precision tanh: */
2749: NULL,
2750:
2751: /* this does a strict compliance double-precision atanh: */
2752: NULL,
2753:
2754: /* this does a strict compliance double-precision exp: */
2755: NULL,
2756:
2757: /* this does a strict compliance double-precision expm1: */
2758: NULL,
2759:
2760: /* this does a strict compliance double-precision log10: */
2761: NULL,
2762:
2763: /* this does a strict compliance double-precision log: */
2764: NULL,
2765:
2766: /* this does a strict compliance double-precision log1p: */
2767: NULL,
2768:
2769: /* this does a strict compliance double-precision getexp: */
2770: _tme_ieee754_strict_double_getexp,
2771:
2772: /* this does a strict compliance double-precision getman: */
2773: _tme_ieee754_strict_double_getman,
2774:
2775: /* this does a strict compliance double-precision scale: */
2776: NULL,
2777:
2778: /* this does a strict compliance double-precision pow: */
2779: NULL,
2780:
2781: /* this does a strict compliance double-precision from_single: */
2782: _tme_ieee754_strict_double_from_single,
2783:
2784: /* this does a strict compliance double-precision from_extended80: */
2785: _tme_ieee754_strict_double_from_extended80,
2786:
2787: /* this does a strict compliance double-precision from_quad: */
2788: _tme_ieee754_strict_double_from_quad,
2789:
1.1.1.2 root 2790: /* this does a strict compliance double-precision from_int32: */
2791: _tme_ieee754_strict_double_from_int32,
2792:
2793: /* this does a strict compliance double-precision from_int64: */
2794: #if (defined(TME_HAVE_INT64_T))
2795: _tme_ieee754_strict_double_from_int64,
2796: #else /* !(defined(TME_HAVE_INT64_T)) */
2797: NULL,
2798: #endif /* !(defined(TME_HAVE_INT64_T)) */
2799:
1.1 root 2800: /* this does a strict compliance double-precision to_int32: */
2801: _tme_ieee754_strict_double_to_int32,
2802:
2803: /* this does a strict compliance double-precision to_int64: */
1.1.1.3 ! root 2804: #if (defined(TME_HAVE_INT64_T))
! 2805: _tme_ieee754_strict_double_to_int64,
! 2806: #else /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 2807: NULL,
1.1.1.3 ! root 2808: #endif /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 2809:
2810: /* this does a strict compliance extended80-precision add: */
2811: #if (defined(TME_HAVE_INT64_T))
2812: _tme_ieee754_strict_extended80_add,
2813: #else /* !(defined(TME_HAVE_INT64_T)) */
2814: NULL,
2815: #endif /* !(defined(TME_HAVE_INT64_T)) */
2816:
2817: /* this does a strict compliance extended80-precision sub: */
2818: #if (defined(TME_HAVE_INT64_T))
2819: _tme_ieee754_strict_extended80_sub,
2820: #else /* !(defined(TME_HAVE_INT64_T)) */
2821: NULL,
2822: #endif /* !(defined(TME_HAVE_INT64_T)) */
2823:
2824: /* this does a strict compliance extended80-precision mul: */
2825: #if (defined(TME_HAVE_INT64_T))
2826: _tme_ieee754_strict_extended80_mul,
2827: #else /* !(defined(TME_HAVE_INT64_T)) */
2828: NULL,
2829: #endif /* !(defined(TME_HAVE_INT64_T)) */
2830:
2831: /* this does a strict compliance extended80-precision div: */
2832: #if (defined(TME_HAVE_INT64_T))
2833: _tme_ieee754_strict_extended80_div,
2834: #else /* !(defined(TME_HAVE_INT64_T)) */
2835: NULL,
2836: #endif /* !(defined(TME_HAVE_INT64_T)) */
2837:
2838: /* this does a strict compliance extended80-precision rem: */
2839: #if (defined(TME_HAVE_INT64_T))
2840: _tme_ieee754_strict_extended80_rem,
2841: #else /* !(defined(TME_HAVE_INT64_T)) */
2842: NULL,
2843: #endif /* !(defined(TME_HAVE_INT64_T)) */
2844:
2845: /* this does a strict compliance extended80-precision sqrt: */
2846: #if (defined(TME_HAVE_INT64_T))
2847: _tme_ieee754_strict_extended80_sqrt,
2848: #else /* !(defined(TME_HAVE_INT64_T)) */
2849: NULL,
2850: #endif /* !(defined(TME_HAVE_INT64_T)) */
2851:
2852: /* this does a strict compliance extended80-precision abs: */
2853: NULL,
2854:
2855: /* this does a strict compliance extended80-precision neg: */
2856: #if (defined(TME_HAVE_INT64_T))
2857: _tme_ieee754_strict_extended80_neg,
2858: #else /* !(defined(TME_HAVE_INT64_T)) */
2859: NULL,
2860: #endif /* !(defined(TME_HAVE_INT64_T)) */
2861:
2862: /* this does a strict compliance extended80-precision move: */
2863: #if (defined(TME_HAVE_INT64_T))
2864: _tme_ieee754_strict_extended80_move,
2865: #else /* !(defined(TME_HAVE_INT64_T)) */
2866: NULL,
2867: #endif /* !(defined(TME_HAVE_INT64_T)) */
2868:
2869: /* this does a strict compliance extended80-precision rint: */
2870: #if (defined(TME_HAVE_INT64_T))
2871: _tme_ieee754_strict_extended80_rint,
2872: #else /* !(defined(TME_HAVE_INT64_T)) */
2873: NULL,
2874: #endif /* !(defined(TME_HAVE_INT64_T)) */
2875:
2876: /* this does a strict compliance extended80-precision cos: */
2877: NULL,
2878:
2879: /* this does a strict compliance extended80-precision acos: */
2880: NULL,
2881:
2882: /* this does a strict compliance extended80-precision cosh: */
2883: NULL,
2884:
2885: /* this does a strict compliance extended80-precision sin: */
2886: NULL,
2887:
2888: /* this does a strict compliance extended80-precision asin: */
2889: NULL,
2890:
2891: /* this does a strict compliance extended80-precision sinh: */
2892: NULL,
2893:
2894: /* this does a strict compliance extended80-precision tan: */
2895: NULL,
2896:
2897: /* this does a strict compliance extended80-precision atan: */
2898: NULL,
2899:
2900: /* this does a strict compliance extended80-precision tanh: */
2901: NULL,
2902:
2903: /* this does a strict compliance extended80-precision atanh: */
2904: NULL,
2905:
2906: /* this does a strict compliance extended80-precision exp: */
2907: NULL,
2908:
2909: /* this does a strict compliance extended80-precision expm1: */
2910: NULL,
2911:
2912: /* this does a strict compliance extended80-precision log10: */
2913: NULL,
2914:
2915: /* this does a strict compliance extended80-precision log: */
2916: NULL,
2917:
2918: /* this does a strict compliance extended80-precision log1p: */
2919: NULL,
2920:
2921: /* this does a strict compliance extended80-precision getexp: */
2922: _tme_ieee754_strict_extended80_getexp,
2923:
2924: /* this does a strict compliance extended80-precision getman: */
2925: _tme_ieee754_strict_extended80_getman,
2926:
2927: /* this does a strict compliance extended80-precision scale: */
2928: NULL,
2929:
2930: /* this does a strict compliance extended80-precision pow: */
2931: NULL,
2932:
2933: /* this does a strict compliance extended80-precision from_single: */
2934: #if (defined(TME_HAVE_INT64_T))
2935: _tme_ieee754_strict_extended80_from_single,
2936: #else /* !(defined(TME_HAVE_INT64_T)) */
2937: NULL,
2938: #endif /* !(defined(TME_HAVE_INT64_T)) */
2939:
2940: /* this does a strict compliance extended80-precision from_double: */
2941: #if (defined(TME_HAVE_INT64_T))
2942: _tme_ieee754_strict_extended80_from_double,
2943: #else /* !(defined(TME_HAVE_INT64_T)) */
2944: NULL,
2945: #endif /* !(defined(TME_HAVE_INT64_T)) */
2946:
2947: /* this does a strict compliance extended80-precision from_quad: */
2948: #if (defined(TME_HAVE_INT64_T))
2949: _tme_ieee754_strict_extended80_from_quad,
2950: #else /* !(defined(TME_HAVE_INT64_T)) */
2951: NULL,
2952: #endif /* !(defined(TME_HAVE_INT64_T)) */
2953:
1.1.1.2 root 2954: /* this does a strict compliance extended80-precision from_int32: */
2955: #if (defined(TME_HAVE_INT64_T))
2956: _tme_ieee754_strict_extended80_from_int32,
2957: #else /* !(defined(TME_HAVE_INT64_T)) */
2958: NULL,
2959: #endif /* !(defined(TME_HAVE_INT64_T)) */
2960:
2961: /* this does a strict compliance extended80-precision from_int64: */
2962: #if (defined(TME_HAVE_INT64_T))
2963: _tme_ieee754_strict_extended80_from_int64,
2964: #else /* !(defined(TME_HAVE_INT64_T)) */
2965: NULL,
2966: #endif /* !(defined(TME_HAVE_INT64_T)) */
2967:
1.1 root 2968: /* this does a strict compliance extended80-precision to_int32: */
2969: _tme_ieee754_strict_extended80_to_int32,
2970:
2971: /* this does a strict compliance extended80-precision to_int64: */
1.1.1.3 ! root 2972: #if (defined(TME_HAVE_INT64_T))
! 2973: _tme_ieee754_strict_extended80_to_int64,
! 2974: #else /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 2975: NULL,
1.1.1.3 ! root 2976: #endif /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 2977:
2978: /* this does a strict compliance quad-precision add: */
2979: #if (defined(TME_HAVE_INT64_T))
2980: _tme_ieee754_strict_quad_add,
2981: #else /* !(defined(TME_HAVE_INT64_T)) */
2982: NULL,
2983: #endif /* !(defined(TME_HAVE_INT64_T)) */
2984:
2985: /* this does a strict compliance quad-precision sub: */
2986: #if (defined(TME_HAVE_INT64_T))
2987: _tme_ieee754_strict_quad_sub,
2988: #else /* !(defined(TME_HAVE_INT64_T)) */
2989: NULL,
2990: #endif /* !(defined(TME_HAVE_INT64_T)) */
2991:
2992: /* this does a strict compliance quad-precision mul: */
2993: #if (defined(TME_HAVE_INT64_T))
2994: _tme_ieee754_strict_quad_mul,
2995: #else /* !(defined(TME_HAVE_INT64_T)) */
2996: NULL,
2997: #endif /* !(defined(TME_HAVE_INT64_T)) */
2998:
2999: /* this does a strict compliance quad-precision div: */
3000: #if (defined(TME_HAVE_INT64_T))
3001: _tme_ieee754_strict_quad_div,
3002: #else /* !(defined(TME_HAVE_INT64_T)) */
3003: NULL,
3004: #endif /* !(defined(TME_HAVE_INT64_T)) */
3005:
3006: /* this does a strict compliance quad-precision rem: */
3007: #if (defined(TME_HAVE_INT64_T))
3008: _tme_ieee754_strict_quad_rem,
3009: #else /* !(defined(TME_HAVE_INT64_T)) */
3010: NULL,
3011: #endif /* !(defined(TME_HAVE_INT64_T)) */
3012:
3013: /* this does a strict compliance quad-precision sqrt: */
3014: #if (defined(TME_HAVE_INT64_T))
3015: _tme_ieee754_strict_quad_sqrt,
3016: #else /* !(defined(TME_HAVE_INT64_T)) */
3017: NULL,
3018: #endif /* !(defined(TME_HAVE_INT64_T)) */
3019:
3020: /* this does a strict compliance quad-precision abs: */
3021: NULL,
3022:
3023: /* this does a strict compliance quad-precision neg: */
3024: #if (defined(TME_HAVE_INT64_T))
3025: _tme_ieee754_strict_quad_neg,
3026: #else /* !(defined(TME_HAVE_INT64_T)) */
3027: NULL,
3028: #endif /* !(defined(TME_HAVE_INT64_T)) */
3029:
3030: /* this does a strict compliance quad-precision move: */
3031: #if (defined(TME_HAVE_INT64_T))
3032: _tme_ieee754_strict_quad_move,
3033: #else /* !(defined(TME_HAVE_INT64_T)) */
3034: NULL,
3035: #endif /* !(defined(TME_HAVE_INT64_T)) */
3036:
3037: /* this does a strict compliance quad-precision rint: */
3038: #if (defined(TME_HAVE_INT64_T))
3039: _tme_ieee754_strict_quad_rint,
3040: #else /* !(defined(TME_HAVE_INT64_T)) */
3041: NULL,
3042: #endif /* !(defined(TME_HAVE_INT64_T)) */
3043:
3044: /* this does a strict compliance quad-precision cos: */
3045: NULL,
3046:
3047: /* this does a strict compliance quad-precision acos: */
3048: NULL,
3049:
3050: /* this does a strict compliance quad-precision cosh: */
3051: NULL,
3052:
3053: /* this does a strict compliance quad-precision sin: */
3054: NULL,
3055:
3056: /* this does a strict compliance quad-precision asin: */
3057: NULL,
3058:
3059: /* this does a strict compliance quad-precision sinh: */
3060: NULL,
3061:
3062: /* this does a strict compliance quad-precision tan: */
3063: NULL,
3064:
3065: /* this does a strict compliance quad-precision atan: */
3066: NULL,
3067:
3068: /* this does a strict compliance quad-precision tanh: */
3069: NULL,
3070:
3071: /* this does a strict compliance quad-precision atanh: */
3072: NULL,
3073:
3074: /* this does a strict compliance quad-precision exp: */
3075: NULL,
3076:
3077: /* this does a strict compliance quad-precision expm1: */
3078: NULL,
3079:
3080: /* this does a strict compliance quad-precision log10: */
3081: NULL,
3082:
3083: /* this does a strict compliance quad-precision log: */
3084: NULL,
3085:
3086: /* this does a strict compliance quad-precision log1p: */
3087: NULL,
3088:
3089: /* this does a strict compliance quad-precision getexp: */
3090: _tme_ieee754_strict_quad_getexp,
3091:
3092: /* this does a strict compliance quad-precision getman: */
3093: _tme_ieee754_strict_quad_getman,
3094:
3095: /* this does a strict compliance quad-precision scale: */
3096: NULL,
3097:
3098: /* this does a strict compliance quad-precision pow: */
3099: NULL,
3100:
3101: /* this does a strict compliance quad-precision from_single: */
3102: #if (defined(TME_HAVE_INT64_T))
3103: _tme_ieee754_strict_quad_from_single,
3104: #else /* !(defined(TME_HAVE_INT64_T)) */
3105: NULL,
3106: #endif /* !(defined(TME_HAVE_INT64_T)) */
3107:
3108: /* this does a strict compliance quad-precision from_double: */
3109: #if (defined(TME_HAVE_INT64_T))
3110: _tme_ieee754_strict_quad_from_double,
3111: #else /* !(defined(TME_HAVE_INT64_T)) */
3112: NULL,
3113: #endif /* !(defined(TME_HAVE_INT64_T)) */
3114:
3115: /* this does a strict compliance quad-precision from_extended80: */
3116: #if (defined(TME_HAVE_INT64_T))
3117: _tme_ieee754_strict_quad_from_extended80,
3118: #else /* !(defined(TME_HAVE_INT64_T)) */
3119: NULL,
3120: #endif /* !(defined(TME_HAVE_INT64_T)) */
3121:
1.1.1.2 root 3122: /* this does a strict compliance quad-precision from_int32: */
3123: #if (defined(TME_HAVE_INT64_T))
3124: _tme_ieee754_strict_quad_from_int32,
3125: #else /* !(defined(TME_HAVE_INT64_T)) */
3126: NULL,
3127: #endif /* !(defined(TME_HAVE_INT64_T)) */
3128:
3129: /* this does a strict compliance quad-precision from_int64: */
3130: #if (defined(TME_HAVE_INT64_T))
3131: _tme_ieee754_strict_quad_from_int64,
3132: #else /* !(defined(TME_HAVE_INT64_T)) */
3133: NULL,
3134: #endif /* !(defined(TME_HAVE_INT64_T)) */
3135:
1.1 root 3136: /* this does a strict compliance quad-precision to_int32: */
3137: _tme_ieee754_strict_quad_to_int32,
3138:
3139: /* this does a strict compliance quad-precision to_int64: */
1.1.1.3 ! root 3140: #if (defined(TME_HAVE_INT64_T))
! 3141: _tme_ieee754_strict_quad_to_int64,
! 3142: #else /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 3143: NULL,
1.1.1.3 ! root 3144: #endif /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 3145: };
3146:
3147: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)
3148:
3149: /* this does a partial compliance single-precision add: */
3150: static void
3151: _tme_ieee754_partial_single_add(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
3152: {
3153: int exceptions;
3154:
3155: /* check for a NaN operand: */
3156: if (__tme_predict_false(tme_ieee754_single_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
3157: return;
3158: }
3159:
3160: /* enter native floating-point operation: */
3161: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3162: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3163:
3164: /* assume that this operation raises no exceptions: */
3165: exceptions = 0;
3166:
3167: /* the operation: */
3168: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN, tme_ieee754_single_value_builtin_get(src0) + tme_ieee754_single_value_builtin_get(src1));
3169:
3170: /* leave native floating-point operation: */
3171: exceptions |= tme_float_leave();
3172: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3173:
3174: /* signal any exceptions: */
3175: if (exceptions != 0) {
3176: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3177: }
3178: }
3179:
3180: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE) */
3181:
3182: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)
3183:
3184: /* this does a partial compliance single-precision sub: */
3185: static void
3186: _tme_ieee754_partial_single_sub(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
3187: {
3188: int exceptions;
3189:
3190: /* check for a NaN operand: */
3191: if (__tme_predict_false(tme_ieee754_single_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
3192: return;
3193: }
3194:
3195: /* enter native floating-point operation: */
3196: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3197: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3198:
3199: /* assume that this operation raises no exceptions: */
3200: exceptions = 0;
3201:
3202: /* the operation: */
3203: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN, tme_ieee754_single_value_builtin_get(src0) - tme_ieee754_single_value_builtin_get(src1));
3204:
3205: /* leave native floating-point operation: */
3206: exceptions |= tme_float_leave();
3207: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3208:
3209: /* signal any exceptions: */
3210: if (exceptions != 0) {
3211: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3212: }
3213: }
3214:
3215: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE) */
3216:
3217: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)
3218:
3219: /* this does a partial compliance single-precision mul: */
3220: static void
3221: _tme_ieee754_partial_single_mul(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
3222: {
3223: int exceptions;
3224:
3225: /* check for a NaN operand: */
3226: if (__tme_predict_false(tme_ieee754_single_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
3227: return;
3228: }
3229:
3230: /* enter native floating-point operation: */
3231: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3232: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3233:
3234: /* assume that this operation raises no exceptions: */
3235: exceptions = 0;
3236:
3237: /* the operation: */
3238: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN, tme_ieee754_single_value_builtin_get(src0) * tme_ieee754_single_value_builtin_get(src1));
3239:
3240: /* leave native floating-point operation: */
3241: exceptions |= tme_float_leave();
3242: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3243:
3244: /* signal any exceptions: */
3245: if (exceptions != 0) {
3246: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3247: }
3248: }
3249:
3250: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE) */
3251:
3252: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)
3253:
3254: /* this does a partial compliance single-precision div: */
3255: static void
3256: _tme_ieee754_partial_single_div(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
3257: {
3258: int exceptions;
3259:
3260: /* check for a NaN operand: */
3261: if (__tme_predict_false(tme_ieee754_single_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
3262: return;
3263: }
3264:
3265: /* enter native floating-point operation: */
3266: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3267: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3268:
3269: /* assume that this operation raises no exceptions: */
3270: exceptions = 0;
3271:
3272: /* the operation: */
3273: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN, tme_ieee754_single_value_builtin_get(src0) / tme_ieee754_single_value_builtin_get(src1));
3274:
3275: /* leave native floating-point operation: */
3276: exceptions |= tme_float_leave();
3277: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3278:
3279: /* signal any exceptions: */
3280: if (exceptions != 0) {
3281: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3282: }
3283: }
3284:
3285: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE) */
3286:
3287: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)
3288:
3289: /* this does a partial compliance single-precision sqrt: */
3290: static void
3291: _tme_ieee754_partial_single_sqrt(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
3292: {
3293: int exceptions;
3294:
3295: /* check for a NaN operand: */
3296: if (__tme_predict_false(tme_ieee754_single_check_nan_monadic(ieee754_ctl, src0, dst))) {
3297: return;
3298: }
3299:
3300: /* enter native floating-point operation: */
3301: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3302: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3303:
3304: /* assume that this operation raises no exceptions: */
3305: exceptions = 0;
3306:
3307: /* the operation: */
3308: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
3309: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, sqrtf(tme_ieee754_single_value_builtin_get(src0)));
3310: #else /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3311: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, sqrt(tme_ieee754_single_value_builtin_get(src0)));
3312: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3313:
3314: /* leave native floating-point operation: */
3315: exceptions |= tme_float_leave();
3316: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3317:
3318: /* signal any exceptions: */
3319: if (exceptions != 0) {
3320: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3321: }
3322: }
3323:
3324: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE) */
3325:
3326: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)
3327:
3328: /* this does a partial compliance single-precision abs: */
3329: static void
3330: _tme_ieee754_partial_single_abs(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
3331: {
3332: int exceptions;
3333:
3334: /* check for a NaN operand: */
3335: if (__tme_predict_false(tme_ieee754_single_check_nan_monadic(ieee754_ctl, src0, dst))) {
3336: return;
3337: }
3338:
3339: /* enter native floating-point operation: */
3340: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3341: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3342:
3343: /* assume that this operation raises no exceptions: */
3344: exceptions = 0;
3345:
3346: /* the operation: */
3347: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
3348: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, fabsf(tme_ieee754_single_value_builtin_get(src0)));
3349: #else /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3350: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, fabs(tme_ieee754_single_value_builtin_get(src0)));
3351: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3352:
3353: /* leave native floating-point operation: */
3354: exceptions |= tme_float_leave();
3355: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3356:
3357: /* signal any exceptions: */
3358: if (exceptions != 0) {
3359: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3360: }
3361: }
3362:
3363: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE) */
3364:
3365: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)
3366:
3367: /* this does a partial compliance single-precision neg: */
3368: static void
3369: _tme_ieee754_partial_single_neg(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
3370: {
3371: int exceptions;
3372:
3373: /* check for a NaN operand: */
3374: if (__tme_predict_false(tme_ieee754_single_check_nan_monadic(ieee754_ctl, src0, dst))) {
3375: return;
3376: }
3377:
3378: /* enter native floating-point operation: */
3379: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3380: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3381:
3382: /* assume that this operation raises no exceptions: */
3383: exceptions = 0;
3384:
3385: /* the operation: */
1.1.1.2 root 3386: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN, -1 * tme_ieee754_single_value_builtin_get(src0));
1.1 root 3387:
3388: /* leave native floating-point operation: */
3389: exceptions |= tme_float_leave();
3390: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3391:
3392: /* signal any exceptions: */
3393: if (exceptions != 0) {
3394: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3395: }
3396: }
3397:
3398: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE) */
3399:
3400: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)
3401:
3402: /* this does a partial compliance single-precision move: */
3403: static void
3404: _tme_ieee754_partial_single_move(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
3405: {
3406: int exceptions;
3407:
3408: /* check for a NaN operand: */
3409: if (__tme_predict_false(tme_ieee754_single_check_nan_monadic(ieee754_ctl, src0, dst))) {
3410: return;
3411: }
3412:
3413: /* enter native floating-point operation: */
3414: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3415: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3416:
3417: /* assume that this operation raises no exceptions: */
3418: exceptions = 0;
3419:
3420: /* the operation: */
3421: *dst = *src0;
3422:
3423: /* leave native floating-point operation: */
3424: exceptions |= tme_float_leave();
3425: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3426:
3427: /* signal any exceptions: */
3428: if (exceptions != 0) {
3429: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3430: }
3431: }
3432:
3433: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE) */
3434:
3435: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)
3436:
3437: /* this does a partial compliance single-precision exp: */
3438: static void
3439: _tme_ieee754_partial_single_exp(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
3440: {
3441: int exceptions;
3442:
3443: /* check for a NaN operand: */
3444: if (__tme_predict_false(tme_ieee754_single_check_nan_monadic(ieee754_ctl, src0, dst))) {
3445: return;
3446: }
3447:
3448: /* enter native floating-point operation: */
3449: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3450: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3451:
3452: /* assume that this operation raises no exceptions: */
3453: exceptions = 0;
3454:
3455: /* the operation: */
3456: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
3457: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, expf(tme_ieee754_single_value_builtin_get(src0)));
3458: #else /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3459: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, exp(tme_ieee754_single_value_builtin_get(src0)));
3460: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3461:
3462: /* leave native floating-point operation: */
3463: exceptions |= tme_float_leave();
3464: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3465:
3466: /* signal any exceptions: */
3467: if (exceptions != 0) {
3468: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3469: }
3470: }
3471:
3472: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE) */
3473:
3474: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)
3475:
3476: /* this does a partial compliance single-precision log10: */
3477: static void
3478: _tme_ieee754_partial_single_log10(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
3479: {
3480: int exceptions;
3481:
3482: /* check for a NaN operand: */
3483: if (__tme_predict_false(tme_ieee754_single_check_nan_monadic(ieee754_ctl, src0, dst))) {
3484: return;
3485: }
3486:
3487: /* enter native floating-point operation: */
3488: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3489: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3490:
3491: /* assume that this operation raises no exceptions: */
3492: exceptions = 0;
3493:
3494: /* the operation: */
3495: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
3496: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, log10f(tme_ieee754_single_value_builtin_get(src0)));
3497: #else /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3498: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, log10(tme_ieee754_single_value_builtin_get(src0)));
3499: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3500:
3501: /* leave native floating-point operation: */
3502: exceptions |= tme_float_leave();
3503: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3504:
3505: /* signal any exceptions: */
3506: if (exceptions != 0) {
3507: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3508: }
3509: }
3510:
3511: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE) */
3512:
3513: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)
3514:
3515: /* this does a partial compliance single-precision log: */
3516: static void
3517: _tme_ieee754_partial_single_log(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
3518: {
3519: int exceptions;
3520:
3521: /* check for a NaN operand: */
3522: if (__tme_predict_false(tme_ieee754_single_check_nan_monadic(ieee754_ctl, src0, dst))) {
3523: return;
3524: }
3525:
3526: /* enter native floating-point operation: */
3527: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3528: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3529:
3530: /* assume that this operation raises no exceptions: */
3531: exceptions = 0;
3532:
3533: /* the operation: */
3534: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
3535: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, logf(tme_ieee754_single_value_builtin_get(src0)));
3536: #else /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3537: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, log(tme_ieee754_single_value_builtin_get(src0)));
3538: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3539:
3540: /* leave native floating-point operation: */
3541: exceptions |= tme_float_leave();
3542: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3543:
3544: /* signal any exceptions: */
3545: if (exceptions != 0) {
3546: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3547: }
3548: }
3549:
3550: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE) */
3551:
3552: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)
3553:
3554: /* this does a partial compliance single-precision scale: */
3555: static void
3556: _tme_ieee754_partial_single_scale(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
3557: {
3558: int exceptions;
3559:
3560: /* check for a NaN operand: */
3561: if (__tme_predict_false(tme_ieee754_single_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
3562: return;
3563: }
3564:
3565: /* enter native floating-point operation: */
3566: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3567: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3568:
3569: /* assume that this operation raises no exceptions: */
3570: exceptions = 0;
3571:
3572: /* the operation: */
3573: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
3574: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, scalbnf(tme_ieee754_single_value_builtin_get(src0), tme_ieee754_single_value_builtin_get(src1)));
3575: #else /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3576: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, scalbn(tme_ieee754_single_value_builtin_get(src0), tme_ieee754_single_value_builtin_get(src1)));
3577: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3578:
3579: /* leave native floating-point operation: */
3580: exceptions |= tme_float_leave();
3581: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3582:
3583: /* signal any exceptions: */
3584: if (exceptions != 0) {
3585: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3586: }
3587: }
3588:
3589: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE) */
3590:
3591: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)
3592:
3593: /* this does a partial compliance single-precision pow: */
3594: static void
3595: _tme_ieee754_partial_single_pow(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
3596: {
3597: int exceptions;
3598:
3599: /* check for a NaN operand: */
3600: if (__tme_predict_false(tme_ieee754_single_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
3601: return;
3602: }
3603:
3604: /* enter native floating-point operation: */
3605: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3606: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3607:
3608: /* assume that this operation raises no exceptions: */
3609: exceptions = 0;
3610:
3611: /* the operation: */
3612: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
3613: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, powf(tme_ieee754_single_value_builtin_get(src0), tme_ieee754_single_value_builtin_get(src1)));
3614: #else /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3615: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, pow(tme_ieee754_single_value_builtin_get(src0), tme_ieee754_single_value_builtin_get(src1)));
3616: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3617:
3618: /* leave native floating-point operation: */
3619: exceptions |= tme_float_leave();
3620: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3621:
3622: /* signal any exceptions: */
3623: if (exceptions != 0) {
3624: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3625: }
3626: }
3627:
3628: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE) */
3629:
3630: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)
3631:
3632: /* this does a partial compliance double-precision add: */
3633: static void
3634: _tme_ieee754_partial_double_add(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
3635: {
3636: int exceptions;
3637:
3638: /* check for a NaN operand: */
3639: if (__tme_predict_false(tme_ieee754_double_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
3640: return;
3641: }
3642:
3643: /* enter native floating-point operation: */
3644: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3645: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3646:
3647: /* assume that this operation raises no exceptions: */
3648: exceptions = 0;
3649:
3650: /* the operation: */
3651: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN, tme_ieee754_double_value_builtin_get(src0) + tme_ieee754_double_value_builtin_get(src1));
3652:
3653: /* leave native floating-point operation: */
3654: exceptions |= tme_float_leave();
3655: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3656:
3657: /* signal any exceptions: */
3658: if (exceptions != 0) {
3659: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3660: }
3661: }
3662:
3663: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE) */
3664:
3665: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)
3666:
3667: /* this does a partial compliance double-precision sub: */
3668: static void
3669: _tme_ieee754_partial_double_sub(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
3670: {
3671: int exceptions;
3672:
3673: /* check for a NaN operand: */
3674: if (__tme_predict_false(tme_ieee754_double_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
3675: return;
3676: }
3677:
3678: /* enter native floating-point operation: */
3679: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3680: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3681:
3682: /* assume that this operation raises no exceptions: */
3683: exceptions = 0;
3684:
3685: /* the operation: */
3686: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN, tme_ieee754_double_value_builtin_get(src0) - tme_ieee754_double_value_builtin_get(src1));
3687:
3688: /* leave native floating-point operation: */
3689: exceptions |= tme_float_leave();
3690: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3691:
3692: /* signal any exceptions: */
3693: if (exceptions != 0) {
3694: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3695: }
3696: }
3697:
3698: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE) */
3699:
3700: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)
3701:
3702: /* this does a partial compliance double-precision mul: */
3703: static void
3704: _tme_ieee754_partial_double_mul(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
3705: {
3706: int exceptions;
3707:
3708: /* check for a NaN operand: */
3709: if (__tme_predict_false(tme_ieee754_double_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
3710: return;
3711: }
3712:
3713: /* enter native floating-point operation: */
3714: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3715: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3716:
3717: /* assume that this operation raises no exceptions: */
3718: exceptions = 0;
3719:
3720: /* the operation: */
3721: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN, tme_ieee754_double_value_builtin_get(src0) * tme_ieee754_double_value_builtin_get(src1));
3722:
3723: /* leave native floating-point operation: */
3724: exceptions |= tme_float_leave();
3725: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3726:
3727: /* signal any exceptions: */
3728: if (exceptions != 0) {
3729: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3730: }
3731: }
3732:
3733: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE) */
3734:
3735: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)
3736:
3737: /* this does a partial compliance double-precision div: */
3738: static void
3739: _tme_ieee754_partial_double_div(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
3740: {
3741: int exceptions;
3742:
3743: /* check for a NaN operand: */
3744: if (__tme_predict_false(tme_ieee754_double_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
3745: return;
3746: }
3747:
3748: /* enter native floating-point operation: */
3749: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3750: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3751:
3752: /* assume that this operation raises no exceptions: */
3753: exceptions = 0;
3754:
3755: /* the operation: */
3756: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN, tme_ieee754_double_value_builtin_get(src0) / tme_ieee754_double_value_builtin_get(src1));
3757:
3758: /* leave native floating-point operation: */
3759: exceptions |= tme_float_leave();
3760: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3761:
3762: /* signal any exceptions: */
3763: if (exceptions != 0) {
3764: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3765: }
3766: }
3767:
3768: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE) */
3769:
3770: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)
3771:
3772: /* this does a partial compliance double-precision sqrt: */
3773: static void
3774: _tme_ieee754_partial_double_sqrt(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
3775: {
3776: int exceptions;
3777:
3778: /* check for a NaN operand: */
3779: if (__tme_predict_false(tme_ieee754_double_check_nan_monadic(ieee754_ctl, src0, dst))) {
3780: return;
3781: }
3782:
3783: /* enter native floating-point operation: */
3784: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3785: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3786:
3787: /* assume that this operation raises no exceptions: */
3788: exceptions = 0;
3789:
3790: /* the operation: */
3791: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
3792: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, sqrtf(tme_ieee754_double_value_builtin_get(src0)));
3793: #else /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3794: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, sqrt(tme_ieee754_double_value_builtin_get(src0)));
3795: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3796:
3797: /* leave native floating-point operation: */
3798: exceptions |= tme_float_leave();
3799: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3800:
3801: /* signal any exceptions: */
3802: if (exceptions != 0) {
3803: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3804: }
3805: }
3806:
3807: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE) */
3808:
3809: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)
3810:
3811: /* this does a partial compliance double-precision abs: */
3812: static void
3813: _tme_ieee754_partial_double_abs(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
3814: {
3815: int exceptions;
3816:
3817: /* check for a NaN operand: */
3818: if (__tme_predict_false(tme_ieee754_double_check_nan_monadic(ieee754_ctl, src0, dst))) {
3819: return;
3820: }
3821:
3822: /* enter native floating-point operation: */
3823: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3824: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3825:
3826: /* assume that this operation raises no exceptions: */
3827: exceptions = 0;
3828:
3829: /* the operation: */
3830: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
3831: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, fabsf(tme_ieee754_double_value_builtin_get(src0)));
3832: #else /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3833: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, fabs(tme_ieee754_double_value_builtin_get(src0)));
3834: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3835:
3836: /* leave native floating-point operation: */
3837: exceptions |= tme_float_leave();
3838: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3839:
3840: /* signal any exceptions: */
3841: if (exceptions != 0) {
3842: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3843: }
3844: }
3845:
3846: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE) */
3847:
3848: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)
3849:
3850: /* this does a partial compliance double-precision neg: */
3851: static void
3852: _tme_ieee754_partial_double_neg(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
3853: {
3854: int exceptions;
3855:
3856: /* check for a NaN operand: */
3857: if (__tme_predict_false(tme_ieee754_double_check_nan_monadic(ieee754_ctl, src0, dst))) {
3858: return;
3859: }
3860:
3861: /* enter native floating-point operation: */
3862: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3863: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3864:
3865: /* assume that this operation raises no exceptions: */
3866: exceptions = 0;
3867:
3868: /* the operation: */
1.1.1.2 root 3869: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN, -1 * tme_ieee754_double_value_builtin_get(src0));
1.1 root 3870:
3871: /* leave native floating-point operation: */
3872: exceptions |= tme_float_leave();
3873: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3874:
3875: /* signal any exceptions: */
3876: if (exceptions != 0) {
3877: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3878: }
3879: }
3880:
3881: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE) */
3882:
3883: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)
3884:
3885: /* this does a partial compliance double-precision move: */
3886: static void
3887: _tme_ieee754_partial_double_move(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
3888: {
3889: int exceptions;
3890:
3891: /* check for a NaN operand: */
3892: if (__tme_predict_false(tme_ieee754_double_check_nan_monadic(ieee754_ctl, src0, dst))) {
3893: return;
3894: }
3895:
3896: /* enter native floating-point operation: */
3897: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3898: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3899:
3900: /* assume that this operation raises no exceptions: */
3901: exceptions = 0;
3902:
3903: /* the operation: */
3904: *dst = *src0;
3905:
3906: /* leave native floating-point operation: */
3907: exceptions |= tme_float_leave();
3908: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3909:
3910: /* signal any exceptions: */
3911: if (exceptions != 0) {
3912: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3913: }
3914: }
3915:
3916: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE) */
3917:
3918: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)
3919:
3920: /* this does a partial compliance double-precision exp: */
3921: static void
3922: _tme_ieee754_partial_double_exp(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
3923: {
3924: int exceptions;
3925:
3926: /* check for a NaN operand: */
3927: if (__tme_predict_false(tme_ieee754_double_check_nan_monadic(ieee754_ctl, src0, dst))) {
3928: return;
3929: }
3930:
3931: /* enter native floating-point operation: */
3932: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3933: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3934:
3935: /* assume that this operation raises no exceptions: */
3936: exceptions = 0;
3937:
3938: /* the operation: */
3939: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
3940: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, expf(tme_ieee754_double_value_builtin_get(src0)));
3941: #else /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3942: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, exp(tme_ieee754_double_value_builtin_get(src0)));
3943: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3944:
3945: /* leave native floating-point operation: */
3946: exceptions |= tme_float_leave();
3947: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3948:
3949: /* signal any exceptions: */
3950: if (exceptions != 0) {
3951: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3952: }
3953: }
3954:
3955: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE) */
3956:
3957: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)
3958:
3959: /* this does a partial compliance double-precision log10: */
3960: static void
3961: _tme_ieee754_partial_double_log10(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
3962: {
3963: int exceptions;
3964:
3965: /* check for a NaN operand: */
3966: if (__tme_predict_false(tme_ieee754_double_check_nan_monadic(ieee754_ctl, src0, dst))) {
3967: return;
3968: }
3969:
3970: /* enter native floating-point operation: */
3971: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
3972: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
3973:
3974: /* assume that this operation raises no exceptions: */
3975: exceptions = 0;
3976:
3977: /* the operation: */
3978: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
3979: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, log10f(tme_ieee754_double_value_builtin_get(src0)));
3980: #else /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3981: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, log10(tme_ieee754_double_value_builtin_get(src0)));
3982: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
3983:
3984: /* leave native floating-point operation: */
3985: exceptions |= tme_float_leave();
3986: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
3987:
3988: /* signal any exceptions: */
3989: if (exceptions != 0) {
3990: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
3991: }
3992: }
3993:
3994: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE) */
3995:
3996: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)
3997:
3998: /* this does a partial compliance double-precision log: */
3999: static void
4000: _tme_ieee754_partial_double_log(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
4001: {
4002: int exceptions;
4003:
4004: /* check for a NaN operand: */
4005: if (__tme_predict_false(tme_ieee754_double_check_nan_monadic(ieee754_ctl, src0, dst))) {
4006: return;
4007: }
4008:
4009: /* enter native floating-point operation: */
4010: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4011: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4012:
4013: /* assume that this operation raises no exceptions: */
4014: exceptions = 0;
4015:
4016: /* the operation: */
4017: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
4018: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, logf(tme_ieee754_double_value_builtin_get(src0)));
4019: #else /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4020: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, log(tme_ieee754_double_value_builtin_get(src0)));
4021: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4022:
4023: /* leave native floating-point operation: */
4024: exceptions |= tme_float_leave();
4025: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4026:
4027: /* signal any exceptions: */
4028: if (exceptions != 0) {
4029: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4030: }
4031: }
4032:
4033: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE) */
4034:
4035: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)
4036:
4037: /* this does a partial compliance double-precision scale: */
4038: static void
4039: _tme_ieee754_partial_double_scale(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
4040: {
4041: int exceptions;
4042:
4043: /* check for a NaN operand: */
4044: if (__tme_predict_false(tme_ieee754_double_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
4045: return;
4046: }
4047:
4048: /* enter native floating-point operation: */
4049: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4050: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4051:
4052: /* assume that this operation raises no exceptions: */
4053: exceptions = 0;
4054:
4055: /* the operation: */
4056: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
4057: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, scalbnf(tme_ieee754_double_value_builtin_get(src0), tme_ieee754_double_value_builtin_get(src1)));
4058: #else /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4059: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, scalbn(tme_ieee754_double_value_builtin_get(src0), tme_ieee754_double_value_builtin_get(src1)));
4060: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4061:
4062: /* leave native floating-point operation: */
4063: exceptions |= tme_float_leave();
4064: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4065:
4066: /* signal any exceptions: */
4067: if (exceptions != 0) {
4068: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4069: }
4070: }
4071:
4072: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE) */
4073:
4074: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)
4075:
4076: /* this does a partial compliance double-precision pow: */
4077: static void
4078: _tme_ieee754_partial_double_pow(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
4079: {
4080: int exceptions;
4081:
4082: /* check for a NaN operand: */
4083: if (__tme_predict_false(tme_ieee754_double_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
4084: return;
4085: }
4086:
4087: /* enter native floating-point operation: */
4088: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4089: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4090:
4091: /* assume that this operation raises no exceptions: */
4092: exceptions = 0;
4093:
4094: /* the operation: */
4095: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
4096: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, powf(tme_ieee754_double_value_builtin_get(src0), tme_ieee754_double_value_builtin_get(src1)));
4097: #else /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4098: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, pow(tme_ieee754_double_value_builtin_get(src0), tme_ieee754_double_value_builtin_get(src1)));
4099: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4100:
4101: /* leave native floating-point operation: */
4102: exceptions |= tme_float_leave();
4103: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4104:
4105: /* signal any exceptions: */
4106: if (exceptions != 0) {
4107: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4108: }
4109: }
4110:
4111: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE) */
4112:
4113: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)
4114:
4115: /* this does a partial compliance extended80-precision add: */
4116: static void
4117: _tme_ieee754_partial_extended80_add(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
4118: {
4119: int exceptions;
4120:
4121: /* check for a NaN operand: */
4122: if (__tme_predict_false(tme_ieee754_extended80_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
4123: return;
4124: }
4125:
4126: /* enter native floating-point operation: */
4127: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4128: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4129:
4130: /* assume that this operation raises no exceptions: */
4131: exceptions = 0;
4132:
4133: /* the operation: */
4134: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN, tme_ieee754_extended80_value_builtin_get(src0) + tme_ieee754_extended80_value_builtin_get(src1));
4135:
4136: /* leave native floating-point operation: */
4137: exceptions |= tme_float_leave();
4138: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4139:
4140: /* signal any exceptions: */
4141: if (exceptions != 0) {
4142: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4143: }
4144: }
4145:
4146: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80) */
4147:
4148: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)
4149:
4150: /* this does a partial compliance extended80-precision sub: */
4151: static void
4152: _tme_ieee754_partial_extended80_sub(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
4153: {
4154: int exceptions;
4155:
4156: /* check for a NaN operand: */
4157: if (__tme_predict_false(tme_ieee754_extended80_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
4158: return;
4159: }
4160:
4161: /* enter native floating-point operation: */
4162: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4163: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4164:
4165: /* assume that this operation raises no exceptions: */
4166: exceptions = 0;
4167:
4168: /* the operation: */
4169: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN, tme_ieee754_extended80_value_builtin_get(src0) - tme_ieee754_extended80_value_builtin_get(src1));
4170:
4171: /* leave native floating-point operation: */
4172: exceptions |= tme_float_leave();
4173: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4174:
4175: /* signal any exceptions: */
4176: if (exceptions != 0) {
4177: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4178: }
4179: }
4180:
4181: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80) */
4182:
4183: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)
4184:
4185: /* this does a partial compliance extended80-precision mul: */
4186: static void
4187: _tme_ieee754_partial_extended80_mul(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
4188: {
4189: int exceptions;
4190:
4191: /* check for a NaN operand: */
4192: if (__tme_predict_false(tme_ieee754_extended80_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
4193: return;
4194: }
4195:
4196: /* enter native floating-point operation: */
4197: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4198: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4199:
4200: /* assume that this operation raises no exceptions: */
4201: exceptions = 0;
4202:
4203: /* the operation: */
4204: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN, tme_ieee754_extended80_value_builtin_get(src0) * tme_ieee754_extended80_value_builtin_get(src1));
4205:
4206: /* leave native floating-point operation: */
4207: exceptions |= tme_float_leave();
4208: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4209:
4210: /* signal any exceptions: */
4211: if (exceptions != 0) {
4212: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4213: }
4214: }
4215:
4216: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80) */
4217:
4218: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)
4219:
4220: /* this does a partial compliance extended80-precision div: */
4221: static void
4222: _tme_ieee754_partial_extended80_div(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
4223: {
4224: int exceptions;
4225:
4226: /* check for a NaN operand: */
4227: if (__tme_predict_false(tme_ieee754_extended80_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
4228: return;
4229: }
4230:
4231: /* enter native floating-point operation: */
4232: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4233: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4234:
4235: /* assume that this operation raises no exceptions: */
4236: exceptions = 0;
4237:
4238: /* the operation: */
4239: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN, tme_ieee754_extended80_value_builtin_get(src0) / tme_ieee754_extended80_value_builtin_get(src1));
4240:
4241: /* leave native floating-point operation: */
4242: exceptions |= tme_float_leave();
4243: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4244:
4245: /* signal any exceptions: */
4246: if (exceptions != 0) {
4247: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4248: }
4249: }
4250:
4251: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80) */
4252:
4253: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)
4254:
4255: /* this does a partial compliance extended80-precision sqrt: */
4256: static void
4257: _tme_ieee754_partial_extended80_sqrt(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
4258: {
4259: int exceptions;
4260:
4261: /* check for a NaN operand: */
4262: if (__tme_predict_false(tme_ieee754_extended80_check_nan_monadic(ieee754_ctl, src0, dst))) {
4263: return;
4264: }
4265:
4266: /* enter native floating-point operation: */
4267: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4268: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4269:
4270: /* assume that this operation raises no exceptions: */
4271: exceptions = 0;
4272:
4273: /* the operation: */
4274: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
4275: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, sqrtf(tme_ieee754_extended80_value_builtin_get(src0)));
4276: #else /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4277: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, sqrt(tme_ieee754_extended80_value_builtin_get(src0)));
4278: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4279:
4280: /* leave native floating-point operation: */
4281: exceptions |= tme_float_leave();
4282: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4283:
4284: /* signal any exceptions: */
4285: if (exceptions != 0) {
4286: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4287: }
4288: }
4289:
4290: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80) */
4291:
4292: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)
4293:
4294: /* this does a partial compliance extended80-precision abs: */
4295: static void
4296: _tme_ieee754_partial_extended80_abs(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
4297: {
4298: int exceptions;
4299:
4300: /* check for a NaN operand: */
4301: if (__tme_predict_false(tme_ieee754_extended80_check_nan_monadic(ieee754_ctl, src0, dst))) {
4302: return;
4303: }
4304:
4305: /* enter native floating-point operation: */
4306: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4307: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4308:
4309: /* assume that this operation raises no exceptions: */
4310: exceptions = 0;
4311:
4312: /* the operation: */
4313: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
4314: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, fabsf(tme_ieee754_extended80_value_builtin_get(src0)));
4315: #else /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4316: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, fabs(tme_ieee754_extended80_value_builtin_get(src0)));
4317: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4318:
4319: /* leave native floating-point operation: */
4320: exceptions |= tme_float_leave();
4321: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4322:
4323: /* signal any exceptions: */
4324: if (exceptions != 0) {
4325: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4326: }
4327: }
4328:
4329: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80) */
4330:
4331: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)
4332:
4333: /* this does a partial compliance extended80-precision neg: */
4334: static void
4335: _tme_ieee754_partial_extended80_neg(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
4336: {
4337: int exceptions;
4338:
4339: /* check for a NaN operand: */
4340: if (__tme_predict_false(tme_ieee754_extended80_check_nan_monadic(ieee754_ctl, src0, dst))) {
4341: return;
4342: }
4343:
4344: /* enter native floating-point operation: */
4345: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4346: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4347:
4348: /* assume that this operation raises no exceptions: */
4349: exceptions = 0;
4350:
4351: /* the operation: */
1.1.1.2 root 4352: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN, -1 * tme_ieee754_extended80_value_builtin_get(src0));
1.1 root 4353:
4354: /* leave native floating-point operation: */
4355: exceptions |= tme_float_leave();
4356: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4357:
4358: /* signal any exceptions: */
4359: if (exceptions != 0) {
4360: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4361: }
4362: }
4363:
4364: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80) */
4365:
4366: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)
4367:
4368: /* this does a partial compliance extended80-precision move: */
4369: static void
4370: _tme_ieee754_partial_extended80_move(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
4371: {
4372: int exceptions;
4373:
4374: /* check for a NaN operand: */
4375: if (__tme_predict_false(tme_ieee754_extended80_check_nan_monadic(ieee754_ctl, src0, dst))) {
4376: return;
4377: }
4378:
4379: /* enter native floating-point operation: */
4380: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4381: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4382:
4383: /* assume that this operation raises no exceptions: */
4384: exceptions = 0;
4385:
4386: /* the operation: */
4387: *dst = *src0;
4388:
4389: /* leave native floating-point operation: */
4390: exceptions |= tme_float_leave();
4391: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4392:
4393: /* signal any exceptions: */
4394: if (exceptions != 0) {
4395: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4396: }
4397: }
4398:
4399: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80) */
4400:
4401: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)
4402:
4403: /* this does a partial compliance extended80-precision exp: */
4404: static void
4405: _tme_ieee754_partial_extended80_exp(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
4406: {
4407: int exceptions;
4408:
4409: /* check for a NaN operand: */
4410: if (__tme_predict_false(tme_ieee754_extended80_check_nan_monadic(ieee754_ctl, src0, dst))) {
4411: return;
4412: }
4413:
4414: /* enter native floating-point operation: */
4415: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4416: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4417:
4418: /* assume that this operation raises no exceptions: */
4419: exceptions = 0;
4420:
4421: /* the operation: */
4422: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
4423: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, expf(tme_ieee754_extended80_value_builtin_get(src0)));
4424: #else /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4425: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, exp(tme_ieee754_extended80_value_builtin_get(src0)));
4426: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4427:
4428: /* leave native floating-point operation: */
4429: exceptions |= tme_float_leave();
4430: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4431:
4432: /* signal any exceptions: */
4433: if (exceptions != 0) {
4434: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4435: }
4436: }
4437:
4438: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80) */
4439:
4440: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)
4441:
4442: /* this does a partial compliance extended80-precision log10: */
4443: static void
4444: _tme_ieee754_partial_extended80_log10(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
4445: {
4446: int exceptions;
4447:
4448: /* check for a NaN operand: */
4449: if (__tme_predict_false(tme_ieee754_extended80_check_nan_monadic(ieee754_ctl, src0, dst))) {
4450: return;
4451: }
4452:
4453: /* enter native floating-point operation: */
4454: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4455: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4456:
4457: /* assume that this operation raises no exceptions: */
4458: exceptions = 0;
4459:
4460: /* the operation: */
4461: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
4462: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, log10f(tme_ieee754_extended80_value_builtin_get(src0)));
4463: #else /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4464: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, log10(tme_ieee754_extended80_value_builtin_get(src0)));
4465: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4466:
4467: /* leave native floating-point operation: */
4468: exceptions |= tme_float_leave();
4469: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4470:
4471: /* signal any exceptions: */
4472: if (exceptions != 0) {
4473: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4474: }
4475: }
4476:
4477: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80) */
4478:
4479: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)
4480:
4481: /* this does a partial compliance extended80-precision log: */
4482: static void
4483: _tme_ieee754_partial_extended80_log(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
4484: {
4485: int exceptions;
4486:
4487: /* check for a NaN operand: */
4488: if (__tme_predict_false(tme_ieee754_extended80_check_nan_monadic(ieee754_ctl, src0, dst))) {
4489: return;
4490: }
4491:
4492: /* enter native floating-point operation: */
4493: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4494: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4495:
4496: /* assume that this operation raises no exceptions: */
4497: exceptions = 0;
4498:
4499: /* the operation: */
4500: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
4501: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, logf(tme_ieee754_extended80_value_builtin_get(src0)));
4502: #else /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4503: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, log(tme_ieee754_extended80_value_builtin_get(src0)));
4504: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4505:
4506: /* leave native floating-point operation: */
4507: exceptions |= tme_float_leave();
4508: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4509:
4510: /* signal any exceptions: */
4511: if (exceptions != 0) {
4512: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4513: }
4514: }
4515:
4516: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80) */
4517:
4518: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)
4519:
4520: /* this does a partial compliance extended80-precision scale: */
4521: static void
4522: _tme_ieee754_partial_extended80_scale(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
4523: {
4524: int exceptions;
4525:
4526: /* check for a NaN operand: */
4527: if (__tme_predict_false(tme_ieee754_extended80_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
4528: return;
4529: }
4530:
4531: /* enter native floating-point operation: */
4532: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4533: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4534:
4535: /* assume that this operation raises no exceptions: */
4536: exceptions = 0;
4537:
4538: /* the operation: */
4539: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
4540: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, scalbnf(tme_ieee754_extended80_value_builtin_get(src0), tme_ieee754_extended80_value_builtin_get(src1)));
4541: #else /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4542: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, scalbn(tme_ieee754_extended80_value_builtin_get(src0), tme_ieee754_extended80_value_builtin_get(src1)));
4543: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4544:
4545: /* leave native floating-point operation: */
4546: exceptions |= tme_float_leave();
4547: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4548:
4549: /* signal any exceptions: */
4550: if (exceptions != 0) {
4551: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4552: }
4553: }
4554:
4555: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80) */
4556:
4557: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)
4558:
4559: /* this does a partial compliance extended80-precision pow: */
4560: static void
4561: _tme_ieee754_partial_extended80_pow(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
4562: {
4563: int exceptions;
4564:
4565: /* check for a NaN operand: */
4566: if (__tme_predict_false(tme_ieee754_extended80_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
4567: return;
4568: }
4569:
4570: /* enter native floating-point operation: */
4571: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4572: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4573:
4574: /* assume that this operation raises no exceptions: */
4575: exceptions = 0;
4576:
4577: /* the operation: */
4578: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
4579: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, powf(tme_ieee754_extended80_value_builtin_get(src0), tme_ieee754_extended80_value_builtin_get(src1)));
4580: #else /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4581: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, pow(tme_ieee754_extended80_value_builtin_get(src0), tme_ieee754_extended80_value_builtin_get(src1)));
4582: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4583:
4584: /* leave native floating-point operation: */
4585: exceptions |= tme_float_leave();
4586: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4587:
4588: /* signal any exceptions: */
4589: if (exceptions != 0) {
4590: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4591: }
4592: }
4593:
4594: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80) */
4595:
4596: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)
4597:
4598: /* this does a partial compliance quad-precision add: */
4599: static void
4600: _tme_ieee754_partial_quad_add(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
4601: {
4602: int exceptions;
4603:
4604: /* check for a NaN operand: */
4605: if (__tme_predict_false(tme_ieee754_quad_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
4606: return;
4607: }
4608:
4609: /* enter native floating-point operation: */
4610: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4611: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4612:
4613: /* assume that this operation raises no exceptions: */
4614: exceptions = 0;
4615:
4616: /* the operation: */
4617: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN, tme_ieee754_quad_value_builtin_get(src0) + tme_ieee754_quad_value_builtin_get(src1));
4618:
4619: /* leave native floating-point operation: */
4620: exceptions |= tme_float_leave();
4621: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4622:
4623: /* signal any exceptions: */
4624: if (exceptions != 0) {
4625: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4626: }
4627: }
4628:
4629: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD) */
4630:
4631: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)
4632:
4633: /* this does a partial compliance quad-precision sub: */
4634: static void
4635: _tme_ieee754_partial_quad_sub(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
4636: {
4637: int exceptions;
4638:
4639: /* check for a NaN operand: */
4640: if (__tme_predict_false(tme_ieee754_quad_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
4641: return;
4642: }
4643:
4644: /* enter native floating-point operation: */
4645: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4646: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4647:
4648: /* assume that this operation raises no exceptions: */
4649: exceptions = 0;
4650:
4651: /* the operation: */
4652: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN, tme_ieee754_quad_value_builtin_get(src0) - tme_ieee754_quad_value_builtin_get(src1));
4653:
4654: /* leave native floating-point operation: */
4655: exceptions |= tme_float_leave();
4656: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4657:
4658: /* signal any exceptions: */
4659: if (exceptions != 0) {
4660: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4661: }
4662: }
4663:
4664: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD) */
4665:
4666: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)
4667:
4668: /* this does a partial compliance quad-precision mul: */
4669: static void
4670: _tme_ieee754_partial_quad_mul(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
4671: {
4672: int exceptions;
4673:
4674: /* check for a NaN operand: */
4675: if (__tme_predict_false(tme_ieee754_quad_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
4676: return;
4677: }
4678:
4679: /* enter native floating-point operation: */
4680: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4681: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4682:
4683: /* assume that this operation raises no exceptions: */
4684: exceptions = 0;
4685:
4686: /* the operation: */
4687: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN, tme_ieee754_quad_value_builtin_get(src0) * tme_ieee754_quad_value_builtin_get(src1));
4688:
4689: /* leave native floating-point operation: */
4690: exceptions |= tme_float_leave();
4691: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4692:
4693: /* signal any exceptions: */
4694: if (exceptions != 0) {
4695: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4696: }
4697: }
4698:
4699: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD) */
4700:
4701: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)
4702:
4703: /* this does a partial compliance quad-precision div: */
4704: static void
4705: _tme_ieee754_partial_quad_div(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
4706: {
4707: int exceptions;
4708:
4709: /* check for a NaN operand: */
4710: if (__tme_predict_false(tme_ieee754_quad_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
4711: return;
4712: }
4713:
4714: /* enter native floating-point operation: */
4715: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4716: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4717:
4718: /* assume that this operation raises no exceptions: */
4719: exceptions = 0;
4720:
4721: /* the operation: */
4722: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN, tme_ieee754_quad_value_builtin_get(src0) / tme_ieee754_quad_value_builtin_get(src1));
4723:
4724: /* leave native floating-point operation: */
4725: exceptions |= tme_float_leave();
4726: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4727:
4728: /* signal any exceptions: */
4729: if (exceptions != 0) {
4730: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4731: }
4732: }
4733:
4734: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD) */
4735:
4736: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)
4737:
4738: /* this does a partial compliance quad-precision sqrt: */
4739: static void
4740: _tme_ieee754_partial_quad_sqrt(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
4741: {
4742: int exceptions;
4743:
4744: /* check for a NaN operand: */
4745: if (__tme_predict_false(tme_ieee754_quad_check_nan_monadic(ieee754_ctl, src0, dst))) {
4746: return;
4747: }
4748:
4749: /* enter native floating-point operation: */
4750: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4751: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4752:
4753: /* assume that this operation raises no exceptions: */
4754: exceptions = 0;
4755:
4756: /* the operation: */
4757: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
4758: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, sqrtf(tme_ieee754_quad_value_builtin_get(src0)));
4759: #else /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4760: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, sqrt(tme_ieee754_quad_value_builtin_get(src0)));
4761: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4762:
4763: /* leave native floating-point operation: */
4764: exceptions |= tme_float_leave();
4765: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4766:
4767: /* signal any exceptions: */
4768: if (exceptions != 0) {
4769: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4770: }
4771: }
4772:
4773: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD) */
4774:
4775: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)
4776:
4777: /* this does a partial compliance quad-precision abs: */
4778: static void
4779: _tme_ieee754_partial_quad_abs(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
4780: {
4781: int exceptions;
4782:
4783: /* check for a NaN operand: */
4784: if (__tme_predict_false(tme_ieee754_quad_check_nan_monadic(ieee754_ctl, src0, dst))) {
4785: return;
4786: }
4787:
4788: /* enter native floating-point operation: */
4789: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4790: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4791:
4792: /* assume that this operation raises no exceptions: */
4793: exceptions = 0;
4794:
4795: /* the operation: */
4796: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
4797: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, fabsf(tme_ieee754_quad_value_builtin_get(src0)));
4798: #else /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4799: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, fabs(tme_ieee754_quad_value_builtin_get(src0)));
4800: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4801:
4802: /* leave native floating-point operation: */
4803: exceptions |= tme_float_leave();
4804: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4805:
4806: /* signal any exceptions: */
4807: if (exceptions != 0) {
4808: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4809: }
4810: }
4811:
4812: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD) */
4813:
4814: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)
4815:
4816: /* this does a partial compliance quad-precision neg: */
4817: static void
4818: _tme_ieee754_partial_quad_neg(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
4819: {
4820: int exceptions;
4821:
4822: /* check for a NaN operand: */
4823: if (__tme_predict_false(tme_ieee754_quad_check_nan_monadic(ieee754_ctl, src0, dst))) {
4824: return;
4825: }
4826:
4827: /* enter native floating-point operation: */
4828: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4829: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4830:
4831: /* assume that this operation raises no exceptions: */
4832: exceptions = 0;
4833:
4834: /* the operation: */
1.1.1.2 root 4835: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN, -1 * tme_ieee754_quad_value_builtin_get(src0));
1.1 root 4836:
4837: /* leave native floating-point operation: */
4838: exceptions |= tme_float_leave();
4839: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4840:
4841: /* signal any exceptions: */
4842: if (exceptions != 0) {
4843: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4844: }
4845: }
4846:
4847: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD) */
4848:
4849: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)
4850:
4851: /* this does a partial compliance quad-precision move: */
4852: static void
4853: _tme_ieee754_partial_quad_move(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
4854: {
4855: int exceptions;
4856:
4857: /* check for a NaN operand: */
4858: if (__tme_predict_false(tme_ieee754_quad_check_nan_monadic(ieee754_ctl, src0, dst))) {
4859: return;
4860: }
4861:
4862: /* enter native floating-point operation: */
4863: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4864: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4865:
4866: /* assume that this operation raises no exceptions: */
4867: exceptions = 0;
4868:
4869: /* the operation: */
4870: *dst = *src0;
4871:
4872: /* leave native floating-point operation: */
4873: exceptions |= tme_float_leave();
4874: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4875:
4876: /* signal any exceptions: */
4877: if (exceptions != 0) {
4878: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4879: }
4880: }
4881:
4882: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD) */
4883:
4884: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)
4885:
4886: /* this does a partial compliance quad-precision exp: */
4887: static void
4888: _tme_ieee754_partial_quad_exp(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
4889: {
4890: int exceptions;
4891:
4892: /* check for a NaN operand: */
4893: if (__tme_predict_false(tme_ieee754_quad_check_nan_monadic(ieee754_ctl, src0, dst))) {
4894: return;
4895: }
4896:
4897: /* enter native floating-point operation: */
4898: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4899: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4900:
4901: /* assume that this operation raises no exceptions: */
4902: exceptions = 0;
4903:
4904: /* the operation: */
4905: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
4906: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, expf(tme_ieee754_quad_value_builtin_get(src0)));
4907: #else /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4908: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, exp(tme_ieee754_quad_value_builtin_get(src0)));
4909: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4910:
4911: /* leave native floating-point operation: */
4912: exceptions |= tme_float_leave();
4913: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4914:
4915: /* signal any exceptions: */
4916: if (exceptions != 0) {
4917: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4918: }
4919: }
4920:
4921: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD) */
4922:
4923: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)
4924:
4925: /* this does a partial compliance quad-precision log10: */
4926: static void
4927: _tme_ieee754_partial_quad_log10(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
4928: {
4929: int exceptions;
4930:
4931: /* check for a NaN operand: */
4932: if (__tme_predict_false(tme_ieee754_quad_check_nan_monadic(ieee754_ctl, src0, dst))) {
4933: return;
4934: }
4935:
4936: /* enter native floating-point operation: */
4937: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4938: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4939:
4940: /* assume that this operation raises no exceptions: */
4941: exceptions = 0;
4942:
4943: /* the operation: */
4944: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
4945: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, log10f(tme_ieee754_quad_value_builtin_get(src0)));
4946: #else /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4947: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, log10(tme_ieee754_quad_value_builtin_get(src0)));
4948: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4949:
4950: /* leave native floating-point operation: */
4951: exceptions |= tme_float_leave();
4952: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4953:
4954: /* signal any exceptions: */
4955: if (exceptions != 0) {
4956: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4957: }
4958: }
4959:
4960: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD) */
4961:
4962: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)
4963:
4964: /* this does a partial compliance quad-precision log: */
4965: static void
4966: _tme_ieee754_partial_quad_log(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
4967: {
4968: int exceptions;
4969:
4970: /* check for a NaN operand: */
4971: if (__tme_predict_false(tme_ieee754_quad_check_nan_monadic(ieee754_ctl, src0, dst))) {
4972: return;
4973: }
4974:
4975: /* enter native floating-point operation: */
4976: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
4977: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
4978:
4979: /* assume that this operation raises no exceptions: */
4980: exceptions = 0;
4981:
4982: /* the operation: */
4983: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
4984: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, logf(tme_ieee754_quad_value_builtin_get(src0)));
4985: #else /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4986: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, log(tme_ieee754_quad_value_builtin_get(src0)));
4987: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
4988:
4989: /* leave native floating-point operation: */
4990: exceptions |= tme_float_leave();
4991: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
4992:
4993: /* signal any exceptions: */
4994: if (exceptions != 0) {
4995: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
4996: }
4997: }
4998:
4999: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD) */
5000:
5001: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)
5002:
5003: /* this does a partial compliance quad-precision scale: */
5004: static void
5005: _tme_ieee754_partial_quad_scale(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
5006: {
5007: int exceptions;
5008:
5009: /* check for a NaN operand: */
5010: if (__tme_predict_false(tme_ieee754_quad_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
5011: return;
5012: }
5013:
5014: /* enter native floating-point operation: */
5015: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
5016: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
5017:
5018: /* assume that this operation raises no exceptions: */
5019: exceptions = 0;
5020:
5021: /* the operation: */
5022: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
5023: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, scalbnf(tme_ieee754_quad_value_builtin_get(src0), tme_ieee754_quad_value_builtin_get(src1)));
5024: #else /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
5025: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, scalbn(tme_ieee754_quad_value_builtin_get(src0), tme_ieee754_quad_value_builtin_get(src1)));
5026: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
5027:
5028: /* leave native floating-point operation: */
5029: exceptions |= tme_float_leave();
5030: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
5031:
5032: /* signal any exceptions: */
5033: if (exceptions != 0) {
5034: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
5035: }
5036: }
5037:
5038: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD) */
5039:
5040: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)
5041:
5042: /* this does a partial compliance quad-precision pow: */
5043: static void
5044: _tme_ieee754_partial_quad_pow(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
5045: {
5046: int exceptions;
5047:
5048: /* check for a NaN operand: */
5049: if (__tme_predict_false(tme_ieee754_quad_check_nan_dyadic(ieee754_ctl, src0, src1, dst))) {
5050: return;
5051: }
5052:
5053: /* enter native floating-point operation: */
5054: tme_float_enter(ieee754_ctl->tme_ieee754_ctl_rounding_mode, tme_ieee754_exception_float, ieee754_ctl);
5055: ieee754_ctl->tme_ieee754_ctl_lock_unlock = tme_float_leave;
5056:
5057: /* assume that this operation raises no exceptions: */
5058: exceptions = 0;
5059:
5060: /* the operation: */
5061: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
5062: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, powf(tme_ieee754_quad_value_builtin_get(src0), tme_ieee754_quad_value_builtin_get(src1)));
5063: #else /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
5064: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, pow(tme_ieee754_quad_value_builtin_get(src0), tme_ieee754_quad_value_builtin_get(src1)));
5065: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
5066:
5067: /* leave native floating-point operation: */
5068: exceptions |= tme_float_leave();
5069: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
5070:
5071: /* signal any exceptions: */
5072: if (exceptions != 0) {
5073: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
5074: }
5075: }
5076:
5077: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD) */
5078:
5079: /* the partial compliance operations: */
5080: _tme_const struct tme_ieee754_ops tme_ieee754_ops_partial = {
5081:
5082: /* the version of this structure: */
5083: TME_X_VERSION(0, 0),
5084:
5085: /* this does a partial compliance single-precision add: */
5086: #if ((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE))
5087: _tme_ieee754_partial_single_add,
5088: #else /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5089: _tme_ieee754_strict_single_add,
5090: #endif /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5091:
5092: /* this does a partial compliance single-precision sub: */
5093: #if ((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE))
5094: _tme_ieee754_partial_single_sub,
5095: #else /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5096: _tme_ieee754_strict_single_sub,
5097: #endif /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5098:
5099: /* this does a partial compliance single-precision mul: */
5100: #if ((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE))
5101: _tme_ieee754_partial_single_mul,
5102: #else /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5103: _tme_ieee754_strict_single_mul,
5104: #endif /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5105:
5106: /* this does a partial compliance single-precision div: */
5107: #if ((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE))
5108: _tme_ieee754_partial_single_div,
5109: #else /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5110: _tme_ieee754_strict_single_div,
5111: #endif /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5112:
5113: /* this does a partial compliance single-precision rem: */
5114: _tme_ieee754_strict_single_rem,
5115:
5116: /* this does a partial compliance single-precision sqrt: */
5117: #if ((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE))
5118: _tme_ieee754_partial_single_sqrt,
5119: #else /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5120: _tme_ieee754_strict_single_sqrt,
5121: #endif /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5122:
5123: /* this does a partial compliance single-precision abs: */
5124: #if ((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE))
5125: _tme_ieee754_partial_single_abs,
5126: #else /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5127: NULL,
5128: #endif /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5129:
5130: /* this does a partial compliance single-precision neg: */
5131: #if ((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE))
5132: _tme_ieee754_partial_single_neg,
5133: #else /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5134: _tme_ieee754_strict_single_neg,
5135: #endif /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5136:
5137: /* this does a partial compliance single-precision move: */
5138: #if ((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE))
5139: _tme_ieee754_partial_single_move,
5140: #else /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5141: _tme_ieee754_strict_single_move,
5142: #endif /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5143:
5144: /* this does a partial compliance single-precision rint: */
5145: _tme_ieee754_strict_single_rint,
5146:
5147: /* this does a partial compliance single-precision cos: */
5148: NULL,
5149:
5150: /* this does a partial compliance single-precision acos: */
5151: NULL,
5152:
5153: /* this does a partial compliance single-precision cosh: */
5154: NULL,
5155:
5156: /* this does a partial compliance single-precision sin: */
5157: NULL,
5158:
5159: /* this does a partial compliance single-precision asin: */
5160: NULL,
5161:
5162: /* this does a partial compliance single-precision sinh: */
5163: NULL,
5164:
5165: /* this does a partial compliance single-precision tan: */
5166: NULL,
5167:
5168: /* this does a partial compliance single-precision atan: */
5169: NULL,
5170:
5171: /* this does a partial compliance single-precision tanh: */
5172: NULL,
5173:
5174: /* this does a partial compliance single-precision atanh: */
5175: NULL,
5176:
5177: /* this does a partial compliance single-precision exp: */
5178: #if ((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE))
5179: _tme_ieee754_partial_single_exp,
5180: #else /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5181: NULL,
5182: #endif /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5183:
5184: /* this does a partial compliance single-precision expm1: */
5185: NULL,
5186:
5187: /* this does a partial compliance single-precision log10: */
5188: #if ((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE))
5189: _tme_ieee754_partial_single_log10,
5190: #else /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5191: NULL,
5192: #endif /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5193:
5194: /* this does a partial compliance single-precision log: */
5195: #if ((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE))
5196: _tme_ieee754_partial_single_log,
5197: #else /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5198: NULL,
5199: #endif /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5200:
5201: /* this does a partial compliance single-precision log1p: */
5202: NULL,
5203:
5204: /* this does a partial compliance single-precision getexp: */
5205: _tme_ieee754_strict_single_getexp,
5206:
5207: /* this does a partial compliance single-precision getman: */
5208: _tme_ieee754_strict_single_getman,
5209:
5210: /* this does a partial compliance single-precision scale: */
5211: #if ((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE))
5212: _tme_ieee754_partial_single_scale,
5213: #else /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5214: NULL,
5215: #endif /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5216:
5217: /* this does a partial compliance single-precision pow: */
5218: #if ((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE))
5219: _tme_ieee754_partial_single_pow,
5220: #else /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5221: NULL,
5222: #endif /* !((TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_SINGLE)) */
5223:
5224: /* this does a partial compliance single-precision from_double: */
5225: _tme_ieee754_strict_single_from_double,
5226:
5227: /* this does a partial compliance single-precision from_extended80: */
5228: _tme_ieee754_strict_single_from_extended80,
5229:
5230: /* this does a partial compliance single-precision from_quad: */
5231: _tme_ieee754_strict_single_from_quad,
5232:
1.1.1.2 root 5233: /* this does a partial compliance single-precision from_int32: */
5234: _tme_ieee754_strict_single_from_int32,
5235:
5236: /* this does a partial compliance single-precision from_int64: */
5237: #if (defined(TME_HAVE_INT64_T))
5238: _tme_ieee754_strict_single_from_int64,
5239: #else /* !(defined(TME_HAVE_INT64_T)) */
5240: NULL,
5241: #endif /* !(defined(TME_HAVE_INT64_T)) */
5242:
1.1 root 5243: /* this does a partial compliance single-precision to_int32: */
5244: _tme_ieee754_strict_single_to_int32,
5245:
5246: /* this does a partial compliance single-precision to_int64: */
1.1.1.3 ! root 5247: #if (defined(TME_HAVE_INT64_T))
! 5248: _tme_ieee754_strict_single_to_int64,
! 5249: #else /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 5250: NULL,
1.1.1.3 ! root 5251: #endif /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 5252:
5253: /* this does a partial compliance double-precision add: */
5254: #if ((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE))
5255: _tme_ieee754_partial_double_add,
5256: #else /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5257: _tme_ieee754_strict_double_add,
5258: #endif /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5259:
5260: /* this does a partial compliance double-precision sub: */
5261: #if ((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE))
5262: _tme_ieee754_partial_double_sub,
5263: #else /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5264: _tme_ieee754_strict_double_sub,
5265: #endif /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5266:
5267: /* this does a partial compliance double-precision mul: */
5268: #if ((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE))
5269: _tme_ieee754_partial_double_mul,
5270: #else /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5271: _tme_ieee754_strict_double_mul,
5272: #endif /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5273:
5274: /* this does a partial compliance double-precision div: */
5275: #if ((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE))
5276: _tme_ieee754_partial_double_div,
5277: #else /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5278: _tme_ieee754_strict_double_div,
5279: #endif /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5280:
5281: /* this does a partial compliance double-precision rem: */
5282: _tme_ieee754_strict_double_rem,
5283:
5284: /* this does a partial compliance double-precision sqrt: */
5285: #if ((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE))
5286: _tme_ieee754_partial_double_sqrt,
5287: #else /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5288: _tme_ieee754_strict_double_sqrt,
5289: #endif /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5290:
5291: /* this does a partial compliance double-precision abs: */
5292: #if ((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE))
5293: _tme_ieee754_partial_double_abs,
5294: #else /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5295: NULL,
5296: #endif /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5297:
5298: /* this does a partial compliance double-precision neg: */
5299: #if ((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE))
5300: _tme_ieee754_partial_double_neg,
5301: #else /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5302: _tme_ieee754_strict_double_neg,
5303: #endif /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5304:
5305: /* this does a partial compliance double-precision move: */
5306: #if ((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE))
5307: _tme_ieee754_partial_double_move,
5308: #else /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5309: _tme_ieee754_strict_double_move,
5310: #endif /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5311:
5312: /* this does a partial compliance double-precision rint: */
5313: _tme_ieee754_strict_double_rint,
5314:
5315: /* this does a partial compliance double-precision cos: */
5316: NULL,
5317:
5318: /* this does a partial compliance double-precision acos: */
5319: NULL,
5320:
5321: /* this does a partial compliance double-precision cosh: */
5322: NULL,
5323:
5324: /* this does a partial compliance double-precision sin: */
5325: NULL,
5326:
5327: /* this does a partial compliance double-precision asin: */
5328: NULL,
5329:
5330: /* this does a partial compliance double-precision sinh: */
5331: NULL,
5332:
5333: /* this does a partial compliance double-precision tan: */
5334: NULL,
5335:
5336: /* this does a partial compliance double-precision atan: */
5337: NULL,
5338:
5339: /* this does a partial compliance double-precision tanh: */
5340: NULL,
5341:
5342: /* this does a partial compliance double-precision atanh: */
5343: NULL,
5344:
5345: /* this does a partial compliance double-precision exp: */
5346: #if ((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE))
5347: _tme_ieee754_partial_double_exp,
5348: #else /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5349: NULL,
5350: #endif /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5351:
5352: /* this does a partial compliance double-precision expm1: */
5353: NULL,
5354:
5355: /* this does a partial compliance double-precision log10: */
5356: #if ((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE))
5357: _tme_ieee754_partial_double_log10,
5358: #else /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5359: NULL,
5360: #endif /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5361:
5362: /* this does a partial compliance double-precision log: */
5363: #if ((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE))
5364: _tme_ieee754_partial_double_log,
5365: #else /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5366: NULL,
5367: #endif /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5368:
5369: /* this does a partial compliance double-precision log1p: */
5370: NULL,
5371:
5372: /* this does a partial compliance double-precision getexp: */
5373: _tme_ieee754_strict_double_getexp,
5374:
5375: /* this does a partial compliance double-precision getman: */
5376: _tme_ieee754_strict_double_getman,
5377:
5378: /* this does a partial compliance double-precision scale: */
5379: #if ((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE))
5380: _tme_ieee754_partial_double_scale,
5381: #else /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5382: NULL,
5383: #endif /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5384:
5385: /* this does a partial compliance double-precision pow: */
5386: #if ((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE))
5387: _tme_ieee754_partial_double_pow,
5388: #else /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5389: NULL,
5390: #endif /* !((TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_IEEE754_DOUBLE)) */
5391:
5392: /* this does a partial compliance double-precision from_single: */
5393: _tme_ieee754_strict_double_from_single,
5394:
5395: /* this does a partial compliance double-precision from_extended80: */
5396: _tme_ieee754_strict_double_from_extended80,
5397:
5398: /* this does a partial compliance double-precision from_quad: */
5399: _tme_ieee754_strict_double_from_quad,
5400:
1.1.1.2 root 5401: /* this does a partial compliance double-precision from_int32: */
5402: _tme_ieee754_strict_double_from_int32,
5403:
5404: /* this does a partial compliance double-precision from_int64: */
5405: #if (defined(TME_HAVE_INT64_T))
5406: _tme_ieee754_strict_double_from_int64,
5407: #else /* !(defined(TME_HAVE_INT64_T)) */
5408: NULL,
5409: #endif /* !(defined(TME_HAVE_INT64_T)) */
5410:
1.1 root 5411: /* this does a partial compliance double-precision to_int32: */
5412: _tme_ieee754_strict_double_to_int32,
5413:
5414: /* this does a partial compliance double-precision to_int64: */
1.1.1.3 ! root 5415: #if (defined(TME_HAVE_INT64_T))
! 5416: _tme_ieee754_strict_double_to_int64,
! 5417: #else /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 5418: NULL,
1.1.1.3 ! root 5419: #endif /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 5420:
5421: /* this does a partial compliance extended80-precision add: */
5422: #if ((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80))
5423: _tme_ieee754_partial_extended80_add,
5424: #else /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5425: #if (defined(TME_HAVE_INT64_T))
5426: _tme_ieee754_strict_extended80_add,
5427: #else /* !(defined(TME_HAVE_INT64_T)) */
5428: NULL,
5429: #endif /* !(defined(TME_HAVE_INT64_T)) */
5430: #endif /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5431:
5432: /* this does a partial compliance extended80-precision sub: */
5433: #if ((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80))
5434: _tme_ieee754_partial_extended80_sub,
5435: #else /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5436: #if (defined(TME_HAVE_INT64_T))
5437: _tme_ieee754_strict_extended80_sub,
5438: #else /* !(defined(TME_HAVE_INT64_T)) */
5439: NULL,
5440: #endif /* !(defined(TME_HAVE_INT64_T)) */
5441: #endif /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5442:
5443: /* this does a partial compliance extended80-precision mul: */
5444: #if ((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80))
5445: _tme_ieee754_partial_extended80_mul,
5446: #else /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5447: #if (defined(TME_HAVE_INT64_T))
5448: _tme_ieee754_strict_extended80_mul,
5449: #else /* !(defined(TME_HAVE_INT64_T)) */
5450: NULL,
5451: #endif /* !(defined(TME_HAVE_INT64_T)) */
5452: #endif /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5453:
5454: /* this does a partial compliance extended80-precision div: */
5455: #if ((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80))
5456: _tme_ieee754_partial_extended80_div,
5457: #else /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5458: #if (defined(TME_HAVE_INT64_T))
5459: _tme_ieee754_strict_extended80_div,
5460: #else /* !(defined(TME_HAVE_INT64_T)) */
5461: NULL,
5462: #endif /* !(defined(TME_HAVE_INT64_T)) */
5463: #endif /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5464:
5465: /* this does a partial compliance extended80-precision rem: */
5466: #if (defined(TME_HAVE_INT64_T))
5467: _tme_ieee754_strict_extended80_rem,
5468: #else /* !(defined(TME_HAVE_INT64_T)) */
5469: NULL,
5470: #endif /* !(defined(TME_HAVE_INT64_T)) */
5471:
5472: /* this does a partial compliance extended80-precision sqrt: */
5473: #if ((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80))
5474: _tme_ieee754_partial_extended80_sqrt,
5475: #else /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5476: #if (defined(TME_HAVE_INT64_T))
5477: _tme_ieee754_strict_extended80_sqrt,
5478: #else /* !(defined(TME_HAVE_INT64_T)) */
5479: NULL,
5480: #endif /* !(defined(TME_HAVE_INT64_T)) */
5481: #endif /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5482:
5483: /* this does a partial compliance extended80-precision abs: */
5484: #if ((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80))
5485: _tme_ieee754_partial_extended80_abs,
5486: #else /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5487: NULL,
5488: #endif /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5489:
5490: /* this does a partial compliance extended80-precision neg: */
5491: #if ((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80))
5492: _tme_ieee754_partial_extended80_neg,
5493: #else /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5494: #if (defined(TME_HAVE_INT64_T))
5495: _tme_ieee754_strict_extended80_neg,
5496: #else /* !(defined(TME_HAVE_INT64_T)) */
5497: NULL,
5498: #endif /* !(defined(TME_HAVE_INT64_T)) */
5499: #endif /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5500:
5501: /* this does a partial compliance extended80-precision move: */
5502: #if ((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80))
5503: _tme_ieee754_partial_extended80_move,
5504: #else /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5505: #if (defined(TME_HAVE_INT64_T))
5506: _tme_ieee754_strict_extended80_move,
5507: #else /* !(defined(TME_HAVE_INT64_T)) */
5508: NULL,
5509: #endif /* !(defined(TME_HAVE_INT64_T)) */
5510: #endif /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5511:
5512: /* this does a partial compliance extended80-precision rint: */
5513: #if (defined(TME_HAVE_INT64_T))
5514: _tme_ieee754_strict_extended80_rint,
5515: #else /* !(defined(TME_HAVE_INT64_T)) */
5516: NULL,
5517: #endif /* !(defined(TME_HAVE_INT64_T)) */
5518:
5519: /* this does a partial compliance extended80-precision cos: */
5520: NULL,
5521:
5522: /* this does a partial compliance extended80-precision acos: */
5523: NULL,
5524:
5525: /* this does a partial compliance extended80-precision cosh: */
5526: NULL,
5527:
5528: /* this does a partial compliance extended80-precision sin: */
5529: NULL,
5530:
5531: /* this does a partial compliance extended80-precision asin: */
5532: NULL,
5533:
5534: /* this does a partial compliance extended80-precision sinh: */
5535: NULL,
5536:
5537: /* this does a partial compliance extended80-precision tan: */
5538: NULL,
5539:
5540: /* this does a partial compliance extended80-precision atan: */
5541: NULL,
5542:
5543: /* this does a partial compliance extended80-precision tanh: */
5544: NULL,
5545:
5546: /* this does a partial compliance extended80-precision atanh: */
5547: NULL,
5548:
5549: /* this does a partial compliance extended80-precision exp: */
5550: #if ((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80))
5551: _tme_ieee754_partial_extended80_exp,
5552: #else /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5553: NULL,
5554: #endif /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5555:
5556: /* this does a partial compliance extended80-precision expm1: */
5557: NULL,
5558:
5559: /* this does a partial compliance extended80-precision log10: */
5560: #if ((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80))
5561: _tme_ieee754_partial_extended80_log10,
5562: #else /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5563: NULL,
5564: #endif /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5565:
5566: /* this does a partial compliance extended80-precision log: */
5567: #if ((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80))
5568: _tme_ieee754_partial_extended80_log,
5569: #else /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5570: NULL,
5571: #endif /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5572:
5573: /* this does a partial compliance extended80-precision log1p: */
5574: NULL,
5575:
5576: /* this does a partial compliance extended80-precision getexp: */
5577: _tme_ieee754_strict_extended80_getexp,
5578:
5579: /* this does a partial compliance extended80-precision getman: */
5580: _tme_ieee754_strict_extended80_getman,
5581:
5582: /* this does a partial compliance extended80-precision scale: */
5583: #if ((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80))
5584: _tme_ieee754_partial_extended80_scale,
5585: #else /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5586: NULL,
5587: #endif /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5588:
5589: /* this does a partial compliance extended80-precision pow: */
5590: #if ((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80))
5591: _tme_ieee754_partial_extended80_pow,
5592: #else /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5593: NULL,
5594: #endif /* !((TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_IEEE754_EXTENDED80)) */
5595:
5596: /* this does a partial compliance extended80-precision from_single: */
5597: #if (defined(TME_HAVE_INT64_T))
5598: _tme_ieee754_strict_extended80_from_single,
5599: #else /* !(defined(TME_HAVE_INT64_T)) */
5600: NULL,
5601: #endif /* !(defined(TME_HAVE_INT64_T)) */
5602:
5603: /* this does a partial compliance extended80-precision from_double: */
5604: #if (defined(TME_HAVE_INT64_T))
5605: _tme_ieee754_strict_extended80_from_double,
5606: #else /* !(defined(TME_HAVE_INT64_T)) */
5607: NULL,
5608: #endif /* !(defined(TME_HAVE_INT64_T)) */
5609:
5610: /* this does a partial compliance extended80-precision from_quad: */
5611: #if (defined(TME_HAVE_INT64_T))
5612: _tme_ieee754_strict_extended80_from_quad,
5613: #else /* !(defined(TME_HAVE_INT64_T)) */
5614: NULL,
5615: #endif /* !(defined(TME_HAVE_INT64_T)) */
5616:
1.1.1.2 root 5617: /* this does a partial compliance extended80-precision from_int32: */
5618: #if (defined(TME_HAVE_INT64_T))
5619: _tme_ieee754_strict_extended80_from_int32,
5620: #else /* !(defined(TME_HAVE_INT64_T)) */
5621: NULL,
5622: #endif /* !(defined(TME_HAVE_INT64_T)) */
5623:
5624: /* this does a partial compliance extended80-precision from_int64: */
5625: #if (defined(TME_HAVE_INT64_T))
5626: _tme_ieee754_strict_extended80_from_int64,
5627: #else /* !(defined(TME_HAVE_INT64_T)) */
5628: NULL,
5629: #endif /* !(defined(TME_HAVE_INT64_T)) */
5630:
1.1 root 5631: /* this does a partial compliance extended80-precision to_int32: */
5632: _tme_ieee754_strict_extended80_to_int32,
5633:
5634: /* this does a partial compliance extended80-precision to_int64: */
1.1.1.3 ! root 5635: #if (defined(TME_HAVE_INT64_T))
! 5636: _tme_ieee754_strict_extended80_to_int64,
! 5637: #else /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 5638: NULL,
1.1.1.3 ! root 5639: #endif /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 5640:
5641: /* this does a partial compliance quad-precision add: */
5642: #if ((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD))
5643: _tme_ieee754_partial_quad_add,
5644: #else /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5645: #if (defined(TME_HAVE_INT64_T))
5646: _tme_ieee754_strict_quad_add,
5647: #else /* !(defined(TME_HAVE_INT64_T)) */
5648: NULL,
5649: #endif /* !(defined(TME_HAVE_INT64_T)) */
5650: #endif /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5651:
5652: /* this does a partial compliance quad-precision sub: */
5653: #if ((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD))
5654: _tme_ieee754_partial_quad_sub,
5655: #else /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5656: #if (defined(TME_HAVE_INT64_T))
5657: _tme_ieee754_strict_quad_sub,
5658: #else /* !(defined(TME_HAVE_INT64_T)) */
5659: NULL,
5660: #endif /* !(defined(TME_HAVE_INT64_T)) */
5661: #endif /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5662:
5663: /* this does a partial compliance quad-precision mul: */
5664: #if ((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD))
5665: _tme_ieee754_partial_quad_mul,
5666: #else /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5667: #if (defined(TME_HAVE_INT64_T))
5668: _tme_ieee754_strict_quad_mul,
5669: #else /* !(defined(TME_HAVE_INT64_T)) */
5670: NULL,
5671: #endif /* !(defined(TME_HAVE_INT64_T)) */
5672: #endif /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5673:
5674: /* this does a partial compliance quad-precision div: */
5675: #if ((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD))
5676: _tme_ieee754_partial_quad_div,
5677: #else /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5678: #if (defined(TME_HAVE_INT64_T))
5679: _tme_ieee754_strict_quad_div,
5680: #else /* !(defined(TME_HAVE_INT64_T)) */
5681: NULL,
5682: #endif /* !(defined(TME_HAVE_INT64_T)) */
5683: #endif /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5684:
5685: /* this does a partial compliance quad-precision rem: */
5686: #if (defined(TME_HAVE_INT64_T))
5687: _tme_ieee754_strict_quad_rem,
5688: #else /* !(defined(TME_HAVE_INT64_T)) */
5689: NULL,
5690: #endif /* !(defined(TME_HAVE_INT64_T)) */
5691:
5692: /* this does a partial compliance quad-precision sqrt: */
5693: #if ((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD))
5694: _tme_ieee754_partial_quad_sqrt,
5695: #else /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5696: #if (defined(TME_HAVE_INT64_T))
5697: _tme_ieee754_strict_quad_sqrt,
5698: #else /* !(defined(TME_HAVE_INT64_T)) */
5699: NULL,
5700: #endif /* !(defined(TME_HAVE_INT64_T)) */
5701: #endif /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5702:
5703: /* this does a partial compliance quad-precision abs: */
5704: #if ((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD))
5705: _tme_ieee754_partial_quad_abs,
5706: #else /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5707: NULL,
5708: #endif /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5709:
5710: /* this does a partial compliance quad-precision neg: */
5711: #if ((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD))
5712: _tme_ieee754_partial_quad_neg,
5713: #else /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5714: #if (defined(TME_HAVE_INT64_T))
5715: _tme_ieee754_strict_quad_neg,
5716: #else /* !(defined(TME_HAVE_INT64_T)) */
5717: NULL,
5718: #endif /* !(defined(TME_HAVE_INT64_T)) */
5719: #endif /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5720:
5721: /* this does a partial compliance quad-precision move: */
5722: #if ((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD))
5723: _tme_ieee754_partial_quad_move,
5724: #else /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5725: #if (defined(TME_HAVE_INT64_T))
5726: _tme_ieee754_strict_quad_move,
5727: #else /* !(defined(TME_HAVE_INT64_T)) */
5728: NULL,
5729: #endif /* !(defined(TME_HAVE_INT64_T)) */
5730: #endif /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5731:
5732: /* this does a partial compliance quad-precision rint: */
5733: #if (defined(TME_HAVE_INT64_T))
5734: _tme_ieee754_strict_quad_rint,
5735: #else /* !(defined(TME_HAVE_INT64_T)) */
5736: NULL,
5737: #endif /* !(defined(TME_HAVE_INT64_T)) */
5738:
5739: /* this does a partial compliance quad-precision cos: */
5740: NULL,
5741:
5742: /* this does a partial compliance quad-precision acos: */
5743: NULL,
5744:
5745: /* this does a partial compliance quad-precision cosh: */
5746: NULL,
5747:
5748: /* this does a partial compliance quad-precision sin: */
5749: NULL,
5750:
5751: /* this does a partial compliance quad-precision asin: */
5752: NULL,
5753:
5754: /* this does a partial compliance quad-precision sinh: */
5755: NULL,
5756:
5757: /* this does a partial compliance quad-precision tan: */
5758: NULL,
5759:
5760: /* this does a partial compliance quad-precision atan: */
5761: NULL,
5762:
5763: /* this does a partial compliance quad-precision tanh: */
5764: NULL,
5765:
5766: /* this does a partial compliance quad-precision atanh: */
5767: NULL,
5768:
5769: /* this does a partial compliance quad-precision exp: */
5770: #if ((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD))
5771: _tme_ieee754_partial_quad_exp,
5772: #else /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5773: NULL,
5774: #endif /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5775:
5776: /* this does a partial compliance quad-precision expm1: */
5777: NULL,
5778:
5779: /* this does a partial compliance quad-precision log10: */
5780: #if ((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD))
5781: _tme_ieee754_partial_quad_log10,
5782: #else /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5783: NULL,
5784: #endif /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5785:
5786: /* this does a partial compliance quad-precision log: */
5787: #if ((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD))
5788: _tme_ieee754_partial_quad_log,
5789: #else /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5790: NULL,
5791: #endif /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5792:
5793: /* this does a partial compliance quad-precision log1p: */
5794: NULL,
5795:
5796: /* this does a partial compliance quad-precision getexp: */
5797: _tme_ieee754_strict_quad_getexp,
5798:
5799: /* this does a partial compliance quad-precision getman: */
5800: _tme_ieee754_strict_quad_getman,
5801:
5802: /* this does a partial compliance quad-precision scale: */
5803: #if ((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD))
5804: _tme_ieee754_partial_quad_scale,
5805: #else /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5806: NULL,
5807: #endif /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5808:
5809: /* this does a partial compliance quad-precision pow: */
5810: #if ((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD))
5811: _tme_ieee754_partial_quad_pow,
5812: #else /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5813: NULL,
5814: #endif /* !((TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_IEEE754_QUAD)) */
5815:
5816: /* this does a partial compliance quad-precision from_single: */
5817: #if (defined(TME_HAVE_INT64_T))
5818: _tme_ieee754_strict_quad_from_single,
5819: #else /* !(defined(TME_HAVE_INT64_T)) */
5820: NULL,
5821: #endif /* !(defined(TME_HAVE_INT64_T)) */
5822:
5823: /* this does a partial compliance quad-precision from_double: */
5824: #if (defined(TME_HAVE_INT64_T))
5825: _tme_ieee754_strict_quad_from_double,
5826: #else /* !(defined(TME_HAVE_INT64_T)) */
5827: NULL,
5828: #endif /* !(defined(TME_HAVE_INT64_T)) */
5829:
5830: /* this does a partial compliance quad-precision from_extended80: */
5831: #if (defined(TME_HAVE_INT64_T))
5832: _tme_ieee754_strict_quad_from_extended80,
5833: #else /* !(defined(TME_HAVE_INT64_T)) */
5834: NULL,
5835: #endif /* !(defined(TME_HAVE_INT64_T)) */
5836:
1.1.1.2 root 5837: /* this does a partial compliance quad-precision from_int32: */
5838: #if (defined(TME_HAVE_INT64_T))
5839: _tme_ieee754_strict_quad_from_int32,
5840: #else /* !(defined(TME_HAVE_INT64_T)) */
5841: NULL,
5842: #endif /* !(defined(TME_HAVE_INT64_T)) */
5843:
5844: /* this does a partial compliance quad-precision from_int64: */
5845: #if (defined(TME_HAVE_INT64_T))
5846: _tme_ieee754_strict_quad_from_int64,
5847: #else /* !(defined(TME_HAVE_INT64_T)) */
5848: NULL,
5849: #endif /* !(defined(TME_HAVE_INT64_T)) */
5850:
1.1 root 5851: /* this does a partial compliance quad-precision to_int32: */
5852: _tme_ieee754_strict_quad_to_int32,
5853:
5854: /* this does a partial compliance quad-precision to_int64: */
1.1.1.3 ! root 5855: #if (defined(TME_HAVE_INT64_T))
! 5856: _tme_ieee754_strict_quad_to_int64,
! 5857: #else /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 5858: NULL,
1.1.1.3 ! root 5859: #endif /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 5860: };
5861:
5862: /* this does a unknown compliance single-precision add: */
5863: static void
5864: _tme_ieee754_unknown_single_add(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
5865: {
5866: int exceptions;
5867:
5868: /* assume that this operation raises no exceptions: */
5869: exceptions = 0;
5870:
5871: /* the operation: */
5872: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN, tme_ieee754_single_value_builtin_get(src0) + tme_ieee754_single_value_builtin_get(src1));
5873: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
5874:
5875: /* signal any exceptions: */
5876: if (exceptions != 0) {
5877: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
5878: }
5879: }
5880:
5881: /* this does a unknown compliance single-precision sub: */
5882: static void
5883: _tme_ieee754_unknown_single_sub(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
5884: {
5885: int exceptions;
5886:
5887: /* assume that this operation raises no exceptions: */
5888: exceptions = 0;
5889:
5890: /* the operation: */
5891: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN, tme_ieee754_single_value_builtin_get(src0) - tme_ieee754_single_value_builtin_get(src1));
5892: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
5893:
5894: /* signal any exceptions: */
5895: if (exceptions != 0) {
5896: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
5897: }
5898: }
5899:
5900: /* this does a unknown compliance single-precision mul: */
5901: static void
5902: _tme_ieee754_unknown_single_mul(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
5903: {
5904: int exceptions;
5905:
5906: /* assume that this operation raises no exceptions: */
5907: exceptions = 0;
5908:
5909: /* the operation: */
5910: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN, tme_ieee754_single_value_builtin_get(src0) * tme_ieee754_single_value_builtin_get(src1));
5911: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
5912:
5913: /* signal any exceptions: */
5914: if (exceptions != 0) {
5915: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
5916: }
5917: }
5918:
5919: /* this does a unknown compliance single-precision div: */
5920: static void
5921: _tme_ieee754_unknown_single_div(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
5922: {
5923: int exceptions;
5924:
5925: /* assume that this operation raises no exceptions: */
5926: exceptions = 0;
5927:
5928: /* the operation: */
5929: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN, tme_ieee754_single_value_builtin_get(src0) / tme_ieee754_single_value_builtin_get(src1));
5930: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
5931:
5932: /* signal any exceptions: */
5933: if (exceptions != 0) {
5934: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
5935: }
5936: }
5937:
5938: /* this does a unknown compliance single-precision sqrt: */
5939: static void
5940: _tme_ieee754_unknown_single_sqrt(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
5941: {
5942: int exceptions;
5943:
5944: /* assume that this operation raises no exceptions: */
5945: exceptions = 0;
5946:
5947: /* the operation: */
5948: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
5949: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, sqrtf(tme_ieee754_single_value_builtin_get(src0)));
5950: #else /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
5951: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, sqrt(tme_ieee754_single_value_builtin_get(src0)));
5952: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
5953: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
5954:
5955: /* signal any exceptions: */
5956: if (exceptions != 0) {
5957: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
5958: }
5959: }
5960:
5961: /* this does a unknown compliance single-precision abs: */
5962: static void
5963: _tme_ieee754_unknown_single_abs(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
5964: {
5965: int exceptions;
5966:
5967: /* assume that this operation raises no exceptions: */
5968: exceptions = 0;
5969:
5970: /* the operation: */
5971: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
5972: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, fabsf(tme_ieee754_single_value_builtin_get(src0)));
5973: #else /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
5974: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, fabs(tme_ieee754_single_value_builtin_get(src0)));
5975: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
5976: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
5977:
5978: /* signal any exceptions: */
5979: if (exceptions != 0) {
5980: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
5981: }
5982: }
5983:
5984: /* this does a unknown compliance single-precision neg: */
5985: static void
5986: _tme_ieee754_unknown_single_neg(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
5987: {
5988: int exceptions;
5989:
5990: /* assume that this operation raises no exceptions: */
5991: exceptions = 0;
5992:
5993: /* the operation: */
1.1.1.2 root 5994: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN, -1 * tme_ieee754_single_value_builtin_get(src0));
1.1 root 5995: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
5996:
5997: /* signal any exceptions: */
5998: if (exceptions != 0) {
5999: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6000: }
6001: }
6002:
6003: /* this does a unknown compliance single-precision move: */
6004: static void
6005: _tme_ieee754_unknown_single_move(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6006: {
6007: int exceptions;
6008:
6009: /* assume that this operation raises no exceptions: */
6010: exceptions = 0;
6011:
6012: /* the operation: */
6013: *dst = *src0;
6014: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6015:
6016: /* signal any exceptions: */
6017: if (exceptions != 0) {
6018: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6019: }
6020: }
6021:
6022: /* this does a unknown compliance single-precision exp: */
6023: static void
6024: _tme_ieee754_unknown_single_exp(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6025: {
6026: int exceptions;
6027:
6028: /* assume that this operation raises no exceptions: */
6029: exceptions = 0;
6030:
6031: /* the operation: */
6032: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6033: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, expf(tme_ieee754_single_value_builtin_get(src0)));
6034: #else /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6035: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, exp(tme_ieee754_single_value_builtin_get(src0)));
6036: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6037: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6038:
6039: /* signal any exceptions: */
6040: if (exceptions != 0) {
6041: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6042: }
6043: }
6044:
6045: /* this does a unknown compliance single-precision log10: */
6046: static void
6047: _tme_ieee754_unknown_single_log10(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6048: {
6049: int exceptions;
6050:
6051: /* assume that this operation raises no exceptions: */
6052: exceptions = 0;
6053:
6054: /* the operation: */
6055: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6056: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, log10f(tme_ieee754_single_value_builtin_get(src0)));
6057: #else /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6058: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, log10(tme_ieee754_single_value_builtin_get(src0)));
6059: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6060: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6061:
6062: /* signal any exceptions: */
6063: if (exceptions != 0) {
6064: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6065: }
6066: }
6067:
6068: /* this does a unknown compliance single-precision log: */
6069: static void
6070: _tme_ieee754_unknown_single_log(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6071: {
6072: int exceptions;
6073:
6074: /* assume that this operation raises no exceptions: */
6075: exceptions = 0;
6076:
6077: /* the operation: */
6078: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6079: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, logf(tme_ieee754_single_value_builtin_get(src0)));
6080: #else /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6081: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, log(tme_ieee754_single_value_builtin_get(src0)));
6082: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6083: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6084:
6085: /* signal any exceptions: */
6086: if (exceptions != 0) {
6087: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6088: }
6089: }
6090:
6091: /* this does a unknown compliance single-precision scale: */
6092: static void
6093: _tme_ieee754_unknown_single_scale(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6094: {
6095: int exceptions;
6096:
6097: /* assume that this operation raises no exceptions: */
6098: exceptions = 0;
6099:
6100: /* the operation: */
6101: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6102: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, scalbnf(tme_ieee754_single_value_builtin_get(src0), tme_ieee754_single_value_builtin_get(src1)));
6103: #else /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6104: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, scalbn(tme_ieee754_single_value_builtin_get(src0), tme_ieee754_single_value_builtin_get(src1)));
6105: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6106: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6107:
6108: /* signal any exceptions: */
6109: if (exceptions != 0) {
6110: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6111: }
6112: }
6113:
6114: /* this does a unknown compliance single-precision pow: */
6115: static void
6116: _tme_ieee754_unknown_single_pow(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6117: {
6118: int exceptions;
6119:
6120: /* assume that this operation raises no exceptions: */
6121: exceptions = 0;
6122:
6123: /* the operation: */
6124: #if (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6125: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, powf(tme_ieee754_single_value_builtin_get(src0), tme_ieee754_single_value_builtin_get(src1)));
6126: #else /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6127: tme_ieee754_single_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, pow(tme_ieee754_single_value_builtin_get(src0), tme_ieee754_single_value_builtin_get(src1)));
6128: #endif /* (TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6129: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6130:
6131: /* signal any exceptions: */
6132: if (exceptions != 0) {
6133: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6134: }
6135: }
6136:
6137: /* this does a unknown compliance double-precision add: */
6138: static void
6139: _tme_ieee754_unknown_double_add(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6140: {
6141: int exceptions;
6142:
6143: /* assume that this operation raises no exceptions: */
6144: exceptions = 0;
6145:
6146: /* the operation: */
6147: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN, tme_ieee754_double_value_builtin_get(src0) + tme_ieee754_double_value_builtin_get(src1));
6148: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6149:
6150: /* signal any exceptions: */
6151: if (exceptions != 0) {
6152: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6153: }
6154: }
6155:
6156: /* this does a unknown compliance double-precision sub: */
6157: static void
6158: _tme_ieee754_unknown_double_sub(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6159: {
6160: int exceptions;
6161:
6162: /* assume that this operation raises no exceptions: */
6163: exceptions = 0;
6164:
6165: /* the operation: */
6166: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN, tme_ieee754_double_value_builtin_get(src0) - tme_ieee754_double_value_builtin_get(src1));
6167: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6168:
6169: /* signal any exceptions: */
6170: if (exceptions != 0) {
6171: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6172: }
6173: }
6174:
6175: /* this does a unknown compliance double-precision mul: */
6176: static void
6177: _tme_ieee754_unknown_double_mul(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6178: {
6179: int exceptions;
6180:
6181: /* assume that this operation raises no exceptions: */
6182: exceptions = 0;
6183:
6184: /* the operation: */
6185: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN, tme_ieee754_double_value_builtin_get(src0) * tme_ieee754_double_value_builtin_get(src1));
6186: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6187:
6188: /* signal any exceptions: */
6189: if (exceptions != 0) {
6190: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6191: }
6192: }
6193:
6194: /* this does a unknown compliance double-precision div: */
6195: static void
6196: _tme_ieee754_unknown_double_div(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6197: {
6198: int exceptions;
6199:
6200: /* assume that this operation raises no exceptions: */
6201: exceptions = 0;
6202:
6203: /* the operation: */
6204: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN, tme_ieee754_double_value_builtin_get(src0) / tme_ieee754_double_value_builtin_get(src1));
6205: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6206:
6207: /* signal any exceptions: */
6208: if (exceptions != 0) {
6209: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6210: }
6211: }
6212:
6213: /* this does a unknown compliance double-precision sqrt: */
6214: static void
6215: _tme_ieee754_unknown_double_sqrt(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6216: {
6217: int exceptions;
6218:
6219: /* assume that this operation raises no exceptions: */
6220: exceptions = 0;
6221:
6222: /* the operation: */
6223: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6224: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, sqrtf(tme_ieee754_double_value_builtin_get(src0)));
6225: #else /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6226: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, sqrt(tme_ieee754_double_value_builtin_get(src0)));
6227: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6228: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6229:
6230: /* signal any exceptions: */
6231: if (exceptions != 0) {
6232: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6233: }
6234: }
6235:
6236: /* this does a unknown compliance double-precision abs: */
6237: static void
6238: _tme_ieee754_unknown_double_abs(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6239: {
6240: int exceptions;
6241:
6242: /* assume that this operation raises no exceptions: */
6243: exceptions = 0;
6244:
6245: /* the operation: */
6246: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6247: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, fabsf(tme_ieee754_double_value_builtin_get(src0)));
6248: #else /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6249: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, fabs(tme_ieee754_double_value_builtin_get(src0)));
6250: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6251: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6252:
6253: /* signal any exceptions: */
6254: if (exceptions != 0) {
6255: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6256: }
6257: }
6258:
6259: /* this does a unknown compliance double-precision neg: */
6260: static void
6261: _tme_ieee754_unknown_double_neg(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6262: {
6263: int exceptions;
6264:
6265: /* assume that this operation raises no exceptions: */
6266: exceptions = 0;
6267:
6268: /* the operation: */
1.1.1.2 root 6269: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN, -1 * tme_ieee754_double_value_builtin_get(src0));
1.1 root 6270: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6271:
6272: /* signal any exceptions: */
6273: if (exceptions != 0) {
6274: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6275: }
6276: }
6277:
6278: /* this does a unknown compliance double-precision move: */
6279: static void
6280: _tme_ieee754_unknown_double_move(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6281: {
6282: int exceptions;
6283:
6284: /* assume that this operation raises no exceptions: */
6285: exceptions = 0;
6286:
6287: /* the operation: */
6288: *dst = *src0;
6289: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6290:
6291: /* signal any exceptions: */
6292: if (exceptions != 0) {
6293: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6294: }
6295: }
6296:
6297: /* this does a unknown compliance double-precision exp: */
6298: static void
6299: _tme_ieee754_unknown_double_exp(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6300: {
6301: int exceptions;
6302:
6303: /* assume that this operation raises no exceptions: */
6304: exceptions = 0;
6305:
6306: /* the operation: */
6307: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6308: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, expf(tme_ieee754_double_value_builtin_get(src0)));
6309: #else /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6310: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, exp(tme_ieee754_double_value_builtin_get(src0)));
6311: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6312: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6313:
6314: /* signal any exceptions: */
6315: if (exceptions != 0) {
6316: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6317: }
6318: }
6319:
6320: /* this does a unknown compliance double-precision log10: */
6321: static void
6322: _tme_ieee754_unknown_double_log10(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6323: {
6324: int exceptions;
6325:
6326: /* assume that this operation raises no exceptions: */
6327: exceptions = 0;
6328:
6329: /* the operation: */
6330: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6331: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, log10f(tme_ieee754_double_value_builtin_get(src0)));
6332: #else /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6333: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, log10(tme_ieee754_double_value_builtin_get(src0)));
6334: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6335: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6336:
6337: /* signal any exceptions: */
6338: if (exceptions != 0) {
6339: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6340: }
6341: }
6342:
6343: /* this does a unknown compliance double-precision log: */
6344: static void
6345: _tme_ieee754_unknown_double_log(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6346: {
6347: int exceptions;
6348:
6349: /* assume that this operation raises no exceptions: */
6350: exceptions = 0;
6351:
6352: /* the operation: */
6353: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6354: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, logf(tme_ieee754_double_value_builtin_get(src0)));
6355: #else /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6356: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, log(tme_ieee754_double_value_builtin_get(src0)));
6357: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6358: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6359:
6360: /* signal any exceptions: */
6361: if (exceptions != 0) {
6362: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6363: }
6364: }
6365:
6366: /* this does a unknown compliance double-precision scale: */
6367: static void
6368: _tme_ieee754_unknown_double_scale(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6369: {
6370: int exceptions;
6371:
6372: /* assume that this operation raises no exceptions: */
6373: exceptions = 0;
6374:
6375: /* the operation: */
6376: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6377: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, scalbnf(tme_ieee754_double_value_builtin_get(src0), tme_ieee754_double_value_builtin_get(src1)));
6378: #else /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6379: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, scalbn(tme_ieee754_double_value_builtin_get(src0), tme_ieee754_double_value_builtin_get(src1)));
6380: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6381: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6382:
6383: /* signal any exceptions: */
6384: if (exceptions != 0) {
6385: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6386: }
6387: }
6388:
6389: /* this does a unknown compliance double-precision pow: */
6390: static void
6391: _tme_ieee754_unknown_double_pow(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6392: {
6393: int exceptions;
6394:
6395: /* assume that this operation raises no exceptions: */
6396: exceptions = 0;
6397:
6398: /* the operation: */
6399: #if (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6400: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, powf(tme_ieee754_double_value_builtin_get(src0), tme_ieee754_double_value_builtin_get(src1)));
6401: #else /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6402: tme_ieee754_double_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, pow(tme_ieee754_double_value_builtin_get(src0), tme_ieee754_double_value_builtin_get(src1)));
6403: #endif /* (TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6404: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6405:
6406: /* signal any exceptions: */
6407: if (exceptions != 0) {
6408: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6409: }
6410: }
6411:
6412: /* this does a unknown compliance extended80-precision add: */
6413: static void
6414: _tme_ieee754_unknown_extended80_add(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6415: {
6416: int exceptions;
6417:
6418: /* assume that this operation raises no exceptions: */
6419: exceptions = 0;
6420:
6421: /* the operation: */
6422: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN, tme_ieee754_extended80_value_builtin_get(src0) + tme_ieee754_extended80_value_builtin_get(src1));
6423: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6424:
6425: /* signal any exceptions: */
6426: if (exceptions != 0) {
6427: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6428: }
6429: }
6430:
6431: /* this does a unknown compliance extended80-precision sub: */
6432: static void
6433: _tme_ieee754_unknown_extended80_sub(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6434: {
6435: int exceptions;
6436:
6437: /* assume that this operation raises no exceptions: */
6438: exceptions = 0;
6439:
6440: /* the operation: */
6441: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN, tme_ieee754_extended80_value_builtin_get(src0) - tme_ieee754_extended80_value_builtin_get(src1));
6442: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6443:
6444: /* signal any exceptions: */
6445: if (exceptions != 0) {
6446: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6447: }
6448: }
6449:
6450: /* this does a unknown compliance extended80-precision mul: */
6451: static void
6452: _tme_ieee754_unknown_extended80_mul(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6453: {
6454: int exceptions;
6455:
6456: /* assume that this operation raises no exceptions: */
6457: exceptions = 0;
6458:
6459: /* the operation: */
6460: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN, tme_ieee754_extended80_value_builtin_get(src0) * tme_ieee754_extended80_value_builtin_get(src1));
6461: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6462:
6463: /* signal any exceptions: */
6464: if (exceptions != 0) {
6465: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6466: }
6467: }
6468:
6469: /* this does a unknown compliance extended80-precision div: */
6470: static void
6471: _tme_ieee754_unknown_extended80_div(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6472: {
6473: int exceptions;
6474:
6475: /* assume that this operation raises no exceptions: */
6476: exceptions = 0;
6477:
6478: /* the operation: */
6479: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN, tme_ieee754_extended80_value_builtin_get(src0) / tme_ieee754_extended80_value_builtin_get(src1));
6480: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6481:
6482: /* signal any exceptions: */
6483: if (exceptions != 0) {
6484: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6485: }
6486: }
6487:
6488: /* this does a unknown compliance extended80-precision sqrt: */
6489: static void
6490: _tme_ieee754_unknown_extended80_sqrt(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6491: {
6492: int exceptions;
6493:
6494: /* assume that this operation raises no exceptions: */
6495: exceptions = 0;
6496:
6497: /* the operation: */
6498: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6499: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, sqrtf(tme_ieee754_extended80_value_builtin_get(src0)));
6500: #else /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6501: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, sqrt(tme_ieee754_extended80_value_builtin_get(src0)));
6502: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6503: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6504:
6505: /* signal any exceptions: */
6506: if (exceptions != 0) {
6507: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6508: }
6509: }
6510:
6511: /* this does a unknown compliance extended80-precision abs: */
6512: static void
6513: _tme_ieee754_unknown_extended80_abs(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6514: {
6515: int exceptions;
6516:
6517: /* assume that this operation raises no exceptions: */
6518: exceptions = 0;
6519:
6520: /* the operation: */
6521: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6522: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, fabsf(tme_ieee754_extended80_value_builtin_get(src0)));
6523: #else /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6524: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, fabs(tme_ieee754_extended80_value_builtin_get(src0)));
6525: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6526: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6527:
6528: /* signal any exceptions: */
6529: if (exceptions != 0) {
6530: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6531: }
6532: }
6533:
6534: /* this does a unknown compliance extended80-precision neg: */
6535: static void
6536: _tme_ieee754_unknown_extended80_neg(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6537: {
6538: int exceptions;
6539:
6540: /* assume that this operation raises no exceptions: */
6541: exceptions = 0;
6542:
6543: /* the operation: */
1.1.1.2 root 6544: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN, -1 * tme_ieee754_extended80_value_builtin_get(src0));
1.1 root 6545: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6546:
6547: /* signal any exceptions: */
6548: if (exceptions != 0) {
6549: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6550: }
6551: }
6552:
6553: /* this does a unknown compliance extended80-precision move: */
6554: static void
6555: _tme_ieee754_unknown_extended80_move(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6556: {
6557: int exceptions;
6558:
6559: /* assume that this operation raises no exceptions: */
6560: exceptions = 0;
6561:
6562: /* the operation: */
6563: *dst = *src0;
6564: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6565:
6566: /* signal any exceptions: */
6567: if (exceptions != 0) {
6568: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6569: }
6570: }
6571:
6572: /* this does a unknown compliance extended80-precision exp: */
6573: static void
6574: _tme_ieee754_unknown_extended80_exp(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6575: {
6576: int exceptions;
6577:
6578: /* assume that this operation raises no exceptions: */
6579: exceptions = 0;
6580:
6581: /* the operation: */
6582: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6583: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, expf(tme_ieee754_extended80_value_builtin_get(src0)));
6584: #else /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6585: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, exp(tme_ieee754_extended80_value_builtin_get(src0)));
6586: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6587: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6588:
6589: /* signal any exceptions: */
6590: if (exceptions != 0) {
6591: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6592: }
6593: }
6594:
6595: /* this does a unknown compliance extended80-precision log10: */
6596: static void
6597: _tme_ieee754_unknown_extended80_log10(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6598: {
6599: int exceptions;
6600:
6601: /* assume that this operation raises no exceptions: */
6602: exceptions = 0;
6603:
6604: /* the operation: */
6605: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6606: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, log10f(tme_ieee754_extended80_value_builtin_get(src0)));
6607: #else /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6608: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, log10(tme_ieee754_extended80_value_builtin_get(src0)));
6609: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6610: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6611:
6612: /* signal any exceptions: */
6613: if (exceptions != 0) {
6614: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6615: }
6616: }
6617:
6618: /* this does a unknown compliance extended80-precision log: */
6619: static void
6620: _tme_ieee754_unknown_extended80_log(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6621: {
6622: int exceptions;
6623:
6624: /* assume that this operation raises no exceptions: */
6625: exceptions = 0;
6626:
6627: /* the operation: */
6628: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6629: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, logf(tme_ieee754_extended80_value_builtin_get(src0)));
6630: #else /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6631: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, log(tme_ieee754_extended80_value_builtin_get(src0)));
6632: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6633: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6634:
6635: /* signal any exceptions: */
6636: if (exceptions != 0) {
6637: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6638: }
6639: }
6640:
6641: /* this does a unknown compliance extended80-precision scale: */
6642: static void
6643: _tme_ieee754_unknown_extended80_scale(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6644: {
6645: int exceptions;
6646:
6647: /* assume that this operation raises no exceptions: */
6648: exceptions = 0;
6649:
6650: /* the operation: */
6651: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6652: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, scalbnf(tme_ieee754_extended80_value_builtin_get(src0), tme_ieee754_extended80_value_builtin_get(src1)));
6653: #else /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6654: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, scalbn(tme_ieee754_extended80_value_builtin_get(src0), tme_ieee754_extended80_value_builtin_get(src1)));
6655: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6656: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6657:
6658: /* signal any exceptions: */
6659: if (exceptions != 0) {
6660: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6661: }
6662: }
6663:
6664: /* this does a unknown compliance extended80-precision pow: */
6665: static void
6666: _tme_ieee754_unknown_extended80_pow(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6667: {
6668: int exceptions;
6669:
6670: /* assume that this operation raises no exceptions: */
6671: exceptions = 0;
6672:
6673: /* the operation: */
6674: #if (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6675: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, powf(tme_ieee754_extended80_value_builtin_get(src0), tme_ieee754_extended80_value_builtin_get(src1)));
6676: #else /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6677: tme_ieee754_extended80_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, pow(tme_ieee754_extended80_value_builtin_get(src0), tme_ieee754_extended80_value_builtin_get(src1)));
6678: #endif /* (TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6679: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6680:
6681: /* signal any exceptions: */
6682: if (exceptions != 0) {
6683: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6684: }
6685: }
6686:
6687: /* this does a unknown compliance quad-precision add: */
6688: static void
6689: _tme_ieee754_unknown_quad_add(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6690: {
6691: int exceptions;
6692:
6693: /* assume that this operation raises no exceptions: */
6694: exceptions = 0;
6695:
6696: /* the operation: */
6697: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN, tme_ieee754_quad_value_builtin_get(src0) + tme_ieee754_quad_value_builtin_get(src1));
6698: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6699:
6700: /* signal any exceptions: */
6701: if (exceptions != 0) {
6702: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6703: }
6704: }
6705:
6706: /* this does a unknown compliance quad-precision sub: */
6707: static void
6708: _tme_ieee754_unknown_quad_sub(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6709: {
6710: int exceptions;
6711:
6712: /* assume that this operation raises no exceptions: */
6713: exceptions = 0;
6714:
6715: /* the operation: */
6716: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN, tme_ieee754_quad_value_builtin_get(src0) - tme_ieee754_quad_value_builtin_get(src1));
6717: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6718:
6719: /* signal any exceptions: */
6720: if (exceptions != 0) {
6721: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6722: }
6723: }
6724:
6725: /* this does a unknown compliance quad-precision mul: */
6726: static void
6727: _tme_ieee754_unknown_quad_mul(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6728: {
6729: int exceptions;
6730:
6731: /* assume that this operation raises no exceptions: */
6732: exceptions = 0;
6733:
6734: /* the operation: */
6735: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN, tme_ieee754_quad_value_builtin_get(src0) * tme_ieee754_quad_value_builtin_get(src1));
6736: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6737:
6738: /* signal any exceptions: */
6739: if (exceptions != 0) {
6740: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6741: }
6742: }
6743:
6744: /* this does a unknown compliance quad-precision div: */
6745: static void
6746: _tme_ieee754_unknown_quad_div(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6747: {
6748: int exceptions;
6749:
6750: /* assume that this operation raises no exceptions: */
6751: exceptions = 0;
6752:
6753: /* the operation: */
6754: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN, tme_ieee754_quad_value_builtin_get(src0) / tme_ieee754_quad_value_builtin_get(src1));
6755: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6756:
6757: /* signal any exceptions: */
6758: if (exceptions != 0) {
6759: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6760: }
6761: }
6762:
6763: /* this does a unknown compliance quad-precision sqrt: */
6764: static void
6765: _tme_ieee754_unknown_quad_sqrt(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6766: {
6767: int exceptions;
6768:
6769: /* assume that this operation raises no exceptions: */
6770: exceptions = 0;
6771:
6772: /* the operation: */
6773: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6774: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, sqrtf(tme_ieee754_quad_value_builtin_get(src0)));
6775: #else /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6776: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, sqrt(tme_ieee754_quad_value_builtin_get(src0)));
6777: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6778: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6779:
6780: /* signal any exceptions: */
6781: if (exceptions != 0) {
6782: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6783: }
6784: }
6785:
6786: /* this does a unknown compliance quad-precision abs: */
6787: static void
6788: _tme_ieee754_unknown_quad_abs(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6789: {
6790: int exceptions;
6791:
6792: /* assume that this operation raises no exceptions: */
6793: exceptions = 0;
6794:
6795: /* the operation: */
6796: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6797: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, fabsf(tme_ieee754_quad_value_builtin_get(src0)));
6798: #else /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6799: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, fabs(tme_ieee754_quad_value_builtin_get(src0)));
6800: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6801: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6802:
6803: /* signal any exceptions: */
6804: if (exceptions != 0) {
6805: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6806: }
6807: }
6808:
6809: /* this does a unknown compliance quad-precision neg: */
6810: static void
6811: _tme_ieee754_unknown_quad_neg(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6812: {
6813: int exceptions;
6814:
6815: /* assume that this operation raises no exceptions: */
6816: exceptions = 0;
6817:
6818: /* the operation: */
1.1.1.2 root 6819: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN, -1 * tme_ieee754_quad_value_builtin_get(src0));
1.1 root 6820: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6821:
6822: /* signal any exceptions: */
6823: if (exceptions != 0) {
6824: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6825: }
6826: }
6827:
6828: /* this does a unknown compliance quad-precision move: */
6829: static void
6830: _tme_ieee754_unknown_quad_move(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6831: {
6832: int exceptions;
6833:
6834: /* assume that this operation raises no exceptions: */
6835: exceptions = 0;
6836:
6837: /* the operation: */
6838: *dst = *src0;
6839: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6840:
6841: /* signal any exceptions: */
6842: if (exceptions != 0) {
6843: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6844: }
6845: }
6846:
6847: /* this does a unknown compliance quad-precision exp: */
6848: static void
6849: _tme_ieee754_unknown_quad_exp(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6850: {
6851: int exceptions;
6852:
6853: /* assume that this operation raises no exceptions: */
6854: exceptions = 0;
6855:
6856: /* the operation: */
6857: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6858: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, expf(tme_ieee754_quad_value_builtin_get(src0)));
6859: #else /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6860: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, exp(tme_ieee754_quad_value_builtin_get(src0)));
6861: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6862: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6863:
6864: /* signal any exceptions: */
6865: if (exceptions != 0) {
6866: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6867: }
6868: }
6869:
6870: /* this does a unknown compliance quad-precision log10: */
6871: static void
6872: _tme_ieee754_unknown_quad_log10(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6873: {
6874: int exceptions;
6875:
6876: /* assume that this operation raises no exceptions: */
6877: exceptions = 0;
6878:
6879: /* the operation: */
6880: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6881: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, log10f(tme_ieee754_quad_value_builtin_get(src0)));
6882: #else /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6883: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, log10(tme_ieee754_quad_value_builtin_get(src0)));
6884: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6885: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6886:
6887: /* signal any exceptions: */
6888: if (exceptions != 0) {
6889: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6890: }
6891: }
6892:
6893: /* this does a unknown compliance quad-precision log: */
6894: static void
6895: _tme_ieee754_unknown_quad_log(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, struct tme_float *dst)
6896: {
6897: int exceptions;
6898:
6899: /* assume that this operation raises no exceptions: */
6900: exceptions = 0;
6901:
6902: /* the operation: */
6903: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6904: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, logf(tme_ieee754_quad_value_builtin_get(src0)));
6905: #else /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6906: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, log(tme_ieee754_quad_value_builtin_get(src0)));
6907: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6908: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6909:
6910: /* signal any exceptions: */
6911: if (exceptions != 0) {
6912: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6913: }
6914: }
6915:
6916: /* this does a unknown compliance quad-precision scale: */
6917: static void
6918: _tme_ieee754_unknown_quad_scale(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6919: {
6920: int exceptions;
6921:
6922: /* assume that this operation raises no exceptions: */
6923: exceptions = 0;
6924:
6925: /* the operation: */
6926: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6927: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, scalbnf(tme_ieee754_quad_value_builtin_get(src0), tme_ieee754_quad_value_builtin_get(src1)));
6928: #else /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6929: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, scalbn(tme_ieee754_quad_value_builtin_get(src0), tme_ieee754_quad_value_builtin_get(src1)));
6930: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6931: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6932:
6933: /* signal any exceptions: */
6934: if (exceptions != 0) {
6935: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6936: }
6937: }
6938:
6939: /* this does a unknown compliance quad-precision pow: */
6940: static void
6941: _tme_ieee754_unknown_quad_pow(struct tme_ieee754_ctl *ieee754_ctl, const struct tme_float *src0, const struct tme_float *src1, struct tme_float *dst)
6942: {
6943: int exceptions;
6944:
6945: /* assume that this operation raises no exceptions: */
6946: exceptions = 0;
6947:
6948: /* the operation: */
6949: #if (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN == TME_FLOAT_FORMAT_FLOAT)
6950: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_FLOAT, powf(tme_ieee754_quad_value_builtin_get(src0), tme_ieee754_quad_value_builtin_get(src1)));
6951: #else /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6952: tme_ieee754_quad_value_builtin_set(dst, TME_FLOAT_FORMAT_DOUBLE, pow(tme_ieee754_quad_value_builtin_get(src0), tme_ieee754_quad_value_builtin_get(src1)));
6953: #endif /* (TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN != TME_FLOAT_FORMAT_FLOAT) */
6954: ieee754_ctl->tme_ieee754_ctl_lock_unlock = NULL;
6955:
6956: /* signal any exceptions: */
6957: if (exceptions != 0) {
6958: (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
6959: }
6960: }
6961:
6962: /* the unknown compliance operations: */
6963: _tme_const struct tme_ieee754_ops tme_ieee754_ops_unknown = {
6964:
6965: /* the version of this structure: */
6966: TME_X_VERSION(0, 0),
6967:
6968: /* this does a unknown compliance single-precision add: */
6969: _tme_ieee754_unknown_single_add,
6970:
6971: /* this does a unknown compliance single-precision sub: */
6972: _tme_ieee754_unknown_single_sub,
6973:
6974: /* this does a unknown compliance single-precision mul: */
6975: _tme_ieee754_unknown_single_mul,
6976:
6977: /* this does a unknown compliance single-precision div: */
6978: _tme_ieee754_unknown_single_div,
6979:
6980: /* this does a unknown compliance single-precision rem: */
6981: _tme_ieee754_strict_single_rem,
6982:
6983: /* this does a unknown compliance single-precision sqrt: */
6984: _tme_ieee754_unknown_single_sqrt,
6985:
6986: /* this does a unknown compliance single-precision abs: */
6987: _tme_ieee754_unknown_single_abs,
6988:
6989: /* this does a unknown compliance single-precision neg: */
6990: _tme_ieee754_unknown_single_neg,
6991:
6992: /* this does a unknown compliance single-precision move: */
6993: _tme_ieee754_unknown_single_move,
6994:
6995: /* this does a unknown compliance single-precision rint: */
6996: _tme_ieee754_strict_single_rint,
6997:
6998: /* this does a unknown compliance single-precision cos: */
6999: NULL,
7000:
7001: /* this does a unknown compliance single-precision acos: */
7002: NULL,
7003:
7004: /* this does a unknown compliance single-precision cosh: */
7005: NULL,
7006:
7007: /* this does a unknown compliance single-precision sin: */
7008: NULL,
7009:
7010: /* this does a unknown compliance single-precision asin: */
7011: NULL,
7012:
7013: /* this does a unknown compliance single-precision sinh: */
7014: NULL,
7015:
7016: /* this does a unknown compliance single-precision tan: */
7017: NULL,
7018:
7019: /* this does a unknown compliance single-precision atan: */
7020: NULL,
7021:
7022: /* this does a unknown compliance single-precision tanh: */
7023: NULL,
7024:
7025: /* this does a unknown compliance single-precision atanh: */
7026: NULL,
7027:
7028: /* this does a unknown compliance single-precision exp: */
7029: _tme_ieee754_unknown_single_exp,
7030:
7031: /* this does a unknown compliance single-precision expm1: */
7032: NULL,
7033:
7034: /* this does a unknown compliance single-precision log10: */
7035: _tme_ieee754_unknown_single_log10,
7036:
7037: /* this does a unknown compliance single-precision log: */
7038: _tme_ieee754_unknown_single_log,
7039:
7040: /* this does a unknown compliance single-precision log1p: */
7041: NULL,
7042:
7043: /* this does a unknown compliance single-precision getexp: */
7044: _tme_ieee754_strict_single_getexp,
7045:
7046: /* this does a unknown compliance single-precision getman: */
7047: _tme_ieee754_strict_single_getman,
7048:
7049: /* this does a unknown compliance single-precision scale: */
7050: _tme_ieee754_unknown_single_scale,
7051:
7052: /* this does a unknown compliance single-precision pow: */
7053: _tme_ieee754_unknown_single_pow,
7054:
7055: /* this does a unknown compliance single-precision from_double: */
7056: _tme_ieee754_strict_single_from_double,
7057:
7058: /* this does a unknown compliance single-precision from_extended80: */
7059: _tme_ieee754_strict_single_from_extended80,
7060:
7061: /* this does a unknown compliance single-precision from_quad: */
7062: _tme_ieee754_strict_single_from_quad,
7063:
1.1.1.2 root 7064: /* this does a unknown compliance single-precision from_int32: */
7065: _tme_ieee754_strict_single_from_int32,
7066:
7067: /* this does a unknown compliance single-precision from_int64: */
7068: #if (defined(TME_HAVE_INT64_T))
7069: _tme_ieee754_strict_single_from_int64,
7070: #else /* !(defined(TME_HAVE_INT64_T)) */
7071: NULL,
7072: #endif /* !(defined(TME_HAVE_INT64_T)) */
7073:
1.1 root 7074: /* this does a unknown compliance single-precision to_int32: */
7075: _tme_ieee754_strict_single_to_int32,
7076:
7077: /* this does a unknown compliance single-precision to_int64: */
1.1.1.3 ! root 7078: #if (defined(TME_HAVE_INT64_T))
! 7079: _tme_ieee754_strict_single_to_int64,
! 7080: #else /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 7081: NULL,
1.1.1.3 ! root 7082: #endif /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 7083:
7084: /* this does a unknown compliance double-precision add: */
7085: _tme_ieee754_unknown_double_add,
7086:
7087: /* this does a unknown compliance double-precision sub: */
7088: _tme_ieee754_unknown_double_sub,
7089:
7090: /* this does a unknown compliance double-precision mul: */
7091: _tme_ieee754_unknown_double_mul,
7092:
7093: /* this does a unknown compliance double-precision div: */
7094: _tme_ieee754_unknown_double_div,
7095:
7096: /* this does a unknown compliance double-precision rem: */
7097: _tme_ieee754_strict_double_rem,
7098:
7099: /* this does a unknown compliance double-precision sqrt: */
7100: _tme_ieee754_unknown_double_sqrt,
7101:
7102: /* this does a unknown compliance double-precision abs: */
7103: _tme_ieee754_unknown_double_abs,
7104:
7105: /* this does a unknown compliance double-precision neg: */
7106: _tme_ieee754_unknown_double_neg,
7107:
7108: /* this does a unknown compliance double-precision move: */
7109: _tme_ieee754_unknown_double_move,
7110:
7111: /* this does a unknown compliance double-precision rint: */
7112: _tme_ieee754_strict_double_rint,
7113:
7114: /* this does a unknown compliance double-precision cos: */
7115: NULL,
7116:
7117: /* this does a unknown compliance double-precision acos: */
7118: NULL,
7119:
7120: /* this does a unknown compliance double-precision cosh: */
7121: NULL,
7122:
7123: /* this does a unknown compliance double-precision sin: */
7124: NULL,
7125:
7126: /* this does a unknown compliance double-precision asin: */
7127: NULL,
7128:
7129: /* this does a unknown compliance double-precision sinh: */
7130: NULL,
7131:
7132: /* this does a unknown compliance double-precision tan: */
7133: NULL,
7134:
7135: /* this does a unknown compliance double-precision atan: */
7136: NULL,
7137:
7138: /* this does a unknown compliance double-precision tanh: */
7139: NULL,
7140:
7141: /* this does a unknown compliance double-precision atanh: */
7142: NULL,
7143:
7144: /* this does a unknown compliance double-precision exp: */
7145: _tme_ieee754_unknown_double_exp,
7146:
7147: /* this does a unknown compliance double-precision expm1: */
7148: NULL,
7149:
7150: /* this does a unknown compliance double-precision log10: */
7151: _tme_ieee754_unknown_double_log10,
7152:
7153: /* this does a unknown compliance double-precision log: */
7154: _tme_ieee754_unknown_double_log,
7155:
7156: /* this does a unknown compliance double-precision log1p: */
7157: NULL,
7158:
7159: /* this does a unknown compliance double-precision getexp: */
7160: _tme_ieee754_strict_double_getexp,
7161:
7162: /* this does a unknown compliance double-precision getman: */
7163: _tme_ieee754_strict_double_getman,
7164:
7165: /* this does a unknown compliance double-precision scale: */
7166: _tme_ieee754_unknown_double_scale,
7167:
7168: /* this does a unknown compliance double-precision pow: */
7169: _tme_ieee754_unknown_double_pow,
7170:
7171: /* this does a unknown compliance double-precision from_single: */
7172: _tme_ieee754_strict_double_from_single,
7173:
7174: /* this does a unknown compliance double-precision from_extended80: */
7175: _tme_ieee754_strict_double_from_extended80,
7176:
7177: /* this does a unknown compliance double-precision from_quad: */
7178: _tme_ieee754_strict_double_from_quad,
7179:
1.1.1.2 root 7180: /* this does a unknown compliance double-precision from_int32: */
7181: _tme_ieee754_strict_double_from_int32,
7182:
7183: /* this does a unknown compliance double-precision from_int64: */
7184: #if (defined(TME_HAVE_INT64_T))
7185: _tme_ieee754_strict_double_from_int64,
7186: #else /* !(defined(TME_HAVE_INT64_T)) */
7187: NULL,
7188: #endif /* !(defined(TME_HAVE_INT64_T)) */
7189:
1.1 root 7190: /* this does a unknown compliance double-precision to_int32: */
7191: _tme_ieee754_strict_double_to_int32,
7192:
7193: /* this does a unknown compliance double-precision to_int64: */
1.1.1.3 ! root 7194: #if (defined(TME_HAVE_INT64_T))
! 7195: _tme_ieee754_strict_double_to_int64,
! 7196: #else /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 7197: NULL,
1.1.1.3 ! root 7198: #endif /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 7199:
7200: /* this does a unknown compliance extended80-precision add: */
7201: _tme_ieee754_unknown_extended80_add,
7202:
7203: /* this does a unknown compliance extended80-precision sub: */
7204: _tme_ieee754_unknown_extended80_sub,
7205:
7206: /* this does a unknown compliance extended80-precision mul: */
7207: _tme_ieee754_unknown_extended80_mul,
7208:
7209: /* this does a unknown compliance extended80-precision div: */
7210: _tme_ieee754_unknown_extended80_div,
7211:
7212: /* this does a unknown compliance extended80-precision rem: */
7213: #if (defined(TME_HAVE_INT64_T))
7214: _tme_ieee754_strict_extended80_rem,
7215: #else /* !(defined(TME_HAVE_INT64_T)) */
7216: NULL,
7217: #endif /* !(defined(TME_HAVE_INT64_T)) */
7218:
7219: /* this does a unknown compliance extended80-precision sqrt: */
7220: _tme_ieee754_unknown_extended80_sqrt,
7221:
7222: /* this does a unknown compliance extended80-precision abs: */
7223: _tme_ieee754_unknown_extended80_abs,
7224:
7225: /* this does a unknown compliance extended80-precision neg: */
7226: _tme_ieee754_unknown_extended80_neg,
7227:
7228: /* this does a unknown compliance extended80-precision move: */
7229: _tme_ieee754_unknown_extended80_move,
7230:
7231: /* this does a unknown compliance extended80-precision rint: */
7232: #if (defined(TME_HAVE_INT64_T))
7233: _tme_ieee754_strict_extended80_rint,
7234: #else /* !(defined(TME_HAVE_INT64_T)) */
7235: NULL,
7236: #endif /* !(defined(TME_HAVE_INT64_T)) */
7237:
7238: /* this does a unknown compliance extended80-precision cos: */
7239: NULL,
7240:
7241: /* this does a unknown compliance extended80-precision acos: */
7242: NULL,
7243:
7244: /* this does a unknown compliance extended80-precision cosh: */
7245: NULL,
7246:
7247: /* this does a unknown compliance extended80-precision sin: */
7248: NULL,
7249:
7250: /* this does a unknown compliance extended80-precision asin: */
7251: NULL,
7252:
7253: /* this does a unknown compliance extended80-precision sinh: */
7254: NULL,
7255:
7256: /* this does a unknown compliance extended80-precision tan: */
7257: NULL,
7258:
7259: /* this does a unknown compliance extended80-precision atan: */
7260: NULL,
7261:
7262: /* this does a unknown compliance extended80-precision tanh: */
7263: NULL,
7264:
7265: /* this does a unknown compliance extended80-precision atanh: */
7266: NULL,
7267:
7268: /* this does a unknown compliance extended80-precision exp: */
7269: _tme_ieee754_unknown_extended80_exp,
7270:
7271: /* this does a unknown compliance extended80-precision expm1: */
7272: NULL,
7273:
7274: /* this does a unknown compliance extended80-precision log10: */
7275: _tme_ieee754_unknown_extended80_log10,
7276:
7277: /* this does a unknown compliance extended80-precision log: */
7278: _tme_ieee754_unknown_extended80_log,
7279:
7280: /* this does a unknown compliance extended80-precision log1p: */
7281: NULL,
7282:
7283: /* this does a unknown compliance extended80-precision getexp: */
7284: _tme_ieee754_strict_extended80_getexp,
7285:
7286: /* this does a unknown compliance extended80-precision getman: */
7287: _tme_ieee754_strict_extended80_getman,
7288:
7289: /* this does a unknown compliance extended80-precision scale: */
7290: _tme_ieee754_unknown_extended80_scale,
7291:
7292: /* this does a unknown compliance extended80-precision pow: */
7293: _tme_ieee754_unknown_extended80_pow,
7294:
7295: /* this does a unknown compliance extended80-precision from_single: */
7296: #if (defined(TME_HAVE_INT64_T))
7297: _tme_ieee754_strict_extended80_from_single,
7298: #else /* !(defined(TME_HAVE_INT64_T)) */
7299: NULL,
7300: #endif /* !(defined(TME_HAVE_INT64_T)) */
7301:
7302: /* this does a unknown compliance extended80-precision from_double: */
7303: #if (defined(TME_HAVE_INT64_T))
7304: _tme_ieee754_strict_extended80_from_double,
7305: #else /* !(defined(TME_HAVE_INT64_T)) */
7306: NULL,
7307: #endif /* !(defined(TME_HAVE_INT64_T)) */
7308:
7309: /* this does a unknown compliance extended80-precision from_quad: */
7310: #if (defined(TME_HAVE_INT64_T))
7311: _tme_ieee754_strict_extended80_from_quad,
7312: #else /* !(defined(TME_HAVE_INT64_T)) */
7313: NULL,
7314: #endif /* !(defined(TME_HAVE_INT64_T)) */
7315:
1.1.1.2 root 7316: /* this does a unknown compliance extended80-precision from_int32: */
7317: #if (defined(TME_HAVE_INT64_T))
7318: _tme_ieee754_strict_extended80_from_int32,
7319: #else /* !(defined(TME_HAVE_INT64_T)) */
7320: NULL,
7321: #endif /* !(defined(TME_HAVE_INT64_T)) */
7322:
7323: /* this does a unknown compliance extended80-precision from_int64: */
7324: #if (defined(TME_HAVE_INT64_T))
7325: _tme_ieee754_strict_extended80_from_int64,
7326: #else /* !(defined(TME_HAVE_INT64_T)) */
7327: NULL,
7328: #endif /* !(defined(TME_HAVE_INT64_T)) */
7329:
1.1 root 7330: /* this does a unknown compliance extended80-precision to_int32: */
7331: _tme_ieee754_strict_extended80_to_int32,
7332:
7333: /* this does a unknown compliance extended80-precision to_int64: */
1.1.1.3 ! root 7334: #if (defined(TME_HAVE_INT64_T))
! 7335: _tme_ieee754_strict_extended80_to_int64,
! 7336: #else /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 7337: NULL,
1.1.1.3 ! root 7338: #endif /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 7339:
7340: /* this does a unknown compliance quad-precision add: */
7341: _tme_ieee754_unknown_quad_add,
7342:
7343: /* this does a unknown compliance quad-precision sub: */
7344: _tme_ieee754_unknown_quad_sub,
7345:
7346: /* this does a unknown compliance quad-precision mul: */
7347: _tme_ieee754_unknown_quad_mul,
7348:
7349: /* this does a unknown compliance quad-precision div: */
7350: _tme_ieee754_unknown_quad_div,
7351:
7352: /* this does a unknown compliance quad-precision rem: */
7353: #if (defined(TME_HAVE_INT64_T))
7354: _tme_ieee754_strict_quad_rem,
7355: #else /* !(defined(TME_HAVE_INT64_T)) */
7356: NULL,
7357: #endif /* !(defined(TME_HAVE_INT64_T)) */
7358:
7359: /* this does a unknown compliance quad-precision sqrt: */
7360: _tme_ieee754_unknown_quad_sqrt,
7361:
7362: /* this does a unknown compliance quad-precision abs: */
7363: _tme_ieee754_unknown_quad_abs,
7364:
7365: /* this does a unknown compliance quad-precision neg: */
7366: _tme_ieee754_unknown_quad_neg,
7367:
7368: /* this does a unknown compliance quad-precision move: */
7369: _tme_ieee754_unknown_quad_move,
7370:
7371: /* this does a unknown compliance quad-precision rint: */
7372: #if (defined(TME_HAVE_INT64_T))
7373: _tme_ieee754_strict_quad_rint,
7374: #else /* !(defined(TME_HAVE_INT64_T)) */
7375: NULL,
7376: #endif /* !(defined(TME_HAVE_INT64_T)) */
7377:
7378: /* this does a unknown compliance quad-precision cos: */
7379: NULL,
7380:
7381: /* this does a unknown compliance quad-precision acos: */
7382: NULL,
7383:
7384: /* this does a unknown compliance quad-precision cosh: */
7385: NULL,
7386:
7387: /* this does a unknown compliance quad-precision sin: */
7388: NULL,
7389:
7390: /* this does a unknown compliance quad-precision asin: */
7391: NULL,
7392:
7393: /* this does a unknown compliance quad-precision sinh: */
7394: NULL,
7395:
7396: /* this does a unknown compliance quad-precision tan: */
7397: NULL,
7398:
7399: /* this does a unknown compliance quad-precision atan: */
7400: NULL,
7401:
7402: /* this does a unknown compliance quad-precision tanh: */
7403: NULL,
7404:
7405: /* this does a unknown compliance quad-precision atanh: */
7406: NULL,
7407:
7408: /* this does a unknown compliance quad-precision exp: */
7409: _tme_ieee754_unknown_quad_exp,
7410:
7411: /* this does a unknown compliance quad-precision expm1: */
7412: NULL,
7413:
7414: /* this does a unknown compliance quad-precision log10: */
7415: _tme_ieee754_unknown_quad_log10,
7416:
7417: /* this does a unknown compliance quad-precision log: */
7418: _tme_ieee754_unknown_quad_log,
7419:
7420: /* this does a unknown compliance quad-precision log1p: */
7421: NULL,
7422:
7423: /* this does a unknown compliance quad-precision getexp: */
7424: _tme_ieee754_strict_quad_getexp,
7425:
7426: /* this does a unknown compliance quad-precision getman: */
7427: _tme_ieee754_strict_quad_getman,
7428:
7429: /* this does a unknown compliance quad-precision scale: */
7430: _tme_ieee754_unknown_quad_scale,
7431:
7432: /* this does a unknown compliance quad-precision pow: */
7433: _tme_ieee754_unknown_quad_pow,
7434:
7435: /* this does a unknown compliance quad-precision from_single: */
7436: #if (defined(TME_HAVE_INT64_T))
7437: _tme_ieee754_strict_quad_from_single,
7438: #else /* !(defined(TME_HAVE_INT64_T)) */
7439: NULL,
7440: #endif /* !(defined(TME_HAVE_INT64_T)) */
7441:
7442: /* this does a unknown compliance quad-precision from_double: */
7443: #if (defined(TME_HAVE_INT64_T))
7444: _tme_ieee754_strict_quad_from_double,
7445: #else /* !(defined(TME_HAVE_INT64_T)) */
7446: NULL,
7447: #endif /* !(defined(TME_HAVE_INT64_T)) */
7448:
7449: /* this does a unknown compliance quad-precision from_extended80: */
7450: #if (defined(TME_HAVE_INT64_T))
7451: _tme_ieee754_strict_quad_from_extended80,
7452: #else /* !(defined(TME_HAVE_INT64_T)) */
7453: NULL,
7454: #endif /* !(defined(TME_HAVE_INT64_T)) */
7455:
1.1.1.2 root 7456: /* this does a unknown compliance quad-precision from_int32: */
7457: #if (defined(TME_HAVE_INT64_T))
7458: _tme_ieee754_strict_quad_from_int32,
7459: #else /* !(defined(TME_HAVE_INT64_T)) */
7460: NULL,
7461: #endif /* !(defined(TME_HAVE_INT64_T)) */
7462:
7463: /* this does a unknown compliance quad-precision from_int64: */
7464: #if (defined(TME_HAVE_INT64_T))
7465: _tme_ieee754_strict_quad_from_int64,
7466: #else /* !(defined(TME_HAVE_INT64_T)) */
7467: NULL,
7468: #endif /* !(defined(TME_HAVE_INT64_T)) */
7469:
1.1 root 7470: /* this does a unknown compliance quad-precision to_int32: */
7471: _tme_ieee754_strict_quad_to_int32,
7472:
7473: /* this does a unknown compliance quad-precision to_int64: */
1.1.1.3 ! root 7474: #if (defined(TME_HAVE_INT64_T))
! 7475: _tme_ieee754_strict_quad_to_int64,
! 7476: #else /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 7477: NULL,
1.1.1.3 ! root 7478: #endif /* !(defined(TME_HAVE_INT64_T)) */
1.1 root 7479: };
7480:
7481: /* this looks up an operations structure: */
7482: const struct tme_ieee754_ops *
7483: tme_ieee754_ops_lookup(const char *compliance)
7484: {
7485:
7486: if (TME_ARG_IS(compliance, "strict")) {
7487: return (&tme_ieee754_ops_strict);
7488: }
7489: if (TME_ARG_IS(compliance, "partial")) {
7490: return (&tme_ieee754_ops_partial);
7491: }
7492: if (TME_ARG_IS(compliance, "unknown")) {
7493: return (&tme_ieee754_ops_unknown);
7494: }
7495: return (NULL);
7496: }
7497:
7498: /* this is a compliance options string: */
7499: const char * const tme_ieee754_compliance_options = "{ strict | partial | unknown }";
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.