1/* 2 * linux/arch/arm/lib/memcpy.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 15 .text 16 17#define ENTER \ 18 mov ip,sp ;\ 19 stmfd sp!,{r4-r9,fp,ip,lr,pc} ;\ 20 sub fp,ip,#4 21 22#define EXIT \ 23 LOADREGS(ea, fp, {r4 - r9, fp, sp, pc}) 24 25#define EXITEQ \ 26 LOADREGS(eqea, fp, {r4 - r9, fp, sp, pc}) 27 28/* 29 * Prototype: void memcpy(void *to,const void *from,unsigned long n); 30 * ARM3: cant use memcopy here!!! 31 */ 32ENTRY(memcpy) 33ENTRY(memmove) 34 ENTER 35 cmp r1, r0 36 bcc 19f 37 subs r2, r2, #4 38 blt 6f 39 ands ip, r0, #3 40 bne 7f 41 ands ip, r1, #3 42 bne 8f 43 441: subs r2, r2, #8 45 blt 5f 46 subs r2, r2, #0x14 47 blt 3f 482: ldmia r1!,{r3 - r9, ip} 49 stmia r0!,{r3 - r9, ip} 50 subs r2, r2, #32 51 bge 2b 52 cmn r2, #16 53 ldmgeia r1!, {r3 - r6} 54 stmgeia r0!, {r3 - r6} 55 subge r2, r2, #0x10 563: adds r2, r2, #0x14 574: ldmgeia r1!, {r3 - r5} 58 stmgeia r0!, {r3 - r5} 59 subges r2, r2, #12 60 bge 4b 615: adds r2, r2, #8 62 blt 6f 63 subs r2, r2, #4 64 ldrlt r3, [r1], #4 65 ldmgeia r1!, {r4, r5} 66 strlt r3, [r0], #4 67 stmgeia r0!, {r4, r5} 68 subge r2, r2, #4 69 706: adds r2, r2, #4 71 EXITEQ 72 cmp r2, #2 73 ldrb r3, [r1], #1 74 ldrgeb r4, [r1], #1 75 ldrgtb r5, [r1], #1 76 strb r3, [r0], #1 77 strgeb r4, [r0], #1 78 strgtb r5, [r0], #1 79 EXIT 80 817: rsb ip, ip, #4 82 cmp ip, #2 83 ldrb r3, [r1], #1 84 ldrgeb r4, [r1], #1 85 ldrgtb r5, [r1], #1 86 strb r3, [r0], #1 87 strgeb r4, [r0], #1 88 strgtb r5, [r0], #1 89 subs r2, r2, ip 90 blt 6b 91 ands ip, r1, #3 92 beq 1b 93 948: bic r1, r1, #3 95 ldr r7, [r1], #4 96 cmp ip, #2 97 bgt 15f 98 beq 11f 99 cmp r2, #12 100 blt 10f 101 sub r2, r2, #12 1029: mov r3, r7, lsr #8 103 ldmia r1!, {r4 - r7} 104 orr r3, r3, r4, lsl #24 105 mov r4, r4, lsr #8 106 orr r4, r4, r5, lsl #24 107 mov r5, r5, lsr #8 108 orr r5, r5, r6, lsl #24 109 mov r6, r6, lsr #8 110 orr r6, r6, r7, lsl #24 111 stmia r0!, {r3 - r6} 112 subs r2, r2, #16 113 bge 9b 114 adds r2, r2, #12 115 blt 100f 11610: mov r3, r7, lsr #8 117 ldr r7, [r1], #4 118 subs r2, r2, #4 119 orr r3, r3, r7, lsl #24 120 str r3, [r0], #4 121 bge 10b 122100: sub r1, r1, #3 123 b 6b 124 12511: cmp r2, #12 126 blt 13f /* */ 127 sub r2, r2, #12 12812: mov r3, r7, lsr #16 129 ldmia r1!, {r4 - r7} 130 orr r3, r3, r4, lsl #16 131 mov r4, r4, lsr #16 132 orr r4, r4, r5, lsl #16 133 mov r5, r5, lsr #16 134 orr r5, r5, r6, lsl #16 135 mov r6, r6, lsr #16 136 orr r6, r6, r7,LSL#16 137 stmia r0!, {r3 - r6} 138 subs r2, r2, #16 139 bge 12b 140 adds r2, r2, #12 141 blt 14f 14213: mov r3, r7, lsr #16 143 ldr r7, [r1], #4 144 subs r2, r2, #4 145 orr r3, r3, r7, lsl #16 146 str r3, [r0], #4 147 bge 13b 14814: sub r1, r1, #2 149 b 6b 150 15115: cmp r2, #12 152 blt 17f 153 sub r2, r2, #12 15416: mov r3, r7, lsr #24 155 ldmia r1!,{r4 - r7} 156 orr r3, r3, r4, lsl #8 157 mov r4, r4, lsr #24 158 orr r4, r4, r5, lsl #8 159 mov r5, r5, lsr #24 160 orr r5, r5, r6, lsl #8 161 mov r6, r6, lsr #24 162 orr r6, r6, r7, lsl #8 163 stmia r0!, {r3 - r6} 164 subs r2, r2, #16 165 bge 16b 166 adds r2, r2, #12 167 blt 18f 16817: mov r3, r7, lsr #24 169 ldr r7, [r1], #4 170 subs r2, r2, #4 171 orr r3, r3, r7, lsl#8 172 str r3, [r0], #4 173 bge 17b 17418: sub r1, r1, #1 175 b 6b 176 177 17819: add r1, r1, r2 179 add r0, r0, r2 180 subs r2, r2, #4 181 blt 24f 182 ands ip, r0, #3 183 bne 25f 184 ands ip, r1, #3 185 bne 26f 186 18720: subs r2, r2, #8 188 blt 23f 189 subs r2, r2, #0x14 190 blt 22f 19121: ldmdb r1!, {r3 - r9, ip} 192 stmdb r0!, {r3 - r9, ip} 193 subs r2, r2, #32 194 bge 21b 19522: cmn r2, #16 196 ldmgedb r1!, {r3 - r6} 197 stmgedb r0!, {r3 - r6} 198 subge r2, r2, #16 199 adds r2, r2, #20 200 ldmgedb r1!, {r3 - r5} 201 stmgedb r0!, {r3 - r5} 202 subge r2, r2, #12 20323: adds r2, r2, #8 204 blt 24f 205 subs r2, r2, #4 206 ldrlt r3, [r1, #-4]! 207 ldmgedb r1!, {r4, r5} 208 strlt r3, [r0, #-4]! 209 stmgedb r0!, {r4, r5} 210 subge r2, r2, #4 211 21224: adds r2, r2, #4 213 EXITEQ 214 cmp r2, #2 215 ldrb r3, [r1, #-1]! 216 ldrgeb r4, [r1, #-1]! 217 ldrgtb r5, [r1, #-1]! 218 strb r3, [r0, #-1]! 219 strgeb r4, [r0, #-1]! 220 strgtb r5, [r0, #-1]! 221 EXIT 222 22325: cmp ip, #2 224 ldrb r3, [r1, #-1]! 225 ldrgeb r4, [r1, #-1]! 226 ldrgtb r5, [r1, #-1]! 227 strb r3, [r0, #-1]! 228 strgeb r4, [r0, #-1]! 229 strgtb r5, [r0, #-1]! 230 subs r2, r2, ip 231 blt 24b 232 ands ip, r1, #3 233 beq 20b 234 23526: bic r1, r1, #3 236 ldr r3, [r1], #0 237 cmp ip, #2 238 blt 34f 239 beq 30f 240 cmp r2, #12 241 blt 28f 242 sub r2, r2, #12 24327: mov r7, r3, lsl #8 244 ldmdb r1!, {r3, r4, r5, r6} 245 orr r7, r7, r6, lsr #24 246 mov r6, r6, lsl #8 247 orr r6, r6, r5, lsr #24 248 mov r5, r5, lsl #8 249 orr r5, r5, r4, lsr #24 250 mov r4, r4, lsl #8 251 orr r4, r4, r3, lsr #24 252 stmdb r0!, {r4, r5, r6, r7} 253 subs r2, r2, #16 254 bge 27b 255 adds r2, r2, #12 256 blt 29f 25728: mov ip, r3, lsl #8 258 ldr r3, [r1, #-4]! 259 subs r2, r2, #4 260 orr ip, ip, r3, lsr #24 261 str ip, [r0, #-4]! 262 bge 28b 26329: add r1, r1, #3 264 b 24b 265 26630: cmp r2, #12 267 blt 32f 268 sub r2, r2, #12 26931: mov r7, r3, lsl #16 270 ldmdb r1!, {r3, r4, r5, r6} 271 orr r7, r7, r6, lsr #16 272 mov r6, r6, lsl #16 273 orr r6, r6, r5, lsr #16 274 mov r5, r5, lsl #16 275 orr r5, r5, r4, lsr #16 276 mov r4, r4, lsl #16 277 orr r4, r4, r3, lsr #16 278 stmdb r0!, {r4, r5, r6, r7} 279 subs r2, r2, #16 280 bge 31b 281 adds r2, r2, #12 282 blt 33f 28332: mov ip, r3, lsl #16 284 ldr r3, [r1, #-4]! 285 subs r2, r2, #4 286 orr ip, ip, r3, lsr #16 287 str ip, [r0, #-4]! 288 bge 32b 28933: add r1, r1, #2 290 b 24b 291 29234: cmp r2, #12 293 blt 36f 294 sub r2, r2, #12 29535: mov r7, r3, lsl #24 296 ldmdb r1!, {r3, r4, r5, r6} 297 orr r7, r7, r6, lsr #8 298 mov r6, r6, lsl #24 299 orr r6, r6, r5, lsr #8 300 mov r5, r5, lsl #24 301 orr r5, r5, r4, lsr #8 302 mov r4, r4, lsl #24 303 orr r4, r4, r3, lsr #8 304 stmdb r0!, {r4, r5, r6, r7} 305 subs r2, r2, #16 306 bge 35b 307 adds r2, r2, #12 308 blt 37f 30936: mov ip, r3, lsl #24 310 ldr r3, [r1, #-4]! 311 subs r2, r2, #4 312 orr ip, ip, r3, lsr #8 313 str ip, [r0, #-4]! 314 bge 36b 31537: add r1, r1, #1 316 b 24b 317 318 .align 319