|
From: <mic...@us...> - 2007-08-08 10:22:43
|
Revision: 162
http://pearcolator.svn.sourceforge.net/pearcolator/?rev=162&view=rev
Author: michael_baer
Date: 2007-08-08 03:22:45 -0700 (Wed, 08 Aug 2007)
Log Message:
-----------
- Compress flag state into a single integer in ARM_Laziness
- Setting blocks as infrequent using profiling information
- Move some platform-specific command line options to DBT_Options
Modified Paths:
--------------
src/org/binarytranslator/DBT_Options.java
src/org/binarytranslator/arch/arm/decoder/ARM2IR.java
src/org/binarytranslator/arch/arm/decoder/ARM_Laziness.java
src/org/binarytranslator/arch/arm/decoder/ARM_Options.java
src/org/binarytranslator/arch/arm/decoder/ARM_Translator.java
src/org/binarytranslator/generic/decoder/CodeTranslator.java
Modified: src/org/binarytranslator/DBT_Options.java
===================================================================
--- src/org/binarytranslator/DBT_Options.java 2007-08-07 22:28:53 UTC (rev 161)
+++ src/org/binarytranslator/DBT_Options.java 2007-08-08 10:22:45 UTC (rev 162)
@@ -13,6 +13,7 @@
import java.util.Map;
import java.util.Map.Entry;
+import org.binarytranslator.arch.arm.decoder.ARM_Options;
import org.binarytranslator.generic.execution.ExecutionController;
/**
@@ -93,12 +94,6 @@
/** Just a temporary variable for testing. It describes, when the staged emulation controller switches from interpretation to translation. */
public static int minTraceValue = 20;
- /** Just a temporary variable for testing. It describes, if the translated program shall be optimized using profiling information. */
- public static boolean optimizeTranslationByProfiling = false;
-
- /** Just a temporary variable for testing. It describes, if the translated program shall be optimized using lazy evaluation.*/
- public static boolean optimizeTranslationByLazyEvaluation = true;
-
/** Print debug information during the translation of instructions. */
public static boolean debugTranslation = true;
@@ -122,7 +117,7 @@
/** Stores the arguments given to the DBT by the user. These are NOT the arguments given to the executable. */
private static HashMap<String, String> dbtArguments = null;
-
+
/** Read and parse the command line arguments. */
public static void parseArguments(String[] args) {
@@ -150,7 +145,7 @@
String value = argument.getValue();
try {
- parseSingleArgument(arg, value);
+ parseSingleOption(arg, value);
}
catch (NumberFormatException e) {
throw new Error("Argument " + arg + " is not a valid integer.");
@@ -162,14 +157,40 @@
}
/** Parses a single argument into the options class. */
- private static void parseSingleArgument(String key, String value) {
+ private static void parseSingleOption(String key, String value) {
- if (!key.startsWith("-X:dbt:")) {
- throw new Error("Invalid argument. Argument prefix '-X:dbt:' expected.");
+ if (!key.startsWith("-X:")) {
+ throw new Error("Invalid argument. Argument prefix '-X:' expected.");
}
- key = key.substring(7);
+ key = key.substring(3);
+
+ if (key.startsWith("dbt:")) {
+ key = key.substring(4);
+
+ parseDbtOption(key, value);
+ }
+ else if (key.startsWith("arm:")) {
+ key = key.substring(4);
+ parseArmOption(key, value);
+ }
+ else {
+ throw new Error("Unknown argument.");
+ }
+ }
+
+ private static void parseArmOption(String key, String value) {
+ if (key.equalsIgnoreCase("optimizeByProfiling")) {
+ ARM_Options.optimizeTranslationByProfiling = Boolean.parseBoolean(value);
+ } else if (key.equalsIgnoreCase("flagBehaviour")) {
+ ARM_Options.flagBehaviour = ARM_Options.FlagBehaviour.valueOf(value);
+ }
+ else {
+ throw new Error("Unknown ARM option: " + key);
+ }
+ }
+ private static void parseDbtOption(String key, String value) {
if (key.equalsIgnoreCase("debugInstr")) {
debugInstr = Boolean.parseBoolean(value);
} else if (key.equalsIgnoreCase("debugRuntime")) {
@@ -206,12 +227,7 @@
saveProfileToFile = value;
} else if (key.equalsIgnoreCase("minTraceValue")) {
minTraceValue = Integer.parseInt(value);
- } else if (key.equalsIgnoreCase("optimizeByProfiling")) {
- optimizeTranslationByProfiling = Boolean.parseBoolean(value);
- } else if (key.equalsIgnoreCase("optimizeByLazy")) {
- optimizeTranslationByLazyEvaluation = Boolean.parseBoolean(value);
}
-
else {
throw new Error("Unknown DBT option: " + key);
}
Modified: src/org/binarytranslator/arch/arm/decoder/ARM2IR.java
===================================================================
--- src/org/binarytranslator/arch/arm/decoder/ARM2IR.java 2007-08-07 22:28:53 UTC (rev 161)
+++ src/org/binarytranslator/arch/arm/decoder/ARM2IR.java 2007-08-08 10:22:45 UTC (rev 162)
@@ -143,10 +143,18 @@
super(context, trace);
translator = new ARM_Translator((ARM_ProcessSpace)ps, this);
- if (DBT_Options.optimizeTranslationByLazyEvaluation)
+ switch (ARM_Options.flagBehaviour) {
+ case ImmediateEvaluation:
+ flagBehavior = new ARM_ImmediateFlagBehavior();
+ break;
+
+ case LazyEvaluation:
flagBehavior = new ARM_LazyFlagBehavior();
- else
- flagBehavior = new ARM_ImmediateFlagBehavior();
+ break;
+
+ default:
+ throw new RuntimeException("Unexpected flag behaviour: " + ARM_Options.flagBehaviour);
+ }
}
/** ARM has an interchangeable flag behavior. Flags can either be evaluated immediately or on demand using
Modified: src/org/binarytranslator/arch/arm/decoder/ARM_Laziness.java
===================================================================
--- src/org/binarytranslator/arch/arm/decoder/ARM_Laziness.java 2007-08-07 22:28:53 UTC (rev 161)
+++ src/org/binarytranslator/arch/arm/decoder/ARM_Laziness.java 2007-08-08 10:22:45 UTC (rev 162)
@@ -13,7 +13,7 @@
}
/** The state of the different ARM flags, compressed as bit fields within an integer. */
- private int flagValid;
+ private int validFlags;
/** The operation that has to be performed to evaluate the remaining registers */
private Operation lazinessOperation;
@@ -36,7 +36,7 @@
ARM_LazinessKey(int pc, ARM_Laziness lazy) {
this.pc = pc;
- int tmpFlagState = lazy.flagValid & 0xF;
+ int tmpFlagState = lazy.validFlags & 0xF;
tmpFlagState |= (lazinessOperation.ordinal() + 1) << 4;
this.flagState = (byte)tmpFlagState;
@@ -48,7 +48,7 @@
}
public ARM_Laziness() {
- flagValid = 0xF; //all flags are valid
+ validFlags = 0xF; //all flags are valid
lazinessOperation = Operation.Add;
}
@@ -57,22 +57,15 @@
}
public void setValid(Flag flag, boolean valid) {
- flagValid |= 1 << flag.ordinal();
+ if (valid)
+ validFlags |= 1 << flag.ordinal();
+ else
+ validFlags &= ~(1 << flag.ordinal());
}
public boolean isValid(Flag flag) {
- return (flagValid & (1 << flag.ordinal())) != 0;
+ return (validFlags & (1 << flag.ordinal())) != 0;
}
-
- public void setAddOperation() {
- flagValid = 0; // all flags are invalid
- lazinessOperation = Operation.Add;
- }
-
- public void setSubOperation() {
- flagValid = 0; // all flags are invalid
- lazinessOperation = Operation.Sub;
- }
public Operation getOperation() {
return lazinessOperation;
@@ -83,7 +76,7 @@
}
public void set(ARM_Laziness other) {
- flagValid = other.flagValid;
+ validFlags = other.validFlags;
lazinessOperation = other.lazinessOperation;
}
@@ -98,7 +91,7 @@
return false;
ARM_Laziness other = (ARM_Laziness)o;
- return flagValid == other.flagValid && lazinessOperation == other.lazinessOperation;
+ return validFlags == other.validFlags && lazinessOperation == other.lazinessOperation;
}
@Override
Modified: src/org/binarytranslator/arch/arm/decoder/ARM_Options.java
===================================================================
--- src/org/binarytranslator/arch/arm/decoder/ARM_Options.java 2007-08-07 22:28:53 UTC (rev 161)
+++ src/org/binarytranslator/arch/arm/decoder/ARM_Options.java 2007-08-08 10:22:45 UTC (rev 162)
@@ -1,5 +1,18 @@
package org.binarytranslator.arch.arm.decoder;
public class ARM_Options {
+
+ public enum FlagBehaviour {
+ LazyEvaluation,
+ ImmediateEvaluation
+ }
+
+ /** Set to true to enable a fastpath for the decoding of data processing instructions.. */
public final static boolean DATAPROCESSING_DECODER_FASTPATH = false;
+
+ /** This variable describes, if the translated program shall be optimized using profiling information. */
+ public static boolean optimizeTranslationByProfiling = false;
+
+ /** This variable describes, if the translated program shall be optimized using lazy evaluation.*/
+ public static FlagBehaviour flagBehaviour = FlagBehaviour.LazyEvaluation;
}
Modified: src/org/binarytranslator/arch/arm/decoder/ARM_Translator.java
===================================================================
--- src/org/binarytranslator/arch/arm/decoder/ARM_Translator.java 2007-08-07 22:28:53 UTC (rev 161)
+++ src/org/binarytranslator/arch/arm/decoder/ARM_Translator.java 2007-08-08 10:22:45 UTC (rev 162)
@@ -761,7 +761,7 @@
*/
private float getSkipProbability() {
- if (DBT_Options.optimizeTranslationByProfiling)
+ if (ARM_Options.optimizeTranslationByProfiling)
return -1f;
return ps.branchInfo.getBranchProbability(pc, pc + (inThumb() ? 2 : 4));
@@ -922,7 +922,7 @@
conditionalInstruction.translate();
int followingInstructionAddress = pc + (inThumb() ? 2 : 4);
-
+
//yes it did, so we may need to translate the successor instruction twice
if (assumeInstructionWillBeSkipped()) {
@@ -935,16 +935,27 @@
lazy.set(lazinessWhenInstructionSkipped);
}
+ condInstructionBlock.setInfrequent();
+ nextInstruction_InstructionNotSkipped.setInfrequent();
arm2ir.setNextBlock(nextInstruction_InstructionSkipped);
-
}
else {
- //Modify block 4 so that it resolves the different laziness correctly
- arm2ir.setCurrentBlock(nextInstruction_InstructionSkipped);
- nextInstruction_InstructionSkipped.deleteNormalOut();
- arm2ir.appendBranch(followingInstructionAddress, lazinessWhenInstructionSkipped);
-
- arm2ir.setNextBlock(nextInstruction_InstructionNotSkipped);
+ if (lazy.equivalent(lazinessWhenInstructionSkipped) && conditionalInstruction.getSuccessor(pc) == followingInstructionAddress) {
+ //the conditional instruction does not change the lazy state, nor does it change the program flow
+ //therefore, we block 3 and block 4 always execute the same code. We might as well continue with block 4 then.
+ arm2ir.setNextBlock(nextInstruction_InstructionSkipped);
+ }
+ else {
+ //we can assume that the instruction will rarely be skipped
+ nextInstruction_InstructionSkipped.setInfrequent();
+
+ //Modify block 4 so that it resolves the code the be executed if the instruction was skipped
+ arm2ir.setCurrentBlock(nextInstruction_InstructionSkipped);
+ nextInstruction_InstructionSkipped.deleteNormalOut();
+ arm2ir.appendBranch(followingInstructionAddress, lazinessWhenInstructionSkipped);
+
+ arm2ir.setNextBlock(nextInstruction_InstructionNotSkipped);
+ }
}
}
Modified: src/org/binarytranslator/generic/decoder/CodeTranslator.java
===================================================================
--- src/org/binarytranslator/generic/decoder/CodeTranslator.java 2007-08-07 22:28:53 UTC (rev 161)
+++ src/org/binarytranslator/generic/decoder/CodeTranslator.java 2007-08-08 10:22:45 UTC (rev 162)
@@ -754,7 +754,7 @@
DBT_Trace compiledTrace = ps.codeCache.tryGet(targetPc);
return DBT_Options.singleInstrTranslation == false
- && (compiledTrace == null || compiledTrace.getNumberOfInstructions() > 20) && !shallTraceStop()
+ && (compiledTrace == null || compiledTrace.getNumberOfInstructions() > 30) && !shallTraceStop()
&& jump.type != BranchType.CALL && jump.type != BranchType.RETURN;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|