@@ -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 (has_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