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.
5 * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
6 * Copyright (C) 1996, 1997, 1999 Jakub Jelinek (jj@ultra.linux.cz)
12 #include <asm/visasm.h>
14 #define EXN(x,y,a,b,z) \
18 99: ba VISbzerofixup_ret##z; \
20 .section __ex_table; \
25 #define EXC(x,y,a,b,c...) \
30 ba VISbzerofixup_ret0; \
32 .section __ex_table; \
39 .section __ex_table; \
41 .word 98b, VISbzerofixup_reto1; \
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; \
50 .word start, 0, end, handler; \
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
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;
75 #define RETL mov %g3, %o0
78 /* Well, bzero is a lot easier to get right than bcopy... */
80 .section __ex_table,#alloc
81 .section .fixup,#alloc,#execinstr
86 .globl __bzero, __bzero_noasi
89 ba,pt %xcc, __bzero+12
93 wr %g0, ASI_P, %asi ! LSU Group
111 EXO1(STB %g0, [%o0 + 0x00] ASINORMAL)
114 EX(STB %g0, [%o0 + 0x01] ASINORMAL, sub %o1, 1)
115 EX(STB %g0, [%o0 + 0x02] ASINORMAL, sub %o1, 2)
122 EXO1(STW %g0, [%o0] ASINORMAL)
132 EX(STX %g0, [%o0] ASINORMAL, sub %o1, 0)
134 1: andcc %o5, 16, %g0
137 EX1(STX %g0, [%o0] ASINORMAL, add %g0, 0)
138 EX1(STX %g0, [%o0 + 8] ASINORMAL, sub %g0, 8)
140 1: andcc %o5, 32, %g0
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)
148 6: andncc %o1, 0x3f, %o3
151 or %o4, ASI_BLK_OR, %g7
155 wr %g0, ASI_BLK_P, %asi
157 membar #StoreLoad | #StoreStore | #LoadStore
172 EXC(STBLK %f0, [%o0 + 0x00] ASIBLK, add %o3, %o2, add %o2, %o1, %o2)
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)
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
192 wr %g0, FPRS_FEF, %fprs
195 membar #StoreLoad | #StoreStore
196 9: andcc %o1, 0xf8, %o2
200 14: sethi %hi(13f), %o4
203 jmpl %o4 + %lo(13f), %g0
209 jmpl %o4 + (13f - 14b), %g0
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)
221 EX(STW %g0, [%o0] ASINORMAL, and %o1, 7)
225 EX(STH %g0, [%o0] ASINORMAL, and %o1, 3)
228 EX(STB %g0, [%o0] ASINORMAL, add %g0, 1)
241 EX(STB %g0, [%o0 - 1] ASINORMAL, add %o1, 1)
261 ba,pt %xcc, VISbzerofixup_ret0
266 ba,pt %xcc, VISbzerofixup_ret0
272 ba,pt %xcc, VISbzerofixup_ret0