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