@@ -83,18 +83,20 @@ pub(crate) unconstrained fn __validate_gt_remainder<let N: u32>(
83
83
pub (crate ) unconstrained fn __neg_with_flags <let N : u32 , let MOD_BITS : u32 >(
84
84
params : P <N , MOD_BITS >,
85
85
val : [u128 ; N ],
86
- ) -> ([u128 ; N ], [bool ; N ]) {
86
+ ) -> ([u128 ; N ], [bool ; N - 1 ]) {
87
87
let mut result : [u128 ; N ] = [0 ; N ];
88
88
let mut borrow_in : u128 = 0 ;
89
89
90
- let mut borrow_flags : [bool ; N ] = [false ; N ];
90
+ let mut borrow_flags : [bool ; N - 1 ] = [false ; N - 1 ];
91
91
for i in 0 ..N {
92
92
let sub_term = val [i ] + borrow_in ;
93
93
let borrow = (sub_term > params .modulus [i ]) as u128 ;
94
94
result [i ] = borrow * TWO_POW_120 + params .modulus [i ] - sub_term ;
95
95
96
96
borrow_in = borrow ;
97
- borrow_flags [i ] = borrow as bool ;
97
+ if (i < N - 1 ) {
98
+ borrow_flags [i ] = borrow as bool ;
99
+ }
98
100
}
99
101
(result , borrow_flags )
100
102
}
@@ -103,7 +105,7 @@ pub(crate) unconstrained fn __add_with_flags<let N: u32, let MOD_BITS: u32>(
103
105
params : P <N , MOD_BITS >,
104
106
lhs : [u128 ; N ],
105
107
rhs : [u128 ; N ],
106
- ) -> ([u128 ; N ], [bool ; N ], [bool ; N ], bool ) {
108
+ ) -> ([u128 ; N ], [bool ; N ], [bool ; N - 1 ], bool ) {
107
109
let add_res = __helper_add (lhs , rhs );
108
110
let overflow = __gte (add_res , params .modulus );
109
111
@@ -116,7 +118,7 @@ pub(crate) unconstrained fn __add_with_flags<let N: u32, let MOD_BITS: u32>(
116
118
117
119
let mut carry_in : u128 = 0 ;
118
120
let mut borrow_in : u128 = 0 ;
119
- let mut borrow_flags : [bool ; N ] = [false ; N ];
121
+ let mut borrow_flags : [bool ; N - 1 ] = [false ; N - 1 ];
120
122
let mut carry_flags : [bool ; N ] = [false ; N ];
121
123
for i in 0 ..N {
122
124
let mut add_term = lhs [i ] + rhs [i ] + carry_in ;
@@ -133,7 +135,9 @@ pub(crate) unconstrained fn __add_with_flags<let N: u32, let MOD_BITS: u32>(
133
135
// Only set `borrow` and `carry` if they differ
134
136
if (carry != borrow ) {
135
137
carry_flags [i ] = carry as bool ;
136
- borrow_flags [i ] = borrow as bool ;
138
+ if (i < N - 1 ) {
139
+ borrow_flags [i ] = borrow as bool ;
140
+ }
137
141
}
138
142
}
139
143
(result , carry_flags , borrow_flags , overflow )
@@ -143,7 +147,7 @@ pub(crate) unconstrained fn __sub_with_flags<let N: u32, let MOD_BITS: u32>(
143
147
params : P <N , MOD_BITS >,
144
148
lhs : [u128 ; N ],
145
149
rhs : [u128 ; N ],
146
- ) -> ([u128 ; N ], [bool ; N ], [bool ; N ], bool ) {
150
+ ) -> ([u128 ; N ], [bool ; N ], [bool ; N - 1 ], bool ) {
147
151
let mut one : [u128 ; N ] = [0 ; N ];
148
152
one [0 ] = 1 ;
149
153
let underflow = !__gte (lhs , rhs );
@@ -152,7 +156,7 @@ pub(crate) unconstrained fn __sub_with_flags<let N: u32, let MOD_BITS: u32>(
152
156
153
157
let mut carry_in : u128 = 0 ;
154
158
let mut borrow_in : u128 = 0 ;
155
- let mut borrow_flags : [bool ; N ] = [false ; N ];
159
+ let mut borrow_flags : [bool ; N - 1 ] = [false ; N - 1 ];
156
160
let mut carry_flags : [bool ; N ] = [false ; N ];
157
161
for i in 0 ..N {
158
162
let mut add_term : u128 = lhs [i ] + addend [i ] + carry_in ;
@@ -168,7 +172,9 @@ pub(crate) unconstrained fn __sub_with_flags<let N: u32, let MOD_BITS: u32>(
168
172
// Only set `borrow` and `carry` if they differ
169
173
if (carry != borrow ) {
170
174
carry_flags [i ] = carry as bool ;
171
- borrow_flags [i ] = borrow as bool ;
175
+ if (i < N - 1 ) {
176
+ borrow_flags [i ] = borrow as bool ;
177
+ }
172
178
}
173
179
}
174
180
(result , carry_flags , borrow_flags , underflow )
0 commit comments