|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.