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