Skip to content

Commit 34f0115

Browse files
committed
faster uint256_add
1 parent 51c287a commit 34f0115

File tree

1 file changed

+33
-8
lines changed

1 file changed

+33
-8
lines changed

src/starkware/cairo/common/uint256.cairo

+33-8
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,39 @@ func uint256_add{range_check_ptr}(a: Uint256, b: Uint256) -> (res: Uint256, carr
7979
ids.carry_high = 1 if sum_high >= ids.SHIFT else 0
8080
%}
8181

82-
assert carry_low * carry_low = carry_low;
83-
assert carry_high * carry_high = carry_high;
84-
85-
assert res.low = a.low + b.low - carry_low * SHIFT;
86-
assert res.high = a.high + b.high + carry_low - carry_high * SHIFT;
87-
uint256_check(res);
88-
89-
return (res, carry_high);
82+
if (carry_low != 0) {
83+
if (carry_high != 0) {
84+
assert res.low = a.low + b.low - SHIFT;
85+
assert res.high = a.high + b.high + 1 - SHIFT;
86+
assert [range_check_ptr] = res.low;
87+
assert [range_check_ptr + 1] = res.high;
88+
let range_check_ptr = range_check_ptr + 2;
89+
return (res, 1);
90+
} else {
91+
assert res.low = a.low + b.low - SHIFT;
92+
assert res.high = a.high + b.high + 1;
93+
assert [range_check_ptr] = res.low;
94+
assert [range_check_ptr + 1] = res.high;
95+
let range_check_ptr = range_check_ptr + 2;
96+
return (res, 0);
97+
}
98+
} else {
99+
if (carry_high != 0) {
100+
assert res.low = a.low + b.low;
101+
assert res.high = a.high + b.high - SHIFT;
102+
assert [range_check_ptr] = res.low;
103+
assert [range_check_ptr + 1] = res.high;
104+
let range_check_ptr = range_check_ptr + 2;
105+
return (res, 1);
106+
} else {
107+
assert res.low = a.low + b.low;
108+
assert res.high = a.high + b.high;
109+
assert [range_check_ptr] = res.low;
110+
assert [range_check_ptr + 1] = res.high;
111+
let range_check_ptr = range_check_ptr + 2;
112+
return (res, 0);
113+
}
114+
}
90115
}
91116

92117
// Splits a field element in the range [0, 2^192) to its low 64-bit and high 128-bit parts.

0 commit comments

Comments
 (0)