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