xref: /csrg-svn/sys/hp300/dev/maskbits.h (revision 66416)
1*66416Sbostic /*-
2*66416Sbostic  * Copyright (c) 1994
3*66416Sbostic  *	The Regents of the University of California.  All rights reserved.
4*66416Sbostic  *
5*66416Sbostic  * %sccs.include.redist.c%
6*66416Sbostic  *
7*66416Sbostic  *	@(#)maskbits.h	8.2 (Berkeley) 03/21/94
8*66416Sbostic  */
9*66416Sbostic 
1053932Shibler /*
1153932Shibler  * Derived from X11R4
1253932Shibler  */
1353932Shibler 
1453932Shibler /* the following notes use the following conventions:
1553932Shibler SCREEN LEFT				SCREEN RIGHT
1653932Shibler in this file and maskbits.c, left and right refer to screen coordinates,
1753932Shibler NOT bit numbering in registers.
1853932Shibler 
1953932Shibler starttab[n]
2053932Shibler 	bits[0,n-1] = 0	bits[n,31] = 1
2153932Shibler endtab[n] =
2253932Shibler 	bits[0,n-1] = 1	bits[n,31] = 0
2353932Shibler 
2453932Shibler maskbits(x, w, startmask, endmask, nlw)
2553932Shibler 	for a span of width w starting at position x, returns
2653932Shibler a mask for ragged bits at start, mask for ragged bits at end,
2753932Shibler and the number of whole longwords between the ends.
2853932Shibler 
2953932Shibler */
3053932Shibler 
3153932Shibler #define maskbits(x, w, startmask, endmask, nlw) \
3253932Shibler     startmask = starttab[(x)&0x1f]; \
3353932Shibler     endmask = endtab[((x)+(w)) & 0x1f]; \
3453932Shibler     if (startmask) \
3553932Shibler 	nlw = (((w) - (32 - ((x)&0x1f))) >> 5); \
3653932Shibler     else \
3753932Shibler 	nlw = (w) >> 5;
3853932Shibler 
3953932Shibler #define FASTGETBITS(psrc, x, w, dst) \
4053932Shibler     asm ("bfextu %3{%1:%2},%0" \
4153932Shibler     : "=d" (dst) : "di" (x), "di" (w), "o" (*(char *)(psrc)))
4253932Shibler 
4353932Shibler #define FASTPUTBITS(src, x, w, pdst) \
4453932Shibler     asm ("bfins %3,%0{%1:%2}" \
4553932Shibler 	 : "=o" (*(char *)(pdst)) \
4653932Shibler 	 : "di" (x), "di" (w), "d" (src), "0" (*(char *) (pdst)))
4753932Shibler 
4853932Shibler #define getandputrop(psrc, srcbit, dstbit, width, pdst, rop) \
4953932Shibler { \
5053932Shibler   register unsigned int _tmpsrc, _tmpdst; \
5153932Shibler   FASTGETBITS(pdst, dstbit, width, _tmpdst); \
5253932Shibler   FASTGETBITS(psrc, srcbit, width, _tmpsrc); \
5353932Shibler   DoRop(_tmpdst, rop, _tmpsrc, _tmpdst); \
5453932Shibler   FASTPUTBITS(_tmpdst, dstbit, width, pdst); \
5553932Shibler }
5653932Shibler 
5753932Shibler #define getandputrop0(psrc, srcbit, width, pdst, rop) \
5853932Shibler     	getandputrop(psrc, srcbit, 0, width, pdst, rop)
5953932Shibler 
6053932Shibler #define getunalignedword(psrc, x, dst) { \
6153932Shibler         register int _tmp; \
6253932Shibler         FASTGETBITS(psrc, x, 32, _tmp); \
6353932Shibler         dst = _tmp; \
6453932Shibler }
6553932Shibler 
6653932Shibler #define fnCLEAR(src, dst)       (0)
6753932Shibler #define fnCOPY(src, dst)        (src)
6853932Shibler #define fnXOR(src, dst)         (src ^ dst)
6953932Shibler #define fnCOPYINVERTED(src, dst)(~src)
7053932Shibler 
7153932Shibler #define DoRop(result, alu, src, dst) \
7253932Shibler { \
7353932Shibler     if (alu == RR_COPY) \
7453932Shibler         result = fnCOPY (src, dst); \
7553932Shibler     else \
7653932Shibler         switch (alu) \
7753932Shibler         { \
7853932Shibler           case RR_CLEAR: \
7953932Shibler             result = fnCLEAR (src, dst); \
8053932Shibler             break; \
8153932Shibler           case RR_XOR: \
8253932Shibler             result = fnXOR (src, dst); \
8353932Shibler             break; \
8453932Shibler           case RR_COPYINVERTED: \
8553932Shibler             result = fnCOPYINVERTED (src, dst); \
8653932Shibler             break; \
8753932Shibler         } \
8853932Shibler }
89