1
2
3
4
5
6
7
8
9
10
11
12#include <variant/core.h>
13
14 .macro src_b r, w0, w1
15#ifdef __XTENSA_EB__
16 src \r, \w0, \w1
17#else
18 src \r, \w1, \w0
19#endif
20 .endm
21
22 .macro ssa8 r
23#ifdef __XTENSA_EB__
24 ssa8b \r
25#else
26 ssa8l \r
27#endif
28 .endm
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 .text
73
74
75
76
77 .align 4
78 .byte 0
79
80.Lbytecopy:
81
82 loopnez a4, .Lbytecopydone
83#else
84 beqz a4, .Lbytecopydone
85 add a7, a3, a4
86#endif
87.Lnextbyte:
88 l8ui a6, a3, 0
89 addi a3, a3, 1
90 s8i a6, a5, 0
91 addi a5, a5, 1
92
93 bne a3, a7, .Lnextbyte
94#endif
95.Lbytecopydone:
96 retw
97
98
99
100
101
102 .align 4
103.Ldst1mod2:
104 _bltui a4, 7, .Lbytecopy
105
106
107 l8ui a6, a3, 0
108 addi a3, a3, 1
109 addi a4, a4, -1
110 s8i a6, a5, 0
111 addi a5, a5, 1
112 _bbci.l a5, 1, .Ldstaligned
113
114.Ldst2mod4:
115
116 _bltui a4, 6, .Lbytecopy
117 l8ui a6, a3, 0
118 l8ui a7, a3, 1
119 addi a3, a3, 2
120 addi a4, a4, -2
121 s8i a6, a5, 0
122 s8i a7, a5, 1
123 addi a5, a5, 2
124 j .Ldstaligned
125
126 .align 4
127 .global memcpy
128 .type memcpy,@function
129memcpy:
130
131 entry sp, 16
132
133 mov a5, a2
134.Lcommon:
135 _bbsi.l a2, 0, .Ldst1mod2
136 _bbsi.l a2, 1, .Ldst2mod4
137.Ldstaligned:
138 srli a7, a4, 4
139
140 movi a8, 3
141 _bany a3, a8, .Lsrcunaligned
142
143
144
145
146
147 loopnez a7, .Loop1done
148#else
149 beqz a7, .Loop1done
150 slli a8, a7, 4
151 add a8, a8, a3
152#endif
153.Loop1:
154 l32i a6, a3, 0
155 l32i a7, a3, 4
156 s32i a6, a5, 0
157 l32i a6, a3, 8
158 s32i a7, a5, 4
159 l32i a7, a3, 12
160 s32i a6, a5, 8
161 addi a3, a3, 16
162 s32i a7, a5, 12
163 addi a5, a5, 16
164
165 bne a3, a8, .Loop1
166#endif
167.Loop1done:
168 bbci.l a4, 3, .L2
169
170 l32i a6, a3, 0
171 l32i a7, a3, 4
172 addi a3, a3, 8
173 s32i a6, a5, 0
174 s32i a7, a5, 4
175 addi a5, a5, 8
176.L2:
177 bbsi.l a4, 2, .L3
178 bbsi.l a4, 1, .L4
179 bbsi.l a4, 0, .L5
180 retw
181.L3:
182
183 l32i a6, a3, 0
184 addi a3, a3, 4
185 s32i a6, a5, 0
186 addi a5, a5, 4
187 bbsi.l a4, 1, .L4
188 bbsi.l a4, 0, .L5
189 retw
190.L4:
191
192 l16ui a6, a3, 0
193 addi a3, a3, 2
194 s16i a6, a5, 0
195 addi a5, a5, 2
196 bbsi.l a4, 0, .L5
197 retw
198.L5:
199
200 l8ui a6, a3, 0
201 s8i a6, a5, 0
202 retw
203
204
205
206
207
208 .align 4
209.Lsrcunaligned:
210 _beqz a4, .Ldone
211
212 ssa8 a3
213
214
215
216#define SIM_CHECKS_ALIGNMENT 1
217
218 and a11, a3, a8
219 sub a3, a3, a11
220#endif
221 l32i a6, a3, 0
222
223 loopnez a7, .Loop2done
224#else
225 beqz a7, .Loop2done
226 slli a10, a7, 4
227 add a10, a10, a3
228#endif
229.Loop2:
230 l32i a7, a3, 4
231 l32i a8, a3, 8
232 src_b a6, a6, a7
233 s32i a6, a5, 0
234 l32i a9, a3, 12
235 src_b a7, a7, a8
236 s32i a7, a5, 4
237 l32i a6, a3, 16
238 src_b a8, a8, a9
239 s32i a8, a5, 8
240 addi a3, a3, 16
241 src_b a9, a9, a6
242 s32i a9, a5, 12
243 addi a5, a5, 16
244
245 bne a3, a10, .Loop2
246#endif
247.Loop2done:
248 bbci.l a4, 3, .L12
249
250 l32i a7, a3, 4
251 l32i a8, a3, 8
252 src_b a6, a6, a7
253 s32i a6, a5, 0
254 addi a3, a3, 8
255 src_b a7, a7, a8
256 s32i a7, a5, 4
257 addi a5, a5, 8
258 mov a6, a8
259.L12:
260 bbci.l a4, 2, .L13
261
262 l32i a7, a3, 4
263 addi a3, a3, 4
264 src_b a6, a6, a7
265 s32i a6, a5, 0
266 addi a5, a5, 4
267 mov a6, a7
268.L13:
269
270 add a3, a3, a11
271#endif
272 bbsi.l a4, 1, .L14
273 bbsi.l a4, 0, .L15
274.Ldone: retw
275.L14:
276
277 l8ui a6, a3, 0
278 l8ui a7, a3, 1
279 addi a3, a3, 2
280 s8i a6, a5, 0
281 s8i a7, a5, 1
282 addi a5, a5, 2
283 bbsi.l a4, 0, .L15
284 retw
285.L15:
286
287 l8ui a6, a3, 0
288 s8i a6, a5, 0
289 retw
290
291
292
293
294
295 .align 4
296 .global bcopy
297 .type bcopy,@function
298bcopy:
299 entry sp, 16
300
301 mov a5, a3
302 mov a3, a2
303 mov a2, a5
304 j .Lmovecommon
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343 .align 4
344 .byte 0
345
346.Lbackbytecopy:
347
348 loopnez a4, .Lbackbytecopydone
349#else
350 beqz a4, .Lbackbytecopydone
351 sub a7, a3, a4
352#endif
353.Lbacknextbyte:
354 addi a3, a3, -1
355 l8ui a6, a3, 0
356 addi a5, a5, -1
357 s8i a6, a5, 0
358
359 bne a3, a7, .Lbacknextbyte
360
361#endif
362.Lbackbytecopydone:
363 retw
364
365
366
367
368
369 .align 4
370.Lbackdst1mod2:
371 _bltui a4, 7, .Lbackbytecopy
372
373
374 addi a3, a3, -1
375 l8ui a6, a3, 0
376 addi a5, a5, -1
377 s8i a6, a5, 0
378 addi a4, a4, -1
379 _bbci.l a5, 1, .Lbackdstaligned
380
381.Lbackdst2mod4:
382
383 _bltui a4, 6, .Lbackbytecopy
384 addi a3, a3, -2
385 l8ui a6, a3, 0
386 l8ui a7, a3, 1
387 addi a5, a5, -2
388 s8i a6, a5, 0
389 s8i a7, a5, 1
390 addi a4, a4, -2
391 j .Lbackdstaligned
392
393
394 .align 4
395 .global memmove
396 .type memmove,@function
397memmove:
398
399 entry sp, 16
400
401 mov a5, a2
402.Lmovecommon:
403 sub a6, a5, a3
404 bgeu a6, a4, .Lcommon
405
406 add a5, a5, a4
407 add a3, a3, a4
408
409 _bbsi.l a5, 0, .Lbackdst1mod2
410 _bbsi.l a5, 1, .Lbackdst2mod4
411.Lbackdstaligned:
412 srli a7, a4, 4
413
414 movi a8, 3
415 _bany a3, a8, .Lbacksrcunaligned
416
417
418
419
420
421 loopnez a7, .backLoop1done
422#else
423 beqz a7, .backLoop1done
424 slli a8, a7, 4
425 sub a8, a3, a8
426#endif
427.backLoop1:
428 addi a3, a3, -16
429 l32i a7, a3, 12
430 l32i a6, a3, 8
431 addi a5, a5, -16
432 s32i a7, a5, 12
433 l32i a7, a3, 4
434 s32i a6, a5, 8
435 l32i a6, a3, 0
436 s32i a7, a5, 4
437 s32i a6, a5, 0
438
439 bne a3, a8, .backLoop1
440#endif
441.backLoop1done:
442 bbci.l a4, 3, .Lback2
443
444 addi a3, a3, -8
445 l32i a6, a3, 0
446 l32i a7, a3, 4
447 addi a5, a5, -8
448 s32i a6, a5, 0
449 s32i a7, a5, 4
450.Lback2:
451 bbsi.l a4, 2, .Lback3
452 bbsi.l a4, 1, .Lback4
453 bbsi.l a4, 0, .Lback5
454 retw
455.Lback3:
456
457 addi a3, a3, -4
458 l32i a6, a3, 0
459 addi a5, a5, -4
460 s32i a6, a5, 0
461 bbsi.l a4, 1, .Lback4
462 bbsi.l a4, 0, .Lback5
463 retw
464.Lback4:
465
466 addi a3, a3, -2
467 l16ui a6, a3, 0
468 addi a5, a5, -2
469 s16i a6, a5, 0
470 bbsi.l a4, 0, .Lback5
471 retw
472.Lback5:
473
474 addi a3, a3, -1
475 l8ui a6, a3, 0
476 addi a5, a5, -1
477 s8i a6, a5, 0
478 retw
479
480
481
482
483
484 .align 4
485.Lbacksrcunaligned:
486 _beqz a4, .Lbackdone
487
488 ssa8 a3
489#define SIM_CHECKS_ALIGNMENT 1
490
491
492
493 and a11, a3, a8
494 sub a3, a3, a11
495#endif
496 l32i a6, a3, 0
497
498 loopnez a7, .backLoop2done
499#else
500 beqz a7, .backLoop2done
501 slli a10, a7, 4
502 sub a10, a3, a10
503#endif
504.backLoop2:
505 addi a3, a3, -16
506 l32i a7, a3, 12
507 l32i a8, a3, 8
508 addi a5, a5, -16
509 src_b a6, a7, a6
510 s32i a6, a5, 12
511 l32i a9, a3, 4
512 src_b a7, a8, a7
513 s32i a7, a5, 8
514 l32i a6, a3, 0
515 src_b a8, a9, a8
516 s32i a8, a5, 4
517 src_b a9, a6, a9
518 s32i a9, a5, 0
519
520 bne a3, a10, .backLoop2
521#endif
522.backLoop2done:
523 bbci.l a4, 3, .Lback12
524
525 addi a3, a3, -8
526 l32i a7, a3, 4
527 l32i a8, a3, 0
528 addi a5, a5, -8
529 src_b a6, a7, a6
530 s32i a6, a5, 4
531 src_b a7, a8, a7
532 s32i a7, a5, 0
533 mov a6, a8
534.Lback12:
535 bbci.l a4, 2, .Lback13
536
537 addi a3, a3, -4
538 l32i a7, a3, 0
539 addi a5, a5, -4
540 src_b a6, a7, a6
541 s32i a6, a5, 0
542 mov a6, a7
543.Lback13:
544
545 add a3, a3, a11
546#endif
547 bbsi.l a4, 1, .Lback14
548 bbsi.l a4, 0, .Lback15
549.Lbackdone:
550 retw
551.Lback14:
552
553 addi a3, a3, -2
554 l8ui a6, a3, 0
555 l8ui a7, a3, 1
556 addi a5, a5, -2
557 s8i a6, a5, 0
558 s8i a7, a5, 1
559 bbsi.l a4, 0, .Lback15
560 retw
561.Lback15:
562
563 addi a3, a3, -1
564 addi a5, a5, -1
565 l8ui a6, a3, 0
566 s8i a6, a5, 0
567 retw
568
569
570
571
572
573
574
575
576
577