Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) |	slogn.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) |	slogn computes the natural logarithm of an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) |	input value. slognd does the same except the input value is a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) |	denormalized number. slognp1 computes log(1+X), and slognp1d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) |	computes log(1+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 value in memory location pointed to by address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) |		register a0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) |	Output:	log(X) or log(1+X) returned in floating-point register 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 slogn takes approximately 190 cycles for input
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) |		argument X such that |X-1| >= 1/16, which is the usual
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) |		situation. For those arguments, slognp1 takes approximately
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) |		 210 cycles. For the less common arguments, the program will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) |		 run no worse than 10% slower.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) |	Algorithm:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) |	LOGN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) |	Step 1. If |X-1| < 1/16, approximate log(X) by an odd polynomial in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) |		u, where u = 2(X-1)/(X+1). Otherwise, move on to Step 2.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) |	Step 2. X = 2**k * Y where 1 <= Y < 2. Define F to be the first seven
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) |		significant bits of Y plus 2**(-7), i.e. F = 1.xxxxxx1 in base
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) |		2 where the six "x" match those of Y. Note that |Y-F| <= 2**(-7).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) |	Step 3. Define u = (Y-F)/F. Approximate log(1+u) by a polynomial in u,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) |		log(1+u) = poly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) |	Step 4. Reconstruct log(X) = log( 2**k * Y ) = k*log(2) + log(F) + log(1+u)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) |		by k*log(2) + (log(F) + poly). The values of log(F) are calculated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) |		beforehand and stored in the program.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) |	lognp1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) |	Step 1: If |X| < 1/16, approximate log(1+X) by an odd polynomial in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) |		u where u = 2X/(2+X). Otherwise, move on to Step 2.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) |	Step 2: Let 1+X = 2**k * Y, where 1 <= Y < 2. Define F as done in Step 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) |		of the algorithm for LOGN and compute log(1+X) as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) |		k*log(2) + log(F) + poly where poly approximates log(1+u),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) |		u = (Y-F)/F.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) |	Implementation Notes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) |	Note 1. There are 64 different possible values for F, thus 64 log(F)'s
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) |		need to be tabulated. Moreover, the values of 1/F are also
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) |		tabulated so that the division in (Y-F)/F can be performed by a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) |		multiplication.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) |	Note 2. In Step 2 of lognp1, in order to preserved accuracy, the value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) |		Y-F has to be calculated carefully when 1/2 <= X < 3/2.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) |	Note 3. To fully exploit the pipeline, polynomials are usually separated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) |		into two parts evaluated independently before being added up.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) |		Copyright (C) Motorola, Inc. 1990
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) |			All Rights Reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) |       For details on the license for this file, please see the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) |       file, README, in this same directory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) |slogn	idnt	2,1 | Motorola 040 Floating Point Software Package
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	|section	8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) #include "fpsp.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) BOUNDS1:  .long 0x3FFEF07D,0x3FFF8841
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) BOUNDS2:  .long 0x3FFE8000,0x3FFFC000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) LOGOF2:	.long 0x3FFE0000,0xB17217F7,0xD1CF79AC,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) one:	.long 0x3F800000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) zero:	.long 0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) infty:	.long 0x7F800000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) negone:	.long 0xBF800000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) LOGA6:	.long 0x3FC2499A,0xB5E4040B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) LOGA5:	.long 0xBFC555B5,0x848CB7DB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) LOGA4:	.long 0x3FC99999,0x987D8730
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) LOGA3:	.long 0xBFCFFFFF,0xFF6F7E97
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) LOGA2:	.long 0x3FD55555,0x555555a4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) LOGA1:	.long 0xBFE00000,0x00000008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) LOGB5:	.long 0x3F175496,0xADD7DAD6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) LOGB4:	.long 0x3F3C71C2,0xFE80C7E0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) LOGB3:	.long 0x3F624924,0x928BCCFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) LOGB2:	.long 0x3F899999,0x999995EC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) LOGB1:	.long 0x3FB55555,0x55555555
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) TWO:	.long 0x40000000,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) LTHOLD:	.long 0x3f990000,0x80000000,0x00000000,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) LOGTBL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	.long  0x3FFE0000,0xFE03F80F,0xE03F80FE,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	.long  0x3FF70000,0xFF015358,0x833C47E2,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	.long  0x3FFE0000,0xFA232CF2,0x52138AC0,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	.long  0x3FF90000,0xBDC8D83E,0xAD88D549,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	.long  0x3FFE0000,0xF6603D98,0x0F6603DA,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	.long  0x3FFA0000,0x9CF43DCF,0xF5EAFD48,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	.long  0x3FFE0000,0xF2B9D648,0x0F2B9D65,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	.long  0x3FFA0000,0xDA16EB88,0xCB8DF614,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	.long  0x3FFE0000,0xEF2EB71F,0xC4345238,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	.long  0x3FFB0000,0x8B29B775,0x1BD70743,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	.long  0x3FFE0000,0xEBBDB2A5,0xC1619C8C,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	.long  0x3FFB0000,0xA8D839F8,0x30C1FB49,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	.long  0x3FFE0000,0xE865AC7B,0x7603A197,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	.long  0x3FFB0000,0xC61A2EB1,0x8CD907AD,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	.long  0x3FFE0000,0xE525982A,0xF70C880E,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	.long  0x3FFB0000,0xE2F2A47A,0xDE3A18AF,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	.long  0x3FFE0000,0xE1FC780E,0x1FC780E2,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	.long  0x3FFB0000,0xFF64898E,0xDF55D551,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	.long  0x3FFE0000,0xDEE95C4C,0xA037BA57,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	.long  0x3FFC0000,0x8DB956A9,0x7B3D0148,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	.long  0x3FFE0000,0xDBEB61EE,0xD19C5958,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	.long  0x3FFC0000,0x9B8FE100,0xF47BA1DE,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	.long  0x3FFE0000,0xD901B203,0x6406C80E,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	.long  0x3FFC0000,0xA9372F1D,0x0DA1BD17,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	.long  0x3FFE0000,0xD62B80D6,0x2B80D62C,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	.long  0x3FFC0000,0xB6B07F38,0xCE90E46B,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	.long  0x3FFE0000,0xD3680D36,0x80D3680D,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	.long  0x3FFC0000,0xC3FD0329,0x06488481,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	.long  0x3FFE0000,0xD0B69FCB,0xD2580D0B,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	.long  0x3FFC0000,0xD11DE0FF,0x15AB18CA,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	.long  0x3FFE0000,0xCE168A77,0x25080CE1,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	.long  0x3FFC0000,0xDE1433A1,0x6C66B150,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	.long  0x3FFE0000,0xCB8727C0,0x65C393E0,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	.long  0x3FFC0000,0xEAE10B5A,0x7DDC8ADD,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	.long  0x3FFE0000,0xC907DA4E,0x871146AD,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	.long  0x3FFC0000,0xF7856E5E,0xE2C9B291,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	.long  0x3FFE0000,0xC6980C69,0x80C6980C,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	.long  0x3FFD0000,0x82012CA5,0xA68206D7,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	.long  0x3FFE0000,0xC4372F85,0x5D824CA6,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	.long  0x3FFD0000,0x882C5FCD,0x7256A8C5,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	.long  0x3FFE0000,0xC1E4BBD5,0x95F6E947,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	.long  0x3FFD0000,0x8E44C60B,0x4CCFD7DE,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	.long  0x3FFE0000,0xBFA02FE8,0x0BFA02FF,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	.long  0x3FFD0000,0x944AD09E,0xF4351AF6,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	.long  0x3FFE0000,0xBD691047,0x07661AA3,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	.long  0x3FFD0000,0x9A3EECD4,0xC3EAA6B2,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	.long  0x3FFE0000,0xBB3EE721,0xA54D880C,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	.long  0x3FFD0000,0xA0218434,0x353F1DE8,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	.long  0x3FFE0000,0xB92143FA,0x36F5E02E,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	.long  0x3FFD0000,0xA5F2FCAB,0xBBC506DA,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	.long  0x3FFE0000,0xB70FBB5A,0x19BE3659,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	.long  0x3FFD0000,0xABB3B8BA,0x2AD362A5,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	.long  0x3FFE0000,0xB509E68A,0x9B94821F,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 	.long  0x3FFD0000,0xB1641795,0xCE3CA97B,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	.long  0x3FFE0000,0xB30F6352,0x8917C80B,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	.long  0x3FFD0000,0xB7047551,0x5D0F1C61,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	.long  0x3FFE0000,0xB11FD3B8,0x0B11FD3C,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	.long  0x3FFD0000,0xBC952AFE,0xEA3D13E1,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	.long  0x3FFE0000,0xAF3ADDC6,0x80AF3ADE,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	.long  0x3FFD0000,0xC2168ED0,0xF458BA4A,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	.long  0x3FFE0000,0xAD602B58,0x0AD602B6,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	.long  0x3FFD0000,0xC788F439,0xB3163BF1,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	.long  0x3FFE0000,0xAB8F69E2,0x8359CD11,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	.long  0x3FFD0000,0xCCECAC08,0xBF04565D,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	.long  0x3FFE0000,0xA9C84A47,0xA07F5638,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	.long  0x3FFD0000,0xD2420487,0x2DD85160,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	.long  0x3FFE0000,0xA80A80A8,0x0A80A80B,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	.long  0x3FFD0000,0xD7894992,0x3BC3588A,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	.long  0x3FFE0000,0xA655C439,0x2D7B73A8,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	.long  0x3FFD0000,0xDCC2C4B4,0x9887DACC,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	.long  0x3FFE0000,0xA4A9CF1D,0x96833751,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	.long  0x3FFD0000,0xE1EEBD3E,0x6D6A6B9E,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	.long  0x3FFE0000,0xA3065E3F,0xAE7CD0E0,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	.long  0x3FFD0000,0xE70D785C,0x2F9F5BDC,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	.long  0x3FFE0000,0xA16B312E,0xA8FC377D,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	.long  0x3FFD0000,0xEC1F392C,0x5179F283,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	.long  0x3FFE0000,0x9FD809FD,0x809FD80A,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	.long  0x3FFD0000,0xF12440D3,0xE36130E6,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	.long  0x3FFE0000,0x9E4CAD23,0xDD5F3A20,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	.long  0x3FFD0000,0xF61CCE92,0x346600BB,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	.long  0x3FFE0000,0x9CC8E160,0xC3FB19B9,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	.long  0x3FFD0000,0xFB091FD3,0x8145630A,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	.long  0x3FFE0000,0x9B4C6F9E,0xF03A3CAA,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	.long  0x3FFD0000,0xFFE97042,0xBFA4C2AD,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	.long  0x3FFE0000,0x99D722DA,0xBDE58F06,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	.long  0x3FFE0000,0x825EFCED,0x49369330,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	.long  0x3FFE0000,0x9868C809,0x868C8098,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	.long  0x3FFE0000,0x84C37A7A,0xB9A905C9,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	.long  0x3FFE0000,0x97012E02,0x5C04B809,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	.long  0x3FFE0000,0x87224C2E,0x8E645FB7,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	.long  0x3FFE0000,0x95A02568,0x095A0257,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	.long  0x3FFE0000,0x897B8CAC,0x9F7DE298,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	.long  0x3FFE0000,0x94458094,0x45809446,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 	.long  0x3FFE0000,0x8BCF55DE,0xC4CD05FE,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	.long  0x3FFE0000,0x92F11384,0x0497889C,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 	.long  0x3FFE0000,0x8E1DC0FB,0x89E125E5,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	.long  0x3FFE0000,0x91A2B3C4,0xD5E6F809,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	.long  0x3FFE0000,0x9066E68C,0x955B6C9B,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	.long  0x3FFE0000,0x905A3863,0x3E06C43B,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	.long  0x3FFE0000,0x92AADE74,0xC7BE59E0,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	.long  0x3FFE0000,0x8F1779D9,0xFDC3A219,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	.long  0x3FFE0000,0x94E9BFF6,0x15845643,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	.long  0x3FFE0000,0x8DDA5202,0x37694809,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	.long  0x3FFE0000,0x9723A1B7,0x20134203,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	.long  0x3FFE0000,0x8CA29C04,0x6514E023,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	.long  0x3FFE0000,0x995899C8,0x90EB8990,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	.long  0x3FFE0000,0x8B70344A,0x139BC75A,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	.long  0x3FFE0000,0x9B88BDAA,0x3A3DAE2F,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	.long  0x3FFE0000,0x8A42F870,0x5669DB46,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 	.long  0x3FFE0000,0x9DB4224F,0xFFE1157C,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	.long  0x3FFE0000,0x891AC73A,0xE9819B50,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	.long  0x3FFE0000,0x9FDADC26,0x8B7A12DA,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	.long  0x3FFE0000,0x87F78087,0xF78087F8,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	.long  0x3FFE0000,0xA1FCFF17,0xCE733BD4,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 	.long  0x3FFE0000,0x86D90544,0x7A34ACC6,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	.long  0x3FFE0000,0xA41A9E8F,0x5446FB9F,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	.long  0x3FFE0000,0x85BF3761,0x2CEE3C9B,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 	.long  0x3FFE0000,0xA633CD7E,0x6771CD8B,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 	.long  0x3FFE0000,0x84A9F9C8,0x084A9F9D,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 	.long  0x3FFE0000,0xA8489E60,0x0B435A5E,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	.long  0x3FFE0000,0x83993052,0x3FBE3368,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	.long  0x3FFE0000,0xAA59233C,0xCCA4BD49,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	.long  0x3FFE0000,0x828CBFBE,0xB9A020A3,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	.long  0x3FFE0000,0xAC656DAE,0x6BCC4985,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 	.long  0x3FFE0000,0x81848DA8,0xFAF0D277,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 	.long  0x3FFE0000,0xAE6D8EE3,0x60BB2468,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 	.long  0x3FFE0000,0x80808080,0x80808081,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 	.long  0x3FFE0000,0xB07197A2,0x3C46C654,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	.set	ADJK,L_SCR1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	.set	X,FP_SCR1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	.set	XDCARE,X+2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 	.set	XFRAC,X+4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 	.set	F,FP_SCR2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 	.set	FFRAC,F+4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 	.set	KLOG2,FP_SCR3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 	.set	SAVEU,FP_SCR4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	| xref	t_frcinx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 	|xref	t_extdnrm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 	|xref	t_operr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 	|xref	t_dz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 	.global	slognd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) slognd:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) |--ENTRY POINT FOR LOG(X) FOR DENORMALIZED INPUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	movel		#-100,ADJK(%a6)	| ...INPUT = 2^(ADJK) * FP0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) |----normalize the input value by left shifting k bits (k to be determined
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) |----below), adjusting exponent and storing -k to  ADJK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) |----the value TWOTO100 is no longer needed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) |----Note that this code assumes the denormalized input is NON-ZERO.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)      moveml	%d2-%d7,-(%a7)		| ...save some registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265)      movel	#0x00000000,%d3		| ...D3 is exponent of smallest norm. #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)      movel	4(%a0),%d4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)      movel	8(%a0),%d5		| ...(D4,D5) is (Hi_X,Lo_X)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)      clrl	%d2			| ...D2 used for holding K
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)      tstl	%d4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)      bnes	HiX_not0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) HiX_0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)      movel	%d5,%d4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)      clrl	%d5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)      movel	#32,%d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)      clrl	%d6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278)      bfffo      %d4{#0:#32},%d6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)      lsll      %d6,%d4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)      addl	%d6,%d2			| ...(D3,D4,D5) is normalized
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)      movel	%d3,X(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)      movel	%d4,XFRAC(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)      movel	%d5,XFRAC+4(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)      negl	%d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)      movel	%d2,ADJK(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)      fmovex	X(%a6),%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)      moveml	(%a7)+,%d2-%d7		| ...restore registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)      lea	X(%a6),%a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)      bras	LOGBGN			| ...begin regular log(X)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) HiX_not0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)      clrl	%d6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)      bfffo	%d4{#0:#32},%d6		| ...find first 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)      movel	%d6,%d2			| ...get k
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)      lsll	%d6,%d4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)      movel	%d5,%d7			| ...a copy of D5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299)      lsll	%d6,%d5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)      negl	%d6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)      addil	#32,%d6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302)      lsrl	%d6,%d7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)      orl	%d7,%d4			| ...(D3,D4,D5) normalized
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)      movel	%d3,X(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)      movel	%d4,XFRAC(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)      movel	%d5,XFRAC+4(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308)      negl	%d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)      movel	%d2,ADJK(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)      fmovex	X(%a6),%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)      moveml	(%a7)+,%d2-%d7		| ...restore registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)      lea	X(%a6),%a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)      bras	LOGBGN			| ...begin regular log(X)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 	.global	slogn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) slogn:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) |--ENTRY POINT FOR LOG(X) FOR X FINITE, NON-ZERO, NOT NAN'S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 	fmovex		(%a0),%fp0	| ...LOAD INPUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 	movel		#0x00000000,ADJK(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) LOGBGN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) |--FPCR SAVED AND CLEARED, INPUT IS 2^(ADJK)*FP0, FP0 CONTAINS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) |--A FINITE, NON-ZERO, NORMALIZED NUMBER.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 	movel	(%a0),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 	movew	4(%a0),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 	movel	(%a0),X(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 	movel	4(%a0),X+4(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 	movel	8(%a0),X+8(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 	cmpil	#0,%d0		| ...CHECK IF X IS NEGATIVE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 	blt	LOGNEG		| ...LOG OF NEGATIVE ARGUMENT IS INVALID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 	cmp2l	BOUNDS1,%d0	| ...X IS POSITIVE, CHECK IF X IS NEAR 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 	bcc	LOGNEAR1	| ...BOUNDS IS ROUGHLY [15/16, 17/16]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) LOGMAIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) |--THIS SHOULD BE THE USUAL CASE, X NOT VERY CLOSE TO 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) |--X = 2^(K) * Y, 1 <= Y < 2. THUS, Y = 1.XXXXXXXX....XX IN BINARY.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) |--WE DEFINE F = 1.XXXXXX1, I.E. FIRST 7 BITS OF Y AND ATTACH A 1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) |--THE IDEA IS THAT LOG(X) = K*LOG2 + LOG(Y)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) |--			 = K*LOG2 + LOG(F) + LOG(1 + (Y-F)/F).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) |--NOTE THAT U = (Y-F)/F IS VERY SMALL AND THUS APPROXIMATING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) |--LOG(1+U) CAN BE VERY EFFICIENT.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) |--ALSO NOTE THAT THE VALUE 1/F IS STORED IN A TABLE SO THAT NO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) |--DIVISION IS NEEDED TO CALCULATE (Y-F)/F.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) |--GET K, Y, F, AND ADDRESS OF 1/F.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 	asrl	#8,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 	asrl	#8,%d0		| ...SHIFTED 16 BITS, BIASED EXPO. OF X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 	subil	#0x3FFF,%d0	| ...THIS IS K
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 	addl	ADJK(%a6),%d0	| ...ADJUST K, ORIGINAL INPUT MAY BE  DENORM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 	lea	LOGTBL,%a0	| ...BASE ADDRESS OF 1/F AND LOG(F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 	fmovel	%d0,%fp1		| ...CONVERT K TO FLOATING-POINT FORMAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) |--WHILE THE CONVERSION IS GOING ON, WE GET F AND ADDRESS OF 1/F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 	movel	#0x3FFF0000,X(%a6)	| ...X IS NOW Y, I.E. 2^(-K)*X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 	movel	XFRAC(%a6),FFRAC(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 	andil	#0xFE000000,FFRAC(%a6) | ...FIRST 7 BITS OF Y
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 	oril	#0x01000000,FFRAC(%a6) | ...GET F: ATTACH A 1 AT THE EIGHTH BIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 	movel	FFRAC(%a6),%d0	| ...READY TO GET ADDRESS OF 1/F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 	andil	#0x7E000000,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 	asrl	#8,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 	asrl	#8,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 	asrl	#4,%d0		| ...SHIFTED 20, D0 IS THE DISPLACEMENT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 	addal	%d0,%a0		| ...A0 IS THE ADDRESS FOR 1/F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 	fmovex	X(%a6),%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 	movel	#0x3fff0000,F(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 	clrl	F+8(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 	fsubx	F(%a6),%fp0		| ...Y-F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 	fmovemx %fp2-%fp2/%fp3,-(%sp)	| ...SAVE FP2 WHILE FP0 IS NOT READY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) |--SUMMARY: FP0 IS Y-F, A0 IS ADDRESS OF 1/F, FP1 IS K
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) |--REGISTERS SAVED: FPCR, FP1, FP2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) LP1CONT1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) |--AN RE-ENTRY POINT FOR LOGNP1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 	fmulx	(%a0),%fp0	| ...FP0 IS U = (Y-F)/F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 	fmulx	LOGOF2,%fp1	| ...GET K*LOG2 WHILE FP0 IS NOT READY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 	fmovex	%fp0,%fp2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 	fmulx	%fp2,%fp2		| ...FP2 IS V=U*U
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 	fmovex	%fp1,KLOG2(%a6)	| ...PUT K*LOG2 IN MEMORY, FREE FP1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) |--LOG(1+U) IS APPROXIMATED BY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) |--U + V*(A1+U*(A2+U*(A3+U*(A4+U*(A5+U*A6))))) WHICH IS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) |--[U + V*(A1+V*(A3+V*A5))]  +  [U*V*(A2+V*(A4+V*A6))]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 	fmovex	%fp2,%fp3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 	fmovex	%fp2,%fp1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 	fmuld	LOGA6,%fp1	| ...V*A6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 	fmuld	LOGA5,%fp2	| ...V*A5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 	faddd	LOGA4,%fp1	| ...A4+V*A6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 	faddd	LOGA3,%fp2	| ...A3+V*A5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 	fmulx	%fp3,%fp1		| ...V*(A4+V*A6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 	fmulx	%fp3,%fp2		| ...V*(A3+V*A5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) 	faddd	LOGA2,%fp1	| ...A2+V*(A4+V*A6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 	faddd	LOGA1,%fp2	| ...A1+V*(A3+V*A5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 	fmulx	%fp3,%fp1		| ...V*(A2+V*(A4+V*A6))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 	addal	#16,%a0		| ...ADDRESS OF LOG(F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 	fmulx	%fp3,%fp2		| ...V*(A1+V*(A3+V*A5)), FP3 RELEASED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 	fmulx	%fp0,%fp1		| ...U*V*(A2+V*(A4+V*A6))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 	faddx	%fp2,%fp0		| ...U+V*(A1+V*(A3+V*A5)), FP2 RELEASED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 	faddx	(%a0),%fp1	| ...LOG(F)+U*V*(A2+V*(A4+V*A6))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 	fmovemx  (%sp)+,%fp2-%fp2/%fp3	| ...RESTORE FP2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 	faddx	%fp1,%fp0		| ...FP0 IS LOG(F) + LOG(1+U)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 	fmovel	%d1,%fpcr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 	faddx	KLOG2(%a6),%fp0	| ...FINAL ADD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 	bra	t_frcinx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) LOGNEAR1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) |--REGISTERS SAVED: FPCR, FP1. FP0 CONTAINS THE INPUT.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 	fmovex	%fp0,%fp1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 	fsubs	one,%fp1		| ...FP1 IS X-1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 	fadds	one,%fp0		| ...FP0 IS X+1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 	faddx	%fp1,%fp1		| ...FP1 IS 2(X-1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) |--LOG(X) = LOG(1+U/2)-LOG(1-U/2) WHICH IS AN ODD POLYNOMIAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) |--IN U, U = 2(X-1)/(X+1) = FP1/FP0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) LP1CONT2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) |--THIS IS AN RE-ENTRY POINT FOR LOGNP1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 	fdivx	%fp0,%fp1		| ...FP1 IS U
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 	fmovemx %fp2-%fp2/%fp3,-(%sp)	 | ...SAVE FP2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) |--REGISTERS SAVED ARE NOW FPCR,FP1,FP2,FP3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) |--LET V=U*U, W=V*V, CALCULATE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) |--U + U*V*(B1 + V*(B2 + V*(B3 + V*(B4 + V*B5)))) BY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) |--U + U*V*(  [B1 + W*(B3 + W*B5)]  +  [V*(B2 + W*B4)]  )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 	fmovex	%fp1,%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 	fmulx	%fp0,%fp0	| ...FP0 IS V
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 	fmovex	%fp1,SAVEU(%a6) | ...STORE U IN MEMORY, FREE FP1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 	fmovex	%fp0,%fp1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 	fmulx	%fp1,%fp1	| ...FP1 IS W
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 	fmoved	LOGB5,%fp3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 	fmoved	LOGB4,%fp2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 	fmulx	%fp1,%fp3	| ...W*B5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) 	fmulx	%fp1,%fp2	| ...W*B4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 	faddd	LOGB3,%fp3 | ...B3+W*B5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 	faddd	LOGB2,%fp2 | ...B2+W*B4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 	fmulx	%fp3,%fp1	| ...W*(B3+W*B5), FP3 RELEASED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) 	fmulx	%fp0,%fp2	| ...V*(B2+W*B4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 	faddd	LOGB1,%fp1 | ...B1+W*(B3+W*B5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 	fmulx	SAVEU(%a6),%fp0 | ...FP0 IS U*V
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 	faddx	%fp2,%fp1	| ...B1+W*(B3+W*B5) + V*(B2+W*B4), FP2 RELEASED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 	fmovemx (%sp)+,%fp2-%fp2/%fp3 | ...FP2 RESTORED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 	fmulx	%fp1,%fp0	| ...U*V*( [B1+W*(B3+W*B5)] + [V*(B2+W*B4)] )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) 	fmovel	%d1,%fpcr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) 	faddx	SAVEU(%a6),%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) 	bra	t_frcinx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 	rts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) LOGNEG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) |--REGISTERS SAVED FPCR. LOG(-VE) IS INVALID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) 	bra	t_operr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 	.global	slognp1d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) slognp1d:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) |--ENTRY POINT FOR LOG(1+Z) FOR DENORMALIZED INPUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) | Simply return the denorm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) 	bra	t_extdnrm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) 	.global	slognp1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) slognp1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) |--ENTRY POINT FOR LOG(1+X) FOR X FINITE, NON-ZERO, NOT NAN'S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) 	fmovex	(%a0),%fp0	| ...LOAD INPUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 	fabsx	%fp0		|test magnitude
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 	fcmpx	LTHOLD,%fp0	|compare with min threshold
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) 	fbgt	LP1REAL		|if greater, continue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) 	fmovel	#0,%fpsr		|clr N flag from compare
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) 	fmovel	%d1,%fpcr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) 	fmovex	(%a0),%fp0	|return signed argument
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 	bra	t_frcinx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) LP1REAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) 	fmovex	(%a0),%fp0	| ...LOAD INPUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) 	movel	#0x00000000,ADJK(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) 	fmovex	%fp0,%fp1	| ...FP1 IS INPUT Z
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) 	fadds	one,%fp0	| ...X := ROUND(1+Z)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) 	fmovex	%fp0,X(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) 	movew	XFRAC(%a6),XDCARE(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) 	movel	X(%a6),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) 	cmpil	#0,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) 	ble	LP1NEG0	| ...LOG OF ZERO OR -VE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) 	cmp2l	BOUNDS2,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) 	bcs	LOGMAIN	| ...BOUNDS2 IS [1/2,3/2]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) |--IF 1+Z > 3/2 OR 1+Z < 1/2, THEN X, WHICH IS ROUNDING 1+Z,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) |--CONTAINS AT LEAST 63 BITS OF INFORMATION OF Z. IN THAT CASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) |--SIMPLY INVOKE LOG(X) FOR LOG(1+Z).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) LP1NEAR1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) |--NEXT SEE IF EXP(-1/16) < X < EXP(1/16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) 	cmp2l	BOUNDS1,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) 	bcss	LP1CARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) LP1ONE16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) |--EXP(-1/16) < X < EXP(1/16). LOG(1+Z) = LOG(1+U/2) - LOG(1-U/2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) |--WHERE U = 2Z/(2+Z) = 2Z/(1+X).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) 	faddx	%fp1,%fp1	| ...FP1 IS 2Z
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) 	fadds	one,%fp0	| ...FP0 IS 1+X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) |--U = FP1/FP0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) 	bra	LP1CONT2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) LP1CARE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) |--HERE WE USE THE USUAL TABLE DRIVEN APPROACH. CARE HAS TO BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) |--TAKEN BECAUSE 1+Z CAN HAVE 67 BITS OF INFORMATION AND WE MUST
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) |--PRESERVE ALL THE INFORMATION. BECAUSE 1+Z IS IN [1/2,3/2],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) |--THERE ARE ONLY TWO CASES.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) |--CASE 1: 1+Z < 1, THEN K = -1 AND Y-F = (2-F) + 2Z
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) |--CASE 2: 1+Z > 1, THEN K = 0  AND Y-F = (1-F) + Z
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) |--ON RETURNING TO LP1CONT1, WE MUST HAVE K IN FP1, ADDRESS OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) |--(1/F) IN A0, Y-F IN FP0, AND FP2 SAVED.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) 	movel	XFRAC(%a6),FFRAC(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) 	andil	#0xFE000000,FFRAC(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) 	oril	#0x01000000,FFRAC(%a6)	| ...F OBTAINED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) 	cmpil	#0x3FFF8000,%d0	| ...SEE IF 1+Z > 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) 	bges	KISZERO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) KISNEG1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) 	fmoves	TWO,%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) 	movel	#0x3fff0000,F(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) 	clrl	F+8(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) 	fsubx	F(%a6),%fp0	| ...2-F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) 	movel	FFRAC(%a6),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) 	andil	#0x7E000000,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) 	asrl	#8,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) 	asrl	#8,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) 	asrl	#4,%d0		| ...D0 CONTAINS DISPLACEMENT FOR 1/F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) 	faddx	%fp1,%fp1		| ...GET 2Z
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) 	fmovemx %fp2-%fp2/%fp3,-(%sp)	| ...SAVE FP2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) 	faddx	%fp1,%fp0		| ...FP0 IS Y-F = (2-F)+2Z
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) 	lea	LOGTBL,%a0	| ...A0 IS ADDRESS OF 1/F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) 	addal	%d0,%a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) 	fmoves	negone,%fp1	| ...FP1 IS K = -1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) 	bra	LP1CONT1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) KISZERO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) 	fmoves	one,%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) 	movel	#0x3fff0000,F(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) 	clrl	F+8(%a6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) 	fsubx	F(%a6),%fp0		| ...1-F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) 	movel	FFRAC(%a6),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) 	andil	#0x7E000000,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) 	asrl	#8,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) 	asrl	#8,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) 	asrl	#4,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) 	faddx	%fp1,%fp0		| ...FP0 IS Y-F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) 	fmovemx %fp2-%fp2/%fp3,-(%sp)	| ...FP2 SAVED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) 	lea	LOGTBL,%a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) 	addal	%d0,%a0		| ...A0 IS ADDRESS OF 1/F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) 	fmoves	zero,%fp1	| ...FP1 IS K = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) 	bra	LP1CONT1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) LP1NEG0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) |--FPCR SAVED. D0 IS X IN COMPACT FORM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) 	cmpil	#0,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) 	blts	LP1NEG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) LP1ZERO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) 	fmoves	negone,%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) 	fmovel	%d1,%fpcr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) 	bra t_dz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) LP1NEG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) 	fmoves	zero,%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) 	fmovel	%d1,%fpcr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) 	bra	t_operr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) 	|end