summaryrefslogtreecommitdiff
path: root/tmk_core/tool/mbed/mbed-sdk/libraries/net/lwip/lwip-sys/arch/memcpy.c
diff options
context:
space:
mode:
Diffstat (limited to 'tmk_core/tool/mbed/mbed-sdk/libraries/net/lwip/lwip-sys/arch/memcpy.c')
-rw-r--r--tmk_core/tool/mbed/mbed-sdk/libraries/net/lwip/lwip-sys/arch/memcpy.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/tmk_core/tool/mbed/mbed-sdk/libraries/net/lwip/lwip-sys/arch/memcpy.c b/tmk_core/tool/mbed/mbed-sdk/libraries/net/lwip/lwip-sys/arch/memcpy.c
new file mode 100644
index 0000000000..fefbcda3c2
--- /dev/null
+++ b/tmk_core/tool/mbed/mbed-sdk/libraries/net/lwip/lwip-sys/arch/memcpy.c
@@ -0,0 +1,59 @@
+/* Copyright (C) 2013 - Adam Green (https://github.com/adamgreen)
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+#if defined(TOOLCHAIN_GCC) && defined(__thumb2__)
+
+#include <stdio.h>
+
+
+/* This is a hand written Thumb-2 assembly language version of the
+ standard C memcpy() function that can be used by the lwIP networking
+ stack to improve its performance. It copies 4 bytes at a time and
+ unrolls the loop to perform 4 of these copies per loop iteration.
+*/
+__attribute__((naked)) void thumb2_memcpy(void* pDest, const void* pSource, size_t length)
+{
+ __asm (
+ ".syntax unified\n"
+ ".thumb\n"
+
+ // Copy 16 bytes at a time first.
+ " lsrs r3, r2, #4\n"
+ " beq.n 2$\n"
+ "1$: ldr r12, [r1], #4\n"
+ " str r12, [r0], #4\n"
+ " ldr r12, [r1], #4\n"
+ " str r12, [r0], #4\n"
+ " ldr r12, [r1], #4\n"
+ " str r12, [r0], #4\n"
+ " ldr r12, [r1], #4\n"
+ " str r12, [r0], #4\n"
+ " subs r3, #1\n"
+ " bne 1$\n"
+
+ // Copy byte by byte for what is left.
+ "2$:\n"
+ " ands r3, r2, #0xf\n"
+ " beq.n 4$\n"
+ "3$: ldrb r12, [r1], #1\n"
+ " strb r12, [r0], #1\n"
+ " subs r3, #1\n"
+ " bne 3$\n"
+
+ // Return to caller.
+ "4$: bx lr\n"
+ );
+}
+
+#endif