Annotation of 43BSDReno/pgrm/lisp/franz/tahoe/mulbig.c, revision 1.1.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.