Branch: Tag:

2014-12-04

2014-12-04 19:25:07 by Arne Goedeke <el@laramies.com>

bignum: reorganized overflow checks and use clang intrinsics

1726:    size = 0;    for(e = -args; e < 0; e++)    { -  size = DO_INT_TYPE_ADD_OVERFLOW(size, sp[e].u.integer, &of); -  } -  if(of) +  if (DO_INT_TYPE_ADD_OVERFLOW(size, sp[e].u.integer, &size))    {    convert_svalue_to_bignum(sp-args);    f_add(args);    return;    } -  +  }    sp-=args;    push_int(size);    break;
3721:    case TWO_TYPES(T_INT,T_INT):    {    INT_TYPE res; -  int of = 0; +     -  res = DO_INT_TYPE_MUL_OVERFLOW(sp[-2].u.integer, sp[-1].u.integer, &of); -  -  if(of) +  if (DO_INT_TYPE_MUL_OVERFLOW(sp[-2].u.integer, sp[-1].u.integer, &res))    {    convert_stack_top_to_bignum();    goto do_lfun_multiply;
4291:    res = a % b;    }else{    /* res = ((a+~b)%-b)-~b */ -  res = DO_INT_TYPE_ADD_OVERFLOW(a, ~b, &of); -  res = DO_INT_TYPE_MOD_OVERFLOW(res, b, &of); -  res = DO_INT_TYPE_SUB_OVERFLOW(res, ~b, &of); +  of = DO_INT_TYPE_ADD_OVERFLOW(a, ~b, &res) +  || DO_INT_TYPE_MOD_OVERFLOW(res, b, &res) +  || DO_INT_TYPE_SUB_OVERFLOW(res, ~b, &res);    }    }else{    if(b>=0)    {    /* res = b+~((~a) % b) */ -  res = DO_INT_TYPE_MOD_OVERFLOW(~a, b, &of); -  res = DO_INT_TYPE_ADD_OVERFLOW(b, ~res, &of); +  of = DO_INT_TYPE_MOD_OVERFLOW(~a, b, &res) +  || DO_INT_TYPE_ADD_OVERFLOW(b, ~res, &res);    }else{    /* a % b and a % -b are equivalent, if overflow does not    * happen    * res = -(-a % -b) = a % b; */ -  res = DO_INT_TYPE_MOD_OVERFLOW(a, b, &of); +  of = DO_INT_TYPE_MOD_OVERFLOW(a, b, &res);    }    }    if (of) {