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