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

Linux/Unix编程

开发平台:

Unix_Linux

  1. |
  2. | x_unsupp.sa 3.3 7/1/91
  3. |
  4. | fpsp_unsupp --- FPSP handler for unsupported data type exception
  5. |
  6. | Trap vector #55 (See table 8-1 Mc68030 User's manual).
  7. | Invoked when the user program encounters a data format (packed) that
  8. | hardware does not support or a data type (denormalized numbers or un-
  9. | normalized numbers).
  10. | Normalizes denorms and unnorms, unpacks packed numbers then stores 
  11. | them back into the machine to let the 040 finish the operation.  
  12. |
  13. | Unsupp calls two routines:
  14. |  1. get_op -  gets the operand(s)
  15. |  2. res_func - restore the function back into the 040 or
  16. |  if fmove.p fpm,<ea> then pack source (fpm)
  17. |  and store in users memory <ea>.
  18. |
  19. |  Input: Long fsave stack frame
  20. |
  21. |
  22. | Copyright (C) Motorola, Inc. 1990
  23. | All Rights Reserved
  24. |
  25. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA 
  26. | The copyright notice above does not evidence any  
  27. | actual or intended publication of such source code.
  28. X_UNSUPP: |idnt    2,1 | Motorola 040 Floating Point Software Package
  29. |section 8
  30. .include "fpsp.h"
  31. |xref get_op
  32. |xref res_func
  33. |xref gen_except
  34. |xref fpsp_fmt_error
  35. .global fpsp_unsupp
  36. fpsp_unsupp:
  37. |
  38. link %a6,#-LOCAL_SIZE
  39. fsave -(%a7)
  40. moveml %d0-%d1/%a0-%a1,USER_DA(%a6)
  41. fmovemx %fp0-%fp3,USER_FP0(%a6)
  42. fmoveml %fpcr/%fpsr/%fpiar,USER_FPCR(%a6)
  43. moveb (%a7),VER_TMP(%a6) |save version number
  44. moveb (%a7),%d0 |test for valid version num
  45. andib #0xf0,%d0 |test for $4x
  46. cmpib #VER_4,%d0 |must be $4x or exit
  47. bnel fpsp_fmt_error
  48. fmovel #0,%FPSR |clear all user status bits
  49. fmovel #0,%FPCR |clear all user control bits
  50. |
  51. | The following lines are used to ensure that the FPSR
  52. | exception byte and condition codes are clear before proceeding,
  53. | except in the case of fmove, which leaves the cc's intact.
  54. |
  55. unsupp_con:
  56. movel USER_FPSR(%a6),%d1
  57. btst #5,CMDREG1B(%a6) |looking for fmove out
  58. bne fmove_con
  59. andl #0xFF00FF,%d1 |clear all but aexcs and qbyte
  60. bras end_fix
  61. fmove_con:
  62. andl #0x0FFF40FF,%d1 |clear all but cc's, snan bit, aexcs, and qbyte
  63. end_fix:
  64. movel %d1,USER_FPSR(%a6)
  65. st UFLG_TMP(%a6) |set flag for unsupp data
  66. bsrl get_op |everything okay, go get operand(s)
  67. bsrl res_func |fix up stack frame so can restore it
  68. clrl -(%a7)
  69. moveb VER_TMP(%a6),(%a7) |move idle fmt word to top of stack
  70. bral gen_except
  71. |
  72. |end