From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25863 invoked by alias); 24 Jan 2008 19:20:07 -0000 Received: (qmail 25832 invoked by uid 9708); 24 Jan 2008 19:20:07 -0000 Date: Thu, 24 Jan 2008 19:20:00 -0000 Message-ID: <20080124192007.25817.qmail@sourceware.org> From: tthomas@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Format floating points as hex constants for '-format x'. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: aa1f7ca43e95329845f4e504d5cc7190074f6fc9 X-Git-Newrev: 6a3ed1921c83fce6bac4eadda31dfa9c014f2952 Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2008-q1/txt/msg00115.txt.bz2 The branch, master has been updated via 6a3ed1921c83fce6bac4eadda31dfa9c014f2952 (commit) via 3b2032446949ae5935c6db08378e15fcbcd88609 (commit) from aa1f7ca43e95329845f4e504d5cc7190074f6fc9 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 6a3ed1921c83fce6bac4eadda31dfa9c014f2952 Author: Teresa Date: Thu Jan 24 14:14:27 2008 -0500 Format floating points as hex constants for '-format x'. frysk-core/frysk/value/ChangeLog 2008-01-24 Teresa Thomas * FloatingPointType.java (printAsHexConstant): New. * Format.java (printHexadecimalFP): Call printAsHexConstant. * TestFormat.java (testHexadecimal): Update values. commit 3b2032446949ae5935c6db08378e15fcbcd88609 Author: Teresa Date: Thu Jan 24 14:10:26 2008 -0500 Refactor FloatingPoint854Format. frysk-core/frysk/value/ChangeLog 2008-01-24 Teresa Thomas * FloatingPoint854Format.java: Refactor. * BigFloatingPoint.java (divide): Delete. ----------------------------------------------------------------------- Summary of changes: frysk-core/frysk/value/BigFloatingPoint.java | 9 --- frysk-core/frysk/value/ChangeLog | 9 +++ frysk-core/frysk/value/FloatingPoint854Format.java | 69 +++++++++++++++----- frysk-core/frysk/value/FloatingPointType.java | 23 ++++++- frysk-core/frysk/value/Format.java | 11 ++- frysk-core/frysk/value/TestFormat.java | 2 +- 6 files changed, 91 insertions(+), 32 deletions(-) First 500 lines of diff: diff --git a/frysk-core/frysk/value/BigFloatingPoint.java b/frysk-core/frysk/value/BigFloatingPoint.java index 925213d..eac5c3d 100644 --- a/frysk-core/frysk/value/BigFloatingPoint.java +++ b/frysk-core/frysk/value/BigFloatingPoint.java @@ -185,13 +185,4 @@ public class BigFloatingPoint int notEqual(BigFloatingPoint v) { return (value.compareTo(v.value) != 0) ? 1:0; } - - static BigDecimal divide (BigDecimal a, BigDecimal b) { - BigDecimal result[] = a.divideAndRemainder(b); - // FIXME: Use long division? Use BigDecimal's - // divide(BigDecimal,MathContext) when frysk - // moves to java 1.5.0. - double fraction = result[1].doubleValue()/b.doubleValue(); - return result[0].add(BigDecimal.valueOf(fraction)); - } } diff --git a/frysk-core/frysk/value/ChangeLog b/frysk-core/frysk/value/ChangeLog index 1f24bf6..d8e31f7 100644 --- a/frysk-core/frysk/value/ChangeLog +++ b/frysk-core/frysk/value/ChangeLog @@ -1,3 +1,12 @@ +2008-01-24 Teresa Thomas + + * FloatingPointType.java (printAsHexConstant): New. + * Format.java (printHexadecimalFP): Call printAsHexConstant. + * TestFormat.java (testHexadecimal): Update values. + + * FloatingPoint854Format.java: Refactor. + * BigFloatingPoint.java (divide): Delete. + 2008-01-23 Teresa Thomas * BigFloatingPoint.java: Add arithmetic functions. diff --git a/frysk-core/frysk/value/FloatingPoint854Format.java b/frysk-core/frysk/value/FloatingPoint854Format.java index ed3e81e..eb3c108 100644 --- a/frysk-core/frysk/value/FloatingPoint854Format.java +++ b/frysk-core/frysk/value/FloatingPoint854Format.java @@ -56,6 +56,7 @@ public class FloatingPoint854Format private int sizeF; private int sizeE; private int size; + private int integralOfMantissa; private static final BigDecimal two = BigDecimal.ONE.add(BigDecimal.ONE); /** @@ -77,17 +78,40 @@ public class FloatingPoint854Format } BigFloatingPoint unpack (byte[] bytes) { + int s = getSign (bytes); + BigInteger e = getBiasedExponent(bytes); + BigInteger f = getFraction(bytes); + BigInteger maxE = getMaxEValue(); + return toBigFP (s, e, f, maxE); + } + + /** + * @return 0 for negative and 1 for positive values FPs. + */ + int getSign (byte[] bytes) { int sIndex = 0; if (this.size == 12) sIndex = 2; else if (this.size == 16) sIndex = 6; - int s = (((bytes[sIndex] >> 7) & 0x01) == 0) ? -1:1; - BigInteger e = packExponent.unpackUnsigned(bytes); - BigInteger f = packFraction.unpackUnsigned(bytes); - BigInteger maxE = (BigInteger.valueOf(2).pow(sizeE)).subtract - (BigInteger.ONE); - return toBigFP (s, e, f, maxE); + return (((bytes[sIndex] >> 7) & 0x01) == 0) ? 0:1; + } + + BigInteger getBiasedExponent (byte[] bytes) { + return packExponent.unpackUnsigned(bytes); + } + + BigInteger getFraction (byte[] bytes) { + return packFraction.unpackUnsigned(bytes); + } + + int getIntegralOfMantissa (byte[] bytes) { + getMantissa (getFraction(bytes), getBiasedExponent(bytes), sizeF); + return integralOfMantissa; + } + + BigInteger getMaxEValue () { + return (BigInteger.valueOf(2).pow(sizeE)).subtract(BigInteger.ONE); } /** @@ -106,7 +130,13 @@ public class FloatingPoint854Format int trailingZeroes = f.getLowestSetBit(); BigDecimal m = new BigDecimal (f.shiftRight(trailingZeroes)); m = divide (m, two.pow(sizeOfF-trailingZeroes)); - return (e.compareTo(BigInteger.ZERO) == 0)? m : BigDecimal.ONE.add(m); + //return (e.compareTo(BigInteger.ZERO) == 0)? m : BigDecimal.ONE.add(m); + if (e.compareTo(BigInteger.ZERO) == 0) { + integralOfMantissa = 0; + return m; + } + integralOfMantissa = 1; + return BigDecimal.ONE.add(m); } private BigDecimal getMantissaExtended (BigInteger f, int sizeOfF){ @@ -115,7 +145,14 @@ public class FloatingPoint854Format f = f.clearBit(f.bitLength()-1); BigDecimal m = new BigDecimal (f.shiftRight(trailingZeroes)); m = divide (m, two.pow(sizeOfF-trailingZeroes-1)); - return (j == false)? m : BigDecimal.ONE.add(m); + //return (j == false)? m : BigDecimal.ONE.add(m); + if (j == false) { + integralOfMantissa = 0; + return m; + } + integralOfMantissa = 1; + return BigDecimal.ONE.add(m); + } /** @@ -126,8 +163,8 @@ public class FloatingPoint854Format * @param maxE - max possible value of exponent field */ private BigFloatingPoint toBigFP (int s, - BigInteger e, BigInteger f, - BigInteger maxE) { + BigInteger e, BigInteger f, + BigInteger maxE) { BigDecimal m = getMantissa(f, e, sizeF); BigDecimal result = BigDecimal.ZERO; BigDecimal one = BigDecimal.ONE; @@ -141,8 +178,8 @@ public class FloatingPoint854Format } else { // FIXME: 0 or m? - return (s == -1)? new BigFloatingPoint (m, BigFloatingPoint.posInf): - new BigFloatingPoint (m, BigFloatingPoint.negInf); + return (s == 0)? new BigFloatingPoint (m, BigFloatingPoint.posInf): + new BigFloatingPoint (m, BigFloatingPoint.negInf); } } else if (e.compareTo(BigInteger.ZERO) == 0) { @@ -152,16 +189,16 @@ public class FloatingPoint854Format else { result = BigDecimal.ZERO; } - return (s == -1)? new BigFloatingPoint(result): - new BigFloatingPoint(result.negate()); + return (s == 0)? new BigFloatingPoint(result): + new BigFloatingPoint(result.negate()); } else if (e.compareTo(BigInteger.ZERO) > 0 && e.compareTo(maxE) < 0) { if (e.intValue()-halfMaxE < 0) result = divide (one, two.pow(-e.intValue()+halfMaxE)).multiply(m); else result = two.pow(e.intValue()-halfMaxE).multiply(m); - return (s == -1)? new BigFloatingPoint(result): - new BigFloatingPoint(result.negate()); + return (s == 0)? new BigFloatingPoint(result): + new BigFloatingPoint(result.negate()); } else { throw new RuntimeException diff --git a/frysk-core/frysk/value/FloatingPointType.java b/frysk-core/frysk/value/FloatingPointType.java index fce8394..0f2f120 100644 --- a/frysk-core/frysk/value/FloatingPointType.java +++ b/frysk-core/frysk/value/FloatingPointType.java @@ -60,15 +60,15 @@ public class FloatingPointType switch (size) { case 4: format = FloatingPoint854Format.IEEE32; break; - case 8:format = FloatingPoint854Format.IEEE64; + case 8: format = FloatingPoint854Format.IEEE64; break; case 16:format = FloatingPoint854Format.IEEE128; break; case 10:format = FloatingPoint854Format.IEEE80; break; - case 12: format = FloatingPoint854Format.IEEE96; + case 12:format = FloatingPoint854Format.IEEE96; break; - default: format = FloatingPoint854Format.IEEE64; + default:format = FloatingPoint854Format.IEEE64; break; } } @@ -80,6 +80,23 @@ public class FloatingPointType } /** + * Prints value as a hexadecimal float constant. + * eg. double value 9.0 --> 0x1.2p+0 + */ + public void printAsHexConstant (PrintWriter writer, Location loc) { + byte[] bytes = loc.get(order()); + FloatingPoint854Format f = (FloatingPoint854Format)format; + writer.print(f.getSign(bytes)==0? "":"-"); + writer.print("0x"); + writer.print(f.getIntegralOfMantissa(bytes)); + writer.print('.'); + writer.print(f.getFraction(bytes).toString(16)); + writer.print('p'); + writer.print(f.getBiasedExponent(bytes).intValue() + - f.getMaxEValue().intValue()/2); + } + + /** * Return the raw bytes as an unsigned integer. */ BigInteger getBigInteger(Location location) { diff --git a/frysk-core/frysk/value/Format.java b/frysk-core/frysk/value/Format.java index 5bec308..1023fd8 100644 --- a/frysk-core/frysk/value/Format.java +++ b/frysk-core/frysk/value/Format.java @@ -68,11 +68,16 @@ public abstract class Format writer.print(new BigInteger(1, location.get(order)).toString(2)); } private static void printFloatingPoint(PrintWriter writer, - Location location, - FloatingPointType type) { + Location location, + FloatingPointType type) { BigFloatingPoint f = type.getBigFloatingPoint(location); writer.print(f.toString(type.getSize())); } + private static void printHexadecimalFP(PrintWriter writer, + Location location, + FloatingPointType type) { + type.printAsHexConstant(writer, location); + } /** * Print the integer at LOCATION. @@ -113,7 +118,7 @@ public abstract class Format } void print(PrintWriter writer, Location location, FloatingPointType type) { - printHexadecimal(writer, location, type.order()); + printHexadecimalFP(writer, location, type); } void print(PrintWriter writer, Location location, PointerType type) { diff --git a/frysk-core/frysk/value/TestFormat.java b/frysk-core/frysk/value/TestFormat.java index 54030c9..07d434a 100644 --- a/frysk-core/frysk/value/TestFormat.java +++ b/frysk-core/frysk/value/TestFormat.java @@ -110,7 +110,7 @@ public class TestFormat } public void testHexadecimal() { checkFormat(Format.HEXADECIMAL, "0xffffffff", "0xffffffff", - "0x3f800000", "0x4000000000000000", + "0x1.0p0", "0x1.0p1", "0x1020304"); } public void testOctal() { hooks/post-receive -- frysk system monitor/debugger