]> git.sesse.net Git - rdpsrv/blobdiff - Xserver/programs/Xserver/mfb/fastblt.h
Import X server from vnc-3.3.7.
[rdpsrv] / Xserver / programs / Xserver / mfb / fastblt.h
diff --git a/Xserver/programs/Xserver/mfb/fastblt.h b/Xserver/programs/Xserver/mfb/fastblt.h
new file mode 100644 (file)
index 0000000..0ca295d
--- /dev/null
@@ -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 */