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

嵌入式Linux

开发平台:

Unix_Linux

  1. |
  2. | x_fline.sa 3.3 1/10/91
  3. |
  4. | fpsp_fline --- FPSP handler for fline exception
  5. |
  6. | First determine if the exception is one of the unimplemented
  7. | floating point instructions.  If so, let fpsp_unimp handle it.
  8. | Next, determine if the instruction is an fmovecr with a non-zero
  9. | <ea> field.  If so, handle here and return.  Otherwise, it
  10. | must be a real F-line exception.
  11. |
  12. | Copyright (C) Motorola, Inc. 1990
  13. | All Rights Reserved
  14. |
  15. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA 
  16. | The copyright notice above does not evidence any  
  17. | actual or intended publication of such source code.
  18. X_FLINE: |idnt    2,1 | Motorola 040 Floating Point Software Package
  19. |section 8
  20. .include "fpsp.h"
  21. |xref real_fline
  22. |xref fpsp_unimp
  23. |xref uni_2
  24. |xref mem_read
  25. |xref fpsp_fmt_error
  26. .global fpsp_fline
  27. fpsp_fline:
  28. |
  29. | check for unimplemented vector first.  Use EXC_VEC-4 because
  30. | the equate is valid only after a 'link a6' has pushed one more
  31. | long onto the stack.
  32. |
  33. cmpw #UNIMP_VEC,EXC_VEC-4(%a7)
  34. beql fpsp_unimp
  35. |
  36. | fmovecr with non-zero <ea> handling here
  37. |
  38. subl #4,%a7 |4 accounts for 2-word difference
  39. | ;between six word frame (unimp) and
  40. | ;four word frame
  41. link %a6,#-LOCAL_SIZE
  42. fsave -(%a7)
  43. moveml %d0-%d1/%a0-%a1,USER_DA(%a6)
  44. moveal EXC_PC+4(%a6),%a0 |get address of fline instruction
  45. leal L_SCR1(%a6),%a1 |use L_SCR1 as scratch
  46. movel #4,%d0
  47. addl #4,%a6 |to offset the sub.l #4,a7 above so that
  48. | ;a6 can point correctly to the stack frame 
  49. | ;before branching to mem_read
  50. bsrl mem_read
  51. subl #4,%a6
  52. movel L_SCR1(%a6),%d0 |d0 contains the fline and command word
  53. bfextu %d0{#4:#3},%d1 |extract coprocessor id
  54. cmpib #1,%d1 |check if cpid=1
  55. bne not_mvcr |exit if not
  56. bfextu %d0{#16:#6},%d1
  57. cmpib #0x17,%d1 |check if it is an FMOVECR encoding
  58. bne not_mvcr
  59. | ;if an FMOVECR instruction, fix stack
  60. | ;and go to FPSP_UNIMP
  61. fix_stack:
  62. cmpib #VER_40,(%a7) |test for orig unimp frame
  63. bnes ck_rev
  64. subl #UNIMP_40_SIZE-4,%a7 |emulate an orig fsave
  65. moveb #VER_40,(%a7)
  66. moveb #UNIMP_40_SIZE-4,1(%a7)
  67. clrw 2(%a7)
  68. bras fix_con
  69. ck_rev:
  70. cmpib #VER_41,(%a7) |test for rev unimp frame
  71. bnel fpsp_fmt_error |if not $40 or $41, exit with error
  72. subl #UNIMP_41_SIZE-4,%a7 |emulate a rev fsave
  73. moveb #VER_41,(%a7)
  74. moveb #UNIMP_41_SIZE-4,1(%a7)
  75. clrw 2(%a7)
  76. fix_con:
  77. movew EXC_SR+4(%a6),EXC_SR(%a6) |move stacked sr to new position
  78. movel EXC_PC+4(%a6),EXC_PC(%a6) |move stacked pc to new position
  79. fmovel EXC_PC(%a6),%FPIAR |point FPIAR to fline inst
  80. movel #4,%d1
  81. addl %d1,EXC_PC(%a6) |increment stacked pc value to next inst
  82. movew #0x202c,EXC_VEC(%a6) |reformat vector to unimp
  83. clrl EXC_EA(%a6) |clear the EXC_EA field
  84. movew %d0,CMDREG1B(%a6) |move the lower word into CMDREG1B
  85. clrl E_BYTE(%a6)
  86. bsetb #UFLAG,T_BYTE(%a6)
  87. moveml USER_DA(%a6),%d0-%d1/%a0-%a1 |restore data registers
  88. bral uni_2
  89. not_mvcr:
  90. moveml USER_DA(%a6),%d0-%d1/%a0-%a1 |restore data registers
  91. frestore (%a7)+
  92. unlk %a6
  93. addl #4,%a7
  94. bral real_fline
  95. |end