Portable "add with carry" loop for arbitrary precision arithmetic

Tom St Denis tstdenis@ellipticsemi.com
Mon Jun 23 10:55:00 GMT 2008


Alexander Konovalenko wrote:
> There is an "add with carry" instruction on some architectures which
> enables efficient implementation of arbitrary precision (bignum)
> integer addition. Is it possible to make gcc generate efficient
> machine code from pure C or C++ code for bignum addition on those
> architectures?
>
> It looks like the popular libraries like GMP and CLN use hand-coded
> assembly for that. I wonder if gcc can help rewrite that kind of code
> in a more portable way.
>   

GCC will use them in most cases.  For example,

extern unsigned long long a, b, c;
int main(void)
{
   c = a + b;
   return 0;
}

Produces this with "-O3 -fomit-frame-pointer"

main:
    leal    4(%esp), %ecx
    andl    $-16, %esp
    pushl    -4(%ecx)
    pushl    %ecx
    movl    a, %eax
    movl    a+4, %edx
    addl    b, %eax
    adcl    b+4, %edx
    movl    %eax, c
    xorl    %eax, %eax
    movl    %edx, c+4
    popl    %ecx
    leal    -4(%ecx), %esp
    ret

Tom



More information about the Gcc-help mailing list