asmmacro.h 10 KB

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