aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2020-02-13 21:48:07 -0300
committerGitHub <noreply@github.com>2020-02-14 01:48:07 +0100
commit5a9dba0756e3173e3983cad3626e8e876b3c3041 (patch)
treead89503d9e73008327c62a207cec79ef82454ded
parent416ddd0f6e9b5c9e9b3da627cc90c98bb5a3a56b (diff)
Sign-extend shader memory instruction offsets (#934)
-rw-r--r--Ryujinx.Graphics.Shader/Decoders/OpCodeLdc.cs2
-rw-r--r--Ryujinx.Graphics.Shader/Decoders/OpCodeMemory.cs2
-rw-r--r--Ryujinx.Graphics.Shader/Decoders/OpCodeRed.cs2
-rw-r--r--Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs6
4 files changed, 6 insertions, 6 deletions
diff --git a/Ryujinx.Graphics.Shader/Decoders/OpCodeLdc.cs b/Ryujinx.Graphics.Shader/Decoders/OpCodeLdc.cs
index cc9f0658..c18a0a9e 100644
--- a/Ryujinx.Graphics.Shader/Decoders/OpCodeLdc.cs
+++ b/Ryujinx.Graphics.Shader/Decoders/OpCodeLdc.cs
@@ -17,7 +17,7 @@ namespace Ryujinx.Graphics.Shader.Decoders
Rd = new Register(opCode.Extract(0, 8), RegisterType.Gpr);
Ra = new Register(opCode.Extract(8, 8), RegisterType.Gpr);
- Offset = opCode.Extract(22, 14);
+ Offset = (opCode.Extract(20, 16) << 16) >> 16;
Slot = opCode.Extract(36, 5);
Size = (IntegerSize)opCode.Extract(48, 3);
diff --git a/Ryujinx.Graphics.Shader/Decoders/OpCodeMemory.cs b/Ryujinx.Graphics.Shader/Decoders/OpCodeMemory.cs
index bece4562..a0a9c8ca 100644
--- a/Ryujinx.Graphics.Shader/Decoders/OpCodeMemory.cs
+++ b/Ryujinx.Graphics.Shader/Decoders/OpCodeMemory.cs
@@ -18,7 +18,7 @@ namespace Ryujinx.Graphics.Shader.Decoders
Rd = new Register(opCode.Extract(0, 8), RegisterType.Gpr);
Ra = new Register(opCode.Extract(8, 8), RegisterType.Gpr);
- Offset = opCode.Extract(20, 24);
+ Offset = (opCode.Extract(20, 24) << 8) >> 8;
Extended = opCode.Extract(45);
diff --git a/Ryujinx.Graphics.Shader/Decoders/OpCodeRed.cs b/Ryujinx.Graphics.Shader/Decoders/OpCodeRed.cs
index 8fde82a2..2629d289 100644
--- a/Ryujinx.Graphics.Shader/Decoders/OpCodeRed.cs
+++ b/Ryujinx.Graphics.Shader/Decoders/OpCodeRed.cs
@@ -24,7 +24,7 @@ namespace Ryujinx.Graphics.Shader.Decoders
AtomicOp = (AtomicOp)opCode.Extract(23, 3);
- Offset = opCode.Extract(28, 20);
+ Offset = (opCode.Extract(28, 20) << 12) >> 12;
Extended = opCode.Extract(48);
}
diff --git a/Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs b/Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs
index 664c798b..1fddcc8c 100644
--- a/Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs
+++ b/Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs
@@ -138,11 +138,11 @@ namespace Ryujinx.Graphics.Shader.Instructions
int count = op.Size == IntegerSize.B64 ? 2 : 1;
- Operand wordOffset = context.ShiftRightU32(GetSrcA(context), Const(2));
+ Operand addr = context.IAdd(GetSrcA(context), Const(op.Offset));
- wordOffset = context.IAdd(wordOffset, Const(op.Offset));
+ Operand wordOffset = context.ShiftRightU32(addr, Const(2));
- Operand bitOffset = GetBitOffset(context, GetSrcA(context));
+ Operand bitOffset = GetBitOffset(context, addr);
for (int index = 0; index < count; index++)
{