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

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

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

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