[Python-Dev] Optionally using GMP to implement long if available

Mark Dickinson dickinsm at gmail.com
Mon Nov 10 18:42:05 CET 2008


On Mon, Nov 10, 2008 at 4:26 PM, Nick Craig-Wood <nick at craig-wood.com> wrote:
>
> Looking at the assembler it produces (x86)
>
> mul:
>        pushl   %ebp
>        xorl    %edx, %edx
>        movl    %esp, %ebp
>        movl    12(%ebp), %eax
>        imull   8(%ebp), %eax
>        popl    %ebp
>        ret
>
> Which I'm pretty sure is a 32x32->64 bit mul (though my x86 assembler
> foo is weak).

My x86 assembler is also weak (or perhaps I should say nonexistent),
but I think this does exactly what the C standard says it should: that is,
it returns just the low 32-bits of the product.

Looking at the assembler, I think the imull does a 32-bit by
32-bit multiply and puts its (truncated) result back into the 32-bit
register eax.  I'd guess that the 64-bit result is being returned to
the calling routine in registers edx (high 32 bits) and eax (low 32 bits);
this explains why edx has to be zeroed with the 'xorl' instruction.

And if we were really expecting a 64-bit result then there should
be an unsigned multiply (mull) there instead of a signed multiply
(imull);  of course they're the same modulo 2**32, so for a 32-bit
result it doesn't matter which is used.

Mark


More information about the Python-Dev mailing list