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

Linux/Unix编程

开发平台:

Unix_Linux

  1. |
  2. | sasin.sa 3.3 12/19/90
  3. |
  4. | Description: The entry point sAsin computes the inverse sine of
  5. | an input argument; sAsind 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 arcsin(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 sASIN takes approximately 310 cycles.
  19. |
  20. | Algorithm:
  21. |
  22. | ASIN
  23. | 1. If |X| >= 1, go to 3.
  24. |
  25. | 2. (|X| < 1) Calculate asin(X) by
  26. | z := sqrt( [1-X][1+X] )
  27. | asin(X) = atan( x / z ).
  28. | Exit.
  29. |
  30. | 3. If |X| > 1, go to 5.
  31. |
  32. | 4. (|X| = 1) sgn := sign(X), return asin(X) := sgn * Pi/2. Exit.
  33. |
  34. | 5. (|X| > 1) Generate an invalid operation by 0 * infinity.
  35. | Exit.
  36. |
  37. | Copyright (C) Motorola, Inc. 1990
  38. | All Rights Reserved
  39. |
  40. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA 
  41. | The copyright notice above does not evidence any  
  42. | actual or intended publication of such source code.
  43. |SASIN idnt 2,1 | Motorola 040 Floating Point Software Package
  44. |section 8
  45. PIBY2: .long 0x3FFF0000,0xC90FDAA2,0x2168C235,0x00000000
  46. |xref t_operr
  47. |xref t_frcinx
  48. |xref t_extdnrm
  49. |xref satan
  50. .global sasind
  51. sasind:
  52. |--ASIN(X) = X FOR DENORMALIZED X
  53. bra t_extdnrm
  54. .global sasin
  55. sasin:
  56. fmovex (%a0),%fp0 | ...LOAD INPUT
  57. movel (%a0),%d0
  58. movew 4(%a0),%d0
  59. andil #0x7FFFFFFF,%d0
  60. cmpil #0x3FFF8000,%d0
  61. bges asinbig
  62. |--THIS IS THE USUAL CASE, |X| < 1
  63. |--ASIN(X) = ATAN( X / SQRT( (1-X)(1+X) ) )
  64. fmoves #0x3F800000,%fp1
  65. fsubx %fp0,%fp1 | ...1-X
  66. fmovemx %fp2-%fp2,-(%a7)
  67. fmoves #0x3F800000,%fp2
  68. faddx %fp0,%fp2 | ...1+X
  69. fmulx %fp2,%fp1 | ...(1+X)(1-X)
  70. fmovemx (%a7)+,%fp2-%fp2
  71. fsqrtx %fp1 | ...SQRT([1-X][1+X])
  72. fdivx %fp1,%fp0   | ...X/SQRT([1-X][1+X])
  73. fmovemx %fp0-%fp0,(%a0)
  74. bsr satan
  75. bra t_frcinx
  76. asinbig:
  77. fabsx %fp0  | ...|X|
  78. fcmps #0x3F800000,%fp0
  79. fbgt t_operr |cause an operr exception
  80. |--|X| = 1, ASIN(X) = +- PI/2.
  81. fmovex PIBY2,%fp0
  82. movel (%a0),%d0
  83. andil #0x80000000,%d0 | ...SIGN BIT OF X
  84. oril #0x3F800000,%d0 | ...+-1 IN SGL FORMAT
  85. movel %d0,-(%sp) | ...push SIGN(X) IN SGL-FMT
  86. fmovel %d1,%FPCR
  87. fmuls (%sp)+,%fp0
  88. bra t_frcinx
  89. |end