This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / arch / sh64 / lib / page_clear.S
1 /*
2    Copyright 2003 Richard Curnow, SuperH (UK) Ltd.
3
4    This file is subject to the terms and conditions of the GNU General Public
5    License.  See the file "COPYING" in the main directory of this archive
6    for more details.
7
8    Tight version of memset for the case of just clearing a page.  It turns out
9    that having the alloco's spaced out slightly due to the increment/branch
10    pair causes them to contend less for access to the cache.  Similarly,
11    keeping the stores apart from the allocos causes less contention.  => Do two
12    separate loops.  Do multiple stores per loop to amortise the
13    increment/branch cost a little.
14
15    Parameters:
16    r2 : source effective address (start of page)
17
18    Always clears 4096 bytes.
19
20 */
21
22         .section .text..SHmedia32,"ax"
23         .little
24
25         .balign 8
26         .global sh64_page_clear
27 sh64_page_clear:
28         pta/l 1f, tr1
29         pta/l 2f, tr2
30         ptabs/l r18, tr0
31
32         movi 4096, r7
33         add  r2, r7, r7
34         add  r2, r63, r6
35 1:
36         alloco r6, 0
37         addi    r6, 32, r6
38         bgt/l   r7, r6, tr1
39
40         add  r2, r63, r6
41 2:
42         st.q  r6,   0, r63
43         st.q  r6,   8, r63
44         st.q  r6,  16, r63
45         st.q  r6,  24, r63
46         addi r6, 32, r6
47         bgt/l r7, r6, tr2
48
49         blink tr0, r63
50
51