Author: luc
Date: Tue Oct 2 09:36:30 2012
New Revision: 1392813
URL: http://svn.apache.org/viewvc?rev=1392813&view=rev
Log:
Avoid using an additional local variable for computing remainder.
Modified:
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DRemTransformer.java
Modified:
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DRemTransformer.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DRemTransformer.java?rev=1392813&r1=1392812&r2=1392813&view=diff
==============================================================================
---
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DRemTransformer.java
(original)
+++
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DRemTransformer.java
Tue Oct 2 09:36:30 2012
@@ -25,7 +25,6 @@ import org.objectweb.asm.tree.AbstractIn
import org.objectweb.asm.tree.InsnList;
import org.objectweb.asm.tree.InsnNode;
import org.objectweb.asm.tree.MethodInsnNode;
-import org.objectweb.asm.tree.VarInsnNode;
/** Differentiation transformer for DREM instructions.
* @version $Id$
@@ -41,8 +40,11 @@ public class DRemTransformer implements
/** Name of the {@link
org.apache.commons.math3.analysis.differentiation.DerivativeStructure} method
corresponding to the multiplication. */
private static final String MULTIPLY_METHOD = "multiply";
- /** Name of the {@link
org.apache.commons.math3.analysis.differentiation.DerivativeStructure} method
corresponding to the addition. */
- private static final String ADD_METHOD = "add";
+ /** Name of the {@link
org.apache.commons.math3.analysis.differentiation.DerivativeStructure} method
corresponding to the subtraction. */
+ private static final String SUBTRACT_METHOD = "subtract";
+
+ /** Name of the {@link
org.apache.commons.math3.analysis.differentiation.DerivativeStructure} method
corresponding to the negation. */
+ private static final String NEGATE_METHOD = "negate";
/** Indicator for top stack element conversion. */
private final boolean stack0Converted;
@@ -78,34 +80,38 @@ public class DRemTransformer implements
}
} else {
- // set up a temporary variable
- final int tmp1 = methodDifferentiator.getTmp(1);
-
// operand stack initial state: a, ds_b
list.add(new InsnNode(Opcodes.DUP_X2));
// => ds_b, a, ds_b
list.add(new InsnNode(Opcodes.POP));
// => ds_b, a
- list.add(new VarInsnNode(Opcodes.DSTORE, tmp1));
// => ds_b
- list.add(new InsnNode(Opcodes.DUP));
// => ds_b, ds_b
+ list.add(new InsnNode(Opcodes.DUP2_X1));
// => a, ds_b, a
+ list.add(new InsnNode(Opcodes.DUP2_X1));
// => a, a, ds_b, a
+ list.add(new InsnNode(Opcodes.POP2));
// => a, a, ds_b
+ list.add(new InsnNode(Opcodes.DUP_X2));
// => a, ds_b, a, ds_b
list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL,
DS_TYPE.getInternalName(),
VALUE_GETTER_METHOD,
-
Type.getMethodDescriptor(Type.DOUBLE_TYPE))); // => ds_b, b0
- list.add(new InsnNode(Opcodes.DUP2));
// => ds_b, b0, b0
- list.add(new VarInsnNode(Opcodes.DLOAD, tmp1));
// => ds_b, b0, b0, a
- list.add(new InsnNode(Opcodes.DUP2_X2));
// => ds_b, b0, a, b0, a
- list.add(new InsnNode(Opcodes.POP2));
// => ds_b, b0, a, b0
- list.add(new InsnNode(Opcodes.DREM));
// => ds_b, b0, a%b0
- list.add(new VarInsnNode(Opcodes.DLOAD, tmp1));
// => ds_b, b0, a%b0, a
- list.add(new InsnNode(Opcodes.DSUB));
// => ds_b, b0, a%b0-a
- list.add(new InsnNode(Opcodes.DUP2_X2));
// => ds_b, a%b0-a, b0, a%b0-a
- list.add(new InsnNode(Opcodes.POP2));
// => ds_b, a%b0-a, b0
- list.add(new InsnNode(Opcodes.DDIV));
// => ds_b, q=(a%b0-a)/b0
+
Type.getMethodDescriptor(Type.DOUBLE_TYPE))); // => a, ds_b, a, b0
+ list.add(new InsnNode(Opcodes.DUP2_X2));
// => a, ds_b, b0, a, b0
+ list.add(new InsnNode(Opcodes.DUP2_X2));
// => a, ds_b, b0, b0, a, b0
+ list.add(new InsnNode(Opcodes.POP2));
// => a, ds_b, b0, b0, a
+ list.add(new InsnNode(Opcodes.DUP2_X2));
// => a, ds_b, b0, a, b0, a
+ list.add(new InsnNode(Opcodes.DUP2_X2));
// => a, ds_b, b0, a, a, b0, a
+ list.add(new InsnNode(Opcodes.POP2));
// => a, ds_b, b0, a, a, b0
+ list.add(new InsnNode(Opcodes.DREM));
// => a, ds_b, b0, a, a%b0
+ list.add(new InsnNode(Opcodes.DSUB));
// => a, ds_b, b0, a-a%b0
+ list.add(new InsnNode(Opcodes.DUP2_X2));
// => a, ds_b, a-a%b0, b0, a-a%b0
+ list.add(new InsnNode(Opcodes.POP2));
// => a, ds_b, a-a%b0, b0
+ list.add(new InsnNode(Opcodes.DDIV));
// => a, ds_b, q=(a-a%b0)/b0
list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL,
DS_TYPE.getInternalName(),
MULTIPLY_METHOD,
- Type.getMethodDescriptor(DS_TYPE,
Type.DOUBLE_TYPE))); // => q*b
- list.add(new VarInsnNode(Opcodes.DLOAD, tmp1));
// => q*b, a
+ Type.getMethodDescriptor(DS_TYPE,
Type.DOUBLE_TYPE))); // => a, q*ds_b
+ list.add(new InsnNode(Opcodes.DUP_X2));
// => q*ds_b, a, q*ds_b
+ list.add(new InsnNode(Opcodes.POP));
// => q*ds_b, a
+ list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL,
DS_TYPE.getInternalName(),
+ SUBTRACT_METHOD,
+ Type.getMethodDescriptor(DS_TYPE,
Type.DOUBLE_TYPE))); // => q*ds_b-a
list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL,
DS_TYPE.getInternalName(),
- ADD_METHOD,
- Type.getMethodDescriptor(DS_TYPE,
Type.DOUBLE_TYPE))); // => a+q*b
+ NEGATE_METHOD,
+ Type.getMethodDescriptor(DS_TYPE)));
// => a-q*ds_b
}