VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / arch / sparc64 / lib / VISbzero.S
1 /* $Id: VISbzero.S,v 1.11 2001/03/15 08:51:24 anton Exp $
2  * VISbzero.S: High speed clear 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, 1999 Jakub Jelinek (jj@ultra.linux.cz)
7  */
8
9 #include "VIS.h"
10
11 #ifdef __KERNEL__
12 #include <asm/visasm.h>
13
14 #define EXN(x,y,a,b,z)                          \
15 98:     x,y;                                    \
16         .section .fixup;                        \
17         .align  4;                              \
18 99:     ba      VISbzerofixup_ret##z;           \
19          a, b, %o0;                             \
20         .section __ex_table;                    \
21         .align  4;                              \
22         .word   98b, 99b;                       \
23         .text;                                  \
24         .align  4;
25 #define EXC(x,y,a,b,c...)                       \
26 98:     x,y;                                    \
27         .section .fixup;                        \
28         .align  4;                              \
29 99:     c;                                      \
30         ba      VISbzerofixup_ret0;             \
31          a, b, %o0;                             \
32         .section __ex_table;                    \
33         .align  4;                              \
34         .word   98b, 99b;                       \
35         .text;                                  \
36         .align  4;
37 #define EXO1(x,y)                               \
38 98:     x,y;                                    \
39         .section __ex_table;                    \
40         .align  4;                              \
41         .word   98b, VISbzerofixup_reto1;       \
42         .text;                                  \
43         .align  4;
44 #define EX(x,y,a,b) EXN(x,y,a,b,0)
45 #define EX1(x,y,a,b) EXN(x,y,a,b,1)
46 #define EX2(x,y,a,b) EXN(x,y,a,b,2)
47 #define EXT(start,end,handler)                  \
48         .section __ex_table;                    \
49         .align  4;                              \
50         .word   start, 0, end, handler;         \
51         .text;                                  \
52         .align  4
53 #else
54 #define EX(x,y,a,b)             x,y
55 #define EX1(x,y,a,b)            x,y
56 #define EX2(x,y,a,b)            x,y
57 #define EXC(x,y,a,b,c...)       x,y
58 #define EXO1(x,y)               x,y
59 #define EXT(a,b,c)
60 #endif
61
62 #define ZERO_BLOCKS(base, offset, source)                       \
63         STX     source, [base - offset - 0x38] ASINORMAL;       \
64         STX     source, [base - offset - 0x30] ASINORMAL;       \
65         STX     source, [base - offset - 0x28] ASINORMAL;       \
66         STX     source, [base - offset - 0x20] ASINORMAL;       \
67         STX     source, [base - offset - 0x18] ASINORMAL;       \
68         STX     source, [base - offset - 0x10] ASINORMAL;       \
69         STX     source, [base - offset - 0x08] ASINORMAL;       \
70         STX     source, [base - offset - 0x00] ASINORMAL;
71
72 #ifdef __KERNEL__
73 #define RETL    clr %o0
74 #else
75 #define RETL    mov %g3, %o0
76 #endif
77
78         /* Well, bzero is a lot easier to get right than bcopy... */
79 #ifdef __KERNEL__
80         .section        __ex_table,#alloc
81         .section        .fixup,#alloc,#execinstr
82 #endif
83         .text
84         .align          32
85 #ifdef __KERNEL__
86         .globl          __bzero, __bzero_noasi
87 __bzero_noasi:
88         rd              %asi, %g5
89         ba,pt           %xcc, __bzero+12
90          mov            %g5, %o4
91 __bzero:
92         rd              %asi, %g5
93         wr              %g0, ASI_P, %asi                ! LSU   Group
94         mov             ASI_P, %o4
95 #else
96         .globl          bzero
97 bzero_private:
98 bzero:
99 #ifndef REGS_64BIT
100         srl             %o1, 0, %o1
101 #endif
102         mov             %o0, %g3
103 #endif
104         cmp             %o1, 7
105         bleu,pn         %xcc, 17f
106          andcc          %o0, 3, %o2
107         be,a,pt         %xcc, 4f
108          andcc          %o0, 4, %g0
109         cmp             %o2, 3
110         be,pn           %xcc, 2f
111          EXO1(STB       %g0, [%o0 + 0x00] ASINORMAL)
112         cmp             %o2, 2
113         be,pt           %xcc, 2f
114          EX(STB         %g0, [%o0 + 0x01] ASINORMAL, sub %o1, 1)
115         EX(STB          %g0, [%o0 + 0x02] ASINORMAL, sub %o1, 2)
116 2:      sub             %o2, 4, %o2
117         sub             %o0, %o2, %o0
118         add             %o1, %o2, %o1
119         andcc           %o0, 4, %g0
120 4:      be,pt           %xcc, 2f
121          cmp            %o1, 128
122         EXO1(STW        %g0, [%o0] ASINORMAL)
123         sub             %o1, 4, %o1
124         add             %o0, 4, %o0
125 2:      blu,pn          %xcc, 9f
126          andcc          %o0, 0x38, %o2
127         be,pn           %icc, 6f
128          mov            64, %o5
129         andcc           %o0, 8, %g0
130         be,pn           %icc, 1f
131          sub            %o5, %o2, %o5
132         EX(STX          %g0, [%o0] ASINORMAL, sub %o1, 0)
133         add             %o0, 8, %o0
134 1:      andcc           %o5, 16, %g0
135         be,pn           %icc, 1f
136          sub            %o1, %o5, %o1
137         EX1(STX         %g0, [%o0] ASINORMAL, add %g0, 0)
138         EX1(STX         %g0, [%o0 + 8] ASINORMAL, sub %g0, 8)
139         add             %o0, 16, %o0
140 1:      andcc           %o5, 32, %g0
141         be,pn           %icc, 7f
142          andncc         %o1, 0x3f, %o3
143         EX(STX          %g0, [%o0] ASINORMAL, add %o1, 32)
144         EX(STX          %g0, [%o0 + 8] ASINORMAL, add %o1, 24)
145         EX(STX          %g0, [%o0 + 16] ASINORMAL, add %o1, 16)
146         EX(STX          %g0, [%o0 + 24] ASINORMAL, add %o1, 8)
147         add             %o0, 32, %o0
148 6:      andncc          %o1, 0x3f, %o3
149 7:      be,pn           %xcc, 9f
150 #ifdef __KERNEL__
151          or             %o4, ASI_BLK_OR, %g7 
152         wr              %g7, %g0, %asi
153         VISEntryHalf
154 #else
155          wr             %g0, ASI_BLK_P, %asi
156 #endif
157         membar          #StoreLoad | #StoreStore | #LoadStore
158         fzero           %f0
159         andcc           %o3, 0xc0, %o2
160         and             %o1, 0x3f, %o1
161         fzero           %f2
162         andn            %o3, 0xff, %o3
163         faddd           %f0, %f2, %f4
164         fmuld           %f0, %f2, %f6
165         cmp             %o2, 64
166         faddd           %f0, %f2, %f8
167         fmuld           %f0, %f2, %f10
168         faddd           %f0, %f2, %f12
169         brz,pn          %o2, 10f
170          fmuld          %f0, %f2, %f14
171         be,pn           %icc, 2f
172          EXC(STBLK      %f0, [%o0 + 0x00] ASIBLK, add %o3, %o2, add %o2, %o1, %o2)
173         cmp             %o2, 128
174         be,pn           %icc, 2f
175          EXC(STBLK      %f0, [%o0 + 0x40] ASIBLK, add %o3, %o2, add %o2, %o1, %o2; sub %o2, 64, %o2)
176         EXC(STBLK       %f0, [%o0 + 0x80] ASIBLK, add %o3, %o2, add %o2, %o1, %o2; sub %o2, 128, %o2)
177 2:      brz,pn          %o3, 12f
178          add            %o0, %o2, %o0
179 10:     EX(STBLK        %f0, [%o0 + 0x00] ASIBLK, add %o3, %o1)
180         EXC(STBLK       %f0, [%o0 + 0x40] ASIBLK, add %o3, %o1, sub %o1, 64, %o1)
181         EXC(STBLK       %f0, [%o0 + 0x80] ASIBLK, add %o3, %o1, sub %o1, 128, %o1)
182         EXC(STBLK       %f0, [%o0 + 0xc0] ASIBLK, add %o3, %o1, sub %o1, 192, %o1)
183 11:     subcc           %o3, 256, %o3
184         bne,pt          %xcc, 10b
185          add            %o0, 256, %o0
186 12:
187 #ifdef __KERNEL__
188         VISExitHalf
189         wr              %o4, 0x0, %asi
190 #else
191 #ifndef REGS_64BIT
192         wr              %g0, FPRS_FEF, %fprs
193 #endif
194 #endif
195         membar          #StoreLoad | #StoreStore
196 9:      andcc           %o1, 0xf8, %o2
197         be,pn           %xcc, 13f
198          andcc          %o1, 7, %o1
199 #ifdef __KERNEL__
200 14:     sethi           %hi(13f), %o4
201         srl             %o2, 1, %o3
202         sub             %o4, %o3, %o4
203         jmpl            %o4 + %lo(13f), %g0
204          add            %o0, %o2, %o0
205 #else
206 14:     rd              %pc, %o4
207         srl             %o2, 1, %o3
208         sub             %o4, %o3, %o4
209         jmpl            %o4 + (13f - 14b), %g0
210          add            %o0, %o2, %o0
211 #endif
212 12:     ZERO_BLOCKS(%o0, 0xc8, %g0)
213         ZERO_BLOCKS(%o0, 0x88, %g0)
214         ZERO_BLOCKS(%o0, 0x48, %g0)
215         ZERO_BLOCKS(%o0, 0x08, %g0)
216         EXT(12b,13f,VISbzerofixup_zb)
217 13:     be,pn           %xcc, 8f
218          andcc          %o1, 4, %g0
219         be,pn           %xcc, 1f
220          andcc          %o1, 2, %g0
221         EX(STW          %g0, [%o0] ASINORMAL, and %o1, 7)
222         add             %o0, 4, %o0
223 1:      be,pn           %xcc, 1f
224          andcc          %o1, 1, %g0
225         EX(STH          %g0, [%o0] ASINORMAL, and %o1, 3)
226         add             %o0, 2, %o0
227 1:      bne,a,pn        %xcc, 8f
228          EX(STB         %g0, [%o0] ASINORMAL, add %g0, 1)
229 8:
230 #ifdef __KERNEL__
231         wr              %g5, %g0, %asi
232 #endif
233         retl
234          RETL
235 17:     be,pn           %xcc, 13b
236          orcc           %o1, 0, %g0
237         be,pn           %xcc, 0f
238 8:       add            %o0, 1, %o0
239         subcc           %o1, 1, %o1
240         bne,pt          %xcc, 8b
241          EX(STB         %g0, [%o0 - 1] ASINORMAL, add %o1, 1)
242 0:
243 #ifdef __KERNEL__
244         wr              %g5, %g0, %asi
245 #endif
246         retl
247          RETL
248
249 #ifdef __KERNEL__
250         .section        .fixup
251         .align          4
252 VISbzerofixup_reto1:
253         mov             %o1, %o0
254 VISbzerofixup_ret0:
255         wr              %g5, %g0, %asi
256         retl
257          wr             %g0, 0, %fprs
258 VISbzerofixup_ret1:
259         and             %o5, 0x30, %o5
260         add             %o5, %o1, %o5
261         ba,pt           %xcc, VISbzerofixup_ret0
262          add            %o0, %o5, %o0
263 VISbzerofixup_ret2:
264         and             %o5, 0x20, %o5
265         add             %o5, %o1, %o5
266         ba,pt           %xcc, VISbzerofixup_ret0
267          add            %o0, %o5, %o0
268 VISbzerofixup_zb:
269         andcc           %o1, 7, %o1
270         sll             %g2, 3, %g2
271         add             %o1, 256, %o1
272         ba,pt           %xcc, VISbzerofixup_ret0
273          sub            %o1, %g2, %o0
274 #endif