2014-03-11
2014-03-11 18:30:13 by Arne Goedeke <el@laramies.com>
-
5cddc37dc2f33684399b513fcd9f9c6dfc55913a
(33 lines)
(+18/-15)
[
Show
| Annotate
]
Branch: 7.8
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