Annotation of tme/ic/ieee754/ieee754-misc.c, revision 1.1.1.1

1.1       root        1: /* $Id: ieee754-misc.c,v 1.2 2005/05/14 22:18:37 fredette Exp $ */
                      2: 
                      3: /* ic/ieee754/ieee754-misc.c - IEEE 754 miscellaneous: */
                      4: 
                      5: /*
                      6:  * Copyright (c) 2004 Matt Fredette
                      7:  * All rights reserved.
                      8:  *
                      9:  * Redistribution and use in source and binary forms, with or without
                     10:  * modification, are permitted provided that the following conditions
                     11:  * are met:
                     12:  * 1. Redistributions of source code must retain the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer.
                     14:  * 2. Redistributions in binary form must reproduce the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer in the
                     16:  *    documentation and/or other materials provided with the distribution.
                     17:  * 3. All advertising materials mentioning features or use of this software
                     18:  *    must display the following acknowledgement:
                     19:  *      This product includes software developed by Matt Fredette.
                     20:  * 4. The name of the author may not be used to endorse or promote products
                     21:  *    derived from this software without specific prior written permission.
                     22:  *
                     23:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     24:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
                     25:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
                     26:  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
                     27:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
                     28:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
                     29:  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     30:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
                     31:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
                     32:  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     33:  * POSSIBILITY OF SUCH DAMAGE.
                     34:  */
                     35: 
                     36: #include <tme/common.h>
                     37: _TME_RCSID("$Id: ieee754-misc.c,v 1.2 2005/05/14 22:18:37 fredette Exp $");
                     38: 
                     39: /* includes: */
                     40: #include <tme/ic/ieee754.h>
                     41: 
                     42: /* constants: */
                     43: 
                     44: const tme_uint32_t tme_ieee754_single_constant_pi = 0x40490fdb;
                     45: const tme_uint32_t tme_ieee754_single_constant_log10_2 = 0x3e9a209b;
                     46: const tme_uint32_t tme_ieee754_single_constant_e = 0x402df854;
                     47: const tme_uint32_t tme_ieee754_single_constant_log2_e = 0x3fb8aa3b;
                     48: const tme_uint32_t tme_ieee754_single_constant_log10_e = 0x3ede5bd9;
                     49: const tme_uint32_t tme_ieee754_single_constant_zero = 0x00000000;
                     50: const tme_uint32_t tme_ieee754_single_constant_ln_2 = 0x3f317218;
                     51: const tme_uint32_t tme_ieee754_single_constant_ln_10 = 0x40135d8e;
                     52: const tme_uint32_t tme_ieee754_single_constant_one = 0x3f800000;
                     53: const struct tme_ieee754_double_constant tme_ieee754_double_constant_pi = { 0x400921fb, 0x5421d100 };
                     54: const struct tme_ieee754_double_constant tme_ieee754_double_constant_log10_2 = { 0x3fd34413, 0x509f79ff };
                     55: const struct tme_ieee754_double_constant tme_ieee754_double_constant_e = { 0x4005bf0a, 0x8b145769 };
                     56: const struct tme_ieee754_double_constant tme_ieee754_double_constant_log2_e = { 0x3ff71547, 0x652b82fe };
                     57: const struct tme_ieee754_double_constant tme_ieee754_double_constant_log10_e = { 0x3fdbcb7b, 0x1526e50e };
                     58: const struct tme_ieee754_double_constant tme_ieee754_double_constant_zero = { 0x00000000, 0x00000000 };
                     59: const struct tme_ieee754_double_constant tme_ieee754_double_constant_ln_2 = { 0x3fe62e42, 0xfefa39ef };
                     60: const struct tme_ieee754_double_constant tme_ieee754_double_constant_ln_10 = { 0x40026bb1, 0xbbb55516 };
                     61: const struct tme_ieee754_double_constant tme_ieee754_double_constant_one = { 0x3ff00000, 0x00000000 };
                     62: const struct tme_ieee754_extended80_constant tme_ieee754_extended80_constant_pi = { 0x4000, 0xc90fdaa2, 0x2168c000 };
                     63: const struct tme_ieee754_extended80_constant tme_ieee754_extended80_constant_log10_2 = { 0x3ffd, 0x9a209a84, 0xfbcff800 };
                     64: const struct tme_ieee754_extended80_constant tme_ieee754_extended80_constant_e = { 0x4000, 0xadf85458, 0xa2bb4800 };
                     65: const struct tme_ieee754_extended80_constant tme_ieee754_extended80_constant_log2_e = { 0x3fff, 0xb8aa3b29, 0x5c17f000 };
                     66: const struct tme_ieee754_extended80_constant tme_ieee754_extended80_constant_log10_e = { 0x3ffd, 0xde5bd8a9, 0x37287000 };
                     67: const struct tme_ieee754_extended80_constant tme_ieee754_extended80_constant_zero = { 0x0000, 0x00000000, 0x00000000 };
                     68: const struct tme_ieee754_extended80_constant tme_ieee754_extended80_constant_ln_2 = { 0x3ffe, 0xb17217f7, 0xd1cf7800 };
                     69: const struct tme_ieee754_extended80_constant tme_ieee754_extended80_constant_ln_10 = { 0x4000, 0x935d8ddd, 0xaaa8b000 };
                     70: const struct tme_ieee754_extended80_constant tme_ieee754_extended80_constant_one = { 0x3fff, 0x80000000, 0x00000000 };
                     71: 
                     72: /* IEEE 754 single precision values of the form 2^x, where x is a power of two: */
                     73: const tme_uint32_t tme_ieee754_single_constant_2e2ex[] = {
                     74: 
                     75:   /* 2^1: */
                     76:   0x40000000,
                     77: 
                     78:   /* 2^2: */
                     79:   0x40800000,
                     80: 
                     81:   /* 2^4: */
                     82:   0x41800000,
                     83: 
                     84:   /* 2^8: */
                     85:   0x43800000,
                     86: 
                     87:   /* 2^16: */
                     88:   0x47800000,
                     89: 
                     90:   /* 2^32: */
                     91:   0x4f800000,
                     92: 
                     93:   /* 2^64: */
                     94:   0x5f800000
                     95: };
                     96: 
                     97: /* IEEE 754 single precision values of the form 2^-x, where x is a power of two: */
                     98: const tme_uint32_t tme_ieee754_single_constant_2e_minus_2ex[] = {
                     99: 
                    100:   /* 2^-1: */
                    101:   0x3f000000,
                    102: 
                    103:   /* 2^-2: */
                    104:   0x3e800000,
                    105: 
                    106:   /* 2^-4: */
                    107:   0x3d800000,
                    108: 
                    109:   /* 2^-8: */
                    110:   0x3b800000,
                    111: 
                    112:   /* 2^-16: */
                    113:   0x37800000,
                    114: 
                    115:   /* 2^-32: */
                    116:   0x2f800000,
                    117: 
                    118:   /* 2^-64: */
                    119:   0x1f800000
                    120: };
                    121: 
                    122: /* IEEE 754 single precision values of the form 10^x, where x is a power of two: */
                    123: const tme_uint32_t tme_ieee754_single_constant_10e2ex[] = {
                    124: 
                    125:   /* 10^1: */
                    126:   0x41200000,
                    127: 
                    128:   /* 10^2: */
                    129:   0x42c80000,
                    130: 
                    131:   /* 10^4: */
                    132:   0x461c4000,
                    133: 
                    134:   /* 10^8: */
                    135:   0x4cbebc20,
                    136: 
                    137:   /* 10^16: */
                    138:   0x5a0e1bca,
                    139: 
                    140:   /* 10^32: */
                    141:   0x749dc5ae
                    142: };
                    143: 
                    144: /* IEEE 754 single precision values of the form 10^-x, where x is a power of two: */
                    145: const tme_uint32_t tme_ieee754_single_constant_10e_minus_2ex[] = {
                    146: 
                    147:   /* 10^-1: */
                    148:   0x3dcccccd,
                    149: 
                    150:   /* 10^-2: */
                    151:   0x3c23d70b,
                    152: 
                    153:   /* 10^-4: */
                    154:   0x38d1b719,
                    155: 
                    156:   /* 10^-8: */
                    157:   0x322bcc7a,
                    158: 
                    159:   /* 10^-16: */
                    160:   0x24e6959d,
                    161: 
                    162:   /* 10^-32: */
                    163:   0x0a4fb12e
                    164: };
                    165: 
                    166: /* IEEE 754 double precision values of the form 2^x, where x is a power of two: */
                    167: const struct tme_ieee754_double_constant tme_ieee754_double_constant_2e2ex[] = {
                    168: 
                    169:   /* 2^1: */
                    170:   { 0x40000000, 0x00000000 },
                    171: 
                    172:   /* 2^2: */
                    173:   { 0x40100000, 0x00000000 },
                    174: 
                    175:   /* 2^4: */
                    176:   { 0x40300000, 0x00000000 },
                    177: 
                    178:   /* 2^8: */
                    179:   { 0x40700000, 0x00000000 },
                    180: 
                    181:   /* 2^16: */
                    182:   { 0x40f00000, 0x00000000 },
                    183: 
                    184:   /* 2^32: */
                    185:   { 0x41f00000, 0x00000000 },
                    186: 
                    187:   /* 2^64: */
                    188:   { 0x43f00000, 0x00000000 },
                    189: 
                    190:   /* 2^128: */
                    191:   { 0x47f00000, 0x00000000 },
                    192: 
                    193:   /* 2^256: */
                    194:   { 0x4ff00000, 0x00000000 },
                    195: 
                    196:   /* 2^512: */
                    197:   { 0x5ff00000, 0x00000000 }
                    198: };
                    199: 
                    200: /* IEEE 754 double precision values of the form 2^-x, where x is a power of two: */
                    201: const struct tme_ieee754_double_constant tme_ieee754_double_constant_2e_minus_2ex[] = {
                    202: 
                    203:   /* 2^-1: */
                    204:   { 0x3fe00000, 0x00000000 },
                    205: 
                    206:   /* 2^-2: */
                    207:   { 0x3fd00000, 0x00000000 },
                    208: 
                    209:   /* 2^-4: */
                    210:   { 0x3fb00000, 0x00000000 },
                    211: 
                    212:   /* 2^-8: */
                    213:   { 0x3f700000, 0x00000000 },
                    214: 
                    215:   /* 2^-16: */
                    216:   { 0x3ef00000, 0x00000000 },
                    217: 
                    218:   /* 2^-32: */
                    219:   { 0x3df00000, 0x00000000 },
                    220: 
                    221:   /* 2^-64: */
                    222:   { 0x3bf00000, 0x00000000 },
                    223: 
                    224:   /* 2^-128: */
                    225:   { 0x37f00000, 0x00000000 },
                    226: 
                    227:   /* 2^-256: */
                    228:   { 0x2ff00000, 0x00000000 },
                    229: 
                    230:   /* 2^-512: */
                    231:   { 0x1ff00000, 0x00000000 }
                    232: };
                    233: 
                    234: /* IEEE 754 double precision values of the form 10^x, where x is a power of two: */
                    235: const struct tme_ieee754_double_constant tme_ieee754_double_constant_10e2ex[] = {
                    236: 
                    237:   /* 10^1: */
                    238:   { 0x40240000, 0x00000000 },
                    239: 
                    240:   /* 10^2: */
                    241:   { 0x40590000, 0x00000000 },
                    242: 
                    243:   /* 10^4: */
                    244:   { 0x40c38800, 0x00000000 },
                    245: 
                    246:   /* 10^8: */
                    247:   { 0x4197d784, 0x00000000 },
                    248: 
                    249:   /* 10^16: */
                    250:   { 0x4341c379, 0x37e08000 },
                    251: 
                    252:   /* 10^32: */
                    253:   { 0x4693b8b5, 0xb5056e17 },
                    254: 
                    255:   /* 10^64: */
                    256:   { 0x4d384f03, 0xe93ff9f6 },
                    257: 
                    258:   /* 10^128: */
                    259:   { 0x5a827748, 0xf9301d33 },
                    260: 
                    261:   /* 10^256: */
                    262:   { 0x75154fdd, 0x7f73bf3f }
                    263: };
                    264: 
                    265: /* IEEE 754 double precision values of the form 10^-x, where x is a power of two: */
                    266: const struct tme_ieee754_double_constant tme_ieee754_double_constant_10e_minus_2ex[] = {
                    267: 
                    268:   /* 10^-1: */
                    269:   { 0x3fb99999, 0x9999999a },
                    270: 
                    271:   /* 10^-2: */
                    272:   { 0x3f847ae1, 0x47ae147c },
                    273: 
                    274:   /* 10^-4: */
                    275:   { 0x3f1a36e2, 0xeb1c4330 },
                    276: 
                    277:   /* 10^-8: */
                    278:   { 0x3e45798e, 0xe2308c3f },
                    279: 
                    280:   /* 10^-16: */
                    281:   { 0x3c9cd2b2, 0x97d889ca },
                    282: 
                    283:   /* 10^-32: */
                    284:   { 0x3949f623, 0xd5a8a74c },
                    285: 
                    286:   /* 10^-64: */
                    287:   { 0x32a50ffd, 0x44f4a766 },
                    288: 
                    289:   /* 10^-128: */
                    290:   { 0x255bba08, 0xcf8c9808 },
                    291: 
                    292:   /* 10^-256: */
                    293:   { 0x0ac80628, 0x64ac6ffd }
                    294: };
                    295: 
                    296: /* IEEE 754 extended80 precision values of the form 2^x, where x is a power of two: */
                    297: const struct tme_ieee754_extended80_constant tme_ieee754_extended80_constant_2e2ex[] = {
                    298: 
                    299:   /* 2^1: */
                    300:   { 0x4000, 0x80000000, 0x00000000 },
                    301: 
                    302:   /* 2^2: */
                    303:   { 0x4001, 0x80000000, 0x00000000 },
                    304: 
                    305:   /* 2^4: */
                    306:   { 0x4003, 0x80000000, 0x00000000 },
                    307: 
                    308:   /* 2^8: */
                    309:   { 0x4007, 0x80000000, 0x00000000 },
                    310: 
                    311:   /* 2^16: */
                    312:   { 0x400f, 0x80000000, 0x00000000 },
                    313: 
                    314:   /* 2^32: */
                    315:   { 0x401f, 0x80000000, 0x00000000 },
                    316: 
                    317:   /* 2^64: */
                    318:   { 0x403f, 0x80000000, 0x00000000 },
                    319: 
                    320:   /* 2^128: */
                    321:   { 0x407f, 0x80000000, 0x00000000 },
                    322: 
                    323:   /* 2^256: */
                    324:   { 0x40ff, 0x80000000, 0x00000000 },
                    325: 
                    326:   /* 2^512: */
                    327:   { 0x41ff, 0x80000000, 0x00000000 },
                    328: 
                    329:   /* 2^1024: */
                    330:   { 0x43ff, 0x80000000, 0x00000000 },
                    331: 
                    332:   /* 2^2048: */
                    333:   { 0x47ff, 0x80000000, 0x00000000 },
                    334: 
                    335:   /* 2^4096: */
                    336:   { 0x4fff, 0x80000000, 0x00000000 },
                    337: 
                    338:   /* 2^8192: */
                    339:   { 0x5fff, 0x80000000, 0x00000000 }
                    340: };
                    341: 
                    342: /* IEEE 754 extended80 precision values of the form 2^-x, where x is a power of two: */
                    343: const struct tme_ieee754_extended80_constant tme_ieee754_extended80_constant_2e_minus_2ex[] = {
                    344: 
                    345:   /* 2^-1: */
                    346:   { 0x3ffe, 0x80000000, 0x00000000 },
                    347: 
                    348:   /* 2^-2: */
                    349:   { 0x3ffd, 0x80000000, 0x00000000 },
                    350: 
                    351:   /* 2^-4: */
                    352:   { 0x3ffb, 0x80000000, 0x00000000 },
                    353: 
                    354:   /* 2^-8: */
                    355:   { 0x3ff7, 0x80000000, 0x00000000 },
                    356: 
                    357:   /* 2^-16: */
                    358:   { 0x3fef, 0x80000000, 0x00000000 },
                    359: 
                    360:   /* 2^-32: */
                    361:   { 0x3fdf, 0x80000000, 0x00000000 },
                    362: 
                    363:   /* 2^-64: */
                    364:   { 0x3fbf, 0x80000000, 0x00000000 },
                    365: 
                    366:   /* 2^-128: */
                    367:   { 0x3f7f, 0x80000000, 0x00000000 },
                    368: 
                    369:   /* 2^-256: */
                    370:   { 0x3eff, 0x80000000, 0x00000000 },
                    371: 
                    372:   /* 2^-512: */
                    373:   { 0x3dff, 0x80000000, 0x00000000 },
                    374: 
                    375:   /* 2^-1024: */
                    376:   { 0x3bff, 0x80000000, 0x00000000 },
                    377: 
                    378:   /* 2^-2048: */
                    379:   { 0x37ff, 0x80000000, 0x00000000 },
                    380: 
                    381:   /* 2^-4096: */
                    382:   { 0x2fff, 0x80000000, 0x00000000 },
                    383: 
                    384:   /* 2^-8192: */
                    385:   { 0x1fff, 0x80000000, 0x00000000 }
                    386: };
                    387: 
                    388: /* IEEE 754 extended80 precision values of the form 10^x, where x is a power of two: */
                    389: const struct tme_ieee754_extended80_constant tme_ieee754_extended80_constant_10e2ex[] = {
                    390: 
                    391:   /* 10^1: */
                    392:   { 0x4002, 0xa0000000, 0x00000000 },
                    393: 
                    394:   /* 10^2: */
                    395:   { 0x4005, 0xc8000000, 0x00000000 },
                    396: 
                    397:   /* 10^4: */
                    398:   { 0x400c, 0x9c400000, 0x00000000 },
                    399: 
                    400:   /* 10^8: */
                    401:   { 0x4019, 0xbebc2000, 0x00000000 },
                    402: 
                    403:   /* 10^16: */
                    404:   { 0x4034, 0x8e1bc9bf, 0x04000000 },
                    405: 
                    406:   /* 10^32: */
                    407:   { 0x4069, 0x9dc5ada8, 0x2b70b800 },
                    408: 
                    409:   /* 10^64: */
                    410:   { 0x40d3, 0xc2781f49, 0xffcfb000 },
                    411: 
                    412:   /* 10^128: */
                    413:   { 0x41a8, 0x93ba47c9, 0x80e99800 },
                    414: 
                    415:   /* 10^256: */
                    416:   { 0x4351, 0xaa7eebfb, 0x9df9f800 },
                    417: 
                    418:   /* 10^512: */
                    419:   { 0x46a3, 0xe319a0ae, 0xa60ed800 },
                    420: 
                    421:   /* 10^1024: */
                    422:   { 0x4d48, 0xc9767586, 0x81758800 },
                    423: 
                    424:   /* 10^2048: */
                    425:   { 0x5a92, 0x9e8b3b5d, 0xc53e2000 },
                    426: 
                    427:   /* 10^4096: */
                    428:   { 0x7525, 0xc4605202, 0x8a227800 }
                    429: };
                    430: 
                    431: /* IEEE 754 extended80 precision values of the form 10^-x, where x is a power of two: */
                    432: const struct tme_ieee754_extended80_constant tme_ieee754_extended80_constant_10e_minus_2ex[] = {
                    433: 
                    434:   /* 10^-1: */
                    435:   { 0x3ffb, 0xcccccccc, 0xccccd000 },
                    436: 
                    437:   /* 10^-2: */
                    438:   { 0x3ff8, 0xa3d70a3d, 0x70a3e000 },
                    439: 
                    440:   /* 10^-4: */
                    441:   { 0x3ff1, 0xd1b71758, 0xe2198000 },
                    442: 
                    443:   /* 10^-8: */
                    444:   { 0x3fe4, 0xabcc7711, 0x8461f800 },
                    445: 
                    446:   /* 10^-16: */
                    447:   { 0x3fc9, 0xe69594be, 0xc44e5000 },
                    448: 
                    449:   /* 10^-32: */
                    450:   { 0x3f94, 0xcfb11ead, 0x453a6000 },
                    451: 
                    452:   /* 10^-64: */
                    453:   { 0x3f2a, 0xa87fea27, 0xa53b3000 },
                    454: 
                    455:   /* 10^-128: */
                    456:   { 0x3e55, 0xddd0467c, 0x64c04000 },
                    457: 
                    458:   /* 10^-256: */
                    459:   { 0x3cac, 0xc0314325, 0x637fe800 },
                    460: 
                    461:   /* 10^-512: */
                    462:   { 0x395a, 0x9049ee32, 0xdb2c8800 },
                    463: 
                    464:   /* 10^-1024: */
                    465:   { 0x32b5, 0xa2a682a5, 0xda6b6800 },
                    466: 
                    467:   /* 10^-2048: */
                    468:   { 0x256b, 0xceae534f, 0x34682000 },
                    469: 
                    470:   /* 10^-4096: */
                    471:   { 0x0ad8, 0xa6dd04c8, 0xd31f4800 }
                    472: };
                    473: 
                    474: /* the native floating-point exception function: */
                    475: void
                    476: tme_ieee754_exception_float(int exceptions, void *_ieee754_ctl)
                    477: {
                    478:   struct tme_ieee754_ctl *ieee754_ctl;
                    479: 
                    480:   /* recover our global control: */
                    481:   ieee754_ctl = (struct tme_ieee754_ctl *) _ieee754_ctl;
                    482: 
                    483:   /* signal the exception: */
                    484:   (*ieee754_ctl->tme_ieee754_ctl_exception)(ieee754_ctl, exceptions);
                    485: }
                    486: 
                    487: /* the softfloat unlock function: */
                    488: int
                    489: tme_ieee754_unlock_softfloat(void)
                    490: {
                    491:   int exceptions;
                    492: 
                    493:   tme_ieee754_global_ctl = NULL;
                    494:   exceptions = tme_ieee754_global_exceptions;
                    495:   tme_mutex_unlock(&tme_ieee754_global_mutex);
                    496:   return (exceptions);
                    497: }
                    498: 
                    499: #include "ieee754-misc-auto.c"

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.