* better
[mascara-docs.git] / i386 / linux-2.3.21 / arch / sparc64 / lib / VISmemset.S
blob7ccd7b8180ead9440e0cc0a2ce65bb55554e5713
1 /* $Id: VISmemset.S,v 1.9 1999/05/25 16:53:01 jj Exp $
2  * VISmemset.S: High speed memset operations utilizing the UltraSparc
3  *        Visual Instruction Set.
4  *
5  * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
6  * Copyright (C) 1996, 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
7  */
9 #include "VIS.h"
11 #ifdef REGS_64BIT
12 #define SET_BLOCKS(base, offset, source)        \
13         stx     source, [base - offset - 0x18]; \
14         stx     source, [base - offset - 0x10]; \
15         stx     source, [base - offset - 0x08]; \
16         stx     source, [base - offset - 0x00];
17 #else
18 #define SET_BLOCKS(base, offset, source)        \
19         stw     source, [base - offset - 0x18]; \
20         stw     source, [base - offset - 0x14]; \
21         stw     source, [base - offset - 0x10]; \
22         stw     source, [base - offset - 0x0c]; \
23         stw     source, [base - offset - 0x08]; \
24         stw     source, [base - offset - 0x04]; \
25         stw     source, [base - offset - 0x00]; \
26         stw     source, [base - offset + 0x04];
27 #endif
29 #ifndef __KERNEL__
30 /* So that the brz,a,pt in memset doesn't have to get through PLT, here we go... */
31 #include "VISbzero.S"
32 #endif
34 #ifdef __KERNEL__
36 #include <asm/visasm.h>
38 #define RETL    clr %o0
39 #else
40 #define RETL    mov %g3, %o0
41 #endif
43         /* Well, memset is a lot easier to get right than bcopy... */
44         .text
45         .align          32
46 #ifdef __KERNEL__
47         .globl          __memset
48 __memset:
49 #endif
50         .globl          memset
51 memset:
52 #ifndef __KERNEL__
53         brz,a,pt        %o1, bzero_private
54          mov            %o2, %o1
55 #ifndef REGS_64BIT
56         srl             %o2, 0, %o2
57 #endif
58         mov             %o0, %g3
59 #endif
60         cmp             %o2, 7
61         bleu,pn         %xcc, 17f
62          andcc          %o0, 3, %g5
63         be,pt           %xcc, 4f
64          and            %o1, 0xff, %o1
65         cmp             %g5, 3
66         be,pn           %xcc, 2f
67          stb            %o1, [%o0 + 0x00]
68         cmp             %g5, 2
69         be,pt           %xcc, 2f
70          stb            %o1, [%o0 + 0x01]
71         stb             %o1, [%o0 + 0x02]
72 2:      sub             %g5, 4, %g5
73         sub             %o0, %g5, %o0
74         add             %o2, %g5, %o2
75 4:      sllx            %o1, 8, %g1
76         andcc           %o0, 4, %g0
77         or              %o1, %g1, %o1
78         sllx            %o1, 16, %g1
79         or              %o1, %g1, %o1
80         be,pt           %xcc, 2f
81 #ifdef REGS_64BIT
82          sllx           %o1, 32, %g1
83 #else
84          cmp            %o2, 128
85 #endif
86         stw             %o1, [%o0]
87         sub             %o2, 4, %o2
88         add             %o0, 4, %o0
90 #ifdef REGS_64BIT
91         cmp             %o2, 128
92         or              %o1, %g1, %o1
93 #endif
94         blu,pn          %xcc, 9f
95          andcc          %o0, 0x38, %g5
96         be,pn           %icc, 6f
97          mov            64, %o5
98         andcc           %o0, 8, %g0
99         be,pn           %icc, 1f
100          sub            %o5, %g5, %o5
101 #ifdef REGS_64BIT
102         stx             %o1, [%o0]
103 #else
104         stw             %o1, [%o0]
105         stw             %o1, [%o0 + 4]
106 #endif
107         add             %o0, 8, %o0
108 1:      andcc           %o5, 16, %g0
109         be,pn           %icc, 1f
110          sub            %o2, %o5, %o2
111 #ifdef REGS_64BIT
112         stx             %o1, [%o0]
113         stx             %o1, [%o0 + 8]
114 #else
115         stw             %o1, [%o0]
116         stw             %o1, [%o0 + 4]
117         stw             %o1, [%o0 + 8]
118         stw             %o1, [%o0 + 12]
119 #endif
120         add             %o0, 16, %o0
121 1:      andcc           %o5, 32, %g0
122         be,pn           %icc, 7f
123          andncc         %o2, 0x3f, %o3
124 #ifdef REGS_64BIT
125         stx             %o1, [%o0]
126         stx             %o1, [%o0 + 8]
127         stx             %o1, [%o0 + 16]
128         stx             %o1, [%o0 + 24]
129 #else
130         stw             %o1, [%o0]
131         stw             %o1, [%o0 + 4]
132         stw             %o1, [%o0 + 8]
133         stw             %o1, [%o0 + 12]
134         stw             %o1, [%o0 + 16]
135         stw             %o1, [%o0 + 20]
136         stw             %o1, [%o0 + 24]
137         stw             %o1, [%o0 + 28]
138 #endif
139         add             %o0, 32, %o0
140 7:      be,pn           %xcc, 9f
141          nop
142 #ifdef __KERNEL__
143         VISEntryHalf
144 #endif
145         ldd             [%o0 - 8], %f0
146 18:     rd              %asi, %g2
147         wr              %g0, ASI_BLK_P, %asi
148         membar          #StoreStore | #LoadStore
149         andcc           %o3, 0xc0, %g5
150         and             %o2, 0x3f, %o2
151         fmovd           %f0, %f2
152         fmovd           %f0, %f4
153         andn            %o3, 0xff, %o3
154         fmovd           %f0, %f6
155         cmp             %g5, 64
156         fmovd           %f0, %f8
157         fmovd           %f0, %f10
158         fmovd           %f0, %f12
159         brz,pn          %g5, 10f
160          fmovd          %f0, %f14
161         be,pn           %icc, 2f
162          stda           %f0, [%o0 + 0x00] %asi
163         cmp             %g5, 128
164         be,pn           %icc, 2f
165          stda           %f0, [%o0 + 0x40] %asi
166         stda            %f0, [%o0 + 0x80] %asi
167 2:      brz,pn          %o3, 12f
168          add            %o0, %g5, %o0
169 10:     stda            %f0, [%o0 + 0x00] %asi
170         stda            %f0, [%o0 + 0x40] %asi
171         stda            %f0, [%o0 + 0x80] %asi
172         stda            %f0, [%o0 + 0xc0] %asi
173 11:     subcc           %o3, 256, %o3
174         bne,pt          %xcc, 10b
175          add            %o0, 256, %o0
177 #ifdef __KERNEL__
178         wr              %g2, %g0, %asi
179         VISExitHalf
180 #else
181 #ifndef REGS_64BIT
182         wr              %g0, FPRS_FEF, %fprs
183 #endif
184 #endif
185         membar          #StoreLoad | #StoreStore
186 9:      andcc           %o2, 0x78, %g5
187         be,pn           %xcc, 13f
188          andcc          %o2, 7, %o2
189 #ifdef __KERNEL__
190 14:     srl             %g5, 1, %o3
191         sethi           %hi(13f), %o4
192         sub             %o4, %o3, %o4
193         jmpl            %o4 + %lo(13f), %g0
194          add            %o0, %g5, %o0
195 #else
196 14:     rd              %pc, %o4
197 #ifdef REGS_64BIT
198         srl             %g5, 1, %o3
199         sub             %o4, %o3, %o4
200 #else
201         sub             %o4, %g5, %o4
202 #endif
203         jmpl            %o4 + (13f - 14b), %g0
204          add            %o0, %g5, %o0
205 #endif
206 12:     SET_BLOCKS(%o0, 0x68, %o1)
207         SET_BLOCKS(%o0, 0x48, %o1)
208         SET_BLOCKS(%o0, 0x28, %o1)
209         SET_BLOCKS(%o0, 0x08, %o1)
210 13:     be,pn           %xcc, 8f
211          andcc          %o2, 4, %g0
212         be,pn           %xcc, 1f
213          andcc          %o2, 2, %g0
214         stw             %o1, [%o0]
215         add             %o0, 4, %o0
216 1:      be,pn           %xcc, 1f
217          andcc          %o2, 1, %g0
218         sth             %o1, [%o0]
219         add             %o0, 2, %o0
220 1:      bne,a,pn        %xcc, 8f
221          stb            %o1, [%o0]
222 8:      retl
223          RETL
224 17:     brz,pn          %o2, 0f
225 8:       add            %o0, 1, %o0
226         subcc           %o2, 1, %o2
227         bne,pt          %xcc, 8b
228          stb            %o1, [%o0 - 1]
229 0:      retl
230          RETL
232 #ifdef REGS_64BIT
233         stx             %o1, [%o0]
234 #else
235         stw             %o1, [%o0]
236         stw             %o1, [%o0 + 4]
237 #endif
238         andncc          %o2, 0x3f, %o3
239         be,pn           %xcc, 9b
240          nop
241 #ifdef __KERNEL__
242         VISEntryHalf
243 #endif
244         ba,pt           %xcc, 18b
245          ldd            [%o0], %f0