CpuTestSimdRegElem32.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #define SimdRegElem32
  2. using ARMeilleure.State;
  3. using NUnit.Framework;
  4. namespace Ryujinx.Tests.Cpu
  5. {
  6. [Category("SimdRegElem32")]
  7. public sealed class CpuTestSimdRegElem32 : CpuTest32
  8. {
  9. #if SimdRegElem32
  10. private const int RndCnt = 2;
  11. [Test, Pairwise, Description("VMUL.<size> {<Vd>}, <Vn>, <Vm>[<index>]")]
  12. public void Vmul_1I([Values(1u, 0u)] uint rd,
  13. [Values(1u, 0u)] uint rn,
  14. [Values(26u, 25u, 10u, 9u, 2u, 0u)] uint rm,
  15. [Values(1u, 2u)] uint size,
  16. [Random(RndCnt)] ulong z,
  17. [Random(RndCnt)] ulong a,
  18. [Random(RndCnt)] ulong b,
  19. [Values] bool q)
  20. {
  21. uint opcode = 0xf2900840u & ~(3u << 20); // VMUL.I16 D0, D0, D0[0]
  22. if (q)
  23. {
  24. opcode |= 1 << 24;
  25. rn <<= 1;
  26. rd <<= 1;
  27. }
  28. opcode |= ((rm & 0xf) << 0) | ((rm & 0x10) << 1);
  29. opcode |= ((rd & 0xf) << 12) | ((rd & 0x10) << 18);
  30. opcode |= ((rn & 0xf) << 16) | ((rn & 0x10) << 3);
  31. opcode |= size << 20;
  32. V128 v0 = MakeVectorE0E1(z, z);
  33. V128 v1 = MakeVectorE0E1(a, z);
  34. V128 v2 = MakeVectorE0E1(b, z);
  35. SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
  36. CompareAgainstUnicorn();
  37. }
  38. [Test, Pairwise, Description("VMULL.<size> <Vd>, <Vn>, <Vm>[<index>]")]
  39. public void Vmull_1([Values(2u, 0u)] uint rd,
  40. [Values(1u, 0u)] uint rn,
  41. [Values(26u, 25u, 10u, 9u, 2u, 0u)] uint rm,
  42. [Values(1u, 2u)] uint size,
  43. [Random(RndCnt)] ulong z,
  44. [Random(RndCnt)] ulong a,
  45. [Random(RndCnt)] ulong b,
  46. [Values] bool u)
  47. {
  48. uint opcode = 0xf2900a40u & ~(3u << 20); // VMULL.S16 Q0, D0, D0[0]
  49. opcode |= ((rm & 0xf) << 0) | ((rm & 0x10) << 1);
  50. opcode |= ((rd & 0xf) << 12) | ((rd & 0x10) << 18);
  51. opcode |= ((rn & 0xf) << 16) | ((rn & 0x10) << 3);
  52. opcode |= size << 20;
  53. if (u)
  54. {
  55. opcode |= 1 << 24;
  56. }
  57. V128 v0 = MakeVectorE0E1(z, z);
  58. V128 v1 = MakeVectorE0E1(a, z);
  59. V128 v2 = MakeVectorE0E1(b, z);
  60. SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
  61. CompareAgainstUnicorn();
  62. }
  63. #endif
  64. }
  65. }