satan.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:16k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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