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