| 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 |