diff options
| author | Mary <me@thog.eu> | 2021-08-27 00:07:44 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-08-27 00:07:44 +0200 |
| commit | 501c3d5cea6b96f991453cc6f8d395d358d0d4c3 (patch) | |
| tree | bb6ba8c0ec94fef280752296e6532c7cfedc9863 /ARMeilleure/Instructions | |
| parent | 8e1adb95cf7f67b976f105f4cac26d3ff2986057 (diff) | |
Implement MSR instruction for A32 (#2585)
* Implement MSR instruction
Fix #1342.
Now Pocket Rumble is playable.
* Address gdkchan's comments
* Address gdkchan's comments
* Address gdkchan's comment
Diffstat (limited to 'ARMeilleure/Instructions')
| -rw-r--r-- | ARMeilleure/Instructions/InstEmitSystem32.cs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/ARMeilleure/Instructions/InstEmitSystem32.cs b/ARMeilleure/Instructions/InstEmitSystem32.cs index 9e28a1a1..3e752659 100644 --- a/ARMeilleure/Instructions/InstEmitSystem32.cs +++ b/ARMeilleure/Instructions/InstEmitSystem32.cs @@ -169,6 +169,45 @@ namespace ARMeilleure.Instructions SetIntA32(context, op.CRn, context.ConvertI64ToI32(context.ShiftRightUI(result, Const(32)))); } + public static void Msr(ArmEmitterContext context) + { + OpCode32MsrReg op = (OpCode32MsrReg)context.CurrOp; + + if (op.R) + { + throw new NotImplementedException("SPSR"); + } + else + { + if ((op.Mask & 8) != 0) + { + Operand value = GetIntA32(context, op.Rn); + + EmitSetNzcv(context, value); + + Operand q = context.ShiftRightUI(value, Const((int)PState.QFlag)); + q = context.BitwiseAnd(q, Const(1)); + + SetFlag(context, PState.QFlag, q); + } + + if ((op.Mask & 4) != 0) + { + throw new NotImplementedException("APSR_g"); + } + + if ((op.Mask & 2) != 0) + { + throw new NotImplementedException("CPSR_x"); + } + + if ((op.Mask & 1) != 0) + { + throw new NotImplementedException("CPSR_c"); + } + } + } + public static void Nop(ArmEmitterContext context) { } public static void Vmrs(ArmEmitterContext context) |
