diff options
Diffstat (limited to 'ARMeilleure/Translation')
| -rw-r--r-- | ARMeilleure/Translation/ArmEmitterContext.cs | 19 | ||||
| -rw-r--r-- | ARMeilleure/Translation/Translator.cs | 12 |
2 files changed, 31 insertions, 0 deletions
diff --git a/ARMeilleure/Translation/ArmEmitterContext.cs b/ARMeilleure/Translation/ArmEmitterContext.cs index 6d02728c..33355dae 100644 --- a/ARMeilleure/Translation/ArmEmitterContext.cs +++ b/ARMeilleure/Translation/ArmEmitterContext.cs @@ -54,6 +54,11 @@ namespace ARMeilleure.Translation public bool HighCq { get; } public Aarch32Mode Mode { get; } + private int _ifThenBlockStateIndex = 0; + private Condition[] _ifThenBlockState = { }; + public bool IsInIfThenBlock => _ifThenBlockStateIndex < _ifThenBlockState.Length; + public Condition CurrentIfThenBlockCond => _ifThenBlockState[_ifThenBlockStateIndex]; + public ArmEmitterContext( IMemoryManager memory, EntryTable<uint> countTable, @@ -196,5 +201,19 @@ namespace ARMeilleure.Translation return default; } + + public void SetIfThenBlockState(Condition[] state) + { + _ifThenBlockState = state; + _ifThenBlockStateIndex = 0; + } + + public void AdvanceIfThenBlockState() + { + if (IsInIfThenBlock) + { + _ifThenBlockStateIndex++; + } + } } }
\ No newline at end of file diff --git a/ARMeilleure/Translation/Translator.cs b/ARMeilleure/Translation/Translator.cs index 9974fb2d..4962a846 100644 --- a/ARMeilleure/Translation/Translator.cs +++ b/ARMeilleure/Translation/Translator.cs @@ -380,6 +380,13 @@ namespace ARMeilleure.Translation Operand lblPredicateSkip = default; + if (context.IsInIfThenBlock && context.CurrentIfThenBlockCond != Condition.Al) + { + lblPredicateSkip = Label(); + + InstEmitFlowHelper.EmitCondBranch(context, lblPredicateSkip, context.CurrentIfThenBlockCond.Invert()); + } + if (opCode is OpCode32 op && op.Cond < Condition.Al) { lblPredicateSkip = Label(); @@ -400,6 +407,11 @@ namespace ARMeilleure.Translation { context.MarkLabel(lblPredicateSkip); } + + if (context.IsInIfThenBlock && opCode.Instruction.Name != InstName.It) + { + context.AdvanceIfThenBlockState(); + } } } } |
