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