@@ -69,7 +69,6 @@ func felt_to_uint256{range_check_ptr}(value: felt) -> Uint256 {
69
69
// Adds two integers. Returns the result as a 256-bit integer and the (1-bit) carry.
70
70
func uint256_add {range_check_ptr } (a: Uint256, b: Uint256) -> (res: Uint256, carry: felt ) {
71
71
alloc_locals ;
72
- local res: Uint256;
73
72
local carry_low: felt ;
74
73
local carry_high: felt ;
75
74
%{
@@ -79,14 +78,35 @@ func uint256_add{range_check_ptr}(a: Uint256, b: Uint256) -> (res: Uint256, carr
79
78
ids.carry_high = 1 if sum_high >= ids.SHIFT else 0
80
79
%}
81
80
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);
81
+ if (carry_low != 0 ) {
82
+ if (carry_high != 0 ) {
83
+ tempvar range_check_ptr = range_check_ptr + 2 ;
84
+ tempvar res = Uint256(low=a.low + b.low - SHIFT, high=a.high + b.high + 1 - SHIFT);
85
+ assert [range_check_ptr - 2 ] = res.low;
86
+ assert [range_check_ptr - 1 ] = res.high;
87
+ return (res, 1 );
88
+ } else {
89
+ tempvar range_check_ptr = range_check_ptr + 2 ;
90
+ tempvar res = Uint256(low=a.low + b.low - SHIFT, high=a.high + b.high + 1 );
91
+ assert [range_check_ptr - 2 ] = res.low;
92
+ assert [range_check_ptr - 1 ] = res.high;
93
+ return (res, 0 );
94
+ }
95
+ } else {
96
+ if (carry_high != 0 ) {
97
+ tempvar range_check_ptr = range_check_ptr + 2 ;
98
+ tempvar res = Uint256(low=a.low + b.low, high=a.high + b.high - SHIFT);
99
+ assert [range_check_ptr - 2 ] = res.low;
100
+ assert [range_check_ptr - 1 ] = res.high;
101
+ return (res, 1 );
102
+ } else {
103
+ tempvar range_check_ptr = range_check_ptr + 2 ;
104
+ tempvar res = Uint256(low=a.low + b.low, high=a.high + b.high);
105
+ assert [range_check_ptr - 2 ] = res.low;
106
+ assert [range_check_ptr - 1 ] = res.high;
107
+ return (res, 0 );
108
+ }
109
+ }
90
110
}
91
111
92
112
// Splits a field element in the range [0, 2^192) to its low 64-bit and high 128-bit parts.
0 commit comments