From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 22978 invoked by alias); 7 Nov 2007 19:11:31 -0000 Received: (qmail 22831 invoked by uid 9708); 7 Nov 2007 19:11:30 -0000 Date: Wed, 07 Nov 2007 19:11:00 -0000 Message-ID: <20071107191128.22467.qmail@sourceware.org> From: tthomas@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] frysk system monitor/debugger branch, master, updated. 718026a59c0ed8ed3a4e7eb97090244332b8c210 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 925c031c35d3340a51b3ae57bae38b1818a5e278 X-Git-Newrev: 718026a59c0ed8ed3a4e7eb97090244332b8c210 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: 2007-q4/txt/msg00309.txt.bz2 The branch, master has been updated via 718026a59c0ed8ed3a4e7eb97090244332b8c210 (commit) from 925c031c35d3340a51b3ae57bae38b1818a5e278 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 718026a59c0ed8ed3a4e7eb97090244332b8c210 Author: Teresa Thomas Date: Wed Nov 7 14:07:52 2007 -0500 Implement *, /, *=, /= in Arithmetic Unit. frysk-core/frysk/value/ChangeLog 2007-11-07 Teresa Thomas * FloatingPointUnit.java (multiply): New. (divide): New. (mod): New. * IntegerUnit.java (multiply): New. (divide): New. (mod): New. * ArithmeticUnit.java (divide): New. (multiply): New. (timesEqual): New. (divideEqual): New. (mod): New. (modEqual): New.. * ArithmeticType.java (multiply): Delete. (timesEqual): Delete. (divide): Delete. (divideEqual): Delete. (mod): Delete (modEqual): Delete. * TypeDecorator.java (multiply): Delete. (timesEqual): Delete. (divide): Delete. (divideEqual): Delete. (mod): Delete. (modEqual): Delete. * Type.java (multiply): Delete. (timesEqual): Delete. (divide): Delete. (divideEqual): Delete. (mod): Delete. (modEqual): Delete. * TestValue.java: Updated. frysk-core/frysk/expr/ChangeLog 2007-11-06 Teresa Thomas * CExprEvaluator.g (STAR): Use Arithmetic Unit. (TIMESEQUAL): Ditto. (DIVIDE): Ditto. (DIVIDEEQUAL): Ditto. (MOD): Ditto. (MODEQUAL): Ditto. ----------------------------------------------------------------------- Summary of changes: frysk-core/frysk/expr/CExprEvaluator.g | 62 +++++++++++++++---------- frysk-core/frysk/expr/ChangeLog | 9 ++++ frysk-core/frysk/value/AddressUnit.java | 4 +- frysk-core/frysk/value/ArithmeticType.java | 42 ----------------- frysk-core/frysk/value/ArithmeticUnit.java | 40 +++++++++++++++- frysk-core/frysk/value/ChangeLog | 34 +++++++++++++ frysk-core/frysk/value/FloatingPointUnit.java | 18 +++++++- frysk-core/frysk/value/IntegerUnit.java | 18 +++++++- frysk-core/frysk/value/TestValue.java | 30 ++++++------ frysk-core/frysk/value/Type.java | 20 +-------- frysk-core/frysk/value/TypeDecorator.java | 19 +------- 11 files changed, 173 insertions(+), 123 deletions(-) First 500 lines of diff: diff --git a/frysk-core/frysk/expr/CExprEvaluator.g b/frysk-core/frysk/expr/CExprEvaluator.g index d5bf068..087ca64 100644 --- a/frysk-core/frysk/expr/CExprEvaluator.g +++ b/frysk-core/frysk/expr/CExprEvaluator.g @@ -137,38 +137,64 @@ identifier returns [String idSpelling=null] expr returns [Value returnVar=null] { Value v1, v2, log_expr; String s1; } : #(PLUS v1=expr v2=expr) { - returnVar = v1.getType().getALU(v2.getType(), exprSymTab.getWordSize()) + returnVar = v1.getType().getALU(v2.getType(), + exprSymTab.getWordSize()) .add(v1, v2); } | #(PLUSEQUAL v1=expr v2=expr) { - returnVar = v1.getType().getALU(v2.getType(), exprSymTab.getWordSize()) + returnVar = v1.getType().getALU(v2.getType(), + exprSymTab.getWordSize()) .plusEqual(v1, v2); } | ( #(MINUS expr expr) )=> #(MINUS v1=expr v2=expr) { - returnVar = v1.getType().getALU(v2.getType(), exprSymTab.getWordSize()) + returnVar = v1.getType().getALU(v2.getType(), + exprSymTab.getWordSize()) .subtract(v1, v2); } | #(MINUSEQUAL v1=expr v2=expr) { - returnVar = v1.getType().getALU(v2.getType(), exprSymTab.getWordSize()) + returnVar = v1.getType().getALU(v2.getType(), + exprSymTab.getWordSize()) .minusEqual(v1, v2); } | #(MINUS v1=expr ) { returnVar = intType.createValue(0); - returnVar = returnVar.getType().getALU(v1.getType(), exprSymTab.getWordSize()) + returnVar = returnVar.getType().getALU(v1.getType(), + exprSymTab.getWordSize()) .subtract(returnVar, v1); } | ( #(STAR expr expr) )=> #(STAR v1=expr v2=expr) { - returnVar = v1.getType().multiply(v1, v2); + returnVar = v1.getType().getALU(v2.getType(), + exprSymTab.getWordSize()) + .multiply(v1, v2); } + | #(TIMESEQUAL v1=expr v2=expr) { + returnVar = v1.getType().getALU(v2.getType(), + exprSymTab.getWordSize()) + .timesEqual(v1, v2); + } + | #(DIVIDE v1=expr v2=expr) { + returnVar = v1.getType().getALU(v2.getType(), + exprSymTab.getWordSize()) + .divide(v1, v2); + } + | #(DIVIDEEQUAL v1=expr v2=expr) { + returnVar = v1.getType().getALU(v2.getType(), + exprSymTab.getWordSize()) + .divideEqual(v1, v2); + } + | #(MOD v1=expr v2=expr) { + returnVar = v1.getType().getALU(v2.getType(), + exprSymTab.getWordSize()) + .mod(v1, v2); + } + | #(MODEQUAL v1=expr v2=expr) { + returnVar = v1.getType().getALU(v2.getType(), + exprSymTab.getWordSize()) + .modEqual(v1, v2); + } | #(MEMORY v1=expr ) { returnVar = v1.getType().dereference(v1, exprSymTab.taskMemory()); } - | #(DIVIDE v1=expr v2=expr) { - returnVar = v1.getType().divide(v1, v2); - } - | #(MOD v1=expr v2=expr) { - returnVar = v1.getType().mod(v1, v2); - } | #(SHIFTLEFT v1=expr v2=expr) { returnVar = v1.getType().shiftLeft(v1, v2); } @@ -264,18 +290,6 @@ expr returns [Value returnVar=null] v1.assign(v2); returnVar = v1; } - | #(TIMESEQUAL v1=expr v2=expr) { - v1.getType().timesEqual(v1, v2); - returnVar = v1; - } - | #(DIVIDEEQUAL v1=expr v2=expr) { - v1.getType().divideEqual(v1, v2); - returnVar = v1; - } - | #(MODEQUAL v1=expr v2=expr) { - v1.getType().modEqual(v1, v2); - returnVar = v1; - } | #(SHIFTLEFTEQUAL v1=expr v2=expr) { v1.getType().shiftLeftEqual(v1, v2); returnVar = v1; diff --git a/frysk-core/frysk/expr/ChangeLog b/frysk-core/frysk/expr/ChangeLog index 1f93590..a316bff 100644 --- a/frysk-core/frysk/expr/ChangeLog +++ b/frysk-core/frysk/expr/ChangeLog @@ -1,5 +1,14 @@ 2007-11-06 Teresa Thomas + * CExprEvaluator.g (STAR): Use Arithmetic Unit. + (TIMESEQUAL): Ditto. + (DIVIDE): Ditto. + (DIVIDEEQUAL): Ditto. + (MOD): Ditto. + (MODEQUAL): Ditto. + +2007-11-06 Teresa Thomas + * CExprEvaluator.g (MINUS): Use Arithmetic Unit. (MINUSEQUAL): Ditto. diff --git a/frysk-core/frysk/value/AddressUnit.java b/frysk-core/frysk/value/AddressUnit.java index cf2b316..ea9e285 100644 --- a/frysk-core/frysk/value/AddressUnit.java +++ b/frysk-core/frysk/value/AddressUnit.java @@ -41,7 +41,7 @@ package frysk.value; import inua.eio.ByteOrder; /** - * Arithmetic Operation handling for pointers and addresses. + * Operation handling for pointers and addresses. */ public class AddressUnit extends ArithmeticUnit @@ -64,6 +64,8 @@ extends ArithmeticUnit v2.getType() instanceof ArrayType ) return addArray(v1, v2); + // Commutative operation, so identify pointer + // and integer value. PointerType ptrType; Value ptrValue; Value intValue; diff --git a/frysk-core/frysk/value/ArithmeticType.java b/frysk-core/frysk/value/ArithmeticType.java index 8a2ee4d..96f8a79 100644 --- a/frysk-core/frysk/value/ArithmeticType.java +++ b/frysk-core/frysk/value/ArithmeticType.java @@ -119,36 +119,6 @@ public abstract class ArithmeticType } } - public Value multiply(Value var1, Value var2) { - ArithmeticType type = returnType(var1, var2); - if (type instanceof IntegerType) - return type.createValue(var1.asLong() * var2.asLong()); - else if (type instanceof FloatingPointType) - return type.createValue(var1.doubleValue() * var2.doubleValue()); - else - throw new RuntimeException("type conversion botch"); - } - - public Value divide(Value var1, Value var2) { - ArithmeticType type = returnType(var1, var2); - if (type instanceof IntegerType) - return type.createValue(var1.asLong() / var2.asLong()); - else if (type instanceof FloatingPointType) - return type.createValue(var1.doubleValue() / var2.doubleValue()); - else - throw new RuntimeException("type conversion botch"); - } - - public Value mod(Value var1, Value var2) { - ArithmeticType type = returnType(var1, var2); - if (type instanceof IntegerType) - return type.createValue(var1.asLong() % var2.asLong()); - else if (type instanceof FloatingPointType) - return type.createValue(var1.doubleValue() % var2.doubleValue()); - else - throw new RuntimeException("type conversion botch"); - } - public Value shiftLeft(Value var1, Value var2) { ArithmeticType type = returnType(var1, var2); if (type instanceof IntegerType) @@ -287,18 +257,6 @@ public abstract class ArithmeticType return var1.assign(var2); } - public Value timesEqual(Value var1, Value var2) { - return var1.assign(multiply(var1, var2)); - } - - public Value divideEqual(Value var1, Value var2) { - return var1.assign(divide(var1, var2)); - } - - public Value modEqual(Value var1, Value var2) { - return var1.assign(mod(var1, var2)); - } - public Value shiftLeftEqual(Value var1, Value var2) { return var1.assign(shiftLeft(var1, var2)); } diff --git a/frysk-core/frysk/value/ArithmeticUnit.java b/frysk-core/frysk/value/ArithmeticUnit.java index c8aae93..736f89a 100644 --- a/frysk-core/frysk/value/ArithmeticUnit.java +++ b/frysk-core/frysk/value/ArithmeticUnit.java @@ -40,15 +40,37 @@ package frysk.value; /** - * Arithmetic Operation handling for different types. + * Arithmetic and Logical Operation handling + * for different types. */ public abstract class ArithmeticUnit { protected ArithmeticType retType; - public abstract Value add(Value v1, Value v2); + public Value add(Value v1, Value v2) { + throw new InvalidOperatorException + (v1.getType(), v2.getType(), "+"); + } + + public Value subtract(Value v1, Value v2) { + throw new InvalidOperatorException + (v1.getType(), v2.getType(), "-"); + } + + public Value multiply (Value v1, Value v2) { + throw new InvalidOperatorException + (v1.getType(), v2.getType(), "*"); + } + + public Value divide(Value v1, Value v2) { + throw new InvalidOperatorException + (v1.getType(), v2.getType(), "/"); + } - public abstract Value subtract(Value v1, Value v2); + public Value mod(Value v1, Value v2) { + throw new InvalidOperatorException + (v1.getType(), v2.getType(), "%"); + } public Value plusEqual(Value v1, Value v2) { return v1.assign(add(v1, v2)); @@ -57,4 +79,16 @@ public abstract class ArithmeticUnit public Value minusEqual(Value v1, Value v2) { return v1.assign(subtract(v1, v2)); } + + public Value timesEqual(Value v1, Value v2) { + return v1.assign(multiply(v1, v2)); + } + + public Value divideEqual (Value v1, Value v2) { + return v1.assign(divide(v1, v2)); + } + + public Value modEqual(Value v1, Value v2) { + return v1.assign(mod(v1, v2)); + } } \ No newline at end of file diff --git a/frysk-core/frysk/value/ChangeLog b/frysk-core/frysk/value/ChangeLog index 8be698c..108511e 100644 --- a/frysk-core/frysk/value/ChangeLog +++ b/frysk-core/frysk/value/ChangeLog @@ -1,3 +1,37 @@ +2007-11-07 Teresa Thomas + + * FloatingPointUnit.java (multiply): New. + (divide): New. + (mod): New. + * IntegerUnit.java (multiply): New. + (divide): New. + (mod): New. + * ArithmeticUnit.java (divide): New. + (multiply): New. + (timesEqual): New. + (divideEqual): New. + (mod): New. + (modEqual): New.. + * ArithmeticType.java (multiply): Delete. + (timesEqual): Delete. + (divide): Delete. + (divideEqual): Delete. + (mod): Delete + (modEqual): Delete. + * TypeDecorator.java (multiply): Delete. + (timesEqual): Delete. + (divide): Delete. + (divideEqual): Delete. + (mod): Delete. + (modEqual): Delete. + * Type.java (multiply): Delete. + (timesEqual): Delete. + (divide): Delete. + (divideEqual): Delete. + (mod): Delete. + (modEqual): Delete. + * TestValue.java: Updated. + 2007-11-06 Teresa Thomas * InvalidOperatorException.java diff --git a/frysk-core/frysk/value/FloatingPointUnit.java b/frysk-core/frysk/value/FloatingPointUnit.java index f10a103..96cbd83 100644 --- a/frysk-core/frysk/value/FloatingPointUnit.java +++ b/frysk-core/frysk/value/FloatingPointUnit.java @@ -40,7 +40,8 @@ package frysk.value; /** - * Arithmetic Operation handling for floating points. + * Arithmetic and logical operation handling + * for floating points. */ public class FloatingPointUnit extends ArithmeticUnit @@ -63,4 +64,19 @@ public class FloatingPointUnit return retType.createValue (v1.doubleValue() - v2.doubleValue()); } + + public Value multiply (Value v1, Value v2) { + return retType.createValue + (v1.doubleValue() * v2.doubleValue()); + } + + public Value divide (Value v1, Value v2) { + return retType.createValue + (v1.doubleValue() / v2.doubleValue()); + } + + public Value mod (Value v1, Value v2) { + return retType.createValue + (v1.doubleValue() % v2.doubleValue()); + } } \ No newline at end of file diff --git a/frysk-core/frysk/value/IntegerUnit.java b/frysk-core/frysk/value/IntegerUnit.java index 32defa8..aff19e2 100644 --- a/frysk-core/frysk/value/IntegerUnit.java +++ b/frysk-core/frysk/value/IntegerUnit.java @@ -40,7 +40,8 @@ package frysk.value; /** - * Arithmetic Operation handling for integers. + * Arithmetic and logical Operation handling + * for integers. */ public class IntegerUnit extends ArithmeticUnit @@ -60,4 +61,19 @@ public class IntegerUnit return retType.createValue (v1.asBigInteger().subtract(v2.asBigInteger())); } + + public Value multiply (Value v1, Value v2) { + return retType.createValue + (v1.asBigInteger().multiply(v2.asBigInteger())); + } + + public Value divide (Value v1, Value v2) { + return retType.createValue + (v1.asBigInteger().divide(v2.asBigInteger())); + } + + public Value mod(Value v1, Value v2) { + return retType.createValue + (v1.asBigInteger().mod(v2.asBigInteger())); + } } \ No newline at end of file diff --git a/frysk-core/frysk/value/TestValue.java b/frysk-core/frysk/value/TestValue.java index 7dbf48c..37c7967 100644 --- a/frysk-core/frysk/value/TestValue.java +++ b/frysk-core/frysk/value/TestValue.java @@ -102,13 +102,14 @@ public class TestValue { Value v1 = intType.createValue(4); Value v2 = shortType.createValue(9); + // Give bogus word size values. Value v3 = v1.getType().getALU(v2.getType(), 0).add(v1, v2); assertEquals ("4 + 9", 4 + 9, v3.asLong()); v3 = v1.getType().getALU(v2.getType(), 0).subtract(v2, v1); assertEquals ("9 - 4", 9 - 4, v3.asLong()); - v3 = v1.getType().multiply(v2, v1); + v3 = v1.getType().getALU(v2.getType(), 0).multiply(v2, v1); assertEquals ("9 * 4", 9 * 4, v3.asLong()); - v3 = v1.getType().mod(v2, v1); + v3 = v1.getType().getALU(v2.getType(), 0).mod(v2, v1); assertEquals ("9 % 4", 9 % 4, v3.asLong()); v3 = v1.getType().shiftLeft(v2, v1); assertEquals ("9 << 4", 9 << 4, v3.asLong()); @@ -140,15 +141,15 @@ public class TestValue assertEquals ("9 | 4", 1, v3.asLong()); v3 = v3.assign(v1); assertEquals ("v3 = 4", 4, v3.asLong()); - v3 = v1.getType().getALU(v2.getType(), 0).plusEqual(v3, v1); + v3 = v3.getType().getALU(v1.getType(), 0).plusEqual(v3, v1); assertEquals ("v3 += 4", 8, v3.asLong()); - v3 = v1.getType().getALU(v2.getType(), 0).minusEqual(v3, v1); + v3 = v3.getType().getALU(v1.getType(), 0).minusEqual(v3, v1); assertEquals ("v3 -= 4", 4, v3.asLong()); - v3 = v1.getType().timesEqual(v3, v1); + v3 = v3.getType().getALU(v1.getType(), 0).timesEqual(v3, v1); assertEquals ("v3 *= 4", 16, v3.asLong()); - v3 = v1.getType().divideEqual(v3, v1); + v3 = v3.getType().getALU(v1.getType(), 0).divideEqual(v3, v1); assertEquals ("v3 /= 4", 4, v3.asLong()); - v3 = v1.getType().modEqual(v3, v1); + v3 = v3.getType().getALU(v1.getType(), 0).modEqual(v3, v1); assertEquals ("v3 %= 4", 0, v3.asLong()); v3 = v1.getType().shiftLeftEqual(v3, v1); assertEquals ("v3 <<= 4", 0, v3.asLong()); @@ -166,13 +167,14 @@ public class TestValue { Value v1 = floatType.createValue((float)4.0); Value v2 = doubleType.createValue(9.0); + // Give bogus word size values. Value v3 = v1.getType().getALU(v2.getType(), 0).add(v1, v2); assertEquals ("4 + 9", 4 + 9, v3.doubleValue(), 0); v3 = v1.getType().getALU(v2.getType(), 0).subtract(v2, v1); assertEquals ("9 - 4", 9 - 4, v3.doubleValue(), 0); - v3 = v1.getType().multiply(v2, v1); + v3 = v1.getType().getALU(v2.getType(), 0).multiply(v2, v1); assertEquals ("9 * 4", 9 * 4, v3.doubleValue(), 0); - v3 = v1.getType().mod(v2, v1); + v3 = v1.getType().getALU(v2.getType(), 0).mod(v2, v1); assertEquals ("9 % 4", 9 % 4, v3.doubleValue(), 0); v3 = v1.getType().lessThan(v2, v1); assertEquals ("9 < 4", 9 < 4, isTrue(v3.doubleValue())); @@ -188,15 +190,15 @@ public class TestValue assertEquals ("9 != 4", v2 != v1, isTrue(v3.doubleValue())); v3 = v3.assign(v1); assertEquals ("v3 = 4", 4, v3.doubleValue(), 0); - v3 = v1.getType().getALU(v3.getType(), 0).plusEqual(v3, v1); + v3 = v3.getType().getALU(v1.getType(), 0).plusEqual(v3, v1); assertEquals ("v3 += 4", 8, v3.doubleValue(), 0); - v3 = v1.getType().getALU(v2.getType(), 0).minusEqual(v3, v1); + v3 = v3.getType().getALU(v1.getType(), 0).minusEqual(v3, v1); assertEquals ("v3 -= 4", 4, v3.doubleValue(), 0); - v3 = v1.getType().timesEqual(v3, v1); + v3 = v3.getType().getALU(v1.getType(), 0).timesEqual(v3, v1); assertEquals ("v3 *= 4", 16, v3.doubleValue(), 0); - v3 = v1.getType().divideEqual(v3, v1); + v3 = v3.getType().getALU(v1.getType(), 0).divideEqual(v3, v1); assertEquals ("v3 /= 4", 4, v3.doubleValue(), 0); - v3 = v1.getType().modEqual(v3, v1); + v3 = v3.getType().getALU(v1.getType(), 0).modEqual(v3, v1); assertEquals ("v3 %= 4", 0, v3.doubleValue(), 0); } } diff --git a/frysk-core/frysk/value/Type.java b/frysk-core/frysk/value/Type.java index cb204aa..c13cb2e 100644 --- a/frysk-core/frysk/value/Type.java +++ b/frysk-core/frysk/value/Type.java @@ -143,16 +143,7 @@ public abstract class Type { public ArithmeticUnit getALU(ArrayType type, int wordSize) { throw new RuntimeException("Invalid Arithmetic Unit"); } - - public Value multiply (Value var1, Value var2) { - throw new InvalidOperatorException(this, "*"); - } - public Value divide (Value var1, Value var2) { - throw new InvalidOperatorException(this, "/"); - } - public Value mod (Value var1, Value var2) { - throw new InvalidOperatorException(this, "%"); - } + public Value shiftLeft (Value var1, Value var2) { throw new InvalidOperatorException(this, "<<"); } @@ -198,15 +189,6 @@ public abstract class Type { public Value logicalNegation(Value var1) { throw new InvalidOperatorException(this, "!"); } - public Value timesEqual (Value var1, Value var2) { - throw new InvalidOperatorException(this, "*="); - } - public Value divideEqual (Value var1, Value var2) { - throw new InvalidOperatorException(this, "/="); - } - public Value modEqual (Value var1, Value var2) { - throw new InvalidOperatorException(this, "%="); - } public Value shiftLeftEqual (Value var1, Value var2) { throw new InvalidOperatorException(this, "<<="); } diff --git a/frysk-core/frysk/value/TypeDecorator.java b/frysk-core/frysk/value/TypeDecorator.java index 30e2fc7..98d0461 100644 --- a/frysk-core/frysk/value/TypeDecorator.java +++ b/frysk-core/frysk/value/TypeDecorator.java @@ -89,15 +89,7 @@ abstract class TypeDecorator extends Type { decorated.toPrint(writer); hooks/post-receive -- frysk system monitor/debugger