Integer division on x86 -m32

Marc Glisse marc.glisse@inria.fr
Fri Dec 11 07:12:13 GMT 2020


On Thu, 10 Dec 2020, Lucas de Almeida via Gcc wrote:

> when performing (int64_t) foo / (int32_t) bar in gcc under x86, a call to
> __divdi3 is always output, even though it seems the use of the idiv
> instruction could be faster.

IIRC, idiv requires that the quotient fit in 32 bits, while your C code 
doesn't. (1LL << 60) / 3 would cause an error with idiv.

It would be possible to use idiv in some cases, if the compiler can prove 
that variables are in the right range, but that's not so easy. You can use 
inline asm to force the use of idiv if you know it is safe for your case, 
the most common being modular arithmetic: if you know that uint32_t a, b, 
c, d are smaller than m (and m!=0), you can compute a*b+c+d in uint64_t, 
then use div to compute that modulo m.

-- 
Marc Glisse


More information about the Gcc mailing list