[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/arm/arm/bcopy_page.S

Version: -  FREEBSD  -  FREEBSD7  -  FREEBSD71  -  FREEBSD70  -  FREEBSD6  -  FREEBSD64  -  FREEBSD63  -  FREEBSD62  -  FREEBSD61  -  FREEBSD60  -  FREEBSD5  -  FREEBSD55  -  FREEBSD54  -  FREEBSD53  -  FREEBSD52  -  FREEBSD51  -  FREEBSD50  -  FREEBSD4  -  FREEBSD3  -  FREEBSD22  -  linux-2.6  -  linux-2.4.22  -  MK83  -  MK84  -  PLAN9  -  DFBSD  -  NETBSD  -  NETBSD5  -  NETBSD4  -  NETBSD3  -  NETBSD20  -  OPENBSD  -  xnu-517  -  xnu-792  -  xnu-792.6.70  -  xnu-1228  -  OPENSOLARIS  -  minix-3-1-1  -  TRUSTEDBSD-SEBSD  -  FREEBSD-LIBC  -  FREEBSD7-LIBC  -  FREEBSD6-LIBC  -  GLIBC27 
SearchContext: -  none  -  excerpts  -  bigexcerpts 

  1 /*      $NetBSD: bcopy_page.S,v 1.7 2003/10/13 21:03:13 scw Exp $       */
  2 
  3 /*-
  4  * Copyright (c) 1995 Scott Stevens
  5  * All rights reserved.
  6  *
  7  * Redistribution and use in source and binary forms, with or without
  8  * modification, are permitted provided that the following conditions
  9  * are met:
 10  * 1. Redistributions of source code must retain the above copyright
 11  *    notice, this list of conditions and the following disclaimer.
 12  * 2. Redistributions in binary form must reproduce the above copyright
 13  *    notice, this list of conditions and the following disclaimer in the
 14  *    documentation and/or other materials provided with the distribution.
 15  * 3. All advertising materials mentioning features or use of this software
 16  *    must display the following acknowledgement:
 17  *      This product includes software developed by Scott Stevens.
 18  * 4. The name of the author may not be used to endorse or promote products
 19  *    derived from this software without specific prior written permission.
 20  *
 21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 22  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 23  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 24  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 26  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 30  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 31  *
 32  * RiscBSD kernel project
 33  *
 34  * bcopy_page.S
 35  *
 36  * page optimised bcopy and bzero routines
 37  *
 38  * Created      : 08/04/95
 39  */
 40 
 41 #include <machine/asm.h>
 42 
 43 __FBSDID("$FreeBSD: src/sys/arm/arm/bcopy_page.S,v 1.5 2007/10/13 12:05:03 cognet Exp $");
 44 
 45 #include "assym.s"
 46 
 47 #ifndef _ARM_ARCH_5E
 48 
 49 /* #define BIG_LOOPS */
 50 
 51 /*
 52  * bcopy_page(src, dest)
 53  *
 54  * Optimised copy page routine.
 55  *
 56  * On entry:
 57  *   r0 - src address
 58  *   r1 - dest address
 59  *
 60  * Requires:
 61  *   number of bytes per page (PAGE_SIZE) is a multiple of 512 (BIG_LOOPS), 128
 62  *   otherwise.
 63  */
 64 
 65 #define CHUNK_SIZE      32
 66 
 67 #define PREFETCH_FIRST_CHUNK    /* nothing */
 68 #define PREFETCH_NEXT_CHUNK     /* nothing */
 69 
 70 #ifndef COPY_CHUNK
 71 #define COPY_CHUNK \
 72         PREFETCH_NEXT_CHUNK ; \
 73         ldmia   r0!, {r3-r8,ip,lr} ; \
 74         stmia   r1!, {r3-r8,ip,lr}
 75 #endif /* ! COPY_CHUNK */
 76 
 77 #ifndef SAVE_REGS
 78 #define SAVE_REGS       stmfd   sp!, {r4-r8, lr}
 79 #define RESTORE_REGS    ldmfd   sp!, {r4-r8, pc}
 80 #endif
 81 
 82 ENTRY(bcopy_page)
 83         PREFETCH_FIRST_CHUNK
 84         SAVE_REGS
 85 #ifdef BIG_LOOPS
 86         mov     r2, #(PAGE_SIZE >> 9)
 87 #else
 88         mov     r2, #(PAGE_SIZE >> 7)
 89 #endif
 90 
 91 1:
 92         COPY_CHUNK
 93         COPY_CHUNK
 94         COPY_CHUNK
 95         COPY_CHUNK
 96 
 97 #ifdef BIG_LOOPS
 98         /* There is little point making the loop any larger; unless we are
 99            running with the cache off, the load/store overheads will
100            completely dominate this loop.  */
101         COPY_CHUNK
102         COPY_CHUNK
103         COPY_CHUNK
104         COPY_CHUNK
105 
106         COPY_CHUNK
107         COPY_CHUNK
108         COPY_CHUNK
109         COPY_CHUNK
110 
111         COPY_CHUNK
112         COPY_CHUNK
113         COPY_CHUNK
114         COPY_CHUNK
115 #endif
116         subs    r2, r2, #1
117         bne     1b
118 
119         RESTORE_REGS            /* ...and return. */
120 
121 /*
122  * bzero_page(dest)
123  *
124  * Optimised zero page routine.
125  *
126  * On entry:
127  *   r0 - dest address
128  *
129  * Requires:
130  *   number of bytes per page (PAGE_SIZE) is a multiple of 512 (BIG_LOOPS), 128
131  *   otherwise
132  */
133 
134 ENTRY(bzero_page)
135         stmfd   sp!, {r4-r8, lr}
136 #ifdef BIG_LOOPS
137         mov     r2, #(PAGE_SIZE >> 9)
138 #else
139         mov     r2, #(PAGE_SIZE >> 7)
140 #endif
141         mov     r3, #0
142         mov     r4, #0
143         mov     r5, #0
144         mov     r6, #0
145         mov     r7, #0
146         mov     r8, #0
147         mov     ip, #0
148         mov     lr, #0
149 
150 1:
151         stmia   r0!, {r3-r8,ip,lr}
152         stmia   r0!, {r3-r8,ip,lr}
153         stmia   r0!, {r3-r8,ip,lr}
154         stmia   r0!, {r3-r8,ip,lr}
155 
156 #ifdef BIG_LOOPS
157         /* There is little point making the loop any larger; unless we are
158            running with the cache off, the load/store overheads will
159            completely dominate this loop.  */
160         stmia   r0!, {r3-r8,ip,lr}
161         stmia   r0!, {r3-r8,ip,lr}
162         stmia   r0!, {r3-r8,ip,lr}
163         stmia   r0!, {r3-r8,ip,lr}
164 
165         stmia   r0!, {r3-r8,ip,lr}
166         stmia   r0!, {r3-r8,ip,lr}
167         stmia   r0!, {r3-r8,ip,lr}
168         stmia   r0!, {r3-r8,ip,lr}
169 
170         stmia   r0!, {r3-r8,ip,lr}
171         stmia   r0!, {r3-r8,ip,lr}
172         stmia   r0!, {r3-r8,ip,lr}
173         stmia   r0!, {r3-r8,ip,lr}
174 
175 #endif
176 
177         subs    r2, r2, #1
178         bne     1b
179 
180         ldmfd   sp!, {r4-r8, pc}
181 
182 #else   /* _ARM_ARCH_5E */
183 
184 /*
185  * armv5e version of bcopy_page
186  */
187 ENTRY(bcopy_page)
188         pld     [r0]
189         stmfd   sp!, {r4, r5}
190         mov     ip, #32
191         ldr     r2, [r0], #0x04         /* 0x00 */
192         ldr     r3, [r0], #0x04         /* 0x04 */
193 1:      pld     [r0, #0x18]             /* Prefetch 0x20 */
194         ldr     r4, [r0], #0x04         /* 0x08 */
195         ldr     r5, [r0], #0x04         /* 0x0c */
196         strd    r2, [r1], #0x08
197         ldr     r2, [r0], #0x04         /* 0x10 */
198         ldr     r3, [r0], #0x04         /* 0x14 */
199         strd    r4, [r1], #0x08
200         ldr     r4, [r0], #0x04         /* 0x18 */
201         ldr     r5, [r0], #0x04         /* 0x1c */
202         strd    r2, [r1], #0x08
203         ldr     r2, [r0], #0x04         /* 0x20 */
204         ldr     r3, [r0], #0x04         /* 0x24 */
205         pld     [r0, #0x18]             /* Prefetch 0x40 */
206         strd    r4, [r1], #0x08
207         ldr     r4, [r0], #0x04         /* 0x28 */
208         ldr     r5, [r0], #0x04         /* 0x2c */
209         strd    r2, [r1], #0x08
210         ldr     r2, [r0], #0x04         /* 0x30 */
211         ldr     r3, [r0], #0x04         /* 0x34 */
212         strd    r4, [r1], #0x08
213         ldr     r4, [r0], #0x04         /* 0x38 */
214         ldr     r5, [r0], #0x04         /* 0x3c */
215         strd    r2, [r1], #0x08
216         ldr     r2, [r0], #0x04         /* 0x40 */
217         ldr     r3, [r0], #0x04         /* 0x44 */
218         pld     [r0, #0x18]             /* Prefetch 0x60 */
219         strd    r4, [r1], #0x08
220         ldr     r4, [r0], #0x04         /* 0x48 */
221         ldr     r5, [r0], #0x04         /* 0x4c */
222         strd    r2, [r1], #0x08
223         ldr     r2, [r0], #0x04         /* 0x50 */
224         ldr     r3, [r0], #0x04         /* 0x54 */
225         strd    r4, [r1], #0x08
226         ldr     r4, [r0], #0x04         /* 0x58 */
227         ldr     r5, [r0], #0x04         /* 0x5c */
228         strd    r2, [r1], #0x08
229         ldr     r2, [r0], #0x04         /* 0x60 */
230         ldr     r3, [r0], #0x04         /* 0x64 */
231         pld     [r0, #0x18]             /* Prefetch 0x80 */
232         strd    r4, [r1], #0x08
233         ldr     r4, [r0], #0x04         /* 0x68 */
234         ldr     r5, [r0], #0x04         /* 0x6c */
235         strd    r2, [r1], #0x08
236         ldr     r2, [r0], #0x04         /* 0x70 */
237         ldr     r3, [r0], #0x04         /* 0x74 */
238         strd    r4, [r1], #0x08
239         ldr     r4, [r0], #0x04         /* 0x78 */
240         ldr     r5, [r0], #0x04         /* 0x7c */
241         strd    r2, [r1], #0x08
242         subs    ip, ip, #0x01
243         ldrgt   r2, [r0], #0x04         /* 0x80 */
244         ldrgt   r3, [r0], #0x04         /* 0x84 */
245         strd    r4, [r1], #0x08
246         bgt     1b
247         ldmfd   sp!, {r4, r5}
248         RET
249 
250 /*
251  * armv5e version of bzero_page
252  */
253 ENTRY(bzero_page)
254         mov     r1, #PAGE_SIZE
255         mov     r2, #0
256         mov     r3, #0
257 1:      strd    r2, [r0], #8            /* 32 */
258         strd    r2, [r0], #8
259         strd    r2, [r0], #8
260         strd    r2, [r0], #8
261         strd    r2, [r0], #8            /* 64 */
262         strd    r2, [r0], #8
263         strd    r2, [r0], #8
264         strd    r2, [r0], #8
265         strd    r2, [r0], #8            /* 96 */
266         strd    r2, [r0], #8
267         strd    r2, [r0], #8
268         strd    r2, [r0], #8
269         strd    r2, [r0], #8            /* 128 */
270         strd    r2, [r0], #8
271         strd    r2, [r0], #8
272         strd    r2, [r0], #8
273         subs    r1, r1, #128
274         bne     1b
275         RET
276 #endif  /* _ARM_ARCH_5E */

Cache object: 885db1956a3c61b7a1254be142bc181b


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.