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);
}
}