diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/instruction/BranchSet.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/instruction/BranchSet.java index 0454d75b12314b8a5aafd48c7b3ba5c87f471ef7..7674ffe3d593102ef53bd31583cba46cdf366bec 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/instruction/BranchSet.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/instruction/BranchSet.java @@ -97,7 +97,7 @@ import com.amd.aparapi.internal.instruction.InstructionSet.ConditionalBranch; * @author gfrost */ -public class BranchSet{ +public class BranchSet { /** * Base abstract class used to hold information used to construct node tree for logical expressions. * @@ -107,7 +107,7 @@ public class BranchSet{ * @author gfrost * */ - public static abstract class LogicalExpressionNode{ + public static abstract class LogicalExpressionNode { private LogicalExpressionNode next = null; private LogicalExpressionNode parent = null; @@ -122,6 +122,8 @@ public class BranchSet{ public abstract void invert(); + public abstract LogicalExpressionNode cloneInverted(); + public LogicalExpressionNode getRoot() { if (parent != null) { return (parent); @@ -154,24 +156,37 @@ public class BranchSet{ * @author gfrost * */ - public static class SimpleLogicalExpressionNode extends LogicalExpressionNode{ + public static class SimpleLogicalExpressionNode extends LogicalExpressionNode { private final ConditionalBranch branch; - protected boolean invert = false; + private boolean invert; public SimpleLogicalExpressionNode(ConditionalBranch _branch) { + this(_branch, false); + } + + private SimpleLogicalExpressionNode(ConditionalBranch _branch, boolean _invert) { branch = _branch; + invert = _invert; } - @Override public int getTarget() { + @Override + public int getTarget() { return (getBranch().getTarget().getThisPC()); } - @Override public void invert() { + @Override + public void invert() { invert = !invert; } - @Override public int getFallThrough() { + @Override + public LogicalExpressionNode cloneInverted() { + return new SimpleLogicalExpressionNode(branch, !invert); + } + + @Override + public int getFallThrough() { return (getBranch().getNextPC().getThisPC()); } @@ -182,6 +197,11 @@ public class BranchSet{ public ConditionalBranch getBranch() { return branch; } + + @Override + public String toString() { + return invert ? ("!(" + getBranch() + ")") : getBranch().toString(); + } } /** @@ -195,41 +215,56 @@ public class BranchSet{ * @author gfrost * */ - public static class CompoundLogicalExpressionNode extends LogicalExpressionNode{ + public static class CompoundLogicalExpressionNode extends LogicalExpressionNode { private final LogicalExpressionNode lhs; private final LogicalExpressionNode rhs; private boolean and; - public CompoundLogicalExpressionNode(boolean _and, LogicalExpressionNode _lhs, LogicalExpressionNode _rhs) { + private CompoundLogicalExpressionNode(boolean _and, LogicalExpressionNode _lhs, LogicalExpressionNode _rhs, + boolean applyInverts) { lhs = _lhs; and = _and; rhs = _rhs; setNext(_rhs.getNext()); - if (and) { - lhs.invert(); - // rhs.invert(); + if (applyInverts) { + if (and) { + lhs.invert(); + // rhs.invert(); + } } rhs.setParent(this); lhs.setParent(this); } - @Override public int getTarget() { + public CompoundLogicalExpressionNode(boolean _and, LogicalExpressionNode _lhs, LogicalExpressionNode _rhs) { + this(_and, _lhs, _rhs, true); + } + + @Override + public int getTarget() { return (rhs.getTarget()); } - @Override public void invert() { + @Override + public void invert() { and = !and; lhs.invert(); rhs.invert(); } + @Override + public LogicalExpressionNode cloneInverted() { + return new CompoundLogicalExpressionNode(!and, lhs.cloneInverted(), rhs.cloneInverted(), false); + } + public boolean isAnd() { return (and); } - @Override public int getFallThrough() { + @Override + public int getFallThrough() { return (rhs.getFallThrough()); } @@ -242,6 +277,12 @@ public class BranchSet{ return rhs; } + + @Override + public String toString() { + return getLhs().toString() + " " + (isAnd() ? "&&" : "||") + " " + getRhs().toString(); + } + } private final List<ConditionalBranch> set = new ArrayList<ConditionalBranch>(); diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/BlockWriter.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/BlockWriter.java index 9e9efc6381e8e658b6091b512bde5b4ff6583ef1..c8074224b186acff30be215b0ccabcd536183822 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/BlockWriter.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/BlockWriter.java @@ -40,6 +40,7 @@ package com.amd.aparapi.internal.writer; import com.amd.aparapi.*; import com.amd.aparapi.internal.exception.*; import com.amd.aparapi.internal.instruction.*; +import com.amd.aparapi.internal.instruction.BranchSet.LogicalExpressionNode; import com.amd.aparapi.internal.instruction.BranchSet.*; import com.amd.aparapi.internal.instruction.InstructionSet.*; import com.amd.aparapi.internal.model.ClassModel.ConstantPool.*; @@ -56,9 +57,10 @@ import java.util.*; * */ -public abstract class BlockWriter{ +public abstract class BlockWriter { public final static String arrayLengthMangleSuffix = "__javaArrayLength"; + public final static String arrayDimMangleSuffix = "__javaArrayDimension"; public abstract void write(String _string); @@ -315,10 +317,7 @@ public abstract class BlockWriter{ public Instruction writeConditional(BranchSet _branchSet, boolean _invert) throws CodeGenException { final LogicalExpressionNode logicalExpression = _branchSet.getLogicalExpression(); - if (!_invert) { - logicalExpression.invert(); - } - write(logicalExpression); + write(_invert ? logicalExpression : logicalExpression.cloneInverted()); return (_branchSet.getLast().getNextExpr()); } @@ -416,7 +415,7 @@ public abstract class BlockWriter{ final AccessArrayElement arrayLoadInstruction = (AccessArrayElement) _instruction; //object array, get address - if(arrayLoadInstruction instanceof I_AALOAD) { + if (arrayLoadInstruction instanceof I_AALOAD) { write("(&"); } writeInstruction(arrayLoadInstruction.getArrayRef()); @@ -425,22 +424,23 @@ public abstract class BlockWriter{ //object array, find the size of each object in the array //for 2D arrays, this size is the size of a row. - if(arrayLoadInstruction instanceof I_AALOAD) { + if (arrayLoadInstruction instanceof I_AALOAD) { int dim = 0; Instruction load = arrayLoadInstruction.getArrayRef(); - while(load instanceof I_AALOAD) { + while (load instanceof I_AALOAD) { load = load.getFirstChild(); dim++; } - String arrayName = ((AccessInstanceField)load).getConstantPoolFieldEntry().getNameAndTypeEntry().getNameUTF8Entry().getUTF8(); - write(" * this->" + arrayName + arrayDimMangleSuffix+dim); + String arrayName = ((AccessInstanceField) load).getConstantPoolFieldEntry().getNameAndTypeEntry().getNameUTF8Entry() + .getUTF8(); + write(" * this->" + arrayName + arrayDimMangleSuffix + dim); } write("]"); //object array, close parentheses - if(arrayLoadInstruction instanceof I_AALOAD) { + if (arrayLoadInstruction instanceof I_AALOAD) { write(")"); } } else if (_instruction instanceof AccessField) { @@ -467,9 +467,9 @@ public abstract class BlockWriter{ //we're looking at int dim = 0; Instruction load = _instruction.getFirstChild(); - while(load instanceof I_AALOAD) { - load = load.getFirstChild(); - dim++; + while (load instanceof I_AALOAD) { + load = load.getFirstChild(); + dim++; } final AccessInstanceField child = (AccessInstanceField) load; final String arrayName = child.getConstantPoolFieldEntry().getNameAndTypeEntry().getNameUTF8Entry().getUTF8(); @@ -724,9 +724,10 @@ public abstract class BlockWriter{ } public void writeMethod(MethodCall _methodCall, MethodEntry _methodEntry) throws CodeGenException { - boolean noCL = _methodEntry.getOwnerClassModel().getNoCLMethods().contains(_methodEntry.getNameAndTypeEntry().getNameUTF8Entry().getUTF8()); + boolean noCL = _methodEntry.getOwnerClassModel().getNoCLMethods() + .contains(_methodEntry.getNameAndTypeEntry().getNameUTF8Entry().getUTF8()); if (noCL) { - return; + return; } if (_methodCall instanceof VirtualMethodCall) { @@ -760,8 +761,7 @@ public abstract class BlockWriter{ if (_methodModel.isGetter() && !_methodModel.isNoCL()) { FieldEntry accessorVariableFieldEntry = _methodModel.getAccessorVariableFieldEntry(); writeGetterBlock(accessorVariableFieldEntry); - } - else { + } else { writeBlock(_methodModel.getExprHead(), null); } }