1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
| /* SPDX-License-Identifier: GPL-2.0 */
| /* Cloned and hacked for uClibc by Paul Mundt, December 2003 */
| /* Modified by SuperH, Inc. September 2003 */
| !
| ! Fast SH memset
| !
| ! by Toshiyasu Morita (tm@netcom.com)
| !
| ! SH5 code by J"orn Rennecke (joern.rennecke@superh.com)
| ! Copyright 2002 SuperH Ltd.
| !
|
| #if __BYTE_ORDER == __LITTLE_ENDIAN
| #define SHHI shlld
| #define SHLO shlrd
| #else
| #define SHHI shlrd
| #define SHLO shlld
| #endif
|
| .section .text..SHmedia32,"ax"
| .globl memset
| .type memset, @function
|
| .align 5
|
| memset:
| pta/l multiquad, tr0
| andi r2, 7, r22
| ptabs r18, tr2
| mshflo.b r3,r3,r3
| add r4, r22, r23
| mperm.w r3, r63, r3 // Fill pattern now in every byte of r3
|
| movi 8, r9
| bgtu/u r23, r9, tr0 // multiquad
|
| beqi/u r4, 0, tr2 // Return with size 0 - ensures no mem accesses
| ldlo.q r2, 0, r7
| shlli r4, 2, r4
| movi -1, r8
| SHHI r8, r4, r8
| SHHI r8, r4, r8
| mcmv r7, r8, r3
| stlo.q r2, 0, r3
| blink tr2, r63
|
| multiquad:
| pta/l lastquad, tr0
| stlo.q r2, 0, r3
| shlri r23, 3, r24
| add r2, r4, r5
| beqi/u r24, 1, tr0 // lastquad
| pta/l loop, tr1
| sub r2, r22, r25
| andi r5, -8, r20 // calculate end address and
| addi r20, -7*8, r8 // loop end address; This might overflow, so we need
| // to use a different test before we start the loop
| bge/u r24, r9, tr1 // loop
| st.q r25, 8, r3
| st.q r20, -8, r3
| shlri r24, 1, r24
| beqi/u r24, 1, tr0 // lastquad
| st.q r25, 16, r3
| st.q r20, -16, r3
| beqi/u r24, 2, tr0 // lastquad
| st.q r25, 24, r3
| st.q r20, -24, r3
| lastquad:
| sthi.q r5, -1, r3
| blink tr2,r63
|
| loop:
| !!! alloco r25, 32 // QQQ comment out for short-term fix to SHUK #3895.
| // QQQ commenting out is locically correct, but sub-optimal
| // QQQ Sean McGoogan - 4th April 2003.
| st.q r25, 8, r3
| st.q r25, 16, r3
| st.q r25, 24, r3
| st.q r25, 32, r3
| addi r25, 32, r25
| bgeu/l r8, r25, tr1 // loop
|
| st.q r20, -40, r3
| st.q r20, -32, r3
| st.q r20, -24, r3
| st.q r20, -16, r3
| st.q r20, -8, r3
| sthi.q r5, -1, r3
| blink tr2,r63
|
| .size memset,.-memset
|
|