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