AOpCodeAluImm.cs 983 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  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. //Assert Shift < 2
  15. Imm <<= Shift * 12;
  16. }
  17. else if (DataOp == ADataOp.Logical)
  18. {
  19. var BM = ADecoderHelper.DecodeBitMask(OpCode, true);
  20. if (BM.IsUndefined)
  21. {
  22. Emitter = AInstEmit.Und;
  23. return;
  24. }
  25. Imm = BM.WMask;
  26. }
  27. else
  28. {
  29. throw new ArgumentException(nameof(OpCode));
  30. }
  31. }
  32. }
  33. }