[BACK]Return to stwotox.sa CVS log [TXT][DIR] Up to [local] / sys / arch / m68k / fpsp

Annotation of sys/arch/m68k/fpsp/stwotox.sa, Revision 1.1

1.1     ! nbrk        1: *      $OpenBSD: stwotox.sa,v 1.2 1996/05/29 21:05:44 niklas Exp $
        !             2: *      $NetBSD: stwotox.sa,v 1.3 1994/10/26 07:50:15 cgd Exp $
        !             3:
        !             4: *      MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
        !             5: *      M68000 Hi-Performance Microprocessor Division
        !             6: *      M68040 Software Package
        !             7: *
        !             8: *      M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc.
        !             9: *      All rights reserved.
        !            10: *
        !            11: *      THE SOFTWARE is provided on an "AS IS" basis and without warranty.
        !            12: *      To the maximum extent permitted by applicable law,
        !            13: *      MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
        !            14: *      INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
        !            15: *      PARTICULAR PURPOSE and any warranty against infringement with
        !            16: *      regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
        !            17: *      and any accompanying written materials.
        !            18: *
        !            19: *      To the maximum extent permitted by applicable law,
        !            20: *      IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
        !            21: *      (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS
        !            22: *      PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
        !            23: *      OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
        !            24: *      SOFTWARE.  Motorola assumes no responsibility for the maintenance
        !            25: *      and support of the SOFTWARE.
        !            26: *
        !            27: *      You are hereby granted a copyright license to use, modify, and
        !            28: *      distribute the SOFTWARE so long as this entire notice is retained
        !            29: *      without alteration in any modified and/or redistributed versions,
        !            30: *      and that such modified versions are clearly identified as such.
        !            31: *      No licenses are granted by implication, estoppel or otherwise
        !            32: *      under any patents or trademarks of Motorola, Inc.
        !            33:
        !            34: *
        !            35: *      stwotox.sa 3.1 12/10/90
        !            36: *
        !            37: *      stwotox  --- 2**X
        !            38: *      stwotoxd --- 2**X for denormalized X
        !            39: *      stentox  --- 10**X
        !            40: *      stentoxd --- 10**X for denormalized X
        !            41: *
        !            42: *      Input: Double-extended number X in location pointed to
        !            43: *              by address register a0.
        !            44: *
        !            45: *      Output: The function values are returned in Fp0.
        !            46: *
        !            47: *      Accuracy and Monotonicity: The returned result is within 2 ulps in
        !            48: *              64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
        !            49: *              result is subsequently rounded to double precision. The
        !            50: *              result is provably monotonic in double precision.
        !            51: *
        !            52: *      Speed: The program stwotox takes approximately 190 cycles and the
        !            53: *              program stentox takes approximately 200 cycles.
        !            54: *
        !            55: *      Algorithm:
        !            56: *
        !            57: *      twotox
        !            58: *      1. If |X| > 16480, go to ExpBig.
        !            59: *
        !            60: *      2. If |X| < 2**(-70), go to ExpSm.
        !            61: *
        !            62: *      3. Decompose X as X = N/64 + r where |r| <= 1/128. Furthermore
        !            63: *              decompose N as
        !            64: *               N = 64(M + M') + j,  j = 0,1,2,...,63.
        !            65: *
        !            66: *      4. Overwrite r := r * log2. Then
        !            67: *              2**X = 2**(M') * 2**(M) * 2**(j/64) * exp(r).
        !            68: *              Go to expr to compute that expression.
        !            69: *
        !            70: *      tentox
        !            71: *      1. If |X| > 16480*log_10(2) (base 10 log of 2), go to ExpBig.
        !            72: *
        !            73: *      2. If |X| < 2**(-70), go to ExpSm.
        !            74: *
        !            75: *      3. Set y := X*log_2(10)*64 (base 2 log of 10). Set
        !            76: *              N := round-to-int(y). Decompose N as
        !            77: *               N = 64(M + M') + j,  j = 0,1,2,...,63.
        !            78: *
        !            79: *      4. Define r as
        !            80: *              r := ((X - N*L1)-N*L2) * L10
        !            81: *              where L1, L2 are the leading and trailing parts of log_10(2)/64
        !            82: *              and L10 is the natural log of 10. Then
        !            83: *              10**X = 2**(M') * 2**(M) * 2**(j/64) * exp(r).
        !            84: *              Go to expr to compute that expression.
        !            85: *
        !            86: *      expr
        !            87: *      1. Fetch 2**(j/64) from table as Fact1 and Fact2.
        !            88: *
        !            89: *      2. Overwrite Fact1 and Fact2 by
        !            90: *              Fact1 := 2**(M) * Fact1
        !            91: *              Fact2 := 2**(M) * Fact2
        !            92: *              Thus Fact1 + Fact2 = 2**(M) * 2**(j/64).
        !            93: *
        !            94: *      3. Calculate P where 1 + P approximates exp(r):
        !            95: *              P = r + r*r*(A1+r*(A2+...+r*A5)).
        !            96: *
        !            97: *      4. Let AdjFact := 2**(M'). Return
        !            98: *              AdjFact * ( Fact1 + ((Fact1*P) + Fact2) ).
        !            99: *              Exit.
        !           100: *
        !           101: *      ExpBig
        !           102: *      1. Generate overflow by Huge * Huge if X > 0; otherwise, generate
        !           103: *              underflow by Tiny * Tiny.
        !           104: *
        !           105: *      ExpSm
        !           106: *      1. Return 1 + X.
        !           107: *
        !           108:
        !           109: STWOTOX        IDNT    2,1 Motorola 040 Floating Point Software Package
        !           110:
        !           111:        section 8
        !           112:
        !           113:        include fpsp.h
        !           114:
        !           115: BOUNDS1        DC.L $3FB98000,$400D80C0 ... 2^(-70),16480
        !           116: BOUNDS2        DC.L $3FB98000,$400B9B07 ... 2^(-70),16480 LOG2/LOG10
        !           117:
        !           118: L2TEN64        DC.L $406A934F,$0979A371 ... 64LOG10/LOG2
        !           119: L10TWO1        DC.L $3F734413,$509F8000 ... LOG2/64LOG10
        !           120:
        !           121: L10TWO2        DC.L $BFCD0000,$C0219DC1,$DA994FD2,$00000000
        !           122:
        !           123: LOG10  DC.L $40000000,$935D8DDD,$AAA8AC17,$00000000
        !           124:
        !           125: LOG2   DC.L $3FFE0000,$B17217F7,$D1CF79AC,$00000000
        !           126:
        !           127: EXPA5  DC.L $3F56C16D,$6F7BD0B2
        !           128: EXPA4  DC.L $3F811112,$302C712C
        !           129: EXPA3  DC.L $3FA55555,$55554CC1
        !           130: EXPA2  DC.L $3FC55555,$55554A54
        !           131: EXPA1  DC.L $3FE00000,$00000000,$00000000,$00000000
        !           132:
        !           133: HUGE   DC.L $7FFE0000,$FFFFFFFF,$FFFFFFFF,$00000000
        !           134: TINY   DC.L $00010000,$FFFFFFFF,$FFFFFFFF,$00000000
        !           135:
        !           136: EXPTBL
        !           137:        DC.L  $3FFF0000,$80000000,$00000000,$3F738000
        !           138:        DC.L  $3FFF0000,$8164D1F3,$BC030773,$3FBEF7CA
        !           139:        DC.L  $3FFF0000,$82CD8698,$AC2BA1D7,$3FBDF8A9
        !           140:        DC.L  $3FFF0000,$843A28C3,$ACDE4046,$3FBCD7C9
        !           141:        DC.L  $3FFF0000,$85AAC367,$CC487B15,$BFBDE8DA
        !           142:        DC.L  $3FFF0000,$871F6196,$9E8D1010,$3FBDE85C
        !           143:        DC.L  $3FFF0000,$88980E80,$92DA8527,$3FBEBBF1
        !           144:        DC.L  $3FFF0000,$8A14D575,$496EFD9A,$3FBB80CA
        !           145:        DC.L  $3FFF0000,$8B95C1E3,$EA8BD6E7,$BFBA8373
        !           146:        DC.L  $3FFF0000,$8D1ADF5B,$7E5BA9E6,$BFBE9670
        !           147:        DC.L  $3FFF0000,$8EA4398B,$45CD53C0,$3FBDB700
        !           148:        DC.L  $3FFF0000,$9031DC43,$1466B1DC,$3FBEEEB0
        !           149:        DC.L  $3FFF0000,$91C3D373,$AB11C336,$3FBBFD6D
        !           150:        DC.L  $3FFF0000,$935A2B2F,$13E6E92C,$BFBDB319
        !           151:        DC.L  $3FFF0000,$94F4EFA8,$FEF70961,$3FBDBA2B
        !           152:        DC.L  $3FFF0000,$96942D37,$20185A00,$3FBE91D5
        !           153:        DC.L  $3FFF0000,$9837F051,$8DB8A96F,$3FBE8D5A
        !           154:        DC.L  $3FFF0000,$99E04593,$20B7FA65,$BFBCDE7B
        !           155:        DC.L  $3FFF0000,$9B8D39B9,$D54E5539,$BFBEBAAF
        !           156:        DC.L  $3FFF0000,$9D3ED9A7,$2CFFB751,$BFBD86DA
        !           157:        DC.L  $3FFF0000,$9EF53260,$91A111AE,$BFBEBEDD
        !           158:        DC.L  $3FFF0000,$A0B0510F,$B9714FC2,$3FBCC96E
        !           159:        DC.L  $3FFF0000,$A2704303,$0C496819,$BFBEC90B
        !           160:        DC.L  $3FFF0000,$A43515AE,$09E6809E,$3FBBD1DB
        !           161:        DC.L  $3FFF0000,$A5FED6A9,$B15138EA,$3FBCE5EB
        !           162:        DC.L  $3FFF0000,$A7CD93B4,$E965356A,$BFBEC274
        !           163:        DC.L  $3FFF0000,$A9A15AB4,$EA7C0EF8,$3FBEA83C
        !           164:        DC.L  $3FFF0000,$AB7A39B5,$A93ED337,$3FBECB00
        !           165:        DC.L  $3FFF0000,$AD583EEA,$42A14AC6,$3FBE9301
        !           166:        DC.L  $3FFF0000,$AF3B78AD,$690A4375,$BFBD8367
        !           167:        DC.L  $3FFF0000,$B123F581,$D2AC2590,$BFBEF05F
        !           168:        DC.L  $3FFF0000,$B311C412,$A9112489,$3FBDFB3C
        !           169:        DC.L  $3FFF0000,$B504F333,$F9DE6484,$3FBEB2FB
        !           170:        DC.L  $3FFF0000,$B6FD91E3,$28D17791,$3FBAE2CB
        !           171:        DC.L  $3FFF0000,$B8FBAF47,$62FB9EE9,$3FBCDC3C
        !           172:        DC.L  $3FFF0000,$BAFF5AB2,$133E45FB,$3FBEE9AA
        !           173:        DC.L  $3FFF0000,$BD08A39F,$580C36BF,$BFBEAEFD
        !           174:        DC.L  $3FFF0000,$BF1799B6,$7A731083,$BFBCBF51
        !           175:        DC.L  $3FFF0000,$C12C4CCA,$66709456,$3FBEF88A
        !           176:        DC.L  $3FFF0000,$C346CCDA,$24976407,$3FBD83B2
        !           177:        DC.L  $3FFF0000,$C5672A11,$5506DADD,$3FBDF8AB
        !           178:        DC.L  $3FFF0000,$C78D74C8,$ABB9B15D,$BFBDFB17
        !           179:        DC.L  $3FFF0000,$C9B9BD86,$6E2F27A3,$BFBEFE3C
        !           180:        DC.L  $3FFF0000,$CBEC14FE,$F2727C5D,$BFBBB6F8
        !           181:        DC.L  $3FFF0000,$CE248C15,$1F8480E4,$BFBCEE53
        !           182:        DC.L  $3FFF0000,$D06333DA,$EF2B2595,$BFBDA4AE
        !           183:        DC.L  $3FFF0000,$D2A81D91,$F12AE45A,$3FBC9124
        !           184:        DC.L  $3FFF0000,$D4F35AAB,$CFEDFA1F,$3FBEB243
        !           185:        DC.L  $3FFF0000,$D744FCCA,$D69D6AF4,$3FBDE69A
        !           186:        DC.L  $3FFF0000,$D99D15C2,$78AFD7B6,$BFB8BC61
        !           187:        DC.L  $3FFF0000,$DBFBB797,$DAF23755,$3FBDF610
        !           188:        DC.L  $3FFF0000,$DE60F482,$5E0E9124,$BFBD8BE1
        !           189:        DC.L  $3FFF0000,$E0CCDEEC,$2A94E111,$3FBACB12
        !           190:        DC.L  $3FFF0000,$E33F8972,$BE8A5A51,$3FBB9BFE
        !           191:        DC.L  $3FFF0000,$E5B906E7,$7C8348A8,$3FBCF2F4
        !           192:        DC.L  $3FFF0000,$E8396A50,$3C4BDC68,$3FBEF22F
        !           193:        DC.L  $3FFF0000,$EAC0C6E7,$DD24392F,$BFBDBF4A
        !           194:        DC.L  $3FFF0000,$ED4F301E,$D9942B84,$3FBEC01A
        !           195:        DC.L  $3FFF0000,$EFE4B99B,$DCDAF5CB,$3FBE8CAC
        !           196:        DC.L  $3FFF0000,$F281773C,$59FFB13A,$BFBCBB3F
        !           197:        DC.L  $3FFF0000,$F5257D15,$2486CC2C,$3FBEF73A
        !           198:        DC.L  $3FFF0000,$F7D0DF73,$0AD13BB9,$BFB8B795
        !           199:        DC.L  $3FFF0000,$FA83B2DB,$722A033A,$3FBEF84B
        !           200:        DC.L  $3FFF0000,$FD3E0C0C,$F486C175,$BFBEF581
        !           201:
        !           202: N      equ     L_SCR1
        !           203:
        !           204: X      equ     FP_SCR1
        !           205: XDCARE equ     X+2
        !           206: XFRAC  equ     X+4
        !           207:
        !           208: ADJFACT        equ     FP_SCR2
        !           209:
        !           210: FACT1  equ     FP_SCR3
        !           211: FACT1HI        equ     FACT1+4
        !           212: FACT1LOW equ   FACT1+8
        !           213:
        !           214: FACT2  equ     FP_SCR4
        !           215: FACT2HI        equ     FACT2+4
        !           216: FACT2LOW equ   FACT2+8
        !           217:
        !           218:        xref    t_unfl
        !           219:        xref    t_ovfl
        !           220:        xref    t_frcinx
        !           221:
        !           222:        xdef    stwotoxd
        !           223: stwotoxd:
        !           224: *--ENTRY POINT FOR 2**(X) FOR DENORMALIZED ARGUMENT
        !           225:
        !           226:        fmove.l         d1,fpcr         ...set user's rounding mode/precision
        !           227:        Fmove.S         #:3F800000,FP0  ...RETURN 1 + X
        !           228:        move.l          (a0),d0
        !           229:        or.l            #$00800001,d0
        !           230:        fadd.s          d0,fp0
        !           231:        bra             t_frcinx
        !           232:
        !           233:        xdef    stwotox
        !           234: stwotox:
        !           235: *--ENTRY POINT FOR 2**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
        !           236:        FMOVEM.X        (a0),FP0        ...LOAD INPUT, do not set cc's
        !           237:
        !           238:        MOVE.L          (A0),D0
        !           239:        MOVE.W          4(A0),D0
        !           240:        FMOVE.X         FP0,X(a6)
        !           241:        ANDI.L          #$7FFFFFFF,D0
        !           242:
        !           243:        CMPI.L          #$3FB98000,D0           ...|X| >= 2**(-70)?
        !           244:        BGE.B           TWOOK1
        !           245:        BRA.W           EXPBORS
        !           246:
        !           247: TWOOK1:
        !           248:        CMPI.L          #$400D80C0,D0           ...|X| > 16480?
        !           249:        BLE.B           TWOMAIN
        !           250:        BRA.W           EXPBORS
        !           251:
        !           252:
        !           253: TWOMAIN:
        !           254: *--USUAL CASE, 2^(-70) <= |X| <= 16480
        !           255:
        !           256:        FMOVE.X         FP0,FP1
        !           257:        FMUL.S          #:42800000,FP1  ...64 * X
        !           258:
        !           259:        FMOVE.L         FP1,N(a6)               ...N = ROUND-TO-INT(64 X)
        !           260:        MOVE.L          d2,-(sp)
        !           261:        LEA             EXPTBL,a1       ...LOAD ADDRESS OF TABLE OF 2^(J/64)
        !           262:        FMOVE.L         N(a6),FP1               ...N --> FLOATING FMT
        !           263:        MOVE.L          N(a6),D0
        !           264:        MOVE.L          D0,d2
        !           265:        ANDI.L          #$3F,D0         ...D0 IS J
        !           266:        ASL.L           #4,D0           ...DISPLACEMENT FOR 2^(J/64)
        !           267:        ADDA.L          D0,a1           ...ADDRESS FOR 2^(J/64)
        !           268:        ASR.L           #6,d2           ...d2 IS L, N = 64L + J
        !           269:        MOVE.L          d2,D0
        !           270:        ASR.L           #1,D0           ...D0 IS M
        !           271:        SUB.L           D0,d2           ...d2 IS M', N = 64(M+M') + J
        !           272:        ADDI.L          #$3FFF,d2
        !           273:        MOVE.W          d2,ADJFACT(a6)  ...ADJFACT IS 2^(M')
        !           274:        MOVE.L          (sp)+,d2
        !           275: *--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
        !           276: *--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN.
        !           277: *--ADJFACT = 2^(M').
        !           278: *--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR, D0, FP1, a1, AND FP2.
        !           279:
        !           280:        FMUL.S          #:3C800000,FP1  ...(1/64)*N
        !           281:        MOVE.L          (a1)+,FACT1(a6)
        !           282:        MOVE.L          (a1)+,FACT1HI(a6)
        !           283:        MOVE.L          (a1)+,FACT1LOW(a6)
        !           284:        MOVE.W          (a1)+,FACT2(a6)
        !           285:        clr.w           FACT2+2(a6)
        !           286:
        !           287:        FSUB.X          FP1,FP0         ...X - (1/64)*INT(64 X)
        !           288:
        !           289:        MOVE.W          (a1)+,FACT2HI(a6)
        !           290:        clr.w           FACT2HI+2(a6)
        !           291:        clr.l           FACT2LOW(a6)
        !           292:        ADD.W           D0,FACT1(a6)
        !           293:
        !           294:        FMUL.X          LOG2,FP0        ...FP0 IS R
        !           295:        ADD.W           D0,FACT2(a6)
        !           296:
        !           297:        BRA.W           expr
        !           298:
        !           299: EXPBORS:
        !           300: *--FPCR, D0 SAVED
        !           301:        CMPI.L          #$3FFF8000,D0
        !           302:        BGT.B           EXPBIG
        !           303:
        !           304: EXPSM:
        !           305: *--|X| IS SMALL, RETURN 1 + X
        !           306:
        !           307:        FMOVE.L         d1,FPCR         ;restore users exceptions
        !           308:        FADD.S          #:3F800000,FP0  ...RETURN 1 + X
        !           309:
        !           310:        bra             t_frcinx
        !           311:
        !           312: EXPBIG:
        !           313: *--|X| IS LARGE, GENERATE OVERFLOW IF X > 0; ELSE GENERATE UNDERFLOW
        !           314: *--REGISTERS SAVE SO FAR ARE FPCR AND  D0
        !           315:        MOVE.L          X(a6),D0
        !           316:        TST.L           D0
        !           317:        BLT.B           EXPNEG
        !           318:
        !           319:        bclr.b          #7,(a0)         ;t_ovfl expects positive value
        !           320:        bra             t_ovfl
        !           321:
        !           322: EXPNEG:
        !           323:        bclr.b          #7,(a0)         ;t_unfl expects positive value
        !           324:        bra             t_unfl
        !           325:
        !           326:        xdef    stentoxd
        !           327: stentoxd:
        !           328: *--ENTRY POINT FOR 10**(X) FOR DENORMALIZED ARGUMENT
        !           329:
        !           330:        fmove.l         d1,fpcr         ...set user's rounding mode/precision
        !           331:        Fmove.S         #:3F800000,FP0  ...RETURN 1 + X
        !           332:        move.l          (a0),d0
        !           333:        or.l            #$00800001,d0
        !           334:        fadd.s          d0,fp0
        !           335:        bra             t_frcinx
        !           336:
        !           337:        xdef    stentox
        !           338: stentox:
        !           339: *--ENTRY POINT FOR 10**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
        !           340:        FMOVEM.X        (a0),FP0        ...LOAD INPUT, do not set cc's
        !           341:
        !           342:        MOVE.L          (A0),D0
        !           343:        MOVE.W          4(A0),D0
        !           344:        FMOVE.X         FP0,X(a6)
        !           345:        ANDI.L          #$7FFFFFFF,D0
        !           346:
        !           347:        CMPI.L          #$3FB98000,D0           ...|X| >= 2**(-70)?
        !           348:        BGE.B           TENOK1
        !           349:        BRA.W           EXPBORS
        !           350:
        !           351: TENOK1:
        !           352:        CMPI.L          #$400B9B07,D0           ...|X| <= 16480*log2/log10 ?
        !           353:        BLE.B           TENMAIN
        !           354:        BRA.W           EXPBORS
        !           355:
        !           356: TENMAIN:
        !           357: *--USUAL CASE, 2^(-70) <= |X| <= 16480 LOG 2 / LOG 10
        !           358:
        !           359:        FMOVE.X         FP0,FP1
        !           360:        FMUL.D          L2TEN64,FP1     ...X*64*LOG10/LOG2
        !           361:
        !           362:        FMOVE.L         FP1,N(a6)               ...N=INT(X*64*LOG10/LOG2)
        !           363:        MOVE.L          d2,-(sp)
        !           364:        LEA             EXPTBL,a1       ...LOAD ADDRESS OF TABLE OF 2^(J/64)
        !           365:        FMOVE.L         N(a6),FP1               ...N --> FLOATING FMT
        !           366:        MOVE.L          N(a6),D0
        !           367:        MOVE.L          D0,d2
        !           368:        ANDI.L          #$3F,D0         ...D0 IS J
        !           369:        ASL.L           #4,D0           ...DISPLACEMENT FOR 2^(J/64)
        !           370:        ADDA.L          D0,a1           ...ADDRESS FOR 2^(J/64)
        !           371:        ASR.L           #6,d2           ...d2 IS L, N = 64L + J
        !           372:        MOVE.L          d2,D0
        !           373:        ASR.L           #1,D0           ...D0 IS M
        !           374:        SUB.L           D0,d2           ...d2 IS M', N = 64(M+M') + J
        !           375:        ADDI.L          #$3FFF,d2
        !           376:        MOVE.W          d2,ADJFACT(a6)  ...ADJFACT IS 2^(M')
        !           377:        MOVE.L          (sp)+,d2
        !           378:
        !           379: *--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
        !           380: *--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN.
        !           381: *--ADJFACT = 2^(M').
        !           382: *--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR, D0, FP1, a1, AND FP2.
        !           383:
        !           384:        FMOVE.X         FP1,FP2
        !           385:
        !           386:        FMUL.D          L10TWO1,FP1     ...N*(LOG2/64LOG10)_LEAD
        !           387:        MOVE.L          (a1)+,FACT1(a6)
        !           388:
        !           389:        FMUL.X          L10TWO2,FP2     ...N*(LOG2/64LOG10)_TRAIL
        !           390:
        !           391:        MOVE.L          (a1)+,FACT1HI(a6)
        !           392:        MOVE.L          (a1)+,FACT1LOW(a6)
        !           393:        FSUB.X          FP1,FP0         ...X - N L_LEAD
        !           394:        MOVE.W          (a1)+,FACT2(a6)
        !           395:
        !           396:        FSUB.X          FP2,FP0         ...X - N L_TRAIL
        !           397:
        !           398:        clr.w           FACT2+2(a6)
        !           399:        MOVE.W          (a1)+,FACT2HI(a6)
        !           400:        clr.w           FACT2HI+2(a6)
        !           401:        clr.l           FACT2LOW(a6)
        !           402:
        !           403:        FMUL.X          LOG10,FP0       ...FP0 IS R
        !           404:
        !           405:        ADD.W           D0,FACT1(a6)
        !           406:        ADD.W           D0,FACT2(a6)
        !           407:
        !           408: expr:
        !           409: *--FPCR, FP2, FP3 ARE SAVED IN ORDER AS SHOWN.
        !           410: *--ADJFACT CONTAINS 2**(M'), FACT1 + FACT2 = 2**(M) * 2**(J/64).
        !           411: *--FP0 IS R. THE FOLLOWING CODE COMPUTES
        !           412: *--    2**(M'+M) * 2**(J/64) * EXP(R)
        !           413:
        !           414:        FMOVE.X         FP0,FP1
        !           415:        FMUL.X          FP1,FP1         ...FP1 IS S = R*R
        !           416:
        !           417:        FMOVE.D         EXPA5,FP2       ...FP2 IS A5
        !           418:        FMOVE.D         EXPA4,FP3       ...FP3 IS A4
        !           419:
        !           420:        FMUL.X          FP1,FP2         ...FP2 IS S*A5
        !           421:        FMUL.X          FP1,FP3         ...FP3 IS S*A4
        !           422:
        !           423:        FADD.D          EXPA3,FP2       ...FP2 IS A3+S*A5
        !           424:        FADD.D          EXPA2,FP3       ...FP3 IS A2+S*A4
        !           425:
        !           426:        FMUL.X          FP1,FP2         ...FP2 IS S*(A3+S*A5)
        !           427:        FMUL.X          FP1,FP3         ...FP3 IS S*(A2+S*A4)
        !           428:
        !           429:        FADD.D          EXPA1,FP2       ...FP2 IS A1+S*(A3+S*A5)
        !           430:        FMUL.X          FP0,FP3         ...FP3 IS R*S*(A2+S*A4)
        !           431:
        !           432:        FMUL.X          FP1,FP2         ...FP2 IS S*(A1+S*(A3+S*A5))
        !           433:        FADD.X          FP3,FP0         ...FP0 IS R+R*S*(A2+S*A4)
        !           434:
        !           435:        FADD.X          FP2,FP0         ...FP0 IS EXP(R) - 1
        !           436:
        !           437:
        !           438: *--FINAL RECONSTRUCTION PROCESS
        !           439: *--EXP(X) = 2^M*2^(J/64) + 2^M*2^(J/64)*(EXP(R)-1)  -  (1 OR 0)
        !           440:
        !           441:        FMUL.X          FACT1(a6),FP0
        !           442:        FADD.X          FACT2(a6),FP0
        !           443:        FADD.X          FACT1(a6),FP0
        !           444:
        !           445:        FMOVE.L         d1,FPCR         ;restore users exceptions
        !           446:        clr.w           ADJFACT+2(a6)
        !           447:        move.l          #$80000000,ADJFACT+4(a6)
        !           448:        clr.l           ADJFACT+8(a6)
        !           449:        FMUL.X          ADJFACT(a6),FP0 ...FINAL ADJUSTMENT
        !           450:
        !           451:        bra             t_frcinx
        !           452:
        !           453:        end

CVSweb