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