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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * Save/restore floating point context for signal handlers.
  7.  *
  8.  * Copyright (C) 1996, 1998, 1999, 2001 by Ralf Baechle
  9.  *
  10.  * Multi-arch abstraction and asm macros for easier reading:
  11.  * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
  12.  *
  13.  * Copyright (C) 1999, 2001 Silicon Graphics, Inc.
  14.  */
  15. #include <asm/asm.h>
  16. #include <asm/errno.h>
  17. #include <asm/fpregdef.h>
  18. #include <asm/mipsregs.h>
  19. #include <asm/offset.h>
  20. #include <asm/regdef.h>
  21. .macro EX insn, reg, src
  22. .set push
  23. .set nomacro
  24. .ex@: insn reg, src
  25. .set pop
  26. .section __ex_table,"a"
  27. PTR .ex@, fault
  28. .previous
  29. .endm
  30. .set noreorder
  31. /* Save floating point context */
  32. LEAF(save_fp_context)
  33. mfc0 t1, CP0_STATUS
  34. sll t2, t1,5
  35. bgez t2, 1f
  36.  cfc1 t1, fcr31
  37. /* Store the 16 odd double precision registers */
  38. EX sdc1 $f1, SC_FPREGS+8(a0)
  39. EX sdc1 $f3, SC_FPREGS+24(a0)
  40. EX sdc1 $f5, SC_FPREGS+40(a0)
  41. EX sdc1 $f7, SC_FPREGS+56(a0)
  42. EX sdc1 $f9, SC_FPREGS+72(a0)
  43. EX sdc1 $f11, SC_FPREGS+88(a0)
  44. EX sdc1 $f13, SC_FPREGS+104(a0)
  45. EX sdc1 $f15, SC_FPREGS+120(a0)
  46. EX sdc1 $f17, SC_FPREGS+136(a0)
  47. EX sdc1 $f19, SC_FPREGS+152(a0)
  48. EX sdc1 $f21, SC_FPREGS+168(a0)
  49. EX sdc1 $f23, SC_FPREGS+184(a0)
  50. EX sdc1 $f25, SC_FPREGS+200(a0)
  51. EX sdc1 $f27, SC_FPREGS+216(a0)
  52. EX sdc1 $f29, SC_FPREGS+232(a0)
  53. EX sdc1 $f31, SC_FPREGS+248(a0)
  54. /* Store the 16 even double precision registers */
  55. 1:
  56. EX sdc1 $f0, SC_FPREGS+0(a0)
  57. EX sdc1 $f2, SC_FPREGS+16(a0)
  58. EX sdc1 $f4, SC_FPREGS+32(a0)
  59. EX sdc1 $f6, SC_FPREGS+48(a0)
  60. EX sdc1 $f8, SC_FPREGS+64(a0)
  61. EX sdc1 $f10, SC_FPREGS+80(a0)
  62. EX sdc1 $f12, SC_FPREGS+96(a0)
  63. EX sdc1 $f14, SC_FPREGS+112(a0)
  64. EX sdc1 $f16, SC_FPREGS+128(a0)
  65. EX sdc1 $f18, SC_FPREGS+144(a0)
  66. EX sdc1 $f20, SC_FPREGS+160(a0)
  67. EX sdc1 $f22, SC_FPREGS+176(a0)
  68. EX sdc1 $f24, SC_FPREGS+192(a0)
  69. EX sdc1 $f26, SC_FPREGS+208(a0)
  70. EX sdc1 $f28, SC_FPREGS+224(a0)
  71. EX sdc1 $f30, SC_FPREGS+240(a0)
  72. EX sw t1, SC_FPC_CSR(a0)
  73. cfc1 t0, $0 # implementation/version
  74. EX sw t0, SC_FPC_EIR(a0)
  75. jr ra
  76.  li v0, 0 # success
  77. END(save_fp_context)
  78. /*
  79.  * Restore FPU state:
  80.  *  - fp gp registers
  81.  *  - cp1 status/control register
  82.  *
  83.  * We base the decision which registers to restore from the signal stack
  84.  * frame on the current content of c0_status, not on the content of the
  85.  * stack frame which might have been changed by the user.
  86.  */
  87. LEAF(restore_fp_context)
  88. mfc0 t1, CP0_STATUS
  89. sll t0, t1,5
  90. bgez t0, 1f
  91.  EX lw t0, SC_FPC_CSR(a0)
  92. /* Restore the 16 odd double precision registers only
  93.  * when enabled in the cp0 status register.
  94.  */
  95. EX ldc1 $f1, SC_FPREGS+8(a0)
  96. EX ldc1 $f3, SC_FPREGS+24(a0)
  97. EX ldc1 $f5, SC_FPREGS+40(a0)
  98. EX ldc1 $f7, SC_FPREGS+56(a0)
  99. EX ldc1 $f9, SC_FPREGS+72(a0)
  100. EX ldc1 $f11, SC_FPREGS+88(a0)
  101. EX ldc1 $f13, SC_FPREGS+104(a0)
  102. EX ldc1 $f15, SC_FPREGS+120(a0)
  103. EX ldc1 $f17, SC_FPREGS+136(a0)
  104. EX ldc1 $f19, SC_FPREGS+152(a0)
  105. EX ldc1 $f21, SC_FPREGS+168(a0)
  106. EX ldc1 $f23, SC_FPREGS+184(a0)
  107. EX ldc1 $f25, SC_FPREGS+200(a0)
  108. EX ldc1 $f27, SC_FPREGS+216(a0)
  109. EX ldc1 $f29, SC_FPREGS+232(a0)
  110. EX ldc1 $f31, SC_FPREGS+248(a0)
  111. /*
  112.  * Restore the 16 even double precision registers
  113.  * when cp1 was enabled in the cp0 status register.
  114.  */
  115. 1: EX ldc1 $f0, SC_FPREGS+0(a0)
  116. EX ldc1 $f2, SC_FPREGS+16(a0)
  117. EX ldc1 $f4, SC_FPREGS+32(a0)
  118. EX ldc1 $f6, SC_FPREGS+48(a0)
  119. EX ldc1 $f8, SC_FPREGS+64(a0)
  120. EX ldc1 $f10, SC_FPREGS+80(a0)
  121. EX ldc1 $f12, SC_FPREGS+96(a0)
  122. EX ldc1 $f14, SC_FPREGS+112(a0)
  123. EX ldc1 $f16, SC_FPREGS+128(a0)
  124. EX ldc1 $f18, SC_FPREGS+144(a0)
  125. EX ldc1 $f20, SC_FPREGS+160(a0)
  126. EX ldc1 $f22, SC_FPREGS+176(a0)
  127. EX ldc1 $f24, SC_FPREGS+192(a0)
  128. EX ldc1 $f26, SC_FPREGS+208(a0)
  129. EX ldc1 $f28, SC_FPREGS+224(a0)
  130. EX ldc1 $f30, SC_FPREGS+240(a0)
  131. ctc1 t0, fcr31
  132. jr ra
  133.  li v0, 0 # success
  134. END(restore_fp_context)
  135. .type fault@function
  136. .ent fault
  137. fault: jr ra
  138.  li v0, -EFAULT # failure
  139. .end fault