diff --git a/Ryujinx.Graphics.Shader/Decoders/OpCodeLdc.cs b/Ryujinx.Graphics.Shader/Decoders/OpCodeLdc.cs
index cc9f065828..c18a0a9efd 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 bece456223..a0a9c8cacc 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 8fde82a260..2629d2899f 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 664c798b86..1fddcc8cac 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++)
             {