OpCode32BImm.cs 813 B

1234567891011121314151617181920212223242526272829
  1. namespace ARMeilleure.Decoders
  2. {
  3. class OpCode32BImm : OpCode32, IOpCode32BImm
  4. {
  5. public long Immediate { get; }
  6. public new static OpCode Create(InstDescriptor inst, ulong address, int opCode) => new OpCode32BImm(inst, address, opCode);
  7. public OpCode32BImm(InstDescriptor inst, ulong address, int opCode) : base(inst, address, opCode)
  8. {
  9. uint pc = GetPc();
  10. // When the condition is never, the instruction is BLX to Thumb mode.
  11. if (Cond != Condition.Nv)
  12. {
  13. pc &= ~3u;
  14. }
  15. Immediate = pc + DecoderHelper.DecodeImm24_2(opCode);
  16. if (Cond == Condition.Nv)
  17. {
  18. long H = (opCode >> 23) & 2;
  19. Immediate |= H;
  20. }
  21. }
  22. }
  23. }