diff --git a/reactos/subsys/win32k/dib/dib16bpp.c b/reactos/subsys/win32k/dib/dib16bpp.c index 48e9221fc96..347a4a6f921 100644 --- a/reactos/subsys/win32k/dib/dib16bpp.c +++ b/reactos/subsys/win32k/dib/dib16bpp.c @@ -90,7 +90,39 @@ DIB_16BPP_HLine(SURFOBJ *SurfObj, LONG x1, LONG x2, LONG y, ULONG c) VOID DIB_16BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) -{ +{ /* 2610-2700 */ +#ifdef _M_IX86 + asm volatile( + " testl %2, %2" "\n\t" + " jle 2f" "\n\t" + " movl %2, %%ecx" "\n\t" + " shr $2, %2" "\n\t" + " andl $3, %%ecx" "\n\t" + " jz 1f" "\n\t" + "0:" "\n\t" + " movw %%ax, (%0)" "\n\t" + " addl %1, %0" "\n\t" + " decl %%ecx" "\n\t" + " jnz 0b" "\n\t" + " testl %2, %2" "\n\t" + " jz 2f" "\n\t" + "1:" "\n\t" + " movw %%ax, (%0)" "\n\t" + " addl %1, %0" "\n\t" + " movw %%ax, (%0)" "\n\t" + " addl %1, %0" "\n\t" + " movw %%ax, (%0)" "\n\t" + " addl %1, %0" "\n\t" + " movw %%ax, (%0)" "\n\t" + " addl %1, %0" "\n\t" + " decl %2" "\n\t" + " jnz 1b" "\n\t" + "2:" "\n\t" + : /* no output */ + : "r"(SurfObj->pvScan0 + (y1 * SurfObj->lDelta) + (x * sizeof (WORD))), + "r"(SurfObj->lDelta), "r"(y2 - y1), "a"(c) + : "cc", "memory", "%ecx"); +#else PBYTE byteaddr = SurfObj->pvScan0 + y1 * SurfObj->lDelta; PWORD addr = (PWORD)byteaddr + x; LONG lDelta = SurfObj->lDelta; @@ -102,6 +134,7 @@ DIB_16BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) byteaddr += lDelta; addr = (PWORD)byteaddr; } +#endif } BOOLEAN