http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13355



--- Comment #9 from Steven Bosscher <steven at gcc dot gnu.org> 2012-11-08 
22:41:41 UTC ---

(In reply to comment #6)

> A reduced testcase for the second case.

> On mainline, i686-pc-linux-gnu.

> 

> /* -march=i686 -mtune=i686 -fomit-frame-pointer -O2 */

> 

> register int ebx asm ("ebx");

> register int dummy1 asm ("esi");

> register int dummy2 asm ("ebp");

> 

> int

> foo (int arg)

> {

>   long long res = (long long) arg * (long long) ebx;

>   return (int) res;

> }

> 

> Global variables take up three registers from IA-32!



GCC 4.1, GCC 4.3, and GCC 4.7 compile this to:

foo:

        subl    $12, %esp

        movl    16(%esp), %eax

        imull   %ebx

        movl    %eax, (%esp)

        movl    (%esp), %eax

        movl    %edx, 4(%esp)

        addl    $12, %esp

        ret





Trunk r193340 compiles it to:

foo:

        movl    %ebx, %eax

        imull   4(%esp)

        ret

Reply via email to