x_ovfl.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. |
  2. | x_ovfl.sa 3.5 7/1/91
  3. |
  4. | fpsp_ovfl --- FPSP handler for overflow exception
  5. |
  6. | Overflow occurs when a floating-point intermediate result is
  7. | too large to be represented in a floating-point data register,
  8. | or when storing to memory, the contents of a floating-point
  9. | data register are too large to be represented in the
  10. | destination format.
  11. |
  12. | Trap disabled results
  13. |
  14. | If the instruction is move_out, then garbage is stored in the
  15. | destination.  If the instruction is not move_out, then the
  16. | destination is not affected.  For 68881 compatibility, the
  17. | following values should be stored at the destination, based
  18. | on the current rounding mode:
  19. |
  20. |  RN Infinity with the sign of the intermediate result.
  21. |  RZ Largest magnitude number, with the sign of the
  22. | intermediate result.
  23. |  RM   For pos overflow, the largest pos number. For neg overflow,
  24. | -infinity
  25. |  RP   For pos overflow, +infinity. For neg overflow, the largest
  26. | neg number
  27. |
  28. | Trap enabled results
  29. | All trap disabled code applies.  In addition the exceptional
  30. | operand needs to be made available to the users exception handler
  31. | with a bias of $6000 subtracted from the exponent.
  32. |
  33. |
  34. | Copyright (C) Motorola, Inc. 1990
  35. | All Rights Reserved
  36. |
  37. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA 
  38. | The copyright notice above does not evidence any  
  39. | actual or intended publication of such source code.
  40. X_OVFL: |idnt    2,1 | Motorola 040 Floating Point Software Package
  41. |section 8
  42. .include "fpsp.h"
  43. |xref ovf_r_x2
  44. |xref ovf_r_x3
  45. |xref store
  46. |xref real_ovfl
  47. |xref real_inex
  48. |xref fpsp_done
  49. |xref g_opcls
  50. |xref b1238_fix
  51. .global fpsp_ovfl
  52. fpsp_ovfl:
  53. link %a6,#-LOCAL_SIZE
  54. fsave -(%a7)
  55. moveml %d0-%d1/%a0-%a1,USER_DA(%a6)
  56. fmovemx %fp0-%fp3,USER_FP0(%a6)
  57. fmoveml %fpcr/%fpsr/%fpiar,USER_FPCR(%a6)
  58. |
  59. | The 040 doesn't set the AINEX bit in the FPSR, the following
  60. | line temporarily rectifies this error.
  61. |
  62. bsetb #ainex_bit,FPSR_AEXCEPT(%a6)
  63. |
  64. bsrl ovf_adj |denormalize, round & store interm op
  65. |
  66. | if overflow traps not enabled check for inexact exception
  67. |
  68. btstb #ovfl_bit,FPCR_ENABLE(%a6)
  69. beqs ck_inex
  70. |
  71. btstb #E3,E_BYTE(%a6)
  72. beqs no_e3_1
  73. bfextu CMDREG3B(%a6){#6:#3},%d0 |get dest reg no
  74. bclrb %d0,FPR_DIRTY_BITS(%a6) |clr dest dirty bit
  75. bsrl b1238_fix
  76. movel USER_FPSR(%a6),FPSR_SHADOW(%a6)
  77. orl #sx_mask,E_BYTE(%a6)
  78. no_e3_1:
  79. moveml USER_DA(%a6),%d0-%d1/%a0-%a1
  80. fmovemx USER_FP0(%a6),%fp0-%fp3
  81. fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
  82. frestore (%a7)+
  83. unlk %a6
  84. bral real_ovfl
  85. |
  86. | It is possible to have either inex2 or inex1 exceptions with the
  87. | ovfl.  If the inex enable bit is set in the FPCR, and either
  88. | inex2 or inex1 occurred, we must clean up and branch to the
  89. | real inex handler.
  90. |
  91. ck_inex:
  92. | move.b FPCR_ENABLE(%a6),%d0
  93. | and.b FPSR_EXCEPT(%a6),%d0
  94. | andi.b #$3,%d0
  95. btstb #inex2_bit,FPCR_ENABLE(%a6)
  96. beqs ovfl_exit
  97. |
  98. | Inexact enabled and reported, and we must take an inexact exception.
  99. |
  100. take_inex:
  101. btstb #E3,E_BYTE(%a6)
  102. beqs no_e3_2
  103. bfextu CMDREG3B(%a6){#6:#3},%d0 |get dest reg no
  104. bclrb %d0,FPR_DIRTY_BITS(%a6) |clr dest dirty bit
  105. bsrl b1238_fix
  106. movel USER_FPSR(%a6),FPSR_SHADOW(%a6)
  107. orl #sx_mask,E_BYTE(%a6)
  108. no_e3_2:
  109. moveb #INEX_VEC,EXC_VEC+1(%a6)
  110. moveml USER_DA(%a6),%d0-%d1/%a0-%a1
  111. fmovemx USER_FP0(%a6),%fp0-%fp3
  112. fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
  113. frestore (%a7)+
  114. unlk %a6
  115. bral real_inex
  116. ovfl_exit:
  117. bclrb #E3,E_BYTE(%a6) |test and clear E3 bit
  118. beqs e1_set
  119. |
  120. | Clear dirty bit on dest resister in the frame before branching
  121. | to b1238_fix.
  122. |
  123. bfextu CMDREG3B(%a6){#6:#3},%d0 |get dest reg no
  124. bclrb %d0,FPR_DIRTY_BITS(%a6) |clr dest dirty bit
  125. bsrl b1238_fix |test for bug1238 case
  126. movel USER_FPSR(%a6),FPSR_SHADOW(%a6)
  127. orl #sx_mask,E_BYTE(%a6)
  128. moveml USER_DA(%a6),%d0-%d1/%a0-%a1
  129. fmovemx USER_FP0(%a6),%fp0-%fp3
  130. fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
  131. frestore (%a7)+
  132. unlk %a6
  133. bral fpsp_done
  134. e1_set:
  135. moveml USER_DA(%a6),%d0-%d1/%a0-%a1
  136. fmovemx USER_FP0(%a6),%fp0-%fp3
  137. fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
  138. unlk %a6
  139. bral fpsp_done
  140. |
  141. | ovf_adj
  142. |
  143. ovf_adj:
  144. |
  145. | Have a0 point to the correct operand. 
  146. |
  147. btstb #E3,E_BYTE(%a6) |test E3 bit
  148. beqs ovf_e1
  149. lea WBTEMP(%a6),%a0
  150. bras ovf_com
  151. ovf_e1:
  152. lea ETEMP(%a6),%a0
  153. ovf_com:
  154. bclrb #sign_bit,LOCAL_EX(%a0)
  155. sne LOCAL_SGN(%a0)
  156. bsrl g_opcls |returns opclass in d0
  157. cmpiw #3,%d0 |check for opclass3
  158. bnes not_opc011
  159. |
  160. | FPSR_CC is saved and restored because ovf_r_x3 affects it. The
  161. | CCs are defined to be 'not affected' for the opclass3 instruction.
  162. |
  163. moveb FPSR_CC(%a6),L_SCR1(%a6)
  164.   bsrl ovf_r_x3 |returns a0 pointing to result
  165. moveb L_SCR1(%a6),FPSR_CC(%a6)
  166. bral store |stores to memory or register
  167. not_opc011:
  168. bsrl ovf_r_x2 |returns a0 pointing to result
  169. bral store |stores to memory or register
  170. |end