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

VxWorks

开发平台:

C/C++

  1. /* l_sacos.s - Motorola 68040 FP arc-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. 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,09jan92,kdl  added modification history; general cleanup.
  14. 01a,15aug91,kdl  original version, from Motorola FPSP v2.0.
  15. */
  16. /*
  17. DESCRIPTION
  18. sacossa 3.3 12/19/90
  19. Description: The entry point sAcos computes the inverse cosine of
  20. an input argument|  sAcosd 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 arccos(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 sCOS takes approximately 310 cycles.
  30. Algorithm:
  31. ACOS
  32. 1. If |X| >= 1, go to 3.
  33. 2. (|X| < 1) Calculate acos(X) by
  34. z := (1-X) / (1+X)
  35. acos(X) = 2 * atan( sqrt(z) ).
  36. Exit.
  37. 3. If |X| > 1, go to 5.
  38. 4. (|X| = 1) If X > 0, return 0. Otherwise, return Pi. Exit.
  39. 5. (|X| > 1) Generate an invalid operation by 0 * infinity.
  40. Exit.
  41. Copyright (C) Motorola, Inc. 1990
  42. All Rights Reserved
  43. THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  44. The copyright notice above does not evidence any
  45. actual or intended publication of such source code.
  46. SACOS idnt 2,1 Motorola 040 Floating Point Software Package
  47. section 8
  48. NOMANUAL
  49. */
  50. PI: .long 0x40000000,0xC90FDAA2,0x2168C235,0x00000000
  51. PIBY2: .long 0x3FFF0000,0xC90FDAA2,0x2168C235,0x00000000
  52. | xref __l_t_operr
  53. | xref __l_t_frcinx
  54. | xref __l_satan
  55. .text
  56. .globl __l_sacosd
  57. __l_sacosd:
  58. |--ACOS(X) = PI/2 FOR DENORMALIZED X
  59. fmovel d1,fpcr /* |...load user's rounding mode/precision */
  60. fmovex PIBY2,fp0
  61. jra  __l_t_frcinx
  62. .globl __l_sacos
  63. __l_sacos:
  64. fmovex a0@,fp0 |...lOAD INPUT
  65. movel a0@,d0 |...pack exponent with upper 16 fraction
  66. movew a0@(4),d0
  67. andil #0x7FFFFFFF,d0
  68. cmpil #0x3FFF8000,d0
  69. jge  ACOSBIG
  70. |--THIS IS THE USUAL CASE, |X| < 1
  71. |--ACOS(X) = 2 * ATAN( SQRT( (1-X)/(1+X) ) )
  72. /* fmoves &0x3F800000,fp1 */  .long 0xf23c4480,0x3f800000
  73. faddx fp0,fp1   |...1+X
  74. fnegx fp0   |... -X
  75. /* fadds &0x3F800000,fp0 */  .long 0xf23c4422,0x3f800000
  76. fdivx fp1,fp0   |...(1-X)/(1+X)
  77. fsqrtx fp0 |...SQRT((1-X)/(1+X))
  78. fmovemx fp0-fp0,a0@ |...overwrite input
  79. movel d1,a7@- | save original users fpcr
  80. clrl d1
  81. bsrl __l_satan |...ATAN(SQRT([1-X]/[1+X]))
  82. fmovel a7@+,fpcr | restore users exceptions
  83. faddx fp0,fp0   |...2 * ATAN( STUFF )
  84. jra  __l_t_frcinx
  85. ACOSBIG:
  86. fabsx fp0,fp0
  87. /* fcmps &0x3F800000,fp0 */  .long 0xf23c4438,0x3f800000
  88. fbgtl __l_t_operr | cause an operr exception
  89. |--|X| = 1, ACOS(X) = 0 OR PI
  90. movel a0@,d0 |...pack exponent with upper 16 fraction
  91. movew a0@(4),d0
  92. cmpl #0,d0 | D0 has original exponent+fraction
  93. jgt  ACOSP1
  94. |--X = -1
  95. |Returns PI and inexact exception
  96. fmovex PI,fp0
  97. fmovel d1,fpcr
  98. /* fadds &0x00800000,fp0 */  .long 0xf23c4422,0x00800000
  99. | cause an inexact exception to be put
  100. | | into the 040 - will not trap until next
  101. | | fp inst.
  102. jra  __l_t_frcinx
  103. ACOSP1:
  104. fmovel d1,fpcr
  105. /* fmoves &0x00000000,fp0 */  .long 0xf23c4400,0x00000000
  106. rts | Facos of +1 is exact
  107. | end