asmmacro.h 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681
  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 <linux/sizes.h>
  8. #include <asm/asm-offsets.h>
  9. #include <asm/regdef.h>
  10. #include <asm/fpregdef.h>
  11. #include <asm/loongarch.h>
  12. #ifdef CONFIG_64BIT
  13. #define TASK_STRUCT_OFFSET 0
  14. #else
  15. #define TASK_STRUCT_OFFSET 2000
  16. #endif
  17. .macro cpu_save_nonscratch thread
  18. LONG_SPTR s0, \thread, (THREAD_REG23 - TASK_STRUCT_OFFSET)
  19. LONG_SPTR s1, \thread, (THREAD_REG24 - TASK_STRUCT_OFFSET)
  20. LONG_SPTR s2, \thread, (THREAD_REG25 - TASK_STRUCT_OFFSET)
  21. LONG_SPTR s3, \thread, (THREAD_REG26 - TASK_STRUCT_OFFSET)
  22. LONG_SPTR s4, \thread, (THREAD_REG27 - TASK_STRUCT_OFFSET)
  23. LONG_SPTR s5, \thread, (THREAD_REG28 - TASK_STRUCT_OFFSET)
  24. LONG_SPTR s6, \thread, (THREAD_REG29 - TASK_STRUCT_OFFSET)
  25. LONG_SPTR s7, \thread, (THREAD_REG30 - TASK_STRUCT_OFFSET)
  26. LONG_SPTR s8, \thread, (THREAD_REG31 - TASK_STRUCT_OFFSET)
  27. LONG_SPTR ra, \thread, (THREAD_REG01 - TASK_STRUCT_OFFSET)
  28. LONG_SPTR sp, \thread, (THREAD_REG03 - TASK_STRUCT_OFFSET)
  29. LONG_SPTR fp, \thread, (THREAD_REG22 - TASK_STRUCT_OFFSET)
  30. .endm
  31. .macro cpu_restore_nonscratch thread
  32. LONG_LPTR s0, \thread, (THREAD_REG23 - TASK_STRUCT_OFFSET)
  33. LONG_LPTR s1, \thread, (THREAD_REG24 - TASK_STRUCT_OFFSET)
  34. LONG_LPTR s2, \thread, (THREAD_REG25 - TASK_STRUCT_OFFSET)
  35. LONG_LPTR s3, \thread, (THREAD_REG26 - TASK_STRUCT_OFFSET)
  36. LONG_LPTR s4, \thread, (THREAD_REG27 - TASK_STRUCT_OFFSET)
  37. LONG_LPTR s5, \thread, (THREAD_REG28 - TASK_STRUCT_OFFSET)
  38. LONG_LPTR s6, \thread, (THREAD_REG29 - TASK_STRUCT_OFFSET)
  39. LONG_LPTR s7, \thread, (THREAD_REG30 - TASK_STRUCT_OFFSET)
  40. LONG_LPTR s8, \thread, (THREAD_REG31 - TASK_STRUCT_OFFSET)
  41. LONG_LPTR ra, \thread, (THREAD_REG01 - TASK_STRUCT_OFFSET)
  42. LONG_LPTR sp, \thread, (THREAD_REG03 - TASK_STRUCT_OFFSET)
  43. LONG_LPTR fp, \thread, (THREAD_REG22 - TASK_STRUCT_OFFSET)
  44. .endm
  45. .macro fpu_save_csr thread tmp
  46. movfcsr2gr \tmp, fcsr0
  47. #ifdef CONFIG_32BIT
  48. st.w \tmp, \thread, THREAD_FCSR
  49. #else
  50. stptr.w \tmp, \thread, THREAD_FCSR
  51. #endif
  52. #ifdef CONFIG_CPU_HAS_LBT
  53. /* TM bit is always 0 if LBT not supported */
  54. andi \tmp, \tmp, FPU_CSR_TM
  55. beqz \tmp, 1f
  56. /* Save FTOP */
  57. x86mftop \tmp
  58. stptr.w \tmp, \thread, THREAD_FTOP
  59. /* Turn off TM to ensure the order of FPR in memory independent of TM */
  60. x86clrtm
  61. 1:
  62. #endif
  63. .endm
  64. .macro fpu_restore_csr thread tmp0 tmp1
  65. #ifdef CONFIG_32BIT
  66. ld.w \tmp0, \thread, THREAD_FCSR
  67. #else
  68. ldptr.w \tmp0, \thread, THREAD_FCSR
  69. #endif
  70. movgr2fcsr fcsr0, \tmp0
  71. #ifdef CONFIG_CPU_HAS_LBT
  72. /* TM bit is always 0 if LBT not supported */
  73. andi \tmp0, \tmp0, FPU_CSR_TM
  74. beqz \tmp0, 2f
  75. /* Restore FTOP */
  76. ldptr.w \tmp0, \thread, THREAD_FTOP
  77. andi \tmp0, \tmp0, 0x7
  78. la.pcrel \tmp1, 1f
  79. alsl.d \tmp1, \tmp0, \tmp1, 3
  80. jr \tmp1
  81. 1:
  82. x86mttop 0
  83. b 2f
  84. x86mttop 1
  85. b 2f
  86. x86mttop 2
  87. b 2f
  88. x86mttop 3
  89. b 2f
  90. x86mttop 4
  91. b 2f
  92. x86mttop 5
  93. b 2f
  94. x86mttop 6
  95. b 2f
  96. x86mttop 7
  97. 2:
  98. #endif
  99. .endm
  100. #ifdef CONFIG_32BIT
  101. .macro fpu_save_cc thread tmp0 tmp1
  102. movcf2gr \tmp0, $fcc0
  103. move \tmp1, \tmp0
  104. movcf2gr \tmp0, $fcc1
  105. bstrins.w \tmp1, \tmp0, 15, 8
  106. movcf2gr \tmp0, $fcc2
  107. bstrins.w \tmp1, \tmp0, 23, 16
  108. movcf2gr \tmp0, $fcc3
  109. bstrins.w \tmp1, \tmp0, 31, 24
  110. st.w \tmp1, \thread, THREAD_FCC
  111. movcf2gr \tmp0, $fcc4
  112. move \tmp1, \tmp0
  113. movcf2gr \tmp0, $fcc5
  114. bstrins.w \tmp1, \tmp0, 15, 8
  115. movcf2gr \tmp0, $fcc6
  116. bstrins.w \tmp1, \tmp0, 23, 16
  117. movcf2gr \tmp0, $fcc7
  118. bstrins.w \tmp1, \tmp0, 31, 24
  119. st.w \tmp1, \thread, (THREAD_FCC + 4)
  120. .endm
  121. .macro fpu_restore_cc thread tmp0 tmp1
  122. ld.w \tmp0, \thread, THREAD_FCC
  123. bstrpick.w \tmp1, \tmp0, 7, 0
  124. movgr2cf $fcc0, \tmp1
  125. bstrpick.w \tmp1, \tmp0, 15, 8
  126. movgr2cf $fcc1, \tmp1
  127. bstrpick.w \tmp1, \tmp0, 23, 16
  128. movgr2cf $fcc2, \tmp1
  129. bstrpick.w \tmp1, \tmp0, 31, 24
  130. movgr2cf $fcc3, \tmp1
  131. ld.w \tmp0, \thread, (THREAD_FCC + 4)
  132. bstrpick.w \tmp1, \tmp0, 7, 0
  133. movgr2cf $fcc4, \tmp1
  134. bstrpick.w \tmp1, \tmp0, 15, 8
  135. movgr2cf $fcc5, \tmp1
  136. bstrpick.w \tmp1, \tmp0, 23, 16
  137. movgr2cf $fcc6, \tmp1
  138. bstrpick.w \tmp1, \tmp0, 31, 24
  139. movgr2cf $fcc7, \tmp1
  140. .endm
  141. #else
  142. .macro fpu_save_cc thread tmp0 tmp1
  143. movcf2gr \tmp0, $fcc0
  144. move \tmp1, \tmp0
  145. movcf2gr \tmp0, $fcc1
  146. bstrins.d \tmp1, \tmp0, 15, 8
  147. movcf2gr \tmp0, $fcc2
  148. bstrins.d \tmp1, \tmp0, 23, 16
  149. movcf2gr \tmp0, $fcc3
  150. bstrins.d \tmp1, \tmp0, 31, 24
  151. movcf2gr \tmp0, $fcc4
  152. bstrins.d \tmp1, \tmp0, 39, 32
  153. movcf2gr \tmp0, $fcc5
  154. bstrins.d \tmp1, \tmp0, 47, 40
  155. movcf2gr \tmp0, $fcc6
  156. bstrins.d \tmp1, \tmp0, 55, 48
  157. movcf2gr \tmp0, $fcc7
  158. bstrins.d \tmp1, \tmp0, 63, 56
  159. stptr.d \tmp1, \thread, THREAD_FCC
  160. .endm
  161. .macro fpu_restore_cc thread tmp0 tmp1
  162. ldptr.d \tmp0, \thread, THREAD_FCC
  163. bstrpick.d \tmp1, \tmp0, 7, 0
  164. movgr2cf $fcc0, \tmp1
  165. bstrpick.d \tmp1, \tmp0, 15, 8
  166. movgr2cf $fcc1, \tmp1
  167. bstrpick.d \tmp1, \tmp0, 23, 16
  168. movgr2cf $fcc2, \tmp1
  169. bstrpick.d \tmp1, \tmp0, 31, 24
  170. movgr2cf $fcc3, \tmp1
  171. bstrpick.d \tmp1, \tmp0, 39, 32
  172. movgr2cf $fcc4, \tmp1
  173. bstrpick.d \tmp1, \tmp0, 47, 40
  174. movgr2cf $fcc5, \tmp1
  175. bstrpick.d \tmp1, \tmp0, 55, 48
  176. movgr2cf $fcc6, \tmp1
  177. bstrpick.d \tmp1, \tmp0, 63, 56
  178. movgr2cf $fcc7, \tmp1
  179. .endm
  180. #endif
  181. .macro fpu_save_double thread tmp
  182. li.w \tmp, THREAD_FPR0
  183. PTR_ADD \tmp, \tmp, \thread
  184. fst.d $f0, \tmp, THREAD_FPR0 - THREAD_FPR0
  185. fst.d $f1, \tmp, THREAD_FPR1 - THREAD_FPR0
  186. fst.d $f2, \tmp, THREAD_FPR2 - THREAD_FPR0
  187. fst.d $f3, \tmp, THREAD_FPR3 - THREAD_FPR0
  188. fst.d $f4, \tmp, THREAD_FPR4 - THREAD_FPR0
  189. fst.d $f5, \tmp, THREAD_FPR5 - THREAD_FPR0
  190. fst.d $f6, \tmp, THREAD_FPR6 - THREAD_FPR0
  191. fst.d $f7, \tmp, THREAD_FPR7 - THREAD_FPR0
  192. fst.d $f8, \tmp, THREAD_FPR8 - THREAD_FPR0
  193. fst.d $f9, \tmp, THREAD_FPR9 - THREAD_FPR0
  194. fst.d $f10, \tmp, THREAD_FPR10 - THREAD_FPR0
  195. fst.d $f11, \tmp, THREAD_FPR11 - THREAD_FPR0
  196. fst.d $f12, \tmp, THREAD_FPR12 - THREAD_FPR0
  197. fst.d $f13, \tmp, THREAD_FPR13 - THREAD_FPR0
  198. fst.d $f14, \tmp, THREAD_FPR14 - THREAD_FPR0
  199. fst.d $f15, \tmp, THREAD_FPR15 - THREAD_FPR0
  200. fst.d $f16, \tmp, THREAD_FPR16 - THREAD_FPR0
  201. fst.d $f17, \tmp, THREAD_FPR17 - THREAD_FPR0
  202. fst.d $f18, \tmp, THREAD_FPR18 - THREAD_FPR0
  203. fst.d $f19, \tmp, THREAD_FPR19 - THREAD_FPR0
  204. fst.d $f20, \tmp, THREAD_FPR20 - THREAD_FPR0
  205. fst.d $f21, \tmp, THREAD_FPR21 - THREAD_FPR0
  206. fst.d $f22, \tmp, THREAD_FPR22 - THREAD_FPR0
  207. fst.d $f23, \tmp, THREAD_FPR23 - THREAD_FPR0
  208. fst.d $f24, \tmp, THREAD_FPR24 - THREAD_FPR0
  209. fst.d $f25, \tmp, THREAD_FPR25 - THREAD_FPR0
  210. fst.d $f26, \tmp, THREAD_FPR26 - THREAD_FPR0
  211. fst.d $f27, \tmp, THREAD_FPR27 - THREAD_FPR0
  212. fst.d $f28, \tmp, THREAD_FPR28 - THREAD_FPR0
  213. fst.d $f29, \tmp, THREAD_FPR29 - THREAD_FPR0
  214. fst.d $f30, \tmp, THREAD_FPR30 - THREAD_FPR0
  215. fst.d $f31, \tmp, THREAD_FPR31 - THREAD_FPR0
  216. .endm
  217. .macro fpu_restore_double thread tmp
  218. li.w \tmp, THREAD_FPR0
  219. PTR_ADD \tmp, \tmp, \thread
  220. fld.d $f0, \tmp, THREAD_FPR0 - THREAD_FPR0
  221. fld.d $f1, \tmp, THREAD_FPR1 - THREAD_FPR0
  222. fld.d $f2, \tmp, THREAD_FPR2 - THREAD_FPR0
  223. fld.d $f3, \tmp, THREAD_FPR3 - THREAD_FPR0
  224. fld.d $f4, \tmp, THREAD_FPR4 - THREAD_FPR0
  225. fld.d $f5, \tmp, THREAD_FPR5 - THREAD_FPR0
  226. fld.d $f6, \tmp, THREAD_FPR6 - THREAD_FPR0
  227. fld.d $f7, \tmp, THREAD_FPR7 - THREAD_FPR0
  228. fld.d $f8, \tmp, THREAD_FPR8 - THREAD_FPR0
  229. fld.d $f9, \tmp, THREAD_FPR9 - THREAD_FPR0
  230. fld.d $f10, \tmp, THREAD_FPR10 - THREAD_FPR0
  231. fld.d $f11, \tmp, THREAD_FPR11 - THREAD_FPR0
  232. fld.d $f12, \tmp, THREAD_FPR12 - THREAD_FPR0
  233. fld.d $f13, \tmp, THREAD_FPR13 - THREAD_FPR0
  234. fld.d $f14, \tmp, THREAD_FPR14 - THREAD_FPR0
  235. fld.d $f15, \tmp, THREAD_FPR15 - THREAD_FPR0
  236. fld.d $f16, \tmp, THREAD_FPR16 - THREAD_FPR0
  237. fld.d $f17, \tmp, THREAD_FPR17 - THREAD_FPR0
  238. fld.d $f18, \tmp, THREAD_FPR18 - THREAD_FPR0
  239. fld.d $f19, \tmp, THREAD_FPR19 - THREAD_FPR0
  240. fld.d $f20, \tmp, THREAD_FPR20 - THREAD_FPR0
  241. fld.d $f21, \tmp, THREAD_FPR21 - THREAD_FPR0
  242. fld.d $f22, \tmp, THREAD_FPR22 - THREAD_FPR0
  243. fld.d $f23, \tmp, THREAD_FPR23 - THREAD_FPR0
  244. fld.d $f24, \tmp, THREAD_FPR24 - THREAD_FPR0
  245. fld.d $f25, \tmp, THREAD_FPR25 - THREAD_FPR0
  246. fld.d $f26, \tmp, THREAD_FPR26 - THREAD_FPR0
  247. fld.d $f27, \tmp, THREAD_FPR27 - THREAD_FPR0
  248. fld.d $f28, \tmp, THREAD_FPR28 - THREAD_FPR0
  249. fld.d $f29, \tmp, THREAD_FPR29 - THREAD_FPR0
  250. fld.d $f30, \tmp, THREAD_FPR30 - THREAD_FPR0
  251. fld.d $f31, \tmp, THREAD_FPR31 - THREAD_FPR0
  252. .endm
  253. .macro lsx_save_data thread tmp
  254. li.w \tmp, THREAD_FPR0
  255. PTR_ADD \tmp, \thread, \tmp
  256. vst $vr0, \tmp, THREAD_FPR0 - THREAD_FPR0
  257. vst $vr1, \tmp, THREAD_FPR1 - THREAD_FPR0
  258. vst $vr2, \tmp, THREAD_FPR2 - THREAD_FPR0
  259. vst $vr3, \tmp, THREAD_FPR3 - THREAD_FPR0
  260. vst $vr4, \tmp, THREAD_FPR4 - THREAD_FPR0
  261. vst $vr5, \tmp, THREAD_FPR5 - THREAD_FPR0
  262. vst $vr6, \tmp, THREAD_FPR6 - THREAD_FPR0
  263. vst $vr7, \tmp, THREAD_FPR7 - THREAD_FPR0
  264. vst $vr8, \tmp, THREAD_FPR8 - THREAD_FPR0
  265. vst $vr9, \tmp, THREAD_FPR9 - THREAD_FPR0
  266. vst $vr10, \tmp, THREAD_FPR10 - THREAD_FPR0
  267. vst $vr11, \tmp, THREAD_FPR11 - THREAD_FPR0
  268. vst $vr12, \tmp, THREAD_FPR12 - THREAD_FPR0
  269. vst $vr13, \tmp, THREAD_FPR13 - THREAD_FPR0
  270. vst $vr14, \tmp, THREAD_FPR14 - THREAD_FPR0
  271. vst $vr15, \tmp, THREAD_FPR15 - THREAD_FPR0
  272. vst $vr16, \tmp, THREAD_FPR16 - THREAD_FPR0
  273. vst $vr17, \tmp, THREAD_FPR17 - THREAD_FPR0
  274. vst $vr18, \tmp, THREAD_FPR18 - THREAD_FPR0
  275. vst $vr19, \tmp, THREAD_FPR19 - THREAD_FPR0
  276. vst $vr20, \tmp, THREAD_FPR20 - THREAD_FPR0
  277. vst $vr21, \tmp, THREAD_FPR21 - THREAD_FPR0
  278. vst $vr22, \tmp, THREAD_FPR22 - THREAD_FPR0
  279. vst $vr23, \tmp, THREAD_FPR23 - THREAD_FPR0
  280. vst $vr24, \tmp, THREAD_FPR24 - THREAD_FPR0
  281. vst $vr25, \tmp, THREAD_FPR25 - THREAD_FPR0
  282. vst $vr26, \tmp, THREAD_FPR26 - THREAD_FPR0
  283. vst $vr27, \tmp, THREAD_FPR27 - THREAD_FPR0
  284. vst $vr28, \tmp, THREAD_FPR28 - THREAD_FPR0
  285. vst $vr29, \tmp, THREAD_FPR29 - THREAD_FPR0
  286. vst $vr30, \tmp, THREAD_FPR30 - THREAD_FPR0
  287. vst $vr31, \tmp, THREAD_FPR31 - THREAD_FPR0
  288. .endm
  289. .macro lsx_restore_data thread tmp
  290. li.w \tmp, THREAD_FPR0
  291. PTR_ADD \tmp, \thread, \tmp
  292. vld $vr0, \tmp, THREAD_FPR0 - THREAD_FPR0
  293. vld $vr1, \tmp, THREAD_FPR1 - THREAD_FPR0
  294. vld $vr2, \tmp, THREAD_FPR2 - THREAD_FPR0
  295. vld $vr3, \tmp, THREAD_FPR3 - THREAD_FPR0
  296. vld $vr4, \tmp, THREAD_FPR4 - THREAD_FPR0
  297. vld $vr5, \tmp, THREAD_FPR5 - THREAD_FPR0
  298. vld $vr6, \tmp, THREAD_FPR6 - THREAD_FPR0
  299. vld $vr7, \tmp, THREAD_FPR7 - THREAD_FPR0
  300. vld $vr8, \tmp, THREAD_FPR8 - THREAD_FPR0
  301. vld $vr9, \tmp, THREAD_FPR9 - THREAD_FPR0
  302. vld $vr10, \tmp, THREAD_FPR10 - THREAD_FPR0
  303. vld $vr11, \tmp, THREAD_FPR11 - THREAD_FPR0
  304. vld $vr12, \tmp, THREAD_FPR12 - THREAD_FPR0
  305. vld $vr13, \tmp, THREAD_FPR13 - THREAD_FPR0
  306. vld $vr14, \tmp, THREAD_FPR14 - THREAD_FPR0
  307. vld $vr15, \tmp, THREAD_FPR15 - THREAD_FPR0
  308. vld $vr16, \tmp, THREAD_FPR16 - THREAD_FPR0
  309. vld $vr17, \tmp, THREAD_FPR17 - THREAD_FPR0
  310. vld $vr18, \tmp, THREAD_FPR18 - THREAD_FPR0
  311. vld $vr19, \tmp, THREAD_FPR19 - THREAD_FPR0
  312. vld $vr20, \tmp, THREAD_FPR20 - THREAD_FPR0
  313. vld $vr21, \tmp, THREAD_FPR21 - THREAD_FPR0
  314. vld $vr22, \tmp, THREAD_FPR22 - THREAD_FPR0
  315. vld $vr23, \tmp, THREAD_FPR23 - THREAD_FPR0
  316. vld $vr24, \tmp, THREAD_FPR24 - THREAD_FPR0
  317. vld $vr25, \tmp, THREAD_FPR25 - THREAD_FPR0
  318. vld $vr26, \tmp, THREAD_FPR26 - THREAD_FPR0
  319. vld $vr27, \tmp, THREAD_FPR27 - THREAD_FPR0
  320. vld $vr28, \tmp, THREAD_FPR28 - THREAD_FPR0
  321. vld $vr29, \tmp, THREAD_FPR29 - THREAD_FPR0
  322. vld $vr30, \tmp, THREAD_FPR30 - THREAD_FPR0
  323. vld $vr31, \tmp, THREAD_FPR31 - THREAD_FPR0
  324. .endm
  325. .macro lsx_save_all thread tmp0 tmp1
  326. fpu_save_cc \thread, \tmp0, \tmp1
  327. fpu_save_csr \thread, \tmp0
  328. lsx_save_data \thread, \tmp0
  329. .endm
  330. .macro lsx_restore_all thread tmp0 tmp1
  331. lsx_restore_data \thread, \tmp0
  332. fpu_restore_cc \thread, \tmp0, \tmp1
  333. fpu_restore_csr \thread, \tmp0, \tmp1
  334. .endm
  335. .macro lsx_save_upper vd base tmp off
  336. vpickve2gr.d \tmp, \vd, 1
  337. st.d \tmp, \base, (\off+8)
  338. .endm
  339. .macro lsx_save_all_upper thread base tmp
  340. li.w \tmp, THREAD_FPR0
  341. PTR_ADD \base, \thread, \tmp
  342. lsx_save_upper $vr0, \base, \tmp, (THREAD_FPR0-THREAD_FPR0)
  343. lsx_save_upper $vr1, \base, \tmp, (THREAD_FPR1-THREAD_FPR0)
  344. lsx_save_upper $vr2, \base, \tmp, (THREAD_FPR2-THREAD_FPR0)
  345. lsx_save_upper $vr3, \base, \tmp, (THREAD_FPR3-THREAD_FPR0)
  346. lsx_save_upper $vr4, \base, \tmp, (THREAD_FPR4-THREAD_FPR0)
  347. lsx_save_upper $vr5, \base, \tmp, (THREAD_FPR5-THREAD_FPR0)
  348. lsx_save_upper $vr6, \base, \tmp, (THREAD_FPR6-THREAD_FPR0)
  349. lsx_save_upper $vr7, \base, \tmp, (THREAD_FPR7-THREAD_FPR0)
  350. lsx_save_upper $vr8, \base, \tmp, (THREAD_FPR8-THREAD_FPR0)
  351. lsx_save_upper $vr9, \base, \tmp, (THREAD_FPR9-THREAD_FPR0)
  352. lsx_save_upper $vr10, \base, \tmp, (THREAD_FPR10-THREAD_FPR0)
  353. lsx_save_upper $vr11, \base, \tmp, (THREAD_FPR11-THREAD_FPR0)
  354. lsx_save_upper $vr12, \base, \tmp, (THREAD_FPR12-THREAD_FPR0)
  355. lsx_save_upper $vr13, \base, \tmp, (THREAD_FPR13-THREAD_FPR0)
  356. lsx_save_upper $vr14, \base, \tmp, (THREAD_FPR14-THREAD_FPR0)
  357. lsx_save_upper $vr15, \base, \tmp, (THREAD_FPR15-THREAD_FPR0)
  358. lsx_save_upper $vr16, \base, \tmp, (THREAD_FPR16-THREAD_FPR0)
  359. lsx_save_upper $vr17, \base, \tmp, (THREAD_FPR17-THREAD_FPR0)
  360. lsx_save_upper $vr18, \base, \tmp, (THREAD_FPR18-THREAD_FPR0)
  361. lsx_save_upper $vr19, \base, \tmp, (THREAD_FPR19-THREAD_FPR0)
  362. lsx_save_upper $vr20, \base, \tmp, (THREAD_FPR20-THREAD_FPR0)
  363. lsx_save_upper $vr21, \base, \tmp, (THREAD_FPR21-THREAD_FPR0)
  364. lsx_save_upper $vr22, \base, \tmp, (THREAD_FPR22-THREAD_FPR0)
  365. lsx_save_upper $vr23, \base, \tmp, (THREAD_FPR23-THREAD_FPR0)
  366. lsx_save_upper $vr24, \base, \tmp, (THREAD_FPR24-THREAD_FPR0)
  367. lsx_save_upper $vr25, \base, \tmp, (THREAD_FPR25-THREAD_FPR0)
  368. lsx_save_upper $vr26, \base, \tmp, (THREAD_FPR26-THREAD_FPR0)
  369. lsx_save_upper $vr27, \base, \tmp, (THREAD_FPR27-THREAD_FPR0)
  370. lsx_save_upper $vr28, \base, \tmp, (THREAD_FPR28-THREAD_FPR0)
  371. lsx_save_upper $vr29, \base, \tmp, (THREAD_FPR29-THREAD_FPR0)
  372. lsx_save_upper $vr30, \base, \tmp, (THREAD_FPR30-THREAD_FPR0)
  373. lsx_save_upper $vr31, \base, \tmp, (THREAD_FPR31-THREAD_FPR0)
  374. .endm
  375. .macro lsx_restore_upper vd base tmp off
  376. ld.d \tmp, \base, (\off+8)
  377. vinsgr2vr.d \vd, \tmp, 1
  378. .endm
  379. .macro lsx_restore_all_upper thread base tmp
  380. li.w \tmp, THREAD_FPR0
  381. PTR_ADD \base, \thread, \tmp
  382. lsx_restore_upper $vr0, \base, \tmp, (THREAD_FPR0-THREAD_FPR0)
  383. lsx_restore_upper $vr1, \base, \tmp, (THREAD_FPR1-THREAD_FPR0)
  384. lsx_restore_upper $vr2, \base, \tmp, (THREAD_FPR2-THREAD_FPR0)
  385. lsx_restore_upper $vr3, \base, \tmp, (THREAD_FPR3-THREAD_FPR0)
  386. lsx_restore_upper $vr4, \base, \tmp, (THREAD_FPR4-THREAD_FPR0)
  387. lsx_restore_upper $vr5, \base, \tmp, (THREAD_FPR5-THREAD_FPR0)
  388. lsx_restore_upper $vr6, \base, \tmp, (THREAD_FPR6-THREAD_FPR0)
  389. lsx_restore_upper $vr7, \base, \tmp, (THREAD_FPR7-THREAD_FPR0)
  390. lsx_restore_upper $vr8, \base, \tmp, (THREAD_FPR8-THREAD_FPR0)
  391. lsx_restore_upper $vr9, \base, \tmp, (THREAD_FPR9-THREAD_FPR0)
  392. lsx_restore_upper $vr10, \base, \tmp, (THREAD_FPR10-THREAD_FPR0)
  393. lsx_restore_upper $vr11, \base, \tmp, (THREAD_FPR11-THREAD_FPR0)
  394. lsx_restore_upper $vr12, \base, \tmp, (THREAD_FPR12-THREAD_FPR0)
  395. lsx_restore_upper $vr13, \base, \tmp, (THREAD_FPR13-THREAD_FPR0)
  396. lsx_restore_upper $vr14, \base, \tmp, (THREAD_FPR14-THREAD_FPR0)
  397. lsx_restore_upper $vr15, \base, \tmp, (THREAD_FPR15-THREAD_FPR0)
  398. lsx_restore_upper $vr16, \base, \tmp, (THREAD_FPR16-THREAD_FPR0)
  399. lsx_restore_upper $vr17, \base, \tmp, (THREAD_FPR17-THREAD_FPR0)
  400. lsx_restore_upper $vr18, \base, \tmp, (THREAD_FPR18-THREAD_FPR0)
  401. lsx_restore_upper $vr19, \base, \tmp, (THREAD_FPR19-THREAD_FPR0)
  402. lsx_restore_upper $vr20, \base, \tmp, (THREAD_FPR20-THREAD_FPR0)
  403. lsx_restore_upper $vr21, \base, \tmp, (THREAD_FPR21-THREAD_FPR0)
  404. lsx_restore_upper $vr22, \base, \tmp, (THREAD_FPR22-THREAD_FPR0)
  405. lsx_restore_upper $vr23, \base, \tmp, (THREAD_FPR23-THREAD_FPR0)
  406. lsx_restore_upper $vr24, \base, \tmp, (THREAD_FPR24-THREAD_FPR0)
  407. lsx_restore_upper $vr25, \base, \tmp, (THREAD_FPR25-THREAD_FPR0)
  408. lsx_restore_upper $vr26, \base, \tmp, (THREAD_FPR26-THREAD_FPR0)
  409. lsx_restore_upper $vr27, \base, \tmp, (THREAD_FPR27-THREAD_FPR0)
  410. lsx_restore_upper $vr28, \base, \tmp, (THREAD_FPR28-THREAD_FPR0)
  411. lsx_restore_upper $vr29, \base, \tmp, (THREAD_FPR29-THREAD_FPR0)
  412. lsx_restore_upper $vr30, \base, \tmp, (THREAD_FPR30-THREAD_FPR0)
  413. lsx_restore_upper $vr31, \base, \tmp, (THREAD_FPR31-THREAD_FPR0)
  414. .endm
  415. .macro lsx_init_upper vd tmp
  416. vinsgr2vr.d \vd, \tmp, 1
  417. .endm
  418. .macro lsx_init_all_upper tmp
  419. not \tmp, zero
  420. lsx_init_upper $vr0 \tmp
  421. lsx_init_upper $vr1 \tmp
  422. lsx_init_upper $vr2 \tmp
  423. lsx_init_upper $vr3 \tmp
  424. lsx_init_upper $vr4 \tmp
  425. lsx_init_upper $vr5 \tmp
  426. lsx_init_upper $vr6 \tmp
  427. lsx_init_upper $vr7 \tmp
  428. lsx_init_upper $vr8 \tmp
  429. lsx_init_upper $vr9 \tmp
  430. lsx_init_upper $vr10 \tmp
  431. lsx_init_upper $vr11 \tmp
  432. lsx_init_upper $vr12 \tmp
  433. lsx_init_upper $vr13 \tmp
  434. lsx_init_upper $vr14 \tmp
  435. lsx_init_upper $vr15 \tmp
  436. lsx_init_upper $vr16 \tmp
  437. lsx_init_upper $vr17 \tmp
  438. lsx_init_upper $vr18 \tmp
  439. lsx_init_upper $vr19 \tmp
  440. lsx_init_upper $vr20 \tmp
  441. lsx_init_upper $vr21 \tmp
  442. lsx_init_upper $vr22 \tmp
  443. lsx_init_upper $vr23 \tmp
  444. lsx_init_upper $vr24 \tmp
  445. lsx_init_upper $vr25 \tmp
  446. lsx_init_upper $vr26 \tmp
  447. lsx_init_upper $vr27 \tmp
  448. lsx_init_upper $vr28 \tmp
  449. lsx_init_upper $vr29 \tmp
  450. lsx_init_upper $vr30 \tmp
  451. lsx_init_upper $vr31 \tmp
  452. .endm
  453. .macro lasx_save_data thread tmp
  454. li.w \tmp, THREAD_FPR0
  455. PTR_ADD \tmp, \thread, \tmp
  456. xvst $xr0, \tmp, THREAD_FPR0 - THREAD_FPR0
  457. xvst $xr1, \tmp, THREAD_FPR1 - THREAD_FPR0
  458. xvst $xr2, \tmp, THREAD_FPR2 - THREAD_FPR0
  459. xvst $xr3, \tmp, THREAD_FPR3 - THREAD_FPR0
  460. xvst $xr4, \tmp, THREAD_FPR4 - THREAD_FPR0
  461. xvst $xr5, \tmp, THREAD_FPR5 - THREAD_FPR0
  462. xvst $xr6, \tmp, THREAD_FPR6 - THREAD_FPR0
  463. xvst $xr7, \tmp, THREAD_FPR7 - THREAD_FPR0
  464. xvst $xr8, \tmp, THREAD_FPR8 - THREAD_FPR0
  465. xvst $xr9, \tmp, THREAD_FPR9 - THREAD_FPR0
  466. xvst $xr10, \tmp, THREAD_FPR10 - THREAD_FPR0
  467. xvst $xr11, \tmp, THREAD_FPR11 - THREAD_FPR0
  468. xvst $xr12, \tmp, THREAD_FPR12 - THREAD_FPR0
  469. xvst $xr13, \tmp, THREAD_FPR13 - THREAD_FPR0
  470. xvst $xr14, \tmp, THREAD_FPR14 - THREAD_FPR0
  471. xvst $xr15, \tmp, THREAD_FPR15 - THREAD_FPR0
  472. xvst $xr16, \tmp, THREAD_FPR16 - THREAD_FPR0
  473. xvst $xr17, \tmp, THREAD_FPR17 - THREAD_FPR0
  474. xvst $xr18, \tmp, THREAD_FPR18 - THREAD_FPR0
  475. xvst $xr19, \tmp, THREAD_FPR19 - THREAD_FPR0
  476. xvst $xr20, \tmp, THREAD_FPR20 - THREAD_FPR0
  477. xvst $xr21, \tmp, THREAD_FPR21 - THREAD_FPR0
  478. xvst $xr22, \tmp, THREAD_FPR22 - THREAD_FPR0
  479. xvst $xr23, \tmp, THREAD_FPR23 - THREAD_FPR0
  480. xvst $xr24, \tmp, THREAD_FPR24 - THREAD_FPR0
  481. xvst $xr25, \tmp, THREAD_FPR25 - THREAD_FPR0
  482. xvst $xr26, \tmp, THREAD_FPR26 - THREAD_FPR0
  483. xvst $xr27, \tmp, THREAD_FPR27 - THREAD_FPR0
  484. xvst $xr28, \tmp, THREAD_FPR28 - THREAD_FPR0
  485. xvst $xr29, \tmp, THREAD_FPR29 - THREAD_FPR0
  486. xvst $xr30, \tmp, THREAD_FPR30 - THREAD_FPR0
  487. xvst $xr31, \tmp, THREAD_FPR31 - THREAD_FPR0
  488. .endm
  489. .macro lasx_restore_data thread tmp
  490. li.w \tmp, THREAD_FPR0
  491. PTR_ADD \tmp, \thread, \tmp
  492. xvld $xr0, \tmp, THREAD_FPR0 - THREAD_FPR0
  493. xvld $xr1, \tmp, THREAD_FPR1 - THREAD_FPR0
  494. xvld $xr2, \tmp, THREAD_FPR2 - THREAD_FPR0
  495. xvld $xr3, \tmp, THREAD_FPR3 - THREAD_FPR0
  496. xvld $xr4, \tmp, THREAD_FPR4 - THREAD_FPR0
  497. xvld $xr5, \tmp, THREAD_FPR5 - THREAD_FPR0
  498. xvld $xr6, \tmp, THREAD_FPR6 - THREAD_FPR0
  499. xvld $xr7, \tmp, THREAD_FPR7 - THREAD_FPR0
  500. xvld $xr8, \tmp, THREAD_FPR8 - THREAD_FPR0
  501. xvld $xr9, \tmp, THREAD_FPR9 - THREAD_FPR0
  502. xvld $xr10, \tmp, THREAD_FPR10 - THREAD_FPR0
  503. xvld $xr11, \tmp, THREAD_FPR11 - THREAD_FPR0
  504. xvld $xr12, \tmp, THREAD_FPR12 - THREAD_FPR0
  505. xvld $xr13, \tmp, THREAD_FPR13 - THREAD_FPR0
  506. xvld $xr14, \tmp, THREAD_FPR14 - THREAD_FPR0
  507. xvld $xr15, \tmp, THREAD_FPR15 - THREAD_FPR0
  508. xvld $xr16, \tmp, THREAD_FPR16 - THREAD_FPR0
  509. xvld $xr17, \tmp, THREAD_FPR17 - THREAD_FPR0
  510. xvld $xr18, \tmp, THREAD_FPR18 - THREAD_FPR0
  511. xvld $xr19, \tmp, THREAD_FPR19 - THREAD_FPR0
  512. xvld $xr20, \tmp, THREAD_FPR20 - THREAD_FPR0
  513. xvld $xr21, \tmp, THREAD_FPR21 - THREAD_FPR0
  514. xvld $xr22, \tmp, THREAD_FPR22 - THREAD_FPR0
  515. xvld $xr23, \tmp, THREAD_FPR23 - THREAD_FPR0
  516. xvld $xr24, \tmp, THREAD_FPR24 - THREAD_FPR0
  517. xvld $xr25, \tmp, THREAD_FPR25 - THREAD_FPR0
  518. xvld $xr26, \tmp, THREAD_FPR26 - THREAD_FPR0
  519. xvld $xr27, \tmp, THREAD_FPR27 - THREAD_FPR0
  520. xvld $xr28, \tmp, THREAD_FPR28 - THREAD_FPR0
  521. xvld $xr29, \tmp, THREAD_FPR29 - THREAD_FPR0
  522. xvld $xr30, \tmp, THREAD_FPR30 - THREAD_FPR0
  523. xvld $xr31, \tmp, THREAD_FPR31 - THREAD_FPR0
  524. .endm
  525. .macro lasx_save_all thread tmp0 tmp1
  526. fpu_save_cc \thread, \tmp0, \tmp1
  527. fpu_save_csr \thread, \tmp0
  528. lasx_save_data \thread, \tmp0
  529. .endm
  530. .macro lasx_restore_all thread tmp0 tmp1
  531. lasx_restore_data \thread, \tmp0
  532. fpu_restore_cc \thread, \tmp0, \tmp1
  533. fpu_restore_csr \thread, \tmp0, \tmp1
  534. .endm
  535. .macro lasx_save_upper xd base tmp off
  536. /* Nothing */
  537. .endm
  538. .macro lasx_save_all_upper thread base tmp
  539. /* Nothing */
  540. .endm
  541. .macro lasx_restore_upper xd base tmp0 tmp1 off
  542. vld \tmp0, \base, (\off+16)
  543. xvpermi.q \xd, \tmp1, 0x2
  544. .endm
  545. .macro lasx_restore_all_upper thread base tmp
  546. li.w \tmp, THREAD_FPR0
  547. PTR_ADD \base, \thread, \tmp
  548. /* Save $vr31 ($xr31 lower bits) with xvpickve2gr */
  549. xvpickve2gr.d $r17, $xr31, 0
  550. xvpickve2gr.d $r18, $xr31, 1
  551. lasx_restore_upper $xr0, \base, $vr31, $xr31, (THREAD_FPR0-THREAD_FPR0)
  552. lasx_restore_upper $xr1, \base, $vr31, $xr31, (THREAD_FPR1-THREAD_FPR0)
  553. lasx_restore_upper $xr2, \base, $vr31, $xr31, (THREAD_FPR2-THREAD_FPR0)
  554. lasx_restore_upper $xr3, \base, $vr31, $xr31, (THREAD_FPR3-THREAD_FPR0)
  555. lasx_restore_upper $xr4, \base, $vr31, $xr31, (THREAD_FPR4-THREAD_FPR0)
  556. lasx_restore_upper $xr5, \base, $vr31, $xr31, (THREAD_FPR5-THREAD_FPR0)
  557. lasx_restore_upper $xr6, \base, $vr31, $xr31, (THREAD_FPR6-THREAD_FPR0)
  558. lasx_restore_upper $xr7, \base, $vr31, $xr31, (THREAD_FPR7-THREAD_FPR0)
  559. lasx_restore_upper $xr8, \base, $vr31, $xr31, (THREAD_FPR8-THREAD_FPR0)
  560. lasx_restore_upper $xr9, \base, $vr31, $xr31, (THREAD_FPR9-THREAD_FPR0)
  561. lasx_restore_upper $xr10, \base, $vr31, $xr31, (THREAD_FPR10-THREAD_FPR0)
  562. lasx_restore_upper $xr11, \base, $vr31, $xr31, (THREAD_FPR11-THREAD_FPR0)
  563. lasx_restore_upper $xr12, \base, $vr31, $xr31, (THREAD_FPR12-THREAD_FPR0)
  564. lasx_restore_upper $xr13, \base, $vr31, $xr31, (THREAD_FPR13-THREAD_FPR0)
  565. lasx_restore_upper $xr14, \base, $vr31, $xr31, (THREAD_FPR14-THREAD_FPR0)
  566. lasx_restore_upper $xr15, \base, $vr31, $xr31, (THREAD_FPR15-THREAD_FPR0)
  567. lasx_restore_upper $xr16, \base, $vr31, $xr31, (THREAD_FPR16-THREAD_FPR0)
  568. lasx_restore_upper $xr17, \base, $vr31, $xr31, (THREAD_FPR17-THREAD_FPR0)
  569. lasx_restore_upper $xr18, \base, $vr31, $xr31, (THREAD_FPR18-THREAD_FPR0)
  570. lasx_restore_upper $xr19, \base, $vr31, $xr31, (THREAD_FPR19-THREAD_FPR0)
  571. lasx_restore_upper $xr20, \base, $vr31, $xr31, (THREAD_FPR20-THREAD_FPR0)
  572. lasx_restore_upper $xr21, \base, $vr31, $xr31, (THREAD_FPR21-THREAD_FPR0)
  573. lasx_restore_upper $xr22, \base, $vr31, $xr31, (THREAD_FPR22-THREAD_FPR0)
  574. lasx_restore_upper $xr23, \base, $vr31, $xr31, (THREAD_FPR23-THREAD_FPR0)
  575. lasx_restore_upper $xr24, \base, $vr31, $xr31, (THREAD_FPR24-THREAD_FPR0)
  576. lasx_restore_upper $xr25, \base, $vr31, $xr31, (THREAD_FPR25-THREAD_FPR0)
  577. lasx_restore_upper $xr26, \base, $vr31, $xr31, (THREAD_FPR26-THREAD_FPR0)
  578. lasx_restore_upper $xr27, \base, $vr31, $xr31, (THREAD_FPR27-THREAD_FPR0)
  579. lasx_restore_upper $xr28, \base, $vr31, $xr31, (THREAD_FPR28-THREAD_FPR0)
  580. lasx_restore_upper $xr29, \base, $vr31, $xr31, (THREAD_FPR29-THREAD_FPR0)
  581. lasx_restore_upper $xr30, \base, $vr31, $xr31, (THREAD_FPR30-THREAD_FPR0)
  582. lasx_restore_upper $xr31, \base, $vr31, $xr31, (THREAD_FPR31-THREAD_FPR0)
  583. /* Restore $vr31 ($xr31 lower bits) with xvinsgr2vr */
  584. xvinsgr2vr.d $xr31, $r17, 0
  585. xvinsgr2vr.d $xr31, $r18, 1
  586. .endm
  587. .macro lasx_init_upper xd tmp
  588. xvinsgr2vr.d \xd, \tmp, 2
  589. xvinsgr2vr.d \xd, \tmp, 3
  590. .endm
  591. .macro lasx_init_all_upper tmp
  592. not \tmp, zero
  593. lasx_init_upper $xr0 \tmp
  594. lasx_init_upper $xr1 \tmp
  595. lasx_init_upper $xr2 \tmp
  596. lasx_init_upper $xr3 \tmp
  597. lasx_init_upper $xr4 \tmp
  598. lasx_init_upper $xr5 \tmp
  599. lasx_init_upper $xr6 \tmp
  600. lasx_init_upper $xr7 \tmp
  601. lasx_init_upper $xr8 \tmp
  602. lasx_init_upper $xr9 \tmp
  603. lasx_init_upper $xr10 \tmp
  604. lasx_init_upper $xr11 \tmp
  605. lasx_init_upper $xr12 \tmp
  606. lasx_init_upper $xr13 \tmp
  607. lasx_init_upper $xr14 \tmp
  608. lasx_init_upper $xr15 \tmp
  609. lasx_init_upper $xr16 \tmp
  610. lasx_init_upper $xr17 \tmp
  611. lasx_init_upper $xr18 \tmp
  612. lasx_init_upper $xr19 \tmp
  613. lasx_init_upper $xr20 \tmp
  614. lasx_init_upper $xr21 \tmp
  615. lasx_init_upper $xr22 \tmp
  616. lasx_init_upper $xr23 \tmp
  617. lasx_init_upper $xr24 \tmp
  618. lasx_init_upper $xr25 \tmp
  619. lasx_init_upper $xr26 \tmp
  620. lasx_init_upper $xr27 \tmp
  621. lasx_init_upper $xr28 \tmp
  622. lasx_init_upper $xr29 \tmp
  623. lasx_init_upper $xr30 \tmp
  624. lasx_init_upper $xr31 \tmp
  625. .endm
  626. .macro not dst src
  627. nor \dst, \src, zero
  628. .endm
  629. .macro la_abs reg, sym
  630. #ifndef CONFIG_RELOCATABLE
  631. la.abs \reg, \sym
  632. #else
  633. 766:
  634. lu12i.w \reg, 0
  635. ori \reg, \reg, 0
  636. #ifdef CONFIG_64BIT
  637. lu32i.d \reg, 0
  638. lu52i.d \reg, \reg, 0
  639. #endif
  640. .pushsection ".la_abs", "aw", %progbits
  641. .p2align PTRLOG
  642. PTR 766b
  643. PTR \sym
  644. .popsection
  645. #endif
  646. .endm
  647. #endif /* _ASM_ASMMACRO_H */