blob: 4e0bc6735401b48c7f2b0629922b63da74d2a35e [file] [log] [blame]
yuezonghe824eb0c2024-06-27 02:32:26 -07001/*
2 * linux/arch/arm/lib/memcpy.S
3 *
4 * Author: Nicolas Pitre
5 * Created: Sep 28, 2005
6 * Copyright: MontaVista Software, Inc.
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12#define FORCE_ARM 1
13 .syntax divided
14
15#undef PSR_ISETSTATE
16#undef ARM
17#undef THUMB
18#undef W
19#undef BSYM
20
21/* The CPSR bit describing the instruction set (ARM) */
22#define PSR_ISETSTATE 0
23
24#define ARM(x...) x
25#define THUMB(x...)
26#define W(instr) instr
27#define BSYM(sym) sym
28
29.arm
30
31#include <linux/linkage.h>
32#include <asm/assembler.h>
33
34#define LDR1W_SHIFT 0
35#define STR1W_SHIFT 0
36
37 .macro ldr1w ptr reg abort
38 W(ldr) \reg, [\ptr], #4
39 .endm
40
41 .macro ldr4w ptr reg1 reg2 reg3 reg4 abort
42 ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4}
43 .endm
44
45 .macro ldr8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
46 ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8}
47 .endm
48
49 .macro ldr1b ptr reg cond=al abort
50 ldr\cond\()b \reg, [\ptr], #1
51 .endm
52
53 .macro str1w ptr reg abort
54 W(str) \reg, [\ptr], #4
55 .endm
56
57 .macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
58 stmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8}
59 .endm
60
61 .macro str1b ptr reg cond=al abort
62 str\cond\()b \reg, [\ptr], #1
63 .endm
64
65 .macro enter reg1 reg2
66 stmdb sp!, {r0, \reg1, \reg2}
67 .endm
68
69 .macro exit reg1 reg2
70 ldmfd sp!, {r0, \reg1, \reg2}
71 .endm
72
73 .text
74
75/* Prototype: void *memcpy(void *dest, const void *src, size_t n); */
76
77ENTRY(memcpy)
78
79#include "copy_template.S"
80
81ENDPROC(memcpy)