Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid
[cascardo/linux.git] / arch / arm / lib / copy_page.S
1 /*
2  *  linux/arch/arm/lib/copypage.S
3  *
4  *  Copyright (C) 1995-1999 Russell King
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  *  ASM optimised string functions
11  */
12 #include <linux/linkage.h>
13 #include <asm/assembler.h>
14 #include <asm/asm-offsets.h>
15 #include <asm/cache.h>
16 #include <asm/export.h>
17
18 #define COPY_COUNT (PAGE_SZ / (2 * L1_CACHE_BYTES) PLD( -1 ))
19
20                 .text
21                 .align  5
22 /*
23  * StrongARM optimised copy_page routine
24  * now 1.78bytes/cycle, was 1.60 bytes/cycle (50MHz bus -> 89MB/s)
25  * Note that we probably achieve closer to the 100MB/s target with
26  * the core clock switching.
27  */
28 ENTRY(copy_page)
29                 stmfd   sp!, {r4, lr}                   @       2
30         PLD(    pld     [r1, #0]                )
31         PLD(    pld     [r1, #L1_CACHE_BYTES]           )
32                 mov     r2, #COPY_COUNT                 @       1
33                 ldmia   r1!, {r3, r4, ip, lr}           @       4+1
34 1:      PLD(    pld     [r1, #2 * L1_CACHE_BYTES])
35         PLD(    pld     [r1, #3 * L1_CACHE_BYTES])
36 2:
37         .rept   (2 * L1_CACHE_BYTES / 16 - 1)
38                 stmia   r0!, {r3, r4, ip, lr}           @       4
39                 ldmia   r1!, {r3, r4, ip, lr}           @       4
40         .endr
41                 subs    r2, r2, #1                      @       1
42                 stmia   r0!, {r3, r4, ip, lr}           @       4
43                 ldmgtia r1!, {r3, r4, ip, lr}           @       4
44                 bgt     1b                              @       1
45         PLD(    ldmeqia r1!, {r3, r4, ip, lr}   )
46         PLD(    beq     2b                      )
47                 ldmfd   sp!, {r4, pc}                   @       3
48 ENDPROC(copy_page)
49 EXPORT_SYMBOL(copy_page)