OpCodeAluImm64.cs 948 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. using ChocolArm64.Instructions;
  2. using System;
  3. namespace ChocolArm64.Decoders
  4. {
  5. class OpCodeAluImm64 : OpCodeAlu64, IOpCodeAluImm64
  6. {
  7. public long Imm { get; private set; }
  8. public OpCodeAluImm64(Inst inst, long position, int opCode) : base(inst, position, opCode)
  9. {
  10. if (DataOp == DataOp.Arithmetic)
  11. {
  12. Imm = (opCode >> 10) & 0xfff;
  13. int shift = (opCode >> 22) & 3;
  14. Imm <<= shift * 12;
  15. }
  16. else if (DataOp == DataOp.Logical)
  17. {
  18. var bm = DecoderHelper.DecodeBitMask(opCode, true);
  19. if (bm.IsUndefined)
  20. {
  21. Emitter = InstEmit.Und;
  22. return;
  23. }
  24. Imm = bm.WMask;
  25. }
  26. else
  27. {
  28. throw new ArgumentException(nameof(opCode));
  29. }
  30. }
  31. }
  32. }