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