2 * $XConsortium: cfbrrop.h,v 1.10 95/06/08 23:20:39 gildea Exp $
3 * $XFree86: xc/programs/Xserver/cfb/cfbrrop.h,v 3.2 1997/01/08 20:32:41 dawes Exp $
5 Copyright (c) 1989 X Consortium
7 Permission is hereby granted, free of charge, to any person obtaining a copy
8 of this software and associated documentation files (the "Software"), to deal
9 in the Software without restriction, including without limitation the rights
10 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 copies of the Software, and to permit persons to whom the Software is
12 furnished to do so, subject to the following conditions:
14 The above copyright notice and this permission notice shall be included in
15 all copies or substantial portions of the Software.
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 Except as contained in this notice, the name of the X Consortium shall not be
25 used in advertising or otherwise to promote the sale, use or other dealings
26 in this Software without prior written authorization from the X Consortium.
28 * Author: Keith Packard, MIT X Consortium
35 #define RROP_FETCH_GC(gc) \
36 RROP_FETCH_GCPRIV(((cfbPrivGCPtr)(gc)->devPrivates[cfbGCPrivateIndex].ptr))
44 #define RROP_DECLARE register unsigned long rrop_xor; \
45 unsigned long piQxelXor[3], spiQxelXor[8];
46 #define RROP_FETCH_GCPRIV(devPriv) rrop_xor = (devPriv)->xor; \
47 spiQxelXor[0] = rrop_xor & 0xFFFFFF; \
48 spiQxelXor[2] = rrop_xor << 24; \
49 spiQxelXor[3] = (rrop_xor & 0xFFFF00)>> 8; \
50 spiQxelXor[4] = rrop_xor << 16; \
51 spiQxelXor[5] = (rrop_xor & 0xFF0000)>> 16; \
52 spiQxelXor[6] = rrop_xor << 8; \
53 spiQxelXor[1] = spiQxelXor[7] = 0; \
54 piQxelXor[0] = (rrop_xor & 0xFFFFFF)|(rrop_xor << 24); \
55 piQxelXor[1] = (rrop_xor << 16)|((rrop_xor & 0xFFFF00)>> 8); \
56 piQxelXor[2] = (rrop_xor << 8)|((rrop_xor & 0xFF0000)>> 16);
57 #define RROP_SOLID24(dst,index) {\
58 register int idx = ((index) & 3)<< 1; \
59 *(dst) = (*(dst) & cfbrmask[idx])|spiQxelXor[idx]; \
60 if (idx == 2 || idx == 4){ \
62 *((dst)+1) = (*((dst)+1) & cfbrmask[idx])|spiQxelXor[idx]; \
65 #define RROP_SOLID(dst, idx) \
66 (*(dst) = piQxelXor[(idx)])
67 #define RROP_SOLID_MASK(dst,mask,idx) \
68 (*(dst) = (*(dst) & ~(mask))|(piQxelXor[(idx)] & (mask)))
70 #define RROP_FETCH_GCPRIV(devPriv) rrop_xor = (devPriv)->xor;
71 #define RROP_DECLARE register unsigned long rrop_xor;
72 #define RROP_SOLID(dst) (*(dst) = (rrop_xor))
73 #define RROP_SOLID_MASK(dst,mask) (*(dst) = (*(dst) & ~(mask)) | ((rrop_xor) & (mask)))
74 #define RROP_SOLID_lu(dst) stl_u(rrop_xor, dst)
75 #define RROP_SOLID_MASK_lu(dst,mask) stl_u((ldl_u(dst) & ~(mask)) | ((rrop_xor) & (mask)), dst)
77 #define RROP_NAME(prefix) RROP_NAME_CAT(prefix,Copy)
82 #define RROP_DECLARE register unsigned long rrop_xor; \
83 unsigned long piQxelXor[3], spiQxelXor[8];
84 #define RROP_FETCH_GCPRIV(devPriv) rrop_xor = (devPriv)->xor; \
85 spiQxelXor[0] = rrop_xor & 0xFFFFFF; \
86 spiQxelXor[2] = rrop_xor << 24; \
87 spiQxelXor[3] = (rrop_xor & 0xFFFF00)>> 8; \
88 spiQxelXor[4] = rrop_xor << 16; \
89 spiQxelXor[5] = (rrop_xor & 0xFF0000)>> 16; \
90 spiQxelXor[6] = rrop_xor << 8; \
91 spiQxelXor[1] = spiQxelXor[7] = 0; \
92 piQxelXor[0] = (rrop_xor & 0xFFFFFF)|(rrop_xor << 24); \
93 piQxelXor[1] = (rrop_xor << 16)|((rrop_xor & 0xFFFF00)>> 8); \
94 piQxelXor[2] = (rrop_xor << 8)|((rrop_xor & 0xFF0000)>> 16);
95 #define RROP_SOLID24(dst,index) {\
96 register int idx = ((index) & 3)<< 1; \
97 *(dst) ^= spiQxelXor[idx]; \
98 if (idx == 2 || idx == 4) \
99 *((dst)+1) ^= spiQxelXor[idx+1]; \
101 #define RROP_SOLID(dst,idx) \
102 (*(dst) ^= piQxelXor[(idx)])
103 #define RROP_SOLID_MASK(dst,mask,idx) \
104 (*(dst) ^= (piQxelXor[(idx)] & (mask)))
106 #define RROP_DECLARE register unsigned long rrop_xor;
107 #define RROP_FETCH_GCPRIV(devPriv) rrop_xor = (devPriv)->xor;
108 #define RROP_SOLID(dst) (*(dst) ^= (rrop_xor))
109 #define RROP_SOLID_MASK(dst,mask) (*(dst) ^= ((rrop_xor) & (mask)))
111 #define RROP_NAME(prefix) RROP_NAME_CAT(prefix,Xor)
116 #define RROP_DECLARE register unsigned long rrop_and; \
117 unsigned long piQxelAnd[3], spiQxelAnd[6];
118 #define RROP_FETCH_GCPRIV(devPriv) rrop_and = (devPriv)->and; \
119 spiQxelAnd[0] = (rrop_and & 0xFFFFFF) | 0xFF000000; \
120 spiQxelAnd[2] = (rrop_and << 24) | 0xFFFFFF; \
121 spiQxelAnd[3] = ((rrop_and & 0xFFFF00)>> 8) | 0xFFFF0000; \
122 spiQxelAnd[4] = (rrop_and << 16) | 0xFFFF; \
123 spiQxelAnd[5] = ((rrop_and & 0xFF0000)>> 16) | 0xFFFFFF00; \
124 spiQxelAnd[1] = (rrop_and << 8) | 0xFF; \
125 piQxelAnd[0] = (rrop_and & 0xFFFFFF)|(rrop_and << 24); \
126 piQxelAnd[1] = (rrop_and << 16)|((rrop_and & 0xFFFF00)>> 8); \
127 piQxelAnd[2] = (rrop_and << 8)|((rrop_and & 0xFF0000)>> 16);
128 #define RROP_SOLID24(dst,index) {\
129 switch((index) & 3){ \
131 *(dst) &= spiQxelAnd[0]; \
134 *(dst) &= spiQxelAnd[1]; \
137 *(dst) &= spiQxelAnd[2]; \
138 *((dst)+1) &= spiQxelAnd[3]; \
141 *(dst) &= spiQxelAnd[4]; \
142 *((dst)+1) &= spiQxelAnd[5]; \
146 #define RROP_SOLID(dst,idx) \
147 (*(dst) &= piQxelAnd[(idx)])
148 #define RROP_SOLID_MASK(dst,mask,idx) \
149 (*(dst) &= (piQxelAnd[(idx)] | ~(mask)))
151 #define RROP_DECLARE register unsigned long rrop_and;
152 #define RROP_FETCH_GCPRIV(devPriv) rrop_and = (devPriv)->and;
153 #define RROP_SOLID(dst) (*(dst) &= (rrop_and))
154 #define RROP_SOLID_MASK(dst,mask) (*(dst) &= ((rrop_and) | ~(mask)))
156 #define RROP_NAME(prefix) RROP_NAME_CAT(prefix,And)
161 #define RROP_DECLARE register unsigned long rrop_or; \
162 unsigned long piQxelOr[3], spiQxelOr[6];
163 #define RROP_FETCH_GCPRIV(devPriv) rrop_or = (devPriv)->xor; \
164 spiQxelOr[0] = rrop_or & 0xFFFFFF; \
165 spiQxelOr[1] = rrop_or << 24; \
166 spiQxelOr[2] = rrop_or << 16; \
167 spiQxelOr[3] = rrop_or << 8; \
168 spiQxelOr[4] = (rrop_or & 0xFFFF00)>> 8; \
169 spiQxelOr[5] = (rrop_or & 0xFF0000)>> 16; \
170 piQxelOr[0] = (rrop_or & 0xFFFFFF)|(rrop_or << 24); \
171 piQxelOr[1] = (rrop_or << 16)|((rrop_or & 0xFFFF00)>> 8); \
172 piQxelOr[2] = (rrop_or << 8)|((rrop_or & 0xFF0000)>> 16);
173 #define RROP_SOLID24(dst,index) {\
174 switch((index) & 3){ \
176 *(dst) |= spiQxelOr[0]; \
179 *(dst) |= spiQxelOr[3]; \
182 *(dst) |= spiQxelOr[1]; \
183 *((dst)+1) |= spiQxelOr[4]; \
186 *(dst) |= spiQxelOr[2]; \
187 *((dst)+1) |= spiQxelOr[5]; \
191 #define RROP_SOLID(dst,idx) \
192 (*(dst) |= piQxelOr[(idx)])
193 #define RROP_SOLID_MASK(dst,mask,idx) \
194 (*(dst) |= (piQxelOr[(idx)] & (mask)))
196 #define RROP_DECLARE register unsigned long rrop_or;
197 #define RROP_FETCH_GCPRIV(devPriv) rrop_or = (devPriv)->xor;
198 #define RROP_SOLID(dst) (*(dst) |= (rrop_or))
199 #define RROP_SOLID_MASK(dst,mask) (*(dst) |= ((rrop_or) & (mask)))
201 #define RROP_NAME(prefix) RROP_NAME_CAT(prefix,Or)
206 #define RROP_FETCH_GCPRIV(devPriv)
207 #define RROP_SOLID(dst)
208 #define RROP_SOLID_MASK(dst,mask)
209 #define RROP_NAME(prefix) RROP_NAME_CAT(prefix,Noop)
214 #define RROP_DECLARE register unsigned long rrop_and, rrop_xor; \
215 unsigned long piQxelAnd[3], piQxelXor[3], spiQxelAnd[6], spiQxelXor[6];
216 #define RROP_FETCH_GCPRIV(devPriv) rrop_and = (devPriv)->and; \
217 rrop_xor = (devPriv)->xor; \
218 spiQxelXor[0] = rrop_xor & 0xFFFFFF; \
219 spiQxelXor[1] = rrop_xor << 24; \
220 spiQxelXor[2] = rrop_xor << 16; \
221 spiQxelXor[3] = rrop_xor << 8; \
222 spiQxelXor[4] = (rrop_xor & 0xFFFF00)>> 8; \
223 spiQxelXor[5] = (rrop_xor & 0xFF0000)>> 16; \
224 spiQxelAnd[0] = (rrop_and & 0xFFFFFF) | 0xFF000000; \
225 spiQxelAnd[1] = (rrop_and << 24) | 0xFFFFFF; \
226 spiQxelAnd[2] = (rrop_and << 16) | 0xFFFF; \
227 spiQxelAnd[3] = (rrop_and << 8) | 0xFF; \
228 spiQxelAnd[4] = ((rrop_and & 0xFFFF00)>> 8) | 0xFFFF0000; \
229 spiQxelAnd[5] = ((rrop_and & 0xFF0000)>> 16) | 0xFFFFFF00; \
230 piQxelAnd[0] = (rrop_and & 0xFFFFFF)|(rrop_and << 24); \
231 piQxelAnd[1] = (rrop_and << 16)|((rrop_and & 0xFFFF00)>> 8); \
232 piQxelAnd[2] = (rrop_and << 8)|((rrop_and & 0xFF0000)>> 16); \
233 piQxelXor[0] = (rrop_xor & 0xFFFFFF)|(rrop_xor << 24); \
234 piQxelXor[1] = (rrop_xor << 16)|((rrop_xor & 0xFFFF00)>> 8); \
235 piQxelXor[2] = (rrop_xor << 8)|((rrop_xor & 0xFF0000)>> 16);
236 #define RROP_SOLID24(dst,index) {\
237 switch((index) & 3){ \
239 *(dst) = ((*(dst) & (piQxelAnd[0] |0xFF000000))^(piQxelXor[0] & 0xFFFFFF)); \
242 *(dst) = ((*(dst) & (piQxelAnd[2]|0xFF))^(piQxelXor[2] & 0xFFFFFF00)); \
245 *(dst) = ((*(dst) & (piQxelAnd[0]|0xFFFFFF))^(piQxelXor[0] & 0xFF000000)); \
246 *((dst)+1) = ((*((dst)+1) & (piQxelAnd[1]|0xFFFF0000))^(piQxelXor[1] & 0xFFFF)); \
249 *(dst) = ((*(dst) & (piQxelAnd[1]|0xFFFF))^(piQxelXor[1] & 0xFFFF0000)); \
250 *((dst)+1) = ((*((dst)+1) & (piQxelAnd[2]|0xFFFFFF00))^(piQxelXor[2] & 0xFF)); \
254 #define RROP_SOLID(dst,idx) \
255 (*(dst) = DoRRop (*(dst), piQxelAnd[(idx)], piQxelXor[(idx)]))
256 #define RROP_SOLID_MASK(dst,mask,idx) \
257 (*(dst) = DoMaskRRop (*(dst), piQxelAnd[(idx)], piQxelXor[(idx)], (mask)))
259 #define RROP_DECLARE register unsigned long rrop_and, rrop_xor;
260 #define RROP_FETCH_GCPRIV(devPriv) rrop_and = (devPriv)->and; \
261 rrop_xor = (devPriv)->xor;
262 #define RROP_SOLID(dst) (*(dst) = DoRRop (*(dst), rrop_and, rrop_xor))
263 #define RROP_SOLID_MASK(dst,mask) (*(dst) = DoMaskRRop (*(dst), rrop_and, rrop_xor, (mask)))
265 #define RROP_NAME(prefix) RROP_NAME_CAT(prefix,General)
268 #define RROP_UNROLL_CASE1(p,i) case (i): RROP_SOLID((p) - (i));
269 #define RROP_UNROLL_CASE2(p,i) RROP_UNROLL_CASE1(p,(i)+1) RROP_UNROLL_CASE1(p,i)
270 #define RROP_UNROLL_CASE4(p,i) RROP_UNROLL_CASE2(p,(i)+2) RROP_UNROLL_CASE2(p,i)
271 #define RROP_UNROLL_CASE8(p,i) RROP_UNROLL_CASE4(p,(i)+4) RROP_UNROLL_CASE4(p,i)
272 #define RROP_UNROLL_CASE16(p,i) RROP_UNROLL_CASE8(p,(i)+8) RROP_UNROLL_CASE8(p,i)
273 #define RROP_UNROLL_CASE3(p) RROP_UNROLL_CASE2(p,2) RROP_UNROLL_CASE1(p,1)
274 #define RROP_UNROLL_CASE7(p) RROP_UNROLL_CASE4(p,4) RROP_UNROLL_CASE3(p)
275 #define RROP_UNROLL_CASE15(p) RROP_UNROLL_CASE8(p,8) RROP_UNROLL_CASE7(p)
276 #define RROP_UNROLL_CASE31(p) RROP_UNROLL_CASE16(p,16) RROP_UNROLL_CASE15(p)
278 #define RROP_UNROLL_CASE63(p) RROP_UNROLL_CASE32(p,32) RROP_UNROLL_CASE31(p)
281 #define RROP_UNROLL_LOOP1(p,i) RROP_SOLID((p) + (i));
282 #define RROP_UNROLL_LOOP2(p,i) RROP_UNROLL_LOOP1(p,(i)) RROP_UNROLL_LOOP1(p,(i)+1)
283 #define RROP_UNROLL_LOOP4(p,i) RROP_UNROLL_LOOP2(p,(i)) RROP_UNROLL_LOOP2(p,(i)+2)
284 #define RROP_UNROLL_LOOP8(p,i) RROP_UNROLL_LOOP4(p,(i)) RROP_UNROLL_LOOP4(p,(i)+4)
285 #define RROP_UNROLL_LOOP16(p,i) RROP_UNROLL_LOOP8(p,(i)) RROP_UNROLL_LOOP8(p,(i)+8)
286 #define RROP_UNROLL_LOOP32(p,i) RROP_UNROLL_LOOP16(p,(i)) RROP_UNROLL_LOOP16(p,(i)+16)
288 #define RROP_UNROLL_LOOP64(p,i) RROP_UNROLL_LOOP32(p,(i)) RROP_UNROLL_LOOP32(p,(i)+32)
291 #if defined (FAST_CONSTANT_OFFSET_MODE) && defined (SHARED_IDCACHE) && (RROP == GXcopy)
294 #define RROP_UNROLL_SHIFT 6
295 #define RROP_UNROLL_CASE(p) RROP_UNROLL_CASE63(p)
296 #define RROP_UNROLL_LOOP(p) RROP_UNROLL_LOOP64(p,-64)
297 #else /* not LONG64 */
298 #define RROP_UNROLL_SHIFT 5
299 #define RROP_UNROLL_CASE(p) RROP_UNROLL_CASE31(p)
300 #define RROP_UNROLL_LOOP(p) RROP_UNROLL_LOOP32(p,-32)
302 #define RROP_UNROLL (1<<RROP_UNROLL_SHIFT)
303 #define RROP_UNROLL_MASK (RROP_UNROLL-1)
305 #define RROP_SPAN(pdst,nmiddle) {\
306 int part = (nmiddle) & RROP_UNROLL_MASK; \
307 (nmiddle) >>= RROP_UNROLL_SHIFT; \
308 (pdst) += part * (sizeof (unsigned long) / sizeof (*pdst)); \
310 RROP_UNROLL_CASE((unsigned long *) (pdst)) \
312 while (--(nmiddle) >= 0) { \
313 (pdst) += RROP_UNROLL * (sizeof (unsigned long) / sizeof (*pdst)); \
314 RROP_UNROLL_LOOP((unsigned long *) (pdst)) \
318 #define RROP_SPAN(pdst,nmiddle) \
319 while (--(nmiddle) >= 0) { \
320 RROP_SOLID((unsigned long *) (pdst)); \
321 (pdst) += sizeof (unsigned long) / sizeof (*pdst); \
323 #define RROP_SPAN_lu(pdst,nmiddle) \
324 while (--(nmiddle) >= 0) { \
325 RROP_SOLID_lu((unsigned long *) (pdst)); \
326 (pdst) += sizeof (unsigned long) / sizeof (*pdst); \
330 #if (defined(__STDC__) && !defined(UNIXCPP)) || defined(ANSICPP)
331 #define RROP_NAME_CAT(prefix,suffix) prefix##suffix
333 #define RROP_NAME_CAT(prefix,suffix) prefix/**/suffix