xref: /original-bsd/sys/hp300/dev/maskbits.h (revision babae2df)
1 /*-
2  * Copyright (c) 1994
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  *
7  *	@(#)maskbits.h	8.2 (Berkeley) 03/21/94
8  */
9 
10 /*
11  * Derived from X11R4
12  */
13 
14 /* the following notes use the following conventions:
15 SCREEN LEFT				SCREEN RIGHT
16 in this file and maskbits.c, left and right refer to screen coordinates,
17 NOT bit numbering in registers.
18 
19 starttab[n]
20 	bits[0,n-1] = 0	bits[n,31] = 1
21 endtab[n] =
22 	bits[0,n-1] = 1	bits[n,31] = 0
23 
24 maskbits(x, w, startmask, endmask, nlw)
25 	for a span of width w starting at position x, returns
26 a mask for ragged bits at start, mask for ragged bits at end,
27 and the number of whole longwords between the ends.
28 
29 */
30 
31 #define maskbits(x, w, startmask, endmask, nlw) \
32     startmask = starttab[(x)&0x1f]; \
33     endmask = endtab[((x)+(w)) & 0x1f]; \
34     if (startmask) \
35 	nlw = (((w) - (32 - ((x)&0x1f))) >> 5); \
36     else \
37 	nlw = (w) >> 5;
38 
39 #define FASTGETBITS(psrc, x, w, dst) \
40     asm ("bfextu %3{%1:%2},%0" \
41     : "=d" (dst) : "di" (x), "di" (w), "o" (*(char *)(psrc)))
42 
43 #define FASTPUTBITS(src, x, w, pdst) \
44     asm ("bfins %3,%0{%1:%2}" \
45 	 : "=o" (*(char *)(pdst)) \
46 	 : "di" (x), "di" (w), "d" (src), "0" (*(char *) (pdst)))
47 
48 #define getandputrop(psrc, srcbit, dstbit, width, pdst, rop) \
49 { \
50   register unsigned int _tmpsrc, _tmpdst; \
51   FASTGETBITS(pdst, dstbit, width, _tmpdst); \
52   FASTGETBITS(psrc, srcbit, width, _tmpsrc); \
53   DoRop(_tmpdst, rop, _tmpsrc, _tmpdst); \
54   FASTPUTBITS(_tmpdst, dstbit, width, pdst); \
55 }
56 
57 #define getandputrop0(psrc, srcbit, width, pdst, rop) \
58     	getandputrop(psrc, srcbit, 0, width, pdst, rop)
59 
60 #define getunalignedword(psrc, x, dst) { \
61         register int _tmp; \
62         FASTGETBITS(psrc, x, 32, _tmp); \
63         dst = _tmp; \
64 }
65 
66 #define fnCLEAR(src, dst)       (0)
67 #define fnCOPY(src, dst)        (src)
68 #define fnXOR(src, dst)         (src ^ dst)
69 #define fnCOPYINVERTED(src, dst)(~src)
70 
71 #define DoRop(result, alu, src, dst) \
72 { \
73     if (alu == RR_COPY) \
74         result = fnCOPY (src, dst); \
75     else \
76         switch (alu) \
77         { \
78           case RR_CLEAR: \
79             result = fnCLEAR (src, dst); \
80             break; \
81           case RR_XOR: \
82             result = fnXOR (src, dst); \
83             break; \
84           case RR_COPYINVERTED: \
85             result = fnCOPYINVERTED (src, dst); \
86             break; \
87         } \
88 }
89