X-Git-Url: https://git.sesse.net/?p=rdpsrv;a=blobdiff_plain;f=Xserver%2Fprograms%2FXserver%2Fmfb%2Ffastblt.h;fp=Xserver%2Fprograms%2FXserver%2Fmfb%2Ffastblt.h;h=0ca295d6235aa1bff5e9f0b7887cd7ffe0e575b0;hp=0000000000000000000000000000000000000000;hb=b6e6afccf37f4ad0515ef2a698f714fdf1bf23b3;hpb=e3340a110a3b01756b8e67531395a33b40a17d37 diff --git a/Xserver/programs/Xserver/mfb/fastblt.h b/Xserver/programs/Xserver/mfb/fastblt.h new file mode 100644 index 0000000..0ca295d --- /dev/null +++ b/Xserver/programs/Xserver/mfb/fastblt.h @@ -0,0 +1,120 @@ +/* $XConsortium: fastblt.h,v 1.7 94/04/17 20:28:07 dpw Exp $ */ +/* + +Copyright (c) 1989 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +/* + * Fast bitblt macros for certain hardware. If your machine has an addressing + * mode of small constant + register, you'll probably want this magic specific + * code. It's 25% faster for the R2000. I haven't studied the Sparc + * instruction set, but I suspect it also has this addressing mode. Also, + * unrolling the loop by 32 is possibly excessive for mfb. The number of times + * the loop is actually looped through is pretty small. + */ + +/* + * WARNING: These macros make *a lot* of assumptions about + * the environment they are invoked in. Plenty of implicit + * arguments, lots of side effects. Don't use them casually. + */ + +#define SwitchOdd(n) case n: BodyOdd(n) +#define SwitchEven(n) case n: BodyEven(n) + +/* to allow mfb and cfb to share code... */ +#ifndef BitRight +#define BitRight(a,b) SCRRIGHT(a,b) +#define BitLeft(a,b) SCRLEFT(a,b) +#endif + +#ifdef LARGE_INSTRUCTION_CACHE +#define UNROLL 8 +#define PackedLoop \ + switch (nl & (UNROLL-1)) { \ + SwitchOdd( 7) SwitchEven( 6) SwitchOdd( 5) SwitchEven( 4) \ + SwitchOdd( 3) SwitchEven( 2) SwitchOdd( 1) \ + } \ + while ((nl -= UNROLL) >= 0) { \ + LoopReset \ + BodyEven( 8) \ + BodyOdd( 7) BodyEven( 6) BodyOdd( 5) BodyEven( 4) \ + BodyOdd( 3) BodyEven( 2) BodyOdd( 1) \ + } +#else +#define UNROLL 4 +#define PackedLoop \ + switch (nl & (UNROLL-1)) { \ + SwitchOdd( 3) SwitchEven( 2) SwitchOdd( 1) \ + } \ + while ((nl -= UNROLL) >= 0) { \ + LoopReset \ + BodyEven( 4) \ + BodyOdd( 3) BodyEven( 2) BodyOdd( 1) \ + } +#endif + +#if PPW == 32 +#define DuffL(counter,label,body) \ + switch (counter & 3) { \ + label: \ + body \ + case 3: \ + body \ + case 2: \ + body \ + case 1: \ + body \ + case 0: \ + if ((counter -= 4) >= 0) \ + goto label; \ + } +#else /* PPW == 64 */ +#define DuffL(counter,label,body) \ + switch (counter & 7) { \ + label: \ + body \ + case 7: \ + body \ + case 6: \ + body \ + case 5: \ + body \ + case 4: \ + body \ + case 3: \ + body \ + case 2: \ + body \ + case 1: \ + body \ + case 0: \ + if ((counter -= 8) >= 0) \ + goto label; \ + } +#endif /* PPW */