64-bit division on 32-bit arch - where's the compiler error?
Posted Aug 30, 2011 2:34 UTC (Tue) by
giraffedata (subscriber, #1954)
In reply to:
64-bit division on 32-bit arch - where's the compiler error? by blitzkrieg3
Parent article:
Quotes of the week
It's not a call to the library, it's statically linked with the "real time function" __udivdi3.
It's a statically linked call to the library. I think you mean "run time function" -- that's what the GCC manual page you point to calls it." It means a function in the GCC runtime library, i.e. libgcc.
__udivdi3() is for use when compiling for a CPU that doesn't have a divide instruction (that used to be pretty common -- divide is a pretty complex instruction; I don't know if it is common now. x86 has always had divide). But if the compiler is smart enough to recognize a divide by two and know you can do that by shifting, I would expect it not to use __udivdi3() on any CPU.
But the error message makes it clear that the compiler in this case generated a call to __udivdi3() when it created btrfs.ko. I assume, then, that this is not x86 because as we've seen, the compiler generates shift instructions instead on x86 (and even if it didn't, it would just generate a divide instruction). I also have to believe the divide-by-shifting cleverness is in a platform-dependent part of GCC and is absent for whatever platform this is.
One other thing to note: we've been saying this is problem with 64 bit numbers on a 32 bit CPU. But __udivdi3() is the divide function for "unsigned long" operands, i.e. on a 32 bit machine it is a 32 bit divide.
The compiler would use __udivti3() instead if it wanted to divide 64 bit numbers.
(
Log in to post comments)