Annotation of tme/ic/ieee754/ieee754-misc.c, revision 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.