asmmacro.h 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
  4. */
  5. #ifndef _ASM_ASMMACRO_H
  6. #define _ASM_ASMMACRO_H
  7. #include <asm/asm-offsets.h>
  8. #include <asm/regdef.h>
  9. #include <asm/fpregdef.h>
  10. #include <asm/loongarch.h>
  11. .macro parse_v var val
  12. \var = \val
  13. .endm
  14. .macro parse_r var r
  15. \var = -1
  16. .ifc \r, $r0
  17. \var = 0
  18. .endif
  19. .ifc \r, $r1
  20. \var = 1
  21. .endif
  22. .ifc \r, $r2
  23. \var = 2
  24. .endif
  25. .ifc \r, $r3
  26. \var = 3
  27. .endif
  28. .ifc \r, $r4
  29. \var = 4
  30. .endif
  31. .ifc \r, $r5
  32. \var = 5
  33. .endif
  34. .ifc \r, $r6
  35. \var = 6
  36. .endif
  37. .ifc \r, $r7
  38. \var = 7
  39. .endif
  40. .ifc \r, $r8
  41. \var = 8
  42. .endif
  43. .ifc \r, $r9
  44. \var = 9
  45. .endif
  46. .ifc \r, $r10
  47. \var = 10
  48. .endif
  49. .ifc \r, $r11
  50. \var = 11
  51. .endif
  52. .ifc \r, $r12
  53. \var = 12
  54. .endif
  55. .ifc \r, $r13
  56. \var = 13
  57. .endif
  58. .ifc \r, $r14
  59. \var = 14
  60. .endif
  61. .ifc \r, $r15
  62. \var = 15
  63. .endif
  64. .ifc \r, $r16
  65. \var = 16
  66. .endif
  67. .ifc \r, $r17
  68. \var = 17
  69. .endif
  70. .ifc \r, $r18
  71. \var = 18
  72. .endif
  73. .ifc \r, $r19
  74. \var = 19
  75. .endif
  76. .ifc \r, $r20
  77. \var = 20
  78. .endif
  79. .ifc \r, $r21
  80. \var = 21
  81. .endif
  82. .ifc \r, $r22
  83. \var = 22
  84. .endif
  85. .ifc \r, $r23
  86. \var = 23
  87. .endif
  88. .ifc \r, $r24
  89. \var = 24
  90. .endif
  91. .ifc \r, $r25
  92. \var = 25
  93. .endif
  94. .ifc \r, $r26
  95. \var = 26
  96. .endif
  97. .ifc \r, $r27
  98. \var = 27
  99. .endif
  100. .ifc \r, $r28
  101. \var = 28
  102. .endif
  103. .ifc \r, $r29
  104. \var = 29
  105. .endif
  106. .ifc \r, $r30
  107. \var = 30
  108. .endif
  109. .ifc \r, $r31
  110. \var = 31
  111. .endif
  112. .iflt \var
  113. .error "Unable to parse register name \r"
  114. .endif
  115. .endm
  116. .macro cpu_save_nonscratch thread
  117. stptr.d s0, \thread, THREAD_REG23
  118. stptr.d s1, \thread, THREAD_REG24
  119. stptr.d s2, \thread, THREAD_REG25
  120. stptr.d s3, \thread, THREAD_REG26
  121. stptr.d s4, \thread, THREAD_REG27
  122. stptr.d s5, \thread, THREAD_REG28
  123. stptr.d s6, \thread, THREAD_REG29
  124. stptr.d s7, \thread, THREAD_REG30
  125. stptr.d s8, \thread, THREAD_REG31
  126. stptr.d sp, \thread, THREAD_REG03
  127. stptr.d fp, \thread, THREAD_REG22
  128. .endm
  129. .macro cpu_restore_nonscratch thread
  130. ldptr.d s0, \thread, THREAD_REG23
  131. ldptr.d s1, \thread, THREAD_REG24
  132. ldptr.d s2, \thread, THREAD_REG25
  133. ldptr.d s3, \thread, THREAD_REG26
  134. ldptr.d s4, \thread, THREAD_REG27
  135. ldptr.d s5, \thread, THREAD_REG28
  136. ldptr.d s6, \thread, THREAD_REG29
  137. ldptr.d s7, \thread, THREAD_REG30
  138. ldptr.d s8, \thread, THREAD_REG31
  139. ldptr.d ra, \thread, THREAD_REG01
  140. ldptr.d sp, \thread, THREAD_REG03
  141. ldptr.d fp, \thread, THREAD_REG22
  142. .endm
  143. .macro fpu_save_csr thread tmp
  144. movfcsr2gr \tmp, fcsr0
  145. stptr.w \tmp, \thread, THREAD_FCSR
  146. .endm
  147. .macro fpu_restore_csr thread tmp
  148. ldptr.w \tmp, \thread, THREAD_FCSR
  149. movgr2fcsr fcsr0, \tmp
  150. .endm
  151. .macro fpu_save_cc thread tmp0 tmp1
  152. movcf2gr \tmp0, $fcc0
  153. move \tmp1, \tmp0
  154. movcf2gr \tmp0, $fcc1
  155. bstrins.d \tmp1, \tmp0, 15, 8
  156. movcf2gr \tmp0, $fcc2
  157. bstrins.d \tmp1, \tmp0, 23, 16
  158. movcf2gr \tmp0, $fcc3
  159. bstrins.d \tmp1, \tmp0, 31, 24
  160. movcf2gr \tmp0, $fcc4
  161. bstrins.d \tmp1, \tmp0, 39, 32
  162. movcf2gr \tmp0, $fcc5
  163. bstrins.d \tmp1, \tmp0, 47, 40
  164. movcf2gr \tmp0, $fcc6
  165. bstrins.d \tmp1, \tmp0, 55, 48
  166. movcf2gr \tmp0, $fcc7
  167. bstrins.d \tmp1, \tmp0, 63, 56
  168. stptr.d \tmp1, \thread, THREAD_FCC
  169. .endm
  170. .macro fpu_restore_cc thread tmp0 tmp1
  171. ldptr.d \tmp0, \thread, THREAD_FCC
  172. bstrpick.d \tmp1, \tmp0, 7, 0
  173. movgr2cf $fcc0, \tmp1
  174. bstrpick.d \tmp1, \tmp0, 15, 8
  175. movgr2cf $fcc1, \tmp1
  176. bstrpick.d \tmp1, \tmp0, 23, 16
  177. movgr2cf $fcc2, \tmp1
  178. bstrpick.d \tmp1, \tmp0, 31, 24
  179. movgr2cf $fcc3, \tmp1
  180. bstrpick.d \tmp1, \tmp0, 39, 32
  181. movgr2cf $fcc4, \tmp1
  182. bstrpick.d \tmp1, \tmp0, 47, 40
  183. movgr2cf $fcc5, \tmp1
  184. bstrpick.d \tmp1, \tmp0, 55, 48
  185. movgr2cf $fcc6, \tmp1
  186. bstrpick.d \tmp1, \tmp0, 63, 56
  187. movgr2cf $fcc7, \tmp1
  188. .endm
  189. .macro fpu_save_double thread tmp
  190. li.w \tmp, THREAD_FPR0
  191. PTR_ADD \tmp, \tmp, \thread
  192. fst.d $f0, \tmp, THREAD_FPR0 - THREAD_FPR0
  193. fst.d $f1, \tmp, THREAD_FPR1 - THREAD_FPR0
  194. fst.d $f2, \tmp, THREAD_FPR2 - THREAD_FPR0
  195. fst.d $f3, \tmp, THREAD_FPR3 - THREAD_FPR0
  196. fst.d $f4, \tmp, THREAD_FPR4 - THREAD_FPR0
  197. fst.d $f5, \tmp, THREAD_FPR5 - THREAD_FPR0
  198. fst.d $f6, \tmp, THREAD_FPR6 - THREAD_FPR0
  199. fst.d $f7, \tmp, THREAD_FPR7 - THREAD_FPR0
  200. fst.d $f8, \tmp, THREAD_FPR8 - THREAD_FPR0
  201. fst.d $f9, \tmp, THREAD_FPR9 - THREAD_FPR0
  202. fst.d $f10, \tmp, THREAD_FPR10 - THREAD_FPR0
  203. fst.d $f11, \tmp, THREAD_FPR11 - THREAD_FPR0
  204. fst.d $f12, \tmp, THREAD_FPR12 - THREAD_FPR0
  205. fst.d $f13, \tmp, THREAD_FPR13 - THREAD_FPR0
  206. fst.d $f14, \tmp, THREAD_FPR14 - THREAD_FPR0
  207. fst.d $f15, \tmp, THREAD_FPR15 - THREAD_FPR0
  208. fst.d $f16, \tmp, THREAD_FPR16 - THREAD_FPR0
  209. fst.d $f17, \tmp, THREAD_FPR17 - THREAD_FPR0
  210. fst.d $f18, \tmp, THREAD_FPR18 - THREAD_FPR0
  211. fst.d $f19, \tmp, THREAD_FPR19 - THREAD_FPR0
  212. fst.d $f20, \tmp, THREAD_FPR20 - THREAD_FPR0
  213. fst.d $f21, \tmp, THREAD_FPR21 - THREAD_FPR0
  214. fst.d $f22, \tmp, THREAD_FPR22 - THREAD_FPR0
  215. fst.d $f23, \tmp, THREAD_FPR23 - THREAD_FPR0
  216. fst.d $f24, \tmp, THREAD_FPR24 - THREAD_FPR0
  217. fst.d $f25, \tmp, THREAD_FPR25 - THREAD_FPR0
  218. fst.d $f26, \tmp, THREAD_FPR26 - THREAD_FPR0
  219. fst.d $f27, \tmp, THREAD_FPR27 - THREAD_FPR0
  220. fst.d $f28, \tmp, THREAD_FPR28 - THREAD_FPR0
  221. fst.d $f29, \tmp, THREAD_FPR29 - THREAD_FPR0
  222. fst.d $f30, \tmp, THREAD_FPR30 - THREAD_FPR0
  223. fst.d $f31, \tmp, THREAD_FPR31 - THREAD_FPR0
  224. .endm
  225. .macro fpu_restore_double thread tmp
  226. li.w \tmp, THREAD_FPR0
  227. PTR_ADD \tmp, \tmp, \thread
  228. fld.d $f0, \tmp, THREAD_FPR0 - THREAD_FPR0
  229. fld.d $f1, \tmp, THREAD_FPR1 - THREAD_FPR0
  230. fld.d $f2, \tmp, THREAD_FPR2 - THREAD_FPR0
  231. fld.d $f3, \tmp, THREAD_FPR3 - THREAD_FPR0
  232. fld.d $f4, \tmp, THREAD_FPR4 - THREAD_FPR0
  233. fld.d $f5, \tmp, THREAD_FPR5 - THREAD_FPR0
  234. fld.d $f6, \tmp, THREAD_FPR6 - THREAD_FPR0
  235. fld.d $f7, \tmp, THREAD_FPR7 - THREAD_FPR0
  236. fld.d $f8, \tmp, THREAD_FPR8 - THREAD_FPR0
  237. fld.d $f9, \tmp, THREAD_FPR9 - THREAD_FPR0
  238. fld.d $f10, \tmp, THREAD_FPR10 - THREAD_FPR0
  239. fld.d $f11, \tmp, THREAD_FPR11 - THREAD_FPR0
  240. fld.d $f12, \tmp, THREAD_FPR12 - THREAD_FPR0
  241. fld.d $f13, \tmp, THREAD_FPR13 - THREAD_FPR0
  242. fld.d $f14, \tmp, THREAD_FPR14 - THREAD_FPR0
  243. fld.d $f15, \tmp, THREAD_FPR15 - THREAD_FPR0
  244. fld.d $f16, \tmp, THREAD_FPR16 - THREAD_FPR0
  245. fld.d $f17, \tmp, THREAD_FPR17 - THREAD_FPR0
  246. fld.d $f18, \tmp, THREAD_FPR18 - THREAD_FPR0
  247. fld.d $f19, \tmp, THREAD_FPR19 - THREAD_FPR0
  248. fld.d $f20, \tmp, THREAD_FPR20 - THREAD_FPR0
  249. fld.d $f21, \tmp, THREAD_FPR21 - THREAD_FPR0
  250. fld.d $f22, \tmp, THREAD_FPR22 - THREAD_FPR0
  251. fld.d $f23, \tmp, THREAD_FPR23 - THREAD_FPR0
  252. fld.d $f24, \tmp, THREAD_FPR24 - THREAD_FPR0
  253. fld.d $f25, \tmp, THREAD_FPR25 - THREAD_FPR0
  254. fld.d $f26, \tmp, THREAD_FPR26 - THREAD_FPR0
  255. fld.d $f27, \tmp, THREAD_FPR27 - THREAD_FPR0
  256. fld.d $f28, \tmp, THREAD_FPR28 - THREAD_FPR0
  257. fld.d $f29, \tmp, THREAD_FPR29 - THREAD_FPR0
  258. fld.d $f30, \tmp, THREAD_FPR30 - THREAD_FPR0
  259. fld.d $f31, \tmp, THREAD_FPR31 - THREAD_FPR0
  260. .endm
  261. .macro not dst src
  262. nor \dst, \src, zero
  263. .endm
  264. #endif /* _ASM_ASMMACRO_H */