Annotation of 43BSDReno/pgrm/lisp/franz/tahoe/mulbig.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *
        !             3:  * Copyright (c) 1982, Regents, University of California
        !             4:  *
        !             5:  */
        !             6: 
        !             7: #include "global.h"
        !             8: 
        !             9: struct s_dot
        !            10:        {long I;
        !            11:         struct s_dot *CDR;
        !            12:        };
        !            13: struct vl
        !            14:        {long high;
        !            15:         long low;
        !            16:        };
        !            17: 
        !            18: struct s_dot *mulbig(a,b)
        !            19: struct s_dot *a, *b;
        !            20: {
        !            21:        int la = 1, lb = 1;
        !            22:        long *sa, *sb, *sc, *base, *alloca();
        !            23:        struct s_dot *export();
        !            24:        register struct s_dot *p;
        !            25:        register int *q, *r, *s;
        !            26:        long carry = 0, test;
        !            27:        struct vl work;
        !            28:        Keepxs();
        !            29: 
        !            30:        /* compute lengths */
        !            31:        
        !            32:        for(p = a; p->CDR; p = p->CDR) la++;
        !            33:        for(p = b; p->CDR; p = p->CDR) lb++;
        !            34: 
        !            35:        /* allocate storage areas on the stack */
        !            36: 
        !            37:        base = alloca((la + la + lb + lb + 1)*sizeof(long));
        !            38:        sc = base + la + lb + 1;
        !            39:        sb = sc + lb;
        !            40:        sa = sb + la;
        !            41:        q  = sa;
        !            42: 
        !            43:        /* copy s_dots onto stack */
        !            44:        p = a;
        !            45:        do { *--q = p->I; p = p->CDR; } while (p);
        !            46:        p = b;
        !            47:        do { *--q = p->I; p = p->CDR; } while (p);
        !            48:        while(q > base) *--q = 0;  /* initialize target */
        !            49: 
        !            50:        /* perform the multiplication */
        !            51:        for(q = sb; q > sc; *--s = carry)
        !            52:            for((r = sa, s = (q--) - lb, carry = 0); r > sb;)
        !            53:            {
        !            54:                    carry += *--s;
        !            55:                    --r;
        !            56:                    asm("emul   (r11),(r10),-80(fp),-92(fp)");
        !            57:                /*  emul(*q,*--r,carry,&work);  */
        !            58:                    test = work.low;
        !            59:                    carry = work.high << 2;
        !            60:                    if(test < 0) carry += 2;
        !            61:                    if(test & 0x40000000) carry +=1;
        !            62:                    *s = test & 0x3fffffff;
        !            63:            }
        !            64: 
        !            65:        p = export(sc,base);
        !            66:        Freexs();
        !            67:        return(p);
        !            68: }

unix.superglobalmegacorp.com

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