Move pgd_init and pmd_init to their own files.
[linux-2.6/linux-mips.git] / arch / mips / mm-32 / pg-r4k.S
blobbe1fb6bf6945ec076d34be571f674af039919db6
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>
19 #ifdef CONFIG_64BIT_PHYS_ADDR
20 #define PGD_SIZE        0x2000
21 #else
22 #define PGD_SIZE        0x1000
23 #endif
25         .text
26         .set    noat
29  * Zero an entire page.  Basically a simple unrolled loop should do the
30  * job but we want more performance by saving memory bus bandwidth.  We
31  * have five flavours of the routine available for:
32  *
33  * - 16byte cachelines and no second level cache
34  * - 32byte cachelines second level cache
35  * - a version which handles the buggy R4600 v1.x
36  * - a version which handles the buggy R4600 v2.0
37  * - Finally a last version without fancy cache games for the SC and MC
38  *   versions of R4000 and R4400.
39  */
41 LEAF(r4k_clear_page32_d16)
42         .set    mips3
43         addiu   AT, a0, _PAGE_SIZE
44 1:      cache   Create_Dirty_Excl_D, (a0)
45         sw      zero, (a0)
46         sw      zero, 4(a0)
47         sw      zero, 8(a0)
48         sw      zero, 12(a0)
49         addiu   a0, 32
50         cache   Create_Dirty_Excl_D, -16(a0)
51         sw      zero, -16(a0)
52         sw      zero, -12(a0)
53         sw      zero, -8(a0)
54         sw      zero, -4(a0)
55         bne     AT, a0, 1b
56         jr      ra
57         END(r4k_clear_page32_d16)
59 LEAF(r4k_clear_page32_d32)
60         .set    mips3
61         addiu   AT, a0, _PAGE_SIZE
62 1:      cache   Create_Dirty_Excl_D, (a0)
63         sw      zero, (a0)
64         sw      zero, 4(a0)
65         sw      zero, 8(a0)
66         sw      zero, 12(a0)
67         addiu   a0, 32
68         sw      zero, -16(a0)
69         sw      zero, -12(a0)
70         sw      zero, -8(a0)
71         sw      zero, -4(a0)
72         bne     AT, a0, 1b
73         jr      ra
74         END(r4k_clear_page32_d32)
76 LEAF(r4k_clear_page_d16)
77         .set    mips3
78         addiu   AT, a0, _PAGE_SIZE
79 1:      cache   Create_Dirty_Excl_D, (a0)
80         sd      zero, (a0)
81         sd      zero, 8(a0)
82         cache   Create_Dirty_Excl_D, 16(a0)
83         sd      zero, 16(a0)
84         sd      zero, 24(a0)
85         addiu   a0, 64
86         cache   Create_Dirty_Excl_D, -32(a0)
87         sd      zero, -32(a0)
88         sd      zero, -24(a0)
89         cache   Create_Dirty_Excl_D, -16(a0)
90         sd      zero, -16(a0)
91         sd      zero, -8(a0)
92         bne     AT, a0, 1b
93         jr      ra
94         END(r4k_clear_page_d16)
96 LEAF(r4k_clear_page_d32)
97         .set    mips3
98         addiu   AT, a0, _PAGE_SIZE
99 1:      cache   Create_Dirty_Excl_D, (a0)
100         sd      zero, (a0)
101         sd      zero, 8(a0)
102         sd      zero, 16(a0)
103         sd      zero, 24(a0)
104         addiu   a0, 64
105         cache   Create_Dirty_Excl_D, -32(a0)
106         sd      zero, -32(a0)
107         sd      zero, -24(a0)
108         sd      zero, -16(a0)
109         sd      zero, -8(a0)
110         bne     AT, a0, 1b
111         jr      ra
112         END(r4k_clear_page_d32)
115  * This flavour of r4k_clear_page is for the R4600 V1.x.  Cite from the
116  * IDT R4600 V1.7 errata:
118  *  18. The CACHE instructions Hit_Writeback_Invalidate_D, Hit_Writeback_D,
119  *      Hit_Invalidate_D and Create_Dirty_Excl_D should only be
120  *      executed if there is no other dcache activity. If the dcache is
121  *      accessed for another instruction immeidately preceding when these
122  *      cache instructions are executing, it is possible that the dcache
123  *      tag match outputs used by these cache instructions will be
124  *      incorrect. These cache instructions should be preceded by at least
125  *      four instructions that are not any kind of load or store
126  *      instruction.
128  *      This is not allowed:    lw
129  *                              nop
130  *                              nop
131  *                              nop
132  *                              cache       Hit_Writeback_Invalidate_D
134  *      This is allowed:        lw
135  *                              nop
136  *                              nop
137  *                              nop
138  *                              nop
139  *                              cache       Hit_Writeback_Invalidate_D
140  */
142 LEAF(r4k_clear_page_r4600_v1)
143         .set    mips3
144         addiu   AT, a0, _PAGE_SIZE
145 1:      nop
146         nop
147         nop
148         nop
149         cache   Create_Dirty_Excl_D, (a0)
150         sd      zero, (a0)
151         sd      zero, 8(a0)
152         sd      zero, 16(a0)
153         sd      zero, 24(a0)
154         addiu   a0, 64
155         nop
156         nop
157         nop
158         cache   Create_Dirty_Excl_D, -32(a0)
159         sd      zero, -32(a0)
160         sd      zero, -24(a0)
161         sd      zero, -16(a0)
162         sd      zero, -8(a0)
163         bne     AT, a0, 1b
164         jr      ra
165         END(r4k_clear_page_r4600_v1)
167 LEAF(r4k_clear_page_r4600_v2)
168         .set    mips3
169         mfc0    a1, CP0_STATUS
170         ori     AT, a1, 1
171         xori    AT, 1
172         mtc0    AT, CP0_STATUS
173         nop
174         nop
175         nop
177         .set    volatile
178         la      AT, KSEG1
179         lw      zero, (AT)
180         .set    novolatile
182         addiu   AT, a0, _PAGE_SIZE
183 1:      cache   Create_Dirty_Excl_D, (a0)
184         sd      zero, (a0)
185         sd      zero, 8(a0)
186         sd      zero, 16(a0)
187         sd      zero, 24(a0)
188         addiu   a0, 64
189         cache   Create_Dirty_Excl_D, -32(a0)
190         sd      zero, -32(a0)
191         sd      zero, -24(a0)
192         sd      zero, -16(a0)
193         sd      zero, -8(a0)
194         bne     AT, a0, 1b
196         mfc0    AT, CP0_STATUS                  # local_irq_restore
197         andi    a1, 1
198         ori     AT, 1
199         xori    AT, 1
200         or      a1, AT
201         mtc0    a1, CP0_STATUS
202         nop
203         nop
204         nop
206         jr      ra
207         END(r4k_clear_page_r4600_v2)
210  * The next 4 versions are optimized for all possible scache configurations
211  * of the SC / MC versions of R4000 and R4400 ...
213  * Todo: For even better performance we should have a routine optimized for
214  * every legal combination of dcache / scache linesize.  When I (Ralf) tried
215  * this the kernel crashed shortly after mounting the root filesystem.  CPU
216  * bug?  Weirdo cache instruction semantics?
217  */
219 LEAF(r4k_clear_page_s16)
220         .set    mips3
221         addiu   AT, a0, _PAGE_SIZE
222 1:      cache   Create_Dirty_Excl_SD, (a0)
223         sd      zero, (a0)
224         sd      zero, 8(a0)
225         cache   Create_Dirty_Excl_SD, 16(a0)
226         sd      zero, 16(a0)
227         sd      zero, 24(a0)
228         addiu   a0, 64
229         cache   Create_Dirty_Excl_SD, -32(a0)
230         sd      zero, -32(a0)
231         sd      zero, -24(a0)
232         cache   Create_Dirty_Excl_SD, -16(a0)
233         sd      zero, -16(a0)
234         sd      zero, -8(a0)
235         bne     AT, a0, 1b
236         jr      ra
237         END(r4k_clear_page_s16)
239 LEAF(r4k_clear_page_s32)
240         .set    mips3
241         addiu   AT, a0, _PAGE_SIZE
242 1:      cache   Create_Dirty_Excl_SD, (a0)
243         sd      zero, (a0)
244         sd      zero, 8(a0)
245         sd      zero, 16(a0)
246         sd      zero, 24(a0)
247         addiu   a0, 64
248         cache   Create_Dirty_Excl_SD, -32(a0)
249         sd      zero, -32(a0)
250         sd      zero, -24(a0)
251         sd      zero, -16(a0)
252         sd      zero, -8(a0)
253         bne     AT, a0, 1b
254         jr      ra
255         END(r4k_clear_page_s32)
257 LEAF(r4k_clear_page_s64)
258         .set    mips3
259         addiu   AT, a0, _PAGE_SIZE
260 1:      cache   Create_Dirty_Excl_SD, (a0)
261         sd      zero, (a0)
262         sd      zero, 8(a0)
263         sd      zero, 16(a0)
264         sd      zero, 24(a0)
265         addiu   a0, 64
266         sd      zero, -32(a0)
267         sd      zero, -24(a0)
268         sd      zero, -16(a0)
269         sd      zero, -8(a0)
270         bne     AT, a0, 1b
271         jr      ra
272         END(r4k_clear_page_s64)
274 LEAF(r4k_clear_page_s128)
275         .set    mips3
276         addiu   AT, a0, _PAGE_SIZE
277 1:      cache   Create_Dirty_Excl_SD, (a0)
278         sd      zero, (a0)
279         sd      zero, 8(a0)
280         sd      zero, 16(a0)
281         sd      zero, 24(a0)
282         sd      zero, 32(a0)
283         sd      zero, 40(a0)
284         sd      zero, 48(a0)
285         sd      zero, 56(a0)
286         addiu   a0, 128
287         sd      zero, -64(a0)
288         sd      zero, -56(a0)
289         sd      zero, -48(a0)
290         sd      zero, -40(a0)
291         sd      zero, -32(a0)
292         sd      zero, -24(a0)
293         sd      zero, -16(a0)
294         sd      zero, -8(a0)
295         bne     AT, a0, 1b
296         jr      ra
297         END(r4k_clear_page_s128)
300  * This is suboptimal for 32-bit kernels; we assume that R10000 is only used
301  * with 64-bit kernels.  The prefetch offsets have been experimentally tuned
302  * an Origin 200.
303  */
304 LEAF(andes_clear_page)
305         .set            mips4
306         LONG_ADDIU      AT, a0, _PAGE_SIZE
307 1:      pref            7, 512(a0)
308         sd              zero, 0*SZREG(a0)
309         sd              zero, 1*SZREG(a0)
310         sd              zero, 2*SZREG(a0)
311         sd              zero, 3*SZREG(a0)
312         LONG_ADDIU      a0, a0, 8*SZREG
313         sd              zero, -4*SZREG(a0)
314         sd              zero, -3*SZREG(a0)
315         sd              zero, -2*SZREG(a0)
316         sd              zero, -1*SZREG(a0)
317         bne             AT, a0, 1b
318         j               ra
319         END(andes_clear_page)
320         .set            mips0
323  * This is still inefficient.  We only can do better if we know the
324  * virtual address where the copy will be accessed.
325  */
327 LEAF(r4k_copy_page_d16)
328         .set    mips3
329         addiu   AT, a0, _PAGE_SIZE
330 1:      cache   Create_Dirty_Excl_D, (a0)
331         lw      a3, (a1)
332         lw      a2, 4(a1)
333         lw      v1, 8(a1)
334         lw      v0, 12(a1)
335         sw      a3, (a0)
336         sw      a2, 4(a0)
337         sw      v1, 8(a0)
338         sw      v0, 12(a0)
339         cache   Create_Dirty_Excl_D, 16(a0)
340         lw      a3, 16(a1)
341         lw      a2, 20(a1)
342         lw      v1, 24(a1)
343         lw      v0, 28(a1)
344         sw      a3, 16(a0)
345         sw      a2, 20(a0)
346         sw      v1, 24(a0)
347         sw      v0, 28(a0)
348         cache   Create_Dirty_Excl_D, 32(a0)
349         addiu   a0, 64
350         addiu   a1, 64
351         lw      a3, -32(a1)
352         lw      a2, -28(a1)
353         lw      v1, -24(a1)
354         lw      v0, -20(a1)
355         sw      a3, -32(a0)
356         sw      a2, -28(a0)
357         sw      v1, -24(a0)
358         sw      v0, -20(a0)
359         cache   Create_Dirty_Excl_D, -16(a0)
360         lw      a3, -16(a1)
361         lw      a2, -12(a1)
362         lw      v1, -8(a1)
363         lw      v0, -4(a1)
364         sw      a3, -16(a0)
365         sw      a2, -12(a0)
366         sw      v1, -8(a0)
367         sw      v0, -4(a0)
368         bne     AT, a0, 1b
369         jr      ra
370         END(r4k_copy_page_d16)
372 LEAF(r4k_copy_page_d32)
373         .set    mips3
374         addiu   AT, a0, _PAGE_SIZE
375 1:      cache   Create_Dirty_Excl_D, (a0)
376         lw      a3, (a1)
377         lw      a2, 4(a1)
378         lw      v1, 8(a1)
379         lw      v0, 12(a1)
380         sw      a3, (a0)
381         sw      a2, 4(a0)
382         sw      v1, 8(a0)
383         sw      v0, 12(a0)
384         lw      a3, 16(a1)
385         lw      a2, 20(a1)
386         lw      v1, 24(a1)
387         lw      v0, 28(a1)
388         sw      a3, 16(a0)
389         sw      a2, 20(a0)
390         sw      v1, 24(a0)
391         sw      v0, 28(a0)
392         cache   Create_Dirty_Excl_D, 32(a0)
393         addiu   a0, 64
394         addiu   a1, 64
395         lw      a3, -32(a1)
396         lw      a2, -28(a1)
397         lw      v1, -24(a1)
398         lw      v0, -20(a1)
399         sw      a3, -32(a0)
400         sw      a2, -28(a0)
401         sw      v1, -24(a0)
402         sw      v0, -20(a0)
403         lw      a3, -16(a1)
404         lw      a2, -12(a1)
405         lw      v1, -8(a1)
406         lw      v0, -4(a1)
407         sw      a3, -16(a0)
408         sw      a2, -12(a0)
409         sw      v1, -8(a0)
410         sw      v0, -4(a0)
411         bne     AT, a0, 1b
412         jr      ra
413         END(r4k_copy_page_d32)
416  * Again a special version for the R4600 V1.x
417  */
419 LEAF(r4k_copy_page_r4600_v1)
420         .set    mips3
421         addiu   AT, a0, _PAGE_SIZE
422 1:      nop
423         nop
424         nop
425         nop
426         cache   Create_Dirty_Excl_D, (a0)
427         lw      a3, (a1)
428         lw      a2, 4(a1)
429         lw      v1, 8(a1)
430         lw      v0, 12(a1)
431         sw      a3, (a0)
432         sw      a2, 4(a0)
433         sw      v1, 8(a0)
434         sw      v0, 12(a0)
435         lw      a3, 16(a1)
436         lw      a2, 20(a1)
437         lw      v1, 24(a1)
438         lw      v0, 28(a1)
439         sw      a3, 16(a0)
440         sw      a2, 20(a0)
441         sw      v1, 24(a0)
442         sw      v0, 28(a0)
443         nop
444         nop
445         nop
446         nop
447         cache   Create_Dirty_Excl_D, 32(a0)
448         addiu   a0, 64
449         addiu   a1, 64
450         lw      a3, -32(a1)
451         lw      a2, -28(a1)
452         lw      v1, -24(a1)
453         lw      v0, -20(a1)
454         sw      a3, -32(a0)
455         sw      a2, -28(a0)
456         sw      v1, -24(a0)
457         sw      v0, -20(a0)
458         lw      a3, -16(a1)
459         lw      a2, -12(a1)
460         lw      v1, -8(a1)
461         lw      v0, -4(a1)
462         sw      a3, -16(a0)
463         sw      a2, -12(a0)
464         sw      v1, -8(a0)
465         sw      v0, -4(a0)
466         bne     AT, a0, 1b
467         jr      ra
468         END(r4k_copy_page_r4600_v1)
470 LEAF(r4k_copy_page_r4600_v2)
471         .set    mips3
472         mfc0    v1, CP0_STATUS
473         ori     AT, v1, 1
474         xori    AT, 1
476         mtc0    AT, CP0_STATUS
477         nop
478         nop
479         nop
481         addiu   AT, a0, _PAGE_SIZE
482 1:      nop
483         nop
484         nop
485         nop
486         cache   Create_Dirty_Excl_D, (a0)
487         lw      t1, (a1)
488         lw      t0, 4(a1)
489         lw      a3, 8(a1)
490         lw      a2, 12(a1)
491         sw      t1, (a0)
492         sw      t0, 4(a0)
493         sw      a3, 8(a0)
494         sw      a2, 12(a0)
495         lw      t1, 16(a1)
496         lw      t0, 20(a1)
497         lw      a3, 24(a1)
498         lw      a2, 28(a1)
499         sw      t1, 16(a0)
500         sw      t0, 20(a0)
501         sw      a3, 24(a0)
502         sw      a2, 28(a0)
503         nop
504         nop
505         nop
506         nop
507         cache   Create_Dirty_Excl_D, 32(a0)
508         addiu   a0, 64
509         addiu   a1, 64
510         lw      t1, -32(a1)
511         lw      t0, -28(a1)
512         lw      a3, -24(a1)
513         lw      a2, -20(a1)
514         sw      t1, -32(a0)
515         sw      t0, -28(a0)
516         sw      a3, -24(a0)
517         sw      a2, -20(a0)
518         lw      t1, -16(a1)
519         lw      t0, -12(a1)
520         lw      a3, -8(a1)
521         lw      a2, -4(a1)
522         sw      t1, -16(a0)
523         sw      t0, -12(a0)
524         sw      a3, -8(a0)
525         sw      a2, -4(a0)
526         bne     AT, a0, 1b
528         mfc0    AT, CP0_STATUS                  # local_irq_restore
529         andi    v1, 1
530         ori     AT, 1
531         xori    AT, 1
532         or      v1, AT
533         mtc0    v1, CP0_STATUS
534         nop
535         nop
536         nop
537         jr      ra
538         END(r4k_copy_page_r4600_v2)
541  * These are for R4000SC / R4400MC
542  */
544 LEAF(r4k_copy_page_s16)
545         .set    mips3
546         addiu   AT, a0, _PAGE_SIZE
547 1:      cache   Create_Dirty_Excl_SD, (a0)
548         lw      a3, (a1)
549         lw      a2, 4(a1)
550         lw      v1, 8(a1)
551         lw      v0, 12(a1)
552         sw      a3, (a0)
553         sw      a2, 4(a0)
554         sw      v1, 8(a0)
555         sw      v0, 12(a0)
556         cache   Create_Dirty_Excl_SD, 16(a0)
557         lw      a3, 16(a1)
558         lw      a2, 20(a1)
559         lw      v1, 24(a1)
560         lw      v0, 28(a1)
561         sw      a3, 16(a0)
562         sw      a2, 20(a0)
563         sw      v1, 24(a0)
564         sw      v0, 28(a0)
565         cache   Create_Dirty_Excl_SD, 32(a0)
566         addiu   a0, 64
567         addiu   a1, 64
568         lw      a3, -32(a1)
569         lw      a2, -28(a1)
570         lw      v1, -24(a1)
571         lw      v0, -20(a1)
572         sw      a3, -32(a0)
573         sw      a2, -28(a0)
574         sw      v1, -24(a0)
575         sw      v0, -20(a0)
576         cache   Create_Dirty_Excl_SD, -16(a0)
577         lw      a3, -16(a1)
578         lw      a2, -12(a1)
579         lw      v1, -8(a1)
580         lw      v0, -4(a1)
581         sw      a3, -16(a0)
582         sw      a2, -12(a0)
583         sw      v1, -8(a0)
584         sw      v0, -4(a0)
585         bne     AT, a0, 1b
586         jr      ra
587         END(r4k_copy_page_s16)
589 LEAF(r4k_copy_page_s32)
590         .set    mips3
591         addiu   AT, a0, _PAGE_SIZE
592 1:      cache   Create_Dirty_Excl_SD, (a0)
593         lw      a3, (a1)
594         lw      a2, 4(a1)
595         lw      v1, 8(a1)
596         lw      v0, 12(a1)
597         sw      a3, (a0)
598         sw      a2, 4(a0)
599         sw      v1, 8(a0)
600         sw      v0, 12(a0)
601         lw      a3, 16(a1)
602         lw      a2, 20(a1)
603         lw      v1, 24(a1)
604         lw      v0, 28(a1)
605         sw      a3, 16(a0)
606         sw      a2, 20(a0)
607         sw      v1, 24(a0)
608         sw      v0, 28(a0)
609         cache   Create_Dirty_Excl_SD, 32(a0)
610         addiu   a0, 64
611         addiu   a1, 64
612         lw      a3, -32(a1)
613         lw      a2, -28(a1)
614         lw      v1, -24(a1)
615         lw      v0, -20(a1)
616         sw      a3, -32(a0)
617         sw      a2, -28(a0)
618         sw      v1, -24(a0)
619         sw      v0, -20(a0)
620         lw      a3, -16(a1)
621         lw      a2, -12(a1)
622         lw      v1, -8(a1)
623         lw      v0, -4(a1)
624         sw      a3, -16(a0)
625         sw      a2, -12(a0)
626         sw      v1, -8(a0)
627         sw      v0, -4(a0)
628         bne     AT, a0, 1b
629         jr      ra
630         END(r4k_copy_page_s32)
632 LEAF(r4k_copy_page_s64)
633         .set    mips3
634         addiu   AT, a0, _PAGE_SIZE
635 1:      cache   Create_Dirty_Excl_SD, (a0)
636         lw      a3, (a1)
637         lw      a2, 4(a1)
638         lw      v1, 8(a1)
639         lw      v0, 12(a1)
640         sw      a3, (a0)
641         sw      a2, 4(a0)
642         sw      v1, 8(a0)
643         sw      v0, 12(a0)
644         lw      a3, 16(a1)
645         lw      a2, 20(a1)
646         lw      v1, 24(a1)
647         lw      v0, 28(a1)
648         sw      a3, 16(a0)
649         sw      a2, 20(a0)
650         sw      v1, 24(a0)
651         sw      v0, 28(a0)
652         addiu   a0, 64
653         addiu   a1, 64
654         lw      a3, -32(a1)
655         lw      a2, -28(a1)
656         lw      v1, -24(a1)
657         lw      v0, -20(a1)
658         sw      a3, -32(a0)
659         sw      a2, -28(a0)
660         sw      v1, -24(a0)
661         sw      v0, -20(a0)
662         lw      a3, -16(a1)
663         lw      a2, -12(a1)
664         lw      v1, -8(a1)
665         lw      v0, -4(a1)
666         sw      a3, -16(a0)
667         sw      a2, -12(a0)
668         sw      v1, -8(a0)
669         sw      v0, -4(a0)
670         bne     AT, a0, 1b
671         jr      ra
672         END(r4k_copy_page_s64)
674 LEAF(r4k_copy_page_s128)
675         .set    mips3
676         addiu   AT, a0, _PAGE_SIZE
677 1:      cache   Create_Dirty_Excl_SD, (a0)
678         lw      a3, (a1)
679         lw      a2, 4(a1)
680         lw      v1, 8(a1)
681         lw      v0, 12(a1)
682         sw      a3, (a0)
683         sw      a2, 4(a0)
684         sw      v1, 8(a0)
685         sw      v0, 12(a0)
686         lw      a3, 16(a1)
687         lw      a2, 20(a1)
688         lw      v1, 24(a1)
689         lw      v0, 28(a1)
690         sw      a3, 16(a0)
691         sw      a2, 20(a0)
692         sw      v1, 24(a0)
693         sw      v0, 28(a0)
694         lw      a3, 32(a1)
695         lw      a2, 36(a1)
696         lw      v1, 40(a1)
697         lw      v0, 44(a1)
698         sw      a3, 32(a0)
699         sw      a2, 36(a0)
700         sw      v1, 40(a0)
701         sw      v0, 44(a0)
702         lw      a3, 48(a1)
703         lw      a2, 52(a1)
704         lw      v1, 56(a1)
705         lw      v0, 60(a1)
706         sw      a3, 48(a0)
707         sw      a2, 52(a0)
708         sw      v1, 56(a0)
709         sw      v0, 60(a0)
710         addiu   a0, 128
711         addiu   a1, 128
712         lw      a3, -64(a1)
713         lw      a2, -60(a1)
714         lw      v1, -56(a1)
715         lw      v0, -52(a1)
716         sw      a3, -64(a0)
717         sw      a2, -60(a0)
718         sw      v1, -56(a0)
719         sw      v0, -52(a0)
720         lw      a3, -48(a1)
721         lw      a2, -44(a1)
722         lw      v1, -40(a1)
723         lw      v0, -36(a1)
724         sw      a3, -48(a0)
725         sw      a2, -44(a0)
726         sw      v1, -40(a0)
727         sw      v0, -36(a0)
728         lw      a3, -32(a1)
729         lw      a2, -28(a1)
730         lw      v1, -24(a1)
731         lw      v0, -20(a1)
732         sw      a3, -32(a0)
733         sw      a2, -28(a0)
734         sw      v1, -24(a0)
735         sw      v0, -20(a0)
736         lw      a3, -16(a1)
737         lw      a2, -12(a1)
738         lw      v1, -8(a1)
739         lw      v0, -4(a1)
740         sw      a3, -16(a0)
741         sw      a2, -12(a0)
742         sw      v1, -8(a0)
743         sw      v0, -4(a0)
744         bne     AT, a0, 1b
745         jr      ra
746         END(r4k_copy_page_s128)
749         .text
750         .set    mips4
751         .set    noat
755  * This is suboptimal for 32-bit kernels; we assume that R10000 is only used
756  * with 64-bit kernels.  The prefetch offsets have been experimentally tuned
757  * an Origin 200.
758  */
759 LEAF(andes_copy_page)
760         .set            mips4
761         LONG_ADDIU      AT, a0, _PAGE_SIZE
762 1:      pref            0, 2*128(a1)
763         pref            1, 2*128(a0)
764         LONG_L          a3, 0*SZREG(a1)
765         LONG_L          a2, 1*SZREG(a1)
766         LONG_L          v1, 2*SZREG(a1)
767         LONG_L          v0, 3*SZREG(a1)
768         LONG_S          a3, 0*SZREG(a0)
769         LONG_S          a2, 1*SZREG(a0)
770         LONG_S          v1, 2*SZREG(a0)
771         LONG_S          v0, 3*SZREG(a0)
772         LONG_ADDIU      a0, a0, 8*SZREG
773         LONG_ADDIU      a1, a1, 8*SZREG
774         LONG_L          a3, -4*SZREG(a1)
775         LONG_L          a2, -3*SZREG(a1)
776         LONG_L          v1, -2*SZREG(a1)
777         LONG_L          v0, -1*SZREG(a1)
778         LONG_S          a3, -4*SZREG(a0)
779         LONG_S          a2, -3*SZREG(a0)
780         LONG_S          v1, -2*SZREG(a0)
781         LONG_S          v0, -1*SZREG(a0)
782         bne             AT, a0,1b
783         j               ra
784         END(andes_copy_page)
785         .set            mips0