diff options
Diffstat (limited to 'firmware/target/arm/memmove-arm.S')
-rw-r--r-- | firmware/target/arm/memmove-arm.S | 252 |
1 files changed, 126 insertions, 126 deletions
diff --git a/firmware/target/arm/memmove-arm.S b/firmware/target/arm/memmove-arm.S index d00854439b..ce056d956b 100644 --- a/firmware/target/arm/memmove-arm.S +++ b/firmware/target/arm/memmove-arm.S | |||
@@ -35,7 +35,7 @@ | |||
35 | #define push lsr | 35 | #define push lsr |
36 | #endif | 36 | #endif |
37 | 37 | ||
38 | .text | 38 | .text |
39 | 39 | ||
40 | /* | 40 | /* |
41 | * Prototype: void *memmove(void *dest, const void *src, size_t n); | 41 | * Prototype: void *memmove(void *dest, const void *src, size_t n); |
@@ -54,137 +54,137 @@ | |||
54 | 54 | ||
55 | memmove: | 55 | memmove: |
56 | 56 | ||
57 | subs ip, r0, r1 | 57 | subs ip, r0, r1 |
58 | cmphi r2, ip | 58 | cmphi r2, ip |
59 | bls memcpy | 59 | bls memcpy |
60 | 60 | ||
61 | stmfd sp!, {r0, r4, lr} | 61 | stmfd sp!, {r0, r4, lr} |
62 | add r1, r1, r2 | 62 | add r1, r1, r2 |
63 | add r0, r0, r2 | 63 | add r0, r0, r2 |
64 | subs r2, r2, #4 | 64 | subs r2, r2, #4 |
65 | blt 8f | 65 | blt 8f |
66 | ands ip, r0, #3 | 66 | ands ip, r0, #3 |
67 | bne 9f | 67 | bne 9f |
68 | ands ip, r1, #3 | 68 | ands ip, r1, #3 |
69 | bne 10f | 69 | bne 10f |
70 | 70 | ||
71 | 1: subs r2, r2, #(28) | 71 | 1: subs r2, r2, #(28) |
72 | stmfd sp!, {r5 - r8} | 72 | stmfd sp!, {r5 - r8} |
73 | blt 5f | 73 | blt 5f |
74 | 74 | ||
75 | 2: | 75 | 2: |
76 | 3: | 76 | 3: |
77 | 4: ldmdb r1!, {r3, r4, r5, r6, r7, r8, ip, lr} | 77 | 4: ldmdb r1!, {r3, r4, r5, r6, r7, r8, ip, lr} |
78 | subs r2, r2, #32 | 78 | subs r2, r2, #32 |
79 | stmdb r0!, {r3, r4, r5, r6, r7, r8, ip, lr} | 79 | stmdb r0!, {r3, r4, r5, r6, r7, r8, ip, lr} |
80 | bge 3b | 80 | bge 3b |
81 | 81 | ||
82 | 5: ands ip, r2, #28 | 82 | 5: ands ip, r2, #28 |
83 | rsb ip, ip, #32 | 83 | rsb ip, ip, #32 |
84 | addne pc, pc, ip @ C is always clear here | 84 | addne pc, pc, ip @ C is always clear here |
85 | b 7f | 85 | b 7f |
86 | 6: nop | 86 | 6: nop |
87 | ldr r3, [r1, #-4]! | 87 | ldr r3, [r1, #-4]! |
88 | ldr r4, [r1, #-4]! | 88 | ldr r4, [r1, #-4]! |
89 | ldr r5, [r1, #-4]! | 89 | ldr r5, [r1, #-4]! |
90 | ldr r6, [r1, #-4]! | 90 | ldr r6, [r1, #-4]! |
91 | ldr r7, [r1, #-4]! | 91 | ldr r7, [r1, #-4]! |
92 | ldr r8, [r1, #-4]! | 92 | ldr r8, [r1, #-4]! |
93 | ldr lr, [r1, #-4]! | 93 | ldr lr, [r1, #-4]! |
94 | 94 | ||
95 | add pc, pc, ip | 95 | add pc, pc, ip |
96 | nop | 96 | nop |
97 | nop | 97 | nop |
98 | str r3, [r0, #-4]! | 98 | str r3, [r0, #-4]! |
99 | str r4, [r0, #-4]! | 99 | str r4, [r0, #-4]! |
100 | str r5, [r0, #-4]! | 100 | str r5, [r0, #-4]! |
101 | str r6, [r0, #-4]! | 101 | str r6, [r0, #-4]! |
102 | str r7, [r0, #-4]! | 102 | str r7, [r0, #-4]! |
103 | str r8, [r0, #-4]! | 103 | str r8, [r0, #-4]! |
104 | str lr, [r0, #-4]! | 104 | str lr, [r0, #-4]! |
105 | 105 | ||
106 | 7: ldmfd sp!, {r5 - r8} | 106 | 7: ldmfd sp!, {r5 - r8} |
107 | 107 | ||
108 | 8: movs r2, r2, lsl #31 | 108 | 8: movs r2, r2, lsl #31 |
109 | ldrneb r3, [r1, #-1]! | 109 | ldrneb r3, [r1, #-1]! |
110 | ldrcsb r4, [r1, #-1]! | 110 | ldrcsb r4, [r1, #-1]! |
111 | ldrcsb ip, [r1, #-1] | 111 | ldrcsb ip, [r1, #-1] |
112 | strneb r3, [r0, #-1]! | 112 | strneb r3, [r0, #-1]! |
113 | strcsb r4, [r0, #-1]! | 113 | strcsb r4, [r0, #-1]! |
114 | strcsb ip, [r0, #-1] | 114 | strcsb ip, [r0, #-1] |
115 | ldmfd sp!, {r0, r4, pc} | 115 | ldmfd sp!, {r0, r4, pc} |
116 | 116 | ||
117 | 9: cmp ip, #2 | 117 | 9: cmp ip, #2 |
118 | ldrgtb r3, [r1, #-1]! | 118 | ldrgtb r3, [r1, #-1]! |
119 | ldrgeb r4, [r1, #-1]! | 119 | ldrgeb r4, [r1, #-1]! |
120 | ldrb lr, [r1, #-1]! | 120 | ldrb lr, [r1, #-1]! |
121 | strgtb r3, [r0, #-1]! | 121 | strgtb r3, [r0, #-1]! |
122 | strgeb r4, [r0, #-1]! | 122 | strgeb r4, [r0, #-1]! |
123 | subs r2, r2, ip | 123 | subs r2, r2, ip |
124 | strb lr, [r0, #-1]! | 124 | strb lr, [r0, #-1]! |
125 | blt 8b | 125 | blt 8b |
126 | ands ip, r1, #3 | 126 | ands ip, r1, #3 |
127 | beq 1b | 127 | beq 1b |
128 | 128 | ||
129 | 10: bic r1, r1, #3 | 129 | 10: bic r1, r1, #3 |
130 | cmp ip, #2 | 130 | cmp ip, #2 |
131 | ldr r3, [r1, #0] | 131 | ldr r3, [r1, #0] |
132 | beq 17f | 132 | beq 17f |
133 | blt 18f | 133 | blt 18f |
134 | 134 | ||
135 | 135 | ||
136 | .macro backward_copy_shift push pull | 136 | .macro backward_copy_shift push pull |
137 | 137 | ||
138 | subs r2, r2, #28 | 138 | subs r2, r2, #28 |
139 | blt 14f | 139 | blt 14f |
140 | 140 | ||
141 | 11: stmfd sp!, {r5 - r9} | 141 | 11: stmfd sp!, {r5 - r9} |
142 | 142 | ||
143 | 12: | 143 | 12: |
144 | 13: ldmdb r1!, {r7, r8, r9, ip} | 144 | 13: ldmdb r1!, {r7, r8, r9, ip} |
145 | mov lr, r3, push #\push | 145 | mov lr, r3, push #\push |
146 | subs r2, r2, #32 | 146 | subs r2, r2, #32 |
147 | ldmdb r1!, {r3, r4, r5, r6} | 147 | ldmdb r1!, {r3, r4, r5, r6} |
148 | orr lr, lr, ip, pull #\pull | 148 | orr lr, lr, ip, pull #\pull |
149 | mov ip, ip, push #\push | 149 | mov ip, ip, push #\push |
150 | orr ip, ip, r9, pull #\pull | 150 | orr ip, ip, r9, pull #\pull |
151 | mov r9, r9, push #\push | 151 | mov r9, r9, push #\push |
152 | orr r9, r9, r8, pull #\pull | 152 | orr r9, r9, r8, pull #\pull |
153 | mov r8, r8, push #\push | 153 | mov r8, r8, push #\push |
154 | orr r8, r8, r7, pull #\pull | 154 | orr r8, r8, r7, pull #\pull |
155 | mov r7, r7, push #\push | 155 | mov r7, r7, push #\push |
156 | orr r7, r7, r6, pull #\pull | 156 | orr r7, r7, r6, pull #\pull |
157 | mov r6, r6, push #\push | 157 | mov r6, r6, push #\push |
158 | orr r6, r6, r5, pull #\pull | 158 | orr r6, r6, r5, pull #\pull |
159 | mov r5, r5, push #\push | 159 | mov r5, r5, push #\push |
160 | orr r5, r5, r4, pull #\pull | 160 | orr r5, r5, r4, pull #\pull |
161 | mov r4, r4, push #\push | 161 | mov r4, r4, push #\push |
162 | orr r4, r4, r3, pull #\pull | 162 | orr r4, r4, r3, pull #\pull |
163 | stmdb r0!, {r4 - r9, ip, lr} | 163 | stmdb r0!, {r4 - r9, ip, lr} |
164 | bge 12b | 164 | bge 12b |
165 | 165 | ||
166 | ldmfd sp!, {r5 - r9} | 166 | ldmfd sp!, {r5 - r9} |
167 | 167 | ||
168 | 14: ands ip, r2, #28 | 168 | 14: ands ip, r2, #28 |
169 | beq 16f | 169 | beq 16f |
170 | 170 | ||
171 | 15: mov lr, r3, push #\push | 171 | 15: mov lr, r3, push #\push |
172 | ldr r3, [r1, #-4]! | 172 | ldr r3, [r1, #-4]! |
173 | subs ip, ip, #4 | 173 | subs ip, ip, #4 |
174 | orr lr, lr, r3, pull #\pull | 174 | orr lr, lr, r3, pull #\pull |
175 | str lr, [r0, #-4]! | 175 | str lr, [r0, #-4]! |
176 | bgt 15b | 176 | bgt 15b |
177 | 177 | ||
178 | 16: add r1, r1, #(\pull / 8) | 178 | 16: add r1, r1, #(\pull / 8) |
179 | b 8b | 179 | b 8b |
180 | 180 | ||
181 | .endm | 181 | .endm |
182 | 182 | ||
183 | 183 | ||
184 | backward_copy_shift push=8 pull=24 | 184 | backward_copy_shift push=8 pull=24 |
185 | 185 | ||
186 | 17: backward_copy_shift push=16 pull=16 | 186 | 17: backward_copy_shift push=16 pull=16 |
187 | 187 | ||
188 | 18: backward_copy_shift push=24 pull=8 | 188 | 18: backward_copy_shift push=24 pull=8 |
189 | 189 | ||
190 | 190 | ||