aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Tests
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Tests')
-rw-r--r--src/Ryujinx.Tests/Cpu/CpuTestAlu32.cs54
-rw-r--r--src/Ryujinx.Tests/Cpu/CpuTestSimd32.cs26
-rw-r--r--src/Ryujinx.Tests/Cpu/CpuTestSimdReg32.cs33
-rw-r--r--src/Ryujinx.Tests/Cpu/CpuTestSimdShImm32.cs36
4 files changed, 148 insertions, 1 deletions
diff --git a/src/Ryujinx.Tests/Cpu/CpuTestAlu32.cs b/src/Ryujinx.Tests/Cpu/CpuTestAlu32.cs
index 41365c62..132ddfd0 100644
--- a/src/Ryujinx.Tests/Cpu/CpuTestAlu32.cs
+++ b/src/Ryujinx.Tests/Cpu/CpuTestAlu32.cs
@@ -25,6 +25,24 @@ namespace Ryujinx.Tests.Cpu
};
}
+ private static uint[] UQAddSub16()
+ {
+ return new[]
+ {
+ 0xe6600f10u, // UQADD16 R0, R0, R0
+ 0xe6600f70u, // UQSUB16 R0, R0, R0
+ };
+ }
+
+ private static uint[] UQAddSub8()
+ {
+ return new[]
+ {
+ 0xe6600f90u, // UQADD8 R0, R0, R0
+ 0xe6600ff0u, // UQSUB8 R0, R0, R0
+ };
+ }
+
private static uint[] SsatUsat()
{
return new[]
@@ -183,6 +201,42 @@ namespace Ryujinx.Tests.Cpu
}
[Test, Pairwise]
+ public void U_Q_AddSub_16([ValueSource(nameof(UQAddSub16))] uint opcode,
+ [Values(0u, 0xdu)] uint rd,
+ [Values(1u)] uint rm,
+ [Values(2u)] uint rn,
+ [Random(RndCnt)] uint w0,
+ [Random(RndCnt)] uint w1,
+ [Random(RndCnt)] uint w2)
+ {
+ opcode |= ((rm & 15) << 0) | ((rd & 15) << 12) | ((rn & 15) << 16);
+
+ uint sp = TestContext.CurrentContext.Random.NextUInt();
+
+ SingleOpcode(opcode, r0: w0, r1: w1, r2: w2, sp: sp);
+
+ CompareAgainstUnicorn();
+ }
+
+ [Test, Pairwise]
+ public void U_Q_AddSub_8([ValueSource(nameof(UQAddSub8))] uint opcode,
+ [Values(0u, 0xdu)] uint rd,
+ [Values(1u)] uint rm,
+ [Values(2u)] uint rn,
+ [Random(RndCnt)] uint w0,
+ [Random(RndCnt)] uint w1,
+ [Random(RndCnt)] uint w2)
+ {
+ opcode |= ((rm & 15) << 0) | ((rd & 15) << 12) | ((rn & 15) << 16);
+
+ uint sp = TestContext.CurrentContext.Random.NextUInt();
+
+ SingleOpcode(opcode, r0: w0, r1: w1, r2: w2, sp: sp);
+
+ CompareAgainstUnicorn();
+ }
+
+ [Test, Pairwise]
public void Uadd8_Sel([Values(0u)] uint rd,
[Values(1u)] uint rm,
[Values(2u)] uint rn,
diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimd32.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimd32.cs
index 6087a683..f843fd56 100644
--- a/src/Ryujinx.Tests/Cpu/CpuTestSimd32.cs
+++ b/src/Ryujinx.Tests/Cpu/CpuTestSimd32.cs
@@ -327,6 +327,32 @@ namespace Ryujinx.Tests.Cpu
CompareAgainstUnicorn();
}
+
+ [Test, Pairwise, Description("VSWP D0, D0")]
+ public void Vswp([Values(0u, 1u)] uint rd,
+ [Values(0u, 1u)] uint rm,
+ [Values] bool q)
+ {
+ uint opcode = 0xf3b20000u; // VSWP D0, D0
+
+ if (q)
+ {
+ opcode |= 1u << 6;
+
+ rd &= ~1u;
+ rm &= ~1u;
+ }
+
+ opcode |= ((rd & 0xf) << 12) | ((rd & 0x10) << 18);
+ opcode |= ((rm & 0xf) << 0) | ((rm & 0x10) << 1);
+
+ V128 v0 = new(TestContext.CurrentContext.Random.NextULong(), TestContext.CurrentContext.Random.NextULong());
+ V128 v1 = new(TestContext.CurrentContext.Random.NextULong(), TestContext.CurrentContext.Random.NextULong());
+
+ SingleOpcode(opcode, v0: v0, v1: v1);
+
+ CompareAgainstUnicorn();
+ }
#endif
}
}
diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimdReg32.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimdReg32.cs
index 38e08bf8..843273dc 100644
--- a/src/Ryujinx.Tests/Cpu/CpuTestSimdReg32.cs
+++ b/src/Ryujinx.Tests/Cpu/CpuTestSimdReg32.cs
@@ -909,6 +909,39 @@ namespace Ryujinx.Tests.Cpu
CompareAgainstUnicorn();
}
+ [Test, Pairwise, Description("VQRDMULH.<S16, S32> <Qd>, <Qn>, <Qm>")]
+ public void Vqrdmulh_I([Range(0u, 5u)] uint rd,
+ [Range(0u, 5u)] uint rn,
+ [Range(0u, 5u)] uint rm,
+ [ValueSource(nameof(_8B4H2S1D_))] ulong z,
+ [ValueSource(nameof(_8B4H2S1D_))] ulong a,
+ [ValueSource(nameof(_8B4H2S1D_))] ulong b,
+ [Values(1u, 2u)] uint size) // <S16, S32>
+ {
+ rd >>= 1;
+ rd <<= 1;
+ rn >>= 1;
+ rn <<= 1;
+ rm >>= 1;
+ rm <<= 1;
+
+ uint opcode = 0xf3100b40u & ~(3u << 20); // VQRDMULH.S16 Q0, Q0, Q0
+
+ opcode |= ((rd & 0xf) << 12) | ((rd & 0x10) << 18);
+ opcode |= ((rn & 0xf) << 16) | ((rn & 0x10) << 3);
+ opcode |= ((rm & 0xf) << 0) | ((rm & 0x10) << 1);
+
+ opcode |= (size & 0x3) << 20;
+
+ V128 v0 = MakeVectorE0E1(z, ~z);
+ V128 v1 = MakeVectorE0E1(a, ~a);
+ V128 v2 = MakeVectorE0E1(b, ~b);
+
+ SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
+
+ CompareAgainstUnicorn();
+ }
+
[Test, Pairwise]
public void Vp_Add_Long_Accumulate([Values(0u, 2u, 4u, 8u)] uint rd,
[Values(0u, 2u, 4u, 8u)] uint rm,
diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimdShImm32.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimdShImm32.cs
index 39b50867..7375f4d5 100644
--- a/src/Ryujinx.Tests/Cpu/CpuTestSimdShImm32.cs
+++ b/src/Ryujinx.Tests/Cpu/CpuTestSimdShImm32.cs
@@ -202,7 +202,7 @@ namespace Ryujinx.Tests.Cpu
}
[Test, Pairwise, Description("VSHL.<size> {<Vd>}, <Vm>, #<imm>")]
- public void Vshl_Imm([Values(0u)] uint rd,
+ public void Vshl_Imm([Values(0u, 1u)] uint rd,
[Values(2u, 0u)] uint rm,
[Values(0u, 1u, 2u, 3u)] uint size,
[Random(RndCntShiftImm)] uint shiftImm,
@@ -262,6 +262,40 @@ namespace Ryujinx.Tests.Cpu
CompareAgainstUnicorn();
}
+ [Test, Pairwise, Description("VSLI.<size> {<Vd>}, <Vm>, #<imm>")]
+ public void Vsli([Values(0u, 1u)] uint rd,
+ [Values(2u, 0u)] uint rm,
+ [Values(0u, 1u, 2u, 3u)] uint size,
+ [Random(RndCntShiftImm)] uint shiftImm,
+ [Random(RndCnt)] ulong z,
+ [Random(RndCnt)] ulong a,
+ [Random(RndCnt)] ulong b,
+ [Values] bool q)
+ {
+ uint opcode = 0xf3800510u; // VORR.I32 D0, #0x800000 (immediate value changes it into SLI)
+ if (q)
+ {
+ opcode |= 1 << 6;
+ rm <<= 1;
+ rd <<= 1;
+ }
+
+ uint imm = 1u << ((int)size + 3);
+ imm |= shiftImm & (imm - 1);
+
+ opcode |= ((rm & 0xf) << 0) | ((rm & 0x10) << 1);
+ opcode |= ((rd & 0xf) << 12) | ((rd & 0x10) << 18);
+ opcode |= ((imm & 0x3f) << 16) | ((imm & 0x40) << 1);
+
+ V128 v0 = MakeVectorE0E1(z, z);
+ V128 v1 = MakeVectorE0E1(a, z);
+ V128 v2 = MakeVectorE0E1(b, z);
+
+ SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
+
+ CompareAgainstUnicorn();
+ }
+
[Test, Pairwise]
public void Vqshrn_Vqrshrn_Vrshrn_Imm([ValueSource(nameof(_Vqshrn_Vqrshrn_Vrshrn_Imm_))] uint opcode,
[Values(0u, 1u)] uint rd,