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

VxWorks

开发平台:

C/C++

  1. /* x_ovfl.s - Motorola 68040 FP overflow exception handler (EXC) */
  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,10jan92,kdl  added modification history; general cleanup.
  13. 01a,15aug91,kdl  original version, from Motorola FPSP v2.0.
  14. */
  15. /*
  16. DESCRIPTION
  17. x_ovflsa 3.4 4/26/91
  18. fpsp_ovfl --- FPSP handler for overflow exception
  19. Overflow occurs when a floating-point intermediate result is
  20. too large to be represented in a floating-point data register,
  21. or when storing to memory, the contents of a floating-point
  22. data register are too large to be represented in the
  23. destination format.
  24.  Trap disabled results
  25.  If the instruction is move_out, then garbage is stored in the
  26.  destination.  If the instruction is not move_out, then the
  27.  destination is not affected.  For 68881 compatibility, the
  28.  following values should be stored at the destination, based
  29.  on the current rounding mode:
  30.   RN Infinity with the sign of the intermediate result.
  31.   RZ Largest magnitude number, with the sign of the
  32. intermediate result.
  33.   RM   For pos overflow, the largest pos number. For neg overflow,
  34. -infinity
  35.   RP   For pos overflow, +infinity. For neg overflow, the largest
  36. neg number
  37.  Trap enabled results
  38.  All trap disabled code applies.  In addition the exceptional
  39.  operand needs to be made available to the users exception handler
  40.  with a bias of 0x6000 subtracted from the exponent.
  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. X_OVFL idnt    2,1 Motorola 040 Floating Point Software Package
  47. section 8
  48. NOMANUAL
  49. */
  50. #include "fpsp040E.h"
  51. | xref __x_ovf_r_x2
  52. | xref __x_ovf_r_x3
  53. | xref __x_store
  54. | xref __x_real_ovfl
  55. | xref __x_real_inex
  56. | xref __x_fpsp_done
  57. | xref __x_g_opcls
  58. | xref __x_b1238_fix
  59. | xref __x_check_force
  60. .text
  61. .globl __x_fpsp_ovfl
  62. __x_fpsp_ovfl:
  63. link a6,#-LOCAL_SIZE
  64. fsave a7@-
  65. moveml d0-d1/a0-a1,a6@(USER_DA)
  66. fmovemx fp0-fp3,a6@(USER_FP0)
  67. fmoveml fpcr/fpsr/fpi,a6@(USER_FPCR)
  68. | At this point we need to look at the instructions and see if it is one of
  69. | the force-precision ones (fsadd,fdadd,fssub,fdsub,fsmul,fdmul,fsdiv,fddiv,
  70. | fssqrt,fdsqrt,fsmove,fdmove,fsabs,fdabs,fsneg,fdneg).  If it is then
  71. | correct the USER_FPCR to the instruction rounding precision (s or d).
  72. | Also, we need to check if the instruction is fsgldiv or fsglmul.  If it
  73. | is then the USER_FPCR is set to extended rounding precision.  Otherwise
  74. | leave the USER_FPCR alone.
  75. | bsrl __x_check_force
  76. |
  77. /*  The 040 doesn't set the AINEX bit in the FPSR, the following */
  78. | line temporarily rectifies this error.
  79. |
  80. bset #ainex_bit,a6@(FPSR_AEXCEPT)
  81. |
  82. bsrl ovf_adj | denormalize, round # store interm op
  83. |
  84. | if overflow traps not enabled check for inexact exception
  85. |
  86. btst #__x_ovfl_bit,a6@(fpcr_ENABLE)
  87. jeq  ck_inex
  88. |
  89. btst #E3,a6@(E_BYTE)
  90. jeq  no_e3_1
  91. bfextu a6@(CMDREG3B){#6:#3},d0 | get dest reg no
  92. bclr d0,a6@(FPR_DIRTY_BITS) | clr dest dirty bit
  93. bsrl __x_b1238_fix
  94. movel a6@(USER_FPSR),a6@(FPSR_SHADOW)
  95. orl #sx_mask,a6@(E_BYTE)
  96. no_e3_1:
  97. moveml a6@(USER_DA),d0-d1/a0-a1
  98. fmovemx a6@(USER_FP0),fp0-fp3
  99. fmoveml a6@(USER_FPCR),fpcr/fpsr/fpi
  100. frestore a7@+
  101. unlk a6
  102. jra  __x_real_ovfl
  103. |
  104. | It is possible to have either inex2 or inex1 exceptions with the
  105. | ovfl.  If the inex enable bit is set in the fpcr, and either
  106. | inex2 or inex1 occured, we must clean up and branch to the
  107. | real inex handler.
  108. |
  109. ck_inex:
  110. | moveb a6@(fpcr_ENABLE),d0
  111. | andb a6@(FPSR_EXCEPT),d0
  112. | andib #0x3,d0
  113. btst #__x_inex2_bit,a6@(fpcr_ENABLE)
  114. jeq  __x_ovfl_exit
  115. |
  116. | Inexact enabled and reported, and we must take an __x_inexact exception.
  117. |
  118. take_inex:
  119. btst #E3,a6@(E_BYTE)
  120. jeq  no_e3_2
  121. bfextu a6@(CMDREG3B){#6:#3},d0 | get dest reg no
  122. bclr d0,a6@(FPR_DIRTY_BITS) | clr dest dirty bit
  123. bsrl __x_b1238_fix
  124. movel a6@(USER_FPSR),a6@(FPSR_SHADOW)
  125. orl #sx_mask,a6@(E_BYTE)
  126. no_e3_2:
  127. moveb #INEX_VEC,a6@(EXC_VEC+1)
  128. moveml a6@(USER_DA),d0-d1/a0-a1
  129. fmovemx a6@(USER_FP0),fp0-fp3
  130. fmoveml a6@(USER_FPCR),fpcr/fpsr/fpi
  131. frestore a7@+
  132. unlk a6
  133. jra  __x_real_inex
  134. __x_ovfl_exit:
  135. bclr #E3,a6@(E_BYTE) | test and clear E3 bit
  136. jeq  e1_set
  137. |
  138. | Clear dirty bit on dest resister in the frame before branching
  139. | to __x_b1238_fix.
  140. |
  141. bfextu a6@(CMDREG3B){#6:#3},d0 | get dest reg no
  142. bclr d0,a6@(FPR_DIRTY_BITS) | clr dest dirty bit
  143. bsrl __x_b1238_fix | test for bug1238 case
  144. movel a6@(USER_FPSR),a6@(FPSR_SHADOW)
  145. orl #sx_mask,a6@(E_BYTE)
  146. moveml a6@(USER_DA),d0-d1/a0-a1
  147. fmovemx a6@(USER_FP0),fp0-fp3
  148. fmoveml a6@(USER_FPCR),fpcr/fpsr/fpi
  149. frestore a7@+
  150. unlk a6
  151. jra  __x_fpsp_done
  152. e1_set:
  153. moveml a6@(USER_DA),d0-d1/a0-a1
  154. fmovemx a6@(USER_FP0),fp0-fp3
  155. fmoveml a6@(USER_FPCR),fpcr/fpsr/fpi
  156. unlk a6
  157. jra  __x_fpsp_done
  158. |
  159. | ovf_adj
  160. |
  161. ovf_adj:
  162. |
  163. | Have a0 point to the correct operand.
  164. |
  165. btst #E3,a6@(E_BYTE) | test E3 bit
  166. jeq  ovf_e1
  167. lea a6@(WBTEMP),a0
  168. jra  ovf_com
  169. ovf_e1:
  170. lea a6@(ETEMP),a0
  171. ovf_com:
  172. bclr #sign_bit,a0@(LOCAL_EX)
  173. sne a0@(LOCAL_SGN)
  174. bsrl __x_g_opcls | returns opclass in d0
  175. cmpiw #3,d0 | check for opclass3
  176. jne  not_opc011
  177. |
  178. | FPSR_CC is saved and restored because __x_ovf_r_x3 affects it. The
  179. /* | CCs are defined to be 'not affected' for the opclass3 instruction. */
  180. |
  181. moveb a6@(FPSR_CC),a6@(L_SCR1)
  182.   bsrl __x_ovf_r_x3 | returns a0 pointing to result
  183. moveb a6@(L_SCR1),a6@(FPSR_CC)
  184. jra  __x_store | stores to memory or register
  185. not_opc011:
  186. bsrl __x_ovf_r_x2 | returns a0 pointing to result
  187. jra  __x_store | stores to memory or register
  188. | end