| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- using System;
- namespace Ryujinx.Graphics.Shader.Decoders
- {
- static class DecoderHelper
- {
- public static int DecodeS20Immediate(long opCode)
- {
- int imm = opCode.Extract(20, 19);
- bool sign = opCode.Extract(56);
- if (sign)
- {
- imm = (imm << 13) >> 13;
- }
- return imm;
- }
- public static int Decode2xF10Immediate(long opCode)
- {
- int immH0 = opCode.Extract(20, 9);
- int immH1 = opCode.Extract(30, 9);
- bool negateH0 = opCode.Extract(29);
- bool negateH1 = opCode.Extract(56);
- if (negateH0)
- {
- immH0 |= 1 << 9;
- }
- if (negateH1)
- {
- immH1 |= 1 << 9;
- }
- return immH1 << 22 | immH0 << 6;
- }
- public static float DecodeF20Immediate(long opCode)
- {
- int imm = opCode.Extract(20, 19);
- bool negate = opCode.Extract(56);
- imm <<= 12;
- if (negate)
- {
- imm |= 1 << 31;
- }
- return BitConverter.Int32BitsToSingle(imm);
- }
- public static float DecodeD20Immediate(long opCode)
- {
- long imm = opCode.Extract(20, 19);
- bool negate = opCode.Extract(56);
- imm <<= 44;
- if (negate)
- {
- imm |= 1L << 63;
- }
- return (float)BitConverter.Int64BitsToDouble(imm);
- }
- }
- }
|