X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=device%2Flib%2Fpic%2Flibsdcc%2Ffsmul.c;h=34279826c506b6bfcb71013bf558d6408f3db849;hb=5c167d844868e592617c9a8f1355abb9e29647a9;hp=9752800c6cbfc216ebe30d06e50a3a8f7fc7e51d;hpb=4a739655b9d81efc3155fdd9326ac1f55d415253;p=fw%2Fsdcc diff --git a/device/lib/pic/libsdcc/fsmul.c b/device/lib/pic/libsdcc/fsmul.c index 9752800c..34279826 100644 --- a/device/lib/pic/libsdcc/fsmul.c +++ b/device/lib/pic/libsdcc/fsmul.c @@ -1,86 +1,86 @@ -/* -** libgcc support for software floating point. -** Copyright (C) 1991 by Pipeline Associates, Inc. All rights reserved. -** Permission is granted to do *anything* you want with this file, -** commercial or otherwise, provided this message remains intact. So there! -** I would appreciate receiving any updates/patches/changes that anyone -** makes, and am willing to be the repository for said changes (am I -** making a big mistake?). -** -** Pat Wood -** Pipeline Associates, Inc. -** pipeline!phw@motown.com or -** sun!pipeline!phw or -** uunet!motown!pipeline!phw -*/ - -/* -** $Id: fsmul.c 3513 2004-10-01 14:49:51Z vrokas $ -*/ - -/* (c)2000/2001: hacked a little by johan.knol@iduna.nl for sdcc */ - -#include - -union float_long - { - float f; - unsigned long l; - }; - -/* multiply two floats */ -float __fsmul (float a1, float a2) _FS_REENTRANT -{ - FS_STATIC volatile union float_long fl1, fl2; - unsigned long result; - int exp; - char sign; - - fl1.f = a1; - fl2.f = a2; - - if (!fl1.l || !fl2.l) - return (0); - - /* compute sign and exponent */ - sign = SIGN (fl1.l) ^ SIGN (fl2.l); - exp = EXP (fl1.l) - EXCESS; - exp += EXP (fl2.l); - - fl1.l = MANT (fl1.l); - fl2.l = MANT (fl2.l); - - /* the multiply is done as one 16x16 multiply and two 16x8 multiples */ - result = (fl1.l >> 8) * (fl2.l >> 8); - result += ((fl1.l & (unsigned long) 0xFF) * (fl2.l >> 8)) >> 8; - result += ((fl2.l & (unsigned long) 0xFF) * (fl1.l >> 8)) >> 8; - - if (0 != (result & SIGNBIT)) - { - /* round */ - result += 0x80; - result >>= 8; - } - else - { - /* round */ - result += 0x40; - result >>= 7; - exp--; - } - - result &= ~HIDDEN; - - /* pack up and go home */ - if (exp >= 0x100) - fl1.l = (sign ? SIGNBIT : 0) | 0x7F800000; - else if (exp < 0) - fl1.l = 0; - else - fl1.l = PACK (sign ? SIGNBIT : 0 , exp, result); - return (fl1.f); -} - - - - +/* +** libgcc support for software floating point. +** Copyright (C) 1991 by Pipeline Associates, Inc. All rights reserved. +** Permission is granted to do *anything* you want with this file, +** commercial or otherwise, provided this message remains intact. So there! +** I would appreciate receiving any updates/patches/changes that anyone +** makes, and am willing to be the repository for said changes (am I +** making a big mistake?). +** +** Pat Wood +** Pipeline Associates, Inc. +** pipeline!phw@motown.com or +** sun!pipeline!phw or +** uunet!motown!pipeline!phw +*/ + +/* +** $Id$ +*/ + +/* (c)2000/2001: hacked a little by johan.knol@iduna.nl for sdcc */ + +#include + +union float_long + { + float f; + unsigned long l; + }; + +/* multiply two floats */ +float __fsmul (float a1, float a2) _FS_REENTRANT +{ + FS_STATIC volatile union float_long fl1, fl2; + unsigned long result; + int exp; + char sign; + + fl1.f = a1; + fl2.f = a2; + + if (!fl1.l || !fl2.l) + return (0); + + /* compute sign and exponent */ + sign = SIGN (fl1.l) ^ SIGN (fl2.l); + exp = EXP (fl1.l) - EXCESS; + exp += EXP (fl2.l); + + fl1.l = MANT (fl1.l); + fl2.l = MANT (fl2.l); + + /* the multiply is done as one 16x16 multiply and two 16x8 multiples */ + result = (fl1.l >> 8) * (fl2.l >> 8); + result += ((fl1.l & (unsigned long) 0xFF) * (fl2.l >> 8)) >> 8; + result += ((fl2.l & (unsigned long) 0xFF) * (fl1.l >> 8)) >> 8; + + if (0 != (result & SIGNBIT)) + { + /* round */ + result += 0x80; + result >>= 8; + } + else + { + /* round */ + result += 0x40; + result >>= 7; + exp--; + } + + result &= ~HIDDEN; + + /* pack up and go home */ + if (exp >= 0x100) + fl1.l = (sign ? SIGNBIT : 0) | 0x7F800000; + else if (exp < 0) + fl1.l = 0; + else + fl1.l = PACK (sign ? SIGNBIT : 0 , exp, result); + return (fl1.f); +} + + + +