[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

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