Initial support for double precision shader instructions. (#963)
* Implement DADD, DFMA and DMUL shader instructions * Rename FP to FP32 * Correct double immediate * Classic mistake
This commit is contained in:
parent
3045c1a186
commit
dc97457bf0
19 changed files with 428 additions and 184 deletions
|
@ -54,5 +54,21 @@ namespace Ryujinx.Graphics.Shader.Decoders
|
|||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,3 +1,5 @@
|
|||
using Ryujinx.Graphics.Shader.IntermediateRepresentation;
|
||||
|
||||
namespace Ryujinx.Graphics.Shader.Decoders
|
||||
{
|
||||
enum FPType
|
||||
|
@ -6,4 +8,12 @@ namespace Ryujinx.Graphics.Shader.Decoders
|
|||
FP32 = 2,
|
||||
FP64 = 3
|
||||
}
|
||||
|
||||
static class FPTypeExtensions
|
||||
{
|
||||
public static Instruction ToInstFPType(this FPType type)
|
||||
{
|
||||
return type == FPType.FP64 ? Instruction.FP64 : Instruction.FP32;
|
||||
}
|
||||
}
|
||||
}
|
14
Ryujinx.Graphics.Shader/Decoders/OpCodeDArithImm.cs
Normal file
14
Ryujinx.Graphics.Shader/Decoders/OpCodeDArithImm.cs
Normal file
|
@ -0,0 +1,14 @@
|
|||
using Ryujinx.Graphics.Shader.Instructions;
|
||||
|
||||
namespace Ryujinx.Graphics.Shader.Decoders
|
||||
{
|
||||
class OpCodeDArithImm : OpCodeFArith, IOpCodeImmF
|
||||
{
|
||||
public float Immediate { get; }
|
||||
|
||||
public OpCodeDArithImm(InstEmitter emitter, ulong address, long opCode) : base(emitter, address, opCode)
|
||||
{
|
||||
Immediate = DecoderHelper.DecodeD20Immediate(opCode);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -45,6 +45,16 @@ namespace Ryujinx.Graphics.Shader.Decoders
|
|||
Set("111000110100xx", InstEmit.Brk, typeof(OpCodeBranchPop));
|
||||
Set("111000100101xx", InstEmit.Brx, typeof(OpCodeBranchIndir));
|
||||
Set("0101000010100x", InstEmit.Csetp, typeof(OpCodePset));
|
||||
Set("0100110001110x", InstEmit.Dadd, typeof(OpCodeFArithCbuf));
|
||||
Set("0011100x01110x", InstEmit.Dadd, typeof(OpCodeDArithImm));
|
||||
Set("0101110001110x", InstEmit.Dadd, typeof(OpCodeFArithReg));
|
||||
Set("010010110111xx", InstEmit.Dfma, typeof(OpCodeFArithCbuf));
|
||||
Set("0011011x0111xx", InstEmit.Dfma, typeof(OpCodeDArithImm));
|
||||
Set("010100110111xx", InstEmit.Dfma, typeof(OpCodeFArithRegCbuf));
|
||||
Set("010110110111xx", InstEmit.Dfma, typeof(OpCodeFArithReg));
|
||||
Set("0100110010000x", InstEmit.Dmul, typeof(OpCodeFArithCbuf));
|
||||
Set("0011100x10000x", InstEmit.Dmul, typeof(OpCodeDArithImm));
|
||||
Set("0101110010000x", InstEmit.Dmul, typeof(OpCodeFArithReg));
|
||||
Set("111000110000xx", InstEmit.Exit, typeof(OpCodeExit));
|
||||
Set("0100110010101x", InstEmit.F2F, typeof(OpCodeFArithCbuf));
|
||||
Set("0011100x10101x", InstEmit.F2F, typeof(OpCodeFArithImm));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue