GNU Linux-libre 4.19.264-gnu1
[releases.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
17 #define COPY_COUNT (PAGE_SZ / (2 * L1_CACHE_BYTES) PLD( -1 ))
18
19                 .text
20                 .align  5
21 /*
22  * StrongARM optimised copy_page routine
23  * now 1.78bytes/cycle, was 1.60 bytes/cycle (50MHz bus -> 89MB/s)
24  * Note that we probably achieve closer to the 100MB/s target with
25  * the core clock switching.
26  */
27 ENTRY(copy_page)
28                 stmfd   sp!, {r4, lr}                   @       2
29         PLD(    pld     [r1, #0]                )
30         PLD(    pld     [r1, #L1_CACHE_BYTES]           )
31                 mov     r2, #COPY_COUNT                 @       1
32                 ldmia   r1!, {r3, r4, ip, lr}           @       4+1
33 1:      PLD(    pld     [r1, #2 * L1_CACHE_BYTES])
34         PLD(    pld     [r1, #3 * L1_CACHE_BYTES])
35 2:
36         .rept   (2 * L1_CACHE_BYTES / 16 - 1)
37                 stmia   r0!, {r3, r4, ip, lr}           @       4
38                 ldmia   r1!, {r3, r4, ip, lr}           @       4
39         .endr
40                 subs    r2, r2, #1                      @       1
41                 stmia   r0!, {r3, r4, ip, lr}           @       4
42                 ldmgtia r1!, {r3, r4, ip, lr}           @       4
43                 bgt     1b                              @       1
44         PLD(    ldmeqia r1!, {r3, r4, ip, lr}   )
45         PLD(    beq     2b                      )
46                 ldmfd   sp!, {r4, pc}                   @       3
47 ENDPROC(copy_page)