| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- using ChocolArm64.Decoder;
- using ChocolArm64.Decoder32;
- using ChocolArm64.Memory;
- using ChocolArm64.State;
- using static ChocolArm64.Instruction32.A32InstInterpretHelper;
- namespace ChocolArm64.Instruction32
- {
- static partial class A32InstInterpret
- {
- public static void B(AThreadState State, AMemory Memory, AOpCode OpCode)
- {
- A32OpCodeBImmAl Op = (A32OpCodeBImmAl)OpCode;
- if (IsConditionTrue(State, Op.Cond))
- {
- BranchWritePc(State, GetPc(State) + (uint)Op.Imm);
- }
- }
- public static void Bl(AThreadState State, AMemory Memory, AOpCode OpCode)
- {
- Blx(State, Memory, OpCode, false);
- }
- public static void Blx(AThreadState State, AMemory Memory, AOpCode OpCode)
- {
- Blx(State, Memory, OpCode, true);
- }
- public static void Blx(AThreadState State, AMemory Memory, AOpCode OpCode, bool X)
- {
- A32OpCodeBImmAl Op = (A32OpCodeBImmAl)OpCode;
- if (IsConditionTrue(State, Op.Cond))
- {
- uint Pc = GetPc(State);
- if (State.Thumb)
- {
- State.R14 = Pc | 1;
- }
- else
- {
- State.R14 = Pc - 4U;
- }
- if (X)
- {
- State.Thumb = !State.Thumb;
- }
- if (!State.Thumb)
- {
- Pc &= ~3U;
- }
- BranchWritePc(State, Pc + (uint)Op.Imm);
- }
- }
- private static void BranchWritePc(AThreadState State, uint Pc)
- {
- State.R15 = State.Thumb
- ? Pc & ~1U
- : Pc & ~3U;
- }
- }
- }
|