Sign-extend shader memory instruction offsets (#934)

This commit is contained in:
gdkchan 2020-02-13 21:48:07 -03:00 committed by GitHub
parent 416ddd0f6e
commit 5a9dba0756
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 6 additions and 6 deletions

View file

@ -17,7 +17,7 @@ namespace Ryujinx.Graphics.Shader.Decoders
Rd = new Register(opCode.Extract(0, 8), RegisterType.Gpr); Rd = new Register(opCode.Extract(0, 8), RegisterType.Gpr);
Ra = new Register(opCode.Extract(8, 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); Slot = opCode.Extract(36, 5);
Size = (IntegerSize)opCode.Extract(48, 3); Size = (IntegerSize)opCode.Extract(48, 3);

View file

@ -18,7 +18,7 @@ namespace Ryujinx.Graphics.Shader.Decoders
Rd = new Register(opCode.Extract(0, 8), RegisterType.Gpr); Rd = new Register(opCode.Extract(0, 8), RegisterType.Gpr);
Ra = new Register(opCode.Extract(8, 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); Extended = opCode.Extract(45);

View file

@ -24,7 +24,7 @@ namespace Ryujinx.Graphics.Shader.Decoders
AtomicOp = (AtomicOp)opCode.Extract(23, 3); AtomicOp = (AtomicOp)opCode.Extract(23, 3);
Offset = opCode.Extract(28, 20); Offset = (opCode.Extract(28, 20) << 12) >> 12;
Extended = opCode.Extract(48); Extended = opCode.Extract(48);
} }

View file

@ -138,11 +138,11 @@ namespace Ryujinx.Graphics.Shader.Instructions
int count = op.Size == IntegerSize.B64 ? 2 : 1; 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++) for (int index = 0; index < count; index++)
{ {