Real fix for mode switch segfault, not to mention collosal inline asm cleanups
This commit is contained in:
@@ -124,7 +124,7 @@ if test x$debug = xyes; then
|
|||||||
dnl It is actually easier to debug zsnes with no optimization
|
dnl It is actually easier to debug zsnes with no optimization
|
||||||
dnl enabled.
|
dnl enabled.
|
||||||
|
|
||||||
CFLAGS="$CFLAGS -DDEBUG -O0 -fno-omit-frame-pointer -ggdb3"
|
CFLAGS="$CFLAGS -DDEBUG -O0 -fomit-frame-pointer -ggdb3"
|
||||||
NFLAGS="$NFLAGS -DDEBUG -g -s"
|
NFLAGS="$NFLAGS -DDEBUG -g -s"
|
||||||
ZSNESEXE="zsnesd"
|
ZSNESEXE="zsnesd"
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -127,39 +127,37 @@ void sw_clearwin()
|
|||||||
case 16:
|
case 16:
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
" xorl %%eax, %%eax\n" \
|
" xorl %%eax, %%eax\n" \
|
||||||
" movl SurfBufD, %%edi\n" \
|
|
||||||
" xorl %%ebx, %%ebx\n" \
|
" xorl %%ebx, %%ebx\n" \
|
||||||
"Blank2:\n" \
|
"Blank2:\n" \
|
||||||
" movl SurfaceX, %%ecx\n" \
|
" movl %1, %%ecx\n" \
|
||||||
" rep\n" \
|
" rep\n" \
|
||||||
" stosw\n" \
|
" stosw\n" \
|
||||||
" movl SurfaceX, %%edx\n" \
|
" movl %1, %%edx\n" \
|
||||||
" addl pitch, %%edi\n" \
|
" addl %0, %%edi\n" \
|
||||||
" shll $1, %%edx\n" \
|
" shll $1, %%edx\n" \
|
||||||
" addl $1, %%ebx\n" \
|
" addl $1, %%ebx\n" \
|
||||||
" subl %%edx, %%edi\n" \
|
" subl %%edx, %%edi\n" \
|
||||||
" cmpl SurfaceY, %%ebx\n" \
|
" cmpl %2, %%ebx\n" \
|
||||||
" jne Blank2\n" \
|
" jne Blank2\n" \
|
||||||
: : : "cc", "memory", "eax", "ebx", "edx", "ecx", "edi");
|
: : "g" (pitch), "g" (SurfaceX), "g" (SurfaceY), "D" (SurfBufD) : "cc", "memory", "eax", "ebx", "edx", "ecx");
|
||||||
break;
|
break;
|
||||||
case 32:
|
case 32:
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
" xorl %%eax, %%eax\n" \
|
" xorl %%eax, %%eax\n" \
|
||||||
" movl SurfBufD, %%edi\n" \
|
|
||||||
" xorl %%ebx, %%ebx\n" \
|
" xorl %%ebx, %%ebx\n" \
|
||||||
"Blank3:\n" \
|
"Blank3:\n" \
|
||||||
" movl SurfaceX, %%ecx\n" \
|
" movl %1, %%ecx\n" \
|
||||||
" rep\n" \
|
" rep\n" \
|
||||||
" stosl\n" \
|
" stosl\n" \
|
||||||
" addl pitch, %%edi\n" \
|
" addl %0, %%edi\n" \
|
||||||
" subl SurfaceX, %%edi\n" \
|
" subl %1, %%edi\n" \
|
||||||
" subl SurfaceX, %%edi\n" \
|
" subl %1, %%edi\n" \
|
||||||
" subl SurfaceX, %%edi\n" \
|
" subl %1, %%edi\n" \
|
||||||
" subl SurfaceX, %%edi\n" \
|
" subl %1, %%edi\n" \
|
||||||
" addl $1, %%ebx\n" \
|
" addl $1, %%ebx\n" \
|
||||||
" cmpl SurfaceY, %%ebx\n" \
|
" cmpl %2, %%ebx\n" \
|
||||||
" jne Blank3\n" \
|
" jne Blank3\n" \
|
||||||
: : : "cc", "memory", "eax", "ebx", "ecx","edi");
|
: : "g" (pitch), "g" (SurfaceX), "g" (SurfaceY), "D" (SurfBufD) : "cc", "memory", "eax", "ebx", "ecx");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
UnlockSurface();
|
UnlockSurface();
|
||||||
@@ -201,12 +199,7 @@ void sw_drawwin()
|
|||||||
case 16:
|
case 16:
|
||||||
if (MMXSupport){
|
if (MMXSupport){
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
" pushw %%es\n" \
|
|
||||||
" movw %%ds, %%ax\n" \
|
|
||||||
" movw %%ax, %%es\n" \
|
|
||||||
" xorl %%eax, %%eax\n" \
|
" xorl %%eax, %%eax\n" \
|
||||||
" movl ScreenPtr, %%esi\n" \
|
|
||||||
" movl SurfBufD, %%edi\n" \
|
|
||||||
"Copying3:\n" \
|
"Copying3:\n" \
|
||||||
" movl $32, %%ecx\n" \
|
" movl $32, %%ecx\n" \
|
||||||
"CopyLoop:\n" \
|
"CopyLoop:\n" \
|
||||||
@@ -219,7 +212,7 @@ void sw_drawwin()
|
|||||||
" decl %%ecx\n" \
|
" decl %%ecx\n" \
|
||||||
" jnz CopyLoop\n" \
|
" jnz CopyLoop\n" \
|
||||||
" incl %%eax\n" \
|
" incl %%eax\n" \
|
||||||
" addl pitch, %%edi\n" \
|
" addl %0, %%edi\n" \
|
||||||
" subl $512, %%edi\n" \
|
" subl $512, %%edi\n" \
|
||||||
" addl $64, %%esi\n" \
|
" addl $64, %%esi\n" \
|
||||||
" cmpl $223, %%eax\n" \
|
" cmpl $223, %%eax\n" \
|
||||||
@@ -229,24 +222,18 @@ void sw_drawwin()
|
|||||||
" movl $128, %%ecx\n" \
|
" movl $128, %%ecx\n" \
|
||||||
" rep\n" \
|
" rep\n" \
|
||||||
" stosl\n" \
|
" stosl\n" \
|
||||||
" popw %%es\n" \
|
|
||||||
" emms\n" \
|
" emms\n" \
|
||||||
: : : "cc", "memory", "eax", "ebx", "ecx","edi", "esi");
|
: : "g" (pitch), "S" (ScreenPtr), "D" (SurfBufD) : "cc", "memory", "eax", "ebx", "ecx");
|
||||||
} else {
|
} else {
|
||||||
// Doesn't seem to work - DDOI
|
// Doesn't seem to work - DDOI
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
" pushw %%es\n" \
|
|
||||||
" movw %%ds, %%ax\n" \
|
|
||||||
" movw %%ax, %%es\n" \
|
|
||||||
" xorl %%eax, %%eax\n" \
|
" xorl %%eax, %%eax\n" \
|
||||||
" movl ScreenPtr, %%esi\n" \
|
|
||||||
" movl SurfBufD, %%edi\n" \
|
|
||||||
"Copying:\n" \
|
"Copying:\n" \
|
||||||
" movl $128, %%ecx\n" \
|
" movl $128, %%ecx\n" \
|
||||||
" rep\n" \
|
" rep\n" \
|
||||||
" movsl\n" \
|
" movsl\n" \
|
||||||
" incl %%eax\n" \
|
" incl %%eax\n" \
|
||||||
" addl pitch, %%edi\n" \
|
" addl %0, %%edi\n" \
|
||||||
" subl $512, %%edi\n" \
|
" subl $512, %%edi\n" \
|
||||||
" addl $64, %%esi\n" \
|
" addl $64, %%esi\n" \
|
||||||
" cmpl $223, %%eax\n" \
|
" cmpl $223, %%eax\n" \
|
||||||
@@ -255,20 +242,13 @@ void sw_drawwin()
|
|||||||
" movl $128, %%ecx\n" \
|
" movl $128, %%ecx\n" \
|
||||||
" rep\n" \
|
" rep\n" \
|
||||||
" stosl\n" \
|
" stosl\n" \
|
||||||
" popw %%es\n" \
|
: : "g" (pitch), "S" (ScreenPtr), "D" (SurfBufD) : "cc", "memory", "eax", "ecx");
|
||||||
: : : "cc", "memory", "eax", "ebx", "ecx","edi", "esi");
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 32:
|
case 32:
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
" pushw %%es\n" \
|
|
||||||
" movw %%ds, %%ax\n" \
|
|
||||||
" movw %%ax, %%es\n" \
|
|
||||||
" xorl %%eax, %%eax\n" \
|
" xorl %%eax, %%eax\n" \
|
||||||
" movl BitConv32Ptr, %%ebx\n" \
|
|
||||||
" movl ScreenPtr, %%esi\n" \
|
|
||||||
" movl SurfBufD, %%edi\n" \
|
|
||||||
"Copying32b:\n" \
|
"Copying32b:\n" \
|
||||||
" movl $256, %%ecx\n" \
|
" movl $256, %%ecx\n" \
|
||||||
" pushl %%eax\n" \
|
" pushl %%eax\n" \
|
||||||
@@ -283,13 +263,12 @@ void sw_drawwin()
|
|||||||
" jnz CopyLoop32b\n" \
|
" jnz CopyLoop32b\n" \
|
||||||
" popl %%eax\n" \
|
" popl %%eax\n" \
|
||||||
" incl %%eax\n" \
|
" incl %%eax\n" \
|
||||||
" addl pitch, %%edi\n" \
|
" addl %0, %%edi\n" \
|
||||||
" subl $1024, %%edi\n" \
|
" subl $1024, %%edi\n" \
|
||||||
" addl $64, %%esi\n" \
|
" addl $64, %%esi\n" \
|
||||||
" cmpl $223, %%eax\n" \
|
" cmpl $223, %%eax\n" \
|
||||||
" jne Copying32b\n" \
|
" jne Copying32b\n" \
|
||||||
" popw %%es\n" \
|
: : "g" (pitch), "b" (BitConv32Ptr), "S" (ScreenPtr), "D" (SurfBufD) : "cc", "memory", "eax", "ecx","edx");
|
||||||
: : : "cc", "memory", "eax", "ebx", "ecx","edi", "esi");
|
|
||||||
SURFDW = (DWORD *) SurfBufD + 222*pitch;
|
SURFDW = (DWORD *) SurfBufD + 222*pitch;
|
||||||
color32 = 0x7F000000;
|
color32 = 0x7F000000;
|
||||||
|
|
||||||
@@ -334,19 +313,14 @@ void sw_drawwin()
|
|||||||
case 16:
|
case 16:
|
||||||
if (MMXSupport) {
|
if (MMXSupport) {
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
" pushw %%es\n" \
|
|
||||||
" movw %%ds, %%ax\n" \
|
|
||||||
" movw %%ax, %%es\n" \
|
|
||||||
" xor %%eax, %%eax\n" \
|
" xor %%eax, %%eax\n" \
|
||||||
" xor %%ebx, %%ebx\n" \
|
" xor %%ebx, %%ebx\n" \
|
||||||
" movl ScreenPtr, %%esi\n" \
|
|
||||||
" movl SurfBufD, %%edi\n" \
|
|
||||||
"Blank1MMX:\n" \
|
"Blank1MMX:\n" \
|
||||||
" mov $160, %%ecx\n" \
|
" mov $160, %%ecx\n" \
|
||||||
" rep\n" \
|
" rep\n" \
|
||||||
" stosl\n" \
|
" stosl\n" \
|
||||||
" subl $160, %%edi\n" \
|
" subl $160, %%edi\n" \
|
||||||
" addl pitch, %%edi\n" \
|
" addl %0, %%edi\n" \
|
||||||
" addl $1, %%ebx\n" \
|
" addl $1, %%ebx\n" \
|
||||||
" cmpl $8, %%ebx\n" \
|
" cmpl $8, %%ebx\n" \
|
||||||
" jne Blank1MMX\n" \
|
" jne Blank1MMX\n" \
|
||||||
@@ -378,7 +352,7 @@ void sw_drawwin()
|
|||||||
" decl %%ecx\n" \
|
" decl %%ecx\n" \
|
||||||
" jnz MMXLoopC\n" \
|
" jnz MMXLoopC\n" \
|
||||||
" incl %%ebx\n" \
|
" incl %%ebx\n" \
|
||||||
" addl pitch, %%edi\n" \
|
" addl %0, %%edi\n" \
|
||||||
" subl $640, %%edi\n" \
|
" subl $640, %%edi\n" \
|
||||||
" addl $64, %%esi\n" \
|
" addl $64, %%esi\n" \
|
||||||
" cmpl $223, %%ebx\n" \
|
" cmpl $223, %%ebx\n" \
|
||||||
@@ -387,25 +361,19 @@ void sw_drawwin()
|
|||||||
" movl $128, %%ecx\n" \
|
" movl $128, %%ecx\n" \
|
||||||
" rep\n" \
|
" rep\n" \
|
||||||
" stosl\n" \
|
" stosl\n" \
|
||||||
" pop %%es\n" \
|
|
||||||
" emms\n" \
|
" emms\n" \
|
||||||
: : : "cc", "memory", "eax", "ebx", "ecx","edi", "esi");
|
: : "g" (pitch), "S" (ScreenPtr), "D" (SurfBufD) : "cc", "memory", "eax", "ebx", "ecx");
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
" push %%es\n" \
|
|
||||||
" movw %%ds, %%ax\n" \
|
|
||||||
" movw %%ax, %%es\n" \
|
|
||||||
" xorl %%eax, %%eax\n" \
|
" xorl %%eax, %%eax\n" \
|
||||||
" xorl %%ebx, %%ebx\n" \
|
" xorl %%ebx, %%ebx\n" \
|
||||||
" movl ScreenPtr, %%esi\n" \
|
|
||||||
" movl SurfBufD, %%edi\n" \
|
|
||||||
"Blank1:\n" \
|
"Blank1:\n" \
|
||||||
" movl $160, %%ecx\n" \
|
" movl $160, %%ecx\n" \
|
||||||
" rep\n" \
|
" rep\n" \
|
||||||
" stosl\n" \
|
" stosl\n" \
|
||||||
" subl $640, %%edi\n" \
|
" subl $640, %%edi\n" \
|
||||||
" addl pitch, %%edi\n" \
|
" addl %0, %%edi\n" \
|
||||||
" addl $1, %%ebx\n" \
|
" addl $1, %%ebx\n" \
|
||||||
" cmpl $8, %%ebx\n" \
|
" cmpl $8, %%ebx\n" \
|
||||||
"jne Blank1\n" \
|
"jne Blank1\n" \
|
||||||
@@ -421,7 +389,7 @@ void sw_drawwin()
|
|||||||
" rep\n" \
|
" rep\n" \
|
||||||
" stosl\n" \
|
" stosl\n" \
|
||||||
" incl %%ebx\n" \
|
" incl %%ebx\n" \
|
||||||
" addl pitch, %%edi\n" \
|
" addl %0, %%edi\n" \
|
||||||
" subl $640, %%edi\n" \
|
" subl $640, %%edi\n" \
|
||||||
" addl $64, %%esi\n" \
|
" addl $64, %%esi\n" \
|
||||||
" cmpl $223, %%ebx\n" \
|
" cmpl $223, %%ebx\n" \
|
||||||
@@ -430,8 +398,7 @@ void sw_drawwin()
|
|||||||
" movl $128, %%ecx\n" \
|
" movl $128, %%ecx\n" \
|
||||||
" rep\n" \
|
" rep\n" \
|
||||||
" stosl\n" \
|
" stosl\n" \
|
||||||
" pop %%es\n" \
|
: : "g" (pitch), "S" (ScreenPtr), "D" (SurfBufD) : "cc", "memory", "eax", "ebx", "ecx");
|
||||||
: : : "cc", "memory", "eax", "ebx", "ecx","edi", "esi");
|
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -509,13 +476,7 @@ void sw_drawwin()
|
|||||||
|
|
||||||
case 32:
|
case 32:
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
" pushw %%es\n" \
|
|
||||||
" movw %%ds, %%ax\n" \
|
|
||||||
" movw %%ax, %%es\n" \
|
|
||||||
" xorl %%eax, %%eax\n" \
|
" xorl %%eax, %%eax\n" \
|
||||||
" movl BitConv32Ptr, %%ebx\n" \
|
|
||||||
" movl ScreenPtr, %%esi\n" \
|
|
||||||
" movl SurfBufD, %%edi\n" \
|
|
||||||
"Copying32c:\n" \
|
"Copying32c:\n" \
|
||||||
" movl $256, %%ecx\n" \
|
" movl $256, %%ecx\n" \
|
||||||
" pushl %%eax\n" \
|
" pushl %%eax\n" \
|
||||||
@@ -530,7 +491,7 @@ void sw_drawwin()
|
|||||||
" loop CopyLoop32c\n" \
|
" loop CopyLoop32c\n" \
|
||||||
" pushl %%esi\n" \
|
" pushl %%esi\n" \
|
||||||
" movl %%edi, %%esi\n" \
|
" movl %%edi, %%esi\n" \
|
||||||
" subl pitch, %%esi\n" \
|
" subl %0, %%esi\n" \
|
||||||
" movl $512, %%ecx\n" \
|
" movl $512, %%ecx\n" \
|
||||||
" rep\n" \
|
" rep\n" \
|
||||||
" movsl\n" \
|
" movsl\n" \
|
||||||
@@ -540,8 +501,7 @@ void sw_drawwin()
|
|||||||
" addl $64, %%esi\n" \
|
" addl $64, %%esi\n" \
|
||||||
" cmpl $223, %%eax\n" \
|
" cmpl $223, %%eax\n" \
|
||||||
" jne Copying32c\n" \
|
" jne Copying32c\n" \
|
||||||
" popw %%es\n" \
|
: : "g" (pitch), "S" (ScreenPtr), "D" (SurfBufD), "b" (BitConv32Ptr) : "cc", "memory","eax","ecx","edx");
|
||||||
: : : "cc", "memory","eax","ebx","ecx","edx","edi","esi");
|
|
||||||
break;
|
break;
|
||||||
/*
|
/*
|
||||||
addl pitch, %%edi
|
addl pitch, %%edi
|
||||||
@@ -571,13 +531,7 @@ void sw_drawwin()
|
|||||||
|
|
||||||
case 32:
|
case 32:
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
" pushw %%es\n" \
|
|
||||||
" movw %%ds, %%ax\n" \
|
|
||||||
" movw %%ax, %%es\n" \
|
|
||||||
" xorl %%eax, %%eax\n" \
|
" xorl %%eax, %%eax\n" \
|
||||||
" movl BitConv32Ptr, %%ebx\n" \
|
|
||||||
" movl ScreenPtr, %%esi\n" \
|
|
||||||
" movl SurfBufD, %%edi\n" \
|
|
||||||
" addl $20608, %%edi\n" \
|
" addl $20608, %%edi\n" \
|
||||||
"Copying32d:\n" \
|
"Copying32d:\n" \
|
||||||
" movl $256, %%ecx\n" \
|
" movl $256, %%ecx\n" \
|
||||||
@@ -594,7 +548,7 @@ void sw_drawwin()
|
|||||||
" addl $512, %%edi\n" \
|
" addl $512, %%edi\n" \
|
||||||
" pushl %%esi\n" \
|
" pushl %%esi\n" \
|
||||||
" movl %%edi, %%esi\n" \
|
" movl %%edi, %%esi\n" \
|
||||||
" subl pitch, %%esi\n" \
|
" subl %0, %%esi\n" \
|
||||||
" movl $512, %%ecx\n" \
|
" movl $512, %%ecx\n" \
|
||||||
" rep\n" \
|
" rep\n" \
|
||||||
" movsl\n" \
|
" movsl\n" \
|
||||||
@@ -605,8 +559,7 @@ void sw_drawwin()
|
|||||||
" addl $64, %%esi\n" \
|
" addl $64, %%esi\n" \
|
||||||
" cmpl $223, %%eax\n" \
|
" cmpl $223, %%eax\n" \
|
||||||
" jne Copying32d\n" \
|
" jne Copying32d\n" \
|
||||||
" popw %%es\n" \
|
: : "g" (pitch), "S" (ScreenPtr), "D" (SurfBufD), "b" (BitConv32Ptr) : "cc", "memory","eax","ecx","edx");
|
||||||
: : : "cc", "memory","eax","ebx","ecx","edx","edi","esi");
|
|
||||||
break;
|
break;
|
||||||
/*
|
/*
|
||||||
addl pitch, %%edi
|
addl pitch, %%edi
|
||||||
|
|||||||
Reference in New Issue
Block a user