CpuTestSimdRegElem32.cs 2.6 KB

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