Annotation of coherent/d/usr/lib/libmp/msma.c, revision 1.1

1.1     ! root        1: #include "mprec.h"
        !             2: #include <assert.h>
        !             3: 
        !             4: 
        !             5: /*
        !             6:  *     Msma takes the mint pointed to by "to" and adds to it (in place)
        !             7:  *     the product of the following :
        !             8:  *             1. the mint pointed to by "from".
        !             9:  *             2. the int "fac" (it is assumed that 0 <= fac < 2 * BASE).
        !            10:  *             3. BASE raised to the "shift" power.
        !            11:  *     Note that it is assumed that the length of "to" is big enough to
        !            12:  *     hold the result.
        !            13:  *     It is also assumed that "from" and "to" are distinct.
        !            14:  */
        !            15: 
        !            16: void
        !            17: msma(from, fac, shift, to)
        !            18: mint *from, *to;
        !            19: int fac;
        !            20: unsigned shift;
        !            21: {
        !            22:        register int carry;
        !            23:        register char *fp, *tp;
        !            24:        register unsigned count;
        !            25:        int mifl;
        !            26: 
        !            27:        assert(0 <= fac && fac < 2 * BASE);
        !            28: 
        !            29:        /* general case needs fac != 0, so handle fac == 0 */
        !            30:        if (fac == 0)
        !            31:                return;
        !            32: 
        !            33:        /* find out sign of "from" */
        !            34:        mifl = ispos(from);
        !            35: 
        !            36:        /* do the multiply assuming "from" is positive */
        !            37:        fp = from->val;
        !            38:        tp = to->val + shift;
        !            39:        carry = 0;
        !            40:        count = from->len;
        !            41:        if (!mifl)
        !            42:                --count;
        !            43:        assert(tp + count <= to->val + to->len);
        !            44:        while (count-- != 0) {
        !            45:                carry += *tp + *fp++ * fac;
        !            46:                *tp++ = carry % BASE;
        !            47:                carry >>= L2BASE;
        !            48:        }
        !            49: 
        !            50:        /* propogate carry or borrow */
        !            51:        count = to->val + to->len - tp;
        !            52:        if (!mifl)
        !            53:                carry -= fac;
        !            54:        while (count-- != 0 && carry != 0) {
        !            55:                carry += *tp + BASE;
        !            56:                *tp++ = carry % BASE;
        !            57:                carry = (carry >> L2BASE) - 1;
        !            58:        }
        !            59: }

unix.superglobalmegacorp.com

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