- /* --- Set up @u@ and @v@ --- */
-
- u = MP_COPY(a);
- v = MP_COPY(b);
-
- /* --- Start the main loop --- */
-
- for (;;) {
-
- /* --- While @u@ is even --- */
-
- {
- mpscan sc, xsc, ysc;
- size_t n = 0, nn = 0;
-
- MP_SCAN(&sc, u);
- MP_SCAN(&xsc, X); MP_SCAN(&ysc, Y);
- for (;;) {
- MP_STEP(&sc);
- MP_STEP(&xsc); MP_STEP(&ysc);
- if (MP_BIT(&sc))
- break;
- if (ext && (MP_BIT(&xsc) | MP_BIT(&ysc))) {
- if (n) {
- X = mp_lsr(X, X, n);
- Y = mp_lsr(Y, Y, n);
- n = 0;
- }
- X = mp_add(X, X, b);
- Y = mp_sub(Y, Y, a);
- MP_SCAN(&xsc, X);
- MP_SCAN(&ysc, Y);
- MP_STEP(&xsc); MP_STEP(&ysc);
- }
- n++; nn++;
- }