--- API.xs.orig 2004-08-16 01:20:16.461320000 +0200 +++ API.xs 2004-08-16 01:24:30.055971200 +0200 @@ -216,6 +216,7 @@ int iParam; long lParam; float fParam; + double dParamBuf; double dParam; char cParam; char *pParam; @@ -475,20 +476,28 @@ #ifdef WIN32_API_DEBUG printf("(XS)Win32::API::Call: parameter %d (P) is %s\n", i, pParam); #endif - _asm { - mov eax, dword ptr pParam - push eax - } + __asm__ __volatile__ ( + "movl %0, %%eax\n\t" + : + : "g" (pParam) + ); + __asm__ __volatile__ ( + "pushl %eax\n\t" + ); break; case T_POINTERPOINTER: ppParam = params[i].b; #ifdef WIN32_API_DEBUG printf("(XS)Win32::API::Call: parameter %d (P) is %s\n", i, ppParam); #endif - _asm { - mov eax, dword ptr ppParam - push eax - } + __asm__ __volatile__ ( + "movl %0, %%eax\n\t" + : + : "g" (ppParam) + ); + __asm__ __volatile__ ( + "pushl %eax\n\t" + ); break; case T_NUMBER: case T_CHAR: @@ -496,42 +505,65 @@ #ifdef WIN32_API_DEBUG printf("(XS)Win32::API::Call: parameter %d (N) is %ld\n", i, lParam); #endif - _asm { - mov eax, lParam - push eax - } + __asm__ __volatile__ ( + "movl %0, %%eax\n\t" + : + : "g" (lParam) + ); + __asm__ __volatile__ ( + "pushl %eax\n\t" + ); break; case T_FLOAT: fParam = params[i].f; #ifdef WIN32_API_DEBUG printf("(XS)Win32::API::Call: parameter %d (F) is %f\n", i, fParam); #endif - _asm { - mov eax, fParam - push eax - } + __asm__ __volatile__ ( + "movl %0, %%eax\n\t" + : + : "g" (fParam) + ); + __asm__ __volatile__ ( + "pushl %eax\n\t" + ); break; case T_DOUBLE: dParam = params[i].d; + dParamBuf = dParam+4; #ifdef WIN32_API_DEBUG printf("(XS)Win32::API::Call: parameter %d (D) is %f\n", i, dParam); #endif - _asm { - mov eax, dword ptr [dParam + 4] - push eax - mov eax, dword ptr [dParam] - push eax - } + __asm__ __volatile__ ( + "movl %0, %%eax\n\t" + : + : "g" (dParamBuf) + ); + __asm__ __volatile__ ( + "pushl %eax\n\t" + ); + __asm__ __volatile__ ( + "movl %0, %%eax\n\t" + : + : "g" (dParam) + ); + __asm__ __volatile__ ( + "pushl %eax\n\t" + ); break; case T_CODE: lParam = params[i].l; #ifdef WIN32_API_DEBUG printf("(XS)Win32::API::Call: parameter %d (K) is 0x%x\n", i, lParam); #endif - _asm { - mov eax, lParam - push eax - } + __asm__ __volatile__ ( + "movl %0, %%eax\n\t" + : + : "g" (lParam) + ); + __asm__ __volatile__ ( + "pushl %eax\n\t" + ); break; } } @@ -551,10 +583,6 @@ #ifdef WIN32_API_DEBUG printf("(XS)Win32::API::Call: Calling ApiFunctionFloat()\n"); #endif -// _asm { -// call dword ptr [ApiFunctionFloat] -// fstp qword ptr [fReturn] -// } fReturn = ApiFunctionFloat(); #ifdef WIN32_API_DEBUG printf("(XS)Win32::API::Call: ApiFunctionFloat returned %f\n", fReturn); @@ -565,12 +593,9 @@ #ifdef WIN32_API_DEBUG printf("(XS)Win32::API::Call: Calling ApiFunctionDouble()\n"); #endif - _asm { - call dword ptr [ApiFunctionDouble] - fstp qword ptr [dReturn] - } + dReturn = ApiFunctionDouble(); #ifdef WIN32_API_DEBUG - printf("(XS)Win32::API::Call: ApiFunctionDouble returned %f\n", dReturn); + printf("(XS)Win32::API::Call: ApiFunctionDouble returned %f\n", dReturn); #endif break; case T_POINTER: