Annotation of 42BSD/ucb/lisp/franz/68k/mlsb.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1982, Regents, University of California */
                      2: 
                      3: struct vl      { long high; long low; };
                      4: long
                      5: mlsb(utop,ubot,vtop,nqhat)
                      6: register long *utop, *ubot, *vtop;
                      7: register nqhat;
                      8: {
                      9:        register handy, carry;
                     10:        struct vl work;
                     11:        
                     12:        for(carry = 0; utop >= ubot; utop--) {
                     13:                emul(nqhat,*--vtop,carry+*utop,&work);
                     14:                carry = work.high;
                     15:                handy = work.low;
                     16:                *utop = handy & 0x3fffffff;
                     17:                carry <<= 2;
                     18:                if(handy & 0x80000000) carry += 2;
                     19:                if(handy & 0x40000000) carry += 1;
                     20:        }
                     21:        return(carry);
                     22: }
                     23: long
                     24: adback(utop,ubot,vtop)
                     25: register long *utop, *ubot, *vtop;
                     26: {
                     27:        register handy, carry;
                     28:        carry = 0;
                     29:        for(; utop >= ubot; utop--) {
                     30:                carry += *--vtop;
                     31:                carry += *utop;
                     32:                *utop = carry & 0x3fffffff;
                     33:                /* next junk is faster version of  carry >>= 30; */
                     34:                handy = carry;
                     35:                carry = 0;
                     36:                if(handy & 0x80000000) carry -= 2;
                     37:                if(handy & 0x40000000) carry += 1;
                     38:        }
                     39:        return(carry);
                     40: }
                     41: long dsdiv(top,bot,div)
                     42: register long *top, *bot;
                     43: register long div;
                     44: {
                     45:        struct vl work; char err;
                     46:        register long handy, carry = 0;
                     47:        for(carry = 0;bot <= top; bot++) {
                     48:                handy = *bot;
                     49:                if(carry & 1) handy |= 0x40000000;
                     50:                if(carry & 2) handy |= 0x80000000;
                     51:                carry >>= 2;
                     52:                work.low = handy;
                     53:                work.high = carry;
                     54:                *bot = ediv(&work,div,&err);
                     55:                carry = work.high;
                     56:        }
                     57:        return(carry);
                     58: }
                     59: dsadd1(top,bot)
                     60: long *top, *bot;
                     61: {
                     62:        register long *p, work, carry = 0;
                     63: 
                     64:        /*
                     65:         * this assumes canonical inputs
                     66:         */
                     67:        for(p = top; p >= bot; p--) {
                     68:                work = *p + carry;
                     69:                *p = work & 0x3fffffff;
                     70:                carry = 0;
                     71:                if (work & 0x40000000) carry += 1;
                     72:                if (work & 0x80000000) carry -= 2;
                     73:        }
                     74:        p[1] = work;
                     75: }
                     76: long
                     77: dsrsh(top,bot,ncnt,mask1)
                     78: long *top, *bot;
                     79: long ncnt, mask1;
                     80: {
                     81:        register long *p = bot;
                     82:        register r = -ncnt, l = 30+ncnt, carry = 0, work, save;
                     83:        long mask = -1 ^ mask1;
                     84: 
                     85:        while(p <= top) {
                     86:                save = work = *p; save &= mask; work >>= r;
                     87:                carry <<= l; work |= carry; *p++ = work;
                     88:                carry = save;
                     89:        }
                     90:        return(carry);
                     91: }

unix.superglobalmegacorp.com

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