Annotation of lucent/sys/src/libc/68020/vlrt.c, revision 1.1

1.1     ! root        1: typedef        unsigned long ulong;
        !             2: typedef        unsigned char uchar;
        !             3: typedef        unsigned short ushort;
        !             4: typedef        signed char schar;
        !             5: 
        !             6: #define        SIGN(n) (1UL<<(n-1))
        !             7: 
        !             8: typedef        struct  Vlong   Vlong;
        !             9: struct Vlong
        !            10: {
        !            11:        union
        !            12:        {
        !            13:                struct
        !            14:                {
        !            15:                        ulong   hi;
        !            16:                        ulong   lo;
        !            17:                };
        !            18:                struct
        !            19:                {
        !            20:                        ushort  hims;
        !            21:                        ushort  hils;
        !            22:                        ushort  loms;
        !            23:                        ushort  lols;
        !            24:                };
        !            25:        };
        !            26: };
        !            27: 
        !            28: void   abort(void);
        !            29: 
        !            30: void
        !            31: _addv(Vlong *r, Vlong a, Vlong b)
        !            32: {
        !            33:        ulong lo, hi;
        !            34: 
        !            35:        lo = a.lo + b.lo;
        !            36:        hi = a.hi + b.hi;
        !            37:        if(lo < a.lo)
        !            38:                hi++;
        !            39:        r->lo = lo;
        !            40:        r->hi = hi;
        !            41: }
        !            42: 
        !            43: void
        !            44: _subv(Vlong *r, Vlong a, Vlong b)
        !            45: {
        !            46:        ulong lo, hi;
        !            47: 
        !            48:        lo = a.lo - b.lo;
        !            49:        hi = a.hi - b.hi;
        !            50:        if(lo > a.lo)
        !            51:                hi--;
        !            52:        r->lo = lo;
        !            53:        r->hi = hi;
        !            54: }
        !            55: 
        !            56: void
        !            57: _d2v(Vlong *y, double d)
        !            58: {
        !            59:        union { double d; struct Vlong; } x;
        !            60:        ulong xhi, xlo, ylo, yhi;
        !            61:        int sh;
        !            62: 
        !            63:        x.d = d;
        !            64: 
        !            65:        xhi = (x.hi & 0xfffff) | 0x100000;
        !            66:        xlo = x.lo;
        !            67:        sh = 1075 - ((x.hi >> 20) & 0x7ff);
        !            68: 
        !            69:        ylo = 0;
        !            70:        yhi = 0;
        !            71:        if(sh >= 0) {
        !            72:                /* v = (hi||lo) >> sh */
        !            73:                if(sh < 32) {
        !            74:                        if(sh == 0) {
        !            75:                                ylo = xlo;
        !            76:                                yhi = xhi;
        !            77:                        } else {
        !            78:                                ylo = (xlo >> sh) | (xhi << (32-sh));
        !            79:                                yhi = xhi >> sh;
        !            80:                        }
        !            81:                } else {
        !            82:                        if(sh == 32) {
        !            83:                                ylo = xhi;
        !            84:                        } else
        !            85:                        if(sh < 64) {
        !            86:                                ylo = xhi >> (sh-32);
        !            87:                        }
        !            88:                }
        !            89:        } else {
        !            90:                /* v = (hi||lo) << -sh */
        !            91:                sh = -sh;
        !            92:                if(sh <= 10) {
        !            93:                        ylo = xlo << sh;
        !            94:                        yhi = (xhi << sh) | (xlo >> (32-sh));
        !            95:                } else {
        !            96:                        /* overflow */
        !            97:                        yhi = d;        /* causes something awful */
        !            98:                }
        !            99:        }
        !           100:        if(x.hi & 0x80000000) {
        !           101:                if(ylo != 0) {
        !           102:                        ylo = -ylo;
        !           103:                        yhi = ~yhi;
        !           104:                } else
        !           105:                        yhi = -yhi;
        !           106:        }
        !           107: 
        !           108:        y->hi = yhi;
        !           109:        y->lo = ylo;
        !           110: }
        !           111: 
        !           112: void
        !           113: _f2v(Vlong *y, float f)
        !           114: {
        !           115: 
        !           116:        _d2v(y, f);
        !           117: }
        !           118: 
        !           119: double
        !           120: _v2d(Vlong x)
        !           121: {
        !           122:        if(x.hi & 0x80000000) {
        !           123:                if(x.lo) {
        !           124:                        x.lo = -x.lo;
        !           125:                        x.hi = ~x.hi;
        !           126:                } else
        !           127:                        x.hi = -x.hi;
        !           128:                return -((long)x.hi*4294967296. + x.lo);
        !           129:        }
        !           130:        return (long)x.hi*4294967296. + x.lo;
        !           131: }
        !           132: 
        !           133: float
        !           134: _v2f(Vlong x)
        !           135: {
        !           136:        return _v2d(x);
        !           137: }
        !           138: 
        !           139: static void
        !           140: dodiv(Vlong num, Vlong den, Vlong *q, Vlong *r)
        !           141: {
        !           142:        ulong numlo, numhi, denhi, denlo, quohi, quolo, t;
        !           143:        int i;
        !           144: 
        !           145:        numhi = num.hi;
        !           146:        numlo = num.lo;
        !           147:        denhi = den.hi;
        !           148:        denlo = den.lo;
        !           149: 
        !           150:        /*
        !           151:         * get a divide by zero
        !           152:         */
        !           153:        if(denlo==0 && denhi==0) {
        !           154:                numlo = numlo / denlo;
        !           155:        }
        !           156: 
        !           157:        /*
        !           158:         * set up the divisor and find the number of iterations needed
        !           159:         */
        !           160:        if(numhi >= SIGN(32)) {
        !           161:                quohi = SIGN(32);
        !           162:                quolo = 0;
        !           163:        } else {
        !           164:                quohi = numhi;
        !           165:                quolo = numlo;
        !           166:        }
        !           167:        i = 0;
        !           168:        while(denhi < quohi || (denhi == quohi && denlo < quolo)) {
        !           169:                denhi = (denhi<<1) | (denlo>>31);
        !           170:                denlo <<= 1;
        !           171:                i++;
        !           172:        }
        !           173: 
        !           174:        quohi = 0;
        !           175:        quolo = 0;
        !           176:        for(; i >= 0; i--) {
        !           177:                quohi = (quohi<<1) | (quolo>>31);
        !           178:                quolo <<= 1;
        !           179:                if(numhi > denhi || (numhi == denhi && numlo >= denlo)) {
        !           180:                        t = numlo;
        !           181:                        numlo -= denlo;
        !           182:                        if(numlo > t)
        !           183:                                numhi--;
        !           184:                        numhi -= denhi;
        !           185:                        quolo |= 1;
        !           186:                }
        !           187:                denlo = (denlo>>1) | (denhi<<31);
        !           188:                denhi >>= 1;
        !           189:        }
        !           190: 
        !           191:        if(q) {
        !           192:                q->lo = quolo;
        !           193:                q->hi = quohi;
        !           194:        }
        !           195:        if(r) {
        !           196:                r->lo = numlo;
        !           197:                r->hi = numhi;
        !           198:        }
        !           199: }
        !           200: 
        !           201: void
        !           202: _divvu(Vlong *q, Vlong n, Vlong d)
        !           203: {
        !           204: 
        !           205:        if(n.hi == 0 && d.hi == 0) {
        !           206:                q->hi = 0;
        !           207:                q->lo = n.lo / d.lo;
        !           208:                return;
        !           209:        }
        !           210:        dodiv(n, d, q, 0);
        !           211: }
        !           212: 
        !           213: void
        !           214: _modvu(Vlong *r, Vlong n, Vlong d)
        !           215: {
        !           216: 
        !           217:        if(n.hi == 0 && d.hi == 0) {
        !           218:                r->hi = 0;
        !           219:                r->lo = n.lo % d.lo;
        !           220:                return;
        !           221:        }
        !           222:        dodiv(n, d, 0, r);
        !           223: }
        !           224: 
        !           225: static void
        !           226: vneg(Vlong *v)
        !           227: {
        !           228: 
        !           229:        if(v->lo == 0) {
        !           230:                v->hi = -v->hi;
        !           231:                return;
        !           232:        }
        !           233:        v->lo = -v->lo;
        !           234:        v->hi = ~v->hi;
        !           235: }
        !           236: 
        !           237: void
        !           238: _divv(Vlong *q, Vlong n, Vlong d)
        !           239: {
        !           240:        long nneg, dneg;
        !           241: 
        !           242:        if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {
        !           243:                q->lo = (long)n.lo / (long)d.lo;
        !           244:                q->hi = ((long)q->lo) >> 31;
        !           245:                return;
        !           246:        }
        !           247:        nneg = n.hi >> 31;
        !           248:        if(nneg)
        !           249:                vneg(&n);
        !           250:        dneg = d.hi >> 31;
        !           251:        if(dneg)
        !           252:                vneg(&d);
        !           253:        dodiv(n, d, q, 0);
        !           254:        if(nneg != dneg)
        !           255:                vneg(q);
        !           256: }
        !           257: 
        !           258: void
        !           259: _modv(Vlong *r, Vlong n, Vlong d)
        !           260: {
        !           261:        long nneg, dneg;
        !           262: 
        !           263:        if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {
        !           264:                r->lo = (long)n.lo % (long)d.lo;
        !           265:                r->hi = ((long)r->lo) >> 31;
        !           266:                return;
        !           267:        }
        !           268:        nneg = n.hi >> 31;
        !           269:        if(nneg)
        !           270:                vneg(&n);
        !           271:        dneg = d.hi >> 31;
        !           272:        if(dneg)
        !           273:                vneg(&d);
        !           274:        dodiv(n, d, 0, r);
        !           275:        if(nneg)
        !           276:                vneg(r);
        !           277: }
        !           278: 
        !           279: void
        !           280: _rshav(Vlong *r, Vlong a, int b)
        !           281: {
        !           282:        long t;
        !           283: 
        !           284:        t = a.hi;
        !           285:        if(b >= 32) {
        !           286:                r->hi = t>>31;
        !           287:                if(b >= 64) {
        !           288:                        /* this is illegal re C standard */
        !           289:                        r->lo = t>>31;
        !           290:                        return;
        !           291:                }
        !           292:                r->lo = t >> (b-32);
        !           293:                return;
        !           294:        }
        !           295:        if(b <= 0) {
        !           296:                r->hi = t;
        !           297:                r->lo = a.lo;
        !           298:                return;
        !           299:        }
        !           300:        r->hi = t >> b;
        !           301:        r->lo = (t << (32-b)) | (a.lo >> b);
        !           302: }
        !           303: 
        !           304: void
        !           305: _rshlv(Vlong *r, Vlong a, int b)
        !           306: {
        !           307:        ulong t;
        !           308: 
        !           309:        t = a.hi;
        !           310:        if(b >= 32) {
        !           311:                r->hi = 0;
        !           312:                if(b >= 64) {
        !           313:                        /* this is illegal re C standard */
        !           314:                        r->lo = 0;
        !           315:                        return;
        !           316:                }
        !           317:                r->lo = t >> (b-32);
        !           318:                return;
        !           319:        }
        !           320:        if(b <= 0) {
        !           321:                r->hi = t;
        !           322:                r->lo = a.lo;
        !           323:                return;
        !           324:        }
        !           325:        r->hi = t >> b;
        !           326:        r->lo = (t << (32-b)) | (a.lo >> b);
        !           327: }
        !           328: 
        !           329: void
        !           330: _lshv(Vlong *r, Vlong a, int b)
        !           331: {
        !           332:        ulong t;
        !           333: 
        !           334:        t = a.lo;
        !           335:        if(b >= 32) {
        !           336:                r->lo = 0;
        !           337:                if(b >= 64) {
        !           338:                        /* this is illegal re C standard */
        !           339:                        r->hi = 0;
        !           340:                        return;
        !           341:                }
        !           342:                r->hi = t << (b-32);
        !           343:                return;
        !           344:        }
        !           345:        if(b <= 0) {
        !           346:                r->lo = t;
        !           347:                r->hi = a.hi;
        !           348:                return;
        !           349:        }
        !           350:        r->lo = t << b;
        !           351:        r->hi = (t >> (32-b)) | (a.hi << b);
        !           352: }
        !           353: 
        !           354: void
        !           355: _andv(Vlong *r, Vlong a, Vlong b)
        !           356: {
        !           357:        r->hi = a.hi & b.hi;
        !           358:        r->lo = a.lo & b.lo;
        !           359: }
        !           360: 
        !           361: void
        !           362: _orv(Vlong *r, Vlong a, Vlong b)
        !           363: {
        !           364:        r->hi = a.hi | b.hi;
        !           365:        r->lo = a.lo | b.lo;
        !           366: }
        !           367: 
        !           368: void
        !           369: _xorv(Vlong *r, Vlong a, Vlong b)
        !           370: {
        !           371:        r->hi = a.hi ^ b.hi;
        !           372:        r->lo = a.lo ^ b.lo;
        !           373: }
        !           374: 
        !           375: void
        !           376: _negv(Vlong *r, Vlong a)
        !           377: {
        !           378:        if(a.lo == 0) {
        !           379:                r->hi = -a.hi;
        !           380:                r->lo = 0;
        !           381:                return;
        !           382:        }
        !           383:        r->hi = ~a.hi;
        !           384:        r->lo = -a.lo;
        !           385: }
        !           386: 
        !           387: void
        !           388: _vpp(Vlong *l, Vlong *r)
        !           389: {
        !           390: 
        !           391:        l->hi = r->hi;
        !           392:        l->lo = r->lo;
        !           393:        r->lo++;
        !           394:        if(r->lo == 0)
        !           395:                r->hi++;
        !           396: }
        !           397: 
        !           398: void
        !           399: _vmm(Vlong *l, Vlong *r)
        !           400: {
        !           401: 
        !           402:        l->hi = r->hi;
        !           403:        l->lo = r->lo;
        !           404:        if(r->lo == 0)
        !           405:                r->hi--;
        !           406:        r->lo--;
        !           407: }
        !           408: 
        !           409: void
        !           410: _ppv(Vlong *l, Vlong *r)
        !           411: {
        !           412: 
        !           413:        r->lo++;
        !           414:        if(r->lo == 0)
        !           415:                r->hi++;
        !           416:        l->hi = r->hi;
        !           417:        l->lo = r->lo;
        !           418: }
        !           419: 
        !           420: void
        !           421: _mmv(Vlong *l, Vlong *r)
        !           422: {
        !           423: 
        !           424:        if(r->lo == 0)
        !           425:                r->hi--;
        !           426:        r->lo--;
        !           427:        l->hi = r->hi;
        !           428:        l->lo = r->lo;
        !           429: }
        !           430: 
        !           431: void
        !           432: _vasop(Vlong *ret, void *lv, void fn(Vlong*, Vlong, Vlong), int type, Vlong rv)
        !           433: {
        !           434:        Vlong t;
        !           435: 
        !           436:        switch(type) {
        !           437:        default:
        !           438:                abort();
        !           439:                break;
        !           440: 
        !           441:        case 1: /* schar */
        !           442:                t.lo = *(schar*)lv;
        !           443:                t.hi = t.lo >> 31;
        !           444:                fn(ret, t, rv);
        !           445:                *(schar*)lv = ret->lo;
        !           446:                break;
        !           447: 
        !           448:        case 2: /* uchar */
        !           449:                t.lo = *(uchar*)lv;
        !           450:                t.hi = 0;
        !           451:                fn(ret, t, rv);
        !           452:                *(uchar*)lv = ret->lo;
        !           453:                break;
        !           454: 
        !           455:        case 3: /* short */
        !           456:                t.lo = *(short*)lv;
        !           457:                t.hi = t.lo >> 31;
        !           458:                fn(ret, t, rv);
        !           459:                *(short*)lv = ret->lo;
        !           460:                break;
        !           461: 
        !           462:        case 4: /* ushort */
        !           463:                t.lo = *(ushort*)lv;
        !           464:                t.hi = 0;
        !           465:                fn(ret, t, rv);
        !           466:                *(ushort*)lv = ret->lo;
        !           467:                break;
        !           468: 
        !           469:        case 5: /* long */
        !           470:                t.lo = *(long*)lv;
        !           471:                t.hi = t.lo >> 31;
        !           472:                fn(ret, t, rv);
        !           473:                *(long*)lv = ret->lo;
        !           474:                break;
        !           475: 
        !           476:        case 6: /* ulong */
        !           477:                t.lo = *(ulong*)lv;
        !           478:                t.hi = 0;
        !           479:                fn(ret, t, rv);
        !           480:                *(ulong*)lv = ret->lo;
        !           481:                break;
        !           482: 
        !           483:        case 7: /* vlong */
        !           484:        case 8: /* uvlong */
        !           485:                fn(ret, *(Vlong*)lv, rv);
        !           486:                *(Vlong*)lv = *ret;
        !           487:                break;
        !           488:        }
        !           489: }
        !           490: 
        !           491: void
        !           492: _sl2v(Vlong *ret, long sl)
        !           493: {
        !           494:        long t;
        !           495: 
        !           496:        t = sl;
        !           497:        ret->lo = t;
        !           498:        ret->hi = t >> 31;
        !           499: }
        !           500: 
        !           501: void
        !           502: _ul2v(Vlong *ret, ulong ul)
        !           503: {
        !           504:        long t;
        !           505: 
        !           506:        t = ul;
        !           507:        ret->lo = t;
        !           508:        ret->hi = 0;
        !           509: }
        !           510: 
        !           511: void
        !           512: _sh2v(Vlong *ret, long sh)
        !           513: {
        !           514:        long t;
        !           515: 
        !           516:        t = (sh << 16) >> 16;
        !           517:        ret->lo = t;
        !           518:        ret->hi = t >> 31;
        !           519: }
        !           520: 
        !           521: void
        !           522: _uh2v(Vlong *ret, ulong ul)
        !           523: {
        !           524:        long t;
        !           525: 
        !           526:        t = ul & 0xffff;
        !           527:        ret->lo = t;
        !           528:        ret->hi = 0;
        !           529: }
        !           530: 
        !           531: void
        !           532: _sc2v(Vlong *ret, long uc)
        !           533: {
        !           534:        long t;
        !           535: 
        !           536:        t = (uc << 24) >> 24;
        !           537:        ret->lo = t;
        !           538:        ret->hi = t >> 31;
        !           539: }
        !           540: 
        !           541: void
        !           542: _uc2v(Vlong *ret, ulong ul)
        !           543: {
        !           544:        long t;
        !           545: 
        !           546:        t = ul & 0xff;
        !           547:        ret->lo = t;
        !           548:        ret->hi = 0;
        !           549: }
        !           550: 
        !           551: long
        !           552: _v2sc(Vlong rv)
        !           553: {
        !           554:        long t;
        !           555: 
        !           556:        t = rv.lo & 0xff;
        !           557:        return (t << 24) >> 24;
        !           558: }
        !           559: 
        !           560: long
        !           561: _v2uc(Vlong rv)
        !           562: {
        !           563: 
        !           564:        return rv.lo & 0xff;
        !           565: }
        !           566: 
        !           567: long
        !           568: _v2sh(Vlong rv)
        !           569: {
        !           570:        long t;
        !           571: 
        !           572:        t = rv.lo & 0xffff;
        !           573:        return (t << 16) >> 16;
        !           574: }
        !           575: 
        !           576: long
        !           577: _v2uh(Vlong rv)
        !           578: {
        !           579: 
        !           580:        return rv.lo & 0xffff;
        !           581: }
        !           582: 
        !           583: long
        !           584: _v2sl(Vlong rv)
        !           585: {
        !           586: 
        !           587:        return rv.lo;
        !           588: }
        !           589: 
        !           590: long
        !           591: _v2ul(Vlong rv)
        !           592: {
        !           593: 
        !           594:        return rv.lo;
        !           595: }
        !           596: 
        !           597: int
        !           598: _testv(Vlong rv)
        !           599: {
        !           600:        return rv.lo || rv.hi;
        !           601: }
        !           602: 
        !           603: int
        !           604: _eqv(Vlong lv, Vlong rv)
        !           605: {
        !           606:        return lv.lo == rv.lo && lv.hi == rv.hi;
        !           607: }
        !           608: 
        !           609: int
        !           610: _nev(Vlong lv, Vlong rv)
        !           611: {
        !           612:        return lv.lo != rv.lo || lv.hi != rv.hi;
        !           613: }
        !           614: 
        !           615: int
        !           616: _ltv(Vlong lv, Vlong rv)
        !           617: {
        !           618:        return (long)lv.hi < (long)rv.hi || 
        !           619:                (lv.hi == rv.hi && lv.lo < rv.lo);
        !           620: }
        !           621: 
        !           622: int
        !           623: _lev(Vlong lv, Vlong rv)
        !           624: {
        !           625:        return (long)lv.hi < (long)rv.hi || 
        !           626:                (lv.hi == rv.hi && lv.lo <= rv.lo);
        !           627: }
        !           628: 
        !           629: int
        !           630: _gtv(Vlong lv, Vlong rv)
        !           631: {
        !           632:        return (long)lv.hi > (long)rv.hi || 
        !           633:                (lv.hi == rv.hi && lv.lo > rv.lo);
        !           634: }
        !           635: 
        !           636: int
        !           637: _gev(Vlong lv, Vlong rv)
        !           638: {
        !           639:        return (long)lv.hi > (long)rv.hi || 
        !           640:                (lv.hi == rv.hi && lv.lo >= rv.lo);
        !           641: }
        !           642: 
        !           643: int
        !           644: _lov(Vlong lv, Vlong rv)
        !           645: {
        !           646:        return lv.hi < rv.hi || 
        !           647:                (lv.hi == rv.hi && lv.lo < rv.lo);
        !           648: }
        !           649: 
        !           650: int
        !           651: _lsv(Vlong lv, Vlong rv)
        !           652: {
        !           653:        return lv.hi < rv.hi || 
        !           654:                (lv.hi == rv.hi && lv.lo <= rv.lo);
        !           655: }
        !           656: 
        !           657: int
        !           658: _hiv(Vlong lv, Vlong rv)
        !           659: {
        !           660:        return lv.hi > rv.hi || 
        !           661:                (lv.hi == rv.hi && lv.lo > rv.lo);
        !           662: }
        !           663: 
        !           664: int
        !           665: _hsv(Vlong lv, Vlong rv)
        !           666: {
        !           667:        return lv.hi > rv.hi || 
        !           668:                (lv.hi == rv.hi && lv.lo >= rv.lo);
        !           669: }

unix.superglobalmegacorp.com

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