|
|
1.1 ! root 1: /* file: mlsb.c ! 2: ** functions: mlsb(), adback(), dsdiv(), dsadd1(), dsrsh() ! 3: /* Copyright (c) 1982, Regents, University of California */ ! 4: ! 5: struct vl /* very long? */ ! 6: {long high; ! 7: long low; ! 8: }; ! 9: ! 10: long mlsb(utop,ubot,vtop,nqhat) ! 11: long *utop; register long *ubot, *vtop; ! 12: register nqhat; ! 13: { ! 14: register handy, carry; ! 15: struct vl work; ! 16: ! 17: for(carry = 0; utop >= ubot; utop--) { ! 18: ! 19: --vtop; ! 20: asm("addl3 r8,*4(fp),r0"); ! 21: asm("emul r10,(r11),r0,-60(fp)"); ! 22: ! 23: carry = work.high; ! 24: handy = work.low; ! 25: *utop = handy & 0x3fffffff; ! 26: carry <<= 2; ! 27: if(handy & 0x80000000) carry += 2; ! 28: if(handy & 0x40000000) carry += 1; ! 29: } ! 30: return(carry); ! 31: } ! 32: ! 33: long adback(utop,ubot,vtop) ! 34: register long *utop, *ubot, *vtop; ! 35: { ! 36: register handy, carry; ! 37: carry = 0; ! 38: for(; utop >= ubot; utop--) { ! 39: carry += *--vtop; ! 40: carry += *utop; ! 41: *utop = carry & 0x3fffffff; ! 42: /* next junk is faster version of carry >>= 30; */ ! 43: handy = carry; ! 44: carry = 0; ! 45: if(handy & 0x80000000) carry -= 2; ! 46: if(handy & 0x40000000) carry += 1; ! 47: } ! 48: return(carry); ! 49: } ! 50: ! 51: long dsdiv(top,bot,div) ! 52: register long *top, *bot; ! 53: register long div; ! 54: { ! 55: struct vl work; char err; ! 56: register long handy, carry = 0; ! 57: for(carry = 0;bot <= top; bot++) { ! 58: handy = *bot; ! 59: if(carry & 1) handy |= 0x40000000; ! 60: if(carry & 2) handy |= 0x80000000; ! 61: carry >>= 2; ! 62: work.low = handy; ! 63: work.high = carry; ! 64: /* *bot = ediv(&work,div,&err); */ ! 65: /* carry = work.high; */ ! 66: asm("ediv r10,-60(fp),(r11),r8"); ! 67: } ! 68: return(carry); ! 69: } ! 70: ! 71: dsadd1(top,bot) ! 72: long *top, *bot; ! 73: { ! 74: register long *p, work, carry = 0; ! 75: ! 76: /* ! 77: * this assumes canonical inputs ! 78: */ ! 79: for(p = top; p >= bot; p--) { ! 80: work = *p + carry; ! 81: *p = work & 0x3fffffff; ! 82: carry = 0; ! 83: if (work & 0x40000000) carry += 1; ! 84: if (work & 0x80000000) carry -= 2; ! 85: } ! 86: p[1] = work; ! 87: } ! 88: ! 89: long dsrsh(top,bot,ncnt,mask1) ! 90: long *top, *bot; ! 91: long ncnt, mask1; ! 92: { ! 93: register long *p = bot; ! 94: register r = -ncnt, l = 30+ncnt, carry = 0, work, save; ! 95: long mask = -1 ^ mask1; ! 96: ! 97: while(p <= top) { ! 98: save = work = *p; save &= mask; work >>= r; ! 99: carry <<= l; work |= carry; *p++ = work; ! 100: carry = save; ! 101: } ! 102: return(carry); ! 103: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.