diff options
author | merry <git@mary.rs> | 2022-02-22 14:11:42 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-22 11:11:42 -0300 |
commit | dc063eac8330da0b18f0f76c7c9c0e484fa10c56 (patch) | |
tree | 9207cf611ba077ffeffaddcbc2ec7585dd337e62 /ARMeilleure/Decoders/Decoder.cs | |
parent | ccf23fc6295dab55bf49823484b34eb1721f6a50 (diff) |
ARMeilleure: Implement single stepping (#3133)1.1.50
* Decoder: Implement SingleInstruction decoder mode
* Translator: Implement Step
* DecoderMode: Rename Normal to MultipleBlocks
Diffstat (limited to 'ARMeilleure/Decoders/Decoder.cs')
-rw-r--r-- | ARMeilleure/Decoders/Decoder.cs | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/ARMeilleure/Decoders/Decoder.cs b/ARMeilleure/Decoders/Decoder.cs index 46774f41..e4839bf7 100644 --- a/ARMeilleure/Decoders/Decoder.cs +++ b/ARMeilleure/Decoders/Decoder.cs @@ -18,7 +18,7 @@ namespace ARMeilleure.Decoders // For lower code quality translation, we set a lower limit since we're blocking execution. private const int MaxInstsPerFunctionLowCq = 500; - public static Block[] Decode(IMemoryManager memory, ulong address, ExecutionMode mode, bool highCq, bool singleBlock) + public static Block[] Decode(IMemoryManager memory, ulong address, ExecutionMode mode, bool highCq, DecoderMode dMode) { List<Block> blocks = new List<Block>(); @@ -38,7 +38,7 @@ namespace ARMeilleure.Decoders { block = new Block(blkAddress); - if ((singleBlock && visited.Count >= 1) || opsCount > instructionLimit || !memory.IsMapped(blkAddress)) + if ((dMode != DecoderMode.MultipleBlocks && visited.Count >= 1) || opsCount > instructionLimit || !memory.IsMapped(blkAddress)) { block.Exit = true; block.EndAddress = blkAddress; @@ -96,6 +96,12 @@ namespace ARMeilleure.Decoders } } + if (dMode == DecoderMode.SingleInstruction) + { + // Only read at most one instruction + limitAddress = currBlock.Address + 1; + } + FillBlock(memory, mode, currBlock, limitAddress); opsCount += currBlock.OpCodes.Count; @@ -143,7 +149,7 @@ namespace ARMeilleure.Decoders throw new InvalidOperationException($"Decoded a single empty exit block. Entry point = 0x{address:X}."); } - if (!singleBlock) + if (dMode == DecoderMode.MultipleBlocks) { return TailCallRemover.RunPass(address, blocks); } |