Branch: Tag:

2014-03-11

2014-03-11 18:30:13 by Arne Goedeke <el@laramies.com>

bignum: reorganized overflow checks and use clang intrinsics

Conflicts:
src/bignum.h
src/lexer.h
src/operators.c

1644: Inside #if defined(AUTO_BIGNUM)
   size = 0;    for(e = -args; e < 0; e++)    { -  if(INT_TYPE_ADD_OVERFLOW(sp[e].u.integer, size)) +  if (DO_INT_TYPE_ADD_OVERFLOW(size, sp[e].u.integer, &size))    {    convert_svalue_to_bignum(sp-args);    f_add(args);    return;    } -  else -  { -  size += sp[e].u.integer; +     } -  } +     sp-=args;    push_int(size);   #else
3604:       case TWO_TYPES(T_INT,T_INT):   #ifdef AUTO_BIGNUM -  if(INT_TYPE_MUL_OVERFLOW(sp[-2].u.integer, sp[-1].u.integer)) +     { -  +  INT_TYPE res; +  +  if (DO_INT_TYPE_MUL_OVERFLOW(sp[-2].u.integer, sp[-1].u.integer, &res)) +  {    convert_stack_top_to_bignum();    goto do_lfun_multiply;    } -  +  SET_SVAL(sp[-1], T_INT, NUMBER_NUMBER, integer, res); +  return; +  }   #endif /* AUTO_BIGNUM */    sp--;    sp[-1].u.integer *= sp[0].u.integer;
4199:    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);    }    }   #ifdef AUTO_BIGNUM