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

VxWorks

开发平台:

C/C++

  1. /* l_sgetem.s - Motorola 68040 FP exponent and mantissa 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. sgetemsa 3.1 12/10/90
  18. The entry point sGETEXP returns the exponent portion
  19. of the input argument.  The exponent bias is removed
  20. and the exponent value is returned as an extended
  21. precision number in fp0.  sGETEXPD handles denormalized
  22. numbers.
  23. The entry point sGETMAN extracts the mantissa of the
  24. input argument.  The mantissa is converted to an
  25. extended precision number and returned in fp0.  The
  26. range of the result is [1.0 - 2.0).
  27. Input:  Double-extended number X in the ETEMP space in
  28. the floating-point save stack.
  29. Output: The functions return exp(X) or man(X) in fp0.
  30. Modified: fp0.
  31. Copyright (C) Motorola, Inc. 1990
  32. All Rights Reserved
  33. THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  34. The copyright notice above does not evidence any
  35. actual or intended publication of such source code.
  36. SGETEM idnt 2,1 Motorola 040 Floating Point Software Package
  37. section 8
  38. NOMANUAL
  39. */
  40. #include "fpsp040L.h"
  41. | xref __l_nrm_set
  42. |
  43. | This entry point is used by the unimplemented instruction exception
  44. | handler.  It points a0 to the input operand.
  45. |
  46. |
  47. |
  48. | SGETEXP
  49. |
  50. .text
  51. .globl __l_sgetexp
  52. __l_sgetexp:
  53. movew a0@(LOCAL_EX),d0 | get the exponent
  54. bclr #15,d0 | clear the sign bit
  55. subw #0x3fff,d0 | subtract off the bias
  56. fmovew  d0,fp0 | move the exp to fp0
  57. rts
  58. .globl __l_sgetexpd
  59. __l_sgetexpd:
  60. bclr #sign_bit,a0@(LOCAL_EX)
  61. bsrl __l_nrm_set | normalize (exp will go negative)
  62. movew a0@(LOCAL_EX),d0 | load resulting exponent into d0
  63. subw #0x3fff,d0 | subtract off the bias
  64. fmovew d0,fp0 | move the exp to fp0
  65. rts
  66. |
  67. |
  68. | This entry point is used by the unimplemented instruction exception
  69. | handler.  It points a0 to the input operand.
  70. |
  71. |
  72. |
  73. | SGETMAN
  74. |
  75. |
  76. | For normalized numbers, leave the mantissa alone, simply load
  77. | with an exponent of +/- 0x3fff.
  78. |
  79. .globl __l_sgetman
  80. __l_sgetman:
  81. movel a6@(USER_FPCR),d0
  82. andil #0xffffff00,d0 | clear rounding precision and mode
  83. fmovel d0,fpcr | this fpcr setting is used by the 882
  84. movew a0@(LOCAL_EX),d0 | get the exp (really just want sign bit)
  85. orw #0x7fff,d0 | clear old exp
  86. bclr #14,d0   | make it the new exp +-3fff
  87. movew d0,a0@(LOCAL_EX) | move the sign # exp back to fsave stack
  88. fmovex a0@,fp0 | put new value back in fp0
  89. rts
  90. |
  91. | For denormalized numbers, shift the mantissa until the j-bit = 1,
  92. | then load the exponent with +/1 0x3fff.
  93. |
  94. .globl __l_sgetmand
  95. __l_sgetmand:
  96. movel a0@(LOCAL_HI),d0 | load ms mant in d0
  97. movel a0@(LOCAL_LO),d1 | load ls mant in d1
  98. bsrl shft | shift mantissa bits till msbit is set
  99. movel d0,a0@(LOCAL_HI) | put ms mant back on stack
  100. movel d1,a0@(LOCAL_LO) | put ls mant back on stack
  101. jra  __l_sgetman
  102. |
  103. | SHFT
  104. |
  105. | Shifts the mantissa bits until msbit is set.
  106. | input:
  107. | ms mantissa part in d0
  108. | ls mantissa part in d1
  109. | output:
  110. | shifted bits in d0 and d1
  111. shft:
  112. tstl d0 | if any bits set in ms mant
  113. jne  upper | then branch
  114. | | else no bits set in ms mant
  115. tstl d1 | test if any bits set in ls mant
  116. jne  cont | if set then continue
  117. jra  shft_end | else return
  118. cont:
  119. movel d3,a7@- | save d3
  120. exg d0,d1 | shift ls mant to ms mant
  121. bfffo d0{#0:#32},d3 | find first 1 in ls mant to d0
  122. lsll d3,d0 | shift first 1 to integer bit in ms mant
  123. movel a7@+,d3 | restore d3
  124. jra  shft_end
  125. upper:
  126. moveml d3/d5/d6,a7@- | save registers
  127. bfffo d0{#0:#32},d3 | find first 1 in ls mant to d0
  128. lsll d3,d0 | shift ms mant until j-bit is set
  129. movel d1,d6 | save ls mant in d6
  130. lsll d3,d1 | shift ls mant by count
  131. movel #32,d5
  132. subl d3,d5 | sub 32 from shift for ls mant
  133. lsrl d5,d6 | shift off all bits but those that will
  134. | | be shifted into ms mant
  135. orl d6,d0 | shift the ls mant bits into the ms mant
  136. moveml a7@+,d3/d5/d6 | restore registers
  137. shft_end:
  138. rts
  139. | end