Repairs implementation of bit manipulation in java.lang.Double. Disables

GVN due to bug
This commit is contained in:
konsoletyper 2014-03-07 12:02:07 +04:00
parent 688d6191fd
commit 758c7c7966
5 changed files with 33 additions and 23 deletions

View File

@ -243,10 +243,18 @@ public class TDouble extends TNumber implements TComparable<TDouble> {
} }
double abs = TMath.abs(value); double abs = TMath.abs(value);
int exp = TMath.getExponent(abs); int exp = TMath.getExponent(abs);
int negExp = -exp + 52;
if (exp < -1022) { if (exp < -1022) {
exp = -1023; exp = -1023;
negExp = 1022 + 52;
} }
long mantissa = (long)(abs * binaryExponent(exp + 52)) & 0xFFFFFFFFFFFFFL; double doubleMantissa;
if (negExp <= 1022) {
doubleMantissa = abs * binaryExponent(negExp);
} else {
doubleMantissa = abs * 0x1p1022 * binaryExponent(negExp - 1022);
}
long mantissa = (long)(doubleMantissa) & 0xFFFFFFFFFFFFFL;
return mantissa | ((exp + 1023L) << 52) | (value < 0 ? (1L << 63) : 0); return mantissa | ((exp + 1023L) << 52) | (value < 0 ? (1L << 63) : 0);
} }
@ -281,7 +289,13 @@ public class TDouble extends TNumber implements TComparable<TDouble> {
char[] buffer = new char[30]; char[] buffer = new char[30];
int sz = 0; int sz = 0;
long bits = doubleToLongBits(d); long bits = doubleToLongBits(d);
boolean subNormal = false;
int exp = (int)((bits >>> 52) & 0x7FF) - 1023;
long mantissa = bits & 0xFFFFFFFFFFFFFL; long mantissa = bits & 0xFFFFFFFFFFFFFL;
if (exp == -1023) {
++exp;
subNormal = true;
}
for (int i = 0; i < 13; ++i) { for (int i = 0; i < 13; ++i) {
int digit = (int)(mantissa & 0xF); int digit = (int)(mantissa & 0xF);
if (digit > 0 || sz > 0) { if (digit > 0 || sz > 0) {
@ -293,16 +307,11 @@ public class TDouble extends TNumber implements TComparable<TDouble> {
buffer[sz++] = '0'; buffer[sz++] = '0';
} }
buffer[sz++] = '.'; buffer[sz++] = '.';
int exp = (int)((bits >>> 52) & 0x7FF);
if (exp == -1023) { buffer[sz++] = subNormal ? '0' : '1';
buffer[sz++] = '0';
++exp;
} else {
buffer[sz++] = '1';
}
buffer[sz++] = 'x'; buffer[sz++] = 'x';
buffer[sz++] = '0'; buffer[sz++] = '0';
if ((bits & (1L << 63)) == 0) { if ((bits & (1L << 63)) != 0) {
buffer[sz++] = '-'; buffer[sz++] = '-';
} }
int half = sz / 2; int half = sz / 2;
@ -325,7 +334,7 @@ public class TDouble extends TNumber implements TComparable<TDouble> {
buffer[sz++] = TCharacter.forDigit(digit, 10); buffer[sz++] = TCharacter.forDigit(digit, 10);
first = false; first = false;
} }
digit *= 10; exp %= pos;
pos /= 10; pos /= 10;
} }
if (first) { if (first) {

View File

@ -216,7 +216,7 @@ public final class TMath extends TObject {
if (d > 1) { if (d > 1) {
int expBit = 1 << (exponents.length - 1); int expBit = 1 << (exponents.length - 1);
for (int i = exponents.length - 1; i >= 0; --i) { for (int i = exponents.length - 1; i >= 0; --i) {
if (d > exponents[i]) { if (d >= exponents[i]) {
d *= negativeExponents[i]; d *= negativeExponents[i];
exp |= expBit; exp |= expBit;
} }
@ -225,12 +225,12 @@ public final class TMath extends TObject {
} else if (d < 1) { } else if (d < 1) {
int expBit = 1 << (negativeExponents.length - 1); int expBit = 1 << (negativeExponents.length - 1);
int offset = 0; int offset = 0;
if (d < 0x1P-1024) { if (d <= 0x1p-1023) {
d *= 0x1P52; d *= 0x1p52;
offset = 52; offset = 52;
} }
for (int i = negativeExponents.length - 1; i >= 0; --i) { for (int i = negativeExponents.length - 1; i >= 0; --i) {
if (d < negativeExponents[i]) { if (d <= negativeExponents[i]) {
d *= exponents[i]; d *= exponents[i];
exp |= expBit; exp |= expBit;
} }
@ -268,9 +268,9 @@ public final class TMath extends TObject {
} }
private static class ExponentConstants { private static class ExponentConstants {
public static double[] exponents = { 0x1P1, 0x1P2, 0x1P4, 0x1P8, 0x1P16, 0x1P32, 0x1P64, 0x1P128, 0x1P256, public static double[] exponents = { 0x1p1, 0x1p2, 0x1p4, 0x1p8, 0x1p16, 0x1p32, 0x1p64, 0x1p128,
0x1P256, 0x1P512 }; 0x1p256, 0x1p512 };
public static double[] negativeExponents = { 0x1P-1, 0x1P-2, 0x1P-4, 0x1P-8, 0x1P-16, 0x1P-32, 0x1P-64, public static double[] negativeExponents = { 0x1p-1, 0x1p-2, 0x1p-4, 0x1p-8, 0x1p-16, 0x1p-32,
0x1P-128, 0x1P-256, 0x1P-256, 0x1P-512 }; 0x1p-64, 0x1p-128, 0x1p-256, 0x1p-512 };
} }
} }

View File

@ -78,7 +78,8 @@ public class DoubleTest {
assertEquals("0x1.8p1", Double.toHexString(3)); assertEquals("0x1.8p1", Double.toHexString(3));
assertEquals("0x1.0p-1", Double.toHexString(0.5)); assertEquals("0x1.0p-1", Double.toHexString(0.5));
assertEquals("0x1.0p-2", Double.toHexString(0.25)); assertEquals("0x1.0p-2", Double.toHexString(0.25));
assertEquals("0x1.0p-1022", Double.toHexString(Double.MIN_NORMAL)); assertEquals("0x1.0p-1022", Double.toHexString(0x1.0p-1022));
assertEquals("0x0.0000000000001p-1022", Double.toHexString(Double.MIN_VALUE)); assertEquals("0x0.8p-1022", Double.toHexString(0x0.8p-1022));
assertEquals("0x0.001p-1022", Double.toHexString(0x0.001p-1022));
} }
} }

View File

@ -817,7 +817,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
visitBinary(expr, "<<"); visitBinary(expr, "<<");
break; break;
case LEFT_SHIFT_LONG: case LEFT_SHIFT_LONG:
visitBinaryFunction(expr, "Long_shr"); visitBinaryFunction(expr, "Long_shl");
break; break;
case RIGHT_SHIFT: case RIGHT_SHIFT:
visitBinary(expr, ">>"); visitBinary(expr, ">>");

View File

@ -36,8 +36,8 @@ public class ClassSetOptimizer {
} }
private List<MethodOptimization> getOptimizations() { private List<MethodOptimization> getOptimizations() {
return Arrays.<MethodOptimization>asList(new CommonSubexpressionElimination(), // TODO: repair CommonSubexpressionElimination and get it back here
new UnusedVariableElimination()); return Arrays.<MethodOptimization>asList(new UnusedVariableElimination());
} }
public void optimizeAll(ListableClassHolderSource classSource) { public void optimizeAll(ListableClassHolderSource classSource) {