pike.git/
src/
operators.c
Branch:
Tag:
Non-build tags
All tags
No tags
2014-12-04
2014-12-04 19:25:07 by Arne Goedeke <el@laramies.com>
60586c51ab217177ea83acf2ef07868ddf7b91fe (
31
lines) (+
14
/-
17
)
[
Show
|
Annotate
]
Branch:
bill/master_archive_support
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) {