AOpCodeAluImm.cs 947 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. using ChocolArm64.Instruction;
  2. using System;
  3. namespace ChocolArm64.Decoder
  4. {
  5. class AOpCodeAluImm : AOpCodeAlu, IAOpCodeAluImm
  6. {
  7. public long Imm { get; private set; }
  8. public AOpCodeAluImm(AInst Inst, long Position, int OpCode) : base(Inst, Position, OpCode)
  9. {
  10. if (DataOp == ADataOp.Arithmetic)
  11. {
  12. Imm = (OpCode >> 10) & 0xfff;
  13. int Shift = (OpCode >> 22) & 3;
  14. Imm <<= Shift * 12;
  15. }
  16. else if (DataOp == ADataOp.Logical)
  17. {
  18. var BM = ADecoderHelper.DecodeBitMask(OpCode, true);
  19. if (BM.IsUndefined)
  20. {
  21. Emitter = AInstEmit.Und;
  22. return;
  23. }
  24. Imm = BM.WMask;
  25. }
  26. else
  27. {
  28. throw new ArgumentException(nameof(OpCode));
  29. }
  30. }
  31. }
  32. }