[Bug target/31679] Incorrect result of multiplication long long by 0xFFFFFFFFLL constant.

ian dot rogers at manchester dot ac dot uk gcc-bugzilla@gcc.gnu.org
Wed May 16 13:02:00 GMT 2007



------- Comment #5 from ian dot rogers at manchester dot ac dot uk  2007-05-16 14:01 -------
For the following code given in [1] GCC produces identical multiplication by
constant code [2]. I think as 0x0FFFFFFFF is one of the parameters in this bug
the fact we generate identical multiplication code for 0x1FFFFFFFF means this
is another example of this error.

Thanks,
Ian Rogers

[1]
test.c:
extern long long x;
long long foo() {
   return x * ((((long long)0) << 32) + -1);
}
long long foo2() {
   return x * ((((long long)1) << 32) + -1);
}

[2]
test.s:
        .file   "test.c"
        .text
        .p2align 4,,15
.globl foo
        .type   foo, @function
foo:
        movl    x, %eax
        movl    x+4, %edx
        pushl   %ebp
        movl    %esp, %ebp
        negl    %eax
        popl    %ebp
        adcl    $0, %edx
        negl    %edx
        ret
        .size   foo, .-foo
        .p2align 4,,15
.globl foo2
        .type   foo2, @function
foo2:
        movl    x, %eax
        movl    x+4, %edx
        pushl   %ebp
        movl    %esp, %ebp
        negl    %eax
        popl    %ebp
        adcl    $0, %edx
        negl    %edx
        ret
        .size   foo2, .-foo2
        .ident  "GCC: (GNU) 4.1.2 20061115 (prerelease) (SUSE Linux)"
        .section        .note.GNU-stack,"",@progbits 


-- 


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



More information about the Gcc-bugs mailing list