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

VxWorks

开发平台:

C/C++

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