asmmacro.h 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  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. * Copyright (C) 2003 Ralf Baechle
  7. */
  8. #ifndef _ASM_ASMMACRO_H
  9. #define _ASM_ASMMACRO_H
  10. #include <asm/hazards.h>
  11. #include <asm/asm-offsets.h>
  12. #ifdef CONFIG_32BIT
  13. #include <asm/asmmacro-32.h>
  14. #endif
  15. #ifdef CONFIG_64BIT
  16. #include <asm/asmmacro-64.h>
  17. #endif
  18. #ifdef CONFIG_CPU_MIPSR2
  19. .macro local_irq_enable reg=t0
  20. ei
  21. irq_enable_hazard
  22. .endm
  23. .macro local_irq_disable reg=t0
  24. di
  25. irq_disable_hazard
  26. .endm
  27. #else
  28. .macro local_irq_enable reg=t0
  29. mfc0 \reg, CP0_STATUS
  30. ori \reg, \reg, 1
  31. mtc0 \reg, CP0_STATUS
  32. irq_enable_hazard
  33. .endm
  34. .macro local_irq_disable reg=t0
  35. #ifdef CONFIG_PREEMPT
  36. lw \reg, TI_PRE_COUNT($28)
  37. addi \reg, \reg, 1
  38. sw \reg, TI_PRE_COUNT($28)
  39. #endif
  40. mfc0 \reg, CP0_STATUS
  41. ori \reg, \reg, 1
  42. xori \reg, \reg, 1
  43. mtc0 \reg, CP0_STATUS
  44. irq_disable_hazard
  45. #ifdef CONFIG_PREEMPT
  46. lw \reg, TI_PRE_COUNT($28)
  47. addi \reg, \reg, -1
  48. sw \reg, TI_PRE_COUNT($28)
  49. #endif
  50. .endm
  51. #endif /* CONFIG_CPU_MIPSR2 */
  52. .macro fpu_save_16even thread tmp=t0
  53. cfc1 \tmp, fcr31
  54. sdc1 $f0, THREAD_FPR0_LS64(\thread)
  55. sdc1 $f2, THREAD_FPR2_LS64(\thread)
  56. sdc1 $f4, THREAD_FPR4_LS64(\thread)
  57. sdc1 $f6, THREAD_FPR6_LS64(\thread)
  58. sdc1 $f8, THREAD_FPR8_LS64(\thread)
  59. sdc1 $f10, THREAD_FPR10_LS64(\thread)
  60. sdc1 $f12, THREAD_FPR12_LS64(\thread)
  61. sdc1 $f14, THREAD_FPR14_LS64(\thread)
  62. sdc1 $f16, THREAD_FPR16_LS64(\thread)
  63. sdc1 $f18, THREAD_FPR18_LS64(\thread)
  64. sdc1 $f20, THREAD_FPR20_LS64(\thread)
  65. sdc1 $f22, THREAD_FPR22_LS64(\thread)
  66. sdc1 $f24, THREAD_FPR24_LS64(\thread)
  67. sdc1 $f26, THREAD_FPR26_LS64(\thread)
  68. sdc1 $f28, THREAD_FPR28_LS64(\thread)
  69. sdc1 $f30, THREAD_FPR30_LS64(\thread)
  70. sw \tmp, THREAD_FCR31(\thread)
  71. .endm
  72. .macro fpu_save_16odd thread
  73. .set push
  74. .set mips64r2
  75. sdc1 $f1, THREAD_FPR1_LS64(\thread)
  76. sdc1 $f3, THREAD_FPR3_LS64(\thread)
  77. sdc1 $f5, THREAD_FPR5_LS64(\thread)
  78. sdc1 $f7, THREAD_FPR7_LS64(\thread)
  79. sdc1 $f9, THREAD_FPR9_LS64(\thread)
  80. sdc1 $f11, THREAD_FPR11_LS64(\thread)
  81. sdc1 $f13, THREAD_FPR13_LS64(\thread)
  82. sdc1 $f15, THREAD_FPR15_LS64(\thread)
  83. sdc1 $f17, THREAD_FPR17_LS64(\thread)
  84. sdc1 $f19, THREAD_FPR19_LS64(\thread)
  85. sdc1 $f21, THREAD_FPR21_LS64(\thread)
  86. sdc1 $f23, THREAD_FPR23_LS64(\thread)
  87. sdc1 $f25, THREAD_FPR25_LS64(\thread)
  88. sdc1 $f27, THREAD_FPR27_LS64(\thread)
  89. sdc1 $f29, THREAD_FPR29_LS64(\thread)
  90. sdc1 $f31, THREAD_FPR31_LS64(\thread)
  91. .set pop
  92. .endm
  93. .macro fpu_save_double thread status tmp
  94. #if defined(CONFIG_64BIT) || defined(CONFIG_CPU_MIPS32_R2)
  95. sll \tmp, \status, 5
  96. bgez \tmp, 10f
  97. fpu_save_16odd \thread
  98. 10:
  99. #endif
  100. fpu_save_16even \thread \tmp
  101. .endm
  102. .macro fpu_restore_16even thread tmp=t0
  103. lw \tmp, THREAD_FCR31(\thread)
  104. ldc1 $f0, THREAD_FPR0_LS64(\thread)
  105. ldc1 $f2, THREAD_FPR2_LS64(\thread)
  106. ldc1 $f4, THREAD_FPR4_LS64(\thread)
  107. ldc1 $f6, THREAD_FPR6_LS64(\thread)
  108. ldc1 $f8, THREAD_FPR8_LS64(\thread)
  109. ldc1 $f10, THREAD_FPR10_LS64(\thread)
  110. ldc1 $f12, THREAD_FPR12_LS64(\thread)
  111. ldc1 $f14, THREAD_FPR14_LS64(\thread)
  112. ldc1 $f16, THREAD_FPR16_LS64(\thread)
  113. ldc1 $f18, THREAD_FPR18_LS64(\thread)
  114. ldc1 $f20, THREAD_FPR20_LS64(\thread)
  115. ldc1 $f22, THREAD_FPR22_LS64(\thread)
  116. ldc1 $f24, THREAD_FPR24_LS64(\thread)
  117. ldc1 $f26, THREAD_FPR26_LS64(\thread)
  118. ldc1 $f28, THREAD_FPR28_LS64(\thread)
  119. ldc1 $f30, THREAD_FPR30_LS64(\thread)
  120. ctc1 \tmp, fcr31
  121. .endm
  122. .macro fpu_restore_16odd thread
  123. .set push
  124. .set mips64r2
  125. ldc1 $f1, THREAD_FPR1_LS64(\thread)
  126. ldc1 $f3, THREAD_FPR3_LS64(\thread)
  127. ldc1 $f5, THREAD_FPR5_LS64(\thread)
  128. ldc1 $f7, THREAD_FPR7_LS64(\thread)
  129. ldc1 $f9, THREAD_FPR9_LS64(\thread)
  130. ldc1 $f11, THREAD_FPR11_LS64(\thread)
  131. ldc1 $f13, THREAD_FPR13_LS64(\thread)
  132. ldc1 $f15, THREAD_FPR15_LS64(\thread)
  133. ldc1 $f17, THREAD_FPR17_LS64(\thread)
  134. ldc1 $f19, THREAD_FPR19_LS64(\thread)
  135. ldc1 $f21, THREAD_FPR21_LS64(\thread)
  136. ldc1 $f23, THREAD_FPR23_LS64(\thread)
  137. ldc1 $f25, THREAD_FPR25_LS64(\thread)
  138. ldc1 $f27, THREAD_FPR27_LS64(\thread)
  139. ldc1 $f29, THREAD_FPR29_LS64(\thread)
  140. ldc1 $f31, THREAD_FPR31_LS64(\thread)
  141. .set pop
  142. .endm
  143. .macro fpu_restore_double thread status tmp
  144. #if defined(CONFIG_64BIT) || defined(CONFIG_CPU_MIPS32_R2)
  145. sll \tmp, \status, 5
  146. bgez \tmp, 10f # 16 register mode?
  147. fpu_restore_16odd \thread
  148. 10:
  149. #endif
  150. fpu_restore_16even \thread \tmp
  151. .endm
  152. #ifdef CONFIG_CPU_MIPSR2
  153. .macro _EXT rd, rs, p, s
  154. ext \rd, \rs, \p, \s
  155. .endm
  156. #else /* !CONFIG_CPU_MIPSR2 */
  157. .macro _EXT rd, rs, p, s
  158. srl \rd, \rs, \p
  159. andi \rd, \rd, (1 << \s) - 1
  160. .endm
  161. #endif /* !CONFIG_CPU_MIPSR2 */
  162. /*
  163. * Temporary until all gas have MT ASE support
  164. */
  165. .macro DMT reg=0
  166. .word 0x41600bc1 | (\reg << 16)
  167. .endm
  168. .macro EMT reg=0
  169. .word 0x41600be1 | (\reg << 16)
  170. .endm
  171. .macro DVPE reg=0
  172. .word 0x41600001 | (\reg << 16)
  173. .endm
  174. .macro EVPE reg=0
  175. .word 0x41600021 | (\reg << 16)
  176. .endm
  177. .macro MFTR rt=0, rd=0, u=0, sel=0
  178. .word 0x41000000 | (\rt << 16) | (\rd << 11) | (\u << 5) | (\sel)
  179. .endm
  180. .macro MTTR rt=0, rd=0, u=0, sel=0
  181. .word 0x41800000 | (\rt << 16) | (\rd << 11) | (\u << 5) | (\sel)
  182. .endm
  183. #ifdef TOOLCHAIN_SUPPORTS_MSA
  184. .macro ld_d wd, off, base
  185. .set push
  186. .set mips32r2
  187. .set msa
  188. ld.d $w\wd, \off(\base)
  189. .set pop
  190. .endm
  191. .macro st_d wd, off, base
  192. .set push
  193. .set mips32r2
  194. .set msa
  195. st.d $w\wd, \off(\base)
  196. .set pop
  197. .endm
  198. .macro copy_u_w rd, ws, n
  199. .set push
  200. .set mips32r2
  201. .set msa
  202. copy_u.w \rd, $w\ws[\n]
  203. .set pop
  204. .endm
  205. .macro copy_u_d rd, ws, n
  206. .set push
  207. .set mips64r2
  208. .set msa
  209. copy_u.d \rd, $w\ws[\n]
  210. .set pop
  211. .endm
  212. .macro insert_w wd, n, rs
  213. .set push
  214. .set mips32r2
  215. .set msa
  216. insert.w $w\wd[\n], \rs
  217. .set pop
  218. .endm
  219. .macro insert_d wd, n, rs
  220. .set push
  221. .set mips64r2
  222. .set msa
  223. insert.d $w\wd[\n], \rs
  224. .set pop
  225. .endm
  226. #else
  227. #ifdef CONFIG_CPU_MICROMIPS
  228. #define CFC_MSA_INSN 0x587e0056
  229. #define CTC_MSA_INSN 0x583e0816
  230. #define LDD_MSA_INSN 0x58000837
  231. #define STD_MSA_INSN 0x5800083f
  232. #define COPY_UW_MSA_INSN 0x58f00056
  233. #define COPY_UD_MSA_INSN 0x58f80056
  234. #define INSERT_W_MSA_INSN 0x59300816
  235. #define INSERT_D_MSA_INSN 0x59380816
  236. #else
  237. #define CFC_MSA_INSN 0x787e0059
  238. #define CTC_MSA_INSN 0x783e0819
  239. #define LDD_MSA_INSN 0x78000823
  240. #define STD_MSA_INSN 0x78000827
  241. #define COPY_UW_MSA_INSN 0x78f00059
  242. #define COPY_UD_MSA_INSN 0x78f80059
  243. #define INSERT_W_MSA_INSN 0x79300819
  244. #define INSERT_D_MSA_INSN 0x79380819
  245. #endif
  246. /*
  247. * Temporary until all toolchains in use include MSA support.
  248. */
  249. .macro cfcmsa rd, cs
  250. .set push
  251. .set noat
  252. .insn
  253. .word CFC_MSA_INSN | (\cs << 11)
  254. move \rd, $1
  255. .set pop
  256. .endm
  257. .macro ctcmsa cd, rs
  258. .set push
  259. .set noat
  260. move $1, \rs
  261. .word CTC_MSA_INSN | (\cd << 6)
  262. .set pop
  263. .endm
  264. .macro ld_d wd, off, base
  265. .set push
  266. .set noat
  267. add $1, \base, \off
  268. .word LDD_MSA_INSN | (\wd << 6)
  269. .set pop
  270. .endm
  271. .macro st_d wd, off, base
  272. .set push
  273. .set noat
  274. add $1, \base, \off
  275. .word STD_MSA_INSN | (\wd << 6)
  276. .set pop
  277. .endm
  278. .macro copy_u_w rd, ws, n
  279. .set push
  280. .set noat
  281. .insn
  282. .word COPY_UW_MSA_INSN | (\n << 16) | (\ws << 11)
  283. /* move triggers an assembler bug... */
  284. or \rd, $1, zero
  285. .set pop
  286. .endm
  287. .macro copy_u_d rd, ws, n
  288. .set push
  289. .set noat
  290. .insn
  291. .word COPY_UD_MSA_INSN | (\n << 16) | (\ws << 11)
  292. /* move triggers an assembler bug... */
  293. or \rd, $1, zero
  294. .set pop
  295. .endm
  296. .macro insert_w wd, n, rs
  297. .set push
  298. .set noat
  299. /* move triggers an assembler bug... */
  300. or $1, \rs, zero
  301. .word INSERT_W_MSA_INSN | (\n << 16) | (\wd << 6)
  302. .set pop
  303. .endm
  304. .macro insert_d wd, n, rs
  305. .set push
  306. .set noat
  307. /* move triggers an assembler bug... */
  308. or $1, \rs, zero
  309. .word INSERT_D_MSA_INSN | (\n << 16) | (\wd << 6)
  310. .set pop
  311. .endm
  312. #endif
  313. .macro msa_save_all thread
  314. st_d 0, THREAD_FPR0, \thread
  315. st_d 1, THREAD_FPR1, \thread
  316. st_d 2, THREAD_FPR2, \thread
  317. st_d 3, THREAD_FPR3, \thread
  318. st_d 4, THREAD_FPR4, \thread
  319. st_d 5, THREAD_FPR5, \thread
  320. st_d 6, THREAD_FPR6, \thread
  321. st_d 7, THREAD_FPR7, \thread
  322. st_d 8, THREAD_FPR8, \thread
  323. st_d 9, THREAD_FPR9, \thread
  324. st_d 10, THREAD_FPR10, \thread
  325. st_d 11, THREAD_FPR11, \thread
  326. st_d 12, THREAD_FPR12, \thread
  327. st_d 13, THREAD_FPR13, \thread
  328. st_d 14, THREAD_FPR14, \thread
  329. st_d 15, THREAD_FPR15, \thread
  330. st_d 16, THREAD_FPR16, \thread
  331. st_d 17, THREAD_FPR17, \thread
  332. st_d 18, THREAD_FPR18, \thread
  333. st_d 19, THREAD_FPR19, \thread
  334. st_d 20, THREAD_FPR20, \thread
  335. st_d 21, THREAD_FPR21, \thread
  336. st_d 22, THREAD_FPR22, \thread
  337. st_d 23, THREAD_FPR23, \thread
  338. st_d 24, THREAD_FPR24, \thread
  339. st_d 25, THREAD_FPR25, \thread
  340. st_d 26, THREAD_FPR26, \thread
  341. st_d 27, THREAD_FPR27, \thread
  342. st_d 28, THREAD_FPR28, \thread
  343. st_d 29, THREAD_FPR29, \thread
  344. st_d 30, THREAD_FPR30, \thread
  345. st_d 31, THREAD_FPR31, \thread
  346. .endm
  347. .macro msa_restore_all thread
  348. ld_d 0, THREAD_FPR0, \thread
  349. ld_d 1, THREAD_FPR1, \thread
  350. ld_d 2, THREAD_FPR2, \thread
  351. ld_d 3, THREAD_FPR3, \thread
  352. ld_d 4, THREAD_FPR4, \thread
  353. ld_d 5, THREAD_FPR5, \thread
  354. ld_d 6, THREAD_FPR6, \thread
  355. ld_d 7, THREAD_FPR7, \thread
  356. ld_d 8, THREAD_FPR8, \thread
  357. ld_d 9, THREAD_FPR9, \thread
  358. ld_d 10, THREAD_FPR10, \thread
  359. ld_d 11, THREAD_FPR11, \thread
  360. ld_d 12, THREAD_FPR12, \thread
  361. ld_d 13, THREAD_FPR13, \thread
  362. ld_d 14, THREAD_FPR14, \thread
  363. ld_d 15, THREAD_FPR15, \thread
  364. ld_d 16, THREAD_FPR16, \thread
  365. ld_d 17, THREAD_FPR17, \thread
  366. ld_d 18, THREAD_FPR18, \thread
  367. ld_d 19, THREAD_FPR19, \thread
  368. ld_d 20, THREAD_FPR20, \thread
  369. ld_d 21, THREAD_FPR21, \thread
  370. ld_d 22, THREAD_FPR22, \thread
  371. ld_d 23, THREAD_FPR23, \thread
  372. ld_d 24, THREAD_FPR24, \thread
  373. ld_d 25, THREAD_FPR25, \thread
  374. ld_d 26, THREAD_FPR26, \thread
  375. ld_d 27, THREAD_FPR27, \thread
  376. ld_d 28, THREAD_FPR28, \thread
  377. ld_d 29, THREAD_FPR29, \thread
  378. ld_d 30, THREAD_FPR30, \thread
  379. ld_d 31, THREAD_FPR31, \thread
  380. .endm
  381. #endif /* _ASM_ASMMACRO_H */