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. |