l_satan.s
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:16k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* l_satan.s - Motorola 68040 FP arc-tangent routines (LIB) */
  2. /* Copyright 1991-1993 Wind River Systems, Inc. */
  3. .data
  4. .globl _copyright_wind_river
  5. .long _copyright_wind_river
  6. /*
  7. modification history
  8. --------------------
  9. 01e,21jul93,kdl  added .text (SPR #2372).
  10. 01d,23aug92,jcf  changed bxxx to jxx.
  11. 01c,26may92,rrr  the tree shuffle
  12. 01b,09jan92,kdl  added modification history; general cleanup.
  13. 01a,15aug91,kdl  original version, from Motorola FPSP v2.0.
  14. */
  15. /*
  16. DESCRIPTION
  17. satansa 3.3 12/19/90
  18. The entry point __l_satan computes the arctagent of an
  19. input value. __l_satand does the same except the input value is a
  20. denormalized number.
  21. Input: Double-extended value in memory location pointed to by address
  22. register a0.
  23. Output: Arctan(X) returned in floating-point register Fp0.
  24. Accuracy and Monotonicity: The returned result is within 2 ulps in
  25. 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
  26. result is subsequently rounded to double precision. The
  27. result is provably monotonic in double precision.
  28. Speed: The program __l_satan takes approximately 160 cycles for input
  29. argument X such that 1/16 < |X| < 16. For the other arguments,
  30. the program will run no worse than 10 slower.
  31. Algorithm:
  32. Step 1. If |X| >= 16 or |X| < 1/16, go to Step 5.
  33. Step 2. Let X = sgn * 2**k * 1xxxxxxxx...x. Note that k = -4, -3,...,
  34. or 3.
  35. Define F = sgn * 2**k * 1xxxx1, i.e. the first 5 significant
  36. bits
  37. of X with a bit-1 attached at the 6-th bit position. Define u
  38. to be u = (X-F) / (1 + X*F).
  39. Step 3. Approximate arctan(u) by a polynomial poly.
  40. Step 4. Return arctan(F) + poly, arctan(F) is fetched from a table of
  41. values calculated beforehand. Exit.
  42. Step 5. If |X| >= 16, go to Step 7.
  43. Step 6. Approximate arctan(X) by an odd polynomial in X. Exit.
  44. Step 7. Define X' = -1/X. Approximate arctan(X') by an odd polynomial
  45. in X'.
  46. Arctan(X) = sign(X)*Pi/2 + arctan(X'). Exit.
  47. Copyright (C) Motorola, Inc. 1990
  48. All Rights Reserved
  49. THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  50. The copyright notice above does not evidence any
  51. actual or intended publication of such source code.
  52. __l_satan IDNT 2,1 Motorola 040 Floating Point Software Package
  53. section 8
  54. NOMANUAL
  55. */
  56. #include "fpsp040L.h"
  57. BOUNDS1: .long 0x3FFB8000,0x4002FFFF
  58. ONE: .long 0x3F800000
  59. .long 0x00000000
  60. ATANA3: .long 0xBFF6687E,0x314987D8
  61. ATANA2: .long 0x4002AC69,0x34A26DB3
  62. ATANA1: .long 0xBFC2476F,0x4E1DA28E
  63. ATANB6: .long 0x3FB34444,0x7F876989
  64. ATANB5: .long 0xBFB744EE,0x7FAF45DB
  65. ATANB4: .long 0x3FBC71C6,0x46940220
  66. ATANB3: .long 0xBFC24924,0x921872F9
  67. ATANB2: .long 0x3FC99999,0x99998FA9
  68. ATANB1: .long 0xBFD55555,0x55555555
  69. ATANC5: .long 0xBFB70BF3,0x98539E6A
  70. ATANC4: .long 0x3FBC7187,0x962D1D7D
  71. ATANC3: .long 0xBFC24924,0x827107B8
  72. ATANC2: .long 0x3FC99999,0x9996263E
  73. ATANC1: .long 0xBFD55555,0x55555536
  74. PPIBY2: .long 0x3FFF0000,0xC90FDAA2,0x2168C235,0x00000000
  75. NPIBY2: .long 0xBFFF0000,0xC90FDAA2,0x2168C235,0x00000000
  76. PTINY: .long 0x00010000,0x80000000,0x00000000,0x00000000
  77. NTINY: .long 0x80010000,0x80000000,0x00000000,0x00000000
  78. ATANTBL:
  79. .long 0x3FFB0000,0x83D152C5,0x060B7A51,0x00000000
  80. .long 0x3FFB0000,0x8BC85445,0x65498B8B,0x00000000
  81. .long 0x3FFB0000,0x93BE4060,0x17626B0D,0x00000000
  82. .long 0x3FFB0000,0x9BB3078D,0x35AEC202,0x00000000
  83. .long 0x3FFB0000,0xA3A69A52,0x5DDCE7DE,0x00000000
  84. .long 0x3FFB0000,0xAB98E943,0x62765619,0x00000000
  85. .long 0x3FFB0000,0xB389E502,0xF9C59862,0x00000000
  86. .long 0x3FFB0000,0xBB797E43,0x6B09E6FB,0x00000000
  87. .long 0x3FFB0000,0xC367A5C7,0x39E5F446,0x00000000
  88. .long 0x3FFB0000,0xCB544C61,0xCFF7D5C6,0x00000000
  89. .long 0x3FFB0000,0xD33F62F8,0x2488533E,0x00000000
  90. .long 0x3FFB0000,0xDB28DA81,0x62404C77,0x00000000
  91. .long 0x3FFB0000,0xE310A407,0x8AD34F18,0x00000000
  92. .long 0x3FFB0000,0xEAF6B0A8,0x188EE1EB,0x00000000
  93. .long 0x3FFB0000,0xF2DAF194,0x9DBE79D5,0x00000000
  94. .long 0x3FFB0000,0xFABD5813,0x61D47E3E,0x00000000
  95. .long 0x3FFC0000,0x8346AC21,0x0959ECC4,0x00000000
  96. .long 0x3FFC0000,0x8B232A08,0x304282D8,0x00000000
  97. .long 0x3FFC0000,0x92FB70B8,0xD29AE2F9,0x00000000
  98. .long 0x3FFC0000,0x9ACF476F,0x5CCD1CB4,0x00000000
  99. .long 0x3FFC0000,0xA29E7630,0x4954F23F,0x00000000
  100. .long 0x3FFC0000,0xAA68C5D0,0x8AB85230,0x00000000
  101. .long 0x3FFC0000,0xB22DFFFD,0x9D539F83,0x00000000
  102. .long 0x3FFC0000,0xB9EDEF45,0x3E900EA5,0x00000000
  103. .long 0x3FFC0000,0xC1A85F1C,0xC75E3EA5,0x00000000
  104. .long 0x3FFC0000,0xC95D1BE8,0x28138DE6,0x00000000
  105. .long 0x3FFC0000,0xD10BF300,0x840D2DE4,0x00000000
  106. .long 0x3FFC0000,0xD8B4B2BA,0x6BC05E7A,0x00000000
  107. .long 0x3FFC0000,0xE0572A6B,0xB42335F6,0x00000000
  108. .long 0x3FFC0000,0xE7F32A70,0xEA9CAA8F,0x00000000
  109. .long 0x3FFC0000,0xEF888432,0x64ECEFAA,0x00000000
  110. .long 0x3FFC0000,0xF7170A28,0xECC06666,0x00000000
  111. .long 0x3FFD0000,0x812FD288,0x332DAD32,0x00000000
  112. .long 0x3FFD0000,0x88A8D1B1,0x218E4D64,0x00000000
  113. .long 0x3FFD0000,0x9012AB3F,0x23E4AEE8,0x00000000
  114. .long 0x3FFD0000,0x976CC3D4,0x11E7F1B9,0x00000000
  115. .long 0x3FFD0000,0x9EB68949,0x3889A227,0x00000000
  116. .long 0x3FFD0000,0xA5EF72C3,0x4487361B,0x00000000
  117. .long 0x3FFD0000,0xAD1700BA,0xF07A7227,0x00000000
  118. .long 0x3FFD0000,0xB42CBCFA,0xFD37EFB7,0x00000000
  119. .long 0x3FFD0000,0xBB303A94,0x0BA80F89,0x00000000
  120. .long 0x3FFD0000,0xC22115C6,0xFCAEBBAF,0x00000000
  121. .long 0x3FFD0000,0xC8FEF3E6,0x86331221,0x00000000
  122. .long 0x3FFD0000,0xCFC98330,0xB4000C70,0x00000000
  123. .long 0x3FFD0000,0xD6807AA1,0x102C5BF9,0x00000000
  124. .long 0x3FFD0000,0xDD2399BC,0x31252AA3,0x00000000
  125. .long 0x3FFD0000,0xE3B2A855,0x6B8FC517,0x00000000
  126. .long 0x3FFD0000,0xEA2D764F,0x64315989,0x00000000
  127. .long 0x3FFD0000,0xF3BF5BF8,0xBAD1A21D,0x00000000
  128. .long 0x3FFE0000,0x801CE39E,0x0D205C9A,0x00000000
  129. .long 0x3FFE0000,0x8630A2DA,0xDA1ED066,0x00000000
  130. .long 0x3FFE0000,0x8C1AD445,0xF3E09B8C,0x00000000
  131. .long 0x3FFE0000,0x91DB8F16,0x64F350E2,0x00000000
  132. .long 0x3FFE0000,0x97731420,0x365E538C,0x00000000
  133. .long 0x3FFE0000,0x9CE1C8E6,0xA0B8CDBA,0x00000000
  134. .long 0x3FFE0000,0xA22832DB,0xCADAAE09,0x00000000
  135. .long 0x3FFE0000,0xA746F2DD,0xB7602294,0x00000000
  136. .long 0x3FFE0000,0xAC3EC0FB,0x997DD6A2,0x00000000
  137. .long 0x3FFE0000,0xB110688A,0xEBDC6F6A,0x00000000
  138. .long 0x3FFE0000,0xB5BCC490,0x59ECC4B0,0x00000000
  139. .long 0x3FFE0000,0xBA44BC7D,0xD470782F,0x00000000
  140. .long 0x3FFE0000,0xBEA94144,0xFD049AAC,0x00000000
  141. .long 0x3FFE0000,0xC2EB4ABB,0x661628B6,0x00000000
  142. .long 0x3FFE0000,0xC70BD54C,0xE602EE14,0x00000000
  143. .long 0x3FFE0000,0xCD000549,0xADEC7159,0x00000000
  144. .long 0x3FFE0000,0xD48457D2,0xD8EA4EA3,0x00000000
  145. .long 0x3FFE0000,0xDB948DA7,0x12DECE3B,0x00000000
  146. .long 0x3FFE0000,0xE23855F9,0x69E8096A,0x00000000
  147. .long 0x3FFE0000,0xE8771129,0xC4353259,0x00000000
  148. .long 0x3FFE0000,0xEE57C16E,0x0D379C0D,0x00000000
  149. .long 0x3FFE0000,0xF3E10211,0xA87C3779,0x00000000
  150. .long 0x3FFE0000,0xF919039D,0x758B8D41,0x00000000
  151. .long 0x3FFE0000,0xFE058B8F,0x64935FB3,0x00000000
  152. .long 0x3FFF0000,0x8155FB49,0x7B685D04,0x00000000
  153. .long 0x3FFF0000,0x83889E35,0x49D108E1,0x00000000
  154. .long 0x3FFF0000,0x859CFA76,0x511D724B,0x00000000
  155. .long 0x3FFF0000,0x87952ECF,0xFF8131E7,0x00000000
  156. .long 0x3FFF0000,0x89732FD1,0x9557641B,0x00000000
  157. .long 0x3FFF0000,0x8B38CAD1,0x01932A35,0x00000000
  158. .long 0x3FFF0000,0x8CE7A8D8,0x301EE6B5,0x00000000
  159. .long 0x3FFF0000,0x8F46A39E,0x2EAE5281,0x00000000
  160. .long 0x3FFF0000,0x922DA7D7,0x91888487,0x00000000
  161. .long 0x3FFF0000,0x94D19FCB,0xDEDF5241,0x00000000
  162. .long 0x3FFF0000,0x973AB944,0x19D2A08B,0x00000000
  163. .long 0x3FFF0000,0x996FF00E,0x08E10B96,0x00000000
  164. .long 0x3FFF0000,0x9B773F95,0x12321DA7,0x00000000
  165. .long 0x3FFF0000,0x9D55CC32,0x0F935624,0x00000000
  166. .long 0x3FFF0000,0x9F100575,0x006CC571,0x00000000
  167. .long 0x3FFF0000,0xA0A9C290,0xD97CC06C,0x00000000
  168. .long 0x3FFF0000,0xA22659EB,0xEBC0630A,0x00000000
  169. .long 0x3FFF0000,0xA388B4AF,0xF6EF0EC9,0x00000000
  170. .long 0x3FFF0000,0xA4D35F10,0x61D292C4,0x00000000
  171. .long 0x3FFF0000,0xA60895DC,0xFBE3187E,0x00000000
  172. .long 0x3FFF0000,0xA72A51DC,0x7367BEAC,0x00000000
  173. .long 0x3FFF0000,0xA83A5153,0x0956168F,0x00000000
  174. .long 0x3FFF0000,0xA93A2007,0x7539546E,0x00000000
  175. .long 0x3FFF0000,0xAA9E7245,0x023B2605,0x00000000
  176. .long 0x3FFF0000,0xAC4C84BA,0x6FE4D58F,0x00000000
  177. .long 0x3FFF0000,0xADCE4A4A,0x606B9712,0x00000000
  178. .long 0x3FFF0000,0xAF2A2DCD,0x8D263C9C,0x00000000
  179. .long 0x3FFF0000,0xB0656F81,0xF22265C7,0x00000000
  180. .long 0x3FFF0000,0xB1846515,0x0F71496A,0x00000000
  181. .long 0x3FFF0000,0xB28AAA15,0x6F9ADA35,0x00000000
  182. .long 0x3FFF0000,0xB37B44FF,0x3766B895,0x00000000
  183. .long 0x3FFF0000,0xB458C3DC,0xE9630433,0x00000000
  184. .long 0x3FFF0000,0xB525529D,0x562246BD,0x00000000
  185. .long 0x3FFF0000,0xB5E2CCA9,0x5F9D88CC,0x00000000
  186. .long 0x3FFF0000,0xB692CADA,0x7ACA1ADA,0x00000000
  187. .long 0x3FFF0000,0xB736AEA7,0xA6925838,0x00000000
  188. .long 0x3FFF0000,0xB7CFAB28,0x7E9F7B36,0x00000000
  189. .long 0x3FFF0000,0xB85ECC66,0xCB219835,0x00000000
  190. .long 0x3FFF0000,0xB8E4FD5A,0x20A593DA,0x00000000
  191. .long 0x3FFF0000,0xB99F41F6,0x4AFF9BB5,0x00000000
  192. .long 0x3FFF0000,0xBA7F1E17,0x842BBE7B,0x00000000
  193. .long 0x3FFF0000,0xBB471285,0x7637E17D,0x00000000
  194. .long 0x3FFF0000,0xBBFABE8A,0x4788DF6F,0x00000000
  195. .long 0x3FFF0000,0xBC9D0FAD,0x2B689D79,0x00000000
  196. .long 0x3FFF0000,0xBD306A39,0x471ECD86,0x00000000
  197. .long 0x3FFF0000,0xBDB6C731,0x856AF18A,0x00000000
  198. .long 0x3FFF0000,0xBE31CAC5,0x02E80D70,0x00000000
  199. .long 0x3FFF0000,0xBEA2D55C,0xE33194E2,0x00000000
  200. .long 0x3FFF0000,0xBF0B10B7,0xC03128F0,0x00000000
  201. .long 0x3FFF0000,0xBF6B7A18,0xDACB778D,0x00000000
  202. .long 0x3FFF0000,0xBFC4EA46,0x63FA18F6,0x00000000
  203. .long 0x3FFF0000,0xC0181BDE,0x8B89A454,0x00000000
  204. .long 0x3FFF0000,0xC065B066,0xCFBF6439,0x00000000
  205. .long 0x3FFF0000,0xC0AE345F,0x56340AE6,0x00000000
  206. .long 0x3FFF0000,0xC0F22291,0x9CB9E6A7,0x00000000
  207. #define X FP_SCR1
  208. #define XDCARE X+2
  209. #define XFRAC X+4
  210. #define XFRACLO X+8
  211. #define ATANF FP_SCR2
  212. #define ATANFHI ATANF+4
  213. #define ATANFLO ATANF+8
  214. | xref __l_t_frcinx
  215. | xref __l_t_extdnrm
  216. .text
  217. .globl __l_satand
  218. __l_satand:
  219. |--ENTRY POINT FOR ATAN(X) FOR DENORMALIZED ARGUMENT
  220. jra  __l_t_extdnrm
  221. .globl __l_satan
  222. __l_satan:
  223. /* |--ENTRY POINT FOR ATAN(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S */
  224. fmovex A0@,fp0 |...lOAD INPUT
  225. movel A0@,d0
  226. movew A0@(4),d0
  227. fmovex fp0,a6@(X)
  228. andil #0x7FFFFFFF,d0
  229. cmpil #0x3FFB8000,d0 |...|X| >= 1/16?
  230. jge  ATANOK1
  231. jra  ATANSM
  232. ATANOK1:
  233. cmpil #0x4002FFFF,d0 |...|X| < 16 ?
  234. jle  ATANMAIN
  235. jra  ATANBIG
  236. |--THE MOST LIKELY CASE, |X| IN [1/16, 16). WE USE TABLE TECHNIQUE
  237. |--THE IDEA IS ATAN(X) = ATAN(F) + ATAN( [X-F] / [1+XF] ).
  238. |--SO IF F IS CHOSEN TO BE CLOSE TO X AND ATAN(F) IS STORED IN
  239. |--A TABLE, ALL WE NEED IS TO APPROXIMATE ATAN(U) WHERE
  240. |--U = (X-F)/(1+XF) IS SMALL (REMEMBER F IS CLOSE TO X). IT IS
  241. |--TRUE THAT A DIVIDE IS NOW NEEDED, BUT THE APPROXIMATION FOR
  242. |--ATAN(U) IS A VERY SHORT POLYNOMIAL AND THE INDEXING TO
  243. |--FETCH F AND SAVING OF REGISTERS CAN BE ALL HIDED UNDER THE
  244. |--DIVIDE. IN THE END THIS METHOD IS MUCH FASTER THAN A TRADITIONAL
  245. |--ONE. NOTE ALSO THAT THE TRADITIONAL SCHEME THAT APPROXIMATE
  246. |--ATAN(X) DIRECTLY WILL NEED TO USE A RATIONAL APPROXIMATION
  247. |--(DIVISION NEEDED) ANYWAY BECAUSE A POLYNOMIAL APPROXIMATION
  248. |--WILL INVOLVE A VERY LONG POLYNOMIAL.
  249. |--NOW WE SEE X AS +-2^K * 1.BBBBBBB....B <- 1. + 63 BITS
  250. |--WE CHOSE F TO BE +-2^K * 1.BBBB1
  251. |--THAT IS IT MATCHES THE EXPONENT AND FIRST 5 BITS OF X, THE
  252. |--SIXTH BITS IS SET TO BE 1. SINCE K = -4, -3, |..., 3, THERE
  253. /* |--ARE ONLY 8 TIMES 16 = 2^7 = 128 |F|'S. SINCE ATAN(-|F|) IS */
  254. |-- -ATAN(|F|), WE NEED TO STORE ONLY ATAN(|F|).
  255. ATANMAIN:
  256. movew #0x0000,a6@(XDCARE) |...CLEAN UP X JUST IN CASE
  257. andil #0xF8000000,a6@(XFRAC) |...FIRST 5 BITS
  258. oril #0x04000000,a6@(XFRAC) |...SET 6-TH BIT TO 1
  259. movel #0x00000000,a6@(XFRACLO) |...lOCATION OF X IS NOW F
  260. fmovex fp0,fp1 |...FP1 IS X
  261. fmulx a6@(X),fp1 |...FP1 IS X*F, NOTE THAT X*F > 0
  262. fsubx a6@(X),fp0 |...FP0 IS X-F
  263. /* fadds &0x3F800000,fp1 */  .long 0xf23c44a2,0x3f800000
  264. fdivx fp1,fp0 |...FP0 IS U = (X-F)/(1+X*F)
  265. |--WHILE THE DIVISION IS TAKING ITS TIME, WE FETCH ATAN(|F|)
  266. |--CREATE ATAN(F) AND STORE IT IN ATANF, AND
  267. |--SAVE REGISTERS FP2.
  268. movel d2,a7@- |...SAVE d2 TEMPORARILY
  269. movel d0,d2 |...THE EXPO AND 16 BITS OF X
  270. andil #0x00007800,d0 /* |...4 VARYING BITS OF F'S FRACTION */
  271. andil #0x7FFF0000,d2 |...EXPONENT OF F
  272. subil #0x3FFB0000,d2 |...K+4
  273. asrl #1,d2
  274. addl d2,d0 |...THE 7 BITS IDENTIFYING F
  275. asrl #7,d0 |...INDEX INTO TBL OF ATAN(|F|)
  276. lea ATANTBL,a1
  277. addal d0,a1 |...ADDRESS OF ATAN(|F|)
  278. movel a1@+,a6@(ATANF)
  279. movel a1@+,a6@(ATANFHI)
  280. movel a1@+,a6@(ATANFLO) |...ATANF IS NOW ATAN(|F|)
  281. movel a6@(X),d0 |...lOAD SIGN AND EXPO. AGAIN
  282. andil #0x80000000,d0 |...SIGN(F)
  283. orl d0,a6@(ATANF) |...ATANF IS NOW SIGN(F)*ATAN(|F|)
  284. movel a7@+,d2 |...RESTORE d2
  285. /* |--THAT'S ALL I HAVE TO DO FOR NOW, */
  286. |--BUT ALAS, THE DIVIDE IS STILL CRANKING!
  287. |--U IN FP0, WE ARE NOW READY TO COMPUTE ATAN(U) AS
  288. |--U + A1*U*V*(A2 + V*(A3 + V)), V = U*U
  289. |--THE POLYNOMIAL MAY LOOK STRANGE, BUT IS NEVERTHELESS CORRECT.
  290. |--THE NATURAL FORM IS U + U*V*(A1 + V*(A2 + V*A3))
  291. |--WHAT WE HAVE HERE IS MERELY A1 = A3, A2 = A1/A3, A3 = A2/A3.
  292. |--THE REASON FOR THIS REARRANGEMENT IS TO MAKE THE INDEPENDENT
  293. |--PARTS A1*U*V AND (A2 + |... STUFF) MORE LOAD-BALANCED
  294. fmovex fp0,fp1
  295. fmulx fp1,fp1
  296. fmoved ATANA3,fp2
  297. faddx fp1,fp2 |...A3+V
  298. fmulx fp1,fp2 |...V*(A3+V)
  299. fmulx fp0,fp1 |...U*V
  300. faddd ATANA2,fp2 |...A2+V*(A3+V)
  301. fmuld ATANA1,fp1 |...A1*U*V
  302. fmulx fp2,fp1 |...A1*U*V*(A2+V*(A3+V))
  303. faddx fp1,fp0 |...ATAN(U), fp1 RELEASED
  304. fmovel d1,fpcr | restore users exceptions
  305. faddx a6@(ATANF),fp0 |...ATAN(X)
  306. jra  __l_t_frcinx
  307. ATANBORS:
  308. |--|X| IS IN d0 IN COMPACT FORM. FP1, d0 SAVED.
  309. |--FP0 IS X AND |X| <= 1/16 OR |X| >= 16.
  310. cmpil #0x3FFF8000,d0
  311. jgt  ATANBIG |...I.E. |X| >= 16
  312. ATANSM:
  313. |--|X| <= 1/16
  314. |--IF |X| < 2^(-40), RETURN X AS ANSWER. OTHERWISE, APPROXIMATE
  315. |--ATAN(X) BY X + X*Y*(B1+Y*(B2+Y*(B3+Y*(B4+Y*(B5+Y*B6)))))
  316. |--WHICH IS X + X*Y*( [B1+Z*(B3+Z*B5)] + [Y*(B2+Z*(B4+Z*B6)] )
  317. |--WHERE Y = X*X, AND Z = Y*Y.
  318. cmpil #0x3FD78000,d0
  319. jlt  ATANTINY
  320. |--COMPUTE POLYNOMIAL
  321. fmulx fp0,fp0 |...FP0 IS Y = X*X
  322. movew #0x0000,a6@(XDCARE)
  323. fmovex fp0,fp1
  324. fmulx fp1,fp1 |...FP1 IS Z = Y*Y
  325. fmoved ATANB6,fp2
  326. fmoved ATANB5,fp3
  327. fmulx fp1,fp2 |...Z*B6
  328. fmulx fp1,fp3 |...Z*B5
  329. faddd ATANB4,fp2 |...B4+Z*B6
  330. faddd ATANB3,fp3 |...B3+Z*B5
  331. fmulx fp1,fp2 |...Z*(B4+Z*B6)
  332. fmulx fp3,fp1 |...Z*(B3+Z*B5)
  333. faddd ATANB2,fp2 |...B2+Z*(B4+Z*B6)
  334. faddd ATANB1,fp1 |...B1+Z*(B3+Z*B5)
  335. fmulx fp0,fp2 |...Y*(B2+Z*(B4+Z*B6))
  336. fmulx a6@(X),fp0 |...X*Y
  337. faddx fp2,fp1 |...[B1+Z*(B3+Z*B5)]+[Y*(B2+Z*(B4+Z*B6))]
  338. fmulx fp1,fp0 |...X*Y*([B1+Z*(B3+Z*B5)]+[Y*(B2+Z*(B4+Z*B6))])
  339. fmovel d1,fpcr | restore users exceptions
  340. faddx a6@(X),fp0
  341. jra  __l_t_frcinx
  342. ATANTINY:
  343. |--|X| < 2^(-40), ATAN(X) = X
  344. movew #0x0000,a6@(XDCARE)
  345. fmovel d1,fpcr | restore users exceptions
  346. fmovex a6@(X),fp0 | last inst - possible exception set
  347. jra  __l_t_frcinx
  348. ATANBIG:
  349. |--IF |X| > 2^(100), RETURN SIGN(X)*(PI/2 - TINY). OTHERWISE,
  350. |--RETURN SIGN(X)*PI/2 + ATAN(-1/X).
  351. cmpil #0x40638000,d0
  352. jgt  ATANHUGE
  353. |--APPROXIMATE ATAN(-1/X) BY
  354. /* |--X'+X'*Y*(C1+Y*(C2+Y*(C3+Y*(C4+Y*C5)))), X' = -1/X, Y = X'*X' */
  355. |--THIS CAN BE RE-WRITTEN AS
  356. /* |--X'+X'*Y*( [C1+Z*(C3+Z*C5)] + [Y*(C2+Z*C4)] ), Z = Y*Y. */
  357. /* fmoves &0xBF800000,fp1 */  .long 0xf23c4480,0xbf800000
  358. fdivx fp0,fp1 |...FP1 IS -1/X
  359. |--DIVIDE IS STILL CRANKING
  360. fmovex fp1,fp0 /* |...FP0 IS X' */
  361. fmulx fp0,fp0 /* |...FP0 IS Y = X'*X' */
  362. fmovex fp1,a6@(X) /* |...X IS REALLY X' */
  363. fmovex fp0,fp1
  364. fmulx fp1,fp1 |...FP1 IS Z = Y*Y
  365. fmoved ATANC5,fp3
  366. fmoved ATANC4,fp2
  367. fmulx fp1,fp3 |...Z*C5
  368. fmulx fp1,fp2 |...Z*B4
  369. faddd ATANC3,fp3 |...C3+Z*C5
  370. faddd ATANC2,fp2 |...C2+Z*C4
  371. fmulx fp3,fp1 |...Z*(C3+Z*C5), fp3 RELEASED
  372. fmulx fp0,fp2 |...Y*(C2+Z*C4)
  373. faddd ATANC1,fp1 |...C1+Z*(C3+Z*C5)
  374. fmulx a6@(X),fp0 /* |...X'*Y */
  375. faddx fp2,fp1 |...[Y*(C2+Z*C4)]+[C1+Z*(C3+Z*C5)]
  376. fmulx fp1,fp0 /* |...X'*Y*([B1+Z*(B3+Z*B5)] */
  377. | |... +[Y*(B2+Z*(B4+Z*B6))])
  378. faddx a6@(X),fp0
  379. fmovel d1,fpcr | restore users exceptions
  380. btst #7,a0@
  381. jeq  pos_big
  382. neg_big:
  383. faddx NPIBY2,fp0
  384. jra  __l_t_frcinx
  385. pos_big:
  386. faddx PPIBY2,fp0
  387. jra  __l_t_frcinx
  388. ATANHUGE:
  389. |--RETURN SIGN(X)*(PIBY2 - TINY) = SIGN(X)*PIBY2 - SIGN(X)*TINY
  390. btst #7,a0@
  391. jeq  pos_huge
  392. neg_huge:
  393. fmovex NPIBY2,fp0
  394. fmovel d1,fpcr
  395. fsubx NTINY,fp0
  396. jra  __l_t_frcinx
  397. pos_huge:
  398. fmovex PPIBY2,fp0
  399. fmovel d1,fpcr
  400. fsubx PTINY,fp0
  401. jra  __l_t_frcinx
  402. | end