1/* USER CODE BEGIN Header */ 2/** 3 ****************************************************************************** 4 * @file osal_memcpy.s 5 * @author GPM WBL Application Team 6 * @brief osal memcpy utilities 7 ****************************************************************************** 8 * @attention 9 * 10 * Copyright (c) 2024 STMicroelectronics. 11 * All rights reserved. 12 * 13 * This software is licensed under terms that can be found in the LICENSE file 14 * in the root directory of this software component. 15 * If no LICENSE file comes with this software, it is provided AS-IS. 16 * 17 ****************************************************************************** 18 */ 19/* USER CODE END Header */ 20 21/* Includes ------------------------------------------------------------------*/ 22#include "asm.h" 23 24 __CODE__ 25 __THUMB__ 26 __EXPORT__ Osal_MemCpy 27 28EXPORT_FUNC(Osal_MemCpy) 29 LSLS R3, R1, #30 30 BEQ memcpy_1 31LABEL(memcpy_byte) /* Copy bytes until src is aligned */ 32 SUBS R2, R2, #1 33 BCC memcpy_exit 34 LDRB R3, [R1] 35 ADDS R1, R1, #1 36 STRB R3, [R0] 37 ADDS R0, R0, #1 38 LSLS R3, R1, #30 39 BNE memcpy_byte 40LABEL(memcpy_1) 41 LSLS R3, R0, #30 42 BEQ memcpy4 43 CMN R3, R3 44 BEQ memcpy_7 45 SUBS R0, R0, #1 46 SUBS R2, R2, #4 47 BCC memcpy_3 48LABEL(memcpy_2) /* Load one word from src and write one byte, one half-word and another byte to dst */ 49 LDM R1!, {R3} 50 STRB R3, [R0, #1] 51 LSRS R3, R3, #8 52 STRH R3, [R0, #2] 53 LSRS R3, R3, #16 54 STRB R3, [R0, #4] 55 ADDS R0, R0, #4 56 SUBS R2, R2, #4 57 BCS memcpy_2 58LABEL(memcpy_3) 59 LSLS R2, R2, #31 60 BCC memcpy_5 61 LDRH R3, [R1] 62 STRB R3, [R0, #1] 63 BEQ memcpy_4 64 LDRB R2, [R1, #2] 65 STRB R2, [R0, #3] 66LABEL(memcpy_4) 67 LSRS R3, R3, #8 68 STRB R3, [R0, #2] 69 BX LR 70LABEL(memcpy_5) 71 BEQ memcpy_exit 72 LDRB R3, [R1] 73 STRB R3, [R0, #1] 74LABEL(memcpy_exit) 75 BX LR 76LABEL(memcpy_7) 77 SUBS R2, R2, #4 78 BCC memcpy_9 79LABEL(memcpy_8) /* Load one word from src and write half-words to dst */ 80 LDM R1!, {R3} 81 STRH R3, [R0] 82 LSRS R3, R3, #16 83 STRH R3, [R0, #2] 84 ADDS R0, R0, #4 85 SUBS R2, R2, #4 86 BCS memcpy_8 87LABEL(memcpy_9) 88 LSLS R2, R2, #31 89 BCC memcpy_10 90 LDRH R3, [R1] 91 STRH R3, [R0] 92 BEQ memcpy_11 93 LDRB R3, [R1, #2] 94 STRB R3, [R0, #2] 95 BX LR 96LABEL(memcpy_10) 97 BEQ memcpy_11 98 LDRB R3, [R1] 99 STRB R3, [R0] 100LABEL(memcpy_11) 101 BX LR 102 103LABEL(memcpy4) 104 PUSH {R4-R6} 105 SUBS R2, #16 106 BCC memcpy4_2words 107LABEL(memcpy4_4words) 108 LDM R1!, {R3-R6} 109 STM R0!, {R3-R6} 110 SUBS R2, #16 111 BCS memcpy4_4words 112LABEL(memcpy4_2words) 113 LSLS R3, R2, #29 114 BCC memcpy4_word 115 LDM R1!, {R3, R4} 116 STM R0!, {R3, R4} 117LABEL(memcpy4_word) 118 BPL memcpy4_halfword 119 LDM R1!, {R3} 120 STM R0!, {R3} 121LABEL(memcpy4_halfword) 122 LSLS R2, R2, #31 123 BCC memcpy4_byte 124 LDRH R3, [R1] 125 STRH R3, [R0] 126 ADDS R0, R0, #2 127 ADDS R1, R1, #2 128 CMP R2, #0 129LABEL(memcpy4_byte) 130 BPL memcpy4_exit 131 LDRB R3, [R1] 132 STRB R3, [R0] 133LABEL(memcpy4_exit) 134 POP {R4-R6} 135 BX LR 136 137 ENDFUNC 138 139 ALIGN_MEM(4) 140 __END__ 141