Merge commit '63cc8c75156462d4b42cbdd76c293b7eee7ddbfe':
[linux-2.6] / arch / sh / lib64 / clear_page.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    Note : alloco guarded by synco to avoid TAKum03020 erratum
21
22 */
23
24         .section .text..SHmedia32,"ax"
25         .little
26
27         .balign 8
28         .global clear_page
29 clear_page:
30         pta/l 1f, tr1
31         pta/l 2f, tr2
32         ptabs/l r18, tr0
33
34         movi 4096, r7
35         add  r2, r7, r7
36         add  r2, r63, r6
37 1:
38         alloco r6, 0
39         synco   ! TAKum03020
40         addi    r6, 32, r6
41         bgt/l   r7, r6, tr1
42
43         add  r2, r63, r6
44 2:
45         st.q  r6,   0, r63
46         st.q  r6,   8, r63
47         st.q  r6,  16, r63
48         st.q  r6,  24, r63
49         addi r6, 32, r6
50         bgt/l r7, r6, tr2
51
52         blink tr0, r63
53
54