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

Linux/Unix编程

开发平台:

Unix_Linux

  1. |
  2. | sint.sa 3.1 12/10/90
  3. |
  4. | The entry point sINT computes the rounded integer 
  5. | equivalent of the input argument, sINTRZ computes 
  6. | the integer rounded to zero of the input argument.
  7. |
  8. | Entry points sint and sintrz are called from do_func
  9. | to emulate the fint and fintrz unimplemented instructions,
  10. | respectively.  Entry point sintdo is used by bindec.
  11. |
  12. | Input: (Entry points sint and sintrz) Double-extended
  13. | number X in the ETEMP space in the floating-point
  14. | save stack.
  15. |        (Entry point sintdo) Double-extended number X in
  16. | location pointed to by the address register a0.
  17. |        (Entry point sintd) Double-extended denormalized
  18. | number X in the ETEMP space in the floating-point
  19. | save stack.
  20. |
  21. | Output: The function returns int(X) or intrz(X) in fp0.
  22. |
  23. | Modifies: fp0.
  24. |
  25. | Algorithm: (sint and sintrz)
  26. |
  27. | 1. If exp(X) >= 63, return X. 
  28. |    If exp(X) < 0, return +/- 0 or +/- 1, according to
  29. |    the rounding mode.
  30. |
  31. | 2. (X is in range) set rsc = 63 - exp(X). Unnormalize the
  32. |    result to the exponent $403e.
  33. |
  34. | 3. Round the result in the mode given in USER_FPCR. For
  35. |    sintrz, force round-to-zero mode.
  36. |
  37. | 4. Normalize the rounded result; store in fp0.
  38. |
  39. | For the denormalized cases, force the correct result
  40. | for the given sign and rounding mode.
  41. |
  42. |         Sign(X)
  43. | RMODE   +    -
  44. | -----  --------
  45. |  RN    +0   -0
  46. |  RZ    +0   -0
  47. |  RM    +0   -1
  48. |  RP    +1   -0
  49. |
  50. |
  51. | Copyright (C) Motorola, Inc. 1990
  52. | All Rights Reserved
  53. |
  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. |SINT    idnt    2,1 | Motorola 040 Floating Point Software Package
  58. |section 8
  59. .include "fpsp.h"
  60. |xref dnrm_lp
  61. |xref nrm_set
  62. |xref round
  63. |xref t_inx2
  64. |xref ld_pone
  65. |xref ld_mone
  66. |xref ld_pzero
  67. |xref ld_mzero
  68. |xref snzrinx
  69. |
  70. | FINT
  71. |
  72. .global sint
  73. sint:
  74. bfextu FPCR_MODE(%a6){#2:#2},%d1 |use user's mode for rounding
  75. | ;implicitly has extend precision
  76. | ;in upper word. 
  77. movel %d1,L_SCR1(%a6) |save mode bits
  78. bras sintexc
  79. |
  80. | FINT with extended denorm inputs.
  81. |
  82. .global sintd
  83. sintd:
  84. btstb #5,FPCR_MODE(%a6)
  85. beq snzrinx |if round nearest or round zero, +/- 0
  86. btstb #4,FPCR_MODE(%a6)
  87. beqs rnd_mns
  88. rnd_pls:
  89. btstb #sign_bit,LOCAL_EX(%a0)
  90. bnes sintmz
  91. bsr ld_pone |if round plus inf and pos, answer is +1
  92. bra t_inx2
  93. rnd_mns:
  94. btstb #sign_bit,LOCAL_EX(%a0)
  95. beqs sintpz
  96. bsr ld_mone |if round mns inf and neg, answer is -1
  97. bra t_inx2
  98. sintpz:
  99. bsr ld_pzero
  100. bra t_inx2
  101. sintmz:
  102. bsr ld_mzero
  103. bra t_inx2
  104. |
  105. | FINTRZ
  106. |
  107. .global sintrz
  108. sintrz:
  109. movel #1,L_SCR1(%a6) |use rz mode for rounding
  110. | ;implicitly has extend precision
  111. | ;in upper word. 
  112. bras sintexc
  113. |
  114. | SINTDO
  115. |
  116. | Input: a0 points to an IEEE extended format operand
  117. |  Output: fp0 has the result 
  118. |
  119. | Exceptions:
  120. |
  121. | If the subroutine results in an inexact operation, the inx2 and
  122. | ainx bits in the USER_FPSR are set.
  123. |
  124. |
  125. .global sintdo
  126. sintdo:
  127. bfextu FPCR_MODE(%a6){#2:#2},%d1 |use user's mode for rounding
  128. | ;implicitly has ext precision
  129. | ;in upper word. 
  130. movel %d1,L_SCR1(%a6) |save mode bits
  131. |
  132. | Real work of sint is in sintexc
  133. |
  134. sintexc:
  135. bclrb #sign_bit,LOCAL_EX(%a0) |convert to internal extended
  136. | ;format
  137. sne LOCAL_SGN(%a0)
  138. cmpw #0x403e,LOCAL_EX(%a0) |check if (unbiased) exp > 63
  139. bgts out_rnge |branch if exp < 63
  140. cmpw #0x3ffd,LOCAL_EX(%a0) |check if (unbiased) exp < 0
  141. bgt in_rnge |if 63 >= exp > 0, do calc
  142. |
  143. | Input is less than zero.  Restore sign, and check for directed
  144. | rounding modes.  L_SCR1 contains the rmode in the lower byte.
  145. |
  146. un_rnge:
  147. btstb #1,L_SCR1+3(%a6) |check for rn and rz
  148. beqs un_rnrz
  149. tstb LOCAL_SGN(%a0) |check for sign
  150. bnes un_rmrp_neg
  151. |
  152. | Sign is +.  If rp, load +1.0, if rm, load +0.0
  153. |
  154. cmpib #3,L_SCR1+3(%a6) |check for rp
  155. beqs un_ldpone |if rp, load +1.0
  156. bsr ld_pzero |if rm, load +0.0
  157. bra t_inx2
  158. un_ldpone:
  159. bsr ld_pone
  160. bra t_inx2
  161. |
  162. | Sign is -.  If rm, load -1.0, if rp, load -0.0
  163. |
  164. un_rmrp_neg:
  165. cmpib #2,L_SCR1+3(%a6) |check for rm
  166. beqs un_ldmone |if rm, load -1.0
  167. bsr ld_mzero |if rp, load -0.0
  168. bra t_inx2
  169. un_ldmone:
  170. bsr ld_mone
  171. bra t_inx2
  172. |
  173. | Rmode is rn or rz; return signed zero
  174. |
  175. un_rnrz:
  176. tstb LOCAL_SGN(%a0) |check for sign
  177. bnes un_rnrz_neg
  178. bsr ld_pzero
  179. bra t_inx2
  180. un_rnrz_neg:
  181. bsr ld_mzero
  182. bra t_inx2
  183. |
  184. | Input is greater than 2^63.  All bits are significant.  Return
  185. | the input.
  186. |
  187. out_rnge:
  188. bfclr LOCAL_SGN(%a0){#0:#8} |change back to IEEE ext format
  189. beqs intps
  190. bsetb #sign_bit,LOCAL_EX(%a0)
  191. intps:
  192. fmovel %fpcr,-(%sp)
  193. fmovel #0,%fpcr
  194. fmovex LOCAL_EX(%a0),%fp0 |if exp > 63
  195. | ;then return X to the user
  196. | ;there are no fraction bits
  197. fmovel (%sp)+,%fpcr
  198. rts
  199. in_rnge:
  200. |  ;shift off fraction bits
  201. clrl %d0 |clear d0 - initial g,r,s for
  202. | ;dnrm_lp
  203. movel #0x403e,%d1 |set threshold for dnrm_lp
  204. | ;assumes a0 points to operand
  205. bsr dnrm_lp
  206. | ;returns unnormalized number
  207. | ;pointed by a0
  208. | ;output d0 supplies g,r,s
  209. | ;used by round
  210. movel L_SCR1(%a6),%d1 |use selected rounding mode
  211. |
  212. |
  213. bsr round |round the unnorm based on users
  214. | ;input a0 ptr to ext X
  215. | ; d0 g,r,s bits
  216. | ; d1 PREC/MODE info
  217. | ;output a0 ptr to rounded result
  218. | ;inexact flag set in USER_FPSR
  219. | ;if initial grs set
  220. |
  221. | normalize the rounded result and store value in fp0
  222. |
  223. bsr nrm_set |normalize the unnorm
  224. | ;Input: a0 points to operand to
  225. | ;be normalized
  226. | ;Output: a0 points to normalized
  227. | ;result
  228. bfclr LOCAL_SGN(%a0){#0:#8}
  229. beqs nrmrndp
  230. bsetb #sign_bit,LOCAL_EX(%a0) |return to IEEE extended format
  231. nrmrndp:
  232. fmovel %fpcr,-(%sp)
  233. fmovel #0,%fpcr
  234. fmovex LOCAL_EX(%a0),%fp0 |move result to fp0
  235. fmovel (%sp)+,%fpcr
  236. rts
  237. |end