OK. Pelles C fastcall incompatibilities. Disclaimer: tested with MSVC6 only.
1. Incorrect order of arguments, when non-integer arguments exist.
When calling fastcall function, MSVC searches argument list from left to right for 32-bit (16-bit, 8-bit) integers or pointers, and places the first such argument in ECX (CX, CL), the second in EDX (DX, DL), then it copies remaining arguments to stack from right to left. If called function returns non 8-bit/16-bit/32-bit/64-bit structure, MSVC then PUSHes an address of result buffer (presult in the attached source code). After that MSVC calls function.
2. Passing presult in register.
Pelles C sometimes passes pointer to buffer for returned structure in ECX or EDX. In MSVC it is always the first stack argument (pushed last). Also Pelles C has a bug in __fastcall functions that return structures (see attached example).
3. When returning structures, Pelles C doesn't return pointer-to-result in EAX, but MSVC always does.
The whole process of returning non 8-bit/16-bit/32-bit/64-bit structure in MSVC (you don't need to copy this behavior, just return a pointer in EAX): calling function allocates temporary buffer for result, passes pointer to it as the first STACK argument of a function, function fills that buffer and returns pointer to it in EAX; if calling function wants to store “returned” structure to a variable, it copies structure from the buffer pointed by EAX to that variable.