vector.S 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2012 Regents of the University of California
  4. * Copyright (C) 2017 SiFive
  5. * Copyright (C) 2019 T-HEAD
  6. *
  7. * This program is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU General Public License
  9. * as published by the Free Software Foundation, version 2.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. */
  16. #include <linux/linkage.h>
  17. #include <asm/asm.h>
  18. #include <asm/csr.h>
  19. #include <asm/asm-offsets.h>
  20. #if (defined(CONFIG_VECTOR_1_0) && defined(__THEAD_VERSION__))
  21. #define V_ST vse8.v
  22. #define V_LD vle8.v
  23. #else
  24. #define V_ST vsb.v
  25. #define V_LD vlb.v
  26. #endif
  27. ENTRY(__vstate_save)
  28. li a2, TASK_THREAD_V0
  29. add a0, a0, a2
  30. li t1, (SR_VS | SR_FS)
  31. csrs sstatus, t1
  32. csrr t0, CSR_VSTART
  33. sd t0, TASK_THREAD_VSTART_V0(a0)
  34. csrr t0, CSR_VXSAT
  35. sd t0, TASK_THREAD_VXSAT_V0(a0)
  36. csrr t0, CSR_VXRM
  37. sd t0, TASK_THREAD_VXRM_V0(a0)
  38. csrr t0, CSR_VL
  39. sd t0, TASK_THREAD_VL_V0(a0)
  40. csrr t0, CSR_VTYPE
  41. sd t0, TASK_THREAD_VTYPE_V0(a0)
  42. #ifdef CONFIG_VLEN_256
  43. vsetvli t0, x0, e8,m1
  44. V_ST v0, (a0)
  45. addi a0, a0, RISCV_VECTOR_VLENB
  46. V_ST v1, (a0)
  47. addi a0, a0, RISCV_VECTOR_VLENB
  48. V_ST v2, (a0)
  49. addi a0, a0, RISCV_VECTOR_VLENB
  50. V_ST v3, (a0)
  51. addi a0, a0, RISCV_VECTOR_VLENB
  52. V_ST v4, (a0)
  53. addi a0, a0, RISCV_VECTOR_VLENB
  54. V_ST v5, (a0)
  55. addi a0, a0, RISCV_VECTOR_VLENB
  56. V_ST v6, (a0)
  57. addi a0, a0, RISCV_VECTOR_VLENB
  58. V_ST v7, (a0)
  59. addi a0, a0, RISCV_VECTOR_VLENB
  60. V_ST v8, (a0)
  61. addi a0, a0, RISCV_VECTOR_VLENB
  62. V_ST v9, (a0)
  63. addi a0, a0, RISCV_VECTOR_VLENB
  64. V_ST v10, (a0)
  65. addi a0, a0, RISCV_VECTOR_VLENB
  66. V_ST v11, (a0)
  67. addi a0, a0, RISCV_VECTOR_VLENB
  68. V_ST v12, (a0)
  69. addi a0, a0, RISCV_VECTOR_VLENB
  70. V_ST v13, (a0)
  71. addi a0, a0, RISCV_VECTOR_VLENB
  72. V_ST v14, (a0)
  73. addi a0, a0, RISCV_VECTOR_VLENB
  74. V_ST v15, (a0)
  75. addi a0, a0, RISCV_VECTOR_VLENB
  76. V_ST v16, (a0)
  77. addi a0, a0, RISCV_VECTOR_VLENB
  78. V_ST v17, (a0)
  79. addi a0, a0, RISCV_VECTOR_VLENB
  80. V_ST v18, (a0)
  81. addi a0, a0, RISCV_VECTOR_VLENB
  82. V_ST v19, (a0)
  83. addi a0, a0, RISCV_VECTOR_VLENB
  84. V_ST v20, (a0)
  85. addi a0, a0, RISCV_VECTOR_VLENB
  86. V_ST v21, (a0)
  87. addi a0, a0, RISCV_VECTOR_VLENB
  88. V_ST v22, (a0)
  89. addi a0, a0, RISCV_VECTOR_VLENB
  90. V_ST v23, (a0)
  91. addi a0, a0, RISCV_VECTOR_VLENB
  92. V_ST v24, (a0)
  93. addi a0, a0, RISCV_VECTOR_VLENB
  94. V_ST v25, (a0)
  95. addi a0, a0, RISCV_VECTOR_VLENB
  96. V_ST v26, (a0)
  97. addi a0, a0, RISCV_VECTOR_VLENB
  98. V_ST v27, (a0)
  99. addi a0, a0, RISCV_VECTOR_VLENB
  100. V_ST v28, (a0)
  101. addi a0, a0, RISCV_VECTOR_VLENB
  102. V_ST v29, (a0)
  103. addi a0, a0, RISCV_VECTOR_VLENB
  104. V_ST v30, (a0)
  105. addi a0, a0, RISCV_VECTOR_VLENB
  106. V_ST v31, (a0)
  107. #else
  108. vsetvli t0, x0, e8,m8
  109. V_ST v0, (a0)
  110. addi a0, a0, RISCV_VECTOR_VLENB*8
  111. V_ST v8, (a0)
  112. addi a0, a0, RISCV_VECTOR_VLENB*8
  113. V_ST v16, (a0)
  114. addi a0, a0, RISCV_VECTOR_VLENB*8
  115. V_ST v24, (a0)
  116. #endif
  117. csrc sstatus, t1
  118. ret
  119. ENDPROC(__vstate_save)
  120. ENTRY(__vstate_restore)
  121. li a2, TASK_THREAD_V0
  122. add a0, a0, a2
  123. mv t2, a0
  124. li t1, (SR_VS | SR_FS)
  125. csrs sstatus, t1
  126. #ifdef CONFIG_VLEN_256
  127. vsetvli t0, x0, e8,m1
  128. V_LD v0, (a0)
  129. addi a0, a0, RISCV_VECTOR_VLENB
  130. V_LD v1, (a0)
  131. addi a0, a0, RISCV_VECTOR_VLENB
  132. V_LD v2, (a0)
  133. addi a0, a0, RISCV_VECTOR_VLENB
  134. V_LD v3, (a0)
  135. addi a0, a0, RISCV_VECTOR_VLENB
  136. V_LD v4, (a0)
  137. addi a0, a0, RISCV_VECTOR_VLENB
  138. V_LD v5, (a0)
  139. addi a0, a0, RISCV_VECTOR_VLENB
  140. V_LD v6, (a0)
  141. addi a0, a0, RISCV_VECTOR_VLENB
  142. V_LD v7, (a0)
  143. addi a0, a0, RISCV_VECTOR_VLENB
  144. V_LD v8, (a0)
  145. addi a0, a0, RISCV_VECTOR_VLENB
  146. V_LD v9, (a0)
  147. addi a0, a0, RISCV_VECTOR_VLENB
  148. V_LD v10, (a0)
  149. addi a0, a0, RISCV_VECTOR_VLENB
  150. V_LD v11, (a0)
  151. addi a0, a0, RISCV_VECTOR_VLENB
  152. V_LD v12, (a0)
  153. addi a0, a0, RISCV_VECTOR_VLENB
  154. V_LD v13, (a0)
  155. addi a0, a0, RISCV_VECTOR_VLENB
  156. V_LD v14, (a0)
  157. addi a0, a0, RISCV_VECTOR_VLENB
  158. V_LD v15, (a0)
  159. addi a0, a0, RISCV_VECTOR_VLENB
  160. V_LD v16, (a0)
  161. addi a0, a0, RISCV_VECTOR_VLENB
  162. V_LD v17, (a0)
  163. addi a0, a0, RISCV_VECTOR_VLENB
  164. V_LD v18, (a0)
  165. addi a0, a0, RISCV_VECTOR_VLENB
  166. V_LD v19, (a0)
  167. addi a0, a0, RISCV_VECTOR_VLENB
  168. V_LD v20, (a0)
  169. addi a0, a0, RISCV_VECTOR_VLENB
  170. V_LD v21, (a0)
  171. addi a0, a0, RISCV_VECTOR_VLENB
  172. V_LD v22, (a0)
  173. addi a0, a0, RISCV_VECTOR_VLENB
  174. V_LD v23, (a0)
  175. addi a0, a0, RISCV_VECTOR_VLENB
  176. V_LD v24, (a0)
  177. addi a0, a0, RISCV_VECTOR_VLENB
  178. V_LD v25, (a0)
  179. addi a0, a0, RISCV_VECTOR_VLENB
  180. V_LD v26, (a0)
  181. addi a0, a0, RISCV_VECTOR_VLENB
  182. V_LD v27, (a0)
  183. addi a0, a0, RISCV_VECTOR_VLENB
  184. V_LD v28, (a0)
  185. addi a0, a0, RISCV_VECTOR_VLENB
  186. V_LD v29, (a0)
  187. addi a0, a0, RISCV_VECTOR_VLENB
  188. V_LD v30, (a0)
  189. addi a0, a0, RISCV_VECTOR_VLENB
  190. V_LD v31, (a0)
  191. #else
  192. vsetvli t0, x0, e8,m8
  193. V_LD v0, (a0)
  194. addi a0, a0, RISCV_VECTOR_VLENB*8
  195. V_LD v8, (a0)
  196. addi a0, a0, RISCV_VECTOR_VLENB*8
  197. V_LD v16, (a0)
  198. addi a0, a0, RISCV_VECTOR_VLENB*8
  199. V_LD v24, (a0)
  200. #endif
  201. mv a0, t2
  202. ld t0, TASK_THREAD_VSTART_V0(a0)
  203. csrw CSR_VSTART, t0
  204. ld t0, TASK_THREAD_VXSAT_V0(a0)
  205. csrw CSR_VXSAT, t0
  206. ld t0, TASK_THREAD_VXRM_V0(a0)
  207. csrw CSR_VXRM, t0
  208. ld t0, TASK_THREAD_VL_V0(a0)
  209. ld t2, TASK_THREAD_VTYPE_V0(a0)
  210. #ifdef CONFIG_VECTOR_EMU
  211. srli t3, t2, 63
  212. bne t3,zero,1f
  213. #endif
  214. vsetvl t3, t0, t2
  215. #ifdef CONFIG_VECTOR_EMU
  216. j 2f
  217. 1: vsetvli zero,zero,e64,m2,d1
  218. 2:
  219. #endif
  220. csrc sstatus, t1
  221. ret
  222. ENDPROC(__vstate_restore)