DecoderHelper.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. public static float DecodeD20Immediate(long opCode)
  44. {
  45. long imm = opCode.Extract(20, 19);
  46. bool negate = opCode.Extract(56);
  47. imm <<= 44;
  48. if (negate)
  49. {
  50. imm |= 1L << 63;
  51. }
  52. return (float)BitConverter.Int64BitsToDouble(imm);
  53. }
  54. }
  55. }