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