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

VxWorks

开发平台:

C/C++

  1. /* satanh.s - Motorola 68040 FP hyperbolic arc-tangent routines (EXC) */
  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. 01f,14jun95,tpr  changed fbxx to fbxxl.
  10. 01e,21jul93,kdl  added .text (SPR #2372).
  11. 01d,23aug92,jcf  changed bxxx to jxx.
  12. 01c,26may92,rrr  the tree shuffle
  13. 01b,10jan92,kdl  added modification history; general cleanup.
  14. 01a,15aug91,kdl  original version, from Motorola FPSP v2.0.
  15. */
  16. /*
  17. DESCRIPTION
  18. __x_satanhsa 3.3 12/19/90
  19. The entry point __x_satanh computes the inverse
  20. hyperbolic tangent of
  21. an input argument;  __x_satanhd does the same except for denormalized
  22. input.
  23. Input: Double-extended number X in location pointed to
  24. by address register a0.
  25. Output: The value arctanh(X) returned in floating-point register Fp0.
  26. Accuracy and Monotonicity: The returned result is within 3 ulps in
  27. 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
  28. result is subsequently rounded to double precision. The
  29. result is provably monotonic in double precision.
  30. Speed: The program __x_satanh takes approximately 270 cycles.
  31. Algorithm:
  32. ATANH
  33. 1. If |X| >= 1, go to 3.
  34. 2. (|X| < 1) Calculate atanh(X) by
  35. sgn := sign(X)
  36. y := |X|
  37. z := 2y/(1-y)
  38. atanh(X) := sgn * (1/2) * logp1(z)
  39. Exit.
  40. 3. If |X| > 1, go to 5.
  41. 4. (|X| = 1) Generate infinity with an appropriate sign and
  42. divide-by-zero by
  43. sgn := sign(X)
  44. atan(X) := sgn / (+0).
  45. Exit.
  46. 5. (|X| > 1) Generate an invalid operation by 0 * infinity.
  47. Exit.
  48. Copyright (C) Motorola, Inc. 1990
  49. All Rights Reserved
  50. THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  51. The copyright notice above does not evidence any
  52. actual or intended publication of such source code.
  53. __x_satanh IDNT 2,1 Motorola 040 Floating Point Software Package
  54. section 8
  55. NOMANUAL
  56. */
  57. | xref __x_t_dz
  58. | xref __x_t_operr
  59. | xref __x_t_frcinx
  60. | xref __x_t_extdnrm
  61. | xref __x_slognp1
  62. .text
  63. .globl __x_satanhd
  64. __x_satanhd:
  65. |--ATANH(X) = X FOR DENORMALIZED X
  66. jra  __x_t_extdnrm
  67. .globl __x_satanh
  68. __x_satanh:
  69. movel a0@,d0
  70. movew a0@(4),d0
  71. andil #0x7FFFFFFF,d0
  72. cmpil #0x3FFF8000,d0
  73. jge  ATANHBIG
  74. |--THIS IS THE USUAL CASE, |X| < 1
  75. |--Y = |X|, Z = 2Y/(1-Y), ATANH(X) = SIGN(X) * (1/2) * LOG1P(Z).
  76. fabsx a0@,fp0 |...Y = |X|
  77. fmovex fp0,fp1
  78. fnegx fp1 |...-Y
  79. faddx fp0,fp0 |...2Y
  80. .long 0xf23c44a2,0x3f800000 /*  fadds  &0x3F800000,fp1 */
  81. fdivx fp1,fp0 |...2Y/(1-Y)
  82. movel a0@,d0
  83. andil #0x80000000,d0
  84. oril #0x3F000000,d0 |...SIGN(X)*HALF
  85. movel d0,a7@-
  86. fmovemx fp0-fp0,a0@ |...overwrite input
  87. movel d1,a7@-
  88. clrl d1
  89. bsrl __x_slognp1 |...lOG1P(Z)
  90. fmovel a7@+,fpcr
  91. fmuls a7@+,fp0
  92. jra  __x_t_frcinx
  93. ATANHBIG:
  94. fabsx a0@,fp0 |...|X|
  95. .long 0xf23c4438,0x3f800000 /*  fcmps  &0x3F800000,fp0 */
  96. fbgtl __x_t_operr
  97. jra  __x_t_dz
  98. | end