This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/21671] New: Returning result of long long multiply from function clobbers lower 32 bits
- From: "j33433 at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 19 May 2005 20:55:31 -0000
- Subject: [Bug c/21671] New: Returning result of long long multiply from function clobbers lower 32 bits
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
m68k-unknown-elf-gcc (GCC) 3.4.4
Bug: long long multiply is broken when returning the result from a
subroutine. When using -O3 or higher, the lower half of the 64 bit
result is set to zero. This example works correctly with -O2.
Do not compile ll.c and ll_test.c as one file. Test case 2
fails (2LL * 2LL), the variable 'res' is zero.
m68k-unknown-elf-gcc -Wall -mcpu32 -c -O3 ll.c
/*
* ll.c
*/
long long
mul_ll (long long a, long long b)
{
return a * b;
}
/*
* ll_test.c
*/
long long mul_ll (long long a, long long b);
typedef struct
{
long long a;
long long b;
long long result;
}
ll_test;
int
main (void)
{
ll_test cases[] =
{
{
1073741824LL, /* 2 ^ 30 */
1000LL,
1073741824000LL
},
{
536870912LL, /* 2 ^ 29 */
2LL,
1073741824LL,
},
{
2LL,
2LL,
4LL,
}
};
int i;
long long res;
for (i = 0; i < (sizeof (cases) / sizeof (cases[0])); i++)
{
res = mul_ll (cases[i].a, cases[i].b);
if (res != cases[i].result)
{
printf ("case %d failed\n", i);
}
}
return 0;
}
mul_ll:
link.w %a6,#0
movm.l #0x3f00,-(%sp)
clr.l %d0
clr.l %d1
move.l 8(%a6),%d4
move.l 12(%a6),%d5
move.l 16(%a6),%d2
move.l 20(%a6),%d3
move.l %d5,%d7
mulu.l %d3,%d0:%d7 *** %d7 should be %d1 ***
move.l %d5,%d6
muls.l %d2,%d6
add.l %d0,%d6
move.l %d3,%d2
muls.l %d4,%d2
move.l %d6,%d0
add.l %d2,%d0
movm.l (%sp)+,#0xfc
unlk %a6
rts
--
Summary: Returning result of long long multiply from function
clobbers lower 32 bits
Product: gcc
Version: 3.4.4
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: j33433 at gmail dot com
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: i686-pc-linux-gnu
GCC host triplet: i686-pc-linux-gnu
GCC target triplet: m68k-unknown-elf
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21671