From: Benjamin K. <bk...@we...> - 2002-01-09 22:57:11
|
What's the advantages of using fastcall calling convention? I think the advantage is that all arguments passed to function via cpu register. This is faster than accessing the stack. But mingw's implementation is a real joke, it's slower than using cdecl convention. The other point is, the fastcall implementation in mingw is wrong. Should be: argument 1: eax argument 2: edx argument 3: ecx argument 4: stack ->right to left order like pascal convention argument x: stack+x Here some examples: int __attribute__((fastcall)) MyFunc(int a, int b, int c, int d) { return a+b+c+d; } int __attribute__((regparm(3))) MyFunc2(int a, int b, int c, int d) { return a+b+c+d; } int __attribute__((cdecl)) MyFunc2(int a, int b, int c, int d) { return a+b+c+d; } Assembler: @MyFunc@16: pushl %ebp movl %esp,%ebp subl $24,%esp movl %ecx,-4(%ebp) movl %edx,-8(%ebp) movl -4(%ebp),%eax movl -8(%ebp),%ecx leal (%ecx,%eax),%edx addl 8(%ebp),%edx addl 12(%ebp),%edx movl %edx,%eax movl %ebp,%esp popl %ebp ret $8 _MyFunc2: pushl %ebp movl %esp,%ebp subl $24,%esp movl %eax,-4(%ebp) movl %edx,-8(%ebp) movl %ecx,-12(%ebp) movl -4(%ebp),%eax movl -8(%ebp),%ecx leal (%ecx,%eax),%edx addl -12(%ebp),%edx addl 8(%ebp),%edx movl %edx,%eax movl %ebp,%esp popl %ebp ret _MyFunc3: pushl %ebp movl %esp,%ebp movl 8(%ebp),%eax movl 12(%ebp),%ecx leal (%ecx,%eax),%edx addl 16(%ebp),%edx addl 20(%ebp),%edx movl %edx,%eax movl %ebp,%esp popl %ebp ret You see the shortest one is cdecl. Why does the compiler copy evry argument passed via registers to the stack even if this isn't necessary: in MyFunc2 ... movl %eax,-4(%ebp) movl %edx,-8(%ebp) movl %ecx,-12(%ebp) The best implementation for MyFunc2 would be: _MyFunc2: pushl %ebp movl %esp,%ebp movl 8(%ebp),%ebx leal (%edx,%ecx),%eax or addl %edx,%eax\n addl %ecx,%eax\n addl %ebx,%eax movl %ebp,%esp popl %ebp ret or without stackframe: _MyFunc2: movl 4(%esp),%ebx leal (%edx,%ecx),%eax or addl %edx,%eax\n addl %ecx,%eax\n addl %ebx,%eax ret Are there some switches which can turn this behaviour off ? rg Benjamin Kalytta |
From: Eric K. <ek...@rz...> - 2002-01-09 23:50:29
|
"Benjamin Kalytta" <bk...@we...> wrote: > What's the advantages of using fastcall calling convention? The most important advantage is that you can use MinGW to build WinNT/2000/XP drivers. > I think the advantage is that all arguments passed to function via cpu > register. This is faster than accessing the stack. But mingw's > implementation is a real joke, it's slower than using cdecl convention. The > other point is, the fastcall implementation in mingw is wrong. Use the '-O3' option with gcc and you will see some nice assembler code without any 'bells and whistles'. > Should be: > argument 1: eax > argument 2: edx > argument 3: ecx > argument 4: stack ->right to left order like pascal convention > argument x: stack+x > This is wrong! Microsoft defines fastcall as: argument 1: eax argument 2: ecx argument 3: stack ->right to left order like pascal convention argument x: stack+x Regards, Eric Kohl |