asmmacro.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  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. /* preprocessor replaces the fp in ".set fp=64" with $30 otherwise */
  20. #undef fp
  21. /*
  22. * Helper macros for generating raw instruction encodings.
  23. */
  24. #ifdef CONFIG_CPU_MICROMIPS
  25. .macro insn32_if_mm enc
  26. .insn
  27. .hword ((\enc) >> 16)
  28. .hword ((\enc) & 0xffff)
  29. .endm
  30. .macro insn_if_mips enc
  31. .endm
  32. #else
  33. .macro insn32_if_mm enc
  34. .endm
  35. .macro insn_if_mips enc
  36. .insn
  37. .word (\enc)
  38. .endm
  39. #endif
  40. #ifdef CONFIG_CPU_HAS_DIEI
  41. .macro local_irq_enable reg=t0
  42. ei
  43. irq_enable_hazard
  44. .endm
  45. .macro local_irq_disable reg=t0
  46. di
  47. irq_disable_hazard
  48. .endm
  49. #else /* !CONFIG_CPU_MIPSR2 && !CONFIG_CPU_MIPSR5 && !CONFIG_CPU_MIPSR6 */
  50. .macro local_irq_enable reg=t0
  51. mfc0 \reg, CP0_STATUS
  52. ori \reg, \reg, 1
  53. mtc0 \reg, CP0_STATUS
  54. irq_enable_hazard
  55. .endm
  56. .macro local_irq_disable reg=t0
  57. #ifdef CONFIG_PREEMPTION
  58. lw \reg, TI_PRE_COUNT($28)
  59. addi \reg, \reg, 1
  60. sw \reg, TI_PRE_COUNT($28)
  61. #endif
  62. mfc0 \reg, CP0_STATUS
  63. ori \reg, \reg, 1
  64. xori \reg, \reg, 1
  65. mtc0 \reg, CP0_STATUS
  66. irq_disable_hazard
  67. #ifdef CONFIG_PREEMPTION
  68. lw \reg, TI_PRE_COUNT($28)
  69. addi \reg, \reg, -1
  70. sw \reg, TI_PRE_COUNT($28)
  71. #endif
  72. .endm
  73. #endif /* !CONFIG_CPU_MIPSR2 && !CONFIG_CPU_MIPSR5 && !CONFIG_CPU_MIPSR6 */
  74. .macro fpu_save_16even thread tmp=t0
  75. .set push
  76. SET_HARDFLOAT
  77. cfc1 \tmp, fcr31
  78. sdc1 $f0, THREAD_FPR0(\thread)
  79. sdc1 $f2, THREAD_FPR2(\thread)
  80. sdc1 $f4, THREAD_FPR4(\thread)
  81. sdc1 $f6, THREAD_FPR6(\thread)
  82. sdc1 $f8, THREAD_FPR8(\thread)
  83. sdc1 $f10, THREAD_FPR10(\thread)
  84. sdc1 $f12, THREAD_FPR12(\thread)
  85. sdc1 $f14, THREAD_FPR14(\thread)
  86. sdc1 $f16, THREAD_FPR16(\thread)
  87. sdc1 $f18, THREAD_FPR18(\thread)
  88. sdc1 $f20, THREAD_FPR20(\thread)
  89. sdc1 $f22, THREAD_FPR22(\thread)
  90. sdc1 $f24, THREAD_FPR24(\thread)
  91. sdc1 $f26, THREAD_FPR26(\thread)
  92. sdc1 $f28, THREAD_FPR28(\thread)
  93. sdc1 $f30, THREAD_FPR30(\thread)
  94. sw \tmp, THREAD_FCR31(\thread)
  95. .set pop
  96. .endm
  97. .macro fpu_save_16odd thread
  98. .set push
  99. .set mips64r2
  100. .set fp=64
  101. SET_HARDFLOAT
  102. sdc1 $f1, THREAD_FPR1(\thread)
  103. sdc1 $f3, THREAD_FPR3(\thread)
  104. sdc1 $f5, THREAD_FPR5(\thread)
  105. sdc1 $f7, THREAD_FPR7(\thread)
  106. sdc1 $f9, THREAD_FPR9(\thread)
  107. sdc1 $f11, THREAD_FPR11(\thread)
  108. sdc1 $f13, THREAD_FPR13(\thread)
  109. sdc1 $f15, THREAD_FPR15(\thread)
  110. sdc1 $f17, THREAD_FPR17(\thread)
  111. sdc1 $f19, THREAD_FPR19(\thread)
  112. sdc1 $f21, THREAD_FPR21(\thread)
  113. sdc1 $f23, THREAD_FPR23(\thread)
  114. sdc1 $f25, THREAD_FPR25(\thread)
  115. sdc1 $f27, THREAD_FPR27(\thread)
  116. sdc1 $f29, THREAD_FPR29(\thread)
  117. sdc1 $f31, THREAD_FPR31(\thread)
  118. .set pop
  119. .endm
  120. .macro fpu_save_double thread status tmp
  121. #if defined(CONFIG_64BIT) || defined(CONFIG_CPU_MIPSR2) || \
  122. defined(CONFIG_CPU_MIPSR5) || defined(CONFIG_CPU_MIPSR6)
  123. sll \tmp, \status, 5
  124. bgez \tmp, 10f
  125. fpu_save_16odd \thread
  126. 10:
  127. #endif
  128. fpu_save_16even \thread \tmp
  129. .endm
  130. .macro fpu_restore_16even thread tmp=t0
  131. .set push
  132. SET_HARDFLOAT
  133. lw \tmp, THREAD_FCR31(\thread)
  134. ldc1 $f0, THREAD_FPR0(\thread)
  135. ldc1 $f2, THREAD_FPR2(\thread)
  136. ldc1 $f4, THREAD_FPR4(\thread)
  137. ldc1 $f6, THREAD_FPR6(\thread)
  138. ldc1 $f8, THREAD_FPR8(\thread)
  139. ldc1 $f10, THREAD_FPR10(\thread)
  140. ldc1 $f12, THREAD_FPR12(\thread)
  141. ldc1 $f14, THREAD_FPR14(\thread)
  142. ldc1 $f16, THREAD_FPR16(\thread)
  143. ldc1 $f18, THREAD_FPR18(\thread)
  144. ldc1 $f20, THREAD_FPR20(\thread)
  145. ldc1 $f22, THREAD_FPR22(\thread)
  146. ldc1 $f24, THREAD_FPR24(\thread)
  147. ldc1 $f26, THREAD_FPR26(\thread)
  148. ldc1 $f28, THREAD_FPR28(\thread)
  149. ldc1 $f30, THREAD_FPR30(\thread)
  150. ctc1 \tmp, fcr31
  151. .set pop
  152. .endm
  153. .macro fpu_restore_16odd thread
  154. .set push
  155. .set mips64r2
  156. .set fp=64
  157. SET_HARDFLOAT
  158. ldc1 $f1, THREAD_FPR1(\thread)
  159. ldc1 $f3, THREAD_FPR3(\thread)
  160. ldc1 $f5, THREAD_FPR5(\thread)
  161. ldc1 $f7, THREAD_FPR7(\thread)
  162. ldc1 $f9, THREAD_FPR9(\thread)
  163. ldc1 $f11, THREAD_FPR11(\thread)
  164. ldc1 $f13, THREAD_FPR13(\thread)
  165. ldc1 $f15, THREAD_FPR15(\thread)
  166. ldc1 $f17, THREAD_FPR17(\thread)
  167. ldc1 $f19, THREAD_FPR19(\thread)
  168. ldc1 $f21, THREAD_FPR21(\thread)
  169. ldc1 $f23, THREAD_FPR23(\thread)
  170. ldc1 $f25, THREAD_FPR25(\thread)
  171. ldc1 $f27, THREAD_FPR27(\thread)
  172. ldc1 $f29, THREAD_FPR29(\thread)
  173. ldc1 $f31, THREAD_FPR31(\thread)
  174. .set pop
  175. .endm
  176. .macro fpu_restore_double thread status tmp
  177. #if defined(CONFIG_64BIT) || defined(CONFIG_CPU_MIPSR2) || \
  178. defined(CONFIG_CPU_MIPSR5) || defined(CONFIG_CPU_MIPSR6)
  179. sll \tmp, \status, 5
  180. bgez \tmp, 10f # 16 register mode?
  181. fpu_restore_16odd \thread
  182. 10:
  183. #endif
  184. fpu_restore_16even \thread \tmp
  185. .endm
  186. #if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR5) || \
  187. defined(CONFIG_CPU_MIPSR6)
  188. .macro _EXT rd, rs, p, s
  189. ext \rd, \rs, \p, \s
  190. .endm
  191. #else /* !CONFIG_CPU_MIPSR2 && !CONFIG_CPU_MIPSR5 && !CONFIG_CPU_MIPSR6 */
  192. .macro _EXT rd, rs, p, s
  193. srl \rd, \rs, \p
  194. andi \rd, \rd, (1 << \s) - 1
  195. .endm
  196. #endif /* !CONFIG_CPU_MIPSR2 && !CONFIG_CPU_MIPSR5 && !CONFIG_CPU_MIPSR6 */
  197. /*
  198. * Temporary until all gas have MT ASE support
  199. */
  200. .macro DMT reg=0
  201. .word 0x41600bc1 | (\reg << 16)
  202. .endm
  203. .macro EMT reg=0
  204. .word 0x41600be1 | (\reg << 16)
  205. .endm
  206. .macro DVPE reg=0
  207. .word 0x41600001 | (\reg << 16)
  208. .endm
  209. .macro EVPE reg=0
  210. .word 0x41600021 | (\reg << 16)
  211. .endm
  212. .macro MFTR rt=0, rd=0, u=0, sel=0
  213. .word 0x41000000 | (\rt << 16) | (\rd << 11) | (\u << 5) | (\sel)
  214. .endm
  215. .macro MTTR rt=0, rd=0, u=0, sel=0
  216. .word 0x41800000 | (\rt << 16) | (\rd << 11) | (\u << 5) | (\sel)
  217. .endm
  218. #ifdef TOOLCHAIN_SUPPORTS_MSA
  219. .macro _cfcmsa rd, cs
  220. .set push
  221. .set mips32r2
  222. .set fp=64
  223. .set msa
  224. cfcmsa \rd, $\cs
  225. .set pop
  226. .endm
  227. .macro _ctcmsa cd, rs
  228. .set push
  229. .set mips32r2
  230. .set fp=64
  231. .set msa
  232. ctcmsa $\cd, \rs
  233. .set pop
  234. .endm
  235. .macro ld_b wd, off, base
  236. .set push
  237. .set mips32r2
  238. .set fp=64
  239. .set msa
  240. ld.b $w\wd, \off(\base)
  241. .set pop
  242. .endm
  243. .macro ld_h wd, off, base
  244. .set push
  245. .set mips32r2
  246. .set fp=64
  247. .set msa
  248. ld.h $w\wd, \off(\base)
  249. .set pop
  250. .endm
  251. .macro ld_w wd, off, base
  252. .set push
  253. .set mips32r2
  254. .set fp=64
  255. .set msa
  256. ld.w $w\wd, \off(\base)
  257. .set pop
  258. .endm
  259. .macro ld_d wd, off, base
  260. .set push
  261. .set mips32r2
  262. .set fp=64
  263. .set msa
  264. ld.d $w\wd, \off(\base)
  265. .set pop
  266. .endm
  267. .macro st_b wd, off, base
  268. .set push
  269. .set mips32r2
  270. .set fp=64
  271. .set msa
  272. st.b $w\wd, \off(\base)
  273. .set pop
  274. .endm
  275. .macro st_h wd, off, base
  276. .set push
  277. .set mips32r2
  278. .set fp=64
  279. .set msa
  280. st.h $w\wd, \off(\base)
  281. .set pop
  282. .endm
  283. .macro st_w wd, off, base
  284. .set push
  285. .set mips32r2
  286. .set fp=64
  287. .set msa
  288. st.w $w\wd, \off(\base)
  289. .set pop
  290. .endm
  291. .macro st_d wd, off, base
  292. .set push
  293. .set mips32r2
  294. .set fp=64
  295. .set msa
  296. st.d $w\wd, \off(\base)
  297. .set pop
  298. .endm
  299. .macro copy_s_w ws, n
  300. .set push
  301. .set mips32r2
  302. .set fp=64
  303. .set msa
  304. copy_s.w $1, $w\ws[\n]
  305. .set pop
  306. .endm
  307. .macro copy_s_d ws, n
  308. .set push
  309. .set mips64r2
  310. .set fp=64
  311. .set msa
  312. copy_s.d $1, $w\ws[\n]
  313. .set pop
  314. .endm
  315. .macro insert_w wd, n
  316. .set push
  317. .set mips32r2
  318. .set fp=64
  319. .set msa
  320. insert.w $w\wd[\n], $1
  321. .set pop
  322. .endm
  323. .macro insert_d wd, n
  324. .set push
  325. .set mips64r2
  326. .set fp=64
  327. .set msa
  328. insert.d $w\wd[\n], $1
  329. .set pop
  330. .endm
  331. #else
  332. /*
  333. * Temporary until all toolchains in use include MSA support.
  334. */
  335. .macro _cfcmsa rd, cs
  336. .set push
  337. .set noat
  338. SET_HARDFLOAT
  339. insn_if_mips 0x787e0059 | (\cs << 11)
  340. insn32_if_mm 0x587e0056 | (\cs << 11)
  341. move \rd, $1
  342. .set pop
  343. .endm
  344. .macro _ctcmsa cd, rs
  345. .set push
  346. .set noat
  347. SET_HARDFLOAT
  348. move $1, \rs
  349. insn_if_mips 0x783e0819 | (\cd << 6)
  350. insn32_if_mm 0x583e0816 | (\cd << 6)
  351. .set pop
  352. .endm
  353. .macro ld_b wd, off, base
  354. .set push
  355. .set noat
  356. SET_HARDFLOAT
  357. PTR_ADDU $1, \base, \off
  358. insn_if_mips 0x78000820 | (\wd << 6)
  359. insn32_if_mm 0x58000807 | (\wd << 6)
  360. .set pop
  361. .endm
  362. .macro ld_h wd, off, base
  363. .set push
  364. .set noat
  365. SET_HARDFLOAT
  366. PTR_ADDU $1, \base, \off
  367. insn_if_mips 0x78000821 | (\wd << 6)
  368. insn32_if_mm 0x58000817 | (\wd << 6)
  369. .set pop
  370. .endm
  371. .macro ld_w wd, off, base
  372. .set push
  373. .set noat
  374. SET_HARDFLOAT
  375. PTR_ADDU $1, \base, \off
  376. insn_if_mips 0x78000822 | (\wd << 6)
  377. insn32_if_mm 0x58000827 | (\wd << 6)
  378. .set pop
  379. .endm
  380. .macro ld_d wd, off, base
  381. .set push
  382. .set noat
  383. SET_HARDFLOAT
  384. PTR_ADDU $1, \base, \off
  385. insn_if_mips 0x78000823 | (\wd << 6)
  386. insn32_if_mm 0x58000837 | (\wd << 6)
  387. .set pop
  388. .endm
  389. .macro st_b wd, off, base
  390. .set push
  391. .set noat
  392. SET_HARDFLOAT
  393. PTR_ADDU $1, \base, \off
  394. insn_if_mips 0x78000824 | (\wd << 6)
  395. insn32_if_mm 0x5800080f | (\wd << 6)
  396. .set pop
  397. .endm
  398. .macro st_h wd, off, base
  399. .set push
  400. .set noat
  401. SET_HARDFLOAT
  402. PTR_ADDU $1, \base, \off
  403. insn_if_mips 0x78000825 | (\wd << 6)
  404. insn32_if_mm 0x5800081f | (\wd << 6)
  405. .set pop
  406. .endm
  407. .macro st_w wd, off, base
  408. .set push
  409. .set noat
  410. SET_HARDFLOAT
  411. PTR_ADDU $1, \base, \off
  412. insn_if_mips 0x78000826 | (\wd << 6)
  413. insn32_if_mm 0x5800082f | (\wd << 6)
  414. .set pop
  415. .endm
  416. .macro st_d wd, off, base
  417. .set push
  418. .set noat
  419. SET_HARDFLOAT
  420. PTR_ADDU $1, \base, \off
  421. insn_if_mips 0x78000827 | (\wd << 6)
  422. insn32_if_mm 0x5800083f | (\wd << 6)
  423. .set pop
  424. .endm
  425. .macro copy_s_w ws, n
  426. .set push
  427. .set noat
  428. SET_HARDFLOAT
  429. insn_if_mips 0x78b00059 | (\n << 16) | (\ws << 11)
  430. insn32_if_mm 0x58b00056 | (\n << 16) | (\ws << 11)
  431. .set pop
  432. .endm
  433. .macro copy_s_d ws, n
  434. .set push
  435. .set noat
  436. SET_HARDFLOAT
  437. insn_if_mips 0x78b80059 | (\n << 16) | (\ws << 11)
  438. insn32_if_mm 0x58b80056 | (\n << 16) | (\ws << 11)
  439. .set pop
  440. .endm
  441. .macro insert_w wd, n
  442. .set push
  443. .set noat
  444. SET_HARDFLOAT
  445. insn_if_mips 0x79300819 | (\n << 16) | (\wd << 6)
  446. insn32_if_mm 0x59300816 | (\n << 16) | (\wd << 6)
  447. .set pop
  448. .endm
  449. .macro insert_d wd, n
  450. .set push
  451. .set noat
  452. SET_HARDFLOAT
  453. insn_if_mips 0x79380819 | (\n << 16) | (\wd << 6)
  454. insn32_if_mm 0x59380816 | (\n << 16) | (\wd << 6)
  455. .set pop
  456. .endm
  457. #endif
  458. #ifdef TOOLCHAIN_SUPPORTS_MSA
  459. #define FPR_BASE_OFFS THREAD_FPR0
  460. #define FPR_BASE $1
  461. #else
  462. #define FPR_BASE_OFFS 0
  463. #define FPR_BASE \thread
  464. #endif
  465. .macro msa_save_all thread
  466. .set push
  467. .set noat
  468. #ifdef TOOLCHAIN_SUPPORTS_MSA
  469. PTR_ADDU FPR_BASE, \thread, FPR_BASE_OFFS
  470. #endif
  471. st_d 0, THREAD_FPR0 - FPR_BASE_OFFS, FPR_BASE
  472. st_d 1, THREAD_FPR1 - FPR_BASE_OFFS, FPR_BASE
  473. st_d 2, THREAD_FPR2 - FPR_BASE_OFFS, FPR_BASE
  474. st_d 3, THREAD_FPR3 - FPR_BASE_OFFS, FPR_BASE
  475. st_d 4, THREAD_FPR4 - FPR_BASE_OFFS, FPR_BASE
  476. st_d 5, THREAD_FPR5 - FPR_BASE_OFFS, FPR_BASE
  477. st_d 6, THREAD_FPR6 - FPR_BASE_OFFS, FPR_BASE
  478. st_d 7, THREAD_FPR7 - FPR_BASE_OFFS, FPR_BASE
  479. st_d 8, THREAD_FPR8 - FPR_BASE_OFFS, FPR_BASE
  480. st_d 9, THREAD_FPR9 - FPR_BASE_OFFS, FPR_BASE
  481. st_d 10, THREAD_FPR10 - FPR_BASE_OFFS, FPR_BASE
  482. st_d 11, THREAD_FPR11 - FPR_BASE_OFFS, FPR_BASE
  483. st_d 12, THREAD_FPR12 - FPR_BASE_OFFS, FPR_BASE
  484. st_d 13, THREAD_FPR13 - FPR_BASE_OFFS, FPR_BASE
  485. st_d 14, THREAD_FPR14 - FPR_BASE_OFFS, FPR_BASE
  486. st_d 15, THREAD_FPR15 - FPR_BASE_OFFS, FPR_BASE
  487. st_d 16, THREAD_FPR16 - FPR_BASE_OFFS, FPR_BASE
  488. st_d 17, THREAD_FPR17 - FPR_BASE_OFFS, FPR_BASE
  489. st_d 18, THREAD_FPR18 - FPR_BASE_OFFS, FPR_BASE
  490. st_d 19, THREAD_FPR19 - FPR_BASE_OFFS, FPR_BASE
  491. st_d 20, THREAD_FPR20 - FPR_BASE_OFFS, FPR_BASE
  492. st_d 21, THREAD_FPR21 - FPR_BASE_OFFS, FPR_BASE
  493. st_d 22, THREAD_FPR22 - FPR_BASE_OFFS, FPR_BASE
  494. st_d 23, THREAD_FPR23 - FPR_BASE_OFFS, FPR_BASE
  495. st_d 24, THREAD_FPR24 - FPR_BASE_OFFS, FPR_BASE
  496. st_d 25, THREAD_FPR25 - FPR_BASE_OFFS, FPR_BASE
  497. st_d 26, THREAD_FPR26 - FPR_BASE_OFFS, FPR_BASE
  498. st_d 27, THREAD_FPR27 - FPR_BASE_OFFS, FPR_BASE
  499. st_d 28, THREAD_FPR28 - FPR_BASE_OFFS, FPR_BASE
  500. st_d 29, THREAD_FPR29 - FPR_BASE_OFFS, FPR_BASE
  501. st_d 30, THREAD_FPR30 - FPR_BASE_OFFS, FPR_BASE
  502. st_d 31, THREAD_FPR31 - FPR_BASE_OFFS, FPR_BASE
  503. SET_HARDFLOAT
  504. _cfcmsa $1, MSA_CSR
  505. sw $1, THREAD_MSA_CSR(\thread)
  506. .set pop
  507. .endm
  508. .macro msa_restore_all thread
  509. .set push
  510. .set noat
  511. SET_HARDFLOAT
  512. lw $1, THREAD_MSA_CSR(\thread)
  513. _ctcmsa MSA_CSR, $1
  514. #ifdef TOOLCHAIN_SUPPORTS_MSA
  515. PTR_ADDU FPR_BASE, \thread, FPR_BASE_OFFS
  516. #endif
  517. ld_d 0, THREAD_FPR0 - FPR_BASE_OFFS, FPR_BASE
  518. ld_d 1, THREAD_FPR1 - FPR_BASE_OFFS, FPR_BASE
  519. ld_d 2, THREAD_FPR2 - FPR_BASE_OFFS, FPR_BASE
  520. ld_d 3, THREAD_FPR3 - FPR_BASE_OFFS, FPR_BASE
  521. ld_d 4, THREAD_FPR4 - FPR_BASE_OFFS, FPR_BASE
  522. ld_d 5, THREAD_FPR5 - FPR_BASE_OFFS, FPR_BASE
  523. ld_d 6, THREAD_FPR6 - FPR_BASE_OFFS, FPR_BASE
  524. ld_d 7, THREAD_FPR7 - FPR_BASE_OFFS, FPR_BASE
  525. ld_d 8, THREAD_FPR8 - FPR_BASE_OFFS, FPR_BASE
  526. ld_d 9, THREAD_FPR9 - FPR_BASE_OFFS, FPR_BASE
  527. ld_d 10, THREAD_FPR10 - FPR_BASE_OFFS, FPR_BASE
  528. ld_d 11, THREAD_FPR11 - FPR_BASE_OFFS, FPR_BASE
  529. ld_d 12, THREAD_FPR12 - FPR_BASE_OFFS, FPR_BASE
  530. ld_d 13, THREAD_FPR13 - FPR_BASE_OFFS, FPR_BASE
  531. ld_d 14, THREAD_FPR14 - FPR_BASE_OFFS, FPR_BASE
  532. ld_d 15, THREAD_FPR15 - FPR_BASE_OFFS, FPR_BASE
  533. ld_d 16, THREAD_FPR16 - FPR_BASE_OFFS, FPR_BASE
  534. ld_d 17, THREAD_FPR17 - FPR_BASE_OFFS, FPR_BASE
  535. ld_d 18, THREAD_FPR18 - FPR_BASE_OFFS, FPR_BASE
  536. ld_d 19, THREAD_FPR19 - FPR_BASE_OFFS, FPR_BASE
  537. ld_d 20, THREAD_FPR20 - FPR_BASE_OFFS, FPR_BASE
  538. ld_d 21, THREAD_FPR21 - FPR_BASE_OFFS, FPR_BASE
  539. ld_d 22, THREAD_FPR22 - FPR_BASE_OFFS, FPR_BASE
  540. ld_d 23, THREAD_FPR23 - FPR_BASE_OFFS, FPR_BASE
  541. ld_d 24, THREAD_FPR24 - FPR_BASE_OFFS, FPR_BASE
  542. ld_d 25, THREAD_FPR25 - FPR_BASE_OFFS, FPR_BASE
  543. ld_d 26, THREAD_FPR26 - FPR_BASE_OFFS, FPR_BASE
  544. ld_d 27, THREAD_FPR27 - FPR_BASE_OFFS, FPR_BASE
  545. ld_d 28, THREAD_FPR28 - FPR_BASE_OFFS, FPR_BASE
  546. ld_d 29, THREAD_FPR29 - FPR_BASE_OFFS, FPR_BASE
  547. ld_d 30, THREAD_FPR30 - FPR_BASE_OFFS, FPR_BASE
  548. ld_d 31, THREAD_FPR31 - FPR_BASE_OFFS, FPR_BASE
  549. .set pop
  550. .endm
  551. #undef FPR_BASE_OFFS
  552. #undef FPR_BASE
  553. .macro msa_init_upper wd
  554. #ifdef CONFIG_64BIT
  555. insert_d \wd, 1
  556. #else
  557. insert_w \wd, 2
  558. insert_w \wd, 3
  559. #endif
  560. .endm
  561. .macro msa_init_all_upper
  562. .set push
  563. .set noat
  564. SET_HARDFLOAT
  565. not $1, zero
  566. msa_init_upper 0
  567. msa_init_upper 1
  568. msa_init_upper 2
  569. msa_init_upper 3
  570. msa_init_upper 4
  571. msa_init_upper 5
  572. msa_init_upper 6
  573. msa_init_upper 7
  574. msa_init_upper 8
  575. msa_init_upper 9
  576. msa_init_upper 10
  577. msa_init_upper 11
  578. msa_init_upper 12
  579. msa_init_upper 13
  580. msa_init_upper 14
  581. msa_init_upper 15
  582. msa_init_upper 16
  583. msa_init_upper 17
  584. msa_init_upper 18
  585. msa_init_upper 19
  586. msa_init_upper 20
  587. msa_init_upper 21
  588. msa_init_upper 22
  589. msa_init_upper 23
  590. msa_init_upper 24
  591. msa_init_upper 25
  592. msa_init_upper 26
  593. msa_init_upper 27
  594. msa_init_upper 28
  595. msa_init_upper 29
  596. msa_init_upper 30
  597. msa_init_upper 31
  598. .set pop
  599. .endm
  600. #endif /* _ASM_ASMMACRO_H */