[Bug c/41055] New: libgcc functions and -mregparm don't work well together
patrick dot georgi at coresystems dot de
gcc-bugzilla@gcc.gnu.org
Thu Aug 13 14:46:00 GMT 2009
When building code with -mregparm=x on i?86 which uses libgcc functions (eg.
udivdi3), the calls to the libgcc functions use the calling convention as given
by mregparm, even though libgcc is internal to the compiler (and the user has
no ultimate control about when it is used).
Adding the compiler-native calling convention as regparm attribute to all calls
that are synthesized by the compiler might fix the problem.
The following shell script exhibits the problem.
cat > test.c << EOF
int main() {
long long a= 4000000000;
return a / 43937;
}
EOF
gcc -S test.c
mv test.s test.default.s
gcc -mregparm=3 -S test.c
mv test.s test.mregparm3.s
diff -u test.default.s test.mregparm3.s
exit 0
# there should be no difference in the calling convention
# as __divdi3 is taken from libgcc, but I get the result:
--- test.default.s Do. Aug 13 15:47:28 2009
+++ test.mregparm3.s Do. Aug 13 15:47:28 2009
-18,10 +18,9 @@
movl $0, -4(%ebp)
movl -8(%ebp), %eax
movl -4(%ebp), %edx
+ subl $8, %esp
pushl $0
pushl $43937
- pushl %edx
- pushl %eax
call __divdi3
addl $16, %esp
leave
--
Summary: libgcc functions and -mregparm don't work well together
Product: gcc
Version: 4.3.3
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: patrick dot georgi at coresystems dot de
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41055
More information about the Gcc-bugs
mailing list