diff options
Diffstat (limited to 'arch/microblaze/lib/memmove.c')
-rw-r--r-- | arch/microblaze/lib/memmove.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/arch/microblaze/lib/memmove.c b/arch/microblaze/lib/memmove.c index 0929198c5e68..1d3c0e7990e5 100644 --- a/arch/microblaze/lib/memmove.c +++ b/arch/microblaze/lib/memmove.c | |||
@@ -31,16 +31,12 @@ | |||
31 | #include <linux/string.h> | 31 | #include <linux/string.h> |
32 | 32 | ||
33 | #ifdef __HAVE_ARCH_MEMMOVE | 33 | #ifdef __HAVE_ARCH_MEMMOVE |
34 | #ifndef CONFIG_OPT_LIB_FUNCTION | ||
34 | void *memmove(void *v_dst, const void *v_src, __kernel_size_t c) | 35 | void *memmove(void *v_dst, const void *v_src, __kernel_size_t c) |
35 | { | 36 | { |
36 | const char *src = v_src; | 37 | const char *src = v_src; |
37 | char *dst = v_dst; | 38 | char *dst = v_dst; |
38 | 39 | ||
39 | #ifdef CONFIG_OPT_LIB_FUNCTION | ||
40 | const uint32_t *i_src; | ||
41 | uint32_t *i_dst; | ||
42 | #endif | ||
43 | |||
44 | if (!c) | 40 | if (!c) |
45 | return v_dst; | 41 | return v_dst; |
46 | 42 | ||
@@ -48,7 +44,6 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c) | |||
48 | if (v_dst <= v_src) | 44 | if (v_dst <= v_src) |
49 | return memcpy(v_dst, v_src, c); | 45 | return memcpy(v_dst, v_src, c); |
50 | 46 | ||
51 | #ifndef CONFIG_OPT_LIB_FUNCTION | ||
52 | /* copy backwards, from end to beginning */ | 47 | /* copy backwards, from end to beginning */ |
53 | src += c; | 48 | src += c; |
54 | dst += c; | 49 | dst += c; |
@@ -58,7 +53,22 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c) | |||
58 | *--dst = *--src; | 53 | *--dst = *--src; |
59 | 54 | ||
60 | return v_dst; | 55 | return v_dst; |
61 | #else | 56 | } |
57 | #else /* CONFIG_OPT_LIB_FUNCTION */ | ||
58 | void *memmove(void *v_dst, const void *v_src, __kernel_size_t c) | ||
59 | { | ||
60 | const char *src = v_src; | ||
61 | char *dst = v_dst; | ||
62 | const uint32_t *i_src; | ||
63 | uint32_t *i_dst; | ||
64 | |||
65 | if (!c) | ||
66 | return v_dst; | ||
67 | |||
68 | /* Use memcpy when source is higher than dest */ | ||
69 | if (v_dst <= v_src) | ||
70 | return memcpy(v_dst, v_src, c); | ||
71 | |||
62 | /* The following code tries to optimize the copy by using unsigned | 72 | /* The following code tries to optimize the copy by using unsigned |
63 | * alignment. This will work fine if both source and destination are | 73 | * alignment. This will work fine if both source and destination are |
64 | * aligned on the same boundary. However, if they are aligned on | 74 | * aligned on the same boundary. However, if they are aligned on |
@@ -169,7 +179,7 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c) | |||
169 | *--dst = *--src; | 179 | *--dst = *--src; |
170 | } | 180 | } |
171 | return v_dst; | 181 | return v_dst; |
172 | #endif | ||
173 | } | 182 | } |
183 | #endif /* CONFIG_OPT_LIB_FUNCTION */ | ||
174 | EXPORT_SYMBOL(memmove); | 184 | EXPORT_SYMBOL(memmove); |
175 | #endif /* __HAVE_ARCH_MEMMOVE */ | 185 | #endif /* __HAVE_ARCH_MEMMOVE */ |