+ f |= f_swap;
+ }
+
+ /* --- Check for zeroness --- */
+
+ if (MP_CMP(b, ==, MP_ZERO)) {
+
+ /* --- Store %$|a|$% as the GCD --- */
+
+ if (gcd) {
+ if (*gcd) MP_DROP(*gcd);
+ a = MP_COPY(a);
+ if (a->f & MP_NEG) {
+ MP_SPLIT(a);
+ a->f &= ~MP_NEG;
+ f |= f_aneg;
+ }
+ *gcd = a;
+ }
+
+ /* --- Store %$1$% and %$0$% in the appropriate bins --- */
+
+ if (f & f_ext) {
+ if (f & f_swap) {
+ mp **t = xx; xx = yy; yy = t;
+ }
+ if (xx) {
+ if (*xx) MP_DROP(*xx);
+ if (MP_CMP(a, ==, MP_ZERO))
+ *xx = MP_ZERO;
+ else if (f & f_aneg)
+ *xx = MP_MONE;
+ else
+ *xx = MP_ONE;
+ }
+ if (yy) {
+ if (*yy) MP_DROP(*yy);
+ *yy = MP_ZERO;
+ }
+ }
+ return;