Loading...
1/* SPDX-License-Identifier: GPL-2.0 */
2/* bzero.S: Simple prefetching memset, bzero, and clear_user
3 * implementations.
4 *
5 * Copyright (C) 2005 David S. Miller <davem@davemloft.net>
6 */
7
8#include <linux/linkage.h>
9#include <asm/export.h>
10
11 .text
12
13ENTRY(memset) /* %o0=buf, %o1=pat, %o2=len */
14 and %o1, 0xff, %o3
15 mov %o2, %o1
16 sllx %o3, 8, %g1
17 or %g1, %o3, %o2
18 sllx %o2, 16, %g1
19 or %g1, %o2, %o2
20 sllx %o2, 32, %g1
21 ba,pt %xcc, 1f
22 or %g1, %o2, %o2
23
24ENTRY(__bzero) /* %o0=buf, %o1=len */
25 clr %o2
261: mov %o0, %o3
27 brz,pn %o1, __bzero_done
28 cmp %o1, 16
29 bl,pn %icc, __bzero_tiny
30 prefetch [%o0 + 0x000], #n_writes
31 andcc %o0, 0x3, %g0
32 be,pt %icc, 2f
331: stb %o2, [%o0 + 0x00]
34 add %o0, 1, %o0
35 andcc %o0, 0x3, %g0
36 bne,pn %icc, 1b
37 sub %o1, 1, %o1
382: andcc %o0, 0x7, %g0
39 be,pt %icc, 3f
40 stw %o2, [%o0 + 0x00]
41 sub %o1, 4, %o1
42 add %o0, 4, %o0
433: and %o1, 0x38, %g1
44 cmp %o1, 0x40
45 andn %o1, 0x3f, %o4
46 bl,pn %icc, 5f
47 and %o1, 0x7, %o1
48 prefetch [%o0 + 0x040], #n_writes
49 prefetch [%o0 + 0x080], #n_writes
50 prefetch [%o0 + 0x0c0], #n_writes
51 prefetch [%o0 + 0x100], #n_writes
52 prefetch [%o0 + 0x140], #n_writes
534: prefetch [%o0 + 0x180], #n_writes
54 stx %o2, [%o0 + 0x00]
55 stx %o2, [%o0 + 0x08]
56 stx %o2, [%o0 + 0x10]
57 stx %o2, [%o0 + 0x18]
58 stx %o2, [%o0 + 0x20]
59 stx %o2, [%o0 + 0x28]
60 stx %o2, [%o0 + 0x30]
61 stx %o2, [%o0 + 0x38]
62 subcc %o4, 0x40, %o4
63 bne,pt %icc, 4b
64 add %o0, 0x40, %o0
65 brz,pn %g1, 6f
66 nop
675: stx %o2, [%o0 + 0x00]
68 subcc %g1, 8, %g1
69 bne,pt %icc, 5b
70 add %o0, 0x8, %o0
716: brz,pt %o1, __bzero_done
72 nop
73__bzero_tiny:
741: stb %o2, [%o0 + 0x00]
75 subcc %o1, 1, %o1
76 bne,pt %icc, 1b
77 add %o0, 1, %o0
78__bzero_done:
79 retl
80 mov %o3, %o0
81ENDPROC(__bzero)
82ENDPROC(memset)
83EXPORT_SYMBOL(__bzero)
84EXPORT_SYMBOL(memset)
85
86#define EX_ST(x,y) \
8798: x,y; \
88 .section __ex_table,"a";\
89 .align 4; \
90 .word 98b, __retl_o1; \
91 .text; \
92 .align 4;
93
94ENTRY(__clear_user) /* %o0=buf, %o1=len */
95 brz,pn %o1, __clear_user_done
96 cmp %o1, 16
97 bl,pn %icc, __clear_user_tiny
98 EX_ST(prefetcha [%o0 + 0x00] %asi, #n_writes)
99 andcc %o0, 0x3, %g0
100 be,pt %icc, 2f
1011: EX_ST(stba %g0, [%o0 + 0x00] %asi)
102 add %o0, 1, %o0
103 andcc %o0, 0x3, %g0
104 bne,pn %icc, 1b
105 sub %o1, 1, %o1
1062: andcc %o0, 0x7, %g0
107 be,pt %icc, 3f
108 EX_ST(stwa %g0, [%o0 + 0x00] %asi)
109 sub %o1, 4, %o1
110 add %o0, 4, %o0
1113: and %o1, 0x38, %g1
112 cmp %o1, 0x40
113 andn %o1, 0x3f, %o4
114 bl,pn %icc, 5f
115 and %o1, 0x7, %o1
116 EX_ST(prefetcha [%o0 + 0x040] %asi, #n_writes)
117 EX_ST(prefetcha [%o0 + 0x080] %asi, #n_writes)
118 EX_ST(prefetcha [%o0 + 0x0c0] %asi, #n_writes)
119 EX_ST(prefetcha [%o0 + 0x100] %asi, #n_writes)
120 EX_ST(prefetcha [%o0 + 0x140] %asi, #n_writes)
1214: EX_ST(prefetcha [%o0 + 0x180] %asi, #n_writes)
122 EX_ST(stxa %g0, [%o0 + 0x00] %asi)
123 EX_ST(stxa %g0, [%o0 + 0x08] %asi)
124 EX_ST(stxa %g0, [%o0 + 0x10] %asi)
125 EX_ST(stxa %g0, [%o0 + 0x18] %asi)
126 EX_ST(stxa %g0, [%o0 + 0x20] %asi)
127 EX_ST(stxa %g0, [%o0 + 0x28] %asi)
128 EX_ST(stxa %g0, [%o0 + 0x30] %asi)
129 EX_ST(stxa %g0, [%o0 + 0x38] %asi)
130 subcc %o4, 0x40, %o4
131 bne,pt %icc, 4b
132 add %o0, 0x40, %o0
133 brz,pn %g1, 6f
134 nop
1355: EX_ST(stxa %g0, [%o0 + 0x00] %asi)
136 subcc %g1, 8, %g1
137 bne,pt %icc, 5b
138 add %o0, 0x8, %o0
1396: brz,pt %o1, __clear_user_done
140 nop
141__clear_user_tiny:
1421: EX_ST(stba %g0, [%o0 + 0x00] %asi)
143 subcc %o1, 1, %o1
144 bne,pt %icc, 1b
145 add %o0, 1, %o0
146__clear_user_done:
147 retl
148 clr %o0
149ENDPROC(__clear_user)
150EXPORT_SYMBOL(__clear_user)
1/* bzero.S: Simple prefetching memset, bzero, and clear_user
2 * implementations.
3 *
4 * Copyright (C) 2005 David S. Miller <davem@davemloft.net>
5 */
6
7#include <linux/linkage.h>
8#include <asm/export.h>
9
10 .text
11
12ENTRY(memset) /* %o0=buf, %o1=pat, %o2=len */
13 and %o1, 0xff, %o3
14 mov %o2, %o1
15 sllx %o3, 8, %g1
16 or %g1, %o3, %o2
17 sllx %o2, 16, %g1
18 or %g1, %o2, %o2
19 sllx %o2, 32, %g1
20 ba,pt %xcc, 1f
21 or %g1, %o2, %o2
22
23ENTRY(__bzero) /* %o0=buf, %o1=len */
24 clr %o2
251: mov %o0, %o3
26 brz,pn %o1, __bzero_done
27 cmp %o1, 16
28 bl,pn %icc, __bzero_tiny
29 prefetch [%o0 + 0x000], #n_writes
30 andcc %o0, 0x3, %g0
31 be,pt %icc, 2f
321: stb %o2, [%o0 + 0x00]
33 add %o0, 1, %o0
34 andcc %o0, 0x3, %g0
35 bne,pn %icc, 1b
36 sub %o1, 1, %o1
372: andcc %o0, 0x7, %g0
38 be,pt %icc, 3f
39 stw %o2, [%o0 + 0x00]
40 sub %o1, 4, %o1
41 add %o0, 4, %o0
423: and %o1, 0x38, %g1
43 cmp %o1, 0x40
44 andn %o1, 0x3f, %o4
45 bl,pn %icc, 5f
46 and %o1, 0x7, %o1
47 prefetch [%o0 + 0x040], #n_writes
48 prefetch [%o0 + 0x080], #n_writes
49 prefetch [%o0 + 0x0c0], #n_writes
50 prefetch [%o0 + 0x100], #n_writes
51 prefetch [%o0 + 0x140], #n_writes
524: prefetch [%o0 + 0x180], #n_writes
53 stx %o2, [%o0 + 0x00]
54 stx %o2, [%o0 + 0x08]
55 stx %o2, [%o0 + 0x10]
56 stx %o2, [%o0 + 0x18]
57 stx %o2, [%o0 + 0x20]
58 stx %o2, [%o0 + 0x28]
59 stx %o2, [%o0 + 0x30]
60 stx %o2, [%o0 + 0x38]
61 subcc %o4, 0x40, %o4
62 bne,pt %icc, 4b
63 add %o0, 0x40, %o0
64 brz,pn %g1, 6f
65 nop
665: stx %o2, [%o0 + 0x00]
67 subcc %g1, 8, %g1
68 bne,pt %icc, 5b
69 add %o0, 0x8, %o0
706: brz,pt %o1, __bzero_done
71 nop
72__bzero_tiny:
731: stb %o2, [%o0 + 0x00]
74 subcc %o1, 1, %o1
75 bne,pt %icc, 1b
76 add %o0, 1, %o0
77__bzero_done:
78 retl
79 mov %o3, %o0
80ENDPROC(__bzero)
81ENDPROC(memset)
82EXPORT_SYMBOL(__bzero)
83EXPORT_SYMBOL(memset)
84
85#define EX_ST(x,y) \
8698: x,y; \
87 .section __ex_table,"a";\
88 .align 4; \
89 .word 98b, __retl_o1; \
90 .text; \
91 .align 4;
92
93ENTRY(__clear_user) /* %o0=buf, %o1=len */
94 brz,pn %o1, __clear_user_done
95 cmp %o1, 16
96 bl,pn %icc, __clear_user_tiny
97 EX_ST(prefetcha [%o0 + 0x00] %asi, #n_writes)
98 andcc %o0, 0x3, %g0
99 be,pt %icc, 2f
1001: EX_ST(stba %g0, [%o0 + 0x00] %asi)
101 add %o0, 1, %o0
102 andcc %o0, 0x3, %g0
103 bne,pn %icc, 1b
104 sub %o1, 1, %o1
1052: andcc %o0, 0x7, %g0
106 be,pt %icc, 3f
107 EX_ST(stwa %g0, [%o0 + 0x00] %asi)
108 sub %o1, 4, %o1
109 add %o0, 4, %o0
1103: and %o1, 0x38, %g1
111 cmp %o1, 0x40
112 andn %o1, 0x3f, %o4
113 bl,pn %icc, 5f
114 and %o1, 0x7, %o1
115 EX_ST(prefetcha [%o0 + 0x040] %asi, #n_writes)
116 EX_ST(prefetcha [%o0 + 0x080] %asi, #n_writes)
117 EX_ST(prefetcha [%o0 + 0x0c0] %asi, #n_writes)
118 EX_ST(prefetcha [%o0 + 0x100] %asi, #n_writes)
119 EX_ST(prefetcha [%o0 + 0x140] %asi, #n_writes)
1204: EX_ST(prefetcha [%o0 + 0x180] %asi, #n_writes)
121 EX_ST(stxa %g0, [%o0 + 0x00] %asi)
122 EX_ST(stxa %g0, [%o0 + 0x08] %asi)
123 EX_ST(stxa %g0, [%o0 + 0x10] %asi)
124 EX_ST(stxa %g0, [%o0 + 0x18] %asi)
125 EX_ST(stxa %g0, [%o0 + 0x20] %asi)
126 EX_ST(stxa %g0, [%o0 + 0x28] %asi)
127 EX_ST(stxa %g0, [%o0 + 0x30] %asi)
128 EX_ST(stxa %g0, [%o0 + 0x38] %asi)
129 subcc %o4, 0x40, %o4
130 bne,pt %icc, 4b
131 add %o0, 0x40, %o0
132 brz,pn %g1, 6f
133 nop
1345: EX_ST(stxa %g0, [%o0 + 0x00] %asi)
135 subcc %g1, 8, %g1
136 bne,pt %icc, 5b
137 add %o0, 0x8, %o0
1386: brz,pt %o1, __clear_user_done
139 nop
140__clear_user_tiny:
1411: EX_ST(stba %g0, [%o0 + 0x00] %asi)
142 subcc %o1, 1, %o1
143 bne,pt %icc, 1b
144 add %o0, 1, %o0
145__clear_user_done:
146 retl
147 clr %o0
148ENDPROC(__clear_user)
149EXPORT_SYMBOL(__clear_user)