^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) | stwotox.sa 3.1 12/10/90
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) | stwotox --- 2**X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) | stwotoxd --- 2**X for denormalized X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) | stentox --- 10**X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) | stentoxd --- 10**X for denormalized X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) | Input: Double-extended number X in location pointed to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) | by address register a0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) | Output: The function values are returned in Fp0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) | Accuracy and Monotonicity: The returned result is within 2 ulps in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) | 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) | result is subsequently rounded to double precision. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) | result is provably monotonic in double precision.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) | Speed: The program stwotox takes approximately 190 cycles and the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) | program stentox takes approximately 200 cycles.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) | Algorithm:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) | twotox
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) | 1. If |X| > 16480, go to ExpBig.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) | 2. If |X| < 2**(-70), go to ExpSm.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) | 3. Decompose X as X = N/64 + r where |r| <= 1/128. Furthermore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) | decompose N as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) | N = 64(M + M') + j, j = 0,1,2,...,63.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) | 4. Overwrite r := r * log2. Then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) | 2**X = 2**(M') * 2**(M) * 2**(j/64) * exp(r).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) | Go to expr to compute that expression.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) | tentox
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) | 1. If |X| > 16480*log_10(2) (base 10 log of 2), go to ExpBig.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) | 2. If |X| < 2**(-70), go to ExpSm.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) | 3. Set y := X*log_2(10)*64 (base 2 log of 10). Set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) | N := round-to-int(y). Decompose N as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) | N = 64(M + M') + j, j = 0,1,2,...,63.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) | 4. Define r as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) | r := ((X - N*L1)-N*L2) * L10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) | where L1, L2 are the leading and trailing parts of log_10(2)/64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) | and L10 is the natural log of 10. Then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) | 10**X = 2**(M') * 2**(M) * 2**(j/64) * exp(r).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) | Go to expr to compute that expression.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) | expr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) | 1. Fetch 2**(j/64) from table as Fact1 and Fact2.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) | 2. Overwrite Fact1 and Fact2 by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) | Fact1 := 2**(M) * Fact1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) | Fact2 := 2**(M) * Fact2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) | Thus Fact1 + Fact2 = 2**(M) * 2**(j/64).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) | 3. Calculate P where 1 + P approximates exp(r):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) | P = r + r*r*(A1+r*(A2+...+r*A5)).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) | 4. Let AdjFact := 2**(M'). Return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) | AdjFact * ( Fact1 + ((Fact1*P) + Fact2) ).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) | Exit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) | ExpBig
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) | 1. Generate overflow by Huge * Huge if X > 0; otherwise, generate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) | underflow by Tiny * Tiny.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) | ExpSm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) | 1. Return 1 + X.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) | Copyright (C) Motorola, Inc. 1990
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) | All Rights Reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) | For details on the license for this file, please see the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) | file, README, in this same directory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) |STWOTOX idnt 2,1 | Motorola 040 Floating Point Software Package
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) |section 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #include "fpsp.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) BOUNDS1: .long 0x3FB98000,0x400D80C0 | ... 2^(-70),16480
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) BOUNDS2: .long 0x3FB98000,0x400B9B07 | ... 2^(-70),16480 LOG2/LOG10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) L2TEN64: .long 0x406A934F,0x0979A371 | ... 64LOG10/LOG2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) L10TWO1: .long 0x3F734413,0x509F8000 | ... LOG2/64LOG10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) L10TWO2: .long 0xBFCD0000,0xC0219DC1,0xDA994FD2,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) LOG10: .long 0x40000000,0x935D8DDD,0xAAA8AC17,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) LOG2: .long 0x3FFE0000,0xB17217F7,0xD1CF79AC,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) EXPA5: .long 0x3F56C16D,0x6F7BD0B2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) EXPA4: .long 0x3F811112,0x302C712C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) EXPA3: .long 0x3FA55555,0x55554CC1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) EXPA2: .long 0x3FC55555,0x55554A54
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) EXPA1: .long 0x3FE00000,0x00000000,0x00000000,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) HUGE: .long 0x7FFE0000,0xFFFFFFFF,0xFFFFFFFF,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) TINY: .long 0x00010000,0xFFFFFFFF,0xFFFFFFFF,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) EXPTBL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) .long 0x3FFF0000,0x80000000,0x00000000,0x3F738000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) .long 0x3FFF0000,0x8164D1F3,0xBC030773,0x3FBEF7CA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) .long 0x3FFF0000,0x82CD8698,0xAC2BA1D7,0x3FBDF8A9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) .long 0x3FFF0000,0x843A28C3,0xACDE4046,0x3FBCD7C9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) .long 0x3FFF0000,0x85AAC367,0xCC487B15,0xBFBDE8DA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) .long 0x3FFF0000,0x871F6196,0x9E8D1010,0x3FBDE85C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) .long 0x3FFF0000,0x88980E80,0x92DA8527,0x3FBEBBF1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) .long 0x3FFF0000,0x8A14D575,0x496EFD9A,0x3FBB80CA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) .long 0x3FFF0000,0x8B95C1E3,0xEA8BD6E7,0xBFBA8373
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) .long 0x3FFF0000,0x8D1ADF5B,0x7E5BA9E6,0xBFBE9670
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) .long 0x3FFF0000,0x8EA4398B,0x45CD53C0,0x3FBDB700
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) .long 0x3FFF0000,0x9031DC43,0x1466B1DC,0x3FBEEEB0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) .long 0x3FFF0000,0x91C3D373,0xAB11C336,0x3FBBFD6D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) .long 0x3FFF0000,0x935A2B2F,0x13E6E92C,0xBFBDB319
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) .long 0x3FFF0000,0x94F4EFA8,0xFEF70961,0x3FBDBA2B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) .long 0x3FFF0000,0x96942D37,0x20185A00,0x3FBE91D5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) .long 0x3FFF0000,0x9837F051,0x8DB8A96F,0x3FBE8D5A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) .long 0x3FFF0000,0x99E04593,0x20B7FA65,0xBFBCDE7B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) .long 0x3FFF0000,0x9B8D39B9,0xD54E5539,0xBFBEBAAF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) .long 0x3FFF0000,0x9D3ED9A7,0x2CFFB751,0xBFBD86DA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) .long 0x3FFF0000,0x9EF53260,0x91A111AE,0xBFBEBEDD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) .long 0x3FFF0000,0xA0B0510F,0xB9714FC2,0x3FBCC96E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) .long 0x3FFF0000,0xA2704303,0x0C496819,0xBFBEC90B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) .long 0x3FFF0000,0xA43515AE,0x09E6809E,0x3FBBD1DB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) .long 0x3FFF0000,0xA5FED6A9,0xB15138EA,0x3FBCE5EB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) .long 0x3FFF0000,0xA7CD93B4,0xE965356A,0xBFBEC274
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) .long 0x3FFF0000,0xA9A15AB4,0xEA7C0EF8,0x3FBEA83C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) .long 0x3FFF0000,0xAB7A39B5,0xA93ED337,0x3FBECB00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) .long 0x3FFF0000,0xAD583EEA,0x42A14AC6,0x3FBE9301
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) .long 0x3FFF0000,0xAF3B78AD,0x690A4375,0xBFBD8367
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) .long 0x3FFF0000,0xB123F581,0xD2AC2590,0xBFBEF05F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) .long 0x3FFF0000,0xB311C412,0xA9112489,0x3FBDFB3C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) .long 0x3FFF0000,0xB504F333,0xF9DE6484,0x3FBEB2FB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) .long 0x3FFF0000,0xB6FD91E3,0x28D17791,0x3FBAE2CB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) .long 0x3FFF0000,0xB8FBAF47,0x62FB9EE9,0x3FBCDC3C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) .long 0x3FFF0000,0xBAFF5AB2,0x133E45FB,0x3FBEE9AA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) .long 0x3FFF0000,0xBD08A39F,0x580C36BF,0xBFBEAEFD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) .long 0x3FFF0000,0xBF1799B6,0x7A731083,0xBFBCBF51
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) .long 0x3FFF0000,0xC12C4CCA,0x66709456,0x3FBEF88A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) .long 0x3FFF0000,0xC346CCDA,0x24976407,0x3FBD83B2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) .long 0x3FFF0000,0xC5672A11,0x5506DADD,0x3FBDF8AB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) .long 0x3FFF0000,0xC78D74C8,0xABB9B15D,0xBFBDFB17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) .long 0x3FFF0000,0xC9B9BD86,0x6E2F27A3,0xBFBEFE3C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) .long 0x3FFF0000,0xCBEC14FE,0xF2727C5D,0xBFBBB6F8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) .long 0x3FFF0000,0xCE248C15,0x1F8480E4,0xBFBCEE53
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) .long 0x3FFF0000,0xD06333DA,0xEF2B2595,0xBFBDA4AE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) .long 0x3FFF0000,0xD2A81D91,0xF12AE45A,0x3FBC9124
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) .long 0x3FFF0000,0xD4F35AAB,0xCFEDFA1F,0x3FBEB243
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) .long 0x3FFF0000,0xD744FCCA,0xD69D6AF4,0x3FBDE69A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) .long 0x3FFF0000,0xD99D15C2,0x78AFD7B6,0xBFB8BC61
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) .long 0x3FFF0000,0xDBFBB797,0xDAF23755,0x3FBDF610
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) .long 0x3FFF0000,0xDE60F482,0x5E0E9124,0xBFBD8BE1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) .long 0x3FFF0000,0xE0CCDEEC,0x2A94E111,0x3FBACB12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) .long 0x3FFF0000,0xE33F8972,0xBE8A5A51,0x3FBB9BFE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) .long 0x3FFF0000,0xE5B906E7,0x7C8348A8,0x3FBCF2F4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) .long 0x3FFF0000,0xE8396A50,0x3C4BDC68,0x3FBEF22F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) .long 0x3FFF0000,0xEAC0C6E7,0xDD24392F,0xBFBDBF4A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) .long 0x3FFF0000,0xED4F301E,0xD9942B84,0x3FBEC01A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) .long 0x3FFF0000,0xEFE4B99B,0xDCDAF5CB,0x3FBE8CAC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) .long 0x3FFF0000,0xF281773C,0x59FFB13A,0xBFBCBB3F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) .long 0x3FFF0000,0xF5257D15,0x2486CC2C,0x3FBEF73A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) .long 0x3FFF0000,0xF7D0DF73,0x0AD13BB9,0xBFB8B795
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) .long 0x3FFF0000,0xFA83B2DB,0x722A033A,0x3FBEF84B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) .long 0x3FFF0000,0xFD3E0C0C,0xF486C175,0xBFBEF581
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) .set N,L_SCR1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) .set X,FP_SCR1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) .set XDCARE,X+2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) .set XFRAC,X+4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) .set ADJFACT,FP_SCR2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) .set FACT1,FP_SCR3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) .set FACT1HI,FACT1+4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) .set FACT1LOW,FACT1+8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) .set FACT2,FP_SCR4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) .set FACT2HI,FACT2+4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) .set FACT2LOW,FACT2+8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) | xref t_unfl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) |xref t_ovfl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) |xref t_frcinx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) .global stwotoxd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) stwotoxd:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) |--ENTRY POINT FOR 2**(X) FOR DENORMALIZED ARGUMENT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) fmovel %d1,%fpcr | ...set user's rounding mode/precision
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) fmoves #0x3F800000,%fp0 | ...RETURN 1 + X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) movel (%a0),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) orl #0x00800001,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) fadds %d0,%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) bra t_frcinx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) .global stwotox
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) stwotox:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) |--ENTRY POINT FOR 2**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) fmovemx (%a0),%fp0-%fp0 | ...LOAD INPUT, do not set cc's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) movel (%a0),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) movew 4(%a0),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) fmovex %fp0,X(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) andil #0x7FFFFFFF,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) cmpil #0x3FB98000,%d0 | ...|X| >= 2**(-70)?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) bges TWOOK1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) bra EXPBORS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) TWOOK1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) cmpil #0x400D80C0,%d0 | ...|X| > 16480?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) bles TWOMAIN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) bra EXPBORS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) TWOMAIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) |--USUAL CASE, 2^(-70) <= |X| <= 16480
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) fmovex %fp0,%fp1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) fmuls #0x42800000,%fp1 | ...64 * X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) fmovel %fp1,N(%a6) | ...N = ROUND-TO-INT(64 X)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) movel %d2,-(%sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) lea EXPTBL,%a1 | ...LOAD ADDRESS OF TABLE OF 2^(J/64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) fmovel N(%a6),%fp1 | ...N --> FLOATING FMT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) movel N(%a6),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) movel %d0,%d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) andil #0x3F,%d0 | ...D0 IS J
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) asll #4,%d0 | ...DISPLACEMENT FOR 2^(J/64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) addal %d0,%a1 | ...ADDRESS FOR 2^(J/64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) asrl #6,%d2 | ...d2 IS L, N = 64L + J
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) movel %d2,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) asrl #1,%d0 | ...D0 IS M
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) subl %d0,%d2 | ...d2 IS M', N = 64(M+M') + J
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) addil #0x3FFF,%d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) movew %d2,ADJFACT(%a6) | ...ADJFACT IS 2^(M')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) movel (%sp)+,%d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) |--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) |--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) |--ADJFACT = 2^(M').
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) |--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR, D0, FP1, a1, AND FP2.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) fmuls #0x3C800000,%fp1 | ...(1/64)*N
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) movel (%a1)+,FACT1(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) movel (%a1)+,FACT1HI(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) movel (%a1)+,FACT1LOW(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) movew (%a1)+,FACT2(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) clrw FACT2+2(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) fsubx %fp1,%fp0 | ...X - (1/64)*INT(64 X)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) movew (%a1)+,FACT2HI(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) clrw FACT2HI+2(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) clrl FACT2LOW(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) addw %d0,FACT1(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) fmulx LOG2,%fp0 | ...FP0 IS R
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) addw %d0,FACT2(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) bra expr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) EXPBORS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) |--FPCR, D0 SAVED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) cmpil #0x3FFF8000,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) bgts EXPBIG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) EXPSM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) |--|X| IS SMALL, RETURN 1 + X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) fmovel %d1,%FPCR |restore users exceptions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) fadds #0x3F800000,%fp0 | ...RETURN 1 + X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) bra t_frcinx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) EXPBIG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) |--|X| IS LARGE, GENERATE OVERFLOW IF X > 0; ELSE GENERATE UNDERFLOW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) |--REGISTERS SAVE SO FAR ARE FPCR AND D0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) movel X(%a6),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) cmpil #0,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) blts EXPNEG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) bclrb #7,(%a0) |t_ovfl expects positive value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) bra t_ovfl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) EXPNEG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) bclrb #7,(%a0) |t_unfl expects positive value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) bra t_unfl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) .global stentoxd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) stentoxd:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) |--ENTRY POINT FOR 10**(X) FOR DENORMALIZED ARGUMENT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) fmovel %d1,%fpcr | ...set user's rounding mode/precision
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) fmoves #0x3F800000,%fp0 | ...RETURN 1 + X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) movel (%a0),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) orl #0x00800001,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) fadds %d0,%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) bra t_frcinx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) .global stentox
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) stentox:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) |--ENTRY POINT FOR 10**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) fmovemx (%a0),%fp0-%fp0 | ...LOAD INPUT, do not set cc's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) movel (%a0),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) movew 4(%a0),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) fmovex %fp0,X(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) andil #0x7FFFFFFF,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) cmpil #0x3FB98000,%d0 | ...|X| >= 2**(-70)?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) bges TENOK1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) bra EXPBORS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) TENOK1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) cmpil #0x400B9B07,%d0 | ...|X| <= 16480*log2/log10 ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) bles TENMAIN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) bra EXPBORS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) TENMAIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) |--USUAL CASE, 2^(-70) <= |X| <= 16480 LOG 2 / LOG 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) fmovex %fp0,%fp1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) fmuld L2TEN64,%fp1 | ...X*64*LOG10/LOG2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) fmovel %fp1,N(%a6) | ...N=INT(X*64*LOG10/LOG2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) movel %d2,-(%sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) lea EXPTBL,%a1 | ...LOAD ADDRESS OF TABLE OF 2^(J/64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) fmovel N(%a6),%fp1 | ...N --> FLOATING FMT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) movel N(%a6),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) movel %d0,%d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) andil #0x3F,%d0 | ...D0 IS J
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) asll #4,%d0 | ...DISPLACEMENT FOR 2^(J/64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) addal %d0,%a1 | ...ADDRESS FOR 2^(J/64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) asrl #6,%d2 | ...d2 IS L, N = 64L + J
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) movel %d2,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) asrl #1,%d0 | ...D0 IS M
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) subl %d0,%d2 | ...d2 IS M', N = 64(M+M') + J
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) addil #0x3FFF,%d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) movew %d2,ADJFACT(%a6) | ...ADJFACT IS 2^(M')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) movel (%sp)+,%d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) |--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) |--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) |--ADJFACT = 2^(M').
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) |--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR, D0, FP1, a1, AND FP2.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) fmovex %fp1,%fp2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) fmuld L10TWO1,%fp1 | ...N*(LOG2/64LOG10)_LEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) movel (%a1)+,FACT1(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) fmulx L10TWO2,%fp2 | ...N*(LOG2/64LOG10)_TRAIL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) movel (%a1)+,FACT1HI(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) movel (%a1)+,FACT1LOW(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) fsubx %fp1,%fp0 | ...X - N L_LEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) movew (%a1)+,FACT2(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) fsubx %fp2,%fp0 | ...X - N L_TRAIL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) clrw FACT2+2(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) movew (%a1)+,FACT2HI(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) clrw FACT2HI+2(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) clrl FACT2LOW(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) fmulx LOG10,%fp0 | ...FP0 IS R
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) addw %d0,FACT1(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) addw %d0,FACT2(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) expr:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) |--FPCR, FP2, FP3 ARE SAVED IN ORDER AS SHOWN.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) |--ADJFACT CONTAINS 2**(M'), FACT1 + FACT2 = 2**(M) * 2**(J/64).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) |--FP0 IS R. THE FOLLOWING CODE COMPUTES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) |-- 2**(M'+M) * 2**(J/64) * EXP(R)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) fmovex %fp0,%fp1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) fmulx %fp1,%fp1 | ...FP1 IS S = R*R
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) fmoved EXPA5,%fp2 | ...FP2 IS A5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) fmoved EXPA4,%fp3 | ...FP3 IS A4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) fmulx %fp1,%fp2 | ...FP2 IS S*A5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) fmulx %fp1,%fp3 | ...FP3 IS S*A4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) faddd EXPA3,%fp2 | ...FP2 IS A3+S*A5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) faddd EXPA2,%fp3 | ...FP3 IS A2+S*A4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) fmulx %fp1,%fp2 | ...FP2 IS S*(A3+S*A5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) fmulx %fp1,%fp3 | ...FP3 IS S*(A2+S*A4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) faddd EXPA1,%fp2 | ...FP2 IS A1+S*(A3+S*A5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) fmulx %fp0,%fp3 | ...FP3 IS R*S*(A2+S*A4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) fmulx %fp1,%fp2 | ...FP2 IS S*(A1+S*(A3+S*A5))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) faddx %fp3,%fp0 | ...FP0 IS R+R*S*(A2+S*A4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) faddx %fp2,%fp0 | ...FP0 IS EXP(R) - 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) |--FINAL RECONSTRUCTION PROCESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) |--EXP(X) = 2^M*2^(J/64) + 2^M*2^(J/64)*(EXP(R)-1) - (1 OR 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) fmulx FACT1(%a6),%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) faddx FACT2(%a6),%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) faddx FACT1(%a6),%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) fmovel %d1,%FPCR |restore users exceptions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) clrw ADJFACT+2(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) movel #0x80000000,ADJFACT+4(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) clrl ADJFACT+8(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) fmulx ADJFACT(%a6),%fp0 | ...FINAL ADJUSTMENT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) bra t_frcinx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) |end