diff options
author | Matthew Wilcox <mawilcox@microsoft.com> | 2017-09-08 19:14:00 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-09-08 21:26:48 -0400 |
commit | fd1d362600e2d2edb6262d8e05661424c1a315bf (patch) | |
tree | a7386f39d0c7ba19711542ad74c55681842add70 /arch/arm/lib/memset.S | |
parent | 4c51248533adcfb01ba704ce5993ecbad5cc4c99 (diff) |
ARM: implement memset32 & memset64
Reuse the existing optimised memset implementation to implement an
optimised memset32 and memset64.
Link: http://lkml.kernel.org/r/20170720184539.31609-5-willy@infradead.org
Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com>
Reviewed-by: Russell King <rmk+kernel@armlinux.org.uk>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: "James E.J. Bottomley" <jejb@linux.vnet.ibm.com>
Cc: "Martin K. Petersen" <martin.petersen@oracle.com>
Cc: David Miller <davem@davemloft.net>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Matt Turner <mattst88@gmail.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/arm/lib/memset.S')
-rw-r--r-- | arch/arm/lib/memset.S | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/arch/arm/lib/memset.S b/arch/arm/lib/memset.S index 3c65e3bd790f..ed6d35d9cdb5 100644 --- a/arch/arm/lib/memset.S +++ b/arch/arm/lib/memset.S | |||
@@ -28,7 +28,7 @@ UNWIND( .fnstart ) | |||
28 | 1: orr r1, r1, r1, lsl #8 | 28 | 1: orr r1, r1, r1, lsl #8 |
29 | orr r1, r1, r1, lsl #16 | 29 | orr r1, r1, r1, lsl #16 |
30 | mov r3, r1 | 30 | mov r3, r1 |
31 | cmp r2, #16 | 31 | 7: cmp r2, #16 |
32 | blt 4f | 32 | blt 4f |
33 | 33 | ||
34 | #if ! CALGN(1)+0 | 34 | #if ! CALGN(1)+0 |
@@ -41,7 +41,7 @@ UNWIND( .fnend ) | |||
41 | UNWIND( .fnstart ) | 41 | UNWIND( .fnstart ) |
42 | UNWIND( .save {r8, lr} ) | 42 | UNWIND( .save {r8, lr} ) |
43 | mov r8, r1 | 43 | mov r8, r1 |
44 | mov lr, r1 | 44 | mov lr, r3 |
45 | 45 | ||
46 | 2: subs r2, r2, #64 | 46 | 2: subs r2, r2, #64 |
47 | stmgeia ip!, {r1, r3, r8, lr} @ 64 bytes at a time. | 47 | stmgeia ip!, {r1, r3, r8, lr} @ 64 bytes at a time. |
@@ -73,11 +73,11 @@ UNWIND( .fnend ) | |||
73 | UNWIND( .fnstart ) | 73 | UNWIND( .fnstart ) |
74 | UNWIND( .save {r4-r8, lr} ) | 74 | UNWIND( .save {r4-r8, lr} ) |
75 | mov r4, r1 | 75 | mov r4, r1 |
76 | mov r5, r1 | 76 | mov r5, r3 |
77 | mov r6, r1 | 77 | mov r6, r1 |
78 | mov r7, r1 | 78 | mov r7, r3 |
79 | mov r8, r1 | 79 | mov r8, r1 |
80 | mov lr, r1 | 80 | mov lr, r3 |
81 | 81 | ||
82 | cmp r2, #96 | 82 | cmp r2, #96 |
83 | tstgt ip, #31 | 83 | tstgt ip, #31 |
@@ -114,7 +114,7 @@ UNWIND( .fnstart ) | |||
114 | tst r2, #4 | 114 | tst r2, #4 |
115 | strne r1, [ip], #4 | 115 | strne r1, [ip], #4 |
116 | /* | 116 | /* |
117 | * When we get here, we've got less than 4 bytes to zero. We | 117 | * When we get here, we've got less than 4 bytes to set. We |
118 | * may have an unaligned pointer as well. | 118 | * may have an unaligned pointer as well. |
119 | */ | 119 | */ |
120 | 5: tst r2, #2 | 120 | 5: tst r2, #2 |
@@ -135,3 +135,15 @@ UNWIND( .fnstart ) | |||
135 | UNWIND( .fnend ) | 135 | UNWIND( .fnend ) |
136 | ENDPROC(memset) | 136 | ENDPROC(memset) |
137 | ENDPROC(mmioset) | 137 | ENDPROC(mmioset) |
138 | |||
139 | ENTRY(__memset32) | ||
140 | UNWIND( .fnstart ) | ||
141 | mov r3, r1 @ copy r1 to r3 and fall into memset64 | ||
142 | UNWIND( .fnend ) | ||
143 | ENDPROC(__memset32) | ||
144 | ENTRY(__memset64) | ||
145 | UNWIND( .fnstart ) | ||
146 | mov ip, r0 @ preserve r0 as return value | ||
147 | b 7b @ jump into the middle of memset | ||
148 | UNWIND( .fnend ) | ||
149 | ENDPROC(__memset64) | ||