Fixed bug 2537 - _allmul in SDL_lib.c is not working properly
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
diff --git a/src/stdlib/SDL_stdlib.c b/src/stdlib/SDL_stdlib.c
index c5f5e9d..b1de63d 100644
--- a/src/stdlib/SDL_stdlib.c
+++ b/src/stdlib/SDL_stdlib.c
@@ -370,44 +370,35 @@ _ftol2_sse()
_ftol();
}
-/* 64-bit math operators for 32-bit systems */
-void
-__declspec(naked)
-_allmul()
-{
- /* *INDENT-OFF* */
- __asm {
- push ebp
- mov ebp,esp
- push edi
- push esi
- push ebx
- sub esp,0Ch
- mov eax,dword ptr [ebp+10h]
- mov edi,dword ptr [ebp+8]
- mov ebx,eax
- mov esi,eax
- sar esi,1Fh
- mov eax,dword ptr [ebp+8]
- mul ebx
- imul edi,esi
- mov ecx,edx
- mov dword ptr [ebp-18h],eax
- mov edx,dword ptr [ebp+0Ch]
- add ecx,edi
- imul ebx,edx
- mov eax,dword ptr [ebp-18h]
- lea ebx,[ebx+ecx]
- mov dword ptr [ebp-14h],ebx
- mov edx,dword ptr [ebp-14h]
- add esp,0Ch
- pop ebx
- pop esi
- pop edi
- pop ebp
- ret 10h
- }
- /* *INDENT-ON* */
+/* 64-bit math operators for 32-bit systems */
+void
+__declspec(naked)
+_allmul()
+{
+ /* *INDENT-OFF* */
+ __asm {
+ mov eax, dword ptr[esp+8]
+ mov ecx, dword ptr[esp+10h]
+ or ecx, eax
+ mov ecx, dword ptr[esp+0Ch]
+ jne hard
+ mov eax, dword ptr[esp+4]
+ mul ecx
+ ret 10h
+hard:
+ push ebx
+ mul ecx
+ mov ebx, eax
+ mov eax, dword ptr[esp+8]
+ mul dword ptr[esp+14h]
+ add ebx, eax
+ mov eax, dword ptr[esp+8]
+ mul ecx
+ add edx, ebx
+ pop ebx
+ ret 10h
+ }
+ /* *INDENT-ON* */
}
void