- Fixed the inline assembler in DIB_16BPP_ColorFill.

- Calculated the color value outside of the loop in DIB_16BPP_ColorFill.

svn path=/trunk/; revision=15869
This commit is contained in:
Hartmut Birr 2005-06-12 10:23:04 +00:00
parent 321c3545d8
commit b2f1b36fd9

View file

@ -454,32 +454,29 @@ DIB_16BPP_ColorFill(SURFOBJ* DestSurface, RECTL* DestRect, ULONG color)
ULONG delta = DestSurface->lDelta; ULONG delta = DestSurface->lDelta;
ULONG width = (DestRect->right - DestRect->left) ; ULONG width = (DestRect->right - DestRect->left) ;
PULONG pos = (PULONG) (DestSurface->pvScan0 + DestRect->top * delta + (DestRect->left<<1)); PULONG pos = (PULONG) (DestSurface->pvScan0 + DestRect->top * delta + (DestRect->left<<1));
color = (color<<16)|(color&0xffff); /* If the color value is "abcd", put "abcdabcd" into color */
for (DestY = DestRect->top; DestY< DestRect->bottom; DestY++) for (DestY = DestRect->top; DestY< DestRect->bottom; DestY++)
{ {
int d0, d1, d2;
__asm__ __volatile__ ( __asm__ __volatile__ (
" cld\n" " cld\n"
" mov %0, %%eax\n"
" mov %%eax, %%ecx\n"
" shl $16, %%eax\n"
" andl $0xffff, %%ecx\n" /* If the pixel value is "abcd", put "abcdabcd" in %eax */
" or %%ecx, %%eax\n"
" test $0x03, %%edi\n" /* Align to fullword boundary */ " test $0x03, %%edi\n" /* Align to fullword boundary */
" jz .FL1\n" " jz .FL1\n"
" stosw\n" " stosw\n"
" dec %1\n" " dec %4\n"
" jz .FL2\n" " jz .FL2\n"
".FL1:\n" ".FL1:\n"
" mov %1,%%ecx\n" /* Setup count of fullwords to fill */ " mov %4,%%ecx\n" /* Setup count of fullwords to fill */
" shr $1,%%ecx\n" " shr $1,%%ecx\n"
" rep stosl\n" /* The actual fill */ " rep stosl\n" /* The actual fill */
" test $0x01, %1\n" /* One left to do at the right side? */ " test $0x01, %4\n" /* One left to do at the right side? */
" jz .FL2\n" " jz .FL2\n"
" stosw\n" " stosw\n"
".FL2:\n" ".FL2:\n"
: /* no output */ : "=&A" (d0), "=&r" (d1), "=&D" (d2)
: "r"(color), "r"(width), "D"(pos) : "0"(color), "1"(width), "2"(pos)
: "%eax", "%ecx"); : "%ecx");
pos =(PULONG)((ULONG_PTR)pos + delta); pos =(PULONG)((ULONG_PTR)pos + delta);
} }
#else /* _M_IX86 */ #else /* _M_IX86 */