fdsf

Dependents:   sisk_proj_stat MQTT Hello_FXOS8700Q WireFSHandControl ... more

Committer:
grzemich
Date:
Wed Dec 07 23:47:50 2016 +0000
Revision:
0:d7bd7384a37c
dgd

Who changed what in which revision?

UserRevisionLine numberNew contents of line
grzemich 0:d7bd7384a37c 1 /* Copyright (C) 2013 - Adam Green (https://github.com/adamgreen)
grzemich 0:d7bd7384a37c 2
grzemich 0:d7bd7384a37c 3 Licensed under the Apache License, Version 2.0 (the "License");
grzemich 0:d7bd7384a37c 4 you may not use this file except in compliance with the License.
grzemich 0:d7bd7384a37c 5 You may obtain a copy of the License at
grzemich 0:d7bd7384a37c 6
grzemich 0:d7bd7384a37c 7 http://www.apache.org/licenses/LICENSE-2.0
grzemich 0:d7bd7384a37c 8
grzemich 0:d7bd7384a37c 9 Unless required by applicable law or agreed to in writing, software
grzemich 0:d7bd7384a37c 10 distributed under the License is distributed on an "AS IS" BASIS,
grzemich 0:d7bd7384a37c 11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
grzemich 0:d7bd7384a37c 12 See the License for the specific language governing permissions and
grzemich 0:d7bd7384a37c 13 limitations under the License.
grzemich 0:d7bd7384a37c 14 */
grzemich 0:d7bd7384a37c 15 #if defined(TOOLCHAIN_GCC) && defined(__thumb2__)
grzemich 0:d7bd7384a37c 16
grzemich 0:d7bd7384a37c 17 #include <stdio.h>
grzemich 0:d7bd7384a37c 18
grzemich 0:d7bd7384a37c 19
grzemich 0:d7bd7384a37c 20 /* This is a hand written Thumb-2 assembly language version of the
grzemich 0:d7bd7384a37c 21 standard C memcpy() function that can be used by the lwIP networking
grzemich 0:d7bd7384a37c 22 stack to improve its performance. It copies 4 bytes at a time and
grzemich 0:d7bd7384a37c 23 unrolls the loop to perform 4 of these copies per loop iteration.
grzemich 0:d7bd7384a37c 24 */
grzemich 0:d7bd7384a37c 25 __attribute__((naked)) void thumb2_memcpy(void* pDest, const void* pSource, size_t length)
grzemich 0:d7bd7384a37c 26 {
grzemich 0:d7bd7384a37c 27 __asm (
grzemich 0:d7bd7384a37c 28 ".syntax unified\n"
grzemich 0:d7bd7384a37c 29 ".thumb\n"
grzemich 0:d7bd7384a37c 30
grzemich 0:d7bd7384a37c 31 // Copy 16 bytes at a time first.
grzemich 0:d7bd7384a37c 32 " lsrs r3, r2, #4\n"
grzemich 0:d7bd7384a37c 33 " beq.n 2$\n"
grzemich 0:d7bd7384a37c 34 "1$: ldr r12, [r1], #4\n"
grzemich 0:d7bd7384a37c 35 " str r12, [r0], #4\n"
grzemich 0:d7bd7384a37c 36 " ldr r12, [r1], #4\n"
grzemich 0:d7bd7384a37c 37 " str r12, [r0], #4\n"
grzemich 0:d7bd7384a37c 38 " ldr r12, [r1], #4\n"
grzemich 0:d7bd7384a37c 39 " str r12, [r0], #4\n"
grzemich 0:d7bd7384a37c 40 " ldr r12, [r1], #4\n"
grzemich 0:d7bd7384a37c 41 " str r12, [r0], #4\n"
grzemich 0:d7bd7384a37c 42 " subs r3, #1\n"
grzemich 0:d7bd7384a37c 43 " bne 1$\n"
grzemich 0:d7bd7384a37c 44
grzemich 0:d7bd7384a37c 45 // Copy byte by byte for what is left.
grzemich 0:d7bd7384a37c 46 "2$:\n"
grzemich 0:d7bd7384a37c 47 " ands r3, r2, #0xf\n"
grzemich 0:d7bd7384a37c 48 " beq.n 4$\n"
grzemich 0:d7bd7384a37c 49 "3$: ldrb r12, [r1], #1\n"
grzemich 0:d7bd7384a37c 50 " strb r12, [r0], #1\n"
grzemich 0:d7bd7384a37c 51 " subs r3, #1\n"
grzemich 0:d7bd7384a37c 52 " bne 3$\n"
grzemich 0:d7bd7384a37c 53
grzemich 0:d7bd7384a37c 54 // Return to caller.
grzemich 0:d7bd7384a37c 55 "4$: bx lr\n"
grzemich 0:d7bd7384a37c 56 );
grzemich 0:d7bd7384a37c 57 }
grzemich 0:d7bd7384a37c 58
grzemich 0:d7bd7384a37c 59 #endif