satanh.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. |
  2. | satanh.sa 3.3 12/19/90
  3. |
  4. | The entry point satanh computes the inverse
  5. | hyperbolic tangent of
  6. | an input argument; satanhd does the same except for denormalized
  7. | input.
  8. |
  9. | Input: Double-extended number X in location pointed to
  10. | by address register a0.
  11. |
  12. | Output: The value arctanh(X) returned in floating-point register Fp0.
  13. |
  14. | Accuracy and Monotonicity: The returned result is within 3 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 satanh takes approximately 270 cycles.
  20. |
  21. | Algorithm:
  22. |
  23. | ATANH
  24. | 1. If |X| >= 1, go to 3.
  25. |
  26. | 2. (|X| < 1) Calculate atanh(X) by
  27. | sgn := sign(X)
  28. | y := |X|
  29. | z := 2y/(1-y)
  30. | atanh(X) := sgn * (1/2) * logp1(z)
  31. | Exit.
  32. |
  33. | 3. If |X| > 1, go to 5.
  34. |
  35. | 4. (|X| = 1) Generate infinity with an appropriate sign and
  36. | divide-by-zero by
  37. | sgn := sign(X)
  38. | atan(X) := sgn / (+0).
  39. | Exit.
  40. |
  41. | 5. (|X| > 1) Generate an invalid operation by 0 * infinity.
  42. | Exit.
  43. |
  44. | Copyright (C) Motorola, Inc. 1990
  45. | All Rights Reserved
  46. |
  47. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA 
  48. | The copyright notice above does not evidence any  
  49. | actual or intended publication of such source code.
  50. |satanh idnt 2,1 | Motorola 040 Floating Point Software Package
  51. |section 8
  52. |xref t_dz
  53. |xref t_operr
  54. |xref t_frcinx
  55. |xref t_extdnrm
  56. |xref slognp1
  57. .global satanhd
  58. satanhd:
  59. |--ATANH(X) = X FOR DENORMALIZED X
  60. bra t_extdnrm
  61. .global satanh
  62. satanh:
  63. movel (%a0),%d0
  64. movew 4(%a0),%d0
  65. andil #0x7FFFFFFF,%d0
  66. cmpil #0x3FFF8000,%d0
  67. bges ATANHBIG
  68. |--THIS IS THE USUAL CASE, |X| < 1
  69. |--Y = |X|, Z = 2Y/(1-Y), ATANH(X) = SIGN(X) * (1/2) * LOG1P(Z).
  70. fabsx (%a0),%fp0 | ...Y = |X|
  71. fmovex %fp0,%fp1
  72. fnegx %fp1 | ...-Y
  73. faddx %fp0,%fp0 | ...2Y
  74. fadds #0x3F800000,%fp1 | ...1-Y
  75. fdivx %fp1,%fp0 | ...2Y/(1-Y)
  76. movel (%a0),%d0
  77. andil #0x80000000,%d0
  78. oril #0x3F000000,%d0 | ...SIGN(X)*HALF
  79. movel %d0,-(%sp)
  80. fmovemx %fp0-%fp0,(%a0) | ...overwrite input
  81. movel %d1,-(%sp)
  82. clrl %d1
  83. bsr slognp1 | ...LOG1P(Z)
  84. fmovel (%sp)+,%fpcr
  85. fmuls (%sp)+,%fp0
  86. bra t_frcinx
  87. ATANHBIG:
  88. fabsx (%a0),%fp0 | ...|X|
  89. fcmps #0x3F800000,%fp0
  90. fbgt t_operr
  91. bra t_dz
  92. |end