DecoderHelper.cs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using System;
  2. namespace Ryujinx.Graphics.Shader.Decoders
  3. {
  4. static class DecoderHelper
  5. {
  6. public static int DecodeS20Immediate(long opCode)
  7. {
  8. int imm = opCode.Extract(20, 19);
  9. bool sign = opCode.Extract(56);
  10. if (sign)
  11. {
  12. imm = (imm << 13) >> 13;
  13. }
  14. return imm;
  15. }
  16. public static int Decode2xF10Immediate(long opCode)
  17. {
  18. int immH0 = opCode.Extract(20, 9);
  19. int immH1 = opCode.Extract(30, 9);
  20. bool negateH0 = opCode.Extract(29);
  21. bool negateH1 = opCode.Extract(56);
  22. if (negateH0)
  23. {
  24. immH0 |= 1 << 9;
  25. }
  26. if (negateH1)
  27. {
  28. immH1 |= 1 << 9;
  29. }
  30. return immH1 << 22 | immH0 << 6;
  31. }
  32. public static float DecodeF20Immediate(long opCode)
  33. {
  34. int imm = opCode.Extract(20, 19);
  35. bool negate = opCode.Extract(56);
  36. imm <<= 12;
  37. if (negate)
  38. {
  39. imm |= 1 << 31;
  40. }
  41. return BitConverter.Int32BitsToSingle(imm);
  42. }
  43. }
  44. }