pg-r4k.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:12k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  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.  * r4xx0.c: R4000 processor variant specific MMU/Cache routines.
  7.  *
  8.  * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
  9.  * Copyright (C) 1997,  1998,  1999,  2000 Ralf Baechle ralf@gnu.org
  10.  */
  11. #include <linux/config.h>
  12. #include <asm/addrspace.h>
  13. #include <asm/asm.h>
  14. #include <asm/regdef.h>
  15. #include <asm/cacheops.h>
  16. #include <asm/mipsregs.h>
  17. #include <asm/offset.h>
  18. #ifdef CONFIG_64BIT_PHYS_ADDR
  19. #define PGD_SIZE 0x2000
  20. #else
  21. #define PGD_SIZE 0x1000
  22. #endif
  23. .text
  24. .set mips3
  25. .set noat
  26. /*
  27.  * Zero an entire page.  Basically a simple unrolled loop should do the
  28.  * job but we want more performance by saving memory bus bandwidth.  We
  29.  * have five flavours of the routine available for:
  30.  *
  31.  * - 16byte cachelines and no second level cache
  32.  * - 32byte cachelines second level cache
  33.  * - a version which handles the buggy R4600 v1.x
  34.  * - a version which handles the buggy R4600 v2.0
  35.  * - Finally a last version without fancy cache games for the SC and MC
  36.  *   versions of R4000 and R4400.
  37.  */
  38. LEAF(r4k_clear_page_d16)
  39. addiu AT, a0, _PAGE_SIZE
  40. 1: cache Create_Dirty_Excl_D, (a0)
  41. sd zero, (a0)
  42. sd zero, 8(a0)
  43. cache Create_Dirty_Excl_D, 16(a0)
  44. sd zero, 16(a0)
  45. sd zero, 24(a0)
  46. addiu a0, 64
  47. cache Create_Dirty_Excl_D, -32(a0)
  48. sd zero, -32(a0)
  49. sd zero, -24(a0)
  50. cache Create_Dirty_Excl_D, -16(a0)
  51. sd zero, -16(a0)
  52. sd zero, -8(a0)
  53. bne AT, a0, 1b
  54. jr ra
  55. END(r4k_clear_page_d16)
  56. LEAF(r4k_clear_page_d32)
  57. addiu AT, a0, _PAGE_SIZE
  58. 1: cache Create_Dirty_Excl_D, (a0)
  59. sd zero, (a0)
  60. sd zero, 8(a0)
  61. sd zero, 16(a0)
  62. sd zero, 24(a0)
  63. addiu a0, 64
  64. cache Create_Dirty_Excl_D, -32(a0)
  65. sd zero, -32(a0)
  66. sd zero, -24(a0)
  67. sd zero, -16(a0)
  68. sd zero, -8(a0)
  69. bne AT, a0, 1b
  70. jr ra
  71. END(r4k_clear_page_d32)
  72. /*
  73.  * This flavour of r4k_clear_page is for the R4600 V1.x.  Cite from the
  74.  * IDT R4600 V1.7 errata:
  75.  *
  76.  *  18. The CACHE instructions Hit_Writeback_Invalidate_D, Hit_Writeback_D,
  77.  *      Hit_Invalidate_D and Create_Dirty_Excl_D should only be
  78.  *      executed if there is no other dcache activity. If the dcache is
  79.  *      accessed for another instruction immeidately preceding when these
  80.  *      cache instructions are executing, it is possible that the dcache
  81.  *      tag match outputs used by these cache instructions will be
  82.  *      incorrect. These cache instructions should be preceded by at least
  83.  *      four instructions that are not any kind of load or store
  84.  *      instruction.
  85.  *
  86.  *      This is not allowed:    lw
  87.  *                              nop
  88.  *                              nop
  89.  *                              nop
  90.  *                              cache       Hit_Writeback_Invalidate_D
  91.  *
  92.  *      This is allowed:        lw
  93.  *                              nop
  94.  *                              nop
  95.  *                              nop
  96.  *                              nop
  97.  *                              cache       Hit_Writeback_Invalidate_D
  98.  */
  99. LEAF(r4k_clear_page_r4600_v1)
  100. addiu AT, a0, _PAGE_SIZE
  101. 1: nop
  102. nop
  103. nop
  104. nop
  105. cache Create_Dirty_Excl_D, (a0)
  106. sd zero, (a0)
  107. sd zero, 8(a0)
  108. sd zero, 16(a0)
  109. sd zero, 24(a0)
  110. addiu a0, 64
  111. nop
  112. nop
  113. nop
  114. cache Create_Dirty_Excl_D, -32(a0)
  115. sd zero, -32(a0)
  116. sd zero, -24(a0)
  117. sd zero, -16(a0)
  118. sd zero, -8(a0)
  119. bne AT, a0, 1b
  120. jr ra
  121. END(r4k_clear_page_r4600_v1)
  122. LEAF(r4k_clear_page_r4600_v2)
  123. mfc0 a1, CP0_STATUS
  124. ori AT, a1, 1
  125. xori AT, 1
  126. mtc0 AT, CP0_STATUS
  127. nop
  128. nop
  129. nop
  130. .set volatile
  131. la AT, KSEG1
  132. lw zero, (AT)
  133. .set novolatile
  134. addiu AT, a0, _PAGE_SIZE
  135. 1: cache Create_Dirty_Excl_D, (a0)
  136. sd zero, (a0)
  137. sd zero, 8(a0)
  138. sd zero, 16(a0)
  139. sd zero, 24(a0)
  140. addiu a0, 64
  141. cache Create_Dirty_Excl_D, -32(a0)
  142. sd zero, -32(a0)
  143. sd zero, -24(a0)
  144. sd zero, -16(a0)
  145. sd zero, -8(a0)
  146. bne AT, a0, 1b
  147. mfc0 AT, CP0_STATUS # __restore_flags
  148. andi a1, 1
  149. ori AT, 1
  150. xori AT, 1
  151. or a1, AT
  152. mtc0 a1, CP0_STATUS
  153. nop
  154. nop
  155. nop
  156. jr ra
  157. END(r4k_clear_page_r4600_v2)
  158. /*
  159.  * The next 4 versions are optimized for all possible scache configurations
  160.  * of the SC / MC versions of R4000 and R4400 ...
  161.  *
  162.  * Todo: For even better performance we should have a routine optimized for
  163.  * every legal combination of dcache / scache linesize.  When I (Ralf) tried
  164.  * this the kernel crashed shortly after mounting the root filesystem.  CPU
  165.  * bug?  Weirdo cache instruction semantics?
  166.  */
  167. LEAF(r4k_clear_page_s16)
  168. addiu AT, a0, _PAGE_SIZE
  169. 1: cache Create_Dirty_Excl_SD, (a0)
  170. sd zero, (a0)
  171. sd zero, 8(a0)
  172. cache Create_Dirty_Excl_SD, 16(a0)
  173. sd zero, 16(a0)
  174. sd zero, 24(a0)
  175. addiu a0, 64
  176. cache Create_Dirty_Excl_SD, -32(a0)
  177. sd zero, -32(a0)
  178. sd zero, -24(a0)
  179. cache Create_Dirty_Excl_SD, -16(a0)
  180. sd zero, -16(a0)
  181. sd zero, -8(a0)
  182. bne AT, a0, 1b
  183. jr ra
  184. END(r4k_clear_page_s16)
  185. LEAF(r4k_clear_page_s32)
  186. addiu AT, a0, _PAGE_SIZE
  187. 1: cache Create_Dirty_Excl_SD, (a0)
  188. sd zero, (a0)
  189. sd zero, 8(a0)
  190. sd zero, 16(a0)
  191. sd zero, 24(a0)
  192. addiu a0, 64
  193. cache Create_Dirty_Excl_SD, -32(a0)
  194. sd zero, -32(a0)
  195. sd zero, -24(a0)
  196. sd zero, -16(a0)
  197. sd zero, -8(a0)
  198. bne AT, a0, 1b
  199. jr ra
  200. END(r4k_clear_page_s32)
  201. LEAF(r4k_clear_page_s64)
  202. addiu AT, a0, _PAGE_SIZE
  203. 1: cache Create_Dirty_Excl_SD, (a0)
  204. sd zero, (a0)
  205. sd zero, 8(a0)
  206. sd zero, 16(a0)
  207. sd zero, 24(a0)
  208. addiu a0, 64
  209. sd zero, -32(a0)
  210. sd zero, -24(a0)
  211. sd zero, -16(a0)
  212. sd zero, -8(a0)
  213. bne AT, a0, 1b
  214. jr ra
  215. END(r4k_clear_page_s64)
  216. LEAF(r4k_clear_page_s128)
  217. addiu AT, a0, _PAGE_SIZE
  218. 1: cache Create_Dirty_Excl_SD, (a0)
  219. sd zero, (a0)
  220. sd zero, 8(a0)
  221. sd zero, 16(a0)
  222. sd zero, 24(a0)
  223. sd zero, 32(a0)
  224. sd zero, 40(a0)
  225. sd zero, 48(a0)
  226. sd zero, 56(a0)
  227. addiu a0, 128
  228. sd zero, -64(a0)
  229. sd zero, -56(a0)
  230. sd zero, -48(a0)
  231. sd zero, -40(a0)
  232. sd zero, -32(a0)
  233. sd zero, -24(a0)
  234. sd zero, -16(a0)
  235. sd zero, -8(a0)
  236. bne AT, a0, 1b
  237. jr ra
  238. END(r4k_clear_page_s128)
  239. /*
  240.  * This is still inefficient.  We only can do better if we know the
  241.  * virtual address where the copy will be accessed.
  242.  */
  243. LEAF(r4k_copy_page_d16)
  244. addiu AT, a0, _PAGE_SIZE
  245. 1: cache Create_Dirty_Excl_D, (a0)
  246. lw a3, (a1)
  247. lw a2, 4(a1)
  248. lw v1, 8(a1)
  249. lw v0, 12(a1)
  250. sw a3, (a0)
  251. sw a2, 4(a0)
  252. sw v1, 8(a0)
  253. sw v0, 12(a0)
  254. cache Create_Dirty_Excl_D, 16(a0)
  255. lw a3, 16(a1)
  256. lw a2, 20(a1)
  257. lw v1, 24(a1)
  258. lw v0, 28(a1)
  259. sw a3, 16(a0)
  260. sw a2, 20(a0)
  261. sw v1, 24(a0)
  262. sw v0, 28(a0)
  263. cache Create_Dirty_Excl_D, 32(a0)
  264. addiu a0, 64
  265. addiu a1, 64
  266. lw a3, -32(a1)
  267. lw a2, -28(a1)
  268. lw v1, -24(a1)
  269. lw v0, -20(a1)
  270. sw a3, -32(a0)
  271. sw a2, -28(a0)
  272. sw v1, -24(a0)
  273. sw v0, -20(a0)
  274. cache Create_Dirty_Excl_D, -16(a0)
  275. lw a3, -16(a1)
  276. lw a2, -12(a1)
  277. lw v1, -8(a1)
  278. lw v0, -4(a1)
  279. sw a3, -16(a0)
  280. sw a2, -12(a0)
  281. sw v1, -8(a0)
  282. sw v0, -4(a0)
  283. bne AT, a0, 1b
  284. jr ra
  285. END(r4k_copy_page_d16)
  286. LEAF(r4k_copy_page_d32)
  287. addiu AT, a0, _PAGE_SIZE
  288. 1: cache Create_Dirty_Excl_D, (a0)
  289. lw a3, (a1)
  290. lw a2, 4(a1)
  291. lw v1, 8(a1)
  292. lw v0, 12(a1)
  293. sw a3, (a0)
  294. sw a2, 4(a0)
  295. sw v1, 8(a0)
  296. sw v0, 12(a0)
  297. lw a3, 16(a1)
  298. lw a2, 20(a1)
  299. lw v1, 24(a1)
  300. lw v0, 28(a1)
  301. sw a3, 16(a0)
  302. sw a2, 20(a0)
  303. sw v1, 24(a0)
  304. sw v0, 28(a0)
  305. cache Create_Dirty_Excl_D, 32(a0)
  306. addiu a0, 64
  307. addiu a1, 64
  308. lw a3, -32(a1)
  309. lw a2, -28(a1)
  310. lw v1, -24(a1)
  311. lw v0, -20(a1)
  312. sw a3, -32(a0)
  313. sw a2, -28(a0)
  314. sw v1, -24(a0)
  315. sw v0, -20(a0)
  316. lw a3, -16(a1)
  317. lw a2, -12(a1)
  318. lw v1, -8(a1)
  319. lw v0, -4(a1)
  320. sw a3, -16(a0)
  321. sw a2, -12(a0)
  322. sw v1, -8(a0)
  323. sw v0, -4(a0)
  324. bne AT, a0, 1b
  325. jr ra
  326. END(r4k_copy_page_d32)
  327. /*
  328.  * Again a special version for the R4600 V1.x
  329.  */
  330. LEAF(r4k_copy_page_r4600_v1)
  331. addiu AT, a0, _PAGE_SIZE
  332. 1: nop
  333. nop
  334. nop
  335. nop
  336. cache Create_Dirty_Excl_D, (a0)
  337. lw a3, (a1)
  338. lw a2, 4(a1)
  339. lw v1, 8(a1)
  340. lw v0, 12(a1)
  341. sw a3, (a0)
  342. sw a2, 4(a0)
  343. sw v1, 8(a0)
  344. sw v0, 12(a0)
  345. lw a3, 16(a1)
  346. lw a2, 20(a1)
  347. lw v1, 24(a1)
  348. lw v0, 28(a1)
  349. sw a3, 16(a0)
  350. sw a2, 20(a0)
  351. sw v1, 24(a0)
  352. sw v0, 28(a0)
  353. nop
  354. nop
  355. nop
  356. nop
  357. cache Create_Dirty_Excl_D, 32(a0)
  358. addiu a0, 64
  359. addiu a1, 64
  360. lw a3, -32(a1)
  361. lw a2, -28(a1)
  362. lw v1, -24(a1)
  363. lw v0, -20(a1)
  364. sw a3, -32(a0)
  365. sw a2, -28(a0)
  366. sw v1, -24(a0)
  367. sw v0, -20(a0)
  368. lw a3, -16(a1)
  369. lw a2, -12(a1)
  370. lw v1, -8(a1)
  371. lw v0, -4(a1)
  372. sw a3, -16(a0)
  373. sw a2, -12(a0)
  374. sw v1, -8(a0)
  375. sw v0, -4(a0)
  376. bne AT, a0, 1b
  377. jr ra
  378. END(r4k_copy_page_r4600_v1)
  379. LEAF(r4k_copy_page_r4600_v2)
  380. mfc0 v1, CP0_STATUS
  381. ori AT, v1, 1
  382. xori AT, 1
  383. mtc0 AT, CP0_STATUS
  384. nop
  385. nop
  386. nop
  387. addiu AT, a0, _PAGE_SIZE
  388. 1: nop
  389. nop
  390. nop
  391. nop
  392. cache Create_Dirty_Excl_D, (a0)
  393. lw t1, (a1)
  394. lw t0, 4(a1)
  395. lw a3, 8(a1)
  396. lw a2, 12(a1)
  397. sw t1, (a0)
  398. sw t0, 4(a0)
  399. sw a3, 8(a0)
  400. sw a2, 12(a0)
  401. lw t1, 16(a1)
  402. lw t0, 20(a1)
  403. lw a3, 24(a1)
  404. lw a2, 28(a1)
  405. sw t1, 16(a0)
  406. sw t0, 20(a0)
  407. sw a3, 24(a0)
  408. sw a2, 28(a0)
  409. nop
  410. nop
  411. nop
  412. nop
  413. cache Create_Dirty_Excl_D, 32(a0)
  414. addiu a0, 64
  415. addiu a1, 64
  416. lw t1, -32(a1)
  417. lw t0, -28(a1)
  418. lw a3, -24(a1)
  419. lw a2, -20(a1)
  420. sw t1, -32(a0)
  421. sw t0, -28(a0)
  422. sw a3, -24(a0)
  423. sw a2, -20(a0)
  424. lw t1, -16(a1)
  425. lw t0, -12(a1)
  426. lw a3, -8(a1)
  427. lw a2, -4(a1)
  428. sw t1, -16(a0)
  429. sw t0, -12(a0)
  430. sw a3, -8(a0)
  431. sw a2, -4(a0)
  432. bne AT, a0, 1b
  433. mfc0 AT, CP0_STATUS # __restore_flags
  434. andi v1, 1
  435. ori AT, 1
  436. xori AT, 1
  437. or v1, AT
  438. mtc0 v1, CP0_STATUS
  439. nop
  440. nop
  441. nop
  442. jr ra
  443. END(r4k_copy_page_r4600_v2)
  444. /*
  445.  * These are for R4000SC / R4400MC
  446.  */
  447. LEAF(r4k_copy_page_s16)
  448. addiu AT, a0, _PAGE_SIZE
  449. 1: cache Create_Dirty_Excl_SD, (a0)
  450. lw a3, (a1)
  451. lw a2, 4(a1)
  452. lw v1, 8(a1)
  453. lw v0, 12(a1)
  454. sw a3, (a0)
  455. sw a2, 4(a0)
  456. sw v1, 8(a0)
  457. sw v0, 12(a0)
  458. cache Create_Dirty_Excl_SD, 16(a0)
  459. lw a3, 16(a1)
  460. lw a2, 20(a1)
  461. lw v1, 24(a1)
  462. lw v0, 28(a1)
  463. sw a3, 16(a0)
  464. sw a2, 20(a0)
  465. sw v1, 24(a0)
  466. sw v0, 28(a0)
  467. cache Create_Dirty_Excl_SD, 32(a0)
  468. addiu a0, 64
  469. addiu a1, 64
  470. lw a3, -32(a1)
  471. lw a2, -28(a1)
  472. lw v1, -24(a1)
  473. lw v0, -20(a1)
  474. sw a3, -32(a0)
  475. sw a2, -28(a0)
  476. sw v1, -24(a0)
  477. sw v0, -20(a0)
  478. cache Create_Dirty_Excl_SD, -16(a0)
  479. lw a3, -16(a1)
  480. lw a2, -12(a1)
  481. lw v1, -8(a1)
  482. lw v0, -4(a1)
  483. sw a3, -16(a0)
  484. sw a2, -12(a0)
  485. sw v1, -8(a0)
  486. sw v0, -4(a0)
  487. bne AT, a0, 1b
  488. jr ra
  489. END(r4k_copy_page_s16)
  490. LEAF(r4k_copy_page_s32)
  491. addiu AT, a0, _PAGE_SIZE
  492. 1: cache Create_Dirty_Excl_SD, (a0)
  493. lw a3, (a1)
  494. lw a2, 4(a1)
  495. lw v1, 8(a1)
  496. lw v0, 12(a1)
  497. sw a3, (a0)
  498. sw a2, 4(a0)
  499. sw v1, 8(a0)
  500. sw v0, 12(a0)
  501. lw a3, 16(a1)
  502. lw a2, 20(a1)
  503. lw v1, 24(a1)
  504. lw v0, 28(a1)
  505. sw a3, 16(a0)
  506. sw a2, 20(a0)
  507. sw v1, 24(a0)
  508. sw v0, 28(a0)
  509. cache Create_Dirty_Excl_SD, 32(a0)
  510. addiu a0, 64
  511. addiu a1, 64
  512. lw a3, -32(a1)
  513. lw a2, -28(a1)
  514. lw v1, -24(a1)
  515. lw v0, -20(a1)
  516. sw a3, -32(a0)
  517. sw a2, -28(a0)
  518. sw v1, -24(a0)
  519. sw v0, -20(a0)
  520. lw a3, -16(a1)
  521. lw a2, -12(a1)
  522. lw v1, -8(a1)
  523. lw v0, -4(a1)
  524. sw a3, -16(a0)
  525. sw a2, -12(a0)
  526. sw v1, -8(a0)
  527. sw v0, -4(a0)
  528. bne AT, a0, 1b
  529. jr ra
  530. END(r4k_copy_page_s32)
  531. LEAF(r4k_copy_page_s64)
  532. addiu AT, a0, _PAGE_SIZE
  533. 1: cache Create_Dirty_Excl_SD, (a0)
  534. lw a3, (a1)
  535. lw a2, 4(a1)
  536. lw v1, 8(a1)
  537. lw v0, 12(a1)
  538. sw a3, (a0)
  539. sw a2, 4(a0)
  540. sw v1, 8(a0)
  541. sw v0, 12(a0)
  542. lw a3, 16(a1)
  543. lw a2, 20(a1)
  544. lw v1, 24(a1)
  545. lw v0, 28(a1)
  546. sw a3, 16(a0)
  547. sw a2, 20(a0)
  548. sw v1, 24(a0)
  549. sw v0, 28(a0)
  550. addiu a0, 64
  551. addiu a1, 64
  552. lw a3, -32(a1)
  553. lw a2, -28(a1)
  554. lw v1, -24(a1)
  555. lw v0, -20(a1)
  556. sw a3, -32(a0)
  557. sw a2, -28(a0)
  558. sw v1, -24(a0)
  559. sw v0, -20(a0)
  560. lw a3, -16(a1)
  561. lw a2, -12(a1)
  562. lw v1, -8(a1)
  563. lw v0, -4(a1)
  564. sw a3, -16(a0)
  565. sw a2, -12(a0)
  566. sw v1, -8(a0)
  567. sw v0, -4(a0)
  568. bne AT, a0, 1b
  569. jr ra
  570. END(r4k_copy_page_s64)
  571. LEAF(r4k_copy_page_s128)
  572. addiu AT, a0, _PAGE_SIZE
  573. 1: cache Create_Dirty_Excl_SD, (a0)
  574. lw a3, (a1)
  575. lw a2, 4(a1)
  576. lw v1, 8(a1)
  577. lw v0, 12(a1)
  578. sw a3, (a0)
  579. sw a2, 4(a0)
  580. sw v1, 8(a0)
  581. sw v0, 12(a0)
  582. lw a3, 16(a1)
  583. lw a2, 20(a1)
  584. lw v1, 24(a1)
  585. lw v0, 28(a1)
  586. sw a3, 16(a0)
  587. sw a2, 20(a0)
  588. sw v1, 24(a0)
  589. sw v0, 28(a0)
  590. lw a3, 32(a1)
  591. lw a2, 36(a1)
  592. lw v1, 40(a1)
  593. lw v0, 44(a1)
  594. sw a3, 32(a0)
  595. sw a2, 36(a0)
  596. sw v1, 40(a0)
  597. sw v0, 44(a0)
  598. lw a3, 48(a1)
  599. lw a2, 52(a1)
  600. lw v1, 56(a1)
  601. lw v0, 60(a1)
  602. sw a3, 48(a0)
  603. sw a2, 52(a0)
  604. sw v1, 56(a0)
  605. sw v0, 60(a0)
  606. addiu a0, 128
  607. addiu a1, 128
  608. lw a3, -64(a1)
  609. lw a2, -60(a1)
  610. lw v1, -56(a1)
  611. lw v0, -52(a1)
  612. sw a3, -64(a0)
  613. sw a2, -60(a0)
  614. sw v1, -56(a0)
  615. sw v0, -52(a0)
  616. lw a3, -48(a1)
  617. lw a2, -44(a1)
  618. lw v1, -40(a1)
  619. lw v0, -36(a1)
  620. sw a3, -48(a0)
  621. sw a2, -44(a0)
  622. sw v1, -40(a0)
  623. sw v0, -36(a0)
  624. lw a3, -32(a1)
  625. lw a2, -28(a1)
  626. lw v1, -24(a1)
  627. lw v0, -20(a1)
  628. sw a3, -32(a0)
  629. sw a2, -28(a0)
  630. sw v1, -24(a0)
  631. sw v0, -20(a0)
  632. lw a3, -16(a1)
  633. lw a2, -12(a1)
  634. lw v1, -8(a1)
  635. lw v0, -4(a1)
  636. sw a3, -16(a0)
  637. sw a2, -12(a0)
  638. sw v1, -8(a0)
  639. sw v0, -4(a0)
  640. bne AT, a0, 1b
  641. jr ra
  642. END(r4k_copy_page_s128)
  643. /* This one still needs to receive cache optimizations  */
  644. LEAF(pgd_init)
  645. addiu AT, a0, PGD_SIZE / 2
  646. la v0, invalid_pte_table
  647. 1: sw v0, (a0)
  648. sw v0, 4(a0)
  649. sw v0, 8(a0)
  650. sw v0, 12(a0)
  651. addiu a0, 32
  652. sw v0, -16(a0)
  653. sw v0, -12(a0)
  654. sw v0, -8(a0)
  655. sw v0, -4(a0)
  656. bne AT, a0, 1b
  657. jr ra
  658. END(pgd_init)