OpCode32SimdCvtTB.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. namespace ARMeilleure.Decoders
  2. {
  3. class OpCode32SimdCvtTB : OpCode32, IOpCode32Simd
  4. {
  5. public int Vd { get; }
  6. public int Vm { get; }
  7. public bool Op { get; } // Convert to Half / Convert from Half
  8. public bool T { get; } // Top / Bottom
  9. public int Size { get; } // Double / Single
  10. public new static OpCode Create(InstDescriptor inst, ulong address, int opCode) => new OpCode32SimdCvtTB(inst, address, opCode, false);
  11. public static OpCode CreateT32(InstDescriptor inst, ulong address, int opCode) => new OpCode32SimdCvtTB(inst, address, opCode, true);
  12. public OpCode32SimdCvtTB(InstDescriptor inst, ulong address, int opCode, bool isThumb) : base(inst, address, opCode)
  13. {
  14. IsThumb = isThumb;
  15. Op = ((opCode >> 16) & 0x1) != 0;
  16. T = ((opCode >> 7) & 0x1) != 0;
  17. Size = ((opCode >> 8) & 0x1);
  18. RegisterSize = Size == 1 ? RegisterSize.Int64 : RegisterSize.Int32;
  19. if (Size == 1)
  20. {
  21. if (Op)
  22. {
  23. Vm = ((opCode >> 1) & 0x10) | ((opCode >> 0) & 0xf);
  24. Vd = ((opCode >> 22) & 0x1) | ((opCode >> 11) & 0x1e);
  25. }
  26. else
  27. {
  28. Vm = ((opCode >> 5) & 0x1) | ((opCode << 1) & 0x1e);
  29. Vd = ((opCode >> 18) & 0x10) | ((opCode >> 12) & 0xf);
  30. }
  31. }
  32. else
  33. {
  34. Vm = ((opCode >> 5) & 0x1) | ((opCode << 1) & 0x1e);
  35. Vd = ((opCode >> 22) & 0x1) | ((opCode >> 11) & 0x1e);
  36. }
  37. }
  38. }
  39. }