Просмотр исходного кода

Fix mode and Reg08.H1 decoding on XMAD instruction (#1156)

gdkchan 6 лет назад
Родитель
Сommit
1c9aba6de1
1 измененных файлов с 11 добавлено и 12 удалено
  1. 11 12
      Ryujinx.Graphics.Shader/Instructions/InstEmitAlu.cs

+ 11 - 12
Ryujinx.Graphics.Shader/Instructions/InstEmitAlu.cs

@@ -598,24 +598,23 @@ namespace Ryujinx.Graphics.Shader.Instructions
             bool signedA = context.CurrOp.RawOpCode.Extract(48);
             bool signedB = context.CurrOp.RawOpCode.Extract(49);
             bool highA   = context.CurrOp.RawOpCode.Extract(53);
-            bool highB   = false;
 
-            XmadCMode mode;
+            bool isReg = (op is OpCodeAluReg) && !(op is OpCodeAluRegCbuf);
+            bool isImm = (op is OpCodeAluImm);
 
-            if (op is OpCodeAluReg)
+            XmadCMode mode = isReg || isImm
+                ? (XmadCMode)context.CurrOp.RawOpCode.Extract(50, 3)
+                : (XmadCMode)context.CurrOp.RawOpCode.Extract(50, 2);
+
+            bool highB = false;
+
+            if (isReg)
             {
                 highB = context.CurrOp.RawOpCode.Extract(35);
-
-                mode = (XmadCMode)context.CurrOp.RawOpCode.Extract(50, 3);
             }
-            else
+            else if (!isImm)
             {
-                mode = (XmadCMode)context.CurrOp.RawOpCode.Extract(50, 2);
-
-                if (!(op is OpCodeAluImm))
-                {
-                    highB = context.CurrOp.RawOpCode.Extract(52);
-                }
+                highB = context.CurrOp.RawOpCode.Extract(52);
             }
 
             Operand srcA = GetSrcA(context);