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

Linux/Unix编程

开发平台:

Unix_Linux

  1. |
  2. | scosh.sa 3.1 12/10/90
  3. |
  4. | The entry point sCosh computes the hyperbolic cosine of
  5. | an input argument; sCoshd does the same except for denormalized
  6. | input.
  7. |
  8. | Input: Double-extended number X in location pointed to
  9. | by address register a0.
  10. |
  11. | Output: The value cosh(X) returned in floating-point register Fp0.
  12. |
  13. | Accuracy and Monotonicity: The returned result is within 3 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 sCOSH takes approximately 250 cycles.
  19. |
  20. | Algorithm:
  21. |
  22. | COSH
  23. | 1. If |X| > 16380 log2, go to 3.
  24. |
  25. | 2. (|X| <= 16380 log2) Cosh(X) is obtained by the formulae
  26. | y = |X|, z = exp(Y), and
  27. | cosh(X) = (1/2)*( z + 1/z ).
  28. | Exit.
  29. |
  30. | 3. (|X| > 16380 log2). If |X| > 16480 log2, go to 5.
  31. |
  32. | 4. (16380 log2 < |X| <= 16480 log2)
  33. | cosh(X) = sign(X) * exp(|X|)/2.
  34. | However, invoking exp(|X|) may cause premature overflow.
  35. | Thus, we calculate sinh(X) as follows:
  36. | Y := |X|
  37. | Fact := 2**(16380)
  38. | Y' := Y - 16381 log2
  39. | cosh(X) := Fact * exp(Y').
  40. | Exit.
  41. |
  42. | 5. (|X| > 16480 log2) sinh(X) must overflow. Return
  43. | Huge*Huge to generate overflow and an infinity with
  44. | the appropriate sign. Huge is the largest finite number in
  45. | extended format. Exit.
  46. |
  47. |
  48. | Copyright (C) Motorola, Inc. 1990
  49. | All Rights Reserved
  50. |
  51. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA 
  52. | The copyright notice above does not evidence any  
  53. | actual or intended publication of such source code.
  54. |SCOSH idnt 2,1 | Motorola 040 Floating Point Software Package
  55. |section 8
  56. |xref t_ovfl
  57. |xref t_frcinx
  58. |xref setox
  59. T1: .long 0x40C62D38,0xD3D64634 | ... 16381 LOG2 LEAD
  60. T2: .long 0x3D6F90AE,0xB1E75CC7 | ... 16381 LOG2 TRAIL
  61. TWO16380: .long 0x7FFB0000,0x80000000,0x00000000,0x00000000
  62. .global scoshd
  63. scoshd:
  64. |--COSH(X) = 1 FOR DENORMALIZED X
  65. fmoves #0x3F800000,%fp0
  66. fmovel %d1,%FPCR
  67. fadds #0x00800000,%fp0
  68. bra t_frcinx
  69. .global scosh
  70. scosh:
  71. fmovex (%a0),%fp0 | ...LOAD INPUT
  72. movel (%a0),%d0
  73. movew 4(%a0),%d0
  74. andil #0x7FFFFFFF,%d0
  75. cmpil #0x400CB167,%d0
  76. bgts COSHBIG
  77. |--THIS IS THE USUAL CASE, |X| < 16380 LOG2
  78. |--COSH(X) = (1/2) * ( EXP(X) + 1/EXP(X) )
  79. fabsx %fp0 | ...|X|
  80. movel %d1,-(%sp)
  81. clrl %d1
  82. fmovemx %fp0-%fp0,(%a0) |pass parameter to setox
  83. bsr setox | ...FP0 IS EXP(|X|)
  84. fmuls #0x3F000000,%fp0 | ...(1/2)EXP(|X|)
  85. movel (%sp)+,%d1
  86. fmoves #0x3E800000,%fp1 | ...(1/4)
  87. fdivx %fp0,%fp1   | ...1/(2 EXP(|X|))
  88. fmovel %d1,%FPCR
  89. faddx %fp1,%fp0
  90. bra t_frcinx
  91. COSHBIG:
  92. cmpil #0x400CB2B3,%d0
  93. bgts COSHHUGE
  94. fabsx %fp0
  95. fsubd T1(%pc),%fp0 | ...(|X|-16381LOG2_LEAD)
  96. fsubd T2(%pc),%fp0 | ...|X| - 16381 LOG2, ACCURATE
  97. movel %d1,-(%sp)
  98. clrl %d1
  99. fmovemx %fp0-%fp0,(%a0)
  100. bsr setox
  101. fmovel (%sp)+,%fpcr
  102. fmulx TWO16380(%pc),%fp0
  103. bra t_frcinx
  104. COSHHUGE:
  105. fmovel #0,%fpsr |clr N bit if set by source
  106. bclrb #7,(%a0) |always return positive value
  107. fmovemx (%a0),%fp0-%fp0
  108. bra t_ovfl
  109. |end