- if (ops[j].flags & OPF_RMD)
- continue;
- if (ops[j].op != OP_PUSH)
- continue;
- if (g_labels[j + 1][0] != 0)
- ferr(po, "arg search interrupted by '%s'\n", g_labels[j + 1]);
-
- pp->arg[arg].datap = &ops[j];
- ret = scan_for_mod(&ops[j], j + 1, i);
- if (ret >= 0) {
- // mark this push as one that needs operand saving
- ops[j].datap = (void *)(long)(arg + 1);
- save_arg_vars |= 1 << arg;
+ if (ops[j].op == OP_CALL) {
+ pp_tmp = ops[j].datap;
+ if (pp_tmp == NULL)
+ ferr(po, "arg collect hit unparsed call\n");
+ if (pp_tmp->argc_stack > 0)
+ ferr(po, "arg collect hit '%s' with %d stack args\n",
+ opr_name(&ops[j], 0), pp_tmp->argc_stack);
+ }
+ else if ((ops[j].flags & OPF_TAIL)
+ || (ops[j].flags & (OPF_JMP|OPF_CC)) == OPF_JMP)
+ {
+ break;
+ }
+
+ if (ops[j].op == OP_PUSH) {
+ pp->arg[arg].datap = &ops[j];
+ ret = scan_for_mod(&ops[j], j + 1, i);
+ if (ret >= 0) {
+ // mark this push as one that needs operand saving
+ ops[j].argmask |= 1 << arg;
+ save_arg_vars |= 1 << arg;
+ }
+ else
+ ops[j].flags |= OPF_RMD;
+
+ // next arg
+ for (arg++; arg < pp->argc; arg++)
+ if (pp->arg[arg].reg == NULL)
+ break;