+ // pass8: sync all push arg numbers
+ // some calls share args and not all of them
+ // (there's only partial intersection)
+ do {
+ int changed, argnum, arggrp;
+
+ found = 0;
+ for (i = 0; i < opcnt; i++)
+ {
+ po = &ops[i];
+ if ((po->flags & (OPF_RMD|OPF_DONE)) || po->op != OP_CALL)
+ continue;
+
+ pp = po->pp;
+ arggrp = 0;
+ do {
+ changed = 0;
+ for (arg = argnum = 0; arg < pp->argc; arg++) {
+ if (pp->arg[arg].reg != NULL)
+ continue;
+ if (pp->arg[arg].is_saved)
+ changed |= sync_argnum(pp, arg, &argnum, &arggrp);
+ argnum++;
+ }
+ found |= changed;
+ }
+ while (changed);
+
+ if (argnum > 32)
+ ferr(po, "too many args or looping in graph\n");
+ }
+ }
+ while (found);
+
+ // pass9: final adjustments