GCC has problems with 64-bit multiplication
Hans Petter Selasky
hselasky@c2i.net
Thu Feb 8 14:03:00 GMT 2007
Test program:
#include <stdio.h>
#include <sys/types.h>
int main() {
int32_t a = 0x40000000;
int16_t b = 0x4000;
int64_t c = a * b;
printf("0x%016llx\n", c);
return 0;
}
%cc test.c
%./a.out
0x0000000000000000
%gcc --version
gcc (GCC) 3.4.6 [FreeBSD] 20060305
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Generated assembly code:
8048514: c7 45 fc 00 00 00 40 movl $0x40000000,0xfffffffc(%ebp)
804851b: 66 c7 45 fa 00 40 movw $0x4000,0xfffffffa(%ebp)
8048521: 0f bf 45 fa movswl 0xfffffffa(%ebp),%eax
8048525: 0f af 45 fc imul 0xfffffffc(%ebp),%eax
XXX this instruction is probably the bug:
8048529: 99 cltd
804852a: 89 45 f0 mov %eax,0xfffffff0(%ebp)
804852d: 89 55 f4 mov %edx,0xfffffff4(%ebp)
8048530: 83 ec 04 sub $0x4,%esp
8048533: ff 75 f4 pushl 0xfffffff4(%ebp)
8048536: ff 75 f0 pushl 0xfffffff0(%ebp)
8048539: 68 cb 85 04 08 push $0x80485cb
804853e: e8 49 fe ff ff call 804838c <_init+0x24>
8048543: 83 c4 10 add $0x10,%esp
--HPS
More information about the Gcc-bugs
mailing list