mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-31 06:14:39 +01:00
ARM: implement memset32 & memset64
Reuse the existing optimised memset implementation to implement an optimised memset32 and memset64. Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Matthew Wilcox <[email protected]> Reviewed-by: Russell King <[email protected]> Cc: "H. Peter Anvin" <[email protected]> Cc: "James E.J. Bottomley" <[email protected]> Cc: "Martin K. Petersen" <[email protected]> Cc: David Miller <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Ivan Kokshaysky <[email protected]> Cc: Matt Turner <[email protected]> Cc: Michael Ellerman <[email protected]> Cc: Minchan Kim <[email protected]> Cc: Ralf Baechle <[email protected]> Cc: Richard Henderson <[email protected]> Cc: Sam Ravnborg <[email protected]> Cc: Sergey Senozhatsky <[email protected]> Cc: Thomas Gleixner <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
1 parent
4c51248533
commit
fd1d362600
3 files changed
+34
-6
No files matched your search
@@ -24,6 +24,20 @@ extern void * memchr(const void *, int, __kernel_size_t);
|
||||
#define __HAVE_ARCH_MEMSET
|
||||
extern void * memset(void *, int, __kernel_size_t);
|
||||
|
||||
#define __HAVE_ARCH_MEMSET32
|
||||
extern void *__memset32(uint32_t *, uint32_t v, __kernel_size_t);
|
||||
static inline void *memset32(uint32_t *p, uint32_t v, __kernel_size_t n)
|
||||
{
|
||||
return __memset32(p, v, n * 4);
|
||||
}
|
||||
|
||||
#define __HAVE_ARCH_MEMSET64
|
||||
extern void *__memset64(uint64_t *, uint32_t low, __kernel_size_t, uint32_t hi);
|
||||
static inline void *memset64(uint64_t *p, uint64_t v, __kernel_size_t n)
|
||||
{
|
||||
return __memset64(p, v, n * 8, v >> 32);
|
||||
}
|
||||
|
||||
extern void __memzero(void *ptr, __kernel_size_t n);
|
||||
|
||||
#define memset(p,v,n) \
|
||||
|
||||
@@ -87,6 +87,8 @@ EXPORT_SYMBOL(__raw_writesl);
|
||||
EXPORT_SYMBOL(strchr);
|
||||
EXPORT_SYMBOL(strrchr);
|
||||
EXPORT_SYMBOL(memset);
|
||||
EXPORT_SYMBOL(__memset32);
|
||||
EXPORT_SYMBOL(__memset64);
|
||||
EXPORT_SYMBOL(memcpy);
|
||||
EXPORT_SYMBOL(memmove);
|
||||
EXPORT_SYMBOL(memchr);
|
||||
|
||||
+18
-6
@@ -28,7 +28,7 @@ UNWIND( .fnstart )
|
||||
1: orr r1, r1, r1, lsl #8
|
||||
orr r1, r1, r1, lsl #16
|
||||
mov r3, r1
|
||||
cmp r2, #16
|
||||
7: cmp r2, #16
|
||||
blt 4f
|
||||
|
||||
#if ! CALGN(1)+0
|
||||
@@ -41,7 +41,7 @@ UNWIND( .fnend )
|
||||
UNWIND( .fnstart )
|
||||
UNWIND( .save {r8, lr} )
|
||||
mov r8, r1
|
||||
mov lr, r1
|
||||
mov lr, r3
|
||||
|
||||
2: subs r2, r2, #64
|
||||
stmgeia ip!, {r1, r3, r8, lr} @ 64 bytes at a time.
|
||||
@@ -73,11 +73,11 @@ UNWIND( .fnend )
|
||||
UNWIND( .fnstart )
|
||||
UNWIND( .save {r4-r8, lr} )
|
||||
mov r4, r1
|
||||
mov r5, r1
|
||||
mov r5, r3
|
||||
mov r6, r1
|
||||
mov r7, r1
|
||||
mov r7, r3
|
||||
mov r8, r1
|
||||
mov lr, r1
|
||||
mov lr, r3
|
||||
|
||||
cmp r2, #96
|
||||
tstgt ip, #31
|
||||
@@ -114,7 +114,7 @@ UNWIND( .fnstart )
|
||||
tst r2, #4
|
||||
strne r1, [ip], #4
|
||||
/*
|
||||
* When we get here, we've got less than 4 bytes to zero. We
|
||||
* When we get here, we've got less than 4 bytes to set. We
|
||||
* may have an unaligned pointer as well.
|
||||
*/
|
||||
5: tst r2, #2
|
||||
@@ -135,3 +135,15 @@ UNWIND( .fnstart )
|
||||
UNWIND( .fnend )
|
||||
ENDPROC(memset)
|
||||
ENDPROC(mmioset)
|
||||
|
||||
ENTRY(__memset32)
|
||||
UNWIND( .fnstart )
|
||||
mov r3, r1 @ copy r1 to r3 and fall into memset64
|
||||
UNWIND( .fnend )
|
||||
ENDPROC(__memset32)
|
||||
ENTRY(__memset64)
|
||||
UNWIND( .fnstart )
|
||||
mov ip, r0 @ preserve r0 as return value
|
||||
b 7b @ jump into the middle of memset
|
||||
UNWIND( .fnend )
|
||||
ENDPROC(__memset64)
|
||||
Reference in new issue
Block a user