249 /* implement r = (a3a,a2,a1,a0) |
247 /* implement r = (a3a,a2,a1,a0) |
250 +(a5a, a4,a3b, 0) |
248 +(a5a, a4,a3b, 0) |
251 +( 0, a6,a5b, 0) |
249 +( 0, a6,a5b, 0) |
252 -( 0 0, 0|a6b, a6a|a5b ) |
250 -( 0 0, 0|a6b, a6a|a5b ) |
253 -( a6b, a6a|a5b, a5a|a4b, a4a|a3b ) */ |
251 -( a6b, a6a|a5b, a5a|a4b, a4a|a3b ) */ |
254 MP_ADD_CARRY (r1, a3b, r1, 0, carry); |
252 MP_ADD_CARRY_ZERO (r1, a3b, r1, carry); |
255 MP_ADD_CARRY (r2, a4 , r2, carry, carry); |
253 MP_ADD_CARRY (r2, a4 , r2, carry, carry); |
256 MP_ADD_CARRY (r3, a5a, r3, carry, carry); |
254 MP_ADD_CARRY (r3, a5a, r3, carry, carry); |
257 MP_ADD_CARRY (r1, a5b, r1, 0, carry); |
255 MP_ADD_CARRY_ZERO (r1, a5b, r1, carry); |
258 MP_ADD_CARRY (r2, a6 , r2, carry, carry); |
256 MP_ADD_CARRY (r2, a6 , r2, carry, carry); |
259 MP_ADD_CARRY (r3, 0, r3, carry, carry); |
257 MP_ADD_CARRY (r3, 0, r3, carry, carry); |
260 |
258 |
261 MP_SUB_BORROW(r0, a4a_a3b, r0, 0, carry); |
259 MP_SUB_BORROW(r0, a4a_a3b, r0, 0, carry); |
262 MP_SUB_BORROW(r1, a5a_a4b, r1, carry, carry); |
260 MP_SUB_BORROW(r1, a5a_a4b, r1, carry, carry); |
273 /* if the value is negative, r3 has a 2's complement |
271 /* if the value is negative, r3 has a 2's complement |
274 * high value */ |
272 * high value */ |
275 r3b = (int)(r3 >>32); |
273 r3b = (int)(r3 >>32); |
276 while (r3b > 0) { |
274 while (r3b > 0) { |
277 r3 &= 0xffffffff; |
275 r3 &= 0xffffffff; |
278 MP_ADD_CARRY(r1,((mp_digit)r3b) << 32, r1, 0, carry); |
276 MP_ADD_CARRY_ZERO(r1,((mp_digit)r3b) << 32, r1, carry); |
279 if (carry) { |
277 if (carry) { |
280 MP_ADD_CARRY(r2, 0, r2, carry, carry); |
278 MP_ADD_CARRY(r2, 0, r2, carry, carry); |
281 MP_ADD_CARRY(r3, 0, r3, carry, carry); |
279 MP_ADD_CARRY(r3, 0, r3, carry, carry); |
282 } |
280 } |
283 MP_SUB_BORROW(r0, r3b, r0, 0, carry); |
281 MP_SUB_BORROW(r0, r3b, r0, 0, carry); |
288 } |
286 } |
289 r3b = (int)(r3 >>32); |
287 r3b = (int)(r3 >>32); |
290 } |
288 } |
291 |
289 |
292 while (r3b < 0) { |
290 while (r3b < 0) { |
293 MP_ADD_CARRY (r0, 1, r0, 0, carry); |
291 MP_ADD_CARRY_ZERO (r0, 1, r0, carry); |
294 MP_ADD_CARRY (r1, MP_DIGIT_MAX <<32, r1, carry, carry); |
292 MP_ADD_CARRY (r1, MP_DIGIT_MAX <<32, r1, carry, carry); |
295 MP_ADD_CARRY (r2, MP_DIGIT_MAX, r2, carry, carry); |
293 MP_ADD_CARRY (r2, MP_DIGIT_MAX, r2, carry, carry); |
296 MP_ADD_CARRY (r3, MP_DIGIT_MAX >> 32, r3, carry, carry); |
294 MP_ADD_CARRY (r3, MP_DIGIT_MAX >> 32, r3, carry, carry); |
297 r3b = (int)(r3 >>32); |
295 r3b = (int)(r3 >>32); |
298 } |
296 } |