> I commented out this block at line 1312:
>
> # if ($StolenX86Regs <= 3 ) { # spurious uses of edi?
> # s/^\tmovl\s+(.*),\s*\%edi\n\tjmp\s+\*%edi\n/\tmovl
> $1,\%eax\n\tjmp
> \*\%e
> ax\n/g;
> # s/^\tjmp\s+\*(-?\d*\(.*\%edi.*\))\n/\tmovl $1,\%eax\n\tjmp
> \*\%eax\n/g;
> # s/^\tjmp\s+\*\%edi\n/\tmovl \%edi,\%eax\n\tjmp \*\%eax\n/g;
> # die "$Pgm: (mangler) still have jump involving \%edi!\n$_"
> # if /(jmp|call)\s+.*\%edi/;
> # }
>
> and tried again:
>
> ARGH! Jump uses %edi with -monly-3-regs:
> etc
>
> then commented out this block at 1365:
>
> } #elsif ($StolenX86Regs == 3 ) {
> # die "ARGH! Jump uses \%edi with -monly-3-regs:\n$_"
> # if /^\t(jmp|call)\s+.*\%edi/;
> # }
>
> and it compiled fine. I tested (very thoroughly!) it with
> nofib/imaginary/paraffins/Main.hs which imports Array, and it got the
> right answer.
Ah no, I've changed my mind. This is problematic. You probably weren't hitting the
right bit of code in your tests to show up the problem.
In -monly-3-regs, the mangler must insert code to re-load the contents of %edi before
doing a jump, and if the jump involves %edi itself then it tries to rearrange things
so that it doesn't. However in this case it couldn't find a way to rearrange the code.
The solution is going to be to have a fall-through case, to transform a jump involving
%edi into
movl %edi, %eax
jmp ... %eax ...
as long as the jump doesn't also involve %eax.
Gruesome, but it should work.
Cheers,
Simon
_______________________________________________
Glasgow-haskell-bugs mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs