[BACK]Return to mp.s CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / pari / src / kernel / m68k

Annotation of OpenXM_contrib/pari/src/kernel/m68k/mp.s, Revision 1.1

1.1     ! maekawa     1: #*******************************************************************#
        !             2: #===================================================================#
        !             3: #*                                                                 *#
        !             4: #=     oooooooooo          ooooo       oooooooooo      ooooo       =#
        !             5: #*      ooooooooooo      ooooooooo      ooooooooooo     ooo        *#
        !             6: #*      ooo     ooo     ooo     ooo     ooo     ooo     ooo        *#
        !             7: #=      ooo     ooo     ooo     ooo     ooo     ooo     ooo        =#
        !             8: #*      ooooooooooo     ooooooooooo     oooooooooo      ooo        *#
        !             9: #=      oooooooooo      ooooooooooo     ooooooooooo     ooo        =#
        !            10: #*      ooo             ooo     ooo     ooo     ooo     ooo        *#
        !            11: #=      ooo             ooo     ooo     ooo     ooo     ooo        =#
        !            12: #*     ooooo           ooooo   ooooo   ooooo   ooooo   ooooo       *#
        !            13: #*                                                                 *#
        !            14: #=                                                                 =#
        !            15: #*                      version numero 2                           *#
        !            16: #*                                                                 *#
        !            17: #=                          commentee                              =#
        !            18: #*                                                                 *#
        !            19: #=                 fichier cree le 22 sept. 1987                   =#
        !            20: #*                                                                 *#
        !            21: #=                              par                                =#
        !            22: #*                                                                 *#
        !            23: #=        christian batut , henri cohen , michel olivier           =#
        !            24: #*                                                                 *#
        !            25: #=        """"""""""""""""""""""""""""""""""""""""""""""           =#
        !            26: #*                                                                 *#
        !            27: #===================================================================#
        !            28: #*******************************************************************#
        !            29: #*     $Id: mp.s,v 1.1.1.1 1999/09/16 13:47:55 karim Exp $     *#
        !            30:
        !            31: #-------------------------------------------------------------------#
        !            32: #  Notations :                                                      #
        !            33: #               T = type ( S , I , ou R ).                          #
        !            34: #               R = type reel.                                      #
        !            35: #               S = type entier court ( long du C).                 #
        !            36: #               P = p-adique.                                       #
        !            37: #                                                                   #
        !            38: #               L = longueur de la mantisse pour un reel ;          #
        !            39: #                   longueur de la mantisse effective pour un entier#
        !            40: #               l = longueur totale du nombre avec codage.          #
        !            41: #               le= longueur effective totale de l'entier avec code #
        !            42: #                   on doit avoir : l <= 2^15-1.                    #
        !            43: #                                                                   #
        !            44: #               exp = exposant non biaise d'un reel.                #
        !            45: #               fexp= exposant biaise ( fexp = exp + 2^23 ).        #
        !            46: #                     on doit avoir : -2^23 <= exp < 2^23           #
        !            47: #               fvalp=valuation p-adique biaisee d'un p-adique.     #
        !            48: #                     ( fvalp = valuation + 2^15 )                  #
        !            49: #-------------------------------------------------------------------#
        !            50: #-------------------------------------------------------------------#
        !            51: #   Conventions :                                                   #
        !            52: #               Tous les sous programmes creent la place necessaire #
        !            53: #               pour stocker le resultat , a l'exception des        #
        !            54: #               programmes d'affectation et d'echange , ainsi que   #
        !            55: #               des programmes dont le nom se termine par la lettre #
        !            56: #               "z" . On entre dans ces derniers avec une zone creee#
        !            57: #               dans la pile PARI ou le resultat est range.         #
        !            58: #                                                                   #
        !            59: #               Le nombre reel 0 s'ecrit avec mantisse non          #
        !            60: #               significative;le deuxieme lgmot code contient       #
        !            61: #               -32*L + (2^23) ou L est la longueur de la mantisse  #
        !            62: #                                                                   #
        !            63: #               Les registres a0,a1,d0,d1 sont en general utilises  #
        !            64: #               par les programmes et ne sont pas restaures a leurs #
        !            65: #               valeurs d'entree.Tous les autres sont sauvegardes.  #
        !            66: #                                                                   #
        !            67: #               Les objets utilises par PARI sont crees dans une    #
        !            68: #               pile dite dans la suite "pile PARI",pointee par     #
        !            69: #               _avma.                                              #
        !            70: #-------------------------------------------------------------------#
        !            71:
        !            72: affer1  = 23
        !            73: affer2  = 24
        !            74: affer3  = 25
        !            75: affer4  = 26
        !            76: affer5  = 27
        !            77: shier1  = 28
        !            78: shier2  = 29
        !            79: truer1  = 30
        !            80: truer2  = 31
        !            81: adder1  = 32
        !            82: adder2  = 33
        !            83: adder3  = 34
        !            84: adder4  = 35
        !            85: adder5  = 36
        !            86: muler1  = 37
        !            87: muler2  = 38
        !            88: muler3  = 39
        !            89: muler4  = 40
        !            90: muler5  = 41
        !            91: muler6  = 42
        !            92: diver1  = 43
        !            93: diver2  = 44
        !            94: diver3  = 45
        !            95: diver4  = 46
        !            96: diver5  = 47
        !            97: diver6  = 48
        !            98: diver7  = 49
        !            99: diver8  = 50
        !           100: diver9  = 51
        !           101: diver10 = 52
        !           102: diver11 = 53
        !           103: diver12 = 54
        !           104: divzer1 = 55
        !           105: dvmer1  = 56
        !           106: moder1  = 57
        !           107: reser1  = 58
        !           108: arier1  = 59
        !           109: arier2  = 60
        !           110: errpile = 61
        !           111:
        !           112:         .text
        !           113:
        !           114:         .globl  _cget,_cgetg,_cgeti,_cgetr
        !           115:         .globl  _mpaff,_affsz,_affsi,_affsr,_affii,_affir
        !           116:         .globl  _affrs,_affri,_affrr
        !           117:         .globl  _stoi,_itos
        !           118:         .globl  _mptrunc,_mptruncz,_mpent,_mpentz
        !           119:         .globl  _vals,_vali
        !           120:         .globl  _mpshift,_mpshiftz,_shifts,_shifti,_shiftr
        !           121:         .globl  _mpcmp,_cmpsi,_cmpsr,_cmpis,_cmpii,_cmpir
        !           122:         .globl  _cmprs,_cmpri,_cmprr
        !           123:         .globl  _mpadd,_addss,_addsi,_addsr,_addii,_addir,_addrr
        !           124:         .globl  _mpaddz,_addssz,_addsiz,_addsrz,_addiiz,_addirz,_addrrz
        !           125:         .globl  _mpsub,_subss,_subsi,_subsr,_subis,_subii,_subir
        !           126:         .globl  _subrs,_subri,_subrr
        !           127:         .globl  _mpsubz,_subssz,_subsiz,_subsrz,_subisz,_subiiz,_subirz
        !           128:         .globl  _subrsz,_subriz,_subrrz
        !           129:         .globl  _mpmul,_mulss,_mulsi,_mulsr,_asmmulii,_mulir,_mulrr
        !           130:         .globl  _mpmulz,_mulssz,_mulsiz,_mulsrz,_muliiz,_mulirz,_mulrrz
        !           131:         .globl  _dvmdss,_dvmdsi,_dvmdis,_asmdvmdii
        !           132:         .globl  _mpdvmdz,_dvmdssz,_dvmdsiz,_dvmdisz,_dvmdiiz
        !           133:         .globl  _mpdiv,_divss,_divsi,_divsr,_divis,_divii,_divir
        !           134:         .globl  _divrs,_divri,_divrr
        !           135:         .globl  _mpdivis,_divise
        !           136:         .globl  _mpdivz,_divssz,_divsiz,_divsrz,_divisz,_diviiz,_divirz
        !           137:         .globl  _divrsz,_divriz,_divrrz
        !           138:         .globl  _mpinvz,_mpinvsr,_mpinvir,_mpinvrr
        !           139:         .globl  _modss,_modsi,_modis,_modii
        !           140:         .globl  _mpmodz,_modssz,_modsiz,_modisz,_modiiz
        !           141:         .globl  _resss,_ressi,_resis,_resii
        !           142:         .globl  _mpresz,_resssz,_ressiz,_resisz,_resiiz
        !           143:         .globl  _addsii,_mulsii,_divisii
        !           144:
        !           145: #*******************************************************************#
        !           146: #*******************************************************************#
        !           147: #**                                                               **#
        !           148: #**             PROGRAMMES DE GESTION DE LA MEMOIRE PARI          **#
        !           149: #**                                                               **#
        !           150: #*******************************************************************#
        !           151: #*******************************************************************#
        !           152:
        !           153:
        !           154:
        !           155: #===================================================================#
        !           156: #                                                                   #
        !           157: #           Allocation memoire dans pile PARI en C                  #
        !           158: #                                                                   #
        !           159: #       entree : a7@(4) contient la longueur totale a attribuer     #
        !           160: #       sortie : d0 pointe sur un type I ou R                       #
        !           161: #                d1 et a1 sont inutilises                           #
        !           162: #                                                                   #
        !           163: #===================================================================#
        !           164:
        !           165: _cget:  movl    sp@(4),d0
        !           166:         bsr     get
        !           167:         movl    a0,d0
        !           168:         rts
        !           169:
        !           170: _cgetg: movl    sp@(8),d0       | a7@(8) contient le type
        !           171:         rorl    #8,d0
        !           172:         movw    sp@(6),d0
        !           173:         bsr     get
        !           174:         movl    a0,d0
        !           175:         rts
        !           176:
        !           177: _cgeti: movl    sp@(4),d0
        !           178:         bsr     geti
        !           179:         movl    a0,d0
        !           180:         rts
        !           181:
        !           182: _cgetr: movl    sp@(4),d0
        !           183:         bsr     getr
        !           184:         movl    a0,d0
        !           185:         rts
        !           186:
        !           187: #===================================================================#
        !           188: #                                                                   #
        !           189: #               Allocation memoire dans pile PARI                   #
        !           190: #                                                                   #
        !           191: #       entree : d0.w contient le nombre total de longs mots        #
        !           192: #                demandes si type I ou R                            #
        !           193: #       sortie : a0 pointe sur la zone allouee ; _avma est mis      #
        !           194: #                a jour ; message d'erreur si memoire insuffisante ;#
        !           195: #                d0 est inchange;d1 et a1 sont sauvegardes.         #
        !           196: #       remarque : il est interdit de creer des type S dans la pile #
        !           197: #                                                                   #
        !           198: #===================================================================#
        !           199:
        !           200:                                 | allocation memoire type qcque
        !           201:
        !           202: get:    movl    d1,sp@-         | d0.l contient code et longueur
        !           203:         moveq   #0,d1
        !           204:         movw    d0,d1
        !           205:         lsll    #2,d1
        !           206:         movl    _avma,a0
        !           207:         subl    d1,a0
        !           208:         cmpl    _bot,a0
        !           209:         bmi     mnet
        !           210:         movl    a0,_avma
        !           211: #        swap    d0
        !           212: #        movb    #1,d0
        !           213: #        swap    d0
        !           214:         movl    d0,a0@
        !           215:         movl    sp@+,d1
        !           216:         rts
        !           217:
        !           218:                                 | allocation memoire de type I
        !           219:
        !           220: geti:   movl    d1,sp@-
        !           221:         moveq   #0,d1
        !           222:         movw    d0,d1
        !           223:         lsll    #2,d1
        !           224:         movl    _avma,a0
        !           225:         subl    d1,a0
        !           226:         cmpl    _bot,a0
        !           227:         bmi     mnet
        !           228:         movl    a0,_avma
        !           229:         movw    #0x100,a0@
        !           230:         movw    d0,a0@(2)
        !           231:         movl    sp@+,d1
        !           232:         rts
        !           233:
        !           234:                                 | allocation memoire type R
        !           235:
        !           236: getr:   movl    d1,sp@-
        !           237:         moveq   #0,d1
        !           238:         movw    d0,d1
        !           239:         lsll    #2,d1
        !           240:         movl    _avma,a0
        !           241:         subl    d1,a0
        !           242:         cmpl    _bot,a0
        !           243:         bmi     mnet
        !           244:         movl    a0,_avma
        !           245:         movw    #0x200,a0@
        !           246:         movw    d0,a0@(2)
        !           247:         movl    sp@+,d1
        !           248:         rts
        !           249:
        !           250:                                 | nettoyage pile PARI
        !           251:                                 | a ecrire .....!!!!!!!!!
        !           252: mnet:   movl    #errpile,sp@-
        !           253:         jsr     _pari_err
        !           254:
        !           255: #===================================================================#
        !           256: #                                                                   #
        !           257: #               Desallocation memoire PARI                          #
        !           258: #                                                                   #
        !           259: #       entree : a0@ contient le premier long mot code d'une        #
        !           260: #                zone memoire a desallouer : uniquement de type     #
        !           261: #                I ou R                                             #
        !           262: #       sortie : _avma est mis a jour si necessaire                 #
        !           263: #                a0 pointe sur avma a jour                          #
        !           264: #                tous les autres registres sont inchanges           #
        !           265: #                                                                   #
        !           266: #===================================================================#
        !           267:
        !           268: giv:    movl    d0,sp@-
        !           269:         cmpl    _avma,a0
        !           270:         bne     givf
        !           271:                                 | ici la zone en tete de pile: on desalloue
        !           272:         movw    a0@(2),d0
        !           273:         lea     a0@(0,d0:w:4),a0| a0 pointe sur zone suivante
        !           274:         movl    a0,_avma
        !           275:
        !           276: givf:   movl    sp@+,d0
        !           277:         rts
        !           278:
        !           279: #*******************************************************************#
        !           280: #*******************************************************************#
        !           281: #**                                                               **#
        !           282: #**             PROGRAMMES D'AFFECTATION OU D'ECHANGE             **#
        !           283: #**                                                               **#
        !           284: #*******************************************************************#
        !           285: #*******************************************************************#
        !           286:
        !           287:
        !           288:
        !           289:
        !           290:
        !           291: #===================================================================#
        !           292: #                                                                   #
        !           293: #       Affectation generale    n2 --> n1                           #
        !           294: #                                                                   #
        !           295: #       entree : a7@(4) pointe sur n2 de type I ou R                #
        !           296: #                a7@(8) pointe sur n1 de type I ou R                #
        !           297: #       sortie : la zone pointee par a7@(8) contient n2             #
        !           298: #       interdit : n2 ou n1 de type S                               #
        !           299: #       remarques: erreur dans le cas R --> I                       #
        !           300: #                  d0,d1,a0,a1 sont inchanges                       #
        !           301: #                                                                   #
        !           302: #===================================================================#
        !           303:
        !           304: _mpaff: cmpb    #1,sp@(8)@
        !           305:         bne     1$
        !           306:                                 | ici T1 = I
        !           307:         cmpb    #1,sp@(4)@
        !           308:         beq     _affii          | ici T1 = T2 = I
        !           309:         bra     _affri          | ici T1 = I et T2 = R
        !           310:                                 | ici T1 = R
        !           311: 1$:     cmpb    #1,sp@(4)@
        !           312:         beq     _affir          | ici T1 = R et T2 = I
        !           313:         bra     _affrr          | ici T1 = T2 = R
        !           314:
        !           315: #-------------------------------------------------------------------#
        !           316:
        !           317:                                 | affectation s2 --> i1 ou r1
        !           318: _affsz: cmpb    #2,sp@(4)@
        !           319:         beq     _affsr
        !           320:                                 | affectation s2 --> i1
        !           321:
        !           322: _affsi: link    a6,#0
        !           323:         moveml  d0/a0,sp@-
        !           324:         movl    a6@(8),d0       | d0.l contient s2
        !           325:         movl    a6@(12),a0      | a0 pointe sur i1
        !           326:         cmpw    #2,a0@(2)
        !           327:         bne     1$
        !           328:                                 | ici l1 = 2 (i1 = 0)
        !           329:         tstl    d0
        !           330:         beq     4$
        !           331:                                 | ici s2 <> 0 (erreur)
        !           332:         movl    #affer1,sp@-
        !           333:         jsr     _pari_err
        !           334:                                 | ici s2 = 0 ou l1 >= 3
        !           335: 1$:     tstl    d0
        !           336: 4$:     bmi     2$
        !           337:                                 | ici s2 >= 0
        !           338:         bne     3$
        !           339:                                 | ici s2 = 0
        !           340:         movl    #2,a0@(4)
        !           341:         bra     affsif
        !           342:                                 | ici s2 > 0 et l1 >= 3
        !           343: 3$:     movl    #0x1000003,a0@(4)
        !           344:         movl    d0,a0@(8)
        !           345:         bra     affsif
        !           346:                                 | ici s2 < 0 et l1 >= 3
        !           347: 2$:     movl    #0xff000003,a0@(4)
        !           348:         negl    d0
        !           349:         movl    d0,a0@(8)
        !           350: affsif: moveml  sp@+,d0/a0
        !           351:         unlk    a6
        !           352:         rts
        !           353:
        !           354: #-------------------------------------------------------------------#
        !           355:
        !           356:                                 | affectation i2 --> i1
        !           357:
        !           358: _affii: link    a6,#0
        !           359:         moveml  d0/a0-a1,sp@-
        !           360:         movl    a6@(8),a1       | a1 pointe sur i2
        !           361:         movl    a6@(12),a0      | a0 pointe sur i1
        !           362:         cmpl    a0,a1
        !           363:         beq     affiif
        !           364:                                 | ici a0 <> a1
        !           365:         movw    a0@(2),d0       | d0.w contient l1
        !           366:         cmpw    a1@(6),d0
        !           367:         bcc     1$
        !           368:                                 | ici le2 > l1 (erreur)
        !           369:         movl    #affer3,sp@-
        !           370:         jsr     _pari_err
        !           371:                                 | ici le2 <= l1
        !           372: 1$:     movw    a1@(6),d0       | d0.w contient le2
        !           373:         subqw   #2,d0           | d0.w contient L2
        !           374:         addql   #4,a0
        !           375:         addql   #4,a1
        !           376:                                 | copie de i2 dans i1
        !           377: 2$:     movl    a1@+,a0@+
        !           378:         dbra    d0,2$
        !           379: affiif: moveml  sp@+,d0/a0-a1
        !           380:         unlk    a6
        !           381:         rts
        !           382:
        !           383: #-------------------------------------------------------------------#
        !           384:
        !           385:                                 | conversion i --> long du C dans d0
        !           386:
        !           387: _itos:  movl    a1,sp@-
        !           388:         movl    sp@(8),a1       | a1 pointe sur i2
        !           389:         cmpw    #3,a1@(6)
        !           390:         bls     1$
        !           391:                                 | ici l2 >= 4 (erreur)
        !           392:         movl    #affer2,sp@-
        !           393:         jsr     _pari_err
        !           394:                                 | ici l2 <= 3
        !           395: 1$:     beq     2$
        !           396:                                 | ici l2 = 2 (i2 = 0)
        !           397:         moveq   #0,d0
        !           398:         bra     itosf
        !           399:                                 | ici l2 = 3
        !           400: 2$:     movl    a1@(8),d0       | d0.l contient |i2|
        !           401:         cmpl    #0x80000000,d0
        !           402:         bcs     3$
        !           403:         beq     4$
        !           404:                                 | ici |i2| > 2^31 (erreur)
        !           405: 5$:     movl    #affer2,sp@-
        !           406:         jsr     _pari_err
        !           407:                                 | ici |i2| = 2^31
        !           408: 4$:     tstb    a1@(4)
        !           409:         bpl     5$              | si i2 = 2^31 erreur
        !           410:         bra     itosf           | ici i2 = -2^31
        !           411:                                 | ici |i2| <= 2^31-1
        !           412: 3$:     tstw    a1@(4)
        !           413:         bpl     itosf
        !           414:         negl    d0
        !           415: itosf:  movl    sp@+,a1
        !           416:         rts
        !           417:
        !           418: #-------------------------------------------------------------------#
        !           419:
        !           420:                                 | conversion long du C --> i cree
        !           421:
        !           422: _stoi:  movl    sp@(4),d1
        !           423:         bne     1$
        !           424:        movl    _gzero,d0
        !           425:        rts
        !           426: 1$:     movl    #3,d0
        !           427:         bsr     geti
        !           428:         tstl    d1
        !           429:         bmi     2$
        !           430:         movl    #0x1000003,a0@(4)
        !           431:         bra     3$
        !           432: 2$:     movl    #0xff000003,a0@(4)
        !           433:         negl    d1
        !           434: 3$:     movl    d1,a0@(8)
        !           435:        movl    a0,d0
        !           436:         rts
        !           437:
        !           438: #-----------------------------------------------------------------------#
        !           439:
        !           440:                                 | affectation s2 --> r1
        !           441:
        !           442: _affsr: link    a6,#0
        !           443:         moveml  d0-d1/a0,sp@-
        !           444:         movl    a6@(12),a0      | a0 pointe sur r1
        !           445:         movl    a6@(8),d0       | d0.l contient s2
        !           446:         bne     1$
        !           447:                                 | ici s2 = 0
        !           448:         moveq   #0,d0
        !           449:         movw    a0@(2),d0
        !           450:         subqw   #2,d0
        !           451:         lsll    #5,d0
        !           452:         negl    d0
        !           453:         addl    #0x800000,d0    | d0.l contient fexp(0)
        !           454:         movl    d0,a0@(4)
        !           455:         clrl    a0@(8)
        !           456:         bra     affsrf
        !           457:                                 | ici s2 <> 0
        !           458: 1$:     bpl     2$
        !           459:         negl    d0
        !           460:         movb    #0xff,a0@(4)    | mise signe si s2 < 0
        !           461:         bra     3$
        !           462: 2$:     movb    #1,a0@(4)       | mise signe si s2 > 0
        !           463:                                 | ici s2 <> 0
        !           464: 3$:     bfffo   d0{#0:#0},d1    | d1.l recoit nb. de shifts (=k)
        !           465:         lsll    d1,d0           | d0.l est norme
        !           466:         negw    d1
        !           467:         addw    #31,d1
        !           468:         movw    d1,a0@(6)
        !           469:         movb    #0x80,a0@(5)    | mise exposant
        !           470:         movl    d0,a0@(8)       | mise 1er long mot mantisse
        !           471:         moveq   #0,d0
        !           472:         movw    a0@(2),d1
        !           473:         subql   #3,d1           | d1.w recoit L1-1
        !           474:         addl    #12,a0          | a0 pointe sur 2eme long mot mantisse
        !           475:         bra     4$
        !           476: 5$:     movl    d0,a0@+
        !           477: 4$:     dbra    d1,5$
        !           478: affsrf: moveml  sp@+,d0-d1/a0
        !           479:         unlk    a6
        !           480:         rts
        !           481:
        !           482: #-------------------------------------------------------------------#
        !           483:
        !           484:                                 | affectation i2 --> r1
        !           485:
        !           486: _affir: link a6,#0
        !           487:         moveml  d0-d6/a0-a1,sp@-
        !           488:         movl    a6@(8),a1       | a1 pointe sur i2
        !           489:         movl    a6@(12),a0      | a0 pointe sur r1
        !           490:         tstb    a1@(4)
        !           491:         bne     1$
        !           492:                                 | ici i2 = 0
        !           493:         moveq   #0,d0
        !           494:         movw    a0@(2),d0
        !           495:         subqw   #2,d0
        !           496:         lsll    #5,d0
        !           497:         negl    d0
        !           498:         addl    #0x800000,d0
        !           499:         movl    d0,a0@(4)
        !           500:         clrl    a0@(8)
        !           501:         bra     affirf
        !           502:                                 | ici i2 <> 0
        !           503: 1$:     movl    a1@(8),d0       | d0.l contient 1er lg mot mantisse
        !           504:         bfffo   d0{#0:#0},d1    | d1.l recoit nb de shifts (=k)
        !           505:         lsll    d1,d0           | d0.l normalise
        !           506:         moveq   #0,d2
        !           507:         movw    a1@(6),d2
        !           508:         lsll    #5,d2
        !           509:         subl    d1,d2
        !           510:         addl    #0x7fffbf,d2    | d2.l = fexp2 = 2^23 + L1*32 -1 -k
        !           511:         movl    d2,a0@(4)       | mise exposant
        !           512:         movb    a1@(4),a0@(4)   | mise signe
        !           513:         movw    a1@(6),d4
        !           514:         subqw   #3,d4           | d4.w recoit L2-1 (compteur)
        !           515:         movw    a0@(2),d2
        !           516:         subqw   #3,d2           | d2.w recoit L1-1
        !           517:         addl    #12,a1          | a1 pointe sur 2eme lg mot mantisse i2
        !           518:         addql   #8,a0           | a0 ponte sur 1er lg mot mantisse r1
        !           519:         moveq   #1,d6           | masque
        !           520:         lsll    d1,d6
        !           521:         subql   #1,d6
        !           522:         subw    d4,d2           | d2.w  recoit L1-L2
        !           523:         bpl     2$
        !           524:                                 | ici L1 < L2
        !           525:         addw    d2,d4           | d4.w  recoit L1-1
        !           526:         bra     2$
        !           527:                                 | copie mantisse shiftee dans r1
        !           528: 3$:     movl    a1@+,d3
        !           529:         roll    d1,d3
        !           530:         movl    d3,d5
        !           531:         andl    d6,d3
        !           532:         addl    d3,d0
        !           533:         movl    d0,a0@+
        !           534:         subl    d3,d5
        !           535:         movl    d5,d0
        !           536: 2$:     dbra    d4,3$
        !           537:         tstw    d2
        !           538:         bmi     4$
        !           539:                                 | ici L1 > L2 completer par des 0
        !           540:         moveq   #0,d3
        !           541:         movl    d0,a0@+
        !           542:         bra     5$
        !           543: 6$:     movl    d3,a0@+
        !           544: 5$:     dbra    d2,6$
        !           545:         bra     affirf
        !           546:                                 | ici L1 <= L2
        !           547: 4$:     movl    a1@+,d3
        !           548:         roll    d1,d3
        !           549:         andl    d6,d3
        !           550:         addl    d3,d0
        !           551:         movl    d0,a0@+         | mise a jour dernier lg mot
        !           552: affirf: moveml  sp@+,d0-d6/a0-a1
        !           553:         unlk    a6
        !           554:         rts
        !           555:
        !           556: #-------------------------------------------------------------------#
        !           557:
        !           558:                                 | affectation r2 --> r1
        !           559:
        !           560: _affrr: link    a6,#0
        !           561:         moveml  d0-d1/a0-a1,sp@-
        !           562:         movl    a6@(8),a1       | a1 pointe sur r2
        !           563:         movl    a6@(12),a0      | a0 pointe sur r1
        !           564:         cmpl    a0,a1
        !           565:         beq     affrrf
        !           566:                                 | ici a0 <> a1
        !           567:         tstb    a1@(4)
        !           568:         bne     6$
        !           569:                                 | ici r2 = 0
        !           570:         movl    a1@(4),a0@(4)
        !           571:         clrl    a0@(8)
        !           572:         bra     affrrf
        !           573:                                 | ici r2 <> 0
        !           574: 6$:     addql   #4,a0
        !           575:         addql   #4,a1
        !           576:         movw    a0@(-2),d0
        !           577:         movw    a1@(-2),d1      | d0.w , d1.w contient l1,l2
        !           578:         cmpw    d0,d1
        !           579:         bhi     1$
        !           580:                                 | ici l1 >= l2
        !           581:         subw    d1,d0           | d0.w contient l1-l2
        !           582:         subqw   #2,d1           | d1.w  contient L2
        !           583: 3$:     movl    a1@+,a0@+       | copie de r2 dans r1
        !           584:         dbra    d1,3$
        !           585:         moveq   #0,d1
        !           586:         bra     2$
        !           587:                                 | ici completer par des 0
        !           588: 4$:     movl    d1,a0@+
        !           589: 2$:     dbra    d0,4$
        !           590:         bra     affrrf
        !           591:                                 | ici l2 > l1
        !           592: 1$:     subqw   #2,d0           | d0.w recoit L1 (compteur)
        !           593: 5$:     movl    a1@+,a0@+
        !           594:         dbra    d0,5$
        !           595: affrrf: moveml  sp@+,d0-d1/a0-a1
        !           596:         unlk    a6
        !           597:         rts
        !           598:
        !           599: #-------------------------------------------------------------------#
        !           600:
        !           601:                                 | affectation r2 --> s1
        !           602:
        !           603: _affrs: movl    #affer4,sp@-
        !           604:         jsr     _pari_err
        !           605:
        !           606: #-------------------------------------------------------------------#
        !           607:
        !           608:                                 | affectation r2 --> i1
        !           609:
        !           610: _affri: movl    #affer5,sp@-
        !           611:         jsr     _pari_err
        !           612:
        !           613:
        !           614: #*******************************************************************#
        !           615: #*******************************************************************#
        !           616: #**                                                               **#
        !           617: #**                     VALUATION                                 **#
        !           618: #**                                                               **#
        !           619: #*******************************************************************#
        !           620: #*******************************************************************#
        !           621:
        !           622:
        !           623:
        !           624:
        !           625:
        !           626: #===================================================================#
        !           627: #                                                                   #
        !           628: #       Valuation 2-adique d'un entier court ou d'un entier         #
        !           629: #                                                                   #
        !           630: #       entree : a7@(4) contient s1 de type S ou pointe sur i1 de   #
        !           631: #                type I                                             #
        !           632: #       sortie : d0.l contient k tel que : k>=0 , n1=2^k*n2 ,       #
        !           633: #                avec n2 et 2 premiers entre eux ; si n1=0 , alors  #
        !           634: #                d0.l contient -1.                                  #
        !           635: #       remarque : type R interdit                                  #
        !           636: #                                                                   #
        !           637: #===================================================================#
        !           638:
        !           639:                                 | valuation de s1 de type S
        !           640:
        !           641: _vals:  link    a6,#0
        !           642:         movl    d2,sp@-
        !           643:         moveq   #-1,d0
        !           644:         movl    a6@(8),d1       | d1.l contient s1
        !           645:         beq     valsf
        !           646:         moveq   #0,d0
        !           647:         tstw    d1
        !           648:         bne     1$
        !           649:         addl    #16,d0
        !           650:         swap    d1
        !           651: 1$:     tstb    d1
        !           652:         bne     2$
        !           653:         addql   #8,d0
        !           654:         lsrl    #8,d1
        !           655: 2$:     movl    d1,d2
        !           656:         andl    #15,d2
        !           657:         bne     3$
        !           658:         addql   #4,d0
        !           659:         lsrl    #4,d1
        !           660: 3$:     movl    d1,d2
        !           661:         andl    #3,d2
        !           662:         bne     4$
        !           663:         addql   #2,d0
        !           664:         lsrl    #2,d1
        !           665: 4$:     btst    #0,d1
        !           666:         bne     valsf
        !           667:         addql   #1,d0
        !           668: valsf:  movl    sp@,d2
        !           669:         unlk    a6
        !           670:         rts
        !           671:
        !           672:                                 | valuation de i1 de type I
        !           673:
        !           674: _vali:  link    a6,#0
        !           675:         movl    d2,sp@-
        !           676:         movl    a6@(8),a1       | a1 pointe sur i1
        !           677:         moveq   #-1,d0
        !           678:         tstb    a1@(4)
        !           679:         beq     valif
        !           680:                                 | ici i1 <> 0
        !           681:         movw    a1@(6),d1       | d1.w contient L1+2
        !           682:         lea     a1@(0,d1:w:4),a1| a1 pointe fin mantisse de i1
        !           683:         movl    #0xffff,d0
        !           684: 5$:     tstl    a1@-
        !           685:         dbne    d0,5$
        !           686:         notw    d0
        !           687:         lsll    #5,d0           | d0.l contient 32*nb.de lgmots nuls
        !           688:         movl    a1@,d1          | a droite de i1 et a1 pointe 1er lgmot
        !           689:         tstw    d1              | non nul (qui existe car i1 <> 0)
        !           690:         bne     1$
        !           691:         addl    #16,d0
        !           692:         swap    d1
        !           693: 1$:     tstb    d1
        !           694:         bne     2$
        !           695:         addql   #8,d0
        !           696:         lsrl    #8,d1
        !           697: 2$:     movl    d1,d2
        !           698:         andl    #15,d2
        !           699:         bne     3$
        !           700:         addql   #4,d0
        !           701:         lsrl    #4,d1
        !           702: 3$:     movl    d1,d2
        !           703:         andl    #3,d2
        !           704:         bne     4$
        !           705:         addql   #2,d0
        !           706:         lsrl    #2,d1
        !           707: 4$:     btst    #0,d1
        !           708:         bne     valif
        !           709:         addql   #1,d0
        !           710: valif:  movl    sp@,d2
        !           711:         unlk    a6
        !           712:         rts
        !           713:
        !           714:
        !           715:
        !           716:
        !           717:
        !           718: #*******************************************************************#
        !           719: #*******************************************************************#
        !           720: #**                                                               **#
        !           721: #**                     PROGRAMMES DE SHIFT                       **#
        !           722: #**                                                               **#
        !           723: #*******************************************************************#
        !           724: #*******************************************************************#
        !           725:
        !           726:
        !           727:
        !           728:
        !           729:
        !           730: #===================================================================#
        !           731: #                                                                   #
        !           732: #                       Shift general                               #
        !           733: #                                                                   #
        !           734: #       entree : a7@(4) pointe sur n2 de type I ou R                #
        !           735: #                a7@(8) contient k = nombre de shifts               #
        !           736: #       sortie : d0 pointe sur n1 de type I ou R                    #
        !           737: #                contenant n1 = 2^k * n2 (zone creee)               #
        !           738: #       interdit : type S                                           #
        !           739: #                                                                   #
        !           740: #===================================================================#
        !           741:
        !           742: _mpshift:cmpb   #1,sp@(4)@
        !           743:         beq     _shifti
        !           744:         bra     _shiftr
        !           745:
        !           746: #===================================================================#
        !           747: #                                                                   #
        !           748: #                       Shift (par valeur)                          #
        !           749: #                                                                   #
        !           750: #       entree : a7@(4) pointe sur n2 de type I ou R                #
        !           751: #                a7@(8) contient le nombre de shifts (=k)           #
        !           752: #                a7@(12) pointe sur n1 de type I ou R               #
        !           753: #       sortie : la zone pointee par a7@(12) contient 2^k * n2      #
        !           754: #       interdit : type S                                           #
        !           755: #                                                                   #
        !           756: #===================================================================#
        !           757:
        !           758: _mpshiftz:movl  sp@(4),a0
        !           759:         cmpl    sp@(12),a0
        !           760:         bne     1$
        !           761:         cmpb    #2,a0@
        !           762:         bne     1$
        !           763:         movl    a0@(4),d0
        !           764:         andl    #0xffffff,d0
        !           765:         addl    sp@(8),d0
        !           766:         bvs     shier
        !           767:         cmpl    #0x1000000,d0
        !           768:         bcc     shier
        !           769:         tstl    d0
        !           770:         bmi     shier
        !           771:         movw    d0,a0@(6)
        !           772:         swap    d0
        !           773:         movb    d0,a0@(5)
        !           774:         rts
        !           775: 1$:     movl    sp@(8),sp@-
        !           776:         movl    sp@(8),sp@-
        !           777:         bsr     _mpshift
        !           778:         movl    d0,sp@
        !           779:         movl    sp@(20),sp@(4)
        !           780:         bsr     _mpaff
        !           781:         movl    sp@,a0
        !           782:         addql   #8,sp
        !           783:         bra     giv
        !           784:
        !           785: #===================================================================#
        !           786: #                                                                   #
        !           787: #               Shift d'un entier court = entier                    #
        !           788: #                                                                   #
        !           789: #       entree : a7@(4) contient s2 de type S                       #
        !           790: #                a7@(8) contient k = nombre de shifts               #
        !           791: #       sortie : d0 pointe sur i1 de type I                         #
        !           792: #                avec i1 = 2^k * s2 (zone creee)                    #
        !           793: #                                                                   #
        !           794: #===================================================================#
        !           795:
        !           796: _shifts:link    a6,#-12
        !           797:         movl    a6@(12),sp@-    | empilage k
        !           798:         movl    a6@(8),d0       | d0.l contient s2
        !           799:         bne     1$
        !           800:                                 | ici s2 = 0
        !           801:         movl    #0x1000002,a6@(-12)
        !           802:         movl    #2,a6@(-8)      | creation de 0 en var. locale
        !           803:         bra     3$
        !           804:                                 | ici s2 <> 0
        !           805: 1$:     movl    #0x1000003,a6@(-12)
        !           806:         movl    #0x1000003,a6@(-8)
        !           807:         tstl    d0
        !           808:         bpl     2$
        !           809:         negl    d0
        !           810:         movb    #0xff,a6@(-8)
        !           811: 2$:     movl    d0,a6@(-4)      | creation de s2 en var. locale
        !           812: 3$:     pea     a6@(-12)        | empilage adresse var. locale
        !           813:         bsr     _shifti
        !           814:         unlk    a6
        !           815:         rts
        !           816:
        !           817: #===================================================================#
        !           818: #                                                                   #
        !           819: #                       Shift entier = entier                       #
        !           820: #                                                                   #
        !           821: #       entree : a7@(4) pointe sur i2 de type I                     #
        !           822: #                a7@(8) contient k = nombre de shifts               #
        !           823: #       sortie : d0 pointe sur i1 de type I                         #
        !           824: #                avec i1 = 2^k * i2 (zone creee)                    #
        !           825: #                                                                   #
        !           826: #===================================================================#
        !           827:
        !           828: _shifti:link    a6,#0
        !           829:         moveml  d2-d7/a2-a3,sp@-
        !           830:         movl    a6@(8),a2       | a2 pointe sur i2
        !           831:         movl    a6@(12),d7      | d7.l contient k
        !           832:         bne     1$
        !           833:                                 | ici k = 0
        !           834:         movw    a2@(2),d0
        !           835:         bsr     geti
        !           836:         movl    a0,a3   | sauvegarde adresse resultat
        !           837:         subqw   #2,d0
        !           838:         addql   #4,a0
        !           839:         addql   #4,a2
        !           840: 24$:    movl    a2@+,a0@+
        !           841:         dbra    d0,24$
        !           842:         bra     shiftif
        !           843:                                 | ici k <> 0
        !           844: 1$:     tstb    a2@(4)
        !           845:         bne     2$
        !           846:                                 | ici i1 = 0
        !           847: 6$:     movl    _gzero,d0       | sauvegarde adresse resultat
        !           848:         bra     shiftig
        !           849:                                 | ici k <> 0 et i2 <> 0
        !           850: 2$:     moveq   #0,d0
        !           851:         movw    a2@(6),d0       | d0.w contient L2+2
        !           852:         cmpl    #1,d7
        !           853:         bne     3$
        !           854:                                 | ici k = 1 et i2 <> 0
        !           855:         movl    a2@(8),d5
        !           856:         btst    #31,d5
        !           857:         beq     4$
        !           858:                                 | ici d5 >= 2^31
        !           859:         addqw   #1,d0           | demander 1 lgmot supplementaire
        !           860:         cmpw    #0x8000,d0
        !           861:         bcs     4$
        !           862:                                 | ici debordement
        !           863: 18$:    movl    #shier1,sp@-
        !           864:         jsr     _pari_err
        !           865:                                 | ici k = 1 et i2 <> 0
        !           866: 4$:     bsr     geti
        !           867:         movl    a0,a3           | sauvegarde adresse resultat
        !           868:         movw    a0@(2),a0@(6)   | mise longueur effective
        !           869:         movb    a2@(4),a0@(4)   | mise signe
        !           870:         lea     a0@(0,d0:w:4),a1| a1 pointe fin resultat
        !           871:         lea     a2@(0,d0:w:4),a2
        !           872:         btst    #31,d5
        !           873:         beq     5$
        !           874:         subqw   #4,a2           | ici a2 pointe fin i2
        !           875:         movl    #1,a0@(8)
        !           876:         subqw   #1,d0
        !           877: 5$:     subqw   #3,d0           | d0.w compteur
        !           878: 7$:     movl    a2@-,d1
        !           879:         roxll   #1,d1
        !           880:         movl    d1,a1@-
        !           881:         dbra    d0,7$
        !           882:         bra     shiftif
        !           883:                                 | ici k <> 1 et i2 <> 0
        !           884: 3$:     cmpl    #-1,d7
        !           885:         bne     8$
        !           886:                                 | ici k = -1 et i2 <> 0
        !           887:         cmpl    #1,a2@(8)
        !           888:         bhi     9$
        !           889:         subqw   #1,d0
        !           890:         cmpw    #2,d0
        !           891:         beq     6$              | si i1 = 0
        !           892: 9$:     bsr     geti
        !           893:         movl    a0,a3
        !           894:         movb    a2@(4),a0@(4)   | mise signe
        !           895:         movw    a0@(2),a0@(6)   | mise longueur effective
        !           896:         addql   #8,a0
        !           897:         addql   #8,a2
        !           898:         movw    a2@(-2),d0
        !           899:         subqw   #3,d0           | d0.w compteur
        !           900:         movl    a2@+,d1
        !           901:         lsrl    #1,d1
        !           902:         beq     10$
        !           903:         movl    d1,a0@+
        !           904:         bra     10$
        !           905: 11$:    movl    a2@+,d1
        !           906:         roxrl   #1,d1
        !           907:         movl    d1,a0@+
        !           908: 10$:    dbra    d0,11$
        !           909:         bra     shiftif
        !           910:                                 | ici k<>0,k<>1,k<>-1 et i2<>0
        !           911: 8$:     tstl    d7
        !           912:         bpl     12$
        !           913:                                 | ici shift a droite : k < -1 et i2 <> 0
        !           914:         negl    d7              | d7.l contient /k/
        !           915:         movl    d7,d4
        !           916:         lsrl    #5,d4           | d4.l contient q
        !           917:         andl    #31,d7          | k=32*q+r; d7.l contient r
        !           918:
        !           919:         subw    #2,d0           | d0.w contient L2
        !           920:         cmpw    d4,d0
        !           921:         bls     6$              | si r1 <= 0
        !           922:         addw    #2,d0           |
        !           923:         subw    d4,d0           | d0.w contient L2+2-q
        !           924:
        !           925:         movl    a2@(8),d4
        !           926:         lsrl    d7,d4
        !           927:         bne     13$
        !           928:                                 | ici on perd un lgmot de resultat
        !           929:         subqw   #1,d0
        !           930:         cmpw    #2,d0
        !           931:         beq     6$              | si r1 = 0
        !           932: 13$:    bsr     geti            | allocation memoire pour resultat
        !           933:         movl    a0,a3
        !           934:         movb    a2@(4),a0@(4)   | mise signe
        !           935:         movw    a0@(2),a0@(6)   | mise longueur effective
        !           936:         lea     a2@(0,d0:w:4),a2| a2 pointe ou il faut !
        !           937:         lea     a0@(0,d0:w:4),a1| a1 pointe fin resultat
        !           938:         tstl    d4
        !           939:         beq     14$
        !           940:         movl    d4,a0@(8)
        !           941:         subqw   #3,d0           | d0.w compteur
        !           942:         bra     15$
        !           943: 14$:    addql   #4,a2
        !           944:         subqw   #2,d0
        !           945: 15$:    moveq   #-1,d6
        !           946:         lsrl    d7,d6           | masque de shift
        !           947:         movl    a2@-,d4
        !           948:         lsrl    d7,d4
        !           949:         bra     16$
        !           950: 17$:    movl    a2@-,d2         | boucle de shift
        !           951:         rorl    d7,d2
        !           952:         movl    d2,d3
        !           953:         andl    d6,d3
        !           954:         subl    d3,d2
        !           955:         addl    d2,d4
        !           956:         movl    d4,a1@-
        !           957:         movl    d3,d4
        !           958: 16$:    dbra    d0,17$
        !           959:         bra     shiftif
        !           960:                                 | ici shift a gauche : k > 1 et i2 <> 0
        !           961: 12$:    movl    d7,d4
        !           962:         andl    #31,d7          | d7.l contient r
        !           963:         lsrl    #5,d4           | d4.l contient q (k=32*q+r)
        !           964:         addl    d4,d0           | d0.l contient L2+2+q
        !           965:         cmpw    #0x7fff,d0
        !           966:         bcc     18$
        !           967:         moveq   #-1,d6
        !           968:         lsll    d7,d6
        !           969:         notl    d6              | masque de shift
        !           970:         movl    a2@(8),d2
        !           971:         roll    d7,d2
        !           972:         movl    d2,d3
        !           973:         andl    d6,d3
        !           974:         beq     19$
        !           975:         addqw   #1,d0           | un long mot supplementaire
        !           976: 19$:    bsr     geti
        !           977:         movl    a0,a3
        !           978:         movl    a0@(2),a0@(6)   | mise longueur effective
        !           979:         movb    a2@(4),a0@(4)   | mise signe
        !           980:         addql   #8,a0
        !           981:         tstl    d3
        !           982:         beq     20$
        !           983:         movl    d3,a0@+
        !           984: 20$:    subl    d3,d2
        !           985:         movl    d2,d5
        !           986:         movw    a2@(6),d0
        !           987:         addl    #12,a2
        !           988:         subqw   #3,d0           | d0.w contient compteur
        !           989:         bra     21$
        !           990: 22$:    movl    a2@+,d2
        !           991:         roll    d7,d2
        !           992:         movl    d2,d3
        !           993:         andl    d6,d3
        !           994:         subl    d3,d2
        !           995:         addl    d3,d5
        !           996:         movl    d5,a0@+
        !           997:         movl    d2,d5
        !           998: 21$:    dbra    d0,22$
        !           999:         movl    d5,a0@+
        !          1000:         moveq   #0,d0
        !          1001:         bra     23$
        !          1002: 25$:    movl    d0,a0@+
        !          1003: 23$:    dbra    d4,25$
        !          1004: shiftif:movl    a3,d0           | d0 pointe sur resultat
        !          1005: shiftig:moveml  sp@+,d2-d7/a2-a3
        !          1006:         unlk    a6
        !          1007:         rts
        !          1008:
        !          1009: #===================================================================#
        !          1010: #                                                                   #
        !          1011: #                       Shift reel = reel                           #
        !          1012: #                                                                   #
        !          1013: #       entree : a7@(4) pointe sur r2 de type R                     #
        !          1014: #                a7@(8) contient k = nombre de shifts               #
        !          1015: #       sortie : d0 pointe sur r1 de type R                         #
        !          1016: #                avec r1 = 2^k * r2 zone creee)                     #
        !          1017: #                                                                   #
        !          1018: #===================================================================#
        !          1019:
        !          1020: _shiftr:link    a6,#0
        !          1021:         moveml  d2/a2-a3,sp@-
        !          1022:         movl    a6@(8),a2       | a2 pointe sur r2
        !          1023:         movl    a6@(12),d2      | d2.l contient k
        !          1024:         bne     1$
        !          1025:                                 | ici k = 0
        !          1026:         movw    a2@(2),d0
        !          1027:         bsr     getr
        !          1028:         movl    a0,a3
        !          1029:         subqw   #2,d0
        !          1030:         addql   #4,a0
        !          1031:         addql   #4,a2
        !          1032: 4$:     movl    a2@+,a0@+
        !          1033:         dbra    d0,4$           | boucle de recopie de r2 dans r1
        !          1034:         bra     shiftrf
        !          1035:                                 | ici k <> 0
        !          1036: 1$:     movl    a2@(4),d1
        !          1037:         andl    #0xffffff,d1
        !          1038:         addl    d2,d1           | d1.l contient fexp2 + k
        !          1039:         bvc     sh
        !          1040:                                 | ici debordement
        !          1041: shier:  movl    #shier2,sp@-
        !          1042:         jsr     _pari_err
        !          1043:                                 | ici k + fexp2 <= 2^31 -1
        !          1044: sh:     cmpl    #0x1000000,d1
        !          1045:         bcc     shier           | si k + fexp2 >= 2^24
        !          1046:         tstl    d1
        !          1047:         bmi     shier           | si k + fexp2 < 0
        !          1048:         movw    a2@(2),d0
        !          1049:         bsr     getr            | allocation memoire pour resultat
        !          1050:         movl    a0,a3
        !          1051:         movl    d1,a0@(4)       | mise exposant
        !          1052:         movb    a2@(4),a0@(4)   | mise signe
        !          1053:         addql   #8,a0
        !          1054:         addql   #8,a2
        !          1055:         subqw   #3,d0
        !          1056: 5$:     movl    a2@+,a0@+
        !          1057:         dbra    d0,5$
        !          1058: shiftrf:movl    a3,d0           | d0 pointe sur resultat
        !          1059:         moveml  sp@+,d2/a2-a3
        !          1060:         unlk    a6
        !          1061:         rts
        !          1062:
        !          1063:
        !          1064:
        !          1065:
        !          1066:
        !          1067: #*******************************************************************#
        !          1068: #*******************************************************************#
        !          1069: #**                                                               **#
        !          1070: #**                     PROGRAMMES DE PARTIE ENTIERE              **#
        !          1071: #**                                                               **#
        !          1072: #*******************************************************************#
        !          1073: #*******************************************************************#
        !          1074:
        !          1075:
        !          1076:
        !          1077:
        !          1078:
        !          1079: #===================================================================#
        !          1080: #                                                                   #
        !          1081: #               Fausse partie entiere (trunc)                       #
        !          1082: #                                                                   #
        !          1083: #       entree : a7@(4) pointe sur n1 de type I ou de type R        #
        !          1084: #       sortie : d0 pointe sur i1 de type I (zone creee)            #
        !          1085: #       calcul : si r1 >= 0 , i1 est la partie entiere              #
        !          1086: #                si r1 < 0 , i1 = - Ent (-r1)                       #
        !          1087: #       remarque : type S interdit                                  #
        !          1088: #                                                                   #
        !          1089: #===================================================================#
        !          1090:
        !          1091: _mptrunc:link   a6,#0
        !          1092:         moveml  d2-d6/a2-a4,sp@-
        !          1093:         movl    a6@(8),a1       | a1 pointe sur n1
        !          1094:         cmpb    #1,a1@
        !          1095:         bne     5$
        !          1096:                                 | ici n1 est de type I
        !          1097:         movw    a1@(6),d0
        !          1098:         bsr     geti
        !          1099:         movl    a0,a4
        !          1100:         subqw   #2,d0
        !          1101:         addql   #4,a0
        !          1102:         addql   #4,a1
        !          1103: 7$:     movl    a1@+,a0@+
        !          1104:         dbra    d0,7$
        !          1105:         bra     truncf
        !          1106:                                 | ici n1 est de type R
        !          1107: 5$:     movl    a1@(4),d3       | d3.l contient second long mot code r1
        !          1108:         movl    d3,d0
        !          1109:         andl    #0xffffff,d0    | d0.l contient fexp1
        !          1110:         subl    #0x800000,d0    | d0.l contient exp1
        !          1111:         bpl     1$
        !          1112:                                 | ici exp1 < 0 (trunc r1 = 0)
        !          1113:        movl    _gzero,d0
        !          1114:         bra     truncg
        !          1115:                                 | ici exp1 >= 0
        !          1116: 1$:     movl    d0,d2           | d2.l  contient exp1
        !          1117:         lsrl    #5,d0           | d0.l contient exp1 div 32 = q
        !          1118:         addql   #3,d0           | d0.l  contient le(i1)
        !          1119:         cmpl    #0x7fff,d0
        !          1120:         bls     2$
        !          1121:                                 | ici le(i1)> 2^15 : erreur
        !          1122:         movl    #truer1,sp@-
        !          1123:         jsr     _pari_err
        !          1124:                                 | ici le(i1)<=2^15
        !          1125: 2$:     bsr     geti            | allocation q+3 longs mots pour i1
        !          1126:         movl    a0,a4
        !          1127:         movw    d0,a0@(6)       | mise longueur effective de i1
        !          1128:         movb    a1@(4),a0@(4)   | mise signe de i1
        !          1129:         movl    a0,a3           | sauvegarde adresse i1
        !          1130:         addql   #8,a0
        !          1131:         addql   #8,a1           | a0,a1 pointent sur mantisses i1,r1
        !          1132:         movw    a1@(-6),d1      | d1.w contient l(r1)
        !          1133:         subw    d0,d1           | d1.w contient l(r1)-le(i1)
        !          1134:         bpl     3$
        !          1135:                                 | ici l(r1)<le(i1) : erreur
        !          1136:         movl    #truer2,sp@-
        !          1137:         jsr     _pari_err
        !          1138:                                 | ici l(r1)>=le(i1)
        !          1139: 3$:     subqw   #3,d0           | d0.w contient l(i1)-1 (compteur)
        !          1140:         addqb   #1,d2           | d2.b contient exp1+1 (derniers bits)
        !          1141:         andb    #31,d2          | d2.b contient exp1+1 mod 32
        !          1142:         bne     4$
        !          1143:                                 | ici pas de shift a faire
        !          1144: 8$:     movl    a1@+,a0@+
        !          1145:         dbra    d0,8$           | recopie des mantisses
        !          1146:         bra     truncf
        !          1147:                                 | ici d2.b shifts a faire
        !          1148: 4$:     moveq   #1,d6
        !          1149:         lsll    d2,d6
        !          1150:         subql   #1,d6           | masque de shift
        !          1151:         moveq   #0,d5
        !          1152: 6$:     movl    a1@+,d3         | boucle de shift
        !          1153:         roll    d2,d3
        !          1154:         movl    d3,d4
        !          1155:         andl    d6,d4
        !          1156:         subl    d4,d3
        !          1157:         addl    d5,d4
        !          1158:         movl    d4,a0@+
        !          1159:         movl    d3,d5
        !          1160:         dbra    d0,6$
        !          1161: truncf: movl    a4,d0           | d0 pointe sur resultat
        !          1162: truncg: moveml  sp@+,d2-d6/a2-a4
        !          1163:         unlk    a6
        !          1164:         rts
        !          1165:
        !          1166: #===================================================================#
        !          1167: #                                                                   #
        !          1168: #               Fausse partie entiere (par valeur)                  #
        !          1169: #                                                                   #
        !          1170: #       entree : a7@(4) pointe sur n2 de type I ou R                #
        !          1171: #                a7@(8) pointe sur n1 de type I ou R                #
        !          1172: #       sortie : la zone pointee par a7@(8) contient trunc(n2)      #
        !          1173: #       interdit : type S                                           #
        !          1174: #                                                                   #
        !          1175: #===================================================================#
        !          1176:
        !          1177: _mptruncz:movl  sp@(4),sp@-
        !          1178:         bsr     _mptrunc
        !          1179:         movl    sp@(12),sp@
        !          1180:         movl    d0,sp@-
        !          1181:         bsr     _mpaff
        !          1182:         movl    d0,a0
        !          1183:         addql   #8,sp
        !          1184:         bra     giv
        !          1185:
        !          1186: #===================================================================#
        !          1187: #                                                                   #
        !          1188: #               Partie entiere ( max { n <= x} )                    #
        !          1189: #                                                                   #
        !          1190: #       entree : a7@(4) pointe sur n1 de type I ou R                #
        !          1191: #       sortie : d0 pointe sur i1 de type I (zone creee)            #
        !          1192: #       remarque : type S interdit                                  #
        !          1193: #                                                                   #
        !          1194: #===================================================================#
        !          1195:
        !          1196: _mpent: link    a6,#0
        !          1197:         moveml  d2-d6/a2-a4,sp@-
        !          1198:         movl    a6@(8),a1       | a1 pointe sur n1
        !          1199:         cmpb    #1,a1@
        !          1200:         bne     1$
        !          1201:                                 | ici n1 est de type I
        !          1202:         movw    a1@(6),d0       | d0.w recoit le1
        !          1203:         bsr     geti
        !          1204:         movl    a0,a4           | sauvegarde adresse resultat
        !          1205:         subqw   #2,d0
        !          1206:         addql   #4,a0
        !          1207:         addql   #4,a1
        !          1208: 6$:     movl    a1@+,a0@+
        !          1209:         dbra    d0,6$
        !          1210:         bra     entf
        !          1211:                                 | ici n1 est de type R
        !          1212: 1$:     tstb    a1@(4)
        !          1213:         blt     2$
        !          1214:                                 | ici n1 >= 0 (ent(n1)=trunc(n1))
        !          1215:         movl    a6@(8),sp@-     | empilage adresse n1
        !          1216:         bsr     _mptrunc
        !          1217:         movl    d0,a4           | sauvegarde adresse resultat
        !          1218:         addql   #4,sp
        !          1219:         bra     entf
        !          1220:                                 | ici n1 < 0
        !          1221: 2$:     movl    a1@(4),d3
        !          1222:         andl    #0xffffff,d3
        !          1223:         subl    #0x800000,d3    | d3.l contient exp1
        !          1224:         bpl     3$
        !          1225:                                 | ici exp1 < 0 (ent(n1)=-1)
        !          1226:         moveq   #3,d0
        !          1227:         bsr     geti
        !          1228:         movl    a0,a4           | sauvegarde adresse resultat
        !          1229:         movl    #0xff000003,a0@(4)
        !          1230:         movl    #1,a0@(8)
        !          1231:         bra     entf
        !          1232:                                 | ici exp1 >= 0
        !          1233: 3$:     movl    _avma,a3        | ancien _avma dans var. locale
        !          1234:         movl    a6@(8),sp@-     | empilage adresse n1
        !          1235:         bsr     _mptrunc
        !          1236:         movl    d0,a4           | sauvegarde adresse res. provisoire
        !          1237:         addql   #4,sp           | depilage des parametres
        !          1238:         movl    d3,d1           | d1.l contient exp1
        !          1239:         lsrl    #5,d3           | d3.l contient exp1 div 32 = q
        !          1240:         andl    #31,d1          | d1.l contient exp1 mod 32 = r
        !          1241:         movl    a6@(8),a1
        !          1242:         lea     a1@(8,d3:l:4),a2| a2 pointe q+1eme lgmot mantisse
        !          1243:         movl    #0x80000000,d6  | d6.l contient 2^31
        !          1244:         lsrl    d1,d6           | d6.l  contient 2^(31-r)
        !          1245:         subql   #1,d6           | masque:0...01...1 avec r+1 zeros
        !          1246:         moveq   #0,d2
        !          1247:         movw    a1@(2),d2
        !          1248:         subql   #3,d2           | d2.l contient L1-1
        !          1249:         subl    d3,d2           | d2.l contient L1-1-q
        !          1250:         movl    a2@+,d5         | d5.l contient le q+1 eme lgmot
        !          1251:         andl    d6,d5
        !          1252:         beq     4$
        !          1253:         bra     5$
        !          1254: 7$:     tstl    a2@+
        !          1255: 4$:     dbne    d2,7$
        !          1256:         bne     5$
        !          1257:                                 | ici tous les lgmots sont nuls
        !          1258:         bra     entf
        !          1259:                                 | ici un au moins non nul
        !          1260: 5$:     movl    a4,sp@-         | empilage trunc(n1)
        !          1261:         movl    #0xffffffff,sp@-| empilage -1
        !          1262:         bsr     _addsi          | calcul de trunc(n1)-1
        !          1263:         addql   #8,sp           | depilage
        !          1264:         movl    a4,a1           | a1 pointe sur trunc(n1)
        !          1265:         movl    a3,a4           | a4 contient _avma ancien
        !          1266:         movl    d0,a0           | a0 pointe sur resultat (res)
        !          1267:         movw    a0@(2),d0       | d0.w contient l(res)
        !          1268:         subqw   #1,d0           | d0.w contient l-1
        !          1269: 8$:     movl    a1@-,a4@-
        !          1270:         dbra    d0,8$           | transfert du resultat ds pile PARI
        !          1271:         movl    a4,_avma        | mise a jour pile PARI
        !          1272: entf:   movl    a4,d0           | d0 pointe sur resultat
        !          1273:         moveml  sp@+,d2-d6/a2-a4
        !          1274:         unlk    a6
        !          1275:         rts
        !          1276:
        !          1277: #===================================================================#
        !          1278: #                                                                   #
        !          1279: #                       Partie entiere (par valeur)                 #
        !          1280: #                                                                   #
        !          1281: #       entree : a7@(4) pointe sur n2 de type I ou R                #
        !          1282: #                a7@(8) pointe sur n1 de type I ou R                #
        !          1283: #       sortie : la zone pointee par a7@(8) contient ent(n2)        #
        !          1284: #       interdit : type S                                           #
        !          1285: #                                                                   #
        !          1286: #===================================================================#
        !          1287:
        !          1288: _mpentz:movl    sp@(4),sp@-
        !          1289:         bsr     _mpent
        !          1290:         movl    sp@(12),sp@
        !          1291:         movl    d0,sp@-
        !          1292:         bsr     _mpaff
        !          1293:         movl    d0,a0
        !          1294:         addql   #8,sp
        !          1295:         bra     giv
        !          1296:
        !          1297:
        !          1298:
        !          1299:
        !          1300:
        !          1301: #*******************************************************************#
        !          1302: #*******************************************************************#
        !          1303: #**                                                               **#
        !          1304: #**             PROGRAMMES DE COMPARAISON                         **#
        !          1305: #**                                                               **#
        !          1306: #*******************************************************************#
        !          1307: #*******************************************************************#
        !          1308:
        !          1309:
        !          1310:
        !          1311:
        !          1312:
        !          1313: #===================================================================#
        !          1314: #                                                                   #
        !          1315: #                       Comparaison generale                        #
        !          1316: #                                                                   #
        !          1317: #       entree : a7@(4) pointe sur n2 de type I ou R                #
        !          1318: #                a7@(8) pointe sur n1 de type I ou R                #
        !          1319: #       sortie : d0.l contient -1 si n2<n1,0 si n2=n1,1 sinon.      #
        !          1320: #                d1,a0,a1 sont sauvegardes                          #
        !          1321: #       interdit : type S                                           #
        !          1322: #                                                                   #
        !          1323: #===================================================================#
        !          1324:
        !          1325: _mpcmp: link    a6,#0
        !          1326:         moveml  d1-d2/a1-a2,sp@-
        !          1327:         movl    a6@(8),a2
        !          1328:         movl    a6@(12),a1      | a1 et a2 pointent sur n1 et n2
        !          1329:         moveq   #0,d1
        !          1330:         movb    a2@,d2          | d2.b contient T2
        !          1331:         cmpb    a1@,d2
        !          1332:         ble     1$
        !          1333:                                 | ici T2 > T1
        !          1334:         exg     a1,a2
        !          1335:         moveq   #1,d1
        !          1336:                                 | ici T2 <= T1
        !          1337: 1$:     movl    a1,sp@-
        !          1338:         movl    a2,sp@-
        !          1339:         cmpb    #1,a1@
        !          1340:         bne     2$
        !          1341:                                 | ici T1 = T2 = I
        !          1342:         bsr     _cmpii
        !          1343:         bra     cmpf
        !          1344:                                 | ici T1 = R
        !          1345: 2$:     cmpb    #1,a2@
        !          1346:         bne     3$
        !          1347:                                 | ici T1 = R et T2 = I
        !          1348:         bsr     _cmpir
        !          1349:         bra     cmpf
        !          1350:                                 | ici T1 = T2 = R
        !          1351: 3$:     bsr     _cmprr
        !          1352: cmpf:   addql   #8,sp
        !          1353:         tstb    d1
        !          1354:         beq     1$
        !          1355:         negl    d0
        !          1356: 1$:     moveml  sp@+,d1-d2/a1-a2
        !          1357:         unlk    a6
        !          1358:         rts
        !          1359:
        !          1360: #===================================================================#
        !          1361: #                                                                   #
        !          1362: #               Comparaison : entier court et entier                #
        !          1363: #                                                                   #
        !          1364: #       entree : a7@(4) contient s2 de type S                       #
        !          1365: #                a7@(8) pointe sur i1 de type I                     #
        !          1366: #       sortie : d0.l contient 1 si s2>i1,0 si s2=i1,-1 sinon       #
        !          1367: #                d1,a0,a1 sont sauvegardes                          #
        !          1368: #                                                                   #
        !          1369: #===================================================================#
        !          1370:
        !          1371: _cmpsi: link    a6,#0
        !          1372:         moveml  d1-d4/a1,sp@-
        !          1373:         movl    a6@(12),a1      | a1 pointe sur i1
        !          1374:         movb    a1@(4),d1       | d1.b contient signe de i1 (si1)
        !          1375:         movb    d1,d4           | d4.b contient si1
        !          1376:         movb    #1,d3
        !          1377:         movl    a6@(8),d2       | d2.l contient s2
        !          1378:         bgt     1$              | si s2 > 0
        !          1379:                                 | ici s2 <= 0
        !          1380:         bne     2$              | si s2 < 0
        !          1381:                                 | ici s2 = 0
        !          1382:         movb    #0,d3
        !          1383:         bra     1$
        !          1384:                                 | ici s2 < 0
        !          1385: 2$:     movb    #-1,d3          | d3.b contient signe de s2 (ss2)
        !          1386: 1$:     eorb    d3,d4           | d4.b contient :
        !          1387:                                 | 0 si les deux nuls ou >0 ou <0
        !          1388:                                 | >0 si un nul l'autre >0
        !          1389:                                 | <0 si un nul autre<0,un<0 autre>0
        !          1390:         bpl     3$
        !          1391:                                 | ici d4.b < 0
        !          1392:         moveq   #1,d0
        !          1393:         tstb    d3
        !          1394:         bpl     4$
        !          1395:                                 | ici s2<0 et i1>0
        !          1396:         moveq   #-1,d0
        !          1397: 4$:     bra     cmpsif
        !          1398:                                 | ici d4.b >=0
        !          1399: 3$:     cmpw    #3,a1@(6)
        !          1400:         ble     5$
        !          1401:                                 | ici L1 >= 2
        !          1402: 8$:     moveq   #-1,d0
        !          1403:         tstb    d1
        !          1404:         bpl     6$
        !          1405:         negl    d0
        !          1406: 6$:     bra     cmpsif
        !          1407:                                 | ici L1 <= 1
        !          1408: 5$:     cmpw    #2,a1@(6)
        !          1409:         beq     7$
        !          1410:                                 | ici L1 = 1
        !          1411:         tstl    d2
        !          1412:         bpl     9$
        !          1413:         negl    d2
        !          1414: 9$:     moveq   #1,d0
        !          1415:         cmpl    a1@(8),d2
        !          1416:         bhi     10$
        !          1417:         bne     11$
        !          1418:         moveq   #0,d0
        !          1419:         bra     cmpsif
        !          1420: 11$:    moveq   #-1,d0
        !          1421: 10$:    tstb    d1
        !          1422:         bpl     cmpsif
        !          1423:         negl    d0
        !          1424:         bra     cmpsif
        !          1425: 7$:     moveq   #1,d0
        !          1426:         tstb    d3
        !          1427:         bne     cmpsif
        !          1428:         moveq   #0,d0
        !          1429: cmpsif: moveml  sp@+,d1-d4/a1
        !          1430:         unlk    a6
        !          1431:         rts
        !          1432:
        !          1433: #===================================================================#
        !          1434: #                                                                   #
        !          1435: #               Comparaison : entier court et reel                  #
        !          1436: #                                                                   #
        !          1437: #       entree : a7@(4) contient s2 de type S                       #
        !          1438: #                a7@(8) pointe sur r1 de type R                     #
        !          1439: #       sortie : d0.l contient 1 si s2>r1, 0 si s2=r1, -1 sinon     #
        !          1440: #                d1,a0,a1 sont sauvegardes                          #
        !          1441: #                                                                   #
        !          1442: #===================================================================#
        !          1443:
        !          1444: _cmpsr: link    a6,#0
        !          1445:         moveml  d1-d4/a0-a2,sp@-
        !          1446:         movl    a6@(12),a1      | a1 pointe sur r1
        !          1447:         movb    a1@(4),d1       | d1.b contient sr1 (signe de r1)
        !          1448:         movb    d1,d4           | d4.b aussi
        !          1449:         movb    #1,d3
        !          1450:         movl    a6@(8),d2       | d2.l contient s2
        !          1451:         bgt     1$
        !          1452:         bne     2$
        !          1453:         movb    #0,d3
        !          1454:         bra     1$
        !          1455: 2$:     movb    #-1,d3          | d3.b contient ss2 (signe de s2)
        !          1456: 1$:     eorb    d3,d4           | d4.b contient 'signe'
        !          1457:         bpl     3$
        !          1458:                                 | ici d4.b < 0
        !          1459:         moveq   #1,d0
        !          1460:         tstb    d3
        !          1461:         bpl     4$
        !          1462:         moveq   #-1,d0
        !          1463: 4$:     bra     cmpsrf
        !          1464:                                 | ici d4.b >= 0
        !          1465: 3$:     tstb    d1
        !          1466:         bne     5$
        !          1467:                                 | ici r1 = 0
        !          1468:         moveq   #1,d0
        !          1469:         tstb    d3
        !          1470:         bne     6$
        !          1471:                                 | ici s2 = r1 = 0
        !          1472:         moveq   #0,d0
        !          1473: 6$:     bra     cmpsrf
        !          1474:                                 | ici r1 <> 0
        !          1475: 5$:     movw    a1@(2),d0
        !          1476:         bsr     getr            | pour copie reelle de s2
        !          1477:         movl    a0,a2   | sauvegarde adresse copie
        !          1478:         movl    a0,sp@-         | empilage adresse copie
        !          1479:         movl    d2,sp@-         | empilage s2
        !          1480:         bsr     _affsr
        !          1481:         addql   #8,sp           | depilage
        !          1482:         movl    a1,sp@-         | empilage adresse r1
        !          1483:         movl    a0,sp@-         | empilage adresse copie
        !          1484:         bsr     _cmprr
        !          1485:         addql   #8,sp
        !          1486:         movl    a2,a0
        !          1487:         bsr     giv
        !          1488: cmpsrf: moveml  sp@+,d1-d4/a0-a2
        !          1489:         unlk    a6
        !          1490:         rts
        !          1491:
        !          1492: #===================================================================#
        !          1493: #                                                                   #
        !          1494: #               Comparaison : entier et entier court                #
        !          1495: #                                                                   #
        !          1496: #       entree : a7@(4) pointe sur i2 de type I                     #
        !          1497: #                a7@(8) contient s1                                 #
        !          1498: #       sortie : d0.l contient le signe de i2 - s1                  #
        !          1499: #                aucun autre registre n'est affecte                 #
        !          1500: #                                                                   #
        !          1501: #===================================================================#
        !          1502:
        !          1503: _cmpis: movl    sp@(4),sp@-
        !          1504:         movl    sp@(12),sp@-
        !          1505:         bsr     _cmpsi
        !          1506:         addql   #8,sp
        !          1507:         negl    d0
        !          1508:         rts
        !          1509:
        !          1510: #===================================================================#
        !          1511: #                                                                   #
        !          1512: #               Comparaison : entier et entier                      #
        !          1513: #                                                                   #
        !          1514: #       entree : a7@(4) pointe sur i2 de type I                     #
        !          1515: #                a7@(8) pointe sur i1 de type I                     #
        !          1516: #       sortie : d0.l contient :1 si i2>i1,0 si i2=i1,-1 sinon      #
        !          1517: #                d1,a0,a1 sont sauvegardes                          #
        !          1518: #                                                                   #
        !          1519: #===================================================================#
        !          1520:
        !          1521: _cmpii: link    a6,#0
        !          1522:         moveml  d1-d4/a1-a2,sp@-
        !          1523:         movl    a6@(8),a2
        !          1524:         movl    a6@(12),a1      | a1, a2 pointent sur i1, i2
        !          1525:         movb    a1@(4),d1       | d1.b contient si1
        !          1526:         movb    d1,d4
        !          1527:         movb    a2@(4),d2       | d2.b contient si2
        !          1528:         eorb    d2,d4
        !          1529:         bpl     1$
        !          1530:                                 | ici d4.b < 0
        !          1531:         moveq   #1,d0
        !          1532:         tstb    d2
        !          1533:         bpl     cmpiif
        !          1534:         moveq   #-1,d0
        !          1535:         bra     cmpiif
        !          1536:                                 | ici d4.b >= 0
        !          1537: 1$:     movw    a1@(6),d1
        !          1538:         movw    a2@(6),d2       | d1.w et d2.w contiennent le1 et le2
        !          1539:         cmpw    d1,d2
        !          1540:         blt     3$
        !          1541:         beq     4$
        !          1542:                                 | ici le2 > le1
        !          1543: 6$:     moveq   #1,d0
        !          1544:         tstb    a1@(4)
        !          1545:         bpl     cmpiif
        !          1546:         moveq   #-1,d0
        !          1547:         bra     cmpiif
        !          1548:                                 | ici le2 < le1
        !          1549: 3$:     moveq   #-1,d0
        !          1550:         tstb    a2@(4)
        !          1551:         bpl     cmpiif
        !          1552:         moveq   #1,d0
        !          1553:         bra     cmpiif
        !          1554:                                 | ici le2 = le1
        !          1555: 4$:     cmpw    #2,d1
        !          1556:         bne     7$
        !          1557:         moveq   #0,d0
        !          1558:         bra     cmpiif
        !          1559:                                 | ici i1 et i2 <> 0
        !          1560: 7$:     movb    a1@(4),d3
        !          1561:         addql   #8,a1
        !          1562:         addql   #8,a2
        !          1563:         subqw   #3,d1
        !          1564: 11$:    cmpml   a1@+,a2@+
        !          1565:         dbne    d1,11$
        !          1566:         bhi     8$
        !          1567:         beq     9$
        !          1568:         moveq   #-1,d0
        !          1569:         bra     10$
        !          1570: 9$:     moveq   #0,d0
        !          1571:         bra     cmpiif
        !          1572: 8$:     moveq   #1,d0
        !          1573: 10$:    tstb    d3
        !          1574:         bpl     cmpiif
        !          1575:         negl    d0
        !          1576: cmpiif: moveml  sp@+,d1-d4/a1-a2
        !          1577:         unlk    a6
        !          1578:         rts
        !          1579:
        !          1580: #===================================================================#
        !          1581: #                                                                   #
        !          1582: #               Comparaison : entier et reel                        #
        !          1583: #                                                                   #
        !          1584: #       entree : a7@(4) pointe sur i2 de type R                     #
        !          1585: #                a7@(8) pointe sur r1 de type R                     #
        !          1586: #       sortie : d0.l contient :1 si i2>r1,0 si i2=r1,-1 sinon      #
        !          1587: #                d1,a0,a1 sont sauvegardes                          #
        !          1588: #                                                                   #
        !          1589: #===================================================================#
        !          1590:
        !          1591: _cmpir: link    a6,#0
        !          1592:         moveml  d1-d4/a0-a3,sp@-
        !          1593:         movl    a6@(8),a2
        !          1594:         movl    a6@(12),a1      | a1 et a2 pointent sur r1 et i2
        !          1595:         movb    a1@(4),d1
        !          1596:         movb    d1,d4
        !          1597:         movb    a2@(4),d2
        !          1598:         eorb    d2,d4
        !          1599:         bpl     1$
        !          1600:         moveq   #1,d0
        !          1601:         tstb    d2
        !          1602:         bpl     2$
        !          1603:         moveq   #-1,d0
        !          1604: 2$:     bra     cmpirf
        !          1605:                                 | ici d4.b >= 0
        !          1606: 1$:     tstb    d1
        !          1607:         bne     3$
        !          1608:         moveq   #1,d0
        !          1609:         tstb    d2
        !          1610:         bne     4$
        !          1611:         moveq   #0,d0
        !          1612: 4$:     bra     cmpirf
        !          1613:                                 | ici faire copie de i2 en type R
        !          1614: 3$:     movw    a1@(2),d0       | allouer memoire pour copie de i2
        !          1615:         bsr     getr
        !          1616:         movl    a0,a3
        !          1617:         movl    a0,sp@-         | empiler adresse copie
        !          1618:         movl    a2,sp@-         | empiler adresse i2
        !          1619:         bsr     _affir
        !          1620:         addql   #8,sp           | depiler
        !          1621:         movl    a1,sp@-         | empiler adresse r1
        !          1622:         movl    a0,sp@-         | empiler adresse copie
        !          1623:         bsr     _cmprr
        !          1624:         addql   #8,sp           | depiler
        !          1625:         movl    a3,a0
        !          1626:         bsr     giv             | rendre copie
        !          1627: cmpirf: moveml  sp@+,d1-d4/a0-a3
        !          1628:         unlk    a6
        !          1629:         rts
        !          1630:
        !          1631: #===================================================================#
        !          1632: #                                                                   #
        !          1633: #               Comparaison : reel et entier court                  #
        !          1634: #                                                                   #
        !          1635: #       entree : a7@(4) pointe sur r2 de type R                     #
        !          1636: #                a7@(8) contient s1                                 #
        !          1637: #       sortie : d0.l contient le signe de r2 - s1                  #
        !          1638: #                aucun autre registre n'est affecte                 #
        !          1639: #                                                                   #
        !          1640: #===================================================================#
        !          1641:
        !          1642: _cmprs: movl    sp@(4),sp@-
        !          1643:         movl    sp@(12),sp@-
        !          1644:         bsr     _cmpsr
        !          1645:         addql   #8,sp
        !          1646:         negl    d0
        !          1647:         rts
        !          1648:
        !          1649: #===================================================================#
        !          1650: #                                                                   #
        !          1651: #               Comparaison : reel et entier                        #
        !          1652: #                                                                   #
        !          1653: #       entree : a7@(4) pointe sur r2 de type R                     #
        !          1654: #                a7@(8) contient i1                                 #
        !          1655: #       sortie : d0.l contient le signe de r2 - i1                  #
        !          1656: #                aucun autre registre n'est affecte                 #
        !          1657: #                                                                   #
        !          1658: #===================================================================#
        !          1659:
        !          1660: _cmpri: movl    sp@(4),sp@-
        !          1661:         movl    sp@(12),sp@-
        !          1662:         bsr     _cmpir
        !          1663:         addql   #8,sp
        !          1664:         negl    d0
        !          1665:         rts
        !          1666:
        !          1667: #===================================================================#
        !          1668: #                                                                   #
        !          1669: #               Comparaison : reel et reel                          #
        !          1670: #                                                                   #
        !          1671: #       entree : a7@(4) pointe sur r2 de type R                     #
        !          1672: #                a7@(8) pointe sur r1 de type R                     #
        !          1673: #       sortie : d0.l contient :1 si r2>r1,0 si r2=r1,-1 sinon      #
        !          1674: #                d1,a0,a1 sont sauvegardes                          #
        !          1675: #                                                                   #
        !          1676: #===================================================================#
        !          1677:
        !          1678: _cmprr: link    a6,#0
        !          1679:         moveml  d1-d5/a1-a2,sp@-
        !          1680:         movl    a6@(8),a2
        !          1681:         movl    a6@(12),a1      | a1 et a2 pointent sur r1 et r2
        !          1682:         movb    a1@(4),d1
        !          1683:         movb    d1,d4
        !          1684:         movb    a2@(4),d2
        !          1685:         eorb    d2,d4
        !          1686:         bpl     1$
        !          1687:                                 | ici d4.b < 0
        !          1688:         moveq   #1,d0
        !          1689:         tstb    d2
        !          1690:         bpl     2$
        !          1691:         moveq   #-1,d0
        !          1692: 2$:     bra     cmprrf
        !          1693:                                 | ici d4.b >= 0
        !          1694: 1$:     tstb    d1
        !          1695:         bne     3$
        !          1696:         moveq   #1,d0
        !          1697:         tstb    d2
        !          1698:         bne     4$
        !          1699:         moveq   #0,d0
        !          1700: 4$:     bra     cmprrf
        !          1701: 3$:     tstb    a2@(4)
        !          1702:         bne     5$
        !          1703:         moveq   #-1,d0
        !          1704:         bra     cmprrf
        !          1705:                                 | ici r2 <> 0
        !          1706: 5$:     moveq   #1,d0
        !          1707:         movw    a1@(2),d1
        !          1708:         movw    a2@(2),d2
        !          1709:         cmpw    d1,d2
        !          1710:         bpl     6$
        !          1711:         exg     d1,d2
        !          1712:         exg     a1,a2
        !          1713:         moveq   #-1,d0
        !          1714: 6$:     tstb    a2@(4)
        !          1715:         bpl     7$
        !          1716:         negl    d0
        !          1717: 7$:     movl    a1@(4),d5
        !          1718:         andl    #0xffffff,d5
        !          1719:         movl    a2@(4),d3
        !          1720:         andl    #0xffffff,d3
        !          1721:         cmpl    d5,d3
        !          1722:         bpl     8$
        !          1723: 10$:    negl    d0
        !          1724:         bra     cmprrf
        !          1725: 8$:     bne     cmprrf
        !          1726:         subw    d1,d2
        !          1727:         subqw   #3,d1
        !          1728:         addql   #8,a1
        !          1729:         addql   #8,a2
        !          1730: 9$:     cmpml   a1@+,a2@+
        !          1731:         dbne    d1,9$
        !          1732:         bcs     10$
        !          1733:         beq     11$
        !          1734:         bra     cmprrf
        !          1735: 12$:    tstl    a2@+
        !          1736: 11$:    dbne    d2,12$
        !          1737:         bne     cmprrf
        !          1738:         moveq   #0,d0
        !          1739: cmprrf: moveml  sp@+,d1-d5/a1-a2
        !          1740:         unlk    a6
        !          1741:         rts
        !          1742:
        !          1743:
        !          1744:
        !          1745:
        !          1746:
        !          1747: #*******************************************************************#
        !          1748: #*******************************************************************#
        !          1749: #**                                                               **#
        !          1750: #**                     PROGRAMMES D'ADDITION                     **#
        !          1751: #**                                                               **#
        !          1752: #*******************************************************************#
        !          1753: #*******************************************************************#
        !          1754:
        !          1755:
        !          1756:
        !          1757:
        !          1758:
        !          1759: #===================================================================#
        !          1760: #                                                                   #
        !          1761: #                       Addition generale                           #
        !          1762: #                                                                   #
        !          1763: #       entree : a7@(4) pointe sur n2 de type I ou R                #
        !          1764: #                a7@(8) pointe sur n1 de type I ou R                #
        !          1765: #       sortie : d0 pointe sur n2 + n1 de type I ou R (zone creee)  #
        !          1766: #       interdit : type S                                           #
        !          1767: #       precision : voir les formules des routines specalisees      #
        !          1768: #                                                                   #
        !          1769: #===================================================================#
        !          1770:
        !          1771: _mpadd: movl    sp@(4),a0
        !          1772:         movl    sp@(8),a1       | a1 et a0 pointent sur n1 et n2
        !          1773:         movb    a0@,d0
        !          1774:         movb    a1@,d1          | d1.b et d0.b contiennent T1 et T2
        !          1775:         cmpb    d1,d0
        !          1776:         ble     1$
        !          1777:                                 | ici T2 > T1
        !          1778:         exg     a1,a0
        !          1779:         exg     d1,d0
        !          1780:         movl    a0,sp@(4)
        !          1781:         movl    a1,sp@(8)
        !          1782:                                 | ici T2 <= T1
        !          1783: 1$:     cmpb    #1,d1
        !          1784:         beq     _addii          | ici T1 = T2 = I
        !          1785: 2$:     cmpb    #2,d0
        !          1786:         beq     _addrr          | ici T1 = T2 = R
        !          1787:         bra     _addir
        !          1788:
        !          1789: #===================================================================#
        !          1790: #                                                                   #
        !          1791: #                       Addition (par valeur)                       #
        !          1792: #                                                                   #
        !          1793: #       entree : a7@(4) pointe sur n2 de type I ou R                #
        !          1794: #                a7@(8) pointe sur n1 de type I ou R                #
        !          1795: #                a7@(12) pointe sur n3 de type I ou R               #
        !          1796: #       sortie : la zone pointee par a7@(12) contient n2+n1         #
        !          1797: #       interdit : type S                                           #
        !          1798: #                                                                   #
        !          1799: #===================================================================#
        !          1800:
        !          1801: _mpaddz:lea     _mpadd,a0
        !          1802:         bra     mpopz
        !          1803:
        !          1804:                                 | addition S+S=I ou R
        !          1805:
        !          1806: _addssz:lea     _addss,a0
        !          1807:         bra     mpopz
        !          1808:
        !          1809:                                 | addition S+I=I ou R
        !          1810:
        !          1811: _addsiz:lea     _addsi,a0
        !          1812:         bra     mpopz
        !          1813:
        !          1814:                                 | addition S+R=R sinon erreur
        !          1815:
        !          1816: _addsrz:lea     _addsr,a0
        !          1817:         bra     mpopz
        !          1818:
        !          1819:                                 | addition I+I=I ou R
        !          1820:
        !          1821: _addiiz:lea     _addii,a0
        !          1822:         bra     mpopz
        !          1823:
        !          1824:                                 | addition I+R=R sinon erreur
        !          1825:
        !          1826: _addirz:lea     _addir,a0
        !          1827:         bra     mpopz
        !          1828:
        !          1829:                                 | addition R+R=R sinon erreur
        !          1830:
        !          1831: _addrrz:lea     _addrr,a0
        !          1832:         bra     mpopz
        !          1833:
        !          1834: #===================================================================#
        !          1835: #                                                                   #
        !          1836: #    Addition : entier court + entier court = entier                #
        !          1837: #                                                                   #
        !          1838: #       entree : a7@(4) contient s2 de type S                       #
        !          1839: #                a7@(8) contient s1 de type S                       #
        !          1840: #       sortie : d0 pointe sur s1+s2 de type I(zone cree)           #
        !          1841: #       remarque : s1 + s2 = s0 est interdit                        #
        !          1842: #                                                                   #
        !          1843: #===================================================================#
        !          1844:
        !          1845: _addss: link    a6,#-2
        !          1846:         movl    d2,sp@-
        !          1847:         movl    a6@(8),d1
        !          1848:         movl    a6@(12),d2
        !          1849:         addl    d2,d1           | d1.l contient s2 + s1
        !          1850:         bne     1$
        !          1851:                                 | ici d1.l=0
        !          1852:         bvs     2$
        !          1853:                                 | ici s1+s2=0
        !          1854:        movl    _gzero,d0
        !          1855:         bra     addssg
        !          1856:                                 | ici s1+s2=-2^32 (s1=s2=-2^31)
        !          1857: 2$:     movw    #4,d0
        !          1858:         bsr     geti
        !          1859:         movl    #0xff000004,a0@(4)
        !          1860:         movl    #1,a0@(8)
        !          1861:         clrl    a0@(12)
        !          1862:         bra     addssf
        !          1863:                                 | ici d1.l<>0
        !          1864: 1$:     movw    #3,d0
        !          1865:         bsr     geti
        !          1866:         movl    #0x1000003,a0@(4)
        !          1867:         addl    a6@(8),d2       | repositionne les indicateurs
        !          1868:         bvs     3$
        !          1869:                                 | ici pas d'overflow
        !          1870:         bmi     4$              | d1 donne bien le signe du resultat
        !          1871:         bra     5$
        !          1872:                                 | ici overflow
        !          1873: 3$:     bcc     5$              | le carry donne le signe du resultat
        !          1874: 4$:     negl    d1
        !          1875:         movb    #0xff,a0@(4)
        !          1876: 5$:     movl    d1,a0@(8)
        !          1877: addssf: movl    a0,d0           | d0 pointe sur resultat
        !          1878: addssg: movl    sp@,d2
        !          1879:         unlk    a6
        !          1880:         rts
        !          1881:
        !          1882: #===================================================================#
        !          1883: #                                                                   #
        !          1884: #               Addition : entier court + entier = entier           #
        !          1885: #                                                                   #
        !          1886: #       entree : a7@(4) contient s2 de type S                       #
        !          1887: #                a7@(8) pointe sur i1 de type I                     #
        !          1888: #       sortie : d0 pointe sur s2 + i1 de type I (zone creee)       #
        !          1889: #                                                                   #
        !          1890: #===================================================================#
        !          1891:
        !          1892: _addsi: link    a6,#0
        !          1893:         moveml  d2-d4/a2,sp@-
        !          1894:         movl    a6@(12),a1      | a1 pointe sur i1
        !          1895:         movl    a6@(8),d2       | d2.l contient s2
        !          1896:         bne     1$              | si s2 <> 0
        !          1897:                                 | ici s2 = 0 (i1 + s2 = i1)
        !          1898:         movw    a1@(6),d0
        !          1899:         bsr     geti            | allocation memoire pour resultat
        !          1900:         movl    a0,d4
        !          1901:         subqw   #2,d0           | compteur de boucle pour recopie de i1
        !          1902:         addql   #4,a0
        !          1903:         addql   #4,a1
        !          1904: 2$:     movl    a1@+,a0@+       | recopie de i1
        !          1905:         dbra    d0,2$
        !          1906:         bra     addsif
        !          1907:                                 | ici s2 <> 0
        !          1908: 1$:     tstb    a1@(4)
        !          1909:         bne     3$              | si i1 <> 0
        !          1910:                                 | ici i1 = 0 (i1 + s2 = s2)
        !          1911:         moveq   #3,d0
        !          1912:         bsr     geti            | allocation memoire pour resultat
        !          1913:         movl    a0,d4
        !          1914:         movl    #0x1000003,a0@(4)
        !          1915:         movl    d2,a0@(8)
        !          1916:
        !          1917:         bpl     addsif
        !          1918:                                 | ici s2 < 0
        !          1919:         movb    #0xff,a0@(4)
        !          1920:         negl    a0@(8)
        !          1921:         bra     addsif
        !          1922:                                 | ici s2 et i1 <> 0
        !          1923: 3$:     movw    a1@(6),d0       | d0.w contient le1
        !          1924:         bsr     geti
        !          1925:         movl    a0,d4
        !          1926:         movw    a1@(4),d1
        !          1927:         extl    d1              | d1.l contient signe de i1
        !          1928:         lea     a0@(0,d0:w:4),a0
        !          1929:         lea     a1@(0,d0:w:4),a2| a0 pointe fin du resultat;a2 fin de i1
        !          1930:         moveq   #0,d3
        !          1931:         subqw   #3,d0           | d0.w compteur boucle addition
        !          1932:         eorl    d2,d1           | comparaison signes i1 et s2
        !          1933:         bmi     susi            | si i1 * s2 < 0
        !          1934:                                 | ici i1 * s2 > 0
        !          1935:         tstl    d2
        !          1936:         bpl     51$             | valeur absolue de s2
        !          1937:         negl    d2
        !          1938: 51$:    addl    a2@-,d2
        !          1939:         bra     4$              | boucle d'addition
        !          1940: 5$:     movl    d2,a0@-
        !          1941:         movl    a2@-,d2
        !          1942:         addxl   d3,d2
        !          1943: 4$:     dbra    d0,5$
        !          1944:         bcc     6$              | ici retenue finale
        !          1945:         movl    d2,a0@-         | mise a jour dernier long mot
        !          1946:         moveq   #1,d0
        !          1947:         bsr     geti            | allocation un long mot supplementaire
        !          1948:         movl    a0,d4
        !          1949:         movl    a0@(4),a0@
        !          1950:         addqw   #1,a0@(2)       | mise a jour premier long mot code
        !          1951:         cmpw    #0x7fff,a0@(2)
        !          1952:         bls     7$
        !          1953:                                 | ici debordement
        !          1954:         movl    #adder1,sp@-
        !          1955:         jsr     _pari_err
        !          1956: 7$:     movw    a0@(2),a0@(6)   | mise longueur effective
        !          1957:        movw    a1@(4),a0@(4)   | signe du resultat
        !          1958:         movl    #1,a0@(8)       | mise a jour retenue finale
        !          1959:         bra     8$
        !          1960:                                 | ici pas de retenue finale
        !          1961: 6$:     movl    d2,a0@-         | mise a jour dernier long mot
        !          1962:         subqw   #8,a0
        !          1963:         movw    a0@(2),a0@(6)   | longueur effective
        !          1964:        movw    a1@(4),a0@(4)   | signe du resultat
        !          1965: 8$:     movl    a0,d4
        !          1966: addsif: movl    d4,d0           | d0 pointe sur resultat
        !          1967:         moveml  sp@+,d2-d4/a2
        !          1968:         unlk    a6
        !          1969:         rts
        !          1970:                                 | ici i1 * s2 < 0 : soustraction
        !          1971: susi:   movl    d2,d1           | d1.l recoit s2
        !          1972:         bpl     6$
        !          1973:         negl    d1              | d1.l recoit |s2|
        !          1974: 6$:     movl    a2@-,d2
        !          1975:         subl    d1,d2           | amorcage de la soustraction
        !          1976:         bra     1$
        !          1977:                                 | boucle de soustraction
        !          1978: 2$:     movl    d2,a0@-
        !          1979:         movl    a2@-,d2
        !          1980:         subxl   d3,d2
        !          1981: 1$:     dbra    d0,2$
        !          1982:         bcc     3$
        !          1983:                                 | ici retenue finale:longueur resultat=3
        !          1984:         negl    d2
        !          1985:         movl    d2,a0@-
        !          1986:         subql   #8,a0           | a0 pointe sur resultat
        !          1987:         movw    #3,a0@(6)       | mise a jour longueur effective
        !          1988:         movb    a1@(4),d2
        !          1989:         negb    d2
        !          1990:         movb    d2,a0@(4)       | mise a jour signe (-|i1|)
        !          1991:         bra     addsif
        !          1992:                                 | ici pas de retenue finale
        !          1993: 3$:     tstl    d2
        !          1994:         beq     4$
        !          1995:                                 | ici d2 <> 0
        !          1996:         movl    d2,a0@-
        !          1997:         movl    a1@(4),a0@-     | mise a jour second long mot code
        !          1998:         bra     addsif
        !          1999:                                 | ici d2 = 0
        !          2000: 4$:     movl    a1@(4),a0@-
        !          2001:         subqw   #1,a0@(2)
        !          2002:         cmpw    #2,a0@(2)
        !          2003:         bne     5$
        !          2004:                                 | ici L1 = 1 ; le resultat est 0
        !          2005:         clrb    a0@
        !          2006: 5$:     movl    a0@(-8),a0@-
        !          2007:         subqw   #1,a0@(2)
        !          2008:         movl    a0,d4
        !          2009:         addql   #4,_avma                | mise a jour pile PARI
        !          2010:         bra     addsif
        !          2011:
        !          2012: #===================================================================#
        !          2013: #                                                                   #
        !          2014: #               Addition : entier + entier = entier                 #
        !          2015: #                                                                   #
        !          2016: #       entree : a7@(4) pointe sur i2 de type I                     #
        !          2017: #                a7@(8) pointe sur i1 de type I                     #
        !          2018: #       sortie : d0 pointe sur i2 + i1 de type I (zone creee)       #
        !          2019: #                                                                   #
        !          2020: #===================================================================#
        !          2021:
        !          2022: _addii: link    a6,#0
        !          2023:         moveml  d2-d7/a2-a4,sp@-
        !          2024:         movl    a6@(8),a2       | a2 pointe sur i2
        !          2025:         movl    a6@(12),a1      | a1 pointe sur i1
        !          2026:         moveq   #0,d2
        !          2027:         moveq   #0,d1
        !          2028:         movw    a2@(6),d2
        !          2029:         movw    a1@(6),d1       | d1.w recoit le1 et d2.w recoit le2
        !          2030:         cmpw    d1,d2
        !          2031:         bcc     1$
        !          2032:         exg     a1,a2
        !          2033:         exg     d1,d2           | si L2 < L1 ,echanger a1,a2 et d1,d2
        !          2034:                                 | ici L2 >= L1
        !          2035: 1$:     tstb    a1@(4)
        !          2036:         bne     2$              | ici i1 = 0 : i1 + i2 = i2
        !          2037:         movw    a2@(6),d0
        !          2038:         bsr     geti            | allocation memoire pour recopie de i2
        !          2039:         subqw   #2,d0           | compteur de recopie
        !          2040:         movl    a0,a1
        !          2041:         addql   #4,a1
        !          2042:         addql   #4,a2
        !          2043:                                 | boucle de recopie
        !          2044: 3$:     movl    a2@+,a1@+
        !          2045:         dbra    d0,3$
        !          2046:         bra     addiif
        !          2047:                                 | ici i1 <> 0 ( donc i2 <> 0)
        !          2048: 2$:     movb    a1@(4),d3
        !          2049:         movb    a2@(4),d4
        !          2050:         eorb    d4,d3           | d3 contient signe de i2 * i1
        !          2051:         bmi     suii
        !          2052:                                 | ici i2 * i1 > 0
        !          2053:         movw    d2,d0
        !          2054:         bsr     geti            | allocation memoire le2 longs mots
        !          2055:         lea     a0@(0,d0:w:4),a0| a0 pointe fin du resultat
        !          2056:         lea     a2@(0,d0:w:4),a2| a2 pointe fin de i2
        !          2057:         lea     a1@(0,d1:w:4),a1| a1 pointe fin de i1
        !          2058:         subw    d1,d2           | d2.w contient L2-L1
        !          2059:         subqw   #3,d1           | d1.w contient L1-1 (compteur)
        !          2060:         moveq   #0,d4
        !          2061:                                 | ici premiere boucle d'addition
        !          2062: 4$:     movl    a1@-,d0
        !          2063:         movl    a2@-,d5
        !          2064:         addxl   d5,d0
        !          2065:         movl    d0,a0@-
        !          2066:         dbra    d1,4$
        !          2067:         roxrw   d4,d0           | mise a jour dernier long mot
        !          2068:         bra     5$
        !          2069:                                 | ici deuxieme boucle:propagation carry
        !          2070: 6$:     movl    a2@-,d0
        !          2071:         addxl   d4,d0
        !          2072:         movl    d0,a0@-
        !          2073:         roxrw   d4,d0
        !          2074: 5$:     dbcc    d2,6$
        !          2075:         bcs     7$              | si carry jusqu'a la fin
        !          2076:                                 | ici pas de carry
        !          2077:         bra     8$
        !          2078:                                 | ici troisieme boucle:recopie mantisse
        !          2079: 9$:     movl    a2@-,a0@-
        !          2080: 8$:     dbra    d2,9$
        !          2081:                                 | ici pas de carry finale
        !          2082:         movl    a2@-,a0@-
        !          2083:         subql   #4,a0
        !          2084:         bra     addiif
        !          2085:                                 | ici carry finale
        !          2086: 7$:     movw    a2@(-2),d2
        !          2087:         addqw   #1,d2
        !          2088:         cmpw    #0x8000,d2
        !          2089:         bcs     10$
        !          2090:                                 | ici debordement
        !          2091:         movl    #adder2,sp@-
        !          2092:         jsr     _pari_err
        !          2093:                                 | ici demander 1 long mot en plus
        !          2094: 10$:    moveq   #1,d0
        !          2095:         bsr     geti
        !          2096:         movl    #1,a0@(8)       | mise retenue
        !          2097:         movl    a0@(4),a0@
        !          2098:         movw    d2,a0@(2)       | mise a jour premier long mot code
        !          2099:         movl    a2@-,a0@(4)
        !          2100:         movw    d2,a0@(6)       | idem deuxieme long mot code
        !          2101: addiif: movl    a0,d0           | d0 pointe sur resultat
        !          2102: addiig: moveml  sp@+,d2-d7/a2-a4
        !          2103:         unlk    a6
        !          2104:         rts
        !          2105:                                 | ici i2 * i1 < 0 : soustraction
        !          2106: suii:   movl    a1,a3
        !          2107:         movl    a2,a4           | a3,a4 pointent sur i1,i2
        !          2108:         subw    d1,d2           | d2.w contient L2-L1
        !          2109:         bne     1$
        !          2110:                                 | ici L2=L1
        !          2111:         subqw   #3,d1           | d1.w  contient L1-1
        !          2112:         addql   #8,a3
        !          2113:         addql   #8,a4           | a3,a4 pointent debut mantisses i1,i2
        !          2114: 2$:     cmpml   a3@+,a4@+
        !          2115:         dbne    d1,2$           | on compare |i1| et |i2|
        !          2116:         bhi     1$              | si |i2| > |i1|
        !          2117:                                 | ici |i2| < |i1|
        !          2118:         bne     3$
        !          2119:                                 | ici |i2| = |i1| : i2 + i1 = 0
        !          2120:        movl    _gzero,d0
        !          2121:         bra     addiig
        !          2122:                                 | ici |i2| < |i1| : echanger i2 et i1
        !          2123: 3$:     exg     a1,a2
        !          2124:                                 | ici |i2| > |i1| (signe i2=signe resultat)
        !          2125: 1$:     movw    a2@(6),d0
        !          2126:         bsr     geti            | allocation memoire le2 longs mots
        !          2127:         movw    a1@(6),d1       | d1.w  contient L1+2
        !          2128:         movl    a0,sp@-         | empilage adresse resultat
        !          2129:         movb    a2@(4),d7       | d7.b  contient signe resultat
        !          2130:         lea     a1@(0,d1:w:4),a1
        !          2131:         lea     a2@(0,d0:w:4),a2
        !          2132:         lea     a0@(0,d0:w:4),a0| a0,a1,a2 pointent fin resultat,i1,i2
        !          2133:         subl    d3,d3           | initialisation bit X
        !          2134:         subqw   #3,d1           | d1.w contient L1-1 (compteur)
        !          2135:                                 | premiere boucle de soustraction
        !          2136: 4$:     movl    a2@-,d0
        !          2137:         movl    a1@-,d5
        !          2138:         subxl   d5,d0
        !          2139:         movl    d0,a0@-
        !          2140:         dbra    d1,4$
        !          2141:         roxrw   d3,d0           | restauration du bit C
        !          2142:         bra     5$
        !          2143:                                 | deuxieme boucle:propagation carry
        !          2144: 6$:     movl    a2@-,d5
        !          2145:         subxl   d3,d5
        !          2146:         movl    d5,a0@-
        !          2147:         roxrw   d3,d0
        !          2148: 5$:     dbcc    d2,6$
        !          2149:         bra     7$
        !          2150:                                 | troisieme boucle:recopie fin i2
        !          2151: 8$:     movl    a2@-,a0@-
        !          2152: 7$:     dbra    d2,8$
        !          2153:         movl    sp@+,a0         | depilage adresse resultat
        !          2154:         movw    a0@(2),d1       | d1.w contient lon eff du resultat
        !          2155:         moveq   #0,d2
        !          2156:         movw    d1,d2           | d2.w idem
        !          2157:         addql   #8,a0           | a0 pointe mantisse resultat
        !          2158: 9$:     tstl    a0@+
        !          2159:         dbne    d1,9$           | chasse aux '0' partie gauche resultat
        !          2160:         subql   #4,a0           | a0 pointe 1er long mot non nul
        !          2161:         movl    d1,a0@-         | mise a jour longueur effective
        !          2162:         movb    d7,a0@          | mise a jour signe
        !          2163:         movw    d1,a0@-         | mise a jour longueur totale
        !          2164:         movw    #0x100,a0@-     | mise a jour type
        !          2165:         subw    d1,d2
        !          2166:         lsll    #2,d2
        !          2167:         addl    d2,_avma                | mise a jour pile PARI
        !          2168:         bra     addiif
        !          2169:
        !          2170: #===================================================================#
        !          2171: #                                                                   #
        !          2172: #               Addition : entier court + reel = reel               #
        !          2173: #                                                                   #
        !          2174: #       entree : a7@(4) contient s2 de type S                       #
        !          2175: #                a7@(8) pointe sur r1 de type R                     #
        !          2176: #       sortie : d0 pointe sur s2 + r1 de type R (zone creee)       #
        !          2177: #                                                                   #
        !          2178: #===================================================================#
        !          2179:
        !          2180: _addsr: link    a6,#-12         | 3 lgmots pour transformer s2 en type I
        !          2181:         movl    a6@(8),d1       | d1.l contient s2
        !          2182:         bne     1$
        !          2183:                                 | ici s2 = 0
        !          2184:         movl    #0x1000002,a6@(-12)
        !          2185:         movl    #2,a6@(-8)
        !          2186:         bra     3$
        !          2187:                                 | ici s2 <> 0
        !          2188: 1$:     bmi     2$
        !          2189:         movl    #0x1000003,a6@(-12)
        !          2190:         movl    #0x1000003,a6@(-8)
        !          2191:         movl    d1,a6@(-4)
        !          2192:         bra     3$
        !          2193:                                 | ici s2 < 0
        !          2194: 2$:     movl    #0x1000003,a6@(-12)
        !          2195:         movl    #0xff000003,a6@(-8)
        !          2196:         negl    d1
        !          2197:         movl    d1,a6@(-4)
        !          2198: 3$:     movl    a6@(12),sp@-
        !          2199:         pea     a6@(-12)
        !          2200:         bsr     _addir
        !          2201:         unlk    a6
        !          2202:         rts
        !          2203:
        !          2204: #===================================================================#
        !          2205: #                                                                   #
        !          2206: #               Addition : entier + reel = reel                     #
        !          2207: #                                                                   #
        !          2208: #       entree : a7@(4) pointe sur i2 de type I                     #
        !          2209: #                a7@(8) pointe sur r1 de type R                     #
        !          2210: #       sortie : d0 pointe sur i2 + r1 de type R (zone creee)       #
        !          2211: #       precision : si exp2>=exp1 , L = L1 + int((exp2-exp1)/32) + 1#
        !          2212: #                   si exp2<exp1  , L = L1                          #
        !          2213: #                   i2 est transforme en un reel                    #
        !          2214: #                                                                   #
        !          2215: #===================================================================#
        !          2216:
        !          2217: _addir: link    a6,#-4          | var. locale pour copie i2 en r2
        !          2218:         moveml  d2-d3/a2,sp@-
        !          2219:         movl    a6@(8),a2
        !          2220:         movl    a6@(12),a1      | a1,a2 pointent sur r1,i2
        !          2221:         tstb    a2@(4)
        !          2222:         bne     1$
        !          2223:                                 | ici i2 = 0 ( i2 + r1 = r1)
        !          2224: 6$:     movw    a1@(2),d0
        !          2225:         bsr     getr
        !          2226:         movl    a0,a6@(-4)      | sauve adresse resultat
        !          2227:         addql   #4,a1
        !          2228:         addql   #4,a0
        !          2229:         subqw   #2,d0
        !          2230:                                 | boucle de copie d'un reel
        !          2231: 4$:     movl    a1@+,a0@+
        !          2232:         dbra    d0,4$
        !          2233:         bra     addirf
        !          2234:                                 | ici i2 <> 0
        !          2235: 1$:     tstb    a1@(4)
        !          2236:         bne     3$
        !          2237:                                 | ici r1 = 0 (i2 + r1 = i2)
        !          2238:         movl    a1@(4),d1
        !          2239:         subl    #0x800000,d1
        !          2240:         asrl    #5,d1
        !          2241:         moveq   #0,d0
        !          2242:         movw    a2@(6),d0
        !          2243:         subl    d1,d0           | d0.l contient L2-[exp1/32]
        !          2244:         cmpl    #3,d0
        !          2245:         bcs     2$
        !          2246:         cmpl    #0x8000,d0
        !          2247:         bcc     2$
        !          2248:         bsr     getr
        !          2249:         movl    a0,a6@(-4)
        !          2250:         movl    a0,sp@-
        !          2251:         movl    a2,sp@-
        !          2252:         bsr     _affir          | le resultat est i2 en type R
        !          2253:         addql   #8,sp           | de longueur L2-[exp1/32]
        !          2254:         bra     addirf
        !          2255:                                 | ici i2 et r1 <> 0
        !          2256: 3$:     movl    a2@(8),d0
        !          2257:         bfffo   d0{#0:#0},d1    | d1.l recoit nb de shifts (=s)
        !          2258:         moveq   #0,d0
        !          2259:         movw    a2@(6),d0
        !          2260:         subqw   #2,d0
        !          2261:         lsll    #5,d0
        !          2262:         subl    d1,d0
        !          2263:         subql   #1,d0           | d0.l recoit 32*L2-s-1 = exp2
        !          2264:         moveq   #0,d3
        !          2265:         movw    a1@(2),d3       | d3.w recoit l1
        !          2266:         movl    a1@(4),d2
        !          2267:         andl    #0xffffff,d2
        !          2268:         subl    #0x800000,d2    | d2.l recoit exp1
        !          2269:         subl    d0,d2           | d2.l recoit exp1-exp2
        !          2270:         ble     5$
        !          2271:                                 | ici exp1 > exp2
        !          2272:         lsrl    #5,d2           | d2.l recoit L3=[(exp1-exp2)/32]
        !          2273:         subl    d2,d3           | d3.l recoit L1-L3+2
        !          2274:         cmpl    #2,d3
        !          2275:         ble     6$              | si L1 <= L3 alors:r1+i2=r1
        !          2276:                                 | ici L1 > L3
        !          2277: 7$:     movl    _avma,sp@-      | empilage pile PARI
        !          2278:         movw    d3,d0
        !          2279:         bsr     getr            | allocation memoire L1-L3+2 lg mots
        !          2280:                                 | pour ecrire i2 en type R
        !          2281:         movl    a0,sp@-         | empilage r2 (copie de i2)
        !          2282:         movl    a2,sp@-         | empilage i2
        !          2283:         bsr     _affir
        !          2284:         movl    a1,sp@          | empilage r1
        !          2285:         bsr     _addrr
        !          2286:         movl    d0,a0           | a0 pointe sur r2 + r1
        !          2287:         movw    a0@(2),d0       | d0.w contient lr (longueur resultat)
        !          2288:         subqw   #1,d0           | d0.w contient lr-1 (compteur pile)
        !          2289:         movl    sp@(4),a1       | a1 pointe sur r2
        !          2290:         addql   #8,sp           | depilage r1 et r2
        !          2291:         moveq   #0,d1
        !          2292:         movw    a1@(2),d1
        !          2293:         lsll    #2,d1           | d1.l contient 4*l2 (nb d'octets a
        !          2294:                                 | desallouer dans pile PARI)
        !          2295:
        !          2296:         movl    sp@+,a0         | a0 pointe sur ancien _avma
        !          2297:                                 | boucle de transfert du resultat
        !          2298: 8$:     movl    a1@-,a0@-
        !          2299:         dbra    d0,8$
        !          2300:         addl    d1,_avma        | mise a jour pile PARI
        !          2301:         movl    a0,a6@(-4)
        !          2302:         bra     addirf
        !          2303:                                 | ici exp1 <= exp2
        !          2304: 5$:     negl    d2
        !          2305:         lsrl    #5,d2           | d2.l recoit L3=[(exp2-exp1)/32]
        !          2306:         addw    d2,d3
        !          2307:         addqw   #1,d3           | d3.w recoit L1+L3+1
        !          2308:         cmpw    #0x8000,d3
        !          2309:         bcs     7$
        !          2310:                                 | ici debordement
        !          2311: 2$:     movl    #adder3,sp@-
        !          2312:         jsr     _pari_err
        !          2313: addirf: movl    a6@(-4),d0      | d0 pointe sur resultat
        !          2314:         moveml  sp@+,d2-d3/a2
        !          2315:         unlk    a6
        !          2316:         rts
        !          2317:
        !          2318: #===================================================================#
        !          2319: #                                                                   #
        !          2320: #               Addition : reel + reel = reel                       #
        !          2321: #                                                                   #
        !          2322: #       entree : a7@(4) pointe sur r2 de type R                     #
        !          2323: #                a7@(8) pointe sur r1 de type R                     #
        !          2324: #       sortie : d0 pointe sur r2 + r1 de type R (zone creee)       #
        !          2325: #       precision : L = inf ( L2 , L1 + [(exp2-exp1)/32])           #
        !          2326: #                       si exp2 >= exp1 (sinon echanger r1 et r2)   #
        !          2327: #                                                                   #
        !          2328: #===================================================================#
        !          2329:
        !          2330: _addrr: link    a6,#-16
        !          2331:         moveml  d2-d7/a2-a4,sp@-
        !          2332:         movl    a6@(8),a2       | a2 pointe sur r2
        !          2333:         movl    a6@(12),a1      | a1 pointe sur r1
        !          2334:         tstb    a2@(4)
        !          2335:         bne     1$
        !          2336:                                 | ici r2 = 0 (r2 + r1 = r1)
        !          2337: 4$:     tstb    a1@(4)
        !          2338:         bne     22$
        !          2339:                                 | ici r2=r1=0
        !          2340:         movl    a1@(4),d1
        !          2341:         cmpl    a2@(4),d1
        !          2342:         bgt     23$
        !          2343:         movl    a2@(4),d1       | d1.l contient sup(fexp1,fexp2)
        !          2344: 23$:    moveq   #3,d0
        !          2345:         bsr     getr
        !          2346:         movl    a0,a6@(-8)
        !          2347:         movl    d1,a0@(4)
        !          2348:         clrl    a0@(8)
        !          2349:         bra     addrrf
        !          2350:                                 | ici r2 = 0 et r1 <> 0
        !          2351: 22$:    moveq   #0,d0
        !          2352:         movl    a2@(4),d2       | d2.l contient fexp2
        !          2353:         movl    a1@(4),d1
        !          2354:         andl    #0xffffff,d1    | d1.l contient fexp1
        !          2355:         subl    d2,d1           | d1.l recoit exp1-exp2
        !          2356:         bcc     24$
        !          2357:                                 | ici exp2 > exp1
        !          2358:         moveq   #3,d0
        !          2359:         bsr     getr
        !          2360:         movl    a0,a6@(-8)      | le resultat est 0 avec exposant fexp2
        !          2361:         movl    a2@(4),a0@(4)
        !          2362:         clrl    a0@(8)
        !          2363:         bra     addrrf
        !          2364:                                 | ici exp2 <= exp1
        !          2365: 24$:    lsrl    #5,d1           | d1.l contient [(exp1-exp2)/32]
        !          2366:         movw    a1@(2),d0
        !          2367:         subqw   #2,d0           | d0.l contient L1
        !          2368:         cmpl    d1,d0
        !          2369:         ble     25$
        !          2370:         movl    d1,d0           | d0.l=inf(L1,[(e1-e2)/32])=L
        !          2371:         addql   #1,d0           | le resultat est r1 en longueur:
        !          2372: 25$:    addql   #2,d0           | L1 si L1<=[(e1-e2)/32] ou
        !          2373:         bsr     getr
        !          2374:         movl    a0,a6@(-8)
        !          2375:         addql   #4,a1
        !          2376:         addql   #4,a0
        !          2377:         subqw   #2,d0
        !          2378: 27$:    movl    a1@+,a0@+
        !          2379:         dbra    d0,27$
        !          2380:         bra     addrrf
        !          2381:                                 | ici r2 <> 0
        !          2382: 1$:     tstb    a1@(4)
        !          2383:         bne     3$
        !          2384:                                 | ici r1 = 0 (r2 + r1 = r2)
        !          2385:         exg     a2,a1
        !          2386:         bra     22$
        !          2387:                                 | ici r1 * r2 <> 0
        !          2388: 3$:     movb    a1@(4),d3
        !          2389:         movb    a2@(4),d5
        !          2390:         eorb    d5,d3           | d3.b contient : 0 si r1 * r2 > 0
        !          2391:                                 | et est negatif sinon
        !          2392:         movb    d3,a6@(-2)      | sauvegarde du 'signe'
        !          2393:         movl    a2@(4),d3
        !          2394:         andl    #0xffffff,d3    | d3.l contient fexp2=e2
        !          2395:         movl    a1@(4),d1
        !          2396:         andl    #0xffffff,d1    | d1.l contient fexp1=e1
        !          2397:         subl    d1,d3           | d3.l  contient exp2-exp1
        !          2398:         beq     5$              | si e2 = e1
        !          2399:         bcc     6$              | si e2 > e1
        !          2400:                                 | ici e2 < e1
        !          2401:         exg     a1,a2
        !          2402:         negl    d3              | d3.l recoit e1-e2 > 0
        !          2403:                                 | ici e2-e1 > 0
        !          2404: 6$:     movw    d3,d4
        !          2405:         andw    #31,d4
        !          2406:         lsrl    #5,d3           | e2-e1=32*L3+r ; d4.w,d3.l recoit r,L3
        !          2407:         moveq   #0,d2
        !          2408:         movw    a2@(2),d2
        !          2409:         subqw   #2,d2           | d2.l recoit L2
        !          2410:         cmpl    d2,d3
        !          2411:         bcs     7$
        !          2412:                                 | ici L3 >= L2 (r1 + r2 = r2)
        !          2413:         movw    a2@(2),d0
        !          2414:         bsr     getr
        !          2415:         movl    a0,a6@(-8)
        !          2416:         addql   #4,a2
        !          2417:         addql   #4,a0
        !          2418:         subqw   #2,d0
        !          2419: 28$:    movl    a2@+,a0@+
        !          2420:         dbra    d0,28$
        !          2421:         bra     addrrf
        !          2422:                                 | ici L3 < L2
        !          2423: 7$:     moveq   #0,d1
        !          2424:         movw    a1@(2),d1
        !          2425:         subqw   #2,d1           | d1.l recoit L1
        !          2426:         movl    d3,d5
        !          2427:         addl    d1,d5           | d5.l recoit L1 + L3
        !          2428:         cmpl    d2,d5
        !          2429:         bcs     8$              | si L1 + L3 < L2
        !          2430:                                 | ici L3 < L2 <= L1 + L3
        !          2431:         movb    #1,a6@(-4)      | a6@(-4) flag contenant :
        !          2432:                                 | 0 si L1+L3 < L2 faire alors copie r1
        !          2433:                                 | 1 si L3 < L2 <= L1+L3 et idem
        !          2434:                                 | 2 si e1 = e2 et alors pas de copie
        !          2435:         movw    d2,d0
        !          2436:         addqw   #2,d0           | d0.w recoit l2
        !          2437:         bsr     getr            | allocation L2+2 lgmots pour resultat
        !          2438:         movl    a0,a6@(-8)      | adresse resultat dans var. locale
        !          2439:         movw    d2,d5
        !          2440:         subw    d3,d5           | d5.w contient L2 - L3
        !          2441:         movw    d5,d0
        !          2442:         addqw   #1,d0           | d0.w contient L2 - L3 + 1
        !          2443:         bsr     getr            | allocation L2-L3+1 pour copie r1 avec
        !          2444:                                 | un unique longmot code
        !          2445:         subqw   #2,d0           | d0.w contient L2 - L3 - 1
        !          2446:         movw    a2@(2),d1
        !          2447:         lea     a2@(0,d1:w:4),a2| a2 pointe fin de r2
        !          2448:         bra     9$
        !          2449:                                 | ici L1 + L3 < L2
        !          2450: 8$:     clrb    a6@(-4)         | a6@(-4) mis a 0
        !          2451:         movw    d5,d0
        !          2452:         addqw   #3,d0           | d0.w contient L1 + L3 + 3
        !          2453:         bsr     getr            | allocation pour resultat
        !          2454:         movl    a0,a6@(-8)      | adresse resultat dans var. locale
        !          2455:         lea     a2@(0,d0:w:4),a2| a2 pointe ou necessaire !!
        !          2456:         movw    a1@(2),d5       | d5.w contient L1 + 2
        !          2457:         movw    d5,d0           | d0.w contient L1 + 2
        !          2458:         subqw   #2,d5           | d5.w contient L1
        !          2459:         bsr     getr            | allocation L1+2 pour copie r1 avec
        !          2460:                                 | un  seul lgmot code
        !          2461:         subqw   #3,d0           | d0.w contient L1 - 1
        !          2462: 9$:     movl    a0,a6@(-12)     | adresse copie r1 dans var. locale
        !          2463:         addql   #4,a0
        !          2464:         movl    a0,a3           | a0 et a3 pointent sur debut copie
        !          2465:         addql   #8,a1           | a1 pointe debut mantisse r1
        !          2466: 29$:    movl    a1@+,a0@+
        !          2467:         dbra    d0,29$          | boucle copie r1
        !          2468:         tstw    d4              | test de r = nb de shifts
        !          2469:         bne     10$
        !          2470:                                 | ici r = 0 ; pas de shift a faire
        !          2471:                                 | a0 pointe fin copie r1
        !          2472:                                 | a3 pointe debut mantisse copie r1
        !          2473:         moveq   #0,d7
        !          2474:         movw    a3@(-2),d7
        !          2475:         subqw   #1,d7           | d7.w contient longueur mantisse copie
        !          2476:         movw    d7,d2
        !          2477:         subqw   #1,d2           | d2.w = compteur boucle addition
        !          2478:         lea     a3@(0,d7:w:4),a3| a3 pointe fin copie r1
        !          2479:         movl    a3,a1           | a1 aussi
        !          2480:         bra     11$
        !          2481:                                 | ici r <> 0 ; shift a faire
        !          2482: 10$:    subqw   #1,d5
        !          2483:         movew   d5,d2           | d5.w et d2.w = compteur boucle shift
        !          2484:         movl    #-1,d6
        !          2485:         lsrl    d4,d6           | masque de shift:0...01...1; avec r '0'
        !          2486:         moveq   #0,d0
        !          2487:                                 | boucle de shift de copie de r1
        !          2488: 12$:    movl    a3@,d7
        !          2489:         rorl    d4,d7
        !          2490:         movl    d7,d1
        !          2491:         andl    d6,d1
        !          2492:         subl    d1,d7
        !          2493:         addl    d1,d0
        !          2494:         movl    d0,a3@+
        !          2495:         movl    d7,d0
        !          2496:         dbra    d5,12$
        !          2497:         movl    a3,a1
        !          2498:         tstb    a6@(-4)
        !          2499:         bne     11$             | si a6@(-4) <> 0
        !          2500:                                 | ici a6@(-4) = 0
        !          2501:         movl    d0,a1@+
        !          2502:         addqw   #1,d2           | d2.w = compteur boucle addition
        !          2503: 11$:    movl    a6@(-8),a0      | a0 pointe sur resultat
        !          2504:         moveq   #0,d1
        !          2505:         movw    a0@(2),d1
        !          2506:         lea     a0@(0,d1:w:4),a0| a0 pointe fin du resultat
        !          2507:         bra     14$
        !          2508:                                 | ici e1 = e2
        !          2509: 5$:     movb    #2,a6@(-4)      | a6@(-4) recoit 2
        !          2510:         movl    d1,a6@(-16)     | a6@(-16) recoit e1=e2 biaise
        !          2511:         movw    a1@(2),d0
        !          2512:         cmpw    a2@(2),d0
        !          2513:         bcs     15$
        !          2514:         movw    a2@(2),d0
        !          2515: 15$:    bsr     getr            | allocation inf (l1,l2) pour resultat
        !          2516:         movl    a0,a6@(-8)      | adresse du resultat dans var. locale
        !          2517:         moveq   #0,d2
        !          2518:         movw    d0,d2
        !          2519:         movl    d2,d0
        !          2520:         subqw   #3,d2
        !          2521:         moveq   #0,d3
        !          2522:         movl    a2,a4
        !          2523:         movl    a1,a3
        !          2524:         lea     a0@(0,d0:w:4),a0| a0 pointe fin resultat
        !          2525:         lea     a1@(0,d0:w:4),a1| a1 pointe fin de r1 ou copie
        !          2526:         lea     a2@(0,d0:w:4),a2| a2 pointe fin de r2
        !          2527:
        !          2528:                                 | zone des boucles d'addition
        !          2529:
        !          2530:                                 | conditions initiales :
        !          2531:                                 | a0 pointe fin resultat
        !          2532:                                 | a1 pointe fin r1 ou copie
        !          2533:                                 | a2 pointe fin r2
        !          2534:                                 | d2.w contient L4-1
        !          2535:                                 | d3.w contient L3 avec L3+L4=long.res.
        !          2536: 14$:    subl    d4,d4           | initialisation bit X
        !          2537:         tstb    a6@(-2)         | test du signe de r1*r2
        !          2538:         bne     surr
        !          2539:                                 | ici r1 * r2 > 0
        !          2540:                                 | 1ere boucle d'addition
        !          2541: 16$:    movl    a1@-,d1
        !          2542:         movl    a2@-,d5
        !          2543:         addxl   d5,d1
        !          2544:         movl    d1,a0@-
        !          2545:         dbra    d2,16$
        !          2546:         roxrw   d4,d0           | remise a jour du bit C
        !          2547:         bcc     17$             | si pas de carry
        !          2548:         bra     18$             | si carry
        !          2549:                                 | 2eme boucle:propagation carry
        !          2550: 19$:    movl    a2@-,d5
        !          2551:         addxl   d4,d5
        !          2552:         movl    d5,a0@-
        !          2553:         roxrw   d4,d0           | mise a jour bit C
        !          2554: 18$:    dbcc    d3,19$
        !          2555:         bcs     20$             | si carry finale
        !          2556:         bra     17$
        !          2557:                                 | 3eme boucle:recopie reste mantisse r2
        !          2558: 30$:    movl    a2@-,a0@-
        !          2559: 17$:    dbra    d3,30$
        !          2560:         movl    a2@-,a0@-       | mise signe et exposant:celui de r2
        !          2561:         cmpb    #2,a6@(-4)
        !          2562:         beq     addrrf          | si a6@(-4) = 2
        !          2563:                                 | ici rendre copie de r1
        !          2564:         movl    a6@(-12),a0
        !          2565:         bsr     giv
        !          2566:         bra     addrrf
        !          2567:                                 | ici carry finale
        !          2568: 20$:    movl    a2@-,d1
        !          2569:         andl    #0xffffff,d1
        !          2570:         addql   #1,d1           | d1.l recoit fexp resultat
        !          2571:         cmpl    #0x1000000,d1
        !          2572:         blt     2$
        !          2573:                                 | ici fexp>=2^24 : erreur
        !          2574:         movl    #adder4,sp@-
        !          2575:         jsr     _pari_err
        !          2576:                                 | ici non debordement
        !          2577: 2$:     cmpb    #2,a6@(-4)
        !          2578:         beq     13$
        !          2579:                                 | ici rendre copie de r1
        !          2580:         movl    a0,a3
        !          2581:         movl    a6@(-12),a0
        !          2582:         bsr     giv
        !          2583:         movl    a3,a0
        !          2584: 13$:    movl    d1,a0@(-4)
        !          2585:         movb    a2@,a0@(-4)     | mise a jour exp et sign resultat
        !          2586:         movw    a0@(-6),d2
        !          2587:         subqw   #3,d2           | compteur de shift
        !          2588:         movw    #-1,d0
        !          2589:         movw    d0,cc           | mise a 1 des bit x et c
        !          2590: 31$:    roxrw   a0@+
        !          2591:         roxrw   a0@+            | boucle de mise de retenue finale et
        !          2592:         dbra    d2,31$          | shift de 1 vers la droite mantisse
        !          2593: addrrf: movl    a6@(-8),d0      | d0 pointe sur resultat
        !          2594:         moveml  sp@+,d2-d7/a2-a4
        !          2595:         unlk    a6
        !          2596:         rts
        !          2597:                                 | ici faire une soustraction
        !          2598:                                 | pour conditions initiales cf.plus haut
        !          2599: surr:   moveq   #0,d6
        !          2600:         movw    d2,d6
        !          2601:         movw    d2,d7
        !          2602:         addw    d3,d7
        !          2603:         addqw   #3,d7
        !          2604:         cmpb    #2,a6@(-4)
        !          2605:         bne     1$
        !          2606:                                 | ici e2 = e1:comparer les mantisses
        !          2607:         addql   #8,a3
        !          2608:         addql   #8,a4
        !          2609: 12$:    cmpml   a3@+,a4@+
        !          2610:         dbne    d2,12$
        !          2611:         bhi     1$              | si |r2| > |r1|
        !          2612:         bne     2$              | si |r2| < |r1|
        !          2613:                                 | ici |r2| = |r1| et donc r2 + r1 = 0
        !          2614:         movl    a6@(-8),a0      | le resultat est 0 avec comme exposant
        !          2615:         moveq   #0,d2           | -32*inf(l1,l2)+e1
        !          2616:         movw    a0@(2),d2
        !          2617:         subqw   #2,d2
        !          2618:         lsll    #5,d2
        !          2619:         negl    d2
        !          2620:         addl    a6@(-16),d2     | ajouter e1 biaise
        !          2621:         bpl     15$
        !          2622:         movl    #adder5,sp@-    | underflow dans R+R
        !          2623:         jsr     _pari_err
        !          2624: 15$:    cmpl    #0x1000000,d2
        !          2625:         blt     16$
        !          2626:                                 | ici fexp>=2^24 : erreur overflow dans R+R
        !          2627:         movl    #adder4,sp@-
        !          2628:         jsr     _pari_err
        !          2629: 16$:    bsr     giv
        !          2630:         moveq   #3,d0
        !          2631:         bsr     getr
        !          2632:         movl    a0,a6@(-8)
        !          2633:         movl    d2,a0@(4)
        !          2634:         clrl    a0@(8)
        !          2635:         bra     addrrf
        !          2636:                                 | ici |r2| < |r1| : echanger r2 et r1
        !          2637: 2$:     exg     a1,a2
        !          2638:                                 | ici |r2| > |r1|
        !          2639: 1$:     subw    d2,d6
        !          2640:         subl    d4,d4           | initialisation bit X
        !          2641:                                 | 1ere boucle de soustraction
        !          2642: 3$:     movl    a2@-,d0
        !          2643:         movl    a1@-,d5
        !          2644:         subxl   d5,d0
        !          2645:         movl    d0,a0@-
        !          2646:         dbra    d2,3$
        !          2647:         roxrw   d4,d0           | remise ajour bit C
        !          2648:         bra     4$
        !          2649:                                 | 2eme boucle:propagation carry
        !          2650: 5$:     movl    a2@-,d5
        !          2651:         subxl   d4,d5
        !          2652:         movl    d5,a0@-
        !          2653:         roxrw   d4,d0
        !          2654: 4$:     dbcc    d3,5$
        !          2655:         bra     6$
        !          2656:                                 | 3eme boucle:copie reste mantisse r2
        !          2657: 13$:    movl    a2@-,a0@-
        !          2658: 6$:     dbra    d3,13$
        !          2659:         moveq   #0,d3
        !          2660:         moveq   #-1,d2
        !          2661:         movw    d2,d3
        !          2662: 14$:    tstl    a0@+
        !          2663:         dbne    d2,14$          | chasse aux '0' du resultat provisoire
        !          2664:                                 | a0 pointe sur 1er lgmot non nul
        !          2665:         subw    d2,d3           | d3.w  contient de lgmots nuls
        !          2666:         addw    d6,d3
        !          2667:         subl    #12,a0          | a0 pointe sur resultat
        !          2668:         movl    a0,a6@(-8)
        !          2669:         movl    a0,a1           | a1 aussi
        !          2670:         cmpb    #2,a6@(-4)
        !          2671:         beq     7$              | si pas de copie faite
        !          2672:                                 | ici rendre copie
        !          2673:         movl    a6@(-12),a0
        !          2674:         bsr     giv
        !          2675: 7$:     moveq   #0,d0
        !          2676:         movw    d3,d0
        !          2677:         lsll    #2,d0           | d0.l = nb d'octets a 0 du result.
        !          2678:         addl    d0,_avma        | mise a jour pile PARI(rendre d3 lgmot)
        !          2679:         movl    a1,a0           | a0 pointe sur resultat final
        !          2680:         movw    #0x200,a0@
        !          2681:         subw    d3,d7
        !          2682:         movw    d7,a0@(2)       | mise a jour 1er lgmot code resultat
        !          2683:         lsll    #5,d3
        !          2684:         movl    a0@(8),d0
        !          2685:         bfffo   d0{#0:#0},d1    | d1.l contient nb de shifts=r
        !          2686:         lsll    d1,d0           | normalisation 1er lgmot mantisse
        !          2687:         addl    d1,d3
        !          2688:         lsll    #2,d6
        !          2689:         subl    d6,a2
        !          2690:         movl    a2@(-4),d2
        !          2691:         andl    #0xffffff,d2
        !          2692:         subl    d3,d2
        !          2693:         movl    d2,a0@(4)       | calcul et mise exposant resultat
        !          2694:         movb    a2@(-4),a0@(4)  | mise signe resultat
        !          2695:         tstb    d1
        !          2696:         bne     8$              | si r <> 0
        !          2697:         bra     9$              | si r = 0
        !          2698: 8$:     moveq   #1,d6
        !          2699:         lsll    d1,d6
        !          2700:         subql   #1,d6           | masque de shift
        !          2701:         addql   #8,a1
        !          2702:         subqw   #3,d7           | d7.w  contient L-1
        !          2703:         bra     10$
        !          2704:                                 | boucle de shift vers la gauche
        !          2705: 11$:    movl  a1@(4),d2
        !          2706:         roll    d1,d2
        !          2707:         movl    d2,d3
        !          2708:         andl    d6,d3
        !          2709:         subl    d3,d2
        !          2710:         addl    d3,d0
        !          2711:         movl    d0,a1@+
        !          2712:         movl    d2,d0
        !          2713: 10$:    dbra    d7,11$
        !          2714:         movl    d0,a1@
        !          2715: 9$:     bra     addrrf
        !          2716:
        !          2717:
        !          2718:
        !          2719:
        !          2720:
        !          2721: #*******************************************************************#
        !          2722: #*******************************************************************#
        !          2723: #**                                                               **#
        !          2724: #**                     PROGRAMMES DE SOUSTRACTION                **#
        !          2725: #**                                                               **#
        !          2726: #*******************************************************************#
        !          2727: #*******************************************************************#
        !          2728:
        !          2729:
        !          2730:
        !          2731:
        !          2732:
        !          2733: #===================================================================#
        !          2734: #                                                                   #
        !          2735: #                       Soustraction generale                       #
        !          2736: #                                                                   #
        !          2737: #       entree : a7@(4) pointe sur n2 de type I ou R                #
        !          2738: #                a7@(8) pointe sur n1 de type I ou R                #
        !          2739: #       sortie : d0 pointe sur n2 - n1 de type I ou R (zone creee)  #
        !          2740: #       interdit : type S                                           #
        !          2741: #                                                                   #
        !          2742: #===================================================================#
        !          2743:
        !          2744: _mpsub: cmpb    #1,sp@(8)@
        !          2745:         bne     1$
        !          2746:         cmpb    #1,sp@(4)@
        !          2747:         beq     _subii
        !          2748:         bra     _subri
        !          2749: 1$:     cmpb    #1,sp@(4)@
        !          2750:         beq     _subir
        !          2751:         bra     _subrr
        !          2752:
        !          2753: #===================================================================#
        !          2754: #                                                                   #
        !          2755: #                       Soustraction (par valeur)                   #
        !          2756: #                                                                   #
        !          2757: #       entree : a7@(4) pointe sur n2 de type I ou R                #
        !          2758: #                a7@(8) pointe sur n1 de type I ou R                #
        !          2759: #                a7@(12) pointe sur n3 de type I ou R               #
        !          2760: #       sortie : la zone pointee par a7@(12) contient n2 - n1       #
        !          2761: #       interdit : type S                                           #
        !          2762: #                                                                   #
        !          2763: #===================================================================#
        !          2764:
        !          2765: _mpsubz:lea     _mpsub,a0
        !          2766:         bra     mpopz
        !          2767:
        !          2768:                                 | soustraction S-S=I ou R
        !          2769:
        !          2770: _subssz:lea     _subss,a0
        !          2771:         bra     mpopz
        !          2772:
        !          2773:                                 | soustraction S-I=I ou R
        !          2774:
        !          2775: _subsiz:lea     _subsi,a0
        !          2776:         bra     mpopz
        !          2777:
        !          2778:                                 | soustraction S-R=R sinon erreur
        !          2779:
        !          2780: _subsrz:lea     _subsr,a0
        !          2781:         bra     mpopz
        !          2782:
        !          2783:                                 | soustraction I-S=I ou R
        !          2784:
        !          2785: _subisz:lea     _subis,a0
        !          2786:         bra     mpopz
        !          2787:
        !          2788:                                 | soustraction I-I=I ou R
        !          2789:
        !          2790: _subiiz:lea     _subii,a0
        !          2791:         bra     mpopz
        !          2792:
        !          2793:                                 | soustraction I-R=R sinon erreur
        !          2794:
        !          2795: _subirz:lea     _subir,a0
        !          2796:         bra     mpopz
        !          2797:
        !          2798:                                 | soustraction R-S=R sinon erreur
        !          2799:
        !          2800: _subrsz:lea     _subrs,a0
        !          2801:         bra     mpopz
        !          2802:
        !          2803:                                 | soustraction R-I=R sinon erreur
        !          2804:
        !          2805: _subriz:lea     _subri,a0
        !          2806:         bra     mpopz
        !          2807:
        !          2808:                                 | soustraction R-R=R sinon erreur
        !          2809:
        !          2810: _subrrz:lea     _subrr,a0
        !          2811:         bra     mpopz
        !          2812:
        !          2813: #===================================================================#
        !          2814: #                                                                   #
        !          2815: #       Soustraction : entier court - entier court = entier         #
        !          2816: #                                                                   #
        !          2817: #       entree : a7@(4) contient s2 de type S                       #
        !          2818: #                a@7(8) contient s1 de type S                       #
        !          2819: #       sortie : d0 pointe sur s2 - s1 de type I (zone creee)       #
        !          2820: #       remarque : s2 - s1 = s0 est interdit                        #
        !          2821: #                                                                   #
        !          2822: #===================================================================#
        !          2823:
        !          2824: _subss: link    a6,#-12
        !          2825:         movl    a6@(12),d1      | d1.l recoit s1
        !          2826:         negl    d1              | d1.l recoit -s1
        !          2827:         bvs     1$
        !          2828:                                 | ici |s1| <= 2^31-1
        !          2829:         movl    d1,sp@-         | empilage -s1
        !          2830:         movl    a6@(8),sp@-     | empilage s2
        !          2831:         bsr     _addss          | calcul se s2+(-s1)
        !          2832:         bra     subssf
        !          2833:                                 | ici s1 = -2^31
        !          2834: 1$:     movl    #0x1000003,a6@(-12)
        !          2835:         movl    #0x1000003,a6@(-8)
        !          2836:         movl    #0x80000000,a6@(-4)| creation de 2^31 type entier
        !          2837:         pea     a6@(-12)        | empilage adresse de 2^31
        !          2838:         movl    a6@(8),sp@-     | empilage s2
        !          2839:         bsr     _addsi
        !          2840: subssf: unlk    a6
        !          2841:         rts
        !          2842:
        !          2843: #===================================================================#
        !          2844: #                                                                   #
        !          2845: #               Soustraction : entier - entier = entier             #
        !          2846: #                                                                   #
        !          2847: #       entree : a7@(4) pointe sur i2 de type I                     #
        !          2848: #                a7@(8) pointe sur i1 de type I                     #
        !          2849: #       sortie : d0 pointe sur i2 - i1 de type I (zone creee)       #
        !          2850: #                                                                   #
        !          2851: #===================================================================#
        !          2852:
        !          2853: _subii: link    a6,#-4
        !          2854:         movl    a6@(12),sp@-    | empilage adresse i1
        !          2855:         movl    a6@(8),sp@-     | empilage adresse i2
        !          2856:         movl    a6@(12),a0      | a0 pointe sur i1
        !          2857:         negb    a0@(4)          | changer signe de i1
        !          2858:         movl    a0,a6@(-4)
        !          2859:         bsr     _addii
        !          2860:         movl    a6@(-4),a0
        !          2861:         negb    a0@(4)          | remettre signe de i1
        !          2862:         unlk    a6
        !          2863:         rts
        !          2864:
        !          2865: #===================================================================#
        !          2866: #                                                                   #
        !          2867: #               Soustraction : reel - reel = reel                   #
        !          2868: #                                                                   #
        !          2869: #       entree : a7@(4) pointe sur r2 de type R                     #
        !          2870: #                a7@(8) pointe sur r1 de type R                     #
        !          2871: #       sortie : d0 pointe sur r2 - r1 de type R (zone creee)       #
        !          2872: #                                                                   #
        !          2873: #===================================================================#
        !          2874:
        !          2875: _subrr: link    a6,#-4          | voir commentaires de _subii
        !          2876:         movl    a6@(12),sp@-
        !          2877:         movl    a6@(8),sp@-
        !          2878:         movl    a6@(12),a0
        !          2879:         negb    a0@(4)
        !          2880:         movl    a0,a6@(-4)
        !          2881:         bsr     _addrr
        !          2882:         movl    a6@(-4),a0
        !          2883:         negb    a0@(4)
        !          2884:         unlk    a6
        !          2885:         rts
        !          2886:
        !          2887: #===================================================================#
        !          2888: #                                                                   #
        !          2889: #       Soustraction : entier court - entier = entier               #
        !          2890: #                                                                   #
        !          2891: #       entree : a7@(4) contient s2 de type S                       #
        !          2892: #                a7@(8) pointe sur i1 de type I                     #
        !          2893: #       sortie : d0 pointe sur s2 - i1 de type I                    #
        !          2894: #                                                                   #
        !          2895: #===================================================================#
        !          2896:
        !          2897: _subsi: link    a6,#-4          | voir commentaires de _subii
        !          2898:         movl    a6@(12),sp@-
        !          2899:         movl    a6@(8),sp@-
        !          2900:         movl    a6@(12),a0
        !          2901:         negb    a0@(4)
        !          2902:         movl    a0,a6@(-4)
        !          2903:         bsr     _addsi
        !          2904:         movl    a6@(-4),a0
        !          2905:         negb    a0@(4)
        !          2906:         unlk    a6
        !          2907:         rts
        !          2908:
        !          2909: #===================================================================#
        !          2910: #                                                                   #
        !          2911: #               Soustraction : entier court - reel = reel           #
        !          2912: #                                                                   #
        !          2913: #       entree : a7@(4) contient s2 de type S                       #
        !          2914: #                a7@(8) pointe sur r1 de type R                     #
        !          2915: #       sortie : d0 pointe sur s2 - r1 de type R (zone creee)       #
        !          2916: #                                                                   #
        !          2917: #===================================================================#
        !          2918:
        !          2919: _subsr: link    a6,#-4          | voir commentaires de _subii
        !          2920:         movl    a6@(12),sp@-
        !          2921:         movl    a6@(8),sp@-
        !          2922:         movl    a6@(12),a0
        !          2923:         negb    a0@(4)
        !          2924:         movl    a0,a6@(-4)
        !          2925:         bsr     _addsr
        !          2926:         movl    a6@(-4),a0
        !          2927:         negb    a0@(4)
        !          2928:         unlk    a6
        !          2929:         rts
        !          2930:
        !          2931: #===================================================================#
        !          2932: #                                                                   #
        !          2933: #       Soustraction : entier - entier court = entier               #
        !          2934: #                                                                   #
        !          2935: #       entree : a7@(4) pointe sur i1 de type I                     #
        !          2936: #                a7@(8) contient s2 de type S                       #
        !          2937: #       sortie : d0 pointe sur i1 - s2 de type I (zone creee)       #
        !          2938: #                                                                   #
        !          2939: #===================================================================#
        !          2940:
        !          2941: _subis: link    a6,#-12         | voir commentaires de _subss
        !          2942:         movl    a6@(8),sp@-
        !          2943:         movl    a6@(12),d1
        !          2944:         negl    d1
        !          2945:         bvs     1$
        !          2946:         movl    d1,sp@-
        !          2947:         bsr     _addsi
        !          2948:         bra     subisf
        !          2949: 1$:     movl    #0x1000003,a6@(-12)
        !          2950:         movl    #0x1000003,a6@(-8)
        !          2951:         movl    #0x80000000,a6@(-4)
        !          2952:         pea     a6@(-12)
        !          2953:         bsr     _addii
        !          2954: subisf: unlk    a6
        !          2955:         rts
        !          2956:
        !          2957: #===================================================================#
        !          2958: #                                                                   #
        !          2959: #               Soustraction : entier - reel = reel                 #
        !          2960: #                                                                   #
        !          2961: #       entree : a7@(4) pointe sur i2 de type I                     #
        !          2962: #                a7@(8) pointe sur r1 de type R                     #
        !          2963: #       sortie : d0 pointe sur i2 - r1 de type R (zone creee)       #
        !          2964: #                                                                   #
        !          2965: #===================================================================#
        !          2966:
        !          2967: _subir: link    a6,#-4          | voir commentaires de _subii
        !          2968:         movl    a6@(12),sp@-
        !          2969:         movl    a6@(8),sp@-
        !          2970:         movl    a6@(12),a0
        !          2971:         negb    a0@(4)
        !          2972:         movl    a0,a6@(-4)
        !          2973:         bsr     _addir
        !          2974:         movl    a6@(-4),a0
        !          2975:         negb    a0@(4)
        !          2976:         unlk    a6
        !          2977:         rts
        !          2978:
        !          2979: #===================================================================#
        !          2980: #                                                                   #
        !          2981: #               Soustraction : reel - entier = reel                 #
        !          2982: #                                                                   #
        !          2983: #       entree : a7@(4) pointe sur r1 de type R                     #
        !          2984: #                a7@(8) pointe sur i2 de type I                     #
        !          2985: #       sortie : d0 pointe sur r2 - i1 de type R (zone creee)       #
        !          2986: #                                                                   #
        !          2987: #===================================================================#
        !          2988:
        !          2989: _subri: link    a6,#-4          | voir commentaires de _subii
        !          2990:         movl    a6@(8),sp@-
        !          2991:         movl    a6@(12),sp@-
        !          2992:         movl    a6@(12),a0
        !          2993:         negb    a0@(4)
        !          2994:         movl    a0,a6@(-4)
        !          2995:         bsr     _addir
        !          2996:         movl    a6@(-4),a0
        !          2997:         negb    a0@(4)
        !          2998:         unlk    a6
        !          2999:         rts
        !          3000:
        !          3001: #===================================================================#
        !          3002: #                                                                   #
        !          3003: #       Soustraction : reel - entier court = reel                   #
        !          3004: #                                                                   #
        !          3005: #       entree : a7@(4) pointe sur r2 de type R                     #
        !          3006: #                a7@(8) contient s1 de type S                       #
        !          3007: #       sortie : d0 pointe sur r2 - s1 de type R (zone creee)       #
        !          3008: #                                                                   #
        !          3009: #===================================================================#
        !          3010:
        !          3011: _subrs: link    a6,#-12         | voir commentaires de _subss
        !          3012:         movl    a6@(8),sp@-
        !          3013:         movl    a6@(12),d1
        !          3014:         negl    d1
        !          3015:         bvs     1$
        !          3016:         movl    d1,sp@-
        !          3017:         bsr     _addsr
        !          3018:         bra     subsrf
        !          3019: 1$:     movl    #0x1000003,a6@(-12)
        !          3020:         movl    #0x1000003,a6@(-8)
        !          3021:         movl    #0x80000000,a6@(-4)
        !          3022:         pea     a6@(-12)
        !          3023:         bsr     _addir
        !          3024: subsrf: unlk    a6
        !          3025:         rts
        !          3026:
        !          3027:
        !          3028:
        !          3029:
        !          3030:
        !          3031: #*******************************************************************#
        !          3032: #*******************************************************************#
        !          3033: #**                                                               **#
        !          3034: #**                     PROGRAMMES DE MULTIPLICATION              **#
        !          3035: #**                                                               **#
        !          3036: #*******************************************************************#
        !          3037: #*******************************************************************#
        !          3038:
        !          3039:
        !          3040:
        !          3041:
        !          3042:
        !          3043: #===================================================================#
        !          3044: #                                                                   #
        !          3045: #                       Multiplication generale                     #
        !          3046: #                                                                   #
        !          3047: #       entree : a7@(4) pointe sur n2 de type I ou R                #
        !          3048: #                a7@(8) pointe sur n1 de type I ou R                #
        !          3049: #       sortie : d0 pointe sur n2 * n1 de type I ou R (zone cree)   #
        !          3050: #       interdit : type S                                           #
        !          3051: #       precision : voir routines specialisees                      #
        !          3052: #                                                                   #
        !          3053: #===================================================================#
        !          3054:
        !          3055: _mpmul: movl    sp@(4),a0
        !          3056:         movl    sp@(8),a1       | a1 et a0 pointent sur n1 et n2
        !          3057:         movb    a0@,d0
        !          3058:         movb    a1@,d1          | d1.b et d0.b contiennent T1 et T2
        !          3059:         cmpb    d1,d0
        !          3060:         ble     1$
        !          3061:                                 | ici T2 > T1
        !          3062:         exg     a1,a0
        !          3063:         exg     d1,d0
        !          3064:         movl    a0,sp@(4)
        !          3065:         movl    a1,sp@(8)
        !          3066:                                 | ici T2 <= T1
        !          3067: 1$:     cmpb    #1,d1
        !          3068:         beq     _asmmulii          | ici T1 = T2 = I
        !          3069: 2$:     cmpb    #2,d0
        !          3070:         beq     _mulrr          | ici T1 = T2 = R
        !          3071:         bra     _mulir
        !          3072:
        !          3073: #===================================================================#
        !          3074: #                                                                   #
        !          3075: #               Multiplication (par valeur)                         #
        !          3076: #                                                                   #
        !          3077: #       entree : a7@(4) pointe sur n2 de type I ou R                #
        !          3078: #                a7@(8) pointe sur n1 de type I ou R                #
        !          3079: #                a7@(12) pointe sur n3 de type I ou R               #
        !          3080: #       sortie : la zone pointee par a7@(12) contient n2*n1         #
        !          3081: #       interdit : type S                                           #
        !          3082: #                                                                   #
        !          3083: #===================================================================#
        !          3084:
        !          3085: _mpmulz:lea     _mpmul,a0
        !          3086:         bra     mpopz
        !          3087:
        !          3088:                                 | multiplication S*S=I ou R
        !          3089:
        !          3090: _mulssz:lea     _mulss,a0
        !          3091:         bra     mpopz
        !          3092:
        !          3093:                                 | multiplication S*I=I ou R
        !          3094:
        !          3095: _mulsiz:lea     _mulsi,a0
        !          3096:         bra     mpopz
        !          3097:
        !          3098:                                 | multiplication S*R=R sinon erreur
        !          3099:
        !          3100: _mulsrz:lea     _mulsr,a0
        !          3101:         bra     mpopz
        !          3102:
        !          3103:                                 | multiplication I*I=I ou R
        !          3104:
        !          3105: _muliiz:lea     _asmmulii,a0
        !          3106:         bra     mpopz
        !          3107:
        !          3108:                                 | multiplication I*R=R sinon erreur
        !          3109:
        !          3110: _mulirz:lea     _mulir,a0
        !          3111:         bra     mpopz
        !          3112:
        !          3113:                                 | multiplication R*R=R sinon erreur
        !          3114:
        !          3115: _mulrrz:lea     _mulrr,a0
        !          3116:         bra     mpopz
        !          3117:
        !          3118: #===================================================================#
        !          3119: #                                                                   #
        !          3120: #       Multiplication : entier court * entier court = entier       #
        !          3121: #                                                                   #
        !          3122: #       entree : a7@(4) contient s2 de type S                       #
        !          3123: #                a7@(8) contient s1 de type S                       #
        !          3124: #       sortie : d0 pointe sur s2 * s1 de type I (zone creee)       #
        !          3125: #                                                                   #
        !          3126: #===================================================================#
        !          3127:
        !          3128: _mulss: link    a6,#-2
        !          3129:         moveml  d2-d4,sp@-
        !          3130:         movl    a6@(8),d2       | d2.l contient s2
        !          3131:         bne     1$
        !          3132: 2$:     movl   _gzero,d0       | ici s2 ou s1 = 0
        !          3133:         bra     mulssg
        !          3134:                                 | ici s2 <> 0
        !          3135: 1$:     movl    d2,d4
        !          3136:         bpl     3$
        !          3137:         negl    d2              | d2.l contient |s2|
        !          3138: 3$:     movl    a6@(12),d1      | d1.l contient s1
        !          3139:         beq     2$              | si s1=0
        !          3140:         eorl    d1,d4
        !          3141:         tstl    d1
        !          3142:         bpl     4$
        !          3143:         negl    d1              | d1.l contient |s1|
        !          3144: 4$:     mulul   d1,d3:d2
        !          3145:         movw    #4,d0
        !          3146:         tstl    d3
        !          3147:         bne     5$
        !          3148:         movw    #3,d0           | d0 recoit 3 ou 4 pour allocation
        !          3149: 5$:     bsr     geti
        !          3150:         movw    a0@(2),a0@(6)   | met long effect.
        !          3151:         movb    #1,a0@(4)       | met signe
        !          3152:         tstl    d4
        !          3153:         bpl     6$
        !          3154:         negb    a0@(4)
        !          3155: 6$:     tstl    d3
        !          3156:         bne     7$
        !          3157:         movl    d2,a0@(8)
        !          3158:         bra     mulssf
        !          3159: 7$:     movl    d3,a0@(8)
        !          3160:         movl    d2,a0@(12)
        !          3161: mulssf: movl    a0,d0
        !          3162: mulssg: moveml  sp@+,d2-d4
        !          3163:         unlk    a6
        !          3164:         rts
        !          3165:
        !          3166: #===================================================================#
        !          3167: #                                                                   #
        !          3168: #       Multiplication : entier court * entier = entier             #
        !          3169: #                                                                   #
        !          3170: #       entree : a7@(4) contient s2 de type S                       #
        !          3171: #                a7@(8) pointe sur i1 de type I                     #
        !          3172: #       sortie : d0 pointe sur s2 * i1  de type I (zone creee)      #
        !          3173: #                                                                   #
        !          3174: #===================================================================#
        !          3175:
        !          3176: _mulsi: link    a6,#0
        !          3177:         moveml  d2-d6/a2,sp@-
        !          3178:         movl    a6@(8),d2       | d2.l contient s2
        !          3179:         bne     1$
        !          3180:                                 | ici s2 = 0 ou i1 = 0
        !          3181: 2$:     movl   _gzero,d0
        !          3182:         bra     mulsig
        !          3183:                                 | ici s2 <> 0
        !          3184: 1$:     bpl     6$
        !          3185:         negl    d2              | d2 contient |s2|
        !          3186: 6$:     movl    a6@(12),a1      | a1 pointe sur i1
        !          3187:         tstb    a1@(4)
        !          3188:         beq     2$              | si i1 = 0
        !          3189:                                 | ici i1 <> 0 et s2 <> 0
        !          3190:         movw    a1@(6),d0       | d0.w contient le1
        !          3191:         bsr     geti
        !          3192:         lea     a0@(0,d0:w:4),a2| a2 pointe apres resultat (i0)
        !          3193:         lea     a1@(0,d0:w:4),a1| a1 pointe apres i1
        !          3194:         subqw   #3,d0
        !          3195:         moveq   #0,d6
        !          3196:         moveq   #0,d5           | initialisation retenue
        !          3197:                                 | debut boucle multiplication
        !          3198: 3$:     movl    a1@-,d4
        !          3199:         mulul   d2,d3:d4
        !          3200:         addl    d5,d4
        !          3201:         addxl   d6,d3
        !          3202:         movl    d4,a2@-
        !          3203:         movl    d3,d5
        !          3204:         dbra    d0,3$
        !          3205:         beq     5$
        !          3206:                                 | ici retenue finale
        !          3207:         movw    #1,d0
        !          3208:         bsr     geti
        !          3209:         movw    a0@(6),d0
        !          3210:         addqw   #1,d0           | d0.w contient le(i0)
        !          3211:         bvc     4$
        !          3212:                                 | ici debordement
        !          3213:         movl    #muler3,sp@-
        !          3214:         jsr     _pari_err
        !          3215: 4$:     movw    d0,a0@(2)       | mise longueur
        !          3216:         movl    d5,a0@(8)       | mise retenue
        !          3217: 5$:     movw    a0@(2),a0@(6)   | mise le(i0)
        !          3218:         movb    a1@(-4),a0@(4)
        !          3219:         tstl    a6@(8)
        !          3220:         bpl     mulsif
        !          3221:         negb    a0@(4)          | mise signe
        !          3222: mulsif: movl    a0,d0
        !          3223: mulsig: moveml  sp@+,d2-d6/a2
        !          3224:         unlk    a6
        !          3225:         rts
        !          3226:
        !          3227: #===================================================================#
        !          3228: #                                                                   #
        !          3229: #               Multiplication : entier court * reel = reel         #
        !          3230: #                                                                   #
        !          3231: #       entree : a7@(4) contient s2 de type S                       #
        !          3232: #                a7@(8) pointe sur r1 de type R                     #
        !          3233: #       sortie : d0 pointe sur s2 * r1 de type R                    #
        !          3234: #                        de longueur L = L1 (zone creee)            #
        !          3235: #                                                                   #
        !          3236: #===================================================================#
        !          3237:
        !          3238: _mulsr: link    a6,#-4
        !          3239:         moveml  d2-d6/a2,sp@-
        !          3240:         movl    a6@(8),d2       | d2.l contient s2
        !          3241:         bne     1$
        !          3242:                                 | ici s2 = 0
        !          3243:        movl    _gzero,d0
        !          3244:         bra     mulsrf1
        !          3245:                                 | ici s2 <> 0
        !          3246: 1$:     movl    a6@(12),a1      | a1 pointe sur r1
        !          3247:         tstb    a1@(4)
        !          3248:         bne     2$
        !          3249:                                 | ici r1 = 0
        !          3250:         moveq   #3,d0
        !          3251:         bsr     getr
        !          3252:         tstl    d2
        !          3253:         bpl     2$
        !          3254:         negl    d2
        !          3255:         bfffo   d2{#0:#0},d0
        !          3256:         movl    a1@(4),d1
        !          3257:         addl    #31,d1
        !          3258:         subl    d0,d1
        !          3259:         cmpl    #0x1000000,d1
        !          3260:         bcc     11$
        !          3261:         movl    d1,a0@(4)
        !          3262:         clrl    a0@(8)
        !          3263:         movl    a0,d0
        !          3264:         bra     mulsrf1
        !          3265: 2$:     movw    a1@(2),d0
        !          3266:         bsr     getr            | allocation memoire pour resultat
        !          3267:         movl    a0,a6@(-4)      | sauvegarde adr. resultat ds var.locale
        !          3268:                                 | ici s2 et r1 <> 0
        !          3269:         movl    d2,d4
        !          3270:         bpl     3$
        !          3271:         negl    d2              | d2.l contient |s2|
        !          3272: 3$:     cmpl    #1,d2
        !          3273:         bne     4$
        !          3274:                                 | ici |s2| = 1
        !          3275:         addql   #4,a0
        !          3276:         addql   #4,a1
        !          3277:         subqw   #2,d0
        !          3278: 5$:     movl    a1@+,a0@+
        !          3279:         dbra    d0,5$           | copie de r1 dans resultat
        !          3280:         movl    a6@(-4),a0
        !          3281:         tstl    d4
        !          3282:         bpl     mulsrf
        !          3283:         negb    a0@(4)          | mise signe
        !          3284:         bra     mulsrf
        !          3285:                                 | ici |s2| <> 1 et 0 , r1 <> 0
        !          3286: 4$:     movb    a1@(4),a0@(4)
        !          3287:         tstl    d4
        !          3288:         bpl     6$
        !          3289:         negb    a0@(4)          | mise signe
        !          3290: 6$:     lea     a0@(0,d0:w:4),a0| a0 pointe apres resultat
        !          3291:         lea     a1@(0,d0:w:4),a1| a1 pointe apres r1
        !          3292:         subqw   #3,d0           | d0.w contient L1-1
        !          3293:         movw    d0,d4           | d4.w idem
        !          3294:         movw    d4,d6
        !          3295:         moveq   #0,d1           | d1 a 0 pour les addx
        !          3296:         moveq   #0,d0           | initialisation retenue d0
        !          3297:                                 | boucle de multiplication :
        !          3298: 7$:     movl    a1@-,d5
        !          3299:         mulul   d2,d3:d5
        !          3300:         addl    d0,d5
        !          3301:         addxl   d1,d3
        !          3302:         movl    d5,a0@-
        !          3303:         movl    d3,d0           | nouvelle retenue d0
        !          3304:         dbra    d6,7$
        !          3305:         bfffo   d0{#0:#0},d1    | d1.l contient nb. de shifts
        !          3306:         lsll    d1,d0           | normalisation de d0
        !          3307:         moveq   #1,d6
        !          3308:         lsll    d1,d6
        !          3309:         subql   #1,d6           | masque de shift
        !          3310:         negb    d1
        !          3311:         addb    #32,d1
        !          3312:                                 | boucle de shift
        !          3313: 8$:     movl    a0@,d2
        !          3314:         rorl    d1,d2
        !          3315:         movl    d2,d3
        !          3316:         andl    d6,d3
        !          3317:         subl    d3,d2
        !          3318:         addl    d3,d0
        !          3319:         movl    d0,a0@+
        !          3320:         movl    d2,d0
        !          3321:         dbra    d4,8$
        !          3322:         movl    a6@(-4),a0      | a0 pointe sur resultat
        !          3323:         movl    a1@(-4),d0
        !          3324:         andl    #0xffffff,d0    | d0.l contient fexp1
        !          3325:         addl    d1,d0           | d0.l contient fexp resultat
        !          3326:         btst    #24,d0
        !          3327:         beq     9$
        !          3328:                                 | ici debordement
        !          3329: 11$:    movl    #muler2,sp@-
        !          3330:         jsr     _pari_err
        !          3331: 9$:     movw    d0,a0@(6)       | mise exposant
        !          3332:         swap    d0
        !          3333:         movb    d0,a0@(5)
        !          3334: mulsrf: movl    a6@(-4),d0      | adresse du resultat
        !          3335: mulsrf1:moveml  sp@+,d2-d6/a2
        !          3336:         unlk    a6
        !          3337:         rts
        !          3338:
        !          3339: #===================================================================#
        !          3340: #                                                                   #
        !          3341: #               Multiplication : entier * entier = entier           #
        !          3342: #                                                                   #
        !          3343: #       entree : a7@(4) pointe sur i2 de type I                     #
        !          3344: #                a7@(8) pointe sur i1 de type I                     #
        !          3345: #       sortie : d0 pointe sur i2 * i1 de type I (zone creee)       #
        !          3346: #                                                                   #
        !          3347: #===================================================================#
        !          3348:
        !          3349: _asmmulii: link    a6,#0
        !          3350:         moveml  d2-d7/a2-a4,sp@-
        !          3351:         movl    a6@(8),a1
        !          3352:         movl    a6@(12),a2      | a1,a2 pointent sur i1,i2
        !          3353:         movw    a1@(6),d1
        !          3354:         movw    a2@(6),d2       | d1.w, d2.w contient l1,l2
        !          3355:         cmpw    d1,d2
        !          3356:         bcc     1$
        !          3357:                                 | ici l1>l2 : echanger i1 et i2
        !          3358:         exg     a1,a2
        !          3359:         exg     d1,d2           | maintenant l1<=l2
        !          3360: 1$:     subqw   #2,d1           | d1 recoit L1
        !          3361:         bne     2$
        !          3362:                                 | ici L1=0  <==> i1*i2 = 0
        !          3363: 6$:     movl   _gzero,d0       | cree resultat nul de type I
        !          3364:         bra     muliig
        !          3365:                                 | maintenant 1<=L1<=L2
        !          3366: 2$:     movw    d2,d0           | d0 recoit l2
        !          3367:         addw    d1,d0           | d0 recoit l2 + L1 = L1 + L2 + 2
        !          3368:         bvc     3$
        !          3369:         movl    #muler1,sp@-
        !          3370:         jsr     _pari_err            | debordement
        !          3371:         bra     6$
        !          3372: 3$:     bsr     geti            | allocation memoire pour resultat
        !          3373:         movw    d0,a0@(6)       | met long effect. (peut-etre 1 de trop)
        !          3374:         movb    a1@(4),d3
        !          3375:         movb    a2@(4),d4
        !          3376:         eorb    d4,d3
        !          3377:         addqb   #1,d3
        !          3378:         movb    d3,a0@(4)       | met signe du resultat
        !          3379:         lea     a0@(0,d0:w:4),a4| a4 pointe apres fin resultat = z
        !          3380:         lea     a1@(8,d1:w:4),a1| a1 pointe apres fin de i1 = y
        !          3381:         lea     a2@(0,d2:w:4),a3| a3 pointe apres fin de i2 = x
        !          3382:         subqw   #1,d1           | d1 recoit L1-1 compt bcl externe
        !          3383:         subqw   #3,d2           | d2 recoit L2-1 compt bcl interne
        !          3384:         movw    d2,d0           | sauvegarde compt interne dans d0
        !          3385:         moveq   #0,d7           | registre d7 fixe a 0
        !          3386:                                 | Boucles de multiplication I*I :
        !          3387: | x=x1x2...xn multiplicande (x=i2,n=L2) pointe par a2 et a3
        !          3388: | y=y1...ym multiplicateur (y=i1,m=L1) pointe par a1
        !          3389: | z=z1z2...z(n+m) resultat pointe par a0 et a4
        !          3390: | a0 et a2 sont decrementes par la boucle interne (les valeurs initiales
        !          3391: | etant conservees dans a4 et a3)
        !          3392: #...................................................................#
        !          3393:                                 | 1re boucle interne:initialise resultat
        !          3394:                                 | (z recoit x*ym)
        !          3395:         movl    a3,a2           | a2 pointe apres xn
        !          3396:         movl    a4,a0           | a0 pointe apres z(n+m)
        !          3397:         movl    a1@-,d3         | d3 recoit ym
        !          3398:        subl    d4,d4           | d4 retenue k et X initialise a 0
        !          3399: m1:    movl    d4,d6           | nouvelle retenue dans d6
        !          3400:        movl    d3,d5           | dupliquer le multiplicateur
        !          3401:         mulul   a2@-,d4:d5      | d4:d5 recoit xi*ym (i=n,n-1,...,1)
        !          3402:         addxl   d5,d6
        !          3403:         addxl   d7,d4           | d4:d5 recoit xi*ym + k
        !          3404:         movl    d6,a0@-         | range z(i+m)
        !          3405:         dbra    d2,m1           | fin 1re bcl interne
        !          3406:         bra     bclf            | brancher fin de boucle externe
        !          3407: mext:   subql   #4,a4           | a4 pointe apres z(n+i)
        !          3408:         movl    a3,a2           | a2 pointe apres xn
        !          3409:         movl    a4,a0           | a0 pointe apres z(n+i)
        !          3410:         movl    d0,d2           | d2 recoit n-1 compteur bcl interne
        !          3411:         movl    a1@-,d3         | d3 recoit yj (j=m-1,m-2...1)
        !          3412:        subl    d4,d4           | d4 retenue k et X initialise a 0
        !          3413: mint:  movl    d4,d6           | nouvelle retenue dans d6
        !          3414:        movl    d3,d5           | dupliquer le multiplicateur
        !          3415:         mulul   a2@-,d4:d5      | d4:d5 recoit xi*yj (i=n,n-1,...,1)
        !          3416:         addxl   d5,d6
        !          3417:         addxl   d7,d4           | d4:d5 recoit xi*yj + k
        !          3418:         addl    d6,a0@-         | range partie basse de xi*yj+z(i+j)+k
        !          3419:         dbra    d2,mint         | fin de boucle interne
        !          3420:        addxl   d7,d4
        !          3421: bclf:   movl    d4,a0@-         | range derniere retenue
        !          3422:         dbra    d1,mext         | fin bcl externe
        !          3423: #...................................................................#
        !          3424:                                 | derniere retenue = 0 ?
        !          3425:         beq     4$
        !          3426:         subql   #8,a0           | non : rien a faire
        !          3427:                                 | a0 pointe sur resultat
        !          3428:         bra     muliif
        !          3429:                                 | ici pas de retenue finale
        !          3430: 4$:     subqw   #1,a0@(-2)
        !          3431:         subqw   #1,a0@(-6)      | rectifier longueurs
        !          3432:         movl    a0@(-4),a0@     | deplacer mots codes
        !          3433:         movl    a0@(-8),a0@-    | a0 pointe sur resultat
        !          3434:         addl    #4,_avma
        !          3435: muliif: movl    a0,d0
        !          3436: muliig: moveml  sp@+,d2-d7/a2-a4
        !          3437:         unlk    a6
        !          3438:         rts
        !          3439:
        !          3440: #===================================================================#
        !          3441: #                                                                   #
        !          3442: #               Multiplication : reel * reel = reel                 #
        !          3443: #                                                                   #
        !          3444: #       entree : a7@(4) pointe sur r2 de type R                     #
        !          3445: #                a7@(8) pointe sur r1 de type R                     #
        !          3446: #       sortie : d0 pointe sur r2 * r1 de type R (zone creee)       #
        !          3447: #                                                                   #
        !          3448: #       precision : L = inf ( L1 , L2 )                             #
        !          3449: #                                                                   #
        !          3450: #===================================================================#
        !          3451:
        !          3452: _mulrr: link    a6,#-20          | variables locales pour murr aussi
        !          3453:         moveml  d2-d7/a2-a4,sp@-
        !          3454:         movl    a6@(8),a1       | a1 pointe sur r1
        !          3455:         movl    a6@(12),a2      | a2 pointe sur r2
        !          3456:         movb    a1@(4),d0
        !          3457:         andb    a2@(4),d0
        !          3458:         bne     munzr
        !          3459:                                 | ici r1 ou r2 = 0
        !          3460: muzr:   moveq   #3,d0
        !          3461:         bsr     getr
        !          3462:         movl    a0,a6@(-8)
        !          3463:         movl    a1@(4),d1
        !          3464:         andl    #0xffffff,d1    | exposant de x1
        !          3465:         movl    a2@(4),d2
        !          3466:         andl    #0xffffff,d2    | exposant de y
        !          3467:         addl    d2,d1
        !          3468:         subl    #0x800000,d1
        !          3469:         cmpl    #0x1000000,d1
        !          3470:         bcs     1$
        !          3471:         movl    #muler4,sp@-    | debordement r*r
        !          3472:         jsr     _pari_err
        !          3473: 1$:     tstl    d1
        !          3474:         bgt     2$
        !          3475:         movl    #muler5,sp@-    | underflow r*r
        !          3476:         jsr     _pari_err
        !          3477: 2$:     movl    d1,a0@(4)
        !          3478:         clrl    a0@(8)
        !          3479:         bra     mulrrf
        !          3480:
        !          3481: munzr:  movw    a2@(2),d0
        !          3482:        clrl    a6@(-12)        | Initialiser flag a 0
        !          3483:         cmpw    a1@(2),d0
        !          3484:         bls     1$
        !          3485:         movw    a1@(2),d0       | d0.w contient L+2=inf(L1,L2)+2
        !          3486:         exg     a1,a2           | a2 pointe sur le + court
        !          3487:        bra     2$
        !          3488: 1$:    bne     2$
        !          3489:         lea     a1@(0,d0:w:4),a3 | a3 pointe sur x[L+1]
        !          3490:        movl    a3,a6@(-12)     | longueurs egales: flag egal adresse
        !          3491:        movl    a3@,a6@(-16)    | sauvegarde de x[L+1]
        !          3492:        clrl    a3@
        !          3493: 2$:     bsr     getr
        !          3494:         movl    a0,a6@(-8)
        !          3495:         bsr     murr            | effectuer la multiplication
        !          3496:        tstl    a6@(-12)
        !          3497:        beq     mulrrf
        !          3498:        movl    a6@(-12),a3
        !          3499:        movl    a6@(-16),a3@    | remettre x[L+1]
        !          3500: mulrrf: movl    a6@(-8),d0      | adresse du resultat
        !          3501:         moveml  sp@+,d2-d7/a2-a4
        !          3502:         unlk    a6
        !          3503:         rts
        !          3504:
        !          3505: #-------------------------------------------------------------------#
        !          3506: #       module interne de multiplication r0=r1*r2                   #
        !          3507: #               ( pour R*R et I*R)                                  #
        !          3508: #       entree : a1 et a2 pointent sur 2 reels                      #
        !          3509: #       r1,r2  non nuls avec L1>=L2=m                               #
        !          3510: #                a0 pointe sur une zone reelle de long l1           #
        !          3511: #       sortie : le produit r0 est mis a l'addresse a0              #
        !          3512: #                                                                   #
        !          3513: #-------------------------------------------------------------------#
        !          3514:
        !          3515: | notation : r1 = x = x1x2...xmx(m+1)...  multiplicande
        !          3516: |            r2 = y = y1y2...ym           multiplicateur
        !          3517: |       ( le lgmot x(m+1) peut ne pas exister ! ( le1 >= le2 = m ) )
        !          3518: |             z = z0z1z2...zmz(m+1) resultat.
        !          3519: |       ( z0=0 ou 1 et z(m+1) a jeter)
        !          3520:
        !          3521: murr:   movl    a1,a3
        !          3522:         lea     a3@(12),a3      | a3 pointe sur x2 (2me lgmot mant.x)
        !          3523: #       movw    a2@(2),d0       | d0.w=L2=m long commune des mantisses (mis a l'appel!)
        !          3524:         lea     a2@(0,d0:w:4),a2| a2 pointe apres ym
        !          3525:         lea     a0@(0,d0:w:4),a0| a0 pointe apres zm
        !          3526:         movl    a0@,a6@(-4)     | on sauvegarde le lg mot suivant z
        !          3527:         clrl    a0@+            | z(m+1) recoit 0,a0 pointe apres z(m+1)
        !          3528:         subqw   #3,d0           | d0 recoit m-1
        !          3529:         movl    d0,a6@(-20)     | sauvegarde m-1 compt. bcl externe
        !          3530:         clrw    d3              | d3=0,val initiale compt bcl interne
        !          3531:                                 | Boucles triangulaires mult. R*R
        !          3532: #...................................................................#
        !          3533: bext:   movl    a0,a4           | a4 pointe apres z(m+1)
        !          3534:         movl    a3,a1           | a1 pointe sur x(j+1) (j=1,2...m)
        !          3535:         movw    d3,d2           | d3 recoit m-j compt bcl interne
        !          3536:         movl    a2@-,d4         | d4 recoit yj
        !          3537:         movl    a3@+,d5         | d5 recoit x(j+1)
        !          3538:        subl    d1,d1           | d1 a zero ainsi que bit X
        !          3539:         mulul   d4,d7:d5        | init.retenue d7(ignorer poids faible)
        !          3540: bint:   movl   d7,d6           | sauvegarder nouvelle retenue
        !          3541:        movl    d4,d5           | dupliquer multiplicateur
        !          3542:         mulul   a1@-,d7:d5      | d7:d5 recoit xi*yj
        !          3543:         addxl   d5,d6
        !          3544:         addxl   d1,d7           | d7:d5 recoit xi*yj + k
        !          3545:         addl    d6,a4@-         | nouveau z(i+j)
        !          3546:         dbra    d2,bint
        !          3547:        addxl   d1,d7
        !          3548:         movl    d7,a4@-         | range derniere retenue
        !          3549:         addqw   #1,d3           | augmente de 1 long bcl interne
        !          3550:         dbra    d0,bext         | fin bcl externe
        !          3551: #...................................................................#
        !          3552:         movl    a1@(-4),d1      | a1 pointe sur x1 (1er mot mant de x)
        !          3553:         andl    #0xffffff,d1    | exposant de x1
        !          3554:         movl    a2@(-4),d2      | a2 pointe sur y1
        !          3555:         andl    #0xffffff,d2    | exposant de y
        !          3556:         addl    d2,d1
        !          3557:         subl    #0x800000,d1
        !          3558:         tstl    a4@             | a4 pointe sur z1 : z normalise ?
        !          3559:         bpl     1$
        !          3560:         addl    #1,d1           | ici mantisse normalisee
        !          3561:         bra     2$
        !          3562:                                 | ici il faut shifter de 1 a gauche
        !          3563: 1$:     movl    a0,a4           | a4 pointe apres z(m+1)
        !          3564:         subqw   #2,a4
        !          3565:        movl    a6@(-20),d0     | recuperer m-1
        !          3566:         roxlw   a4@-            | initialise le carry
        !          3567: 5$:     roxlw   a4@-            | shift par mots (d0 compteur=m-1)
        !          3568:         roxlw   a4@-
        !          3569:         dbra    d0,5$           | boucle de shift
        !          3570: 2$:     cmpl    #0x1000000,d1
        !          3571:         bcs     3$
        !          3572:         movl    #muler4,sp@-    | debordement r*r
        !          3573:         jsr     _pari_err
        !          3574: 3$:     tstl    d1
        !          3575:         bgt     4$
        !          3576:         movl    #muler5,sp@-    | underflow r*r
        !          3577:         jsr     _pari_err
        !          3578: 4$:     movl    d1,a4@-         | range exposant
        !          3579:         movb    a1@(-4),d1
        !          3580:         movb    a2@(-4),d2      | signes
        !          3581:         eorb    d2,d1
        !          3582:         addqb   #1,d1
        !          3583:         movb    d1,a4@          | range signe resultat
        !          3584:         movl    a6@(-4),a0@(-4) | remet en place mot sous z(m+1)
        !          3585: murrf:  rts
        !          3586:
        !          3587: #===================================================================#
        !          3588: #                                                                   #
        !          3589: #               Multiplication : entier * reel = reel               #
        !          3590: #                                                                   #
        !          3591: #       entree : a7@(4) pointe sur i2 de type I                     #
        !          3592: #                a7@(8) pointe sur r1 de type R                     #
        !          3593: #       sortie : d0 pointeur sur i2 * r1 de type R (zone creee)     #
        !          3594: #                                                                   #
        !          3595: #===================================================================#
        !          3596:
        !          3597: _mulir: link    a6,#-20
        !          3598:         moveml  d2-d7/a2-a4,sp@-
        !          3599:         movl    a6@(8),a2       | a2 pointe sur i2
        !          3600:         tstb    a2@(4)
        !          3601:         bne     1$
        !          3602:                                 | ici i2 = 0
        !          3603:        movl    _gzero,d0
        !          3604:         bra     mulirf1
        !          3605:                                 | ici i2 <> 0
        !          3606: 1$:     movl    a6@(12),a1      | a1 pointe sur r1
        !          3607:         tstb    a1@(4)
        !          3608:         bne     2$
        !          3609:                                 | ici r1 = 0
        !          3610:         moveq   #3,d0
        !          3611:         bsr     getr
        !          3612:         movw    a2@(6),d0
        !          3613:         lsll    #5,d0
        !          3614:         bfffo   a2@(8){#0:#0},d1
        !          3615:         subl    d1,d0
        !          3616:         subl    #65,d0
        !          3617:         addl    a1@(4),d0
        !          3618:         cmpl    #0x1000000,d0
        !          3619:         bcs     3$
        !          3620:         movl    #muler6,sp@-    | overflow I*R, R = 0
        !          3621:         jsr     _pari_err
        !          3622: 3$:     movl    d0,a0@(4)
        !          3623:         clrl    a0@(8)
        !          3624:         movl    a0,d0
        !          3625:         bra     mulirf1
        !          3626:                                 | ici i2 <> 0 et r1<> 0
        !          3627: 2$:     movw    a1@(2),d0
        !          3628:         bsr     getr            | allocation memoire pour resultat
        !          3629:         movl    a0,a6@(-8)      | sauvegarde adresse resultat
        !          3630:        addqw   #1,d0
        !          3631:         bsr     getr            | allocation mem pour conversion i2->r2
        !          3632:         movl    a0,a7@-
        !          3633:         movl    a2,a7@-
        !          3634:         bsr     _affir
        !          3635:         addql   #4,sp
        !          3636:         movl    a7@,a2          | a2 recoit adr de r2=i2 (reste en pile)
        !          3637:         movl    a6@(-8),a0      | a0 recoit addresse du resultat
        !          3638:        exg     a1,a2           | Il faut que a2 soit le plus court!
        !          3639:        movw    a2@(2),d0       | Mettre la plus petite longueur dans d0 pour murr
        !          3640:         bsr     murr
        !          3641:         movl    a7@+,a0
        !          3642:         bsr     giv
        !          3643: mulirf: movl    a6@(-8),d0
        !          3644: mulirf1:moveml  sp@+,d2-d7/a2-a4
        !          3645:         unlk    a6
        !          3646:         rts
        !          3647:
        !          3648:
        !          3649:
        !          3650:
        !          3651:
        !          3652: #*******************************************************************#
        !          3653: #*******************************************************************#
        !          3654: #**                                                               **#
        !          3655: #**             PROGRAMMES DE DIVISION AVEC RESTE                 **#
        !          3656: #**                                                               **#
        !          3657: #*******************************************************************#
        !          3658: #*******************************************************************#
        !          3659:
        !          3660:
        !          3661:
        !          3662:
        !          3663:
        !          3664: #===================================================================#
        !          3665: #                                                                   #
        !          3666: #               Division avec reste (par valeur)                    #
        !          3667: #                                                                   #
        !          3668: #       entree : a7@(4) pointe sur n2 de type I                     #
        !          3669: #                a7@(8) pointe sur n1 de type I                     #
        !          3670: #                a7@(12) pointe sur n3 de type I                    #
        !          3671: #                a7@(16) pointe sur n4 de type I                    #
        !          3672: #       sortie : la zone pointee par a7@(12) contient n2 / n1       #
        !          3673: #                la zone pointee par a7@(16) contient le reste (du  #
        !          3674: #                signe du dividende)                                #
        !          3675: #       interdit : type S et R                                      #
        !          3676: #                                                                   #
        !          3677: #===================================================================#
        !          3678:
        !          3679: _mpdvmdz:lea    _asmdvmdii,a0
        !          3680:         bra     mpopii
        !          3681:
        !          3682:                                 | division avec reste S/S=(I et I)
        !          3683:                                 | sinon erreur
        !          3684:
        !          3685: _dvmdssz:lea    _dvmdss,a0
        !          3686:         bra     mpopii
        !          3687:
        !          3688:                                 | division avec reste S/I=(I et I)
        !          3689:                                 | sinon erreur
        !          3690:
        !          3691: _dvmdsiz:lea    _dvmdsi,a0
        !          3692:         bra     mpopii
        !          3693:
        !          3694:                                 | division avec reste I/S=(I et I)
        !          3695:                                 | sinon erreur
        !          3696:
        !          3697: _dvmdisz:lea    _dvmdis,a0
        !          3698:         bra     mpopii
        !          3699:
        !          3700:                                 | division avec reste I/I=(I et I)
        !          3701:                                 | sinon erreur
        !          3702:
        !          3703: _dvmdiiz:lea    _asmdvmdii,a0
        !          3704:         bra     mpopii
        !          3705:
        !          3706: #===================================================================#
        !          3707: #                                                                   #
        !          3708: #Division avec reste : entier court / entier court =(entier,entier) #
        !          3709: #                                                                   #
        !          3710: #       entree : a7@(4) contient s2 de type S                       #
        !          3711: #                a7@(8) contient s1 de type S                       #
        !          3712: #       sortie : a7@(12) pointe sur l'adresse du futur reste        #
        !          3713: #                d0 pointe sur s2 div s1 de type I                  #
        !          3714: #                le reste est du signe de s2 (zone creee)           #
        !          3715: #                                                                   #
        !          3716: #===================================================================#
        !          3717:
        !          3718: _dvmdss:link    a6,#0
        !          3719:         movl    d2,sp@-
        !          3720:         movl    a6@(12),sp@-    | empilage s1
        !          3721:         movl    a6@(8),sp@-     | empilage s2
        !          3722:         bsr     _divss
        !          3723: dmd:    addql   #8,sp
        !          3724:         tstl    d1
        !          3725:         bne     1$
        !          3726:                                 | ici reste nul
        !          3727:        movl    _gzero,a0
        !          3728:         bra     dvmdssf
        !          3729:                                 | ici reste non nul
        !          3730: 1$:     movl    d0,d2
        !          3731:         moveq   #3,d0
        !          3732:         bsr     geti
        !          3733:         movl    #0x1000003,a0@(4)
        !          3734:         tstl    d1
        !          3735:         bpl     2$
        !          3736:         negl    d1
        !          3737:         movb    #-1,a0@(4)
        !          3738: 2$:     movl    d1,a0@(8)
        !          3739:         movl    d2,d0
        !          3740: dvmdssf:movl    a6@(16),a1
        !          3741:         movl    a0,a1@
        !          3742:         movl    sp@,d2
        !          3743:         unlk    a6
        !          3744:         rts
        !          3745:
        !          3746: #===================================================================#
        !          3747: #                                                                   #
        !          3748: #   Division avec reste : entier court / entier = (entier,entier)   #
        !          3749: #                                                                   #
        !          3750: #       entree : a7@(4) contient s2 de type S                       #
        !          3751: #                a7@(8) pointe sur i1 de type I                     #
        !          3752: #                a7@(12) pointe sur l'adresse du futur reste        #
        !          3753: #       sortie : d0 pointe sur s2 div i1 de type I ;                #
        !          3754: #                reste du signe de s2 (zones creees)                #
        !          3755: #                                                                   #
        !          3756: #===================================================================#
        !          3757:
        !          3758: _dvmdsi:movl    a7@(8),sp@-
        !          3759:         movl    a7@(8),sp@-
        !          3760:         bsr     _divsi
        !          3761: dmdi:   addql   #8,sp
        !          3762:         tstl    d1
        !          3763:         bne     1$
        !          3764:                                 | ici reste nul
        !          3765:        movl    _gzero,sp@(12)@
        !          3766:        rts
        !          3767:                                 | ici reste non nul
        !          3768: 1$:     movl    d0,a1           | sauvegarde adresse quotient
        !          3769:         moveq   #3,d0
        !          3770:         bsr     geti
        !          3771:         movl    #0x1000003,a0@(4)
        !          3772:         tstl    d1
        !          3773:         bpl     2$
        !          3774:         negl    d1
        !          3775:         movb    #-1,a0@(4)
        !          3776: 2$:     movl    d1,a0@(8)
        !          3777: 3$:     movl    a1,d0
        !          3778:         movl    a0,sp@(12)@
        !          3779:         rts
        !          3780:
        !          3781: #===================================================================#
        !          3782: #                                                                   #
        !          3783: #   Division avec reste : entier / entier court = (entier,entier)   #
        !          3784: #                                                                   #
        !          3785: #       entree : a7@(4) pointe sur i2 de type I                     #
        !          3786: #                a7@(8) contient s1 de type S                       #
        !          3787: #                a7@(12) pointe sur l'adresse du futur reste        #
        !          3788: #       sortie : d0 pointe sur i2 div s1 de type I                  #
        !          3789: #                reste de type I du signe de s1 (zones creees)      #
        !          3790: #                                                                   #
        !          3791: #===================================================================#
        !          3792:
        !          3793: _dvmdis:movl    a7@(8),sp@-
        !          3794:         movl    a7@(8),sp@-
        !          3795:         bsr     _divis
        !          3796:         bra     dmdi
        !          3797:
        !          3798: #===================================================================#
        !          3799: #                                                                   #
        !          3800: #       Division avec reste : entier / entier = (entier,entier)     #
        !          3801: #                                                                   #
        !          3802: #       entree : a7@(4) pointe sur i2 de type I (dividende)         #
        !          3803: #                a7@(8) pointe sur i1 de type I (diviseur)          #
        !          3804: #                a7@(12) contient un pointeur sur le reste si l'on  #
        !          3805: #                veut a la fois q et r, 0 si l'on ne veut que le    #
        !          3806: #                quotient, -1 si l'on ne veut que le reste          #
        !          3807: #       sortie : d0 pointe sur q si celui-ci est attendu, et sinon  #
        !          3808: #                sur r. a7@(12) pointe sur r si q et r sont attendus#
        !          3809: #                (toutes les zones sont creees)                     #
        !          3810: #       remarque : il s'agit de la 'fausse division' ; le reste est #
        !          3811: #                 du signe du dividende                             #
        !          3812: #                                                                   #
        !          3813: #                                                                   #
        !          3814: #       variables locales (etat pile apres link):                   #
        !          3815: #  -16 -14 -12 -10 -8  -6   -4    a6    4    8    12   16           #
        !          3816: #  +---+---+---+---+---+---+------+----+----+----+----+----+        #
        !          3817: #   n-m  k sgnq sgnr n   m  ad(q,r)      ret  i2   i1 ^r/0/-1       #
        !          3818: #                                                                   #
        !          3819: #===================================================================#
        !          3820:
        !          3821: _asmdvmdii:link    a6,#-32
        !          3822:         moveml  d2-d7/a2-a4,sp@-
        !          3823:         movl    a6@(12),a1      | a1 pointe sur le diviseur i1
        !          3824:         movw    a1@(6),d1       | d1.w contient le1
        !          3825:         cmpw    #2,d1
        !          3826:         bne     dv1
        !          3827:                                 | ici i1 = 0
        !          3828:         movl    #dvmer1,sp@-
        !          3829: dvmerr: jsr     _pari_err
        !          3830:                                 | ici i1 <> 0
        !          3831: dv1:    movl    a6@(8),a2       | a2 pointe sur dividende i2
        !          3832:         movw    a2@(6),d2       | d2.w contient le2
        !          3833:         cmpw    #2,d2
        !          3834:         bne     dv3
        !          3835:                                 | ici quotient=reste=0
        !          3836: dv2:    movl    a6@(16),d3
        !          3837:         cmpl    #-1,d3
        !          3838:         beq     1$
        !          3839:                                 | ici quotient attendu (q=0)
        !          3840:        movl    _gzero,d0
        !          3841: 1$:     tstl    d3
        !          3842:         beq     dvmiif
        !          3843:                                 | ici reste attendu (r=0)
        !          3844:        movl    _gzero,a0
        !          3845:         btst    #0,d3           | test si fonction mod
        !          3846:         bne     2$
        !          3847:         movl    d3,a1           | d3 pointe sur l'adr. du reste
        !          3848:         movl    a0,a1@
        !          3849:         bra     dvmiif
        !          3850: 2$:     movl    a0,d0
        !          3851:         bra     dvmiif
        !          3852:                                 | ici i2 et i1 <> 0
        !          3853: dv3:    movw    d2,d0           | le2
        !          3854:         subw    d1,d0           | d0.w contient L2-L1
        !          3855:         bcc     dv4
        !          3856:                                 | ici q=0 , r=i2
        !          3857:         movl    a6@(16),d3
        !          3858:         cmpl    #-1,d3
        !          3859:         beq     1$
        !          3860:                                 | quotient attendu soit q=0
        !          3861:        movl    _gzero,d0
        !          3862: 1$:     tstl    d3
        !          3863:         beq     dvmiif
        !          3864:                                 | reste attendu soit r=i1
        !          3865:         movl    d0,d1
        !          3866:         movw    d2,d0
        !          3867:         bsr     geti
        !          3868:         movl    a0,a1
        !          3869:         subqw   #2,d0
        !          3870:         addql   #4,a0
        !          3871:         addql   #4,a2
        !          3872: 2$:     movl    a2@+,a0@+
        !          3873:         dbra    d0,2$
        !          3874:         cmpl    #-1,d3
        !          3875:         beq     3$
        !          3876:         movl    d3,a0
        !          3877:         movl    a1,a0@
        !          3878:         movl    d1,d0
        !          3879:         bra     dvmiif
        !          3880: 3$:     movl    a1,d0
        !          3881:         bra     dvmiif
        !          3882:                                 | ici L2 >= L1
        !          3883: dv4:    movb    a1@(4),d3       | d3.b contient signe de i1
        !          3884:         movb    a2@(4),d4       | d4.b contient signe de i2
        !          3885:         eorb    d4,d3
        !          3886:         addqb   #1,d3           | d4.b contient signe de q
        !          3887:         movb    d3,a6@(-12)     | sauvegarde signe de q
        !          3888:         movb    d4,a6@(-10)     | sauvegarde signe de r
        !          3889:         movl    _avma,a6@(-20)  | sauvegarde _avma initial
        !          3890:         movw    d2,d0           | d0 recoit l2
        !          3891:         bsr     geti            | allocation memoire de travail :
        !          3892:                                 | on va y former q0q1...q(n-m)r1r2...rm
        !          3893:                                 | les memoires provisoires ne seront pas
        !          3894:                                 | rendues par giv:on ecrase mot code
        !          3895:         movl    a0,a6@(-4)      | sauvegarde addresse zone de travail
        !          3896:         subqw   #2,d1
        !          3897:         subqw   #2,d2
        !          3898:         movw    d1,a6@(-6)      | sauvegarde L1 (=m)
        !          3899:         movw    d2,a6@(-8)      | sauvegarde L2 (=n)
        !          3900:         movw    d2,a6@(-16)
        !          3901:         subw    d1,a6@(-16)     | n-m dans a6@(-16)
        !          3902:         addql   #8,a2
        !          3903:         addql   #8,a1
        !          3904:         movl    a1@,d3          | d3.l=y1 (1er lgmot du diviseur i1)
        !          3905:         subqw   #1,d2           | d2 recoit n-1
        !          3906:         subqw   #1,d1           | d1 recoit m-1
        !          3907:         bne     divlon
        !          3908:                                 | ici division simple (m = 1)
        !          3909: divsim: clrl    d4
        !          3910: 1$:     movl    a2@+,d5
        !          3911:         divul   d3,d4:d5
        !          3912:         movl    d5,a0@+
        !          3913:         dbra    d2,1$
        !          3914:         movl    d4,a0@          | reste mis derriere quotient
        !          3915:         movl    a0,a2           | a2 pointe sur reste
        !          3916:         clrw    a6@(-14)        | on n'a pas fait de shift
        !          3917:         bra     ranger
        !          3918:                                 | ici division longue (m > 1)
        !          3919: divlon: bfffo   d3{#0:#0},d4    | d4 recoit nb de shift pour normaliser
        !          3920:         movw    d4,a6@(-14)     | sauvegarde du nb. de shifts = k
        !          3921:         bne     1$
        !          3922:                                 | ici pas de normalisation
        !          3923:         movl    a0,a4
        !          3924:         movl    #0,a4@+         | met a 0 1er lgmot soit x0
        !          3925: 4$:     movl    a2@+,a4@+       | recopie x1x2...xn
        !          3926:         dbra    d2,4$
        !          3927:         movl    a0,a2           | a2 pointe sur x0,a4 pointe apres xn
        !          3928:         lea     a1@(4,d1:w:4),a3| a1 pointe sur y1,a3 pointe apres ym
        !          3929:         bra     nosh
        !          3930:                                 | ici on normalise le diviseur i1=y
        !          3931:                                 | et on decale autant le dividende:
        !          3932: 1$:     lsll    d4,d3           | normalisation de y1
        !          3933:         movw    a6@(-6),d0      | on demande m lgmots
        !          3934:         bsr     geti            | allocation pour copie normalisee de y
        !          3935:         moveq   #1,d6
        !          3936:         lsll    d4,d6
        !          3937:         subql   #1,d6           | masque de shift
        !          3938:         movl    a0,a3
        !          3939:         subqw   #1,d0           | d0 compt. mis a m-1
        !          3940:         addql   #4,a1           | a1 pointe sur y2 2me lg mot diviseur
        !          3941:         bra     3$
        !          3942: 2$:     movl    a1@+,d1         | boucle shift vers la gauche ds copie
        !          3943:         roll    d4,d1
        !          3944:         movl    d1,d5
        !          3945:         andl    d6,d1
        !          3946:         addl    d1,d3
        !          3947:         movl    d3,a3@+
        !          3948:         subl    d1,d5
        !          3949:         movl    d5,d3
        !          3950: 3$:     dbra    d0,2$
        !          3951:         movl    d3,a3@+
        !          3952:         movl    a0,a1           | a1 pointe sur 1er lgmot y1 normalise
        !          3953:                                 | a3 pointe apres ym
        !          3954:                                 | transfert avec shift du dividende:
        !          3955:         movl    a6@(-4),a4      | a4 pointe sur zone de travail
        !          3956:         moveq   #0,d3
        !          3957:         movw    a6@(-8),d0
        !          3958:         subqw   #1,d0           | d0 recoit n-1 compteur
        !          3959: 5$:     movl    a2@+,d1         | boucle de shift du dividende i2
        !          3960:         roll    d4,d1           | sur place
        !          3961:         movl    d1,d5
        !          3962:         andl    d6,d1
        !          3963:         addl    d1,d3
        !          3964:         movl    d3,a4@+
        !          3965:         subl    d1,d5
        !          3966:         movl    d5,d3
        !          3967:         dbra    d0,5$
        !          3968:         movl    d3,a4@
        !          3969:         movl    a6@(-4),a2      | a2 pointe sur x0 ;(a4 pointe sur xn)
        !          3970: nosh:   movw    a6@(-6),d6      | d6 recoit m
        !          3971:         lea     a2@(4,d6:w:4),a4| a4 pointe apres xm
        !          3972:         subqw   #1,d6           | d6 recoit m-1 compteur bcls internes
        !          3973:         movw    a6@(-16),d7     | d7 recoit n-m compteur bcl externe
        !          3974: #-------------------------------------------------------------------#
        !          3975:                                 | boucles de division I / I :
        !          3976:         | a1 pointe sur y1, a3 pointe apres ym : diviseur y1y2...ym
        !          3977:         | a2 pointe sur x0, a4 pointe apres xm : dividende x0x1...xn
        !          3978:         | d7 contient n-m compt. boucle externe
        !          3979:         | d6 contient m compt. boucles internes (n>=m>=2)
        !          3980:         | la zone x0x1...xn recoit q0q1...q(n-m)r1r2...rm
        !          3981:
        !          3982: bclext: movl    a1@,d0          | d0 recoit y1 (1er lgmot diviseur)
        !          3983:         cmpl    a2@,d0          | xi = y1 ? (i=0,1...n)
        !          3984:         bne     1$
        !          3985:         moveq   #-1,d1          | oui: essayer q=2^32-1
        !          3986:         addl    a2@(4),d0       | calcul du reste
        !          3987:                                 | r=xix(i+1) mod y1 = xi+x(i+1)
        !          3988:         bcs     4$              | si r>=2^32 , q est ok
        !          3989:         movl    d0,d2           | sinon d2 recoit r
        !          3990:         bra 2$                  | rejoindre cas general
        !          3991: 1$:     movl    a2@,d2          | si xi<y1 :
        !          3992:         movl    a2@(4),d1       | d2:d1 recoit xix(i+1)
        !          3993:         divul   d0,d2:d1        | d1 recoit q = xix(i+1) div y1
        !          3994:                                 | d2 recoit r = xix(i+1) mod y1
        !          3995: 2$:     movl    a1@(4),d3       | d3 recoit y2
        !          3996:         mulul   d1,d4:d3        | d4:d3 recoit q*y2
        !          3997:         subl    a2@(8),d3
        !          3998:         subxl   d2,d4           | d4:d3 recoit q*y2-(r,x(i+2))
        !          3999:         bls     4$              | si <= 0 alors q ok
        !          4000: 3$:     subql   #1,d1           | sinon diminuer q
        !          4001:         subl    a1@(4),d3       | corriger reste partiel:
        !          4002:         subxl   d0,d4           | d3:d4 recoit d3:d4-y1y2
        !          4003:         bhi     3$              | tant que q*y1y2>xix(i+1)x(i+2)
        !          4004:                                 | recommencer q recoit q-1
        !          4005:                                 | ici q*y1y2 <= xix(i+1)x(i+2)
        !          4006:                                 | on va former le nouveau reste
        !          4007:                                 | en remplacant x(i+1)...x(i+m) par
        !          4008:                                 | x(i+1)...x(i+m) - q*y1...ym
        !          4009: 4$:     movw    d6,d0           | d0 recoit m-1 compteur
        !          4010:         movl    a3,a1           | a1 pointe apres ym
        !          4011:         movl    a4,a2           | a2 pointe apres x(i+m)
        !          4012:         moveq   #0,d2           | d2 fixe a 0 pour les addxl
        !          4013:         subl    d3,d3           | d3 recoit k retenue initialisee a 0 et X=0
        !          4014: 5$:     movl    a1@-,d5         | d5 recoit x(i+j) j=m,m-1,...,1
        !          4015:         mulul   d1,d4:d5
        !          4016:         addxl   d3,d5
        !          4017:         addxl   d2,d4
        !          4018:         subl    d5,a2@-         | nouvel x(i+j)
        !          4019:         movl    d4,d3
        !          4020:         dbra    d0,5$
        !          4021:        addxl   d2,d3
        !          4022:         subl    d3,a2@(-4)      | soustrait derniere retenue
        !          4023:         bcc     6$              | si pas carry q=qi est definitif
        !          4024:         subql   #1,d1           | sinon encore 1 de trop
        !          4025:         movw    d6,d0           | repositionner compteur m-1
        !          4026:         movl    a3,a1
        !          4027:         movl    a4,a2           | repositionner pointeurs
        !          4028: 7$:     addxl   a1@-,a2@-
        !          4029:         dbra    d0,7$           | boucle de remise a jour du reste
        !          4030:                                 | il y a forcement carry final a ignorer
        !          4031: 6$:     movl    d1,a2@(-4)      | qi est range sur l'ancien xi
        !          4032:         addql   #4,a4           | a4 pointe apres x(i+m+1)
        !          4033:         dbra    d7,bclext       | boucler pour q0q1...q(n-m)
        !          4034:                                 | fin des boucles de division I/I
        !          4035:                                 | a2 pointe apres q(n-m),ie sur r1
        !          4036: #-------------------------------------------------------------------#
        !          4037:                                 | rangement des resultats
        !          4038:
        !          4039: ranger: clrl    a6@(-28)
        !          4040:         clrl    a6@(-32)
        !          4041:         movl    _avma,a6@(-24)  | actuel _avma
        !          4042:         movl    a6@(-20),d7     | _avma initial
        !          4043:         subl    _avma,d7        | nb d'octets memoire provisoires
        !          4044:                                 | offset:ajouter aux addresses fournies
        !          4045:         movl    a6@(16),d3
        !          4046:         cmpl    #-1,d3
        !          4047:         beq     rngres
        !          4048:                                 | ici quotient attendu
        !          4049:         movl    a6@(-4),a0      | a0 pointe sur q0
        !          4050:         movw    a6@(-16),d0     | d0 recoit n-m
        !          4051:         movw    d0,d1
        !          4052:         addqw   #2,d0
        !          4053:         tstl    a0@
        !          4054:         beq     1$
        !          4055:         addqw   #1,d0
        !          4056: 1$:     bsr     geti            | allocation memoire pour quotient
        !          4057:         movl    a0,a6@(-28)     | a6@(-28) recoit adr. provisoire de q
        !          4058:         addl    d7,a6@(-28)     | ajoute offset memoires provisoires
        !          4059:                                 | a6@(-28) contient adr definitive de q
        !          4060:         lea     a0@(0,d0:w:4),a1
        !          4061:         movl    a2,a3           | a2 et a3 pointe sur r1
        !          4062: 2$:     movl    a3@-,a1@-       | recopie q0,q1...q(n-m)
        !          4063:         dbra    d1,2$
        !          4064:         movw    d0,a0@(6)       | met long effective de q
        !          4065:         movb    a6@(-12),a0@(4) | met signe de q
        !          4066:         cmpw    #2,d0
        !          4067:         bne     rngres
        !          4068:         clrb    a0@(4)          | rectifier signe lorsque q=0
        !          4069: rngres: tstl    d3
        !          4070:         beq     rendre
        !          4071:                                 | ici reste attendu
        !          4072:         movw    a6@(-6),d0
        !          4073:         subqw   #1,d0           | d0 recoit m-1
        !          4074: 4$:     tstl    a2@+
        !          4075:         dbne    d0,4$           | chasse les zeros
        !          4076:         bne     1$
        !          4077:                                 | ici r=0 : ranger 0
        !          4078:         movw    #2,d0
        !          4079:         bsr     geti
        !          4080:         movl    #2,a0@(4)
        !          4081:         addl    d7,a0           | ajoute offset
        !          4082:         movl    a0,a6@(-32)     | adr. definit. de r
        !          4083:         bra     rendre
        !          4084: 1$:     subql   #4,a2           | a2 pointe sur 1er ri non nul
        !          4085:         movw    d0,d1
        !          4086:         addqw   #3,d0
        !          4087:         bsr     geti            | allocation memoire pour reste
        !          4088:         movl    a0,a6@(-32)
        !          4089:         addl    d7,a6@(-32)     | ajoute offset memoires provisoires
        !          4090:         movb    a6@(-10),a0@(4) | met signe de r
        !          4091:         movw    d0,a0@(6)       | met long effect provisoire (si shift)
        !          4092:         addql   #8,a0
        !          4093:         movw    a6@(-14),d3     | d3 recoit k nb de shifts
        !          4094:         bne     2$
        !          4095:                                 | ici k=0 pas de shift
        !          4096: 5$:     movl    a2@+,a0@+
        !          4097:         dbra    d1,5$           | recopie des ri effectifs
        !          4098:         bra     rendre
        !          4099: 2$:     moveq   #-1,d6          | ici shift de r
        !          4100:         lsrl    d3,d6           | d6 recoit masque de shift
        !          4101:         moveq   #0,d5
        !          4102:         bset    d3,d5           | d5 recoit 2^k
        !          4103:         moveq   #0,d2
        !          4104:         cmpl    a2@,d5          | comparer 1er ri a 2^k
        !          4105:         bls     3$
        !          4106:         movl    a2@+,d2         | ici ri < 2^k  : le shifter
        !          4107:         rorl    d3,d2
        !          4108:         subqw   #1,d0           | et diminuer de 1 la long de la boucle
        !          4109:         subqw   #1,a0@(-2)      | ainsi que la long effective de r
        !          4110: 3$:     movl    a2@+,d5         | boucle de shift de r
        !          4111:         rorl    d3,d5           | boucle jamais vide car r>=2^k
        !          4112:         movl    d5,d4
        !          4113:         andl    d6,d4
        !          4114:         addl    d4,d2
        !          4115:         movl    d2,a0@+
        !          4116:         subl    d4,d5
        !          4117:         movl    d5,d2
        !          4118:         dbra    d1,3$
        !          4119: rendre: movl    a6@(-20),a0     | rendre memoires provisoires
        !          4120:         movl    a6@(-24),a1     | il faut rendre la zone entre a1 et a0
        !          4121:         movl    a1,d0
        !          4122:         subl    _avma,d0
        !          4123:         lsrl    #2,d0           | nb de lgmots a deplacer
        !          4124:         subqw   #1,d0
        !          4125: 1$:     movl    a1@-,a0@-
        !          4126:         dbra    d0,1$
        !          4127:         movl    a0,_avma        | nouvel _avma
        !          4128:         movl    a6@(-28),d0
        !          4129:         bne     2$
        !          4130:         movl    a6@(-32),d0
        !          4131:         bra     dvmiif
        !          4132: 2$:     tstl    a6@(-32)
        !          4133:         beq     dvmiif
        !          4134:         movl    a6@(16),a1
        !          4135:         movl    a6@(-32),a1@
        !          4136: dvmiif: moveml  sp@+,d2-d7/a2-a4
        !          4137:         unlk    a6
        !          4138:         rts
        !          4139:
        !          4140:
        !          4141:
        !          4142: #===================================================================#
        !          4143: #                                                                   #
        !          4144: #                       Divisibilite de i2 par i1                   #
        !          4145: #                                                                   #
        !          4146: #       entree : a7@(4) pointe sur n2 de type I                     #
        !          4147: #                a7@(8) pointe sur n1 de type I                     #
        !          4148: #                a7@(12) contient un pointeur ( pour quotient )     #
        !          4149: #       sortie : d0 contient 1 si n1 divise n2                      #
        !          4150: #                            0 sinon
        !          4151: #       a7@(12) pointe sur n2 / n1 de type I  (zone creee)          #
        !          4152: #       lorsque n1 divise n2,  sinon n'est pas affecte.             #
        !          4153: #                                                                   #
        !          4154: #===================================================================#
        !          4155:
        !          4156: _mpdivis:link a6,#-8
        !          4157:         movl    _avma,a6@(-8)
        !          4158:         pea     a6@(-4)
        !          4159:         movl    a6@(12),sp@-
        !          4160:         movl    a6@(8),sp@-
        !          4161:         bsr     _asmdvmdii
        !          4162:         lea     sp@(12),sp
        !          4163:         tstb    a6@(-4)@(4)             | reste nul ?
        !          4164:         beq     1$
        !          4165:                                         | ici reste non nul
        !          4166:         moveq   #0,d0
        !          4167:         movl    a6@(-8),_avma           | desallouer q et r
        !          4168:         bra     2$
        !          4169:                                         | ici reste nul
        !          4170: 1$:     movl    a6@(16),sp@-
        !          4171:         movl    d0,sp@-                 | adresse du quotient
        !          4172:         bsr     _affii
        !          4173:         moveq   #1,d0
        !          4174:         movl    a6@(-8),_avma                   | desallouer reste
        !          4175: 2$:     unlk    a6
        !          4176:         rts
        !          4177:
        !          4178:
        !          4179: #===================================================================#
        !          4180: #                                                                   #
        !          4181: #               Flag de divisibilite de i2 par i1                   #
        !          4182: #                                                                   #
        !          4183: #       entree : a7@(4) pointe sur n2 de type I                     #
        !          4184: #                a7@(8) pointe sur n1 de type I                     #
        !          4185: #       sortie : d0 contient 1 si n1 divise n2                      #
        !          4186: #                            0 sinon                                #
        !          4187: #                                                                   #
        !          4188: #===================================================================#
        !          4189:
        !          4190: _divise: movl   #-1,sp@-
        !          4191:         movl    sp@(12),sp@-
        !          4192:         movl    sp@(12),sp@-
        !          4193:         bsr     _asmdvmdii
        !          4194:         lea     sp@(12),sp
        !          4195:         movl    d0,a0
        !          4196:         moveq   #1,d0
        !          4197:         tstb    a0@(4)                  | reste nul ?
        !          4198:         beq     giv
        !          4199:                                         | ici reste non nul
        !          4200:         moveq   #0,d0
        !          4201:         bra     giv
        !          4202:
        !          4203:
        !          4204:
        !          4205:
        !          4206: #*******************************************************************#
        !          4207: #*******************************************************************#
        !          4208: #**                                                               **#
        !          4209: #**                     PROGRAMMES DE DIVISION                    **#
        !          4210: #**                                                               **#
        !          4211: #*******************************************************************#
        !          4212: #*******************************************************************#
        !          4213:
        !          4214:
        !          4215:
        !          4216:
        !          4217:
        !          4218: #===================================================================#
        !          4219: #                                                                   #
        !          4220: #                       Division generale                           #
        !          4221: #                                                                   #
        !          4222: #       entree : a7@(4) pointe sur n2 de type I ou R                #
        !          4223: #                a7@(8) pointe sur n1 de type I ou R                #
        !          4224: #       sortie : d0 pointe sur n2 / n1 de type I ou R (zone creee)  #
        !          4225: #                Le reste est du signe du dividende                 #
        !          4226: #       interdit : type S                                           #
        !          4227: #       precision : voir routines specialisees                      #
        !          4228: #                                                                   #
        !          4229: #===================================================================#
        !          4230:
        !          4231: _mpdiv: cmpb    #1,sp@(8)@
        !          4232:         bne     1$
        !          4233:         cmpb    #1,sp@(4)@
        !          4234:         beq     _divii
        !          4235:         bra     _divri
        !          4236: 1$:     cmpb    #1,sp@(4)@
        !          4237:         beq     _divir
        !          4238:         bra     _divrr
        !          4239:
        !          4240: #===================================================================#
        !          4241: #                                                                   #
        !          4242: #                       Division (par valeur)                       #
        !          4243: #                                                                   #
        !          4244: #       entree : a7@(4) pointe sur n2 de type I ou R                #
        !          4245: #                a7@(8) pointe sur n1 de type I ou R                #
        !          4246: #                a7@(12) pointe sur n3 de type I ou R               #
        !          4247: #       sortie : la zone pointee par a7@(12) contient n2 / n1 de    #
        !          4248: #                type le type de n3                                 #
        !          4249: #       interdit : type S ainsi que les divisions suivantes :       #
        !          4250: #                R/I=I , I/R=I ,R/R=I                               #
        !          4251: #                                                                   #
        !          4252: #===================================================================#
        !          4253:
        !          4254: _mpdivz:movl    a2,sp@-
        !          4255:         movl    _avma,sp@-
        !          4256:         movl    sp@(12),a1
        !          4257:         movl    sp@(16),a0
        !          4258:         movl    sp@(20),a2      | a0,a1,a2 pointent sur n1,n2,n3
        !          4259:         cmpb    #1,a2@
        !          4260:         bne     1$
        !          4261:                                 | ici T3 = I
        !          4262:         cmpb    #1,a1@
        !          4263:         beq     2$
        !          4264:                                 | ici T3 = I et (T2 = R ou T1 = R)
        !          4265: 3$:     movl    #divzer1,sp@-
        !          4266:         jsr     _pari_err
        !          4267:                                 | ici T3 = I et T2 = I
        !          4268: 2$:     cmpb    #1,a0@
        !          4269:         bne     3$
        !          4270:                                 | ici T3 = T2 = T1 = I
        !          4271:         movl    a0,sp@-
        !          4272:         movl    a1,sp@-
        !          4273:         bsr     _divii
        !          4274:         movl    a2,sp@(4)
        !          4275:         movl    d0,sp@
        !          4276:         bsr     _affii
        !          4277:         addql   #8,sp
        !          4278:         bra     divzf
        !          4279:                                 | ici T3 = R
        !          4280: 1$:     movl    a0,sp@-
        !          4281:         cmpb    #1,a0@
        !          4282:         beq     4$
        !          4283:                                 | ici T3 = R et T1 = R
        !          4284:         movl    a1,sp@-
        !          4285:         cmpb    #1,a1@
        !          4286:         beq     5$
        !          4287:                                 | ici T3 =T2 = T1 = R
        !          4288:         bsr     _divrr
        !          4289:         bra     6$
        !          4290:                                 | ici T3 = T1 = R et T2 = I
        !          4291: 5$:     bsr     _divir
        !          4292:         bra     6$
        !          4293:                                 | ici T3 = R et T1 = I
        !          4294: 4$:     cmpb    #1,a1@
        !          4295:         beq     7$
        !          4296:                                 | ici T3 = T2 = R et T1 = I
        !          4297:         movl    a1,sp@-
        !          4298:         bsr     _divri
        !          4299:         bra     6$
        !          4300:                                 | ici T3 = R et T2 = T1 = I
        !          4301: 7$:     movw    a2@(2),d0
        !          4302:         addqw   #1,d0
        !          4303:         bsr     getr
        !          4304:         movl    a0,sp@-
        !          4305:         movl    a1,sp@-
        !          4306:         bsr     _affir
        !          4307:        addql   #4,sp
        !          4308:         bsr     _divri
        !          4309: 6$:     movl    a2,sp@(4)
        !          4310:         movl    d0,sp@
        !          4311:         bsr     _affrr
        !          4312:         addql   #8,sp
        !          4313: divzf:  movl    sp@+,_avma
        !          4314:         movl    sp@+,a2
        !          4315:         rts
        !          4316:
        !          4317:                                 | division S/R=R sinon erreur
        !          4318:
        !          4319: _divsrz:lea     _divsr,a0
        !          4320:         bra     mpopz
        !          4321:
        !          4322:                                 | division R/S=R sinon erreur
        !          4323:
        !          4324: _divrsz:lea     _divrs,a0
        !          4325:         bra     mpopz
        !          4326:
        !          4327:                                 | division I/R=R sinon erreur
        !          4328:
        !          4329: _divirz:lea     _divir,a0
        !          4330:         bra     mpopz
        !          4331:
        !          4332:                                 | division R/I=R sinon erreur
        !          4333:
        !          4334: _divriz:lea     _divri,a0
        !          4335:         bra     mpopz
        !          4336:
        !          4337:                                 | division R/R=R sinon erreur
        !          4338:
        !          4339: _divrrz:lea     _divrr,a0
        !          4340:         bra     mpopz
        !          4341: #===================================================================#
        !          4342: #                                                                   #
        !          4343: #       Division par valeur : entier / entier = entier ou reel      #
        !          4344: #                                                                   #
        !          4345: #       entree : a7@(4) contient i2 de type S                       #
        !          4346: #                a7@(8) contient i1 de type S                       #
        !          4347: #                a7@(12) pointe sur i3 ou r3 de type I ou R         #
        !          4348: #       sortie : a7@(12) pointe sur i2 / i1 de type I ou R          #
        !          4349: #                                                                   #
        !          4350: #===================================================================#
        !          4351:
        !          4352: _divssz:cmpb    #1,sp@(12)@
        !          4353:         bne     divssr
        !          4354: divssi: movl    sp@(8),sp@-
        !          4355:         movl    sp@(8),sp@-
        !          4356:         bsr     _divss
        !          4357:         movl    sp@(20),sp@(4)
        !          4358:         movl    d0,sp@
        !          4359:         bsr     _affii
        !          4360:         movl    sp@,a0
        !          4361:         addql   #8,sp
        !          4362:         bra     giv
        !          4363: divssr: movl    _avma,sp@-
        !          4364:         movw    sp@(16)@(2),d0
        !          4365:         bsr     getr
        !          4366:         movl    a0,sp@-
        !          4367:         movl    sp@(12),sp@-
        !          4368:         bsr     _affsr          | conversion dividende en R
        !          4369:         movl    sp@(4),sp@      | dividende converti
        !          4370:         movl    sp@(20),sp@(4)  | diviseur (type S)
        !          4371:         bsr     _divrs
        !          4372:         movl    sp@(24),sp@(4)
        !          4373:         movl    d0,sp@
        !          4374:         bsr     _affrr
        !          4375:         addql   #8,sp
        !          4376:         movl    sp@+,_avma
        !          4377:         rts
        !          4378:
        !          4379: #===================================================================#
        !          4380: #                                                                   #
        !          4381: #       Division par valeur : S / I = entier ou reel                #
        !          4382: #                                                                   #
        !          4383: #       entree : a7@(4) contien i2 de type S                        #
        !          4384: #                a7@(8) pointe sur i1 de type I                     #
        !          4385: #                a7@(12) pointe sur i3 ou r3 de type I ou R         #
        !          4386: #       sortie : a7@(12) pointe sur i2 / i1 de type I ou R          #
        !          4387: #                                                                   #
        !          4388: #===================================================================#
        !          4389:
        !          4390: _divsiz:link    a6,#0
        !          4391:         moveml  a2-a4,sp@-
        !          4392:         movl    a6@(16),a3
        !          4393:         cmpb    #1,a3@
        !          4394:         bne     divsir
        !          4395: divsii: movl    a6@(12),sp@-
        !          4396:         movl    a6@(8),sp@-
        !          4397:         bsr     _divsi
        !          4398:         movl    a6@(16),sp@(4)
        !          4399:         movl    d0,sp@
        !          4400:         bsr     _affii
        !          4401:         movl    sp@,a0
        !          4402:         addql   #8,sp
        !          4403:         bsr     giv
        !          4404: divsizf:moveml  sp@+,a2-a4
        !          4405:         unlk    a6
        !          4406:         rts
        !          4407: divsir: movl    _avma,a2
        !          4408:         movw    a3@(2),d0
        !          4409:         addqw   #1,d0
        !          4410:         bsr     getr
        !          4411:         movl    a0,a4
        !          4412:         movl    a0,sp@-
        !          4413:         movl    a6@(8),sp@-
        !          4414:         bsr     _affsr          | conversion dividende en R
        !          4415:         addql   #2,d0
        !          4416:         bsr     getr
        !          4417:         movl    a0,sp@(4)
        !          4418:         movl    a6@(12),sp@
        !          4419:         bsr     _affir          | conversion diviseur en R
        !          4420:         movl    a4,sp@
        !          4421:         bsr     _divrr
        !          4422:         movl    a3,sp@(4)
        !          4423:         movl    d0,sp@
        !          4424:         bsr     _affrr
        !          4425:         addql   #8,sp
        !          4426:         movl    a2,_avma
        !          4427:         bra     divsizf
        !          4428:
        !          4429: #===================================================================#
        !          4430: #                                                                   #
        !          4431: #       Division par valeur : I / S = entier ou reel                #
        !          4432: #                                                                   #
        !          4433: #       entree : a7@(4) pointe sur i2 de type I                     #
        !          4434: #                a7@(8) contient i1 de type S                       #
        !          4435: #                a7@(12) pointe sur i3 ou r3 de type I ou R         #
        !          4436: #       sortie : a7@(12) pointe sur i2 / i1 de type I ou R          #
        !          4437: #                                                                   #
        !          4438: #===================================================================#
        !          4439:
        !          4440: _divisz:cmpb    #1,sp@(12)@
        !          4441:         bne     divisr
        !          4442: divisi: movl    sp@(8),sp@-
        !          4443:         movl    sp@(8),sp@-
        !          4444:         bsr     _divis
        !          4445:         movl    sp@(20),sp@(4)
        !          4446:         movl    d0,sp@
        !          4447:         bsr     _affii
        !          4448:         movl    sp@,a0
        !          4449:         addql   #8,sp
        !          4450:         bra     giv
        !          4451: divisr: movl    _avma,sp@-
        !          4452:         movw    sp@(16)@(2),d0
        !          4453:         bsr     getr
        !          4454:         movl    a0,sp@-
        !          4455:         movl    sp@(12),sp@-
        !          4456:         bsr     _affir          | conversion dividende en R
        !          4457:         movl    sp@(4),sp@      | dividende converti
        !          4458:         movl    sp@(20),sp@(4)  | diviseur (type S)
        !          4459:         bsr     _divrs
        !          4460:         movl    sp@(24),sp@(4)
        !          4461:         movl    d0,sp@
        !          4462:         bsr     _affrr
        !          4463:         addql   #8,sp
        !          4464:         movl    sp@+,_avma
        !          4465:         rts
        !          4466:
        !          4467: #===================================================================#
        !          4468: #                                                                   #
        !          4469: #       Division par valeur : entier / entier = entier ou reel      #
        !          4470: #                                                                   #
        !          4471: #       entree : a7@(4) pointe sur i2 de type I                     #
        !          4472: #                a7@(8) pointe sur i1 de type I                     #
        !          4473: #                a7@(12) pointe sur i3 ou r3 de type I ou R         #
        !          4474: #       sortie : a7@(12) pointe sur i2 / i1 de type I ou R          #
        !          4475: #                                                                   #
        !          4476: #===================================================================#
        !          4477:
        !          4478: _diviiz:link    a6,#0
        !          4479:         moveml  a2-a4,sp@-
        !          4480:         movl    a6@(16),a3
        !          4481:         cmpb    #1,a3@
        !          4482:         bne     diviir
        !          4483: diviii: movl    a6@(12),sp@-
        !          4484:         movl    a6@(8),sp@-
        !          4485:         bsr     _divii
        !          4486:         movl    a6@(16),sp@(4)
        !          4487:         movl    d0,sp@
        !          4488:         bsr     _affii
        !          4489:         movl    sp@,a0
        !          4490:         addql   #8,sp
        !          4491:         bsr     giv
        !          4492: diviizf:moveml  sp@+,a2-a4
        !          4493:         unlk    a6
        !          4494:         rts
        !          4495: diviir: movl    _avma,a2
        !          4496:         movw    a3@(2),d0
        !          4497:         bsr     getr
        !          4498:         movl    a0,a4
        !          4499:         movl    a0,sp@-
        !          4500:         movl    a6@(8),sp@-
        !          4501:         bsr     _affir          | conversion dividende en R
        !          4502:         addql   #2,d0
        !          4503:         bsr     getr
        !          4504:         movl    a0,sp@(4)
        !          4505:         movl    a6@(12),sp@
        !          4506:         bsr     _affir          | conversion diviseur en R
        !          4507:         movl    a4,sp@
        !          4508:         bsr     _divrr
        !          4509:         movl    a3,sp@(4)
        !          4510:         movl    d0,sp@
        !          4511:         bsr     _affrr
        !          4512:         addql   #8,sp
        !          4513:         movl    a2,_avma
        !          4514:         bra     diviizf
        !          4515:
        !          4516:
        !          4517: #===================================================================#
        !          4518: #                                                                   #
        !          4519: #               Division : entier court / entier court = entier     #
        !          4520: #                                                                   #
        !          4521: #       entree : a7@(4) contient s2 de type S                       #
        !          4522: #                a7@(8) contient s1 de type S                       #
        !          4523: #       sortie : d0 pointe sur s2 div s1 de type I (zone creee)     #
        !          4524: #                d1.l contient le reste(du signe du dividende)      #
        !          4525: #                                                                   #
        !          4526: #===================================================================#
        !          4527:
        !          4528: _divss: link    a6,#0
        !          4529:         moveml  d2-d3,sp@-
        !          4530:        moveq   #0,d3
        !          4531:         movl    a6@(12),d1      | d1.l recoit s1
        !          4532:         bne     1$
        !          4533:                                 | ici s1 = 0
        !          4534:         movl    #diver1,sp@-
        !          4535:         jsr     _pari_err
        !          4536:                                 | ici s1 <> 0
        !          4537: 1$:     movl    a6@(8),d2       | d2.l recoit s2
        !          4538:        bpl     9$
        !          4539:        moveq   #-1,d3
        !          4540: 9$:     divsll  d1,d3:d2
        !          4541:         bne     2$
        !          4542:                                 | ici quotient nul
        !          4543: 3$:     movl   _gzero,d0
        !          4544:         movl    d3,d1
        !          4545:         bra     divssg
        !          4546:                                 | ici quotient non nul
        !          4547: 2$:     moveq   #3,d0
        !          4548:         bsr     geti
        !          4549:         movl    #0x1000003,a0@(4)
        !          4550:         tstl    d2
        !          4551:         bpl     4$
        !          4552:         negl    d2
        !          4553:         movb    #-1,a0@(4)
        !          4554: 4$:     movl    d2,a0@(8)
        !          4555:         movl    d3,d1
        !          4556: divssf: movl    a0,d0
        !          4557: divssg: moveml  sp@+,d2-d3
        !          4558:         unlk    a6
        !          4559:         rts
        !          4560:
        !          4561: #===================================================================#
        !          4562: #                                                                   #
        !          4563: #               Division : entier court / entier = entier           #
        !          4564: #                                                                   #
        !          4565: #       entree : a7@(4) contient s2 de type S                       #
        !          4566: #                a7@(8) contient i1 de type I                       #
        !          4567: #       sortie : d0 pointe sur s2 div i1 de type I (zone creee)     #
        !          4568: #                d1.l contient le reste (du signe du dividende)     #
        !          4569: #                                                                   #
        !          4570: #===================================================================#
        !          4571:
        !          4572: _divsi: link    a6,#0
        !          4573:         moveml  d2-d4,sp@-
        !          4574:         movl    a6@(12),a1      | a1 pointe sur le diviseur i1
        !          4575:         tstb    a1@(4)
        !          4576:         bne     1$
        !          4577:                                 | ici i1 = 0
        !          4578:         movl    #diver2,sp@-
        !          4579:         jsr     _pari_err
        !          4580:                                 | ici i1 <> 0
        !          4581: 1$:     movl    a6@(8),d2       | d2.l contient le dividende s2
        !          4582:         bne     3$
        !          4583:                                 | ici quotient et reste nuls
        !          4584: 2$:     movl   _gzero,d0
        !          4585:         moveq   #0,d1
        !          4586:         bra     divsig
        !          4587:                                 | ici i1 et s2 <> 0
        !          4588: 3$:     movw    a1@(6),d1       | d1.w contient le1
        !          4589:         cmpw    #3,d1
        !          4590:         beq     4$
        !          4591:                                 | ici quotient nul et reste=s2
        !          4592: 6$:     movl   _gzero,a0
        !          4593:         movl    d2,d1
        !          4594:         bra     divsif
        !          4595:                                 | ici L1 = 1
        !          4596: 4$:     movl    a1@(8),d1       | d1.l contient |i1|
        !          4597:         movl    d2,d3           | d3.l contient s2
        !          4598:         bpl     5$
        !          4599:         negl    d3              | d3.l contient |s2|
        !          4600: 5$:     moveq   #0,d4
        !          4601:         divul   d1,d4:d3
        !          4602:         beq     6$
        !          4603:         moveq   #3,d0
        !          4604:         bsr     geti
        !          4605:         movl    d3,a0@(8)       | ranger mantisse
        !          4606:         movl    a1@(4),a0@(4)
        !          4607:         tstl    d2
        !          4608:         bpl     7$
        !          4609:         movb    #-1,a0@(4)      | mise a jour du signe
        !          4610: 7$:     movl    d4,d1
        !          4611:         tstb    a1@(4)
        !          4612:         bpl     divsif
        !          4613:         negl    d1              | mise a jour reste
        !          4614: divsif: movl    a0,d0
        !          4615: divsig: moveml  sp@+,d2-d4
        !          4616:         unlk    a6
        !          4617:         movl   d1,_hiremainder
        !          4618:         rts
        !          4619:
        !          4620: #===================================================================#
        !          4621: #                                                                   #
        !          4622: #               Division : entier court / reel = reel               #
        !          4623: #                                                                   #
        !          4624: #       entree : a7@(4) contient s2 de type S                       #
        !          4625: #                a7@(8) pointe sur r1 de type R                     #
        !          4626: #       sortie : d0 pointe sur s2 / r1 de type R (zone creee)       #
        !          4627: #                                                                   #
        !          4628: #===================================================================#
        !          4629:
        !          4630: _divsr: link    a6,#-32
        !          4631:         moveml  d2/a2-a4,sp@-
        !          4632:         movl    a6@(12),a1      | a1 pointe sur r1
        !          4633:         tstb    a1@(4)
        !          4634:         bne     2$
        !          4635:                                 | ici r1 = 0
        !          4636:         movl    #diver3,sp@-
        !          4637:         jsr     _pari_err
        !          4638:                                 | ici r1 <> 0
        !          4639: 2$:     tstl    a6@(8)
        !          4640:         bne     1$
        !          4641:                                 | ici s2 = 0
        !          4642:        movl    _gzero,d0
        !          4643:         bra     divsrf
        !          4644:                                 | ici s2 et r1 <> 0
        !          4645: 1$:     moveq   #0,d0
        !          4646:         movw    a1@(2),d0
        !          4647:         bsr     getr            | allocation pour resultat
        !          4648:         movl    a6@(8),d2       | d2.l recoit s2
        !          4649:         movl    a0,a4
        !          4650:         addqw   #1,d0
        !          4651:         bsr     getr
        !          4652:         movl    a0,sp@-         | sauvegarde adr. copie
        !          4653:         movl    d2,sp@-
        !          4654:         bsr     _affsr
        !          4655:         addql   #4,sp
        !          4656:         movl    a0,a2           | a2 pointe sur copie s2
        !          4657:         movl    a4,a0           | a0 pointe sur resultat
        !          4658:         bsr     dvrr
        !          4659:         movl    sp@+,a0
        !          4660:         bsr     giv             | desallouer copie
        !          4661:         movl    a4,d0
        !          4662: divsrf: moveml  sp@+,d2/a2-a4
        !          4663:         unlk    a6
        !          4664:         rts
        !          4665:
        !          4666: #===================================================================#
        !          4667: #                                                                   #
        !          4668: #               Division : entier / entier court = entier           #
        !          4669: #                                                                   #
        !          4670: #       entree : a7@(4) pointe sur i2 de type I                     #
        !          4671: #                a7@(8) contient s1 de type S                       #
        !          4672: #       sortie : d0 pointe sur i2 / s1 de type I (zone creee)       #
        !          4673: #               le reste est dans d1.l (du signe du dividende)      #
        !          4674: #                                                                   #
        !          4675: #===================================================================#
        !          4676:
        !          4677: _divis: link    a6,#0
        !          4678:         moveml  d2-d6/a2,sp@-
        !          4679:         movl    a6@(12),d1      | d1 recoit s1 diviseur
        !          4680:         bne     1$
        !          4681:         movl    #diver4,sp@-
        !          4682:         jsr     _pari_err
        !          4683: 1$:     bpl     2$
        !          4684:         negl    d1
        !          4685:                                 | ici d1 contient |s1|
        !          4686: 2$:     movl    a6@(8),a2       | a2 pointe sur i2 dividende
        !          4687:         movw    a2@(6),d2       | d2 recoit le2
        !          4688:         movw    a2@(4),d5       | signe de i2
        !          4689:         bne     4$
        !          4690:                                 | ici i2=0 : q=0 , r=0
        !          4691: 3$:     movl   _gzero,d0
        !          4692:         moveq   #0,d1           | reste nul
        !          4693:         bra     divisg
        !          4694:                                 | ici i2 et s1 <>0
        !          4695: 4$:     movw    d2,d0           | d0 recoit le2
        !          4696:         addql   #8,a2
        !          4697:         movl    a2@+,d4
        !          4698:        moveq   #0,d3
        !          4699:         divull  d1,d3:d4        | calcul de q0
        !          4700:         bne     5$
        !          4701:                                 | ici q0 = 0
        !          4702:         subqw   #1,d0           | diminuer long. effective
        !          4703:         cmpw    #2,d0
        !          4704:         bne     5$
        !          4705:                                 | ici q=0 , reste dans d3
        !          4706:        movl    _gzero,a0
        !          4707:         bra     10$
        !          4708:                                 | ici q <> 0
        !          4709: 5$:     bsr     geti
        !          4710:         movl    a0,a1
        !          4711:         movw    d0,a0@(6)       | met long. effect.
        !          4712:         movb    #1,a0@(4)
        !          4713:         movw    a6@(12),d6      | 'signe de s1'
        !          4714:         eorw    d5,d6
        !          4715:         bpl     6$              | si de meme signe
        !          4716:         movb    #-1,a0@(4)      | si de signes contraires
        !          4717: 6$:     addql   #8,a1
        !          4718:         tstl    d4              | q0 = 0 ?
        !          4719:         beq     7$
        !          4720:         movl    d4,a1@+         | non: ranger q0
        !          4721: 7$:     subqw   #3,d2           | d2 recoit L1 -1 compteur
        !          4722:         bra     9$
        !          4723: 8$:     movl    a2@+,d4         | boucle de division
        !          4724:         divul   d1,d3:d4
        !          4725:         movl    d4,a1@+
        !          4726: 9$:     dbra    d2,8$
        !          4727: 10$:    movl    d3,d1           | le reste est mis dans d1
        !          4728:         tstw    d5              | i1 > 0 ?
        !          4729:         bpl     divisf
        !          4730:         negl    d1              | non : changer signe de r
        !          4731: divisf: movl    a0,d0           | met addresse resultat
        !          4732: divisg: moveml  sp@+,d2-d6/a2
        !          4733:         unlk a6
        !          4734:         movl   d1,_hiremainder
        !          4735:         rts
        !          4736:
        !          4737: #===================================================================#
        !          4738: #                                                                   #
        !          4739: #               Division : entier / entier = entier                 #
        !          4740: #                                                                   #
        !          4741: #       entree : a7@(4) pointe sur i2 de type I                     #
        !          4742: #                a7@(8) pointe sur i1 de type I                     #
        !          4743: #       sortie : d0 pointe sur i2 / i1 de type I (zone creee)       #
        !          4744: #                Le reste est du signe du dividende                 #
        !          4745: #                                                                   #
        !          4746: #===================================================================#
        !          4747:
        !          4748: _divii: clrl    sp@-
        !          4749:         movl    sp@(12),sp@-    | empilage de i1
        !          4750:         movl    sp@(12),sp@-    | empilage de i2
        !          4751:         bsr     _asmdvmdii
        !          4752:         lea     sp@(12),sp      | depilage
        !          4753:         rts
        !          4754:
        !          4755: #===================================================================#
        !          4756: #                                                                   #
        !          4757: #               Division : entier / reel = reel                     #
        !          4758: #                                                                   #
        !          4759: #       entree : a7@(4) pointe sur i2 de type I                     #
        !          4760: #                a7@(8) pointe sur r1 de type R                     #
        !          4761: #       sortie : d0 pointe sur i2 / r1 de type R (zone creee)       #
        !          4762: #                                                                   #
        !          4763: #===================================================================#
        !          4764:
        !          4765: _divir: link    a6,#-32         | var. locales pour appel dvrr
        !          4766:         moveml  a2-a3,sp@-
        !          4767:         movl    a6@(12),a1      | a1 pointe sur r1
        !          4768:         tstb    a1@(4)
        !          4769:         bne     1$
        !          4770:                                 | ici r1 = 0
        !          4771:         movl    #diver5,sp@-
        !          4772:         jsr     _pari_err
        !          4773:                                 | ici r1 <> 0
        !          4774: 1$:     movl    a6@(8),a2       | a2 pointe sur i2
        !          4775:         tstb    a2@(4)
        !          4776:         bne     2$
        !          4777:                                 | ici i2 = 0
        !          4778:        movl    _gzero,d0
        !          4779:         bra     divirf
        !          4780: 2$:     moveq   #0,d0           | ici i2 et r1 <> 0
        !          4781:         movw    a1@(2),d0       | d0.w contient l1
        !          4782:         bsr     getr            | allocation pour resultat
        !          4783:         movl    a0,a3
        !          4784:         addqw   #1,d0
        !          4785:         bsr     getr            | allocation pour conversion i2 type R
        !          4786:         movl    a0,a6@(-16)     | sauvegarde adr. du transforme i2'
        !          4787:         movl    a0,sp@-
        !          4788:         movl    a2,sp@-
        !          4789:         bsr     _affir
        !          4790:         addql   #8,sp
        !          4791:         movl    a0,a2           | a2 pointe sur i2'
        !          4792:         movl    a3,a0           | a0 pointe sur resultat
        !          4793:         bsr     dvrr
        !          4794:         movl    a6@(-16),a0
        !          4795:         bsr     giv             | desallouer i2'
        !          4796:         movl    a3,d0
        !          4797: divirf: moveml  sp@+,a2-a3
        !          4798:         unlk    a6
        !          4799:         rts
        !          4800:
        !          4801: #===================================================================#
        !          4802: #                                                                   #
        !          4803: #               Division : reel / entier court = reel               #
        !          4804: #                                                                   #
        !          4805: #       entree : a7@(4) pointe sur r2 de type R                     #
        !          4806: #                a7@(8) pointe sur s1 de type S                     #
        !          4807: #       sortie : d0 pointe sur r2 / s1 de type R (zone creee)       #
        !          4808: #                                                                   #
        !          4809: #===================================================================#
        !          4810:
        !          4811: _divrs: link    a6,#0
        !          4812:         moveml  d2-d6/a2,sp@-
        !          4813:         movl    a6@(12),d1      | d1 recoit s1 diviseur
        !          4814:         bne     1$
        !          4815:                                 | ici s1 = 0
        !          4816:         movl    #diver6,sp@-
        !          4817:         jsr     _pari_err
        !          4818:                                 | ici diviseur s1 <> 0
        !          4819: 1$:     movl    a6@(8),a2       | a2 pointe sur r2 dividende
        !          4820:         tstb    a2@(4)
        !          4821:         bne     2$
        !          4822:                                 | ici r2 = 0
        !          4823:         moveq   #3,d0
        !          4824:         bsr     getr
        !          4825:         tstl    d1
        !          4826:         bpl     11$
        !          4827:         negl    d1
        !          4828: 11$:    bfffo   d1{#0:#0},d0
        !          4829:         addl    a2@(4),d0
        !          4830:         subl    #31,d0
        !          4831:         bmi     9$
        !          4832:         movl    d0,a0@(4)
        !          4833:         clrl    a0@(8)
        !          4834:         bra     divrsf
        !          4835:                                 | ici r2 et s1 <> 0
        !          4836: 2$:     movw    a2@(2),d0       | d0 recoit l2
        !          4837:         bsr     getr            | allocation pour resultat
        !          4838:         movb    a2@(4),a0@(4)   | signe de r2
        !          4839:         tstl    d1
        !          4840:         bpl     3$
        !          4841:         negl    d1              | d1 recoit |s1| <= 2^31
        !          4842:                                 | s1 est tjrs <= 1er mot mantisse
        !          4843:                                 | le 1er quotient partiel est non nul
        !          4844:         negb    a0@(4)
        !          4845: 3$:     movl    a0,a1
        !          4846:         addql   #8,a1
        !          4847:         addql   #8,a2
        !          4848:         subqw   #3,d0           | d0 recoit L2-1 compteur
        !          4849:         movl    d0,d2           | conserve dans d2
        !          4850:         moveq   #0,d3           | 1er reste
        !          4851: 4$:     movl    a2@+,d4
        !          4852:         divul   d1,d3:d4
        !          4853:         movl    d4,a1@+
        !          4854:         dbra    d0,4$           | boucle de division
        !          4855:
        !          4856:         movl    a0@(8),d0       | resultat normalise ?
        !          4857:         bpl     10$
        !          4858:         moveq   #0,d1           | ici normalise ; nb shift = 0
        !          4859:         bra     5$
        !          4860:                                 | ici il faut normaliser
        !          4861:
        !          4862: 10$:    moveq   #0,d4
        !          4863:         divul   d1,d3:d4        | traite dernier reste: quotient
        !          4864:                                 | a recuperer par le shift
        !          4865:         bfffo   d0{#0:#0},d1    | nb de shift dans d1
        !          4866:         lsll    d1,d0           | shift 1er lg mot d0
        !          4867:         movl    a0,a1
        !          4868:         addql   #8,a1
        !          4869:         moveq   #1,d6
        !          4870:         lsll    d1,d6
        !          4871:         subql   #1,d6           | d6 masque de shift
        !          4872:         bra     7$
        !          4873: 6$:     movl    a1@(4),d3
        !          4874:         roll    d1,d3
        !          4875:         movl    d3,d5
        !          4876:         andl    d6,d3
        !          4877:         addl    d3,d0
        !          4878:         movl    d0,a1@+
        !          4879:         subl    d3,d5
        !          4880:         movl    d5,d0
        !          4881: 7$:     dbra    d2,6$
        !          4882:         roll    d1,d4           | shifter dernier quotient
        !          4883:         andl    d6,d4
        !          4884:         addl    d4,d0
        !          4885:         movl    d0,a1@
        !          4886: 5$:     movl    a6@(8),a2       | a2 pointe sur r2 dividende
        !          4887:         movl    a2@(4),d2
        !          4888:         andl    #0xffffff,d2    | exposant biaise de r2
        !          4889:         subl    d1,d2           | exposant resultat
        !          4890:         bpl     8$
        !          4891:                                 | ici underflow
        !          4892: 9$:     movl    #diver7,sp@-
        !          4893:         jsr     _pari_err
        !          4894: 8$:     movw    d2,a0@(6)
        !          4895:         swap    d2
        !          4896:         movb    d2,a0@(5)       | range exposant
        !          4897: divrsf: movl    a0,d0
        !          4898:         moveml  sp@+,d2-d6/a2
        !          4899:         unlk    a6
        !          4900:         rts
        !          4901:
        !          4902:
        !          4903: #===================================================================#
        !          4904: #                                                                   #
        !          4905: #               Division : reel / entier = reel                     #
        !          4906: #                                                                   #
        !          4907: #       entree : a7@(4) pointe sur r2 de type R                     #
        !          4908: #                a7@(8) pointe sur i1 de type I                     #
        !          4909: #       sortie : d0 pointe sur r2 / i1 de type R (zone creee)       #
        !          4910: #                                                                   #
        !          4911: #===================================================================#
        !          4912:
        !          4913: _divri: link    a6,#-32         | var. locales pour appel dvrr
        !          4914:         moveml  d2-d3/a2-a3,sp@-
        !          4915:         movl    a6@(12),a1      | a1 pointe sur le diviseur i1
        !          4916:         tstb    a1@(4)
        !          4917:         bne     1$
        !          4918:                                 | ici i1 = 0
        !          4919:         movl    #diver8,sp@-
        !          4920:         jsr     _pari_err
        !          4921:                                 | ici i1 <> 0
        !          4922: 1$:     movl    a6@(8),a2       | a2 pointe sur le dividende r2
        !          4923:         tstb    a2@(4)
        !          4924:         bne     2$
        !          4925:                                 | ici r2 = 0
        !          4926:         moveq   #3,d0
        !          4927:         bsr     getr
        !          4928:         movw    a1@(6),d0
        !          4929:         lsll    #5,d0
        !          4930:         bfffo   a1@(8){#0:#0},d1
        !          4931:         addl    a2@(4),d1
        !          4932:         addl    #65,d1
        !          4933:         subl    d0,d1
        !          4934:         bpl     3$
        !          4935:         movl    #diver12,sp@-   | underflow R/I avec R = 0
        !          4936:         jsr     _pari_err
        !          4937: 3$:     movl    d1,a0@(4)
        !          4938:         clrl    a0@(8)
        !          4939:         movl    a0,d0
        !          4940:         bra     divrif
        !          4941:                                 | ici r2 et i1 <> 0
        !          4942: 2$:     moveq   #0,d0
        !          4943:         movw    a2@(2),d0
        !          4944:         bsr     getr            | allocation pour resultat
        !          4945:        movl    _avma,a3        | eviter le chevauchement.
        !          4946:        subql   #8,a3
        !          4947:        movl    a3,_avma
        !          4948:        movl    #2,a3@          | Hack pour que giv rende ceci
        !          4949:         movl    a0,a3           | sauvegarde adr. resultat
        !          4950:         addqw   #1,d0
        !          4951:         bsr     getr            | allocation pour conversion i1 type R
        !          4952:         movl    a0,a6@(-16)     | sauvegarde adr. copie
        !          4953:         movl    a0,sp@-
        !          4954:         movl    a1,sp@-
        !          4955:         bsr     _affir
        !          4956:         addql   #8,sp
        !          4957:         movl    a0,a1           | a1 pointe sur copie i1
        !          4958:         movl    a3,a0           | a0 pointe sur resultat
        !          4959:         bsr     dvrr
        !          4960:         movl    a6@(-16),a0
        !          4961:         bsr     giv             | desallouer copie
        !          4962:         movl    a3,d0
        !          4963: divrif: moveml  sp@+,d2-d3/a2-a3
        !          4964:         unlk    a6
        !          4965:         rts
        !          4966:
        !          4967: #===================================================================#
        !          4968: #                                                                   #
        !          4969: #               Division : reel / reel = reel                       #
        !          4970: #                                                                   #
        !          4971: #       entree : a7@(4) pointe sur r2 de type R                     #
        !          4972: #                a7@(8) pointe sur r1 de type R                     #
        !          4973: #       sortie : d0 pointe sur r2 / r1 de type R (zone creee)       #
        !          4974: #       precision : L = inf ( L1 , L2 )                             #
        !          4975: #                                                                   #
        !          4976: #===================================================================#
        !          4977:
        !          4978: _divrr: link    a6,#-32         | var. locales pour appel dvrr
        !          4979:         movl    a2,sp@-
        !          4980:         movl    a6@(12),a1      | a1 pointe sur r1=y diviseur
        !          4981:         movl    a6@(8),a2       | a2 pointe sur r2=x dividende
        !          4982:         tstb    a1@(4)          | r1 = 0 ?
        !          4983:         bne     1$
        !          4984:                                 | ici r1 = 0
        !          4985:         movl    #diver9,sp@-
        !          4986:         jsr     _pari_err
        !          4987: 1$:     tstb    a2@(4)          | r2 = 0 ?
        !          4988:         bne     3$
        !          4989:                                 | ici r2=0, r1<>0 : resultat nul
        !          4990:         moveq   #3,d0
        !          4991:         bsr     getr
        !          4992:         movl    a1@(4),d0
        !          4993:         andl    #0xffffff,d0    | exposant de r1
        !          4994:         subl    a2@(4),d0
        !          4995:         negl    d0
        !          4996:         addl    #0x800000,d0
        !          4997:         cmpl    #0x1000000,d0
        !          4998:         bcs     4$
        !          4999:         movl    #diver11,sp@-   | debordement r/r
        !          5000:         jsr     _pari_err
        !          5001: 4$:     tstl    d0
        !          5002:         bgt     5$
        !          5003:         movl    #diver10,sp@-   | underflow r/r
        !          5004:         jsr     _pari_err
        !          5005: 5$:     movl    d0,a0@(4)
        !          5006:         clrl    a0@(8)
        !          5007:         bra     divrrf
        !          5008: 3$:     movw    a1@(2),d0
        !          5009:         cmpw    a2@(2),d0
        !          5010:         bls     2$
        !          5011:         movw    a2@(2),d0       | d0 recoit l=inf(l1,l2)
        !          5012: 2$:     bsr     getr
        !          5013:         bsr     dvrr            | effectuer la division !
        !          5014: divrrf: movl    a0,d0
        !          5015:         movl    sp@,a2
        !          5016:         unlk    a6
        !          5017:         rts
        !          5018:
        !          5019: #===================================================================#
        !          5020: #                                                                   #
        !          5021: #       module interne de division r/r (pour R/R,R/I,I/R et S/R)    #
        !          5022: #       --------------------------------------------------------    #
        !          5023: #       entree : a1 et a2 pointent sur 2 reels r1 et r2             #
        !          5024: #       tous 2 non nuls.                                            #
        !          5025: #       a0 pointe sur un type reel de longueur l=inf(l1,l2)         #
        !          5026: #       ce module a besoin de variables locales reservees et        #
        !          5027: #       pointees par a6 dans le programme appelant.                 #
        !          5028: #       sortie : le quotient r2/r1 est mis a l'addresse initiale a0 #
        !          5029: #       (qui n'est pas affectee)                                    #
        !          5030: #===================================================================#
        !          5031:
        !          5032: dvrr:   moveml  d2-d7/a2-a4,sp@-
        !          5033:         movb    a1@(4),d1       | signe de r1
        !          5034:         movb    a2@(4),d2       | signe de r2
        !          5035:         eorb    d2,d1
        !          5036:         addqb   #1,d1
        !          5037:         movb    d1,a6@(-2)      | sauvegarde signe resultat
        !          5038:         movl    a2@(4),d2
        !          5039:         andl    #0xffffff,d2
        !          5040:         movl    a1@(4),d1
        !          5041:         andl    #0xffffff,d1
        !          5042:         subl    d1,d2
        !          5043:         addl    #0x800000,d2   | exposant provisoire avec offset
        !          5044:         movl    d2,a6@(-6)      | sauvegarde
        !          5045:
        !          5046:         movw    a0@(2),d0       | d0.w recoit longueur resultat ( inf(l1,l2) )
        !          5047:         movw    a1@(2),d1
        !          5048:        cmpw    #3,d1           | diviseur de longeur 3 ?
        !          5049:        bne     5$
        !          5050:        movl    a1@(8),d1
        !          5051:        movl    a2@(8),d3
        !          5052:        clrl    d2
        !          5053:        cmpw    #3,a2@(2)
        !          5054:        beq     7$
        !          5055:        movl    a2@(12),d2
        !          5056: 7$:    cmpl    d3,d1
        !          5057:        bls     6$
        !          5058:        divul   d1,d3:d2
        !          5059:        movl    d2,a0@(8)
        !          5060:        movl    a6@(-6),d0      | ici mantisse correcte, soustraire 1 a l'exposant
        !          5061:        subql   #1,d0
        !          5062:        bra     comd2
        !          5063: 6$:    lsrl    #1,d3
        !          5064:        roxrl   #1,d2           | shifter de 1 a droite le quadword
        !          5065:        divul   d1,d3:d2
        !          5066:        movl    d2,a0@(8)
        !          5067:        movl    a6@(-6),d0      | exposant correct
        !          5068:        bra     comd2
        !          5069: 5$:     subw    d0,d1           | flag nombre de mots du diviseur
        !          5070:         movw    d1,a6@(-28)     | a sauvegarder.
        !          5071:         subqw   #2,d0
        !          5072:         movw    d0,d7           | d0 et d7 recoit m=inf(l1,l2)-2
        !          5073:         movw    d7,a6@(-12)     | d7 sera compt boucle externe
        !          5074:         movl    a0@,a6@(-10)    | sauvegarde 1er lg mot code resultat
        !          5075:                                 | (on a besoin de toute la place)
        !          5076:        movw    a2@(2),d6
        !          5077:        subqw   #2,d6           | sauvegarde l2-2
        !          5078:         addql   #8,a2           | a2 pointe sur y1 (1er mot dividende
        !          5079:                                 | on note y=y1y2...ym le dividende
        !          5080:         movl    a0,a4
        !          5081:         clrl    a4@+
        !          5082: 1$:     movl    a2@+,a4@+       | on recopie m+1 lgmots mantisse de y
        !          5083:         dbra    d0,1$           | precede par un zero
        !          5084:        cmpw    d7,d6           | l2>l1 ?
        !          5085:        bgt     4$
        !          5086:        clrl    a4@(-4)         | Si l2<=l1, y(m+1) n'existe pas
        !          5087:                                 | a4 pointe apres y(m+1)
        !          5088: 4$:     movl    a0,a2           | a2 pointe sur y0=0 1er mot dividende
        !          5089:         addql   #8,a1           | a1 pointe sur x1 1er mot diviseur
        !          5090:         lea     a1@(8,d7:w:4),a3| a3 pointe apres x(m+2)
        !          5091:         movl    a3,a6@(-32)
        !          5092:         movw    a6@(-28),d6     | (peut etre n'importe quoi mais va etre
        !          5093:         bne     2$              | corrige)
        !          5094:         movl    a3@(-8),a6@(-20)
        !          5095:         clrl    a3@(-8)
        !          5096: 2$:     subqw   #1,d6
        !          5097:         bgt     3$
        !          5098:         movl    a3@(-4),a6@(-24)
        !          5099:         clrl    a3@(-4)
        !          5100: 3$:     moveq   #0,d6           | d6 recoit 0 pour les addx
        !          5101:
        !          5102:                                 | Boucles de division R/R
        !          5103:                                 | d7 compt bcl externe initialise a m
        !          5104:                                 | pour trouver q0q1...qm
        !          5105:                                 | d0 compt bcl interne initialise
        !          5106:                                 | par d7 a chaque tour
        !          5107: #...................................................................#
        !          5108: dext:   movl    a1@,d0          | d0 recoit x1 (1er mot diviseur)
        !          5109:         cmpl    a2@,d0          | compare a yi
        !          5110:         bne     1$
        !          5111:         movl    #-1,d1          | essayer q=2^32-1
        !          5112:         addl    a2@(4),d0
        !          5113:         bcs     4$
        !          5114:         movl    d0,d2
        !          5115:         bra     2$
        !          5116: 1$:     bcc    9$
        !          5117:
        !          5118:        moveml  a3-a4/d7,sp@-   | le quotient precedent etait trop faible
        !          5119:        addql   #4,a3
        !          5120:        subxl   a3@-,a4@-
        !          5121: 10$:   subxl   a3@-,a4@-
        !          5122:        dbra    d7,10$
        !          5123: 11$:   addql   #1,a4@-
        !          5124:        beq     11$
        !          5125:        moveml  sp@+,a3-a4/d7
        !          5126:
        !          5127: 9$:    movl    a2@,d2          | d2 recoit yi
        !          5128:         movl    a2@(4),d1       | d2:d1 recoit yiy(i+1)
        !          5129:         divul   d0,d2:d1        | d1 recoit q = yiy(i+1) div x1
        !          5130:                                 | d2 recoit r = yiy(i+1) mod x1
        !          5131: 2$:     movl    a1@(4),d3       | d3 recoit x2
        !          5132:         mulul   d1,d4:d3        | d4:d3 recoit q*x2
        !          5133:         subl    a2@(8),d3
        !          5134:         subxl   d2,d4           | d4:d3 recoit q*x2-(r,y(i+2))
        !          5135:         bls     4$
        !          5136:
        !          5137: 3$:     subql   #1,d1           | ici q est trop grand : q-1
        !          5138:         subl    a1@(4),d3
        !          5139:         subxl   d0,d4           | correction du reste partiel
        !          5140:         bhi     3$              | boucler tant que trop
        !          5141:                                 | ici q =yiy(i+1)y(i+2) div x1x2 correct
        !          5142:                                 | on va calculer le reste partiel
        !          5143: 4$:     movw    d7,d0           | d0  recoit m-i compteur
        !          5144:         movl    a3,a1           | a3,a1 pointent apres y(m+2-i)
        !          5145:         movl    a4,a2           | a4,a2 pointent apres y(m+1)
        !          5146:         movl    a1@-,d2
        !          5147:         mulul   d1,d3:d2        | initialise retenue d3 par
        !          5148:         subl    d2,d2           | poids fort de q*y(m+2-i). d2 et X a 0
        !          5149: 5$:     movl    a1@-,d5
        !          5150:         mulul   d1,d4:d5        | boucle interne de multiplication et
        !          5151:         addxl   d3,d5           | soustraction :
        !          5152:         addxl   d2,d4           | yi...y(m+1) recoit yi...y(m+1)-
        !          5153:         subl    d5,a2@-         |      q*x1...x(m+1-i)
        !          5154:         movl    d4,d3
        !          5155:         dbra    d0,5$
        !          5156:         addxl   d2,d3
        !          5157:         subl    d3,a2@(-4)
        !          5158:         bcc     6$
        !          5159:                                 | ici carry: q encore 1 de trop
        !          5160:         subql   #1,d1
        !          5161:         movw    d7,d0
        !          5162:         movl    a3,a1
        !          5163:         movl    a4,a2
        !          5164:         subql   #4,a1           | correction sur a1 (car on avait prevu
        !          5165:                                 | d'initialiser la retenue)
        !          5166: 7$:     addxl   a1@-,a2@-
        !          5167:         dbra    d0,7$           | boucle de readdition(met reste a jour)
        !          5168: 6$:     movl    d1,a2@(-4)      | qi correct ! ranger a la place de xi
        !          5169:         subql   #4,a3           | a3 p. un mot de moins pour bcle suiv.
        !          5170:                                 | a3 pointe sur x(m-i+1)
        !          5171: bcdf:   dbra    d7,dext         | fin de boucle externe de division
        !          5172: #...................................................................#
        !          5173:        movl    a6@(-32),a3
        !          5174:         movw    a6@(-28),d5     | remise eventuelle de xm+1 et xm+2
        !          5175:         bne     7$
        !          5176:         movl    a6@(-20),a3@(-8)
        !          5177: 7$:     subqw   #1,d5
        !          5178:         bgt     8$
        !          5179:         movl    a6@(-24),a3@(-4)
        !          5180: 8$:     movw    a6@(-12),d5
        !          5181:         movw    d5,d4           | d4 recoit m
        !          5182: 6$:     movl    a2@-,a2@(4)
        !          5183:         dbra    d5,6$
        !          5184:         movl    a6@(-10),a2@+   | 1er lg mot code;a2 pointe sur q1
        !          5185:         movl    a6@(-6),d0      | exposant biaise
        !          5186:         movl    a2@,d1          | d1 recoit q0=0 ou 1
        !          5187:         bne     1$
        !          5188:                                 | ici q0=0 : mantisse correcte
        !          5189:         subql   #1,d0           | retrancher 1 a l'exposant
        !          5190:         bra     comd2
        !          5191: 1$:     addql   #4,a2           | ici q0=1 : shifter de 1 a droite
        !          5192:         subqw   #1,d4           | d4 recoit m-1
        !          5193:         asrw    #1,d1           | met carry flag
        !          5194: 5$:     roxrw   a2@+
        !          5195:         roxrw   a2@+
        !          5196:         dbra    d4,5$           | boucle de normalisation
        !          5197: comd2:  cmpl    #0x1000000,d0
        !          5198:         ble     3$
        !          5199:         movl    #diver10,sp@-   | underflow
        !          5200:         jsr     _pari_err
        !          5201: 3$:     bcs     4$
        !          5202:         movl    #diver11,sp@-   | overflow
        !          5203:         jsr     _pari_err
        !          5204: 4$:     movl    d0,a0@(4)       | range exposant
        !          5205:         movb    a6@(-2),a0@(4)  | range signe
        !          5206:         moveml  sp@+,d2-d7/a2-a4
        !          5207: dvrrf:  rts
        !          5208:
        !          5209:
        !          5210:
        !          5211:
        !          5212: #*******************************************************************#
        !          5213: #*******************************************************************#
        !          5214: #**                                                               **#
        !          5215: #**                     PROGRAMMES D ' INVERSION                  **#
        !          5216: #**             ( programmes par valeurs : le resultat est        **#
        !          5217: #*                      mis dans un REEL existant deja  )         **#
        !          5218: #**                                                               **#
        !          5219: #*******************************************************************#
        !          5220: #*******************************************************************#
        !          5221:
        !          5222:
        !          5223: _mpinvsr:movl   sp@(8),sp@-
        !          5224:         movl    sp@(8),sp@-
        !          5225:         pea     1
        !          5226:         bsr     divssr
        !          5227:         lea     sp@(12),sp
        !          5228:         rts
        !          5229:
        !          5230: _mpinvz:cmpb    #1,sp@(4)@
        !          5231:         bne     _mpinvrr
        !          5232:
        !          5233: _mpinvir:movl   sp@(8),sp@-
        !          5234:         movl    sp@(8),sp@-
        !          5235:         pea     1
        !          5236:         bsr     _divsiz
        !          5237:         lea     sp@(12),sp
        !          5238:         rts
        !          5239:
        !          5240: _mpinvrr:movl   sp@(8),sp@-
        !          5241:         movl    sp@(8),sp@-
        !          5242:         pea     1
        !          5243:         bsr     _divsrz
        !          5244:         lea     sp@(12),sp
        !          5245:         rts
        !          5246:
        !          5247:
        !          5248:
        !          5249: #*******************************************************************#
        !          5250: #*******************************************************************#
        !          5251: #**                                                               **#
        !          5252: #**                     PROGRAMMES MODULO                         **#
        !          5253: #**                                                               **#
        !          5254: #*******************************************************************#
        !          5255: #*******************************************************************#
        !          5256:
        !          5257:
        !          5258:
        !          5259:
        !          5260:
        !          5261:
        !          5262: #===================================================================#
        !          5263: #                                                                   #
        !          5264: #                       Modulo (par valeur)                         #
        !          5265: #                                                                   #
        !          5266: #       entree : a7@(4) pointe sur n2 de type I                     #
        !          5267: #                a7@(8) pointe sur n1 de type I                     #
        !          5268: #                a7@(12) pointe sur n3 de type I                    #
        !          5269: #       sortie : la zone pointee par a7@(12) contient le reste de   #
        !          5270: #                la division de n2 par n1                           #
        !          5271: #                compris entre 0 et abs(n1)-1                       #
        !          5272: #       interdit : type S et R                                      #
        !          5273: #                                                                   #
        !          5274: #===================================================================#
        !          5275:
        !          5276: _mpmodz:lea     _modii,a0
        !          5277:         bra     mpopi
        !          5278:
        !          5279:                                 | modulo S mod S = I sinon erreur
        !          5280:
        !          5281: _modssz:lea     _modss,a0
        !          5282:         bra     mpopi
        !          5283:
        !          5284:                                 | modulo S mod I = I sinon erreur
        !          5285:
        !          5286: _modsiz:lea     _modsi,a0
        !          5287:         bra     mpopi
        !          5288:
        !          5289:                                 | modulo I mod S = I sinon erreur
        !          5290:
        !          5291: _modisz:lea     _modis,a0
        !          5292:         bra     mpopi
        !          5293:
        !          5294:                                 | modulo I mod I = I sinon erreur
        !          5295:
        !          5296: _modiiz:lea     _modii,a0
        !          5297:         bra     mpopi
        !          5298:
        !          5299: #===================================================================#
        !          5300: #                                                                   #
        !          5301: #               entier court Modulo entier court = entier           #
        !          5302: #                                                                   #
        !          5303: #       entree : a7@(4) contient s2 de type S                       #
        !          5304: #                a7@(8) contient s1 de type S                       #
        !          5305: #       sortie : d0 pointe sur s2 mod s1 de type I (zone creee)     #
        !          5306: #                compris entre 0 et abs(s1)-1                       #
        !          5307: #                                                                   #
        !          5308: #===================================================================#
        !          5309:
        !          5310: _modss: link    a6,#0
        !          5311:         moveml  d2-d3,sp@-
        !          5312:        moveq   #0,d3
        !          5313:         movl    a6@(12),d1      | d1.l contient s1
        !          5314:         bne     1$
        !          5315:                                 | ici s1 = 0
        !          5316:         movl    #moder1,sp@-
        !          5317:         jsr     _pari_err
        !          5318:                                 | ici s1 <> 0
        !          5319: 1$:     movl    a6@(8),d2       | d2.l contient s2
        !          5320:        bpl     9$
        !          5321:        moveq   #-1,d3
        !          5322: 9$:     divsll  d1,d3:d2
        !          5323:         tstl    d3
        !          5324:         bne     2$
        !          5325:                                 | ici reste nul
        !          5326: 3$:     movl   _gzero,d0
        !          5327:         bra     modssf
        !          5328:                                 | ici reste non nul
        !          5329: 2$:     bmi     5$
        !          5330:                                 | ici reste > 0
        !          5331:         moveq   #3,d0
        !          5332:         bsr     geti
        !          5333:         movl    #0x1000003,a0@(4)
        !          5334:         movl    d3,a0@(8)
        !          5335:         bra 7$
        !          5336:                                 | ici reste < 0
        !          5337: 5$:     movl    a6@(12),sp@-
        !          5338:         movl    d3,sp@-
        !          5339:         tstl    d1
        !          5340:         bpl     6$
        !          5341:                                 | ici s1 < 0
        !          5342:         bsr     _subss
        !          5343:         addql   #8,sp
        !          5344:         bra     modssf
        !          5345:                                 | ici s1 > 0
        !          5346: 6$:     bsr     _addss
        !          5347:         addql   #8,sp
        !          5348:         bra     modssf
        !          5349: 7$:     movl    a0,d0
        !          5350: modssf: moveml  sp@+,d2-d3
        !          5351:         unlk    a6
        !          5352:         rts
        !          5353:
        !          5354: #===================================================================#
        !          5355: #                                                                   #
        !          5356: #               entier court Modulo entier = entier                 #
        !          5357: #                                                                   #
        !          5358: #       entree : a7@(4) contient s2 de type S                       #
        !          5359: #                a7@(8) ppinte sur i1 de type I                     #
        !          5360: #       sortie : d0 pointe sur s2 mod i1 de type I (zone creee)     #
        !          5361: #                compris entre 0 et abs(i1)-1                       #
        !          5362: #                                                                   #
        !          5363: #===================================================================#
        !          5364:
        !          5365: _modsi: link    a6,#0
        !          5366:         moveml  d2-d3,sp@-
        !          5367:         movl    a6@(12),sp@-
        !          5368:         movl    a6@(8),sp@-
        !          5369:         bsr     _divsi
        !          5370:         addql   #8,sp
        !          5371:         movl    d0,a0
        !          5372:         bsr     giv             | desallouer memoire provisoire
        !          5373:         tstl    d1              | tester le reste
        !          5374:         bne     1$
        !          5375:                                 | ici reste nul
        !          5376:         movl   _gzero,d0
        !          5377:         bra     modsif
        !          5378:                                 | ici reste non nul
        !          5379: 1$:     bmi     3$
        !          5380:                                 | ici reste > 0
        !          5381:         movl    d1,d3           | d3.l recoit le reste
        !          5382:         moveq   #3,d0
        !          5383:         bsr     geti
        !          5384:         movl    #0x1000003,a0@(4)
        !          5385:         movl    d3,a0@(8)
        !          5386:         bra     2$
        !          5387:                                 | ici reste < 0
        !          5388: 3$:     movl    a6@(12),sp@-
        !          5389:         movl    d1,sp@-
        !          5390:         movl    a6@(12),a1      | a1 pointe sur i1
        !          5391:         tstb    a1@(4)
        !          5392:         bpl     5$
        !          5393:                                 | ici i1 < 0
        !          5394:         bsr     _subsi
        !          5395:         bra     6$
        !          5396:                                 | ici i1 > 0
        !          5397: 5$:     bsr     _addsi
        !          5398: 6$:     addql   #8,sp
        !          5399:         bra     modsif
        !          5400: 2$:     movl    a0,d0
        !          5401: modsif: moveml  sp@+,d2-d3
        !          5402:         unlk    a6
        !          5403:         rts
        !          5404:
        !          5405: #===================================================================#
        !          5406: #                                                                   #
        !          5407: #               entier Modulo entier court = entier                 #
        !          5408: #                                                                   #
        !          5409: #       entree : a7@(4) pointe sur i2 de type I                     #
        !          5410: #                a7@(8) contient s1 de type S                       #
        !          5411: #       sortie : d0 pointe sur i2 mod s1 de type I (zone creee)     #
        !          5412: #                compris entre 0 et abs(s1)-1                       #
        !          5413: #                                                                   #
        !          5414: #===================================================================#
        !          5415:
        !          5416: _modis: link    a6,#0
        !          5417:         moveml  d2-d3,sp@-
        !          5418:         movl    a6@(12),sp@-
        !          5419:         movl    a6@(8),sp@-
        !          5420:         bsr     _divis
        !          5421:         addql   #8,sp
        !          5422:         movl    d0,a0
        !          5423:         bsr     giv
        !          5424:         tstl    d1
        !          5425:         bne     1$
        !          5426:                                 | ici reste nul
        !          5427:        movl    _gzero,d0
        !          5428:         bra     modisf
        !          5429:                                 | ici reste non nul
        !          5430: 1$:     bmi     3$
        !          5431:                                 | ici reste > 0
        !          5432:         movl    d1,d3
        !          5433:         moveq   #3,d0
        !          5434:         bsr     geti
        !          5435:         movl    #0x1000003,a0@(4)
        !          5436:         movl    d3,a0@(8)
        !          5437:         bra     2$
        !          5438:                                 | ici reste < 0
        !          5439: 3$:     movl    a6@(12),sp@-
        !          5440:         movl    d1,sp@-
        !          5441:         movl    a6@(12),d1      | d1.l contient s1
        !          5442:         bpl     5$
        !          5443:         bsr     _subss
        !          5444:         bra     6$
        !          5445: 5$:     bsr     _addss
        !          5446: 6$:     addql   #8,sp
        !          5447:         bra     modisf
        !          5448: 2$:     movl    a0,d0
        !          5449: modisf: moveml  sp@+,d2-d3
        !          5450:         unlk    a6
        !          5451:         rts
        !          5452:
        !          5453: #===================================================================#
        !          5454: #                                                                   #
        !          5455: #               entier Modulo entier = entier                       #
        !          5456: #                                                                   #
        !          5457: #       entree : a7@(4) pointe sur i2 de type I                     #
        !          5458: #                a7@(8) pointe sur i1 de type I                     #
        !          5459: #       sortie : d0 pointe sur i2 mod i1 de type I                  #
        !          5460: #                compris entre 0 et abs(i1)-1(zone creee)           #
        !          5461: #                                                                   #
        !          5462: #===================================================================#
        !          5463:
        !          5464: _modii: link    a6,#-4
        !          5465:         movl    #-1,sp@-
        !          5466:         movl    a6@(12),sp@-    | empilage adresse i1
        !          5467:         movl    a6@(8),sp@-     | empilage adresse i2
        !          5468:         movl    _avma,a6@(-4)   | sauvegarde adr. tete pile PARI
        !          5469:         bsr     _asmdvmdii
        !          5470:         movl    d0,a1           | a1 pointe sur resultat
        !          5471:         tstb    a1@(4)
        !          5472:         bpl     modiif
        !          5473:                                 | ici reste negatif
        !          5474:         movl    a1,sp@          | empilage adr. du reste
        !          5475:         tstb    a6@(12)@(4)     | test signe du modulo
        !          5476:         bpl     1$
        !          5477:         bsr     _subii
        !          5478:         bra     2$
        !          5479: 1$:     bsr     _addii
        !          5480: 2$:     movl    sp@+,a1
        !          5481:         movl    _avma,a0
        !          5482:         movw    a0@(2),d0
        !          5483:         subqw   #1,d0
        !          5484:         movl    a6@(-4),a0      | a0 pointe sur pile initiale
        !          5485: 3$:     movl    a1@-,a0@-
        !          5486:         dbra    d0,3$           | ecraser resultat intermediaire
        !          5487:         movl    a0,_avma
        !          5488:         movl    a0,d0           | nouvelle adresse resultat
        !          5489: modiif: unlk    a6
        !          5490:         rts
        !          5491:
        !          5492:
        !          5493:
        !          5494:
        !          5495:
        !          5496: #*******************************************************************#
        !          5497: #*******************************************************************#
        !          5498: #**                                                               **#
        !          5499: #**     PROGRAMMES DE RESTE DES DIVISIONS ENTIERES                **#
        !          5500: #**                                                               **#
        !          5501: #*******************************************************************#
        !          5502: #*******************************************************************#
        !          5503:
        !          5504:
        !          5505:
        !          5506:
        !          5507:
        !          5508: #===================================================================#
        !          5509: #                                                                   #
        !          5510: #                       Reste (par valeur)                          #
        !          5511: #                                                                   #
        !          5512: #       entree : a7@(4) pointe sur n2 de type I                     #
        !          5513: #                a7@(8) pointe sur n1 de type I                     #
        !          5514: #                a7@(12) pointe sur n3 de type I                    #
        !          5515: #       sortie : la zone pointee par a7@(12) contient le reste de   #
        !          5516: #                la division de n2 par n1 (du signe du dividende)   #
        !          5517: #       interdit : type S et R                                      #
        !          5518: #                                                                   #
        !          5519: #===================================================================#
        !          5520:
        !          5521: _mpresz:lea     _resii,a0
        !          5522:         bra     mpopi
        !          5523:
        !          5524:                                 | reste de S/S = I sinon erreur
        !          5525:
        !          5526: _resssz:lea     _resss,a0
        !          5527:         bra     mpopi
        !          5528:
        !          5529:                                 | reste de S/I = I sinon erreur
        !          5530:
        !          5531: _ressiz:lea     _ressi,a0
        !          5532:         bra     mpopi
        !          5533:
        !          5534:                                 | reste de I/S = I sinon erreur
        !          5535:
        !          5536: _resisz:lea     _resis,a0
        !          5537:         bra     mpopi
        !          5538:
        !          5539:                                 | reste de I/I = I sinon erreur
        !          5540:
        !          5541: _resiiz:lea     _resii,a0
        !          5542:         bra     mpopi
        !          5543:
        !          5544: #===================================================================#
        !          5545: #                                                                   #
        !          5546: #               Reste : entier court / entier court = entier        #
        !          5547: #                                                                   #
        !          5548: #       entree : a7@(4) contient s2 de type S                       #
        !          5549: #                a7@(8) contient s1 de type S                       #
        !          5550: #       sortie : d0 pointe sur le reste de la division s2 / s1      #
        !          5551: #                de type I (zone creee)                             #
        !          5552: #                Le reste est du signe du dividende                 #
        !          5553: #                                                                   #
        !          5554: #===================================================================#
        !          5555:
        !          5556: _resss: link    a6,#0
        !          5557:         moveml  d2-d3,sp@-
        !          5558:        moveq   #0,d3
        !          5559:         movl    a6@(12),d1      | d1.l contient le diviseur s1
        !          5560:         bne     1$
        !          5561:                                 | ici s1 = 0
        !          5562:         movl    #reser1,sp@-
        !          5563:         jsr     _pari_err
        !          5564:                                 | ici s1 <> 0
        !          5565: 1$:     movl    a6@(8),d2       | d2.l contient s2
        !          5566:        bpl     9$
        !          5567:        moveq   #-1,d3
        !          5568: 9$:     divsll  d1,d3:d2
        !          5569:         tstl    d3
        !          5570:         bne     2$
        !          5571:                                 | ici reste nul
        !          5572:        movl    _gzero,d0
        !          5573:         bra     resssg
        !          5574:                                 | ici reste non nul
        !          5575: 2$:     moveq   #3,d0
        !          5576:         bsr     geti
        !          5577:         movl    #0x1000003,a0@(4)
        !          5578:         tstl    d3
        !          5579:         bpl     3$
        !          5580:         negl    d3
        !          5581:         movb    #-1,a0@(4)
        !          5582: 3$:     movl    d3,a0@(8)
        !          5583: resssf: movl    a0,d0
        !          5584: resssg: moveml  sp@+,d2-d3
        !          5585:         unlk    a6
        !          5586:         rts
        !          5587:
        !          5588: #===================================================================#
        !          5589: #                                                                   #
        !          5590: #               Reste : entier court / entier = entier              #
        !          5591: #                                                                   #
        !          5592: #       entree : a7@(4) contient s2 de type S                       #
        !          5593: #                a7@(8) pointe sur i1 de type I                     #
        !          5594: #       sortie : d0 pointe sur le reste de la division s2 / i1      #
        !          5595: #                de type I (zone creee)                             #
        !          5596: #                Le reste est du signe du dividende                 #
        !          5597: #                                                                   #
        !          5598: #===================================================================#
        !          5599:
        !          5600: _ressi: movl    sp@(8),sp@-     | empilage adr. i1
        !          5601:         movl    sp@(8),sp@-     | empilage s2
        !          5602:         bsr     _divsi
        !          5603:         movl    d0,a0           | a0 pointe sur resultat prov.
        !          5604:         bsr     giv
        !          5605:         tstl    d1              | d1.l contient le reste
        !          5606:         bne     1$
        !          5607:                                 | ici reste nul
        !          5608:        movl    _gzero,d0
        !          5609:         bra     ressig
        !          5610:                                 | ici reste non nul
        !          5611: 1$:     moveq   #3,d0
        !          5612:         bsr     geti
        !          5613:         movl    #0x1000003,a0@(4)
        !          5614:         tstl    d1
        !          5615:         bpl     2$
        !          5616:         negl    d1
        !          5617:         movb    #-1,a0@(4)
        !          5618: 2$:     movl    d1,a0@(8)
        !          5619: ressif: movl    a0,d0
        !          5620: ressig: addql   #8,sp
        !          5621:         rts
        !          5622:
        !          5623: #===================================================================#
        !          5624: #                                                                   #
        !          5625: #               Reste : entier / entier court = entier              #
        !          5626: #                                                                   #
        !          5627: #       entree : a7@(4) pointe sur i2 de type I                     #
        !          5628: #                a7@(8) contient s1 de type S                       #
        !          5629: #       sortie : d0 pointe sur le reste de la division i2 / s1      #
        !          5630: #                (zone creee)                                       #
        !          5631: #                Le reste est du signe du dividende                 #
        !          5632: #                                                                   #
        !          5633: #===================================================================#
        !          5634:
        !          5635: _resis: movl    sp@(8),sp@-     | empilage s1
        !          5636:         movl    sp@(8),sp@-     | empilage adr.i2
        !          5637:         bsr     _divis
        !          5638:         movl    d0,a0
        !          5639:         bsr     giv             | desallouer memoire provisoire
        !          5640:         tstl    d1              | le reste est dans d1.l
        !          5641:         bne     1$
        !          5642:                                 | ici reste nul
        !          5643:        movl    _gzero,d0
        !          5644:         bra     resisg
        !          5645:                                 | ici reste non nul
        !          5646: 1$:     moveq   #3,d0
        !          5647:         bsr     geti
        !          5648:         movl    #0x1000003,a0@(4)
        !          5649:         tstl    d1
        !          5650:         bpl     2$
        !          5651:         negl    d1
        !          5652:         movb    #-1,a0@(4)
        !          5653: 2$:     movl    d1,a0@(8)
        !          5654: resisf: movl    a0,d0
        !          5655: resisg: addql   #8,sp
        !          5656:         rts
        !          5657:
        !          5658: #===================================================================#
        !          5659: #                                                                   #
        !          5660: #               Reste : entier / entier = entier                    #
        !          5661: #                                                                   #
        !          5662: #       entree : a7@(4) pointe sur i2 de type I                     #
        !          5663: #                a7@(8) pointe sur i1 de type I                     #
        !          5664: #       sortie : d0 pointe sur le reste de la division i2 / i1      #
        !          5665: #                de type I (zone creee)                             #
        !          5666: #                ( du signe du dividende)                           #
        !          5667: #                                                                   #
        !          5668: #===================================================================#
        !          5669:
        !          5670: _resii: movl    #-1,sp@-
        !          5671:         movl    sp@(12),sp@-
        !          5672:         movl    sp@(12),sp@-
        !          5673:         bsr     _asmdvmdii
        !          5674:         lea     sp@(12),sp
        !          5675:         rts
        !          5676:
        !          5677: #===================================================================#
        !          5678: #                                                                   #
        !          5679: #                       Operations par valeur                       #
        !          5680: #                                                                   #
        !          5681: #       entree : a7@(4) contient n2 de type S ou pointe sur n2      #
        !          5682: #                de type I ou R                                     #
        !          5683: #                a7@(8) contient n1 de type S ou pointe sur n1      #
        !          5684: #                de type I ou R                                     #
        !          5685: #                a7@(12) pointe sur n3 de type I ou R               #
        !          5686: #       sortie : la zone pointee par a7@(12) contient n2 op n1      #
        !          5687: #       remarque : les erreurs de type sont detectees dans l'       #
        !          5688: #                  affectation du resultat                          #
        !          5689: #                                                                   #
        !          5690: #===================================================================#
        !          5691:
        !          5692:                                 | operation a trois operandes
        !          5693:                                 | les trois operandes sont de type I
        !          5694:
        !          5695: mpariz: movb    sp@(12)@,d0
        !          5696:         addb    sp@(8)@,d0
        !          5697:         addb    sp@(4)@,d0
        !          5698:         cmpb    #3,d0
        !          5699:         beq     mpopz
        !          5700:         movl    #arier1,sp@-
        !          5701:         jsr     _pari_err
        !          5702:
        !          5703:                                 | le troisieme operande est de type I
        !          5704:
        !          5705: mpopi:  cmpb    #1,sp@(12)@
        !          5706:         beq     mpopz
        !          5707:         movl    #arier2,sp@-
        !          5708:         jsr     _pari_err
        !          5709:                                 | operation quelconque
        !          5710:
        !          5711: mpopz:  movl    sp@(8),sp@-     | 2eme operande
        !          5712:         movl    sp@(8),sp@-     | 1er operande
        !          5713:         jsr     a0@
        !          5714:         movl    sp@(20),sp@(4)  | 3eme operande
        !          5715:         movl    d0,sp@          | resultat operation
        !          5716:         jsr     _mpaff
        !          5717:         addql   #8,sp
        !          5718:         movl    d0,a0
        !          5719:         bra     giv
        !          5720:
        !          5721:                                 | operation a quatre operandes
        !          5722:                                 | avec deux resultats de type I
        !          5723:
        !          5724: mpopii: movb    sp@(16)@,d0
        !          5725:         addb    sp@(12)@,d0
        !          5726:         cmpb    #2,d0
        !          5727:         beq     mpopz2
        !          5728:         movl    #arier2,sp@-
        !          5729:         jsr     _pari_err
        !          5730:
        !          5731:                                 | operation a quatre operande
        !          5732:
        !          5733: mpopz2: link    a6,#-8
        !          5734:         movl    _avma,a6@(-8)
        !          5735:         pea     a6@(-4)
        !          5736:         movl    a6@(12),sp@-    | 2eme operande
        !          5737:         movl    a6@(8),sp@-     | 1er operande
        !          5738:         jsr     a0@
        !          5739:         addql   #4,sp
        !          5740:         movl    a6@(-4),sp@
        !          5741:         movl    a6@(20),sp@(4)
        !          5742:         bsr     _mpaff          | rangement 2 eme resultat
        !          5743:         movl    d0,sp@
        !          5744:         movl    a6@(16),sp@(4)
        !          5745:         bsr     _mpaff          | rangement 1 er resultat
        !          5746:         addql   #8,sp
        !          5747:         movl    a6@(-8),_avma
        !          5748:         unlk    a6
        !          5749:         rts
        !          5750:
        !          5751:
        !          5752:
        !          5753:
        !          5754:
        !          5755: #*******************************************************************#
        !          5756: #*******************************************************************#
        !          5757: #**                                                               **#
        !          5758: #**     PROGRAMMES PAR VALEUR UTILISES POUR LA LECTURE-ECRITURE   **#
        !          5759: #**                                                               **#
        !          5760: #*******************************************************************#
        !          5761: #*******************************************************************#
        !          5762:
        !          5763:
        !          5764:
        !          5765:
        !          5766:
        !          5767: #===================================================================#
        !          5768: #                                                                   #
        !          5769: #       Multiplication par valeur : entier court * entier = entier  #
        !          5770: #                                                                   #
        !          5771: #       entree : a7@(4) contient s2 de type S                       #
        !          5772: #                a7@(8) pointe sur i1 de type I                     #
        !          5773: #                a7@(12) pointe sur i3 de type I                    #
        !          5774: #       sortie : i3 pointe sur s2 * i1                              #
        !          5775: #                                                                   #
        !          5776: #===================================================================#
        !          5777:
        !          5778: _mulsii:movl    sp@(8),sp@-
        !          5779:         movl    sp@(8),sp@-
        !          5780:         bsr     _mulsi
        !          5781:         movl    sp@(20),sp@(4)
        !          5782:         movl    d0,sp@
        !          5783:         bsr     _affii
        !          5784:         movl    sp@,a0
        !          5785:         addql   #8,sp
        !          5786:         bra     giv
        !          5787:
        !          5788: #===================================================================#
        !          5789: #                                                                   #
        !          5790: #       Addition par valeur : entier court + entier = entier        #
        !          5791: #                                                                   #
        !          5792: #       entree : a7@(4) contient s2 de type S                       #
        !          5793: #                a7@(8) pointe sur i1 de type I                     #
        !          5794: #                a7@(12) pointe sur i3 de type I                    #
        !          5795: #       sortie : i3 pointe sur s2 + i1                              #
        !          5796: #                                                                   #
        !          5797: #===================================================================#
        !          5798:
        !          5799: _addsii:movl    sp@(8),sp@-
        !          5800:         movl    sp@(8),sp@-
        !          5801:         bsr     _addsi
        !          5802:         movl    sp@(20),sp@(4)
        !          5803:         movl    d0,sp@
        !          5804:         bsr     _affii
        !          5805:         movl    sp@,a0
        !          5806:         addql   #8,sp
        !          5807:         bra     giv
        !          5808:
        !          5809: #===================================================================#
        !          5810: #                                                                   #
        !          5811: #                       division I / S = I                          #
        !          5812: #                                                                   #
        !          5813: #       entree: a7@(4) pointe sur i2, a7@(8) contient s1            #
        !          5814: #               a7@(12) pointe sur un type I                        #
        !          5815: #       sortie: a7@(12) pointe sur i2 div s1                        #
        !          5816: #               d1 contient i2 mod s1                               #
        !          5817: #                                                                   #
        !          5818: #===================================================================#
        !          5819:
        !          5820: _divisii:movl   sp@(8),sp@-
        !          5821:         movl    sp@(8),sp@-
        !          5822:         bsr     _divis
        !          5823:         movl    sp@(20),sp@(4)
        !          5824:         movl    d0,sp@
        !          5825:         bsr     _affii
        !          5826:         movl    sp@,a0
        !          5827:         addql   #8,sp
        !          5828:         bra     giv

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