[BACK]Return to N.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / engine

Annotation of OpenXM_contrib2/asir2000/engine/N.c, Revision 1.1

1.1     ! noro        1: /* $OpenXM: OpenXM/src/asir99/engine/N.c,v 1.1.1.1 1999/11/10 08:12:26 noro Exp $ */
        !             2: #include "ca.h"
        !             3: #include "base.h"
        !             4:
        !             5: void addn();
        !             6: int subn();
        !             7: void _bshiftn();
        !             8: void dupn();
        !             9:
        !            10: #if defined(VISUAL) || defined(i386)
        !            11: void addn(n1,n2,nr)
        !            12: N n1,n2,*nr;
        !            13: {
        !            14:        unsigned int *m1,*m2,*mr;
        !            15:        unsigned int c;
        !            16:        N r;
        !            17:        int i,d1,d2;
        !            18:        unsigned int tmp;
        !            19:
        !            20:        if ( !n1 )
        !            21:                COPY(n2,*nr);
        !            22:        else if ( !n2 )
        !            23:                COPY(n1,*nr);
        !            24:        else {
        !            25:                if ( PL(n1) > PL(n2) ) {
        !            26:                        d1 = PL(n1); d2 = PL(n2); m1 = BD(n1); m2 = BD(n2);
        !            27:                } else {
        !            28:                        d1 = PL(n2); d2 = PL(n1); m1 = BD(n2); m2 = BD(n1);
        !            29:                }
        !            30:                *nr = r = NALLOC(d1 + 1); INITRC(r); mr = BD(r);
        !            31:
        !            32: #if defined(VISUAL)
        !            33:                __asm {
        !            34:                push    esi
        !            35:                push    edi
        !            36:                mov esi,m1
        !            37:                mov edi,m2
        !            38:                mov ebx,mr
        !            39:                mov ecx,d2
        !            40:                xor     eax,eax
        !            41:                Lstart_addn:
        !            42:                mov eax,DWORD PTR [esi]
        !            43:                mov edx,DWORD PTR [edi]
        !            44:                adc eax,edx
        !            45:                mov DWORD PTR [ebx],eax
        !            46:                lea esi,DWORD PTR [esi+4]
        !            47:                lea edi,DWORD PTR [edi+4]
        !            48:                lea ebx,DWORD PTR [ebx+4]
        !            49:                dec ecx
        !            50:                jnz Lstart_addn
        !            51:                pop     edi
        !            52:                pop     esi
        !            53:                mov eax,0
        !            54:                adc eax,eax
        !            55:                mov c,eax
        !            56:                }
        !            57: #else
        !            58:                asm volatile("\
        !            59:                movl    %1,%%esi;\
        !            60:                movl    %2,%%edi;\
        !            61:                movl    %3,%%ebx;\
        !            62:                movl    %4,%%ecx;\
        !            63:                testl   %%eax,%%eax;\
        !            64:                Lstart_addn:;\
        !            65:                movl    (%%esi),%%eax;\
        !            66:                movl    (%%edi),%%edx;\
        !            67:                adcl    %%edx,%%eax;\
        !            68:                movl    %%eax,(%%ebx);\
        !            69:                leal    4(%%esi),%%esi;\
        !            70:                leal    4(%%edi),%%edi;\
        !            71:                leal    4(%%ebx),%%ebx;\
        !            72:                decl    %%ecx;\
        !            73:                jnz Lstart_addn;\
        !            74:                movl    $0,%%eax;\
        !            75:                adcl    %%eax,%%eax;\
        !            76:                movl    %%eax,%0"\
        !            77:                :"=m"(c)\
        !            78:                :"m"(m1),"m"(m2),"m"(mr),"m"(d2)\
        !            79:                :"eax","ebx","ecx","edx","esi","edi");
        !            80: #endif
        !            81:                for ( i = d2, m1 += d2, mr += d2; (i < d1) && c ; i++ ) {
        !            82:                        tmp = *m1++ + c;
        !            83:                        c = tmp < c ? 1 : 0;
        !            84:                        *mr++ = tmp;
        !            85:                }
        !            86:                for ( ; i < d1; i++ )
        !            87:                        *mr++ = *m1++;
        !            88:                *mr = c;
        !            89:                PL(r) = (c?d1+1:d1);
        !            90:        }
        !            91: }
        !            92:
        !            93: int subn(n1,n2,nr)
        !            94: N n1,n2,*nr;
        !            95: {
        !            96:        N r;
        !            97:        unsigned int *m1,*m2,*mr,br;
        !            98:        unsigned int tmp,t;
        !            99:        int d1,d2,sgn,i;
        !           100:
        !           101:        if ( !n1 ) {
        !           102:                if ( n2 ) {
        !           103:                        COPY(n2,*nr);
        !           104:                        return -1;
        !           105:                } else {
        !           106:                        *nr = 0;
        !           107:                        return 0;
        !           108:                }
        !           109:        } else if ( !n2 ) {
        !           110:                COPY(n1,*nr);
        !           111:                return 1;
        !           112:        } else {
        !           113:                d1 = PL(n1); d2 = PL(n2);
        !           114:                m1 = BD(n1); m2 = BD(n2);
        !           115:                if ( (d1 = PL(n1)) > (d2 = PL(n2)) )
        !           116:                        sgn = 1;
        !           117:                else if ( d1 < d2 ) {
        !           118:                        d1 = PL(n2); d2 = PL(n1);
        !           119:                        m1 = BD(n2); m2 = BD(n1);
        !           120:                        sgn = -1;
        !           121:                } else {
        !           122:                        for ( i = d1-1; i >= 0 && m1[i] == m2[i]; i-- );
        !           123:                        if ( i < 0 ) {
        !           124:                                *nr = 0;
        !           125:                                return 0;
        !           126:                        }
        !           127:                        d1 = d2 = i+1;
        !           128:                        if ( m1[i] > m2[i] )
        !           129:                                sgn = 1;
        !           130:                        else {
        !           131:                                m1 = BD(n2); m2 = BD(n1);
        !           132:                                sgn = -1;
        !           133:                        }
        !           134:                }
        !           135:                *nr = r = NALLOC(d1); INITRC(r); mr = BD(r);
        !           136:
        !           137: #if defined(VISUAL)
        !           138:                __asm {
        !           139:                push    esi
        !           140:                push    edi
        !           141:                mov esi,m1
        !           142:                mov edi,m2
        !           143:                mov ebx,mr
        !           144:                mov ecx,d2
        !           145:                xor     eax,eax
        !           146:                Lstart_subn:
        !           147:                mov eax,DWORD PTR [esi]
        !           148:                mov edx,DWORD PTR [edi]
        !           149:                sbb eax,edx
        !           150:                mov DWORD PTR [ebx],eax
        !           151:                lea esi,DWORD PTR [esi+4]
        !           152:                lea edi,DWORD PTR [edi+4]
        !           153:                lea ebx,DWORD PTR [ebx+4]
        !           154:                dec ecx
        !           155:                jnz Lstart_subn
        !           156:                pop     edi
        !           157:                pop     esi
        !           158:                mov eax,0
        !           159:                adc eax,eax
        !           160:                mov br,eax
        !           161:                }
        !           162: #else
        !           163:                asm volatile("\
        !           164:                movl    %1,%%esi;\
        !           165:                movl    %2,%%edi;\
        !           166:                movl    %3,%%ebx;\
        !           167:                movl    %4,%%ecx;\
        !           168:                testl   %%eax,%%eax;\
        !           169:                Lstart_subn:;\
        !           170:                movl    (%%esi),%%eax;\
        !           171:                movl    (%%edi),%%edx;\
        !           172:                sbbl    %%edx,%%eax;\
        !           173:                movl    %%eax,(%%ebx);\
        !           174:                leal    4(%%esi),%%esi;\
        !           175:                leal    4(%%edi),%%edi;\
        !           176:                leal    4(%%ebx),%%ebx;\
        !           177:                decl    %%ecx;\
        !           178:                jnz Lstart_subn;\
        !           179:                movl    $0,%%eax;\
        !           180:                adcl    %%eax,%%eax;\
        !           181:                movl    %%eax,%0"\
        !           182:                :"=m"(br)\
        !           183:                :"m"(m1),"m"(m2),"m"(mr),"m"(d2)\
        !           184:                :"eax","ebx","ecx","edx","esi","edi");
        !           185: #endif
        !           186:                for ( i = d2, m1 += d2, mr += d2; (i < d1) && br; i++ ) {
        !           187:                        t = *m1++;
        !           188:                        tmp = t - br;
        !           189:                        br = tmp > t ? 1 : 0;
        !           190:                        *mr++ = tmp;
        !           191:                }
        !           192:                for ( ; i < d1; i++ )
        !           193:                        *mr++ = *m1++;
        !           194:                for ( i = d1-1, mr--; i >= 0 && !*mr--; i-- );
        !           195:                PL(r) = i + 1;
        !           196:                return sgn;
        !           197:        }
        !           198: }
        !           199:
        !           200: void _addn(n1,n2,nr)
        !           201: N n1,n2,nr;
        !           202: {
        !           203:        unsigned int *m1,*m2,*mr;
        !           204:        unsigned int c;
        !           205:        int i,d1,d2;
        !           206:        unsigned int tmp;
        !           207:
        !           208:        if ( !n1 || !PL(n1) )
        !           209:                dupn(n2,nr);
        !           210:        else if ( !n2 || !PL(n2) )
        !           211:                dupn(n1,nr);
        !           212:        else {
        !           213:                if ( PL(n1) > PL(n2) ) {
        !           214:                        d1 = PL(n1); d2 = PL(n2); m1 = BD(n1); m2 = BD(n2);
        !           215:                } else {
        !           216:                        d1 = PL(n2); d2 = PL(n1); m1 = BD(n2); m2 = BD(n1);
        !           217:                }
        !           218:                mr = BD(nr);
        !           219:
        !           220: #if defined(VISUAL)
        !           221:                __asm {
        !           222:                push    esi
        !           223:                push    edi
        !           224:                mov esi,m1
        !           225:                mov edi,m2
        !           226:                mov ebx,mr
        !           227:                mov ecx,d2
        !           228:                xor     eax,eax
        !           229:                Lstart__addn:
        !           230:                mov eax,DWORD PTR [esi]
        !           231:                mov edx,DWORD PTR [edi]
        !           232:                adc eax,edx
        !           233:                mov DWORD PTR [ebx],eax
        !           234:                lea esi,DWORD PTR [esi+4]
        !           235:                lea edi,DWORD PTR [edi+4]
        !           236:                lea ebx,DWORD PTR [ebx+4]
        !           237:                dec ecx
        !           238:                jnz Lstart__addn
        !           239:                pop     edi
        !           240:                pop     esi
        !           241:                mov eax,0
        !           242:                adc eax,eax
        !           243:                mov c,eax
        !           244:                }
        !           245: #else
        !           246:                asm volatile("\
        !           247:                movl    %1,%%esi;\
        !           248:                movl    %2,%%edi;\
        !           249:                movl    %3,%%ebx;\
        !           250:                movl    %4,%%ecx;\
        !           251:                testl   %%eax,%%eax;\
        !           252:                Lstart__addn:;\
        !           253:                movl    (%%esi),%%eax;\
        !           254:                movl    (%%edi),%%edx;\
        !           255:                adcl    %%edx,%%eax;\
        !           256:                movl    %%eax,(%%ebx);\
        !           257:                leal    4(%%esi),%%esi;\
        !           258:                leal    4(%%edi),%%edi;\
        !           259:                leal    4(%%ebx),%%ebx;\
        !           260:                decl    %%ecx;\
        !           261:                jnz Lstart__addn;\
        !           262:                movl    $0,%%eax;\
        !           263:                adcl    %%eax,%%eax;\
        !           264:                movl    %%eax,%0"\
        !           265:                :"=m"(c)\
        !           266:                :"m"(m1),"m"(m2),"m"(mr),"m"(d2)\
        !           267:                :"eax","ebx","ecx","edx","esi","edi");
        !           268: #endif
        !           269:                for ( i = d2, m1 += d2, mr += d2; (i < d1) && c ; i++ ) {
        !           270:                        tmp = *m1++ + c;
        !           271:                        c = tmp < c ? 1 : 0;
        !           272:                        *mr++ = tmp;
        !           273:                }
        !           274:                for ( ; i < d1; i++ )
        !           275:                        *mr++ = *m1++;
        !           276:                *mr = c;
        !           277:                PL(nr) = (c?d1+1:d1);
        !           278:        }
        !           279: }
        !           280:
        !           281: int _subn(n1,n2,nr)
        !           282: N n1,n2,nr;
        !           283: {
        !           284:        unsigned int *m1,*m2,*mr,br;
        !           285:        unsigned int tmp,t;
        !           286:        int d1,d2,sgn,i;
        !           287:
        !           288:        if ( !n1 || !PL(n1) ) {
        !           289:                if ( n2 && PL(n2) ) {
        !           290:                        dupn(n2,nr);
        !           291:                        return -1;
        !           292:                } else {
        !           293:                        PL(nr) = 0;
        !           294:                        return 0;
        !           295:                }
        !           296:        } else if ( !n2 || !PL(n2) ) {
        !           297:                dupn(n1,nr);
        !           298:                return 1;
        !           299:        } else {
        !           300:                d1 = PL(n1); d2 = PL(n2);
        !           301:                m1 = BD(n1); m2 = BD(n2);
        !           302:                if ( (d1 = PL(n1)) > (d2 = PL(n2)) )
        !           303:                        sgn = 1;
        !           304:                else if ( d1 < d2 ) {
        !           305:                        d1 = PL(n2); d2 = PL(n1);
        !           306:                        m1 = BD(n2); m2 = BD(n1);
        !           307:                        sgn = -1;
        !           308:                } else {
        !           309:                        for ( i = d1-1; i >= 0 && m1[i] == m2[i]; i-- );
        !           310:                        if ( i < 0 ) {
        !           311:                                PL(nr) = 0;
        !           312:                                return 0;
        !           313:                        }
        !           314:                        d1 = d2 = i+1;
        !           315:                        if ( m1[i] > m2[i] )
        !           316:                                sgn = 1;
        !           317:                        else {
        !           318:                                m1 = BD(n2); m2 = BD(n1);
        !           319:                                sgn = -1;
        !           320:                        }
        !           321:                }
        !           322:                mr = BD(nr);
        !           323:
        !           324: #if defined(VISUAL)
        !           325:                __asm {
        !           326:                push    esi
        !           327:                push    edi
        !           328:                mov esi,m1
        !           329:                mov edi,m2
        !           330:                mov ebx,mr
        !           331:                mov ecx,d2
        !           332:                xor     eax,eax
        !           333:                Lstart__subn:
        !           334:                mov eax,DWORD PTR [esi]
        !           335:                mov edx,DWORD PTR [edi]
        !           336:                sbb eax,edx
        !           337:                mov DWORD PTR [ebx],eax
        !           338:                lea esi,DWORD PTR [esi+4]
        !           339:                lea edi,DWORD PTR [edi+4]
        !           340:                lea ebx,DWORD PTR [ebx+4]
        !           341:                dec ecx
        !           342:                jnz Lstart__subn
        !           343:                pop     edi
        !           344:                pop     esi
        !           345:                mov eax,0
        !           346:                adc eax,eax
        !           347:                mov br,eax
        !           348:                }
        !           349: #else
        !           350:                asm volatile("\
        !           351:                movl    %1,%%esi;\
        !           352:                movl    %2,%%edi;\
        !           353:                movl    %3,%%ebx;\
        !           354:                movl    %4,%%ecx;\
        !           355:                testl   %%eax,%%eax;\
        !           356:                Lstart__subn:;\
        !           357:                movl    (%%esi),%%eax;\
        !           358:                movl    (%%edi),%%edx;\
        !           359:                sbbl    %%edx,%%eax;\
        !           360:                movl    %%eax,(%%ebx);\
        !           361:                leal    4(%%esi),%%esi;\
        !           362:                leal    4(%%edi),%%edi;\
        !           363:                leal    4(%%ebx),%%ebx;\
        !           364:                decl    %%ecx;\
        !           365:                jnz Lstart__subn;\
        !           366:                movl    $0,%%eax;\
        !           367:                adcl    %%eax,%%eax;\
        !           368:                movl    %%eax,%0"\
        !           369:                :"=m"(br)\
        !           370:                :"m"(m1),"m"(m2),"m"(mr),"m"(d2)\
        !           371:                :"eax","ebx","ecx","edx","esi","edi");
        !           372: #endif
        !           373:                for ( i = d2, m1 += d2, mr += d2; (i < d1) && br; i++ ) {
        !           374:                        t = *m1++;
        !           375:                        tmp = t - br;
        !           376:                        br = tmp > t ? 1 : 0;
        !           377:                        *mr++ = tmp;
        !           378:                }
        !           379:                for ( ; i < d1; i++ )
        !           380:                        *mr++ = *m1++;
        !           381:                for ( i = d1-1, mr--; i >= 0 && !*mr--; i-- );
        !           382:                PL(nr) = i + 1;
        !           383:                return sgn;
        !           384:        }
        !           385: }
        !           386: #else
        !           387:
        !           388: void addn(n1,n2,nr)
        !           389: N n1,n2,*nr;
        !           390: {
        !           391:        unsigned int *m1,*m2,*mr,i,c;
        !           392:        N r;
        !           393:        int d1,d2;
        !           394:        unsigned int tmp;
        !           395:
        !           396:        if ( !n1 )
        !           397:                COPY(n2,*nr);
        !           398:        else if ( !n2 )
        !           399:                COPY(n1,*nr);
        !           400:        else {
        !           401:                if ( PL(n1) > PL(n2) ) {
        !           402:                        d1 = PL(n1); d2 = PL(n2); m1 = BD(n1); m2 = BD(n2);
        !           403:                } else {
        !           404:                        d1 = PL(n2); d2 = PL(n1); m1 = BD(n2); m2 = BD(n1);
        !           405:                }
        !           406:                *nr = r = NALLOC(d1 + 1); INITRC(r);
        !           407:                for ( i = 0, c = 0, mr = BD(r); i < d2; i++, m1++, m2++, mr++ ) {
        !           408:                        tmp = *m1 + *m2;
        !           409:                        if ( tmp < *m1 ) {
        !           410:                                tmp += c;
        !           411:                                c = 1;
        !           412:                        } else {
        !           413:                                tmp += c;
        !           414:                                c = tmp < c ? 1 : 0;
        !           415:                        }
        !           416:                        *mr = tmp;
        !           417:                }
        !           418:                for ( ; (i < d1) && c ; i++, m1++, mr++ ) {
        !           419:                        tmp = *m1 + c;
        !           420:                        c = tmp < c ? 1 : 0;
        !           421:                        *mr = tmp;
        !           422:                }
        !           423:                for ( ; i < d1; i++ )
        !           424:                        *mr++ = *m1++;
        !           425:                *mr = c;
        !           426:                PL(r) = (c?d1+1:d1);
        !           427:        }
        !           428: }
        !           429:
        !           430: int subn(n1,n2,nr)
        !           431: N n1,n2,*nr;
        !           432: {
        !           433:        N r;
        !           434:        unsigned int *m1,*m2,*mr,i,br;
        !           435:        L tmp;
        !           436:        int d1,d2,nz,sgn;
        !           437:
        !           438:        if ( !n1 ) {
        !           439:                if ( n2 ) {
        !           440:                        COPY(n2,*nr);
        !           441:                        return -1;
        !           442:                } else {
        !           443:                        *nr = 0;
        !           444:                        return 0;
        !           445:                }
        !           446:        } else if ( !n2 ) {
        !           447:                COPY(n1,*nr);
        !           448:                return 1;
        !           449:        } else {
        !           450:                switch ( cmpn(n1,n2) ) {
        !           451:                        case 1:
        !           452:                                d1 = PL(n1); d2 = PL(n2); m1 = BD(n1); m2 = BD(n2);
        !           453:                                sgn = 1; break;
        !           454:                        case -1:
        !           455:                                d1 = PL(n2); d2 = PL(n1); m1 = BD(n2); m2 = BD(n1);
        !           456:                                sgn = -1; break;
        !           457:                        case 0:
        !           458:                        default:
        !           459:                                *nr = 0; return ( 0 ); break;
        !           460:                }
        !           461:                *nr = r = NALLOC(d1); INITRC(r);
        !           462:                for ( i = 0, br = 0, nz = -1, mr = BD(r);
        !           463:                        i < d2; i++ ) {
        !           464:                        if ( (tmp = (L)*m1++ - (L)*m2++ - (L)br) && ( tmp > -LBASE ) )
        !           465:                                nz = i;
        !           466:                        if ( tmp < 0 ) {
        !           467:                                br = 1; *mr++ = (unsigned int)(tmp + LBASE);
        !           468:                        } else {
        !           469:                                br = 0; *mr++ = (unsigned int)tmp;
        !           470:                        }
        !           471:                }
        !           472:                for ( ; (i < d1) && br; i++ ) {
        !           473:                        if ( (tmp = (L)*m1++ - (L)br) && ( tmp > -LBASE ) )
        !           474:                                nz = i;
        !           475:                        if ( tmp < 0 ) {
        !           476:                                br = 1; *mr++ = (unsigned int)(tmp + LBASE);
        !           477:                        } else {
        !           478:                                br = 0; *mr++ = (unsigned int)tmp;
        !           479:                        }
        !           480:                }
        !           481:                for ( ; i < d1; i++ )
        !           482:                        if ( *mr++ = *m1++ )
        !           483:                                nz = i;
        !           484:                PL(r) = nz + 1;
        !           485:                return sgn;
        !           486:        }
        !           487: }
        !           488:
        !           489: void _addn(n1,n2,nr)
        !           490: N n1,n2,nr;
        !           491: {
        !           492:        unsigned int *m1,*m2,*mr,i,c;
        !           493:        int d1,d2;
        !           494:        unsigned int tmp;
        !           495:
        !           496:        if ( !n1 || !PL(n1) )
        !           497:                dupn(n2,nr);
        !           498:        else if ( !n2 || !PL(n2) )
        !           499:                dupn(n1,nr);
        !           500:        else {
        !           501:                if ( PL(n1) > PL(n2) ) {
        !           502:                        d1 = PL(n1); d2 = PL(n2); m1 = BD(n1); m2 = BD(n2);
        !           503:                } else {
        !           504:                        d1 = PL(n2); d2 = PL(n1); m1 = BD(n2); m2 = BD(n1);
        !           505:                }
        !           506:                for ( i = 0, c = 0, mr = BD(nr); i < d2; i++, m1++, m2++, mr++ ) {
        !           507:                        tmp = *m1 + *m2;
        !           508:                        if ( tmp < *m1 ) {
        !           509:                                tmp += c;
        !           510:                                c = 1;
        !           511:                        } else {
        !           512:                                tmp += c;
        !           513:                                c = tmp < c ? 1 : 0;
        !           514:                        }
        !           515:                        *mr = tmp;
        !           516:                }
        !           517:                for ( ; (i < d1) && c ; i++, m1++, mr++ ) {
        !           518:                        tmp = *m1 + c;
        !           519:                        c = tmp < c ? 1 : 0;
        !           520:                        *mr = tmp;
        !           521:                }
        !           522:                for ( ; i < d1; i++ )
        !           523:                        *mr++ = *m1++;
        !           524:                *mr = c;
        !           525:                PL(nr) = (c?d1+1:d1);
        !           526:        }
        !           527: }
        !           528:
        !           529: int _subn(n1,n2,nr)
        !           530: N n1,n2,nr;
        !           531: {
        !           532:        N r;
        !           533:        unsigned int *m1,*m2,*mr,i,br;
        !           534:        L tmp;
        !           535:        int d1,d2,nz,sgn;
        !           536:
        !           537:        if ( !n1 || !PL(n1) ) {
        !           538:                if ( n2 && PL(n2) ) {
        !           539:                        dupn(n2,nr);
        !           540:                        return -1;
        !           541:                } else {
        !           542:                        PL(nr) = 0;
        !           543:                        return 0;
        !           544:                }
        !           545:        } else if ( !n2 || !PL(n2) ) {
        !           546:                dupn(n1,nr);
        !           547:                return 1;
        !           548:        } else {
        !           549:                switch ( cmpn(n1,n2) ) {
        !           550:                        case 1:
        !           551:                                d1 = PL(n1); d2 = PL(n2); m1 = BD(n1); m2 = BD(n2);
        !           552:                                sgn = 1; break;
        !           553:                        case -1:
        !           554:                                d1 = PL(n2); d2 = PL(n1); m1 = BD(n2); m2 = BD(n1);
        !           555:                                sgn = -1; break;
        !           556:                        case 0:
        !           557:                        default:
        !           558:                                PL(nr) = 0; return ( 0 ); break;
        !           559:                }
        !           560:                for ( i = 0, br = 0, nz = -1, mr = BD(nr);
        !           561:                        i < d2; i++ ) {
        !           562:                        if ( (tmp = (L)*m1++ - (L)*m2++ - (L)br) && ( tmp > -LBASE ) )
        !           563:                                nz = i;
        !           564:                        if ( tmp < 0 ) {
        !           565:                                br = 1; *mr++ = (unsigned int)(tmp + LBASE);
        !           566:                        } else {
        !           567:                                br = 0; *mr++ = (unsigned int)tmp;
        !           568:                        }
        !           569:                }
        !           570:                for ( ; (i < d1) && br; i++ ) {
        !           571:                        if ( (tmp = (L)*m1++ - (L)br) && ( tmp > -LBASE ) )
        !           572:                                nz = i;
        !           573:                        if ( tmp < 0 ) {
        !           574:                                br = 1; *mr++ = (unsigned int)(tmp + LBASE);
        !           575:                        } else {
        !           576:                                br = 0; *mr++ = (unsigned int)tmp;
        !           577:                        }
        !           578:                }
        !           579:                for ( ; i < d1; i++ )
        !           580:                        if ( *mr++ = *m1++ )
        !           581:                                nz = i;
        !           582:                PL(nr) = nz + 1;
        !           583:                return sgn;
        !           584:        }
        !           585: }
        !           586: #endif
        !           587:
        !           588: /* a2 += a1; n2 >= n1 */
        !           589:
        !           590: void addarray_to(a1,n1,a2,n2)
        !           591: unsigned int *a1;
        !           592: int n1;
        !           593: unsigned int *a2;
        !           594: int n2;
        !           595: {
        !           596:        int i;
        !           597:        unsigned int c,tmp;
        !           598:
        !           599:        for ( i = 0, c = 0; i < n2; i++, a1++, a2++ ) {
        !           600:                tmp = *a1 + *a2;
        !           601:                if ( tmp < *a1 ) {
        !           602:                        tmp += c;
        !           603:                        c = 1;
        !           604:                } else {
        !           605:                        tmp += c;
        !           606:                        c = tmp < c ? 1 : 0;
        !           607:                }
        !           608:                *a2 = tmp;
        !           609:        }
        !           610:        for ( ; (i < n2) && c ; i++, a2++ ) {
        !           611:                tmp = *a2 + c;
        !           612:                c = tmp < c ? 1 : 0;
        !           613:                *a2 = tmp;
        !           614:        }
        !           615:        if ( i == n2 && c )
        !           616:                *a2 = c;
        !           617: }
        !           618:
        !           619: void pwrn(n,e,nr)
        !           620: N n,*nr;
        !           621: int e;
        !           622: {
        !           623:        N nw,nw1;
        !           624:
        !           625:        if ( e == 1 ) {
        !           626:                COPY(n,*nr);
        !           627:                return;
        !           628:        }
        !           629:        pwrn(n,e / 2,&nw);
        !           630:        if ( e % 2 == 0 )
        !           631:                kmuln(nw,nw,nr);
        !           632:        else {
        !           633:                kmuln(nw,nw,&nw1); kmuln(nw1,n,nr); FREEN(nw1);
        !           634:        }
        !           635:        FREEN(nw);
        !           636: }
        !           637:
        !           638: extern int igcd_algorithm;
        !           639:
        !           640: void gcdEuclidn();
        !           641:
        !           642: void gcdn(n1,n2,nr)
        !           643: N n1,n2,*nr;
        !           644: {
        !           645:        N m1,m2,g;
        !           646:
        !           647:        if ( !igcd_algorithm )
        !           648:                gcdEuclidn(n1,n2,nr);
        !           649:        else {
        !           650:                if ( !n1 )
        !           651:                        *nr = n2;
        !           652:                else if ( !n2 )
        !           653:                        *nr = n1;
        !           654:                else {
        !           655:                        n32ton27(n1,&m1);
        !           656:                        n32ton27(n2,&m2);
        !           657:                        gcdBinary_27n(m1,m2,&g);
        !           658:                        n27ton32(g,nr);
        !           659:                }
        !           660:        }
        !           661: }
        !           662:
        !           663: void gcdEuclidn(n1,n2,nr)
        !           664: N n1,n2,*nr;
        !           665: {
        !           666:        N m1,m2,q,r;
        !           667:        unsigned int i1,i2,ir;
        !           668:
        !           669:        if ( !n1 )
        !           670:                COPY(n2,*nr);
        !           671:        else if ( !n2 )
        !           672:                COPY(n1,*nr);
        !           673:        else {
        !           674:                if ( PL(n1) > PL(n2) ) {
        !           675:                        COPY(n1,m1); COPY(n2,m2);
        !           676:                } else {
        !           677:                        COPY(n1,m2); COPY(n2,m1);
        !           678:                }
        !           679:                while ( PL(m1) > 1 ) {
        !           680:                        divn(m1,m2,&q,&r); FREEN(m1); FREEN(q);
        !           681:                        if ( !r ) {
        !           682:                                *nr = m2;
        !           683:                                return;
        !           684:                        } else {
        !           685:                                m1 = m2; m2 = r;
        !           686:                        }
        !           687:                }
        !           688:                for ( i1 = BD(m1)[0], i2 = BD(m2)[0]; ir = i1 % i2; i1 = i2, i2 = ir );
        !           689:                if ( i2 == 1 )
        !           690:                        COPY(ONEN,*nr);
        !           691:                else {
        !           692:                        *nr = r = NALLOC(1); INITRC(r); PL(r) = 1; BD(r)[0] = i2;
        !           693:                }
        !           694:        }
        !           695: }
        !           696:
        !           697: int cmpn(n1,n2)
        !           698: N n1,n2;
        !           699: {
        !           700:        int i;
        !           701:        unsigned int *m1,*m2;
        !           702:
        !           703:        if ( !n1 )
        !           704:                if ( !n2 )
        !           705:                        return 0;
        !           706:                else
        !           707:                        return -1;
        !           708:        else if ( !n2 )
        !           709:                return 1;
        !           710:        else if ( PL(n1) > PL(n2) )
        !           711:                return 1;
        !           712:        else if ( PL(n1) < PL(n2) )
        !           713:                return -1;
        !           714:        else {
        !           715:                for ( i = PL(n1)-1, m1 = BD(n1)+i, m2 = BD(n2)+i;
        !           716:                        i >= 0; i--, m1--, m2-- )
        !           717:                        if ( *m1 > *m2 )
        !           718:                                return 1;
        !           719:                        else if ( *m1 < *m2 )
        !           720:                                return -1;
        !           721:                return 0;
        !           722:        }
        !           723: }
        !           724:
        !           725: void bshiftn(n,b,r)
        !           726: N n;
        !           727: int b;
        !           728: N *r;
        !           729: {
        !           730:        int w,l,nl,i,j;
        !           731:        N z;
        !           732:        unsigned int msw;
        !           733:        unsigned int *p,*pz;
        !           734:
        !           735:        if ( b == 0 ) {
        !           736:                COPY(n,*r); return;
        !           737:        }
        !           738:        if ( b > 0 ) { /* >> */
        !           739:                w = b / BSH; l = PL(n)-w;
        !           740:                if ( l <= 0 ) {
        !           741:                        *r = 0; return;
        !           742:                }
        !           743:                b %= BSH; p = BD(n)+w;
        !           744:                if ( !b ) {
        !           745:                        *r = z = NALLOC(l); INITRC(z); PL(z) = l;
        !           746:                        bcopy(p,BD(z),l*sizeof(unsigned int));
        !           747:                        return;
        !           748:                }
        !           749:                msw = p[l-1];
        !           750:                for ( i = BSH-1; !(msw&(((unsigned int)1)<<i)); i-- ); i++;
        !           751:                if ( b >= i ) {
        !           752:                        l--;
        !           753:                        if ( !l ) {
        !           754:                                *r = 0; return;
        !           755:                        }
        !           756:                        *r = z = NALLOC(l); INITRC(z); PL(z) = l; pz = BD(z);
        !           757:                        for ( j = 0; j < l; j++, p++ )
        !           758:                                *pz++ = (*(p+1)<<(BSH-b))|(*p>>b);
        !           759:                } else {
        !           760:                        *r = z = NALLOC(l); INITRC(z); PL(z) = l; pz = BD(z);
        !           761:                        for ( j = 1; j < l; j++, p++ )
        !           762:                                *pz++ = (*(p+1)<<(BSH-b))|(*p>>b);
        !           763:                        *pz = *p>>b;
        !           764:                }
        !           765:        } else { /* << */
        !           766:                b = -b;
        !           767:                w = b / BSH; b %= BSH; l = PL(n); p = BD(n);
        !           768:                if ( !b ) {
        !           769:                        nl = l+w; *r = z = NALLOC(nl); INITRC(z); PL(z) = nl;
        !           770:                        bzero((char *)BD(z),w*sizeof(unsigned int));
        !           771:                        bcopy(p,BD(z)+w,l*sizeof(unsigned int));
        !           772:                        return;
        !           773:                }
        !           774:                msw = p[l-1];
        !           775:                for ( i = BSH-1; !(msw&(((unsigned int)1)<<i)); i-- ); i++;
        !           776:                if ( b + i > BSH ) {
        !           777:                        nl = l+w+1;
        !           778:                        *r = z = NALLOC(nl); INITRC(z); PL(z) = nl; pz = BD(z)+w;
        !           779:                        bzero((char *)BD(z),w*sizeof(unsigned int));
        !           780:                        *pz++ = *p++<<b;
        !           781:                        for ( j = 1; j < l; j++, p++ )
        !           782:                                *pz++ = (*p<<b)|(*(p-1)>>(BSH-b));
        !           783:                        *pz = *(p-1)>>(BSH-b);
        !           784:                } else {
        !           785:                        nl = l+w;
        !           786:                        *r = z = NALLOC(nl); INITRC(z); PL(z) = nl; pz = BD(z)+w;
        !           787:                        bzero((char *)BD(z),w*sizeof(unsigned int));
        !           788:                        *pz++ = *p++<<b;
        !           789:                        for ( j = 1; j < l; j++, p++ )
        !           790:                                *pz++ = (*p<<b)|(*(p-1)>>(BSH-b));
        !           791:                }
        !           792:        }
        !           793: }
        !           794:
        !           795: #if 0
        !           796: void _bshiftn(n,b,z)
        !           797: N n;
        !           798: int b;
        !           799: N z;
        !           800: {
        !           801:        int w,l,nl,i,j;
        !           802:        unsigned int msw;
        !           803:        unsigned int *p,*pz;
        !           804:
        !           805:        if ( b == 0 ) {
        !           806:                copyn(n,PL(n),BD(z)); PL(z) = PL(n); return;
        !           807:        }
        !           808:        if ( b > 0 ) { /* >> */
        !           809:                w = b / BSH; l = PL(n)-w;
        !           810:                if ( l <= 0 ) {
        !           811:                        PL(z) = 0; return;
        !           812:                }
        !           813:                b %= BSH; p = BD(n)+w;
        !           814:                if ( !b ) {
        !           815:                        PL(z) = l;
        !           816:                        bcopy(p,BD(z),l*sizeof(unsigned int));
        !           817:                        return;
        !           818:                }
        !           819:                msw = p[l-1];
        !           820:                for ( i = BSH-1; !(msw&(((unsigned int)1)<<i)); i-- ); i++;
        !           821:                if ( b >= i ) {
        !           822:                        l--;
        !           823:                        if ( !l ) {
        !           824:                                PL(z) = 0; return;
        !           825:                        }
        !           826:                        PL(z) = l; pz = BD(z);
        !           827:                        for ( j = 0; j < l; j++, p++ )
        !           828:                                *pz++ = (*(p+1)<<(BSH-b))|(*p>>b);
        !           829:                } else {
        !           830:                        PL(z) = l; pz = BD(z);
        !           831:                        for ( j = 1; j < l; j++, p++ )
        !           832:                                *pz++ = (*(p+1)<<(BSH-b))|(*p>>b);
        !           833:                        *pz = *p>>b;
        !           834:                }
        !           835:        } else { /* << */
        !           836:                b = -b;
        !           837:                w = b / BSH; b %= BSH; l = PL(n); p = BD(n);
        !           838:                if ( !b ) {
        !           839:                        nl = l+w; PL(z) = nl;
        !           840:                        bzero((char *)BD(z),w*sizeof(unsigned int));
        !           841:                        bcopy(p,BD(z)+w,l*sizeof(unsigned int));
        !           842:                        return;
        !           843:                }
        !           844:                msw = p[l-1];
        !           845:                for ( i = BSH-1; !(msw&(((unsigned int)1)<<i)); i-- ); i++;
        !           846:                if ( b + i > BSH ) {
        !           847:                        nl = l+w+1;
        !           848:                        PL(z) = nl; pz = BD(z)+w;
        !           849:                        bzero((char *)BD(z),w*sizeof(unsigned int));
        !           850:                        *pz++ = *p++<<b;
        !           851:                        for ( j = 1; j < l; j++, p++ )
        !           852:                                *pz++ = (*p<<b)|(*(p-1)>>(BSH-b));
        !           853:                        *pz = *(p-1)>>(BSH-b);
        !           854:                } else {
        !           855:                        nl = l+w;
        !           856:                        PL(z) = nl; pz = BD(z)+w;
        !           857:                        bzero((char *)BD(z),w*sizeof(unsigned int));
        !           858:                        *pz++ = *p++<<b;
        !           859:                        for ( j = 1; j < l; j++, p++ )
        !           860:                                *pz++ = (*p<<b)|(*(p-1)>>(BSH-b));
        !           861:                }
        !           862:        }
        !           863: }
        !           864: #endif
        !           865:
        !           866: void shiftn(n,w,r)
        !           867: N n;
        !           868: int w;
        !           869: N *r;
        !           870: {
        !           871:        int l,nl;
        !           872:        N z;
        !           873:
        !           874:        if ( w == 0 )
        !           875:                COPY(n,*r);
        !           876:        else if ( w > 0 ) { /* >> */
        !           877:                l = PL(n)-w;
        !           878:                if ( l <= 0 )
        !           879:                        *r = 0;
        !           880:                else {
        !           881:                        *r = z = NALLOC(l); INITRC(z); PL(z) = l;
        !           882:                        bcopy(BD(n)+w,BD(z),l*sizeof(unsigned int));
        !           883:                }
        !           884:        } else { /* << */
        !           885:                w = -w;
        !           886:                l = PL(n); nl = l+w;
        !           887:                *r = z = NALLOC(nl); INITRC(z); PL(z) = nl;
        !           888:                bzero((char *)BD(z),w*sizeof(unsigned int));
        !           889:                bcopy(BD(n),BD(z)+w,l*sizeof(unsigned int));
        !           890:        }
        !           891: }
        !           892:
        !           893: void randomn(bits,r)
        !           894: int bits;
        !           895: N *r;
        !           896: {
        !           897:        int l,i;
        !           898:        unsigned int *tb;
        !           899:        N t;
        !           900:
        !           901:        l = (bits+31)>>5; /* word length */
        !           902:        *r = t = NALLOC(l);
        !           903:        tb = BD(t);
        !           904:        for ( i = 0; i < l; i++ )
        !           905:                tb[i] = mt_genrand();
        !           906:        if ( bits&31 )
        !           907:                tb[l-1] &= (1<<(bits&31))-1;
        !           908:        for ( i = l-1; i >= 0 && !tb[i]; i-- );
        !           909:        if ( i < 0 )
        !           910:                *r = 0;
        !           911:        else
        !           912:                PL(t) = i+1;
        !           913: }
        !           914:
        !           915: void freen(n)
        !           916: N n;
        !           917: {
        !           918:        if ( n && (n != ONEN) )
        !           919:                free(n);
        !           920: }
        !           921:
        !           922: int n_bits(n)
        !           923: N n;
        !           924: {
        !           925:        unsigned int l,i,t;
        !           926:
        !           927:        if ( !n )
        !           928:                return 0;
        !           929:        l = PL(n); t = BD(n)[l-1];
        !           930:        for ( i = 0; t; t>>=1, i++);
        !           931:        return i + (l-1)*BSH;
        !           932: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>