[kaffe] UPDATE RE: Xscale linux jit: Double values with no bits on in lowerword are corrupt
David Tiller
dtiller at captechventures.com
Fri Feb 4 07:07:08 PST 2005
Progress!!!
The only values that are corrupted are those defined in
config/arm/jit-icode.h in the macro __builtin_FP_values.
Those are 0, 1, 2, 3, 4, 5, 10, and 0.5. You can't tell with zero.
If you #undef HAVE_move_double_const in move_double_const() in icode.c,
life is good. The problem seems to be in lslot_slot_fconst() or it's
descendents.
If you're a JIT God, please take a minute to help me out.
Thanks in advance!
-----Original Message-----
From: David Tiller
Sent: Thursday, February 03, 2005 8:53 AM
To: kaffe at kaffe.org
Subject: [kaffe] Xscale linux jit: Double values with no bits on in
lowerword are corrupt
Here's a strange one...
I have a working kaffe-JIT for xscale-linux build from a relatively
recent CVS snapshot (late January). I starting seeing strange things
with double precision values. It turns out that any double value that
doesn't have at least one bit set in the lower word gets corrupted. The
corruption seems to be either that the words are swapped, or that the
upper word gets put in the lower word's place and the upper word is
zeroed out. I ran the test program below, and got the following output.
The corrupt values are highlighted with '***'. A few observations:
1) All doubles work properly as constants in println statements
2) The corruption happens when a constant is put into a variable
3) math ops use the corrupt values
4) The test program runs correctly using the intrp build
5) I tracked the values in constants.c - they're correct.
public class DTest {
public static void main(String[] args) {
double a = 1.000000001;
double b;
double pi = 3.141592654;
b = 2.123456789;
System.out.println("3.141592654 = " + 3.141592654);
System.out.println("0.0 = " + 0.0);
System.out.println("1.0 const = " + 1.0);
System.out.println("min = " + Double.MIN_VALUE);
System.out.println("pi = " + pi + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(pi)));
System.out.println("1.x = " + a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
System.out.println("2.x = " + b + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(b)));
a = 1.0;
b = 20000000.0;
System.out.println("1.0 var = " + a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
System.out.println("2E7 = " + b + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(b)));
a = 0.0;
System.out.println("0.0 = " + a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 1.0 + 1.0;
System.out.println("1.0 + 1.0 = " + a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
System.out.println("1.000000001 ->
1.000000000000000001");
a = 1.000000001;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 1.0000000001;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 1.00000000001;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 1.000000000001;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 1.0000000000001;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 1.00000000000001;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 1.000000000000001;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 1.0000000000000001;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 1.00000000000000001;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 1.000000000000000001;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
System.out.println("1.0 -> 10000000000.0");
a = 1.0;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 10.0;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 100.0;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 1000.0;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 10000.0;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 100000.0;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 1000000.0;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 10000000.0;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 100000000.0;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 1000000000.0;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
a = 10000000000.0;
System.out.println(a + ", rawbits = " +
Long.toHexString(Double.doubleToRawLongBits(a)));
}
}
3.141592654 = 3.141592654
0.0 = 0.0
1.0 const = 1.0
min = 4.9E-324
pi = 3.141592654, rawbits = 400921fb54524550
1.x = 1.000000001, rawbits = 3ff000000044b830
2.x = 2.123456789, rawbits = 4000fcd6e9b9cb1b
*** 1.0 var = 5.299808824E-315, rawbits = 3ff00000
2E7 = 2.0E7, rawbits = 417312d000000000
0.0 = 0.0, rawbits = 0
*** 1.0 + 1.0 = 5.304989477E-315, rawbits = 40000000
1.000000001 -> 1.000000000000000001
1.000000001, rawbits = 3ff000000044b830
1.0000000001, rawbits = 3ff000000006df38
1.00000000001, rawbits = 3ff000000000afec
1.000000000001, rawbits = 3ff0000000001198
1.0000000000001, rawbits = 3ff00000000001c2
1.00000000000001, rawbits = 3ff000000000002d
1.000000000000001, rawbits = 3ff0000000000005
*** 5.299808824E-315, rawbits = 3ff00000
*** 5.299808824E-315, rawbits = 3ff00000
*** 5.299808824E-315, rawbits = 3ff00000
1.0 -> 10000000000.0
*** 5.299808824E-315, rawbits = 3ff00000
*** 5.31664595E-315, rawbits = 40240000
100.0, rawbits = 4059000000000000
1000.0, rawbits = 408f400000000000
10000.0, rawbits = 40c3880000000000
100000.0, rawbits = 40f86a0000000000
1000000.0, rawbits = 412e848000000000
1.0E7, rawbits = 416312d000000000
1.0E8, rawbits = 4197d78400000000
1.0E9, rawbits = 41cdcd6500000000
1.0E10, rawbits = 4202a05f20000000
_______________________________________________
kaffe mailing list
kaffe at kaffe.org
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe
More information about the kaffe
mailing list