[kaffe] Simple program shows strange results
Timothy Stack
stack@cs.utah.edu
Fri Mar 14 08:42:01 2003
hi,
> In message "Re: [kaffe] Simple program shows strange results"
> on 03/03/05, Ito Kazumitsu <kaz@maczuka.gcd.org> writes:
>
> > I have made a simpler test program:
>
> This strange problem occurs with float and double, but not
> with int or byte.
>
> $ cat Test.java.m4
> public class Test {
> public static void main(String[] args) {
> T x = C1;
> if (x < C2) {
> System.err.println("x<C2: " + x);
> x = C2;
> }
> System.err.println(x);
> }
> }
CVS update and try this again. (Thanks for the test case!)
If you're interested, the causes were:
I modified move_float() in icode.c to look like
move_int/move_ref/etc since it was generating inefficient code on
the PowerPC.
Unfortunately, the x86 jitter depended on the way the old
move_float() worked, so it was not working properly when a slot
was aliased. For example, in the following bytecode:
ldc 10.0
fstore_1
fload_1
Kaffe optimizes away the store and subsequent load since it is
potentially redundant. Unfortunately, because of the bizarro way
the x86 FPU works, this does not work and the 10.0 value never
gets written to the proper place on the stack. Therefore, the
floating point number that gets printed is just whatever garbage
is on the stack at the time.
Solution:
Modify slotAlias() in machine.c to aggressively spill Rreadonce
registers (the x86 float register). This method works and seems
to generate the same code as before on x86 (as far as I know),
without screwing over CPUs with more sensible FPUs.
thanks,
tim stack