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

VxWorks

开发平台:

C/C++

  1. /* x_unsupp.s - Motorola 68040 FP unsupported data type exc 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_unsuppsa 3.2 4/26/91
  18. __x_fpsp_unsupp --- FPSP handler for unsupported data type exception
  19. Trap vector #55 (See table 8-1 Mc68030 User's manual).
  20. Invoked when the user program encounters a data format (packed) that
  21. hardware does not support or a data type (denormalized numbers or un-
  22. normalized numbers).
  23. Normalizes denorms and unnorms, unpacks packed numbers then stores
  24. them back into the machine to let the 040 finish the operation.
  25. Unsupp calls two routines:
  26. 1. __x_get_op -  gets the operand(s)
  27. 2. __x_res_func - restore the function back into the 040 or
  28. if fmovep fpm,<ea> then pack source (fpm)
  29. and store in users memory <ea>.
  30. Input: Long fsave stack frame
  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. X_UNSUPP idnt    2,1 Motorola 040 Floating Point Software Package
  37. section 8
  38. NOMANUAL
  39. */
  40. #include "fpsp040E.h"
  41. | xref __x_get_op
  42. | xref __x_res_func
  43. | xref __x_gen_except
  44. | xref __x_fpsp_fmt_error
  45. | xref __x_check_force
  46. .text
  47. .globl __x_fpsp_unsupp
  48. __x_fpsp_unsupp:
  49. |
  50. link a6,#-LOCAL_SIZE
  51. fsave a7@-
  52. moveml d0-d1/a0-a1,a6@(USER_DA)
  53. fmovemx fp0-fp3,a6@(USER_FP0)
  54. fmoveml fpcr/fpsr/fpi,a6@(USER_FPCR)
  55. /*
  56. | At this point we need to look at the instructions and see if it is one of
  57. | the force-precision ones (fsadd,fdadd,fssub,fdsub,fsmul,fdmul,fsdiv,fddiv,
  58. | fssqrt,fdsqrt,fsmove,fdmove,fsabs,fdabs,fsneg,fdneg).  If it is then
  59. | correct the USER_FPCR to the instruction's rounding precision (s or d).
  60. | Also, we need to check if the instruction is fsgldiv or fsglmul.  If it
  61. | is then the USER_FPCR is set to extended rounding precision.  Otherwise
  62. | leave the USER_FPCR alone.
  63. */
  64. | bsrl __x_check_force
  65. moveb a7@,a6@(VER_TMP) | save version number
  66. moveb a7@,d0 | test for valid version num
  67. andib #0xf0,d0 | test for 0x4x
  68. cmpib #VER_4,d0 | must be 0x4x or exit
  69. jne  __x_fpsp_fmt_error
  70. fmovel #0,FPSR | clear all user status bits
  71. fmovel #0,fpcr | clear all user control bits
  72. |
  73. | The following lines are used to ensure that the FPSR
  74. | exception byte and condition codes are clear before proceeding,
  75. /* | except in the case of fmove, which leaves the cc's intact. */
  76. |
  77. __x_unsupp_con:
  78. movel a6@(USER_FPSR),d1
  79. btst #5,a6@(CMDREG1B) | looking for fmovel out
  80. jne  fmove_con
  81. andl #0xFF00FF,d1 | clear all but aexcs and qbyte
  82. jra  end_fix
  83. fmove_con:
  84. andl #0x0FFF40FF,d1 /* clear all but cc's, snan bit,
  85.  * aexcs, and qbyte */
  86. end_fix:
  87. movel d1,a6@(USER_FPSR)
  88. st a6@(UFLG_TMP) | set flag for unsupp data
  89. bsrl __x_get_op | everything okay, go get operand(s)
  90. bsrl __x_res_func | fix up stack frame so can restore it
  91. clrl a7@-
  92. moveb a6@(VER_TMP),a7@ | move idle fmt word to top of stack
  93. jra  __x_gen_except
  94. |
  95. | end