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

VxWorks

开发平台:

C/C++

  1. /* l_ssinh.s - Motorola 68040 FP hyperbolic sine 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,10jan92,kdl  general cleanup.
  13. 01a,15aug91,kdl  original version, from Motorola FPSP v2.0;
  14.  added missing comment symbols.
  15. */
  16. /*
  17. DESCRIPTION
  18. ssinhsa 3.1 12/10/90
  19.        The entry point sSinh computes the hyperbolic sine of
  20.        an input argument;  sSinhd does the same except for denormalized
  21.        input.
  22.        Input: Double-extended number X in location pointed to
  23. by address register a0.
  24.        Output: The value sinh(X) returned in floating-point register Fp0.
  25.        Accuracy and Monotonicity: The returned result is within 3 ulps in
  26.                64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
  27.                result is subsequently rounded to double precision. The
  28.                result is provably monotonic in double precision.
  29.        Speed: The program sSINH takes approximately 280 cycles.
  30.        Algorithm:
  31.        SINH
  32.        1. If |X| > 16380 log2, go to 3.
  33.        2. (|X| <= 16380 log2) Sinh(X) is obtained by the formulae
  34.                y = |X|, sgn = sign(X), and z = expm1(Y),
  35.                sinh(X) = sgn*(1/2)*( z + z/(1+z) ).
  36.           Exit.
  37.        3. If |X| > 16480 log2, go to 5.
  38.        4. (16380 log2 < |X| <= 16480 log2)
  39.                sinh(X) = sign(X) * exp(|X|)/2.
  40.           However, invoking exp(|X|) may cause premature overflow.
  41.           Thus, we calculate sinh(X) as follows:
  42.              Y       := |X|
  43.              sgn     := sign(X)
  44.              sgnFact := sgn * 2**(16380)
  45.              Y'      := Y - 16381 log2
  46.              sinh(X) := sgnFact * exp(Y').
  47.           Exit.
  48.        5. (|X| > 16480 log2) sinh(X) must overflow. Return
  49.           sign(X)*Huge*Huge to generate overflow and an infinity with
  50.           the appropriate sign. Huge is the largest finite number in
  51.           extended format. Exit.
  52. Copyright (C) Motorola, Inc. 1990
  53. All Rights Reserved
  54. THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  55. The copyright notice above does not evidence any
  56. actual or intended publication of such source code.
  57. SSINH idnt 2,1 Motorola 040 Floating Point Software Package
  58. section 8
  59. NOMANUAL
  60. */
  61. T1: .long 0x40C62D38,0xD3D64634 |... 16381 LOG2 LEAD
  62. T2: .long 0x3D6F90AE,0xB1E75CC7 |... 16381 LOG2 TRAIL
  63. | xref __l_t_frcinx
  64. | xref __l_t_ovfl
  65. | xref __l_t_extdnrm
  66. | xref __l_setox
  67. | xref __l_setoxm1
  68. .text
  69. .globl __l_ssinhd
  70. __l_ssinhd:
  71. |--SINH(X) = X FOR DENORMALIZED X
  72. jra  __l_t_extdnrm
  73. .globl __l_ssinh
  74. __l_ssinh:
  75. fmovex a0@,fp0 |...lOAD INPUT
  76. movel a0@,d0
  77. movew a0@(4),d0
  78. movel d0,a1 |  save a copy of original (compacted) operand
  79. andl #0x7FFFFFFF,d0
  80. cmpl #0x400CB167,d0
  81. jgt  SINHBIG
  82. |--THIS IS THE USUAL CASE, |X| < 16380 LOG2
  83. |--Y = |X|, Z = EXPM1(Y), SINH(X) = SIGN(X)*(1/2)*( Z + Z/(1+Z) )
  84. fabsx fp0 |...Y = |X|
  85. moveml a1/d1,a7@-
  86. fmovemx fp0-fp0,a0@
  87. clrl d1
  88. bsrl __l_setoxm1   |...FP0 IS Z = EXPM1(Y)
  89. fmovel #0,fpcr
  90. moveml a7@+,a1/d1
  91. fmovex fp0,fp1
  92. .long 0xf23c44a2,0x3f800000 /* fadds &0x3F800000,fp1 */
  93. fmovex fp0,a7@-
  94. fdivx fp1,fp0 |...Z/(1+Z)
  95. movel a1,d0
  96. andl #0x80000000,d0
  97. orl #0x3F000000,d0
  98. faddx a7@+,fp0
  99. movel d0,a7@-
  100. fmovel d1,fpcr
  101. fmuls a7@+,fp0 | last fp inst - possible exceptions set
  102. jra  __l_t_frcinx
  103. SINHBIG:
  104. cmpl #0x400CB2B3,d0
  105. jgt  __l_t_ovfl
  106. fabsx fp0
  107. fsubd pc@(T1),fp0 |...(|X|-16381LOG2_LEAD)
  108. movel #0,a7@-
  109. movel #0x80000000,a7@-
  110. movel a1,d0
  111. andl #0x80000000,d0
  112. orl #0x7FFB0000,d0
  113. movel d0,a7@- |...EXTENDED FMT
  114. fsubd pc@(T2),fp0 |...|X| - 16381 LOG2, ACCURATE
  115. movel d1,a7@-
  116. clrl d1
  117. fmovemx fp0-fp0,a0@
  118. bsrl __l_setox
  119. fmovel a7@+,fpcr
  120. fmulx a7@+,fp0 | possible exception
  121. jra  __l_t_frcinx
  122. | end