@@ -79,14 +79,39 @@ func uint256_add{range_check_ptr}(a: Uint256, b: Uint256) -> (res: Uint256, carr
79
79
ids.carry_high = 1 if sum_high >= ids.SHIFT else 0
80
80
%}
81
81
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
+ }
90
115
}
91
116
92
117
// Splits a field element in the range [0, 2^192) to its low 64-bit and high 128-bit parts.
0 commit comments