[gambit-list] New builtins in upcoming gcc 5.0.0 that may speed up bignum arithmetic

Bradley Lucier lucier at math.purdue.edu
Sat Jan 17 16:19:02 EST 2015


I just noticed this in

https://gcc.gnu.org/gcc-5/changes.html

# A new set of built-in functions for arithmetics with overflow checking 
has been added: |__builtin_add_overflow|, |__builtin_sub_overflow| and 
|__builtin_mul_overflow| and for compatibility with clang also other 
variants. These builtins have two integral arguments (which don't need 
to have the same type), the arguments are extended to infinite precision 
signed type, |+|, |-| or |*| is performed on those, and the result is 
stored in an integer variable pointed to by the last argument. If the 
stored value is equal to the infinite precision result, the built-in 
functions return |false|, otherwise |true|. The type of the integer 
variable that will hold the result can be different from the types of 
the first two arguments. The following snippet demonstrates how this can 
be used in computing the size for the |calloc| function:

    void *
    calloc (size_t x, size_t y)
    {
       size_t sz;
       if (__builtin_mul_overflow (x, y, &sz))
         return NULL;
       void *ret = malloc (sz);
       if (ret) memset (res, 0, sz);
       return ret;
    }

On e.g. i?86 or x86-64 the above will result in a |mul| instruction 
followed by a jump on overflow.

Maybe we can exploit this to improve the speed of bignum arithmetic.

Brad
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.iro.umontreal.ca/pipermail/gambit-list/attachments/20150117/eafd47e8/attachment.htm>


More information about the Gambit-list mailing list