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