CpuTestSimdExt.cs
1 #define SimdExt 2 3 using ARMeilleure.State; 4 using NUnit.Framework; 5 6 namespace Ryujinx.Tests.Cpu 7 { 8 [Category("SimdExt")] 9 public sealed class CpuTestSimdExt : CpuTest 10 { 11 #if SimdExt 12 13 #region "ValueSource" 14 private static ulong[] _8B_() 15 { 16 return new[] { 17 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, 18 0x8080808080808080ul, 0xFFFFFFFFFFFFFFFFul, 19 }; 20 } 21 #endregion 22 23 [Test, Pairwise, Description("EXT <Vd>.8B, <Vn>.8B, <Vm>.8B, #<index>")] 24 public void Ext_V_8B([Values(0u)] uint rd, 25 [Values(1u, 0u)] uint rn, 26 [Values(2u, 0u)] uint rm, 27 [ValueSource(nameof(_8B_))] ulong z, 28 [ValueSource(nameof(_8B_))] ulong a, 29 [ValueSource(nameof(_8B_))] ulong b, 30 [Values(0u, 7u)] uint index) 31 { 32 uint imm4 = index & 0x7u; 33 34 uint opcode = 0x2E000000; // EXT V0.8B, V0.8B, V0.8B, #0 35 opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0); 36 opcode |= (imm4 << 11); 37 38 V128 v0 = MakeVectorE0E1(z, z); 39 V128 v1 = MakeVectorE0(a); 40 V128 v2 = MakeVectorE0(b); 41 42 SingleOpcode(opcode, v0: v0, v1: v1, v2: v2); 43 44 CompareAgainstUnicorn(); 45 } 46 47 [Test, Pairwise, Description("EXT <Vd>.16B, <Vn>.16B, <Vm>.16B, #<index>")] 48 public void Ext_V_16B([Values(0u)] uint rd, 49 [Values(1u, 0u)] uint rn, 50 [Values(2u, 0u)] uint rm, 51 [ValueSource(nameof(_8B_))] ulong z, 52 [ValueSource(nameof(_8B_))] ulong a, 53 [ValueSource(nameof(_8B_))] ulong b, 54 [Values(0u, 15u)] uint index) 55 { 56 uint imm4 = index & 0xFu; 57 58 uint opcode = 0x6E000000; // EXT V0.16B, V0.16B, V0.16B, #0 59 opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0); 60 opcode |= (imm4 << 11); 61 62 V128 v0 = MakeVectorE0E1(z, z); 63 V128 v1 = MakeVectorE0E1(a, a); 64 V128 v2 = MakeVectorE0E1(b, b); 65 66 SingleOpcode(opcode, v0: v0, v1: v1, v2: v2); 67 68 CompareAgainstUnicorn(); 69 } 70 #endif 71 } 72 }