--- uae/src/cpuopti.c 2018/04/24 16:39:48 1.1.1.3 +++ uae/src/cpuopti.c 2018/04/24 16:44:38 1.1.1.4 @@ -69,8 +69,9 @@ static int insn_references_reg (struct l static void do_function(struct func *f) { + int v; int pops_at_end = 0; - struct line *l, *fl, *l2; + struct line *l, *l1, *fl, *l2; char *s, *s2; int in_pop_area = 1; @@ -136,33 +137,56 @@ reordered: l = l->prev; - s = match(l, "addl $"); - s2 = match(fl, "subl $"); - if (s && s2) { - if (strcmp(s,s2) == 0) { - int v = 0; - while (isdigit(*s)) { - v = v * 10 + (*s) - '0'; - s++; - } - if (strcmp(s, ",%esp") == 0) { - f->initial_offset = v; - l->delet = 2; - fl->delet = 3; + s = match (l, "addl $"); + s2 = match (fl, "subl $"); + + l1 = l; + if (s == 0) { + char *t = match (l, "popl %"); + if (t != 0 && (strcmp (t, "ecx") == 0 || strcmp (t, "edx") == 0)) { + s = "4,%esp"; + l = l->prev; + t = match (l, "popl %"); + if (t != 0 && (strcmp (t, "ecx") == 0 || strcmp (t, "edx") == 0)) { + s = "8,%esp"; l = l->prev; - fl = fl->next; - } else - in_pop_area = 0; - } else { - fprintf (stderr, "Stack adjustment not matching\n"); - in_pop_area = 0; + } + } + } else { + l = l->prev; + } + + if (s && s2) { + int v = 0; + if (strcmp (s, s2) != 0) { + fprintf (stderr, "Stack adjustment not matching.\n"); + return; + } + + while (isdigit(*s)) { + v = v * 10 + (*s) - '0'; + s++; } + if (strcmp (s, ",%esp") != 0) { + fprintf (stderr, "Not adjusting the stack pointer.\n"); + return; + } + f->initial_offset = v; + fl->delet = 3; + fl = fl->next; + l1->delet = 2; + l1 = l1->prev; + while (l1 != l) { + l1->delet = 1; + l1 = l1->prev; + } } + while (in_pop_area) { char *popm, *pushm; - popm = match(l, "popl %"); - pushm = match(fl, "pushl %"); + popm = match (l, "popl %"); + pushm = match (fl, "pushl %"); if (popm && pushm && strcmp(pushm, popm) == 0) { pops_at_end++; fl->delet = l->delet = 1;