/ src / Ryujinx.Tests / Cpu / CpuTestSimdReg.cs
CpuTestSimdReg.cs
   1  #define SimdReg
   2  
   3  using ARMeilleure.State;
   4  using NUnit.Framework;
   5  using System.Collections.Generic;
   6  
   7  namespace Ryujinx.Tests.Cpu
   8  {
   9      [Category("SimdReg")]
  10      public sealed class CpuTestSimdReg : CpuTest
  11      {
  12  #if SimdReg
  13  
  14          #region "ValueSource (Types)"
  15          private static ulong[] _1B1H1S1D_()
  16          {
  17              return new[] {
  18                  0x0000000000000000ul, 0x000000000000007Ful,
  19                  0x0000000000000080ul, 0x00000000000000FFul,
  20                  0x0000000000007FFFul, 0x0000000000008000ul,
  21                  0x000000000000FFFFul, 0x000000007FFFFFFFul,
  22                  0x0000000080000000ul, 0x00000000FFFFFFFFul,
  23                  0x7FFFFFFFFFFFFFFFul, 0x8000000000000000ul,
  24                  0xFFFFFFFFFFFFFFFFul,
  25              };
  26          }
  27  
  28          private static ulong[] _1D_()
  29          {
  30              return new[] {
  31                  0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  32                  0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul,
  33              };
  34          }
  35  
  36          private static ulong[] _1H1S_()
  37          {
  38              return new[] {
  39                  0x0000000000000000ul, 0x0000000000007FFFul,
  40                  0x0000000000008000ul, 0x000000000000FFFFul,
  41                  0x000000007FFFFFFFul, 0x0000000080000000ul,
  42                  0x00000000FFFFFFFFul,
  43              };
  44          }
  45  
  46          private static ulong[] _4H2S_()
  47          {
  48              return new[] {
  49                  0x0000000000000000ul, 0x7FFF7FFF7FFF7FFFul,
  50                  0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul,
  51                  0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul,
  52              };
  53          }
  54  
  55          private static ulong[] _4H2S1D_()
  56          {
  57              return new[] {
  58                  0x0000000000000000ul, 0x7FFF7FFF7FFF7FFFul,
  59                  0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul,
  60                  0x8000000080000000ul, 0x7FFFFFFFFFFFFFFFul,
  61                  0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul,
  62              };
  63          }
  64  
  65          private static ulong[] _8B_()
  66          {
  67              return new[] {
  68                  0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful,
  69                  0x8080808080808080ul, 0xFFFFFFFFFFFFFFFFul,
  70              };
  71          }
  72  
  73          private static ulong[] _8B1D_()
  74          {
  75              return new[] {
  76                  0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful,
  77                  0x8080808080808080ul, 0x7FFFFFFFFFFFFFFFul,
  78                  0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul,
  79              };
  80          }
  81  
  82          private static ulong[] _8B4H2S_()
  83          {
  84              return new[] {
  85                  0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful,
  86                  0x8080808080808080ul, 0x7FFF7FFF7FFF7FFFul,
  87                  0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul,
  88                  0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul,
  89              };
  90          }
  91  
  92          private static ulong[] _8B4H2S1D_()
  93          {
  94              return new[] {
  95                  0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful,
  96                  0x8080808080808080ul, 0x7FFF7FFF7FFF7FFFul,
  97                  0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul,
  98                  0x8000000080000000ul, 0x7FFFFFFFFFFFFFFFul,
  99                  0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul,
 100              };
 101          }
 102  
 103          private static IEnumerable<ulong> _1S_F_()
 104          {
 105              yield return 0x00000000FF7FFFFFul; // -Max Normal    (float.MinValue)
 106              yield return 0x0000000080800000ul; // -Min Normal
 107              yield return 0x00000000807FFFFFul; // -Max Subnormal
 108              yield return 0x0000000080000001ul; // -Min Subnormal (-float.Epsilon)
 109              yield return 0x000000007F7FFFFFul; // +Max Normal    (float.MaxValue)
 110              yield return 0x0000000000800000ul; // +Min Normal
 111              yield return 0x00000000007FFFFFul; // +Max Subnormal
 112              yield return 0x0000000000000001ul; // +Min Subnormal (float.Epsilon)
 113  
 114              if (!_noZeros)
 115              {
 116                  yield return 0x0000000080000000ul; // -Zero
 117                  yield return 0x0000000000000000ul; // +Zero
 118              }
 119  
 120              if (!_noInfs)
 121              {
 122                  yield return 0x00000000FF800000ul; // -Infinity
 123                  yield return 0x000000007F800000ul; // +Infinity
 124              }
 125  
 126              if (!_noNaNs)
 127              {
 128                  yield return 0x00000000FFC00000ul; // -QNaN (all zeros payload) (float.NaN)
 129                  yield return 0x00000000FFBFFFFFul; // -SNaN (all ones  payload)
 130                  yield return 0x000000007FC00000ul; // +QNaN (all zeros payload) (-float.NaN) (DefaultNaN)
 131                  yield return 0x000000007FBFFFFFul; // +SNaN (all ones  payload)
 132              }
 133  
 134              for (int cnt = 1; cnt <= RndCnt; cnt++)
 135              {
 136                  ulong grbg = TestContext.CurrentContext.Random.NextUInt();
 137                  ulong rnd1 = GenNormalS();
 138                  ulong rnd2 = GenSubnormalS();
 139  
 140                  yield return (grbg << 32) | rnd1;
 141                  yield return (grbg << 32) | rnd2;
 142              }
 143          }
 144  
 145          private static IEnumerable<ulong> _2S_F_()
 146          {
 147              yield return 0xFF7FFFFFFF7FFFFFul; // -Max Normal    (float.MinValue)
 148              yield return 0x8080000080800000ul; // -Min Normal
 149              yield return 0x807FFFFF807FFFFFul; // -Max Subnormal
 150              yield return 0x8000000180000001ul; // -Min Subnormal (-float.Epsilon)
 151              yield return 0x7F7FFFFF7F7FFFFFul; // +Max Normal    (float.MaxValue)
 152              yield return 0x0080000000800000ul; // +Min Normal
 153              yield return 0x007FFFFF007FFFFFul; // +Max Subnormal
 154              yield return 0x0000000100000001ul; // +Min Subnormal (float.Epsilon)
 155  
 156              if (!_noZeros)
 157              {
 158                  yield return 0x8000000080000000ul; // -Zero
 159                  yield return 0x0000000000000000ul; // +Zero
 160              }
 161  
 162              if (!_noInfs)
 163              {
 164                  yield return 0xFF800000FF800000ul; // -Infinity
 165                  yield return 0x7F8000007F800000ul; // +Infinity
 166              }
 167  
 168              if (!_noNaNs)
 169              {
 170                  yield return 0xFFC00000FFC00000ul; // -QNaN (all zeros payload) (float.NaN)
 171                  yield return 0xFFBFFFFFFFBFFFFFul; // -SNaN (all ones  payload)
 172                  yield return 0x7FC000007FC00000ul; // +QNaN (all zeros payload) (-float.NaN) (DefaultNaN)
 173                  yield return 0x7FBFFFFF7FBFFFFFul; // +SNaN (all ones  payload)
 174              }
 175  
 176              for (int cnt = 1; cnt <= RndCnt; cnt++)
 177              {
 178                  ulong rnd1 = GenNormalS();
 179                  ulong rnd2 = GenSubnormalS();
 180  
 181                  yield return (rnd1 << 32) | rnd1;
 182                  yield return (rnd2 << 32) | rnd2;
 183              }
 184          }
 185  
 186          private static IEnumerable<ulong> _1D_F_()
 187          {
 188              yield return 0xFFEFFFFFFFFFFFFFul; // -Max Normal    (double.MinValue)
 189              yield return 0x8010000000000000ul; // -Min Normal
 190              yield return 0x800FFFFFFFFFFFFFul; // -Max Subnormal
 191              yield return 0x8000000000000001ul; // -Min Subnormal (-double.Epsilon)
 192              yield return 0x7FEFFFFFFFFFFFFFul; // +Max Normal    (double.MaxValue)
 193              yield return 0x0010000000000000ul; // +Min Normal
 194              yield return 0x000FFFFFFFFFFFFFul; // +Max Subnormal
 195              yield return 0x0000000000000001ul; // +Min Subnormal (double.Epsilon)
 196  
 197              if (!_noZeros)
 198              {
 199                  yield return 0x8000000000000000ul; // -Zero
 200                  yield return 0x0000000000000000ul; // +Zero
 201              }
 202  
 203              if (!_noInfs)
 204              {
 205                  yield return 0xFFF0000000000000ul; // -Infinity
 206                  yield return 0x7FF0000000000000ul; // +Infinity
 207              }
 208  
 209              if (!_noNaNs)
 210              {
 211                  yield return 0xFFF8000000000000ul; // -QNaN (all zeros payload) (double.NaN)
 212                  yield return 0xFFF7FFFFFFFFFFFFul; // -SNaN (all ones  payload)
 213                  yield return 0x7FF8000000000000ul; // +QNaN (all zeros payload) (-double.NaN) (DefaultNaN)
 214                  yield return 0x7FF7FFFFFFFFFFFFul; // +SNaN (all ones  payload)
 215              }
 216  
 217              for (int cnt = 1; cnt <= RndCnt; cnt++)
 218              {
 219                  ulong rnd1 = GenNormalD();
 220                  ulong rnd2 = GenSubnormalD();
 221  
 222                  yield return rnd1;
 223                  yield return rnd2;
 224              }
 225          }
 226          #endregion
 227  
 228          #region "ValueSource (Opcodes)"
 229          private static uint[] _F_Abd_Add_Div_Mul_Mulx_Nmul_Sub_S_S_()
 230          {
 231              return new[]
 232              {
 233                  0x7EA2D420u, // FABD  S0, S1, S2
 234                  0x1E222820u, // FADD  S0, S1, S2
 235                  0x1E221820u, // FDIV  S0, S1, S2
 236                  0x1E220820u, // FMUL  S0, S1, S2
 237                  0x5E22DC20u, // FMULX S0, S1, S2
 238                  0x1E228820u, // FNMUL S0, S1, S2
 239                  0x1E223820u, // FSUB  S0, S1, S2
 240              };
 241          }
 242  
 243          private static uint[] _F_Abd_Add_Div_Mul_Mulx_Nmul_Sub_S_D_()
 244          {
 245              return new[]
 246              {
 247                  0x7EE2D420u, // FABD  D0, D1, D2
 248                  0x1E622820u, // FADD  D0, D1, D2
 249                  0x1E621820u, // FDIV  D0, D1, D2
 250                  0x1E620820u, // FMUL  D0, D1, D2
 251                  0x5E62DC20u, // FMULX D0, D1, D2
 252                  0x1E628820u, // FNMUL D0, D1, D2
 253                  0x1E623820u, // FSUB  D0, D1, D2
 254              };
 255          }
 256  
 257          private static uint[] _F_Abd_Add_Div_Mul_Mulx_Sub_P_V_2S_4S_()
 258          {
 259              return new[]
 260              {
 261                  0x2EA0D400u, // FABD  V0.2S, V0.2S, V0.2S
 262                  0x0E20D400u, // FADD  V0.2S, V0.2S, V0.2S
 263                  0x2E20D400u, // FADDP V0.2S, V0.2S, V0.2S
 264                  0x2E20FC00u, // FDIV  V0.2S, V0.2S, V0.2S
 265                  0x2E20DC00u, // FMUL  V0.2S, V0.2S, V0.2S
 266                  0x0E20DC00u, // FMULX V0.2S, V0.2S, V0.2S
 267                  0x0EA0D400u, // FSUB  V0.2S, V0.2S, V0.2S
 268              };
 269          }
 270  
 271          private static uint[] _F_Abd_Add_Div_Mul_Mulx_Sub_P_V_2D_()
 272          {
 273              return new[]
 274              {
 275                  0x6EE0D400u, // FABD  V0.2D, V0.2D, V0.2D
 276                  0x4E60D400u, // FADD  V0.2D, V0.2D, V0.2D
 277                  0x6E60D400u, // FADDP V0.2D, V0.2D, V0.2D
 278                  0x6E60FC00u, // FDIV  V0.2D, V0.2D, V0.2D
 279                  0x6E60DC00u, // FMUL  V0.2D, V0.2D, V0.2D
 280                  0x4E60DC00u, // FMULX V0.2D, V0.2D, V0.2D
 281                  0x4EE0D400u, // FSUB  V0.2D, V0.2D, V0.2D
 282              };
 283          }
 284  
 285          private static uint[] _F_AcCm_EqGeGt_S_S_()
 286          {
 287              return new[]
 288              {
 289                  0x7E22EC20u, // FACGE S0, S1, S2
 290                  0x7EA2EC20u, // FACGT S0, S1, S2
 291                  0x5E22E420u, // FCMEQ S0, S1, S2
 292                  0x7E22E420u, // FCMGE S0, S1, S2
 293                  0x7EA2E420u, // FCMGT S0, S1, S2
 294              };
 295          }
 296  
 297          private static uint[] _F_AcCm_EqGeGt_S_D_()
 298          {
 299              return new[]
 300              {
 301                  0x7E62EC20u, // FACGE D0, D1, D2
 302                  0x7EE2EC20u, // FACGT D0, D1, D2
 303                  0x5E62E420u, // FCMEQ D0, D1, D2
 304                  0x7E62E420u, // FCMGE D0, D1, D2
 305                  0x7EE2E420u, // FCMGT D0, D1, D2
 306              };
 307          }
 308  
 309          private static uint[] _F_AcCm_EqGeGt_V_2S_4S_()
 310          {
 311              return new[]
 312              {
 313                  0x2E20EC00u, // FACGE V0.2S, V0.2S, V0.2S
 314                  0x2EA0EC00u, // FACGT V0.2S, V0.2S, V0.2S
 315                  0x0E20E400u, // FCMEQ V0.2S, V0.2S, V0.2S
 316                  0x2E20E400u, // FCMGE V0.2S, V0.2S, V0.2S
 317                  0x2EA0E400u, // FCMGT V0.2S, V0.2S, V0.2S
 318              };
 319          }
 320  
 321          private static uint[] _F_AcCm_EqGeGt_V_2D_()
 322          {
 323              return new[]
 324              {
 325                  0x6E60EC00u, // FACGE V0.2D, V0.2D, V0.2D
 326                  0x6EE0EC00u, // FACGT V0.2D, V0.2D, V0.2D
 327                  0x4E60E400u, // FCMEQ V0.2D, V0.2D, V0.2D
 328                  0x6E60E400u, // FCMGE V0.2D, V0.2D, V0.2D
 329                  0x6EE0E400u, // FCMGT V0.2D, V0.2D, V0.2D
 330              };
 331          }
 332  
 333          private static uint[] _F_Cmp_Cmpe_S_S_()
 334          {
 335              return new[]
 336              {
 337                  0x1E222020u, // FCMP  S1, S2
 338                  0x1E222030u, // FCMPE S1, S2
 339              };
 340          }
 341  
 342          private static uint[] _F_Cmp_Cmpe_S_D_()
 343          {
 344              return new[]
 345              {
 346                  0x1E622020u, // FCMP  D1, D2
 347                  0x1E622030u, // FCMPE D1, D2
 348              };
 349          }
 350  
 351          private static uint[] _F_Madd_Msub_Nmadd_Nmsub_S_S_()
 352          {
 353              return new[]
 354              {
 355                  0x1F020C20u, // FMADD  S0, S1, S2, S3
 356                  0x1F028C20u, // FMSUB  S0, S1, S2, S3
 357                  0x1F220C20u, // FNMADD S0, S1, S2, S3
 358                  0x1F228C20u, // FNMSUB S0, S1, S2, S3
 359              };
 360          }
 361  
 362          private static uint[] _F_Madd_Msub_Nmadd_Nmsub_S_D_()
 363          {
 364              return new[]
 365              {
 366                  0x1F420C20u, // FMADD  D0, D1, D2, D3
 367                  0x1F428C20u, // FMSUB  D0, D1, D2, D3
 368                  0x1F620C20u, // FNMADD D0, D1, D2, D3
 369                  0x1F628C20u, // FNMSUB D0, D1, D2, D3
 370              };
 371          }
 372  
 373          private static uint[] _F_Max_Min_Nm_S_S_()
 374          {
 375              return new[]
 376              {
 377                  0x1E224820u, // FMAX   S0, S1, S2
 378                  0x1E226820u, // FMAXNM S0, S1, S2
 379                  0x1E225820u, // FMIN   S0, S1, S2
 380                  0x1E227820u, // FMINNM S0, S1, S2
 381              };
 382          }
 383  
 384          private static uint[] _F_Max_Min_Nm_S_D_()
 385          {
 386              return new[]
 387              {
 388                  0x1E624820u, // FMAX   D0, D1, D2
 389                  0x1E626820u, // FMAXNM D0, D1, D2
 390                  0x1E625820u, // FMIN   D0, D1, D2
 391                  0x1E627820u, // FMINNM D0, D1, D2
 392              };
 393          }
 394  
 395          private static uint[] _F_Max_Min_Nm_P_V_2S_4S_()
 396          {
 397              return new[]
 398              {
 399                  0x0E20F400u, // FMAX    V0.2S, V0.2S, V0.2S
 400                  0x0E20C400u, // FMAXNM  V0.2S, V0.2S, V0.2S
 401                  0x2E20C400u, // FMAXNMP V0.2S, V0.2S, V0.2S
 402                  0x2E20F400u, // FMAXP   V0.2S, V0.2S, V0.2S
 403                  0x0EA0F400u, // FMIN    V0.2S, V0.2S, V0.2S
 404                  0x0EA0C400u, // FMINNM  V0.2S, V0.2S, V0.2S
 405                  0x2EA0C400u, // FMINNMP V0.2S, V0.2S, V0.2S
 406                  0x2EA0F400u, // FMINP   V0.2S, V0.2S, V0.2S
 407              };
 408          }
 409  
 410          private static uint[] _F_Max_Min_Nm_P_V_2D_()
 411          {
 412              return new[]
 413              {
 414                  0x4E60F400u, // FMAX    V0.2D, V0.2D, V0.2D
 415                  0x4E60C400u, // FMAXNM  V0.2D, V0.2D, V0.2D
 416                  0x6E60C400u, // FMAXNMP V0.2D, V0.2D, V0.2D
 417                  0x6E60F400u, // FMAXP   V0.2D, V0.2D, V0.2D
 418                  0x4EE0F400u, // FMIN    V0.2D, V0.2D, V0.2D
 419                  0x4EE0C400u, // FMINNM  V0.2D, V0.2D, V0.2D
 420                  0x6EE0C400u, // FMINNMP V0.2D, V0.2D, V0.2D
 421                  0x6EE0F400u, // FMINP   V0.2D, V0.2D, V0.2D
 422              };
 423          }
 424  
 425          private static uint[] _F_Mla_Mls_V_2S_4S_()
 426          {
 427              return new[]
 428              {
 429                  0x0E20CC00u, // FMLA V0.2S, V0.2S, V0.2S
 430                  0x0EA0CC00u, // FMLS V0.2S, V0.2S, V0.2S
 431              };
 432          }
 433  
 434          private static uint[] _F_Mla_Mls_V_2D_()
 435          {
 436              return new[]
 437              {
 438                  0x4E60CC00u, // FMLA V0.2D, V0.2D, V0.2D
 439                  0x4EE0CC00u, // FMLS V0.2D, V0.2D, V0.2D
 440              };
 441          }
 442  
 443          private static uint[] _F_Recps_Rsqrts_S_S_()
 444          {
 445              return new[]
 446              {
 447                  0x5E22FC20u, // FRECPS  S0, S1, S2
 448                  0x5EA2FC20u, // FRSQRTS S0, S1, S2
 449              };
 450          }
 451  
 452          private static uint[] _F_Recps_Rsqrts_S_D_()
 453          {
 454              return new[]
 455              {
 456                  0x5E62FC20u, // FRECPS  D0, D1, D2
 457                  0x5EE2FC20u, // FRSQRTS D0, D1, D2
 458              };
 459          }
 460  
 461          private static uint[] _F_Recps_Rsqrts_V_2S_4S_()
 462          {
 463              return new[]
 464              {
 465                  0x0E20FC00u, // FRECPS  V0.2S, V0.2S, V0.2S
 466                  0x0EA0FC00u, // FRSQRTS V0.2S, V0.2S, V0.2S
 467              };
 468          }
 469  
 470          private static uint[] _F_Recps_Rsqrts_V_2D_()
 471          {
 472              return new[]
 473              {
 474                  0x4E60FC00u, // FRECPS  V0.2D, V0.2D, V0.2D
 475                  0x4EE0FC00u, // FRSQRTS V0.2D, V0.2D, V0.2D
 476              };
 477          }
 478  
 479          private static uint[] _Mla_Mls_Mul_V_8B_4H_2S_()
 480          {
 481              return new[]
 482              {
 483                  0x0E209400u, // MLA V0.8B, V0.8B, V0.8B
 484                  0x2E209400u, // MLS V0.8B, V0.8B, V0.8B
 485                  0x0E209C00u, // MUL V0.8B, V0.8B, V0.8B
 486              };
 487          }
 488  
 489          private static uint[] _Mla_Mls_Mul_V_16B_8H_4S_()
 490          {
 491              return new[]
 492              {
 493                  0x4E209400u, // MLA V0.16B, V0.16B, V0.16B
 494                  0x6E209400u, // MLS V0.16B, V0.16B, V0.16B
 495                  0x4E209C00u, // MUL V0.16B, V0.16B, V0.16B
 496              };
 497          }
 498  
 499          private static uint[] _Sha1c_Sha1m_Sha1p_Sha1su0_V_()
 500          {
 501              return new[]
 502              {
 503                  0x5E000000u, // SHA1C   Q0,    S0,    V0.4S
 504                  0x5E002000u, // SHA1M   Q0,    S0,    V0.4S
 505                  0x5E001000u, // SHA1P   Q0,    S0,    V0.4S
 506                  0x5E003000u, // SHA1SU0 V0.4S, V0.4S, V0.4S
 507              };
 508          }
 509  
 510          private static uint[] _Sha256h_Sha256h2_Sha256su1_V_()
 511          {
 512              return new[]
 513              {
 514                  0x5E004000u, // SHA256H   Q0,    Q0,    V0.4S
 515                  0x5E005000u, // SHA256H2  Q0,    Q0,    V0.4S
 516                  0x5E006000u, // SHA256SU1 V0.4S, V0.4S, V0.4S
 517              };
 518          }
 519  
 520          private static uint[] _SU_Max_Min_P_V_()
 521          {
 522              return new[]
 523              {
 524                  0x0E206400u, // SMAX  V0.8B, V0.8B, V0.8B
 525                  0x0E20A400u, // SMAXP V0.8B, V0.8B, V0.8B
 526                  0x0E206C00u, // SMIN  V0.8B, V0.8B, V0.8B
 527                  0x0E20AC00u, // SMINP V0.8B, V0.8B, V0.8B
 528                  0x2E206400u, // UMAX  V0.8B, V0.8B, V0.8B
 529                  0x2E20A400u, // UMAXP V0.8B, V0.8B, V0.8B
 530                  0x2E206C00u, // UMIN  V0.8B, V0.8B, V0.8B
 531                  0x2E20AC00u, // UMINP V0.8B, V0.8B, V0.8B
 532              };
 533          }
 534  
 535          private static uint[] _SU_Mlal_Mlsl_Mull_V_8B8H_4H4S_2S2D_()
 536          {
 537              return new[]
 538              {
 539                  0x0E208000u, // SMLAL V0.8H, V0.8B, V0.8B
 540                  0x0E20A000u, // SMLSL V0.8H, V0.8B, V0.8B
 541                  0x0E20C000u, // SMULL V0.8H, V0.8B, V0.8B
 542                  0x2E208000u, // UMLAL V0.8H, V0.8B, V0.8B
 543                  0x2E20A000u, // UMLSL V0.8H, V0.8B, V0.8B
 544                  0x2E20C000u, // UMULL V0.8H, V0.8B, V0.8B
 545              };
 546          }
 547  
 548          private static uint[] _SU_Mlal_Mlsl_Mull_V_16B8H_8H4S_4S2D_()
 549          {
 550              return new[]
 551              {
 552                  0x4E208000u, // SMLAL2 V0.8H, V0.16B, V0.16B
 553                  0x4E20A000u, // SMLSL2 V0.8H, V0.16B, V0.16B
 554                  0x4E20C000u, // SMULL2 V0.8H, V0.16B, V0.16B
 555                  0x6E208000u, // UMLAL2 V0.8H, V0.16B, V0.16B
 556                  0x6E20A000u, // UMLSL2 V0.8H, V0.16B, V0.16B
 557                  0x6E20C000u, // UMULL2 V0.8H, V0.16B, V0.16B
 558              };
 559          }
 560  
 561          private static uint[] _ShlReg_S_D_()
 562          {
 563              return new[]
 564              {
 565                  0x5EE04400u, // SSHL D0, D0, D0
 566                  0x7EE04400u, // USHL D0, D0, D0
 567              };
 568          }
 569  
 570          private static uint[] _ShlReg_V_8B_4H_2S_()
 571          {
 572              return new[]
 573              {
 574                  0x0E205C00u, // SQRSHL V0.8B, V0.8B, V0.8B
 575                  0x0E204C00u, // SQSHL  V0.8B, V0.8B, V0.8B
 576                  0x0E205400u, // SRSHL  V0.8B, V0.8B, V0.8B
 577                  0x0E204400u, // SSHL   V0.8B, V0.8B, V0.8B
 578                  0x2E205C00u, // UQRSHL V0.8B, V0.8B, V0.8B
 579                  0x2E204C00u, // UQSHL  V0.8B, V0.8B, V0.8B
 580                  0x2E205400u, // URSHL  V0.8B, V0.8B, V0.8B
 581                  0x2E204400u, // USHL   V0.8B, V0.8B, V0.8B
 582              };
 583          }
 584  
 585          private static uint[] _ShlReg_V_16B_8H_4S_2D_()
 586          {
 587              return new[]
 588              {
 589                  0x4E205C00u, // SQRSHL V0.16B, V0.16B, V0.16B
 590                  0x4E204C00u, // SQSHL  V0.16B, V0.16B, V0.16B
 591                  0x4E205400u, // SRSHL  V0.16B, V0.16B, V0.16B
 592                  0x4E204400u, // SSHL   V0.16B, V0.16B, V0.16B
 593                  0x6E205C00u, // UQRSHL V0.16B, V0.16B, V0.16B
 594                  0x6E204C00u, // UQSHL  V0.16B, V0.16B, V0.16B
 595                  0x6E205400u, // URSHL  V0.16B, V0.16B, V0.16B
 596                  0x6E204400u, // USHL   V0.16B, V0.16B, V0.16B
 597              };
 598          }
 599          #endregion
 600  
 601          private const int RndCnt = 2;
 602  
 603          private static readonly bool _noZeros = false;
 604          private static readonly bool _noInfs = false;
 605          private static readonly bool _noNaNs = false;
 606  
 607          [Test, Pairwise, Description("ADD <V><d>, <V><n>, <V><m>")]
 608          public void Add_S_D([Values(0u)] uint rd,
 609                              [Values(1u, 0u)] uint rn,
 610                              [Values(2u, 0u)] uint rm,
 611                              [ValueSource(nameof(_1D_))] ulong z,
 612                              [ValueSource(nameof(_1D_))] ulong a,
 613                              [ValueSource(nameof(_1D_))] ulong b)
 614          {
 615              uint opcode = 0x5EE08400; // ADD D0, D0, D0
 616              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
 617  
 618              V128 v0 = MakeVectorE0E1(z, z);
 619              V128 v1 = MakeVectorE0(a);
 620              V128 v2 = MakeVectorE0(b);
 621  
 622              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
 623  
 624              CompareAgainstUnicorn();
 625          }
 626  
 627          [Test, Pairwise, Description("ADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
 628          public void Add_V_8B_4H_2S([Values(0u)] uint rd,
 629                                     [Values(1u, 0u)] uint rn,
 630                                     [Values(2u, 0u)] uint rm,
 631                                     [ValueSource(nameof(_8B4H2S_))] ulong z,
 632                                     [ValueSource(nameof(_8B4H2S_))] ulong a,
 633                                     [ValueSource(nameof(_8B4H2S_))] ulong b,
 634                                     [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
 635          {
 636              uint opcode = 0x0E208400; // ADD V0.8B, V0.8B, V0.8B
 637              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
 638              opcode |= ((size & 3) << 22);
 639  
 640              V128 v0 = MakeVectorE0E1(z, z);
 641              V128 v1 = MakeVectorE0(a);
 642              V128 v2 = MakeVectorE0(b);
 643  
 644              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
 645  
 646              CompareAgainstUnicorn();
 647          }
 648  
 649          [Test, Pairwise, Description("ADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
 650          public void Add_V_16B_8H_4S_2D([Values(0u)] uint rd,
 651                                         [Values(1u, 0u)] uint rn,
 652                                         [Values(2u, 0u)] uint rm,
 653                                         [ValueSource(nameof(_8B4H2S1D_))] ulong z,
 654                                         [ValueSource(nameof(_8B4H2S1D_))] ulong a,
 655                                         [ValueSource(nameof(_8B4H2S1D_))] ulong b,
 656                                         [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
 657          {
 658              uint opcode = 0x4E208400; // ADD V0.16B, V0.16B, V0.16B
 659              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
 660              opcode |= ((size & 3) << 22);
 661  
 662              V128 v0 = MakeVectorE0E1(z, z);
 663              V128 v1 = MakeVectorE0E1(a, a);
 664              V128 v2 = MakeVectorE0E1(b, b);
 665  
 666              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
 667  
 668              CompareAgainstUnicorn();
 669          }
 670  
 671          [Test, Pairwise, Description("ADDHN{2} <Vd>.<Tb>, <Vn>.<Ta>, <Vm>.<Ta>")]
 672          public void Addhn_V_8H8B_4S4H_2D2S([Values(0u)] uint rd,
 673                                             [Values(1u, 0u)] uint rn,
 674                                             [Values(2u, 0u)] uint rm,
 675                                             [ValueSource(nameof(_4H2S1D_))] ulong z,
 676                                             [ValueSource(nameof(_4H2S1D_))] ulong a,
 677                                             [ValueSource(nameof(_4H2S1D_))] ulong b,
 678                                             [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H8B, 4S4H, 2D2S>
 679          {
 680              uint opcode = 0x0E204000; // ADDHN V0.8B, V0.8H, V0.8H
 681              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
 682              opcode |= ((size & 3) << 22);
 683  
 684              V128 v0 = MakeVectorE0E1(z, z);
 685              V128 v1 = MakeVectorE0E1(a, a);
 686              V128 v2 = MakeVectorE0E1(b, b);
 687  
 688              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
 689  
 690              CompareAgainstUnicorn();
 691          }
 692  
 693          [Test, Pairwise, Description("ADDHN{2} <Vd>.<Tb>, <Vn>.<Ta>, <Vm>.<Ta>")]
 694          public void Addhn_V_8H16B_4S8H_2D4S([Values(0u)] uint rd,
 695                                              [Values(1u, 0u)] uint rn,
 696                                              [Values(2u, 0u)] uint rm,
 697                                              [ValueSource(nameof(_4H2S1D_))] ulong z,
 698                                              [ValueSource(nameof(_4H2S1D_))] ulong a,
 699                                              [ValueSource(nameof(_4H2S1D_))] ulong b,
 700                                              [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H16B, 4S8H, 2D4S>
 701          {
 702              uint opcode = 0x4E204000; // ADDHN2 V0.16B, V0.8H, V0.8H
 703              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
 704              opcode |= ((size & 3) << 22);
 705  
 706              V128 v0 = MakeVectorE0E1(z, z);
 707              V128 v1 = MakeVectorE0E1(a, a);
 708              V128 v2 = MakeVectorE0E1(b, b);
 709  
 710              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
 711  
 712              CompareAgainstUnicorn();
 713          }
 714  
 715          [Test, Pairwise, Description("ADDP <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
 716          public void Addp_V_8B_4H_2S([Values(0u)] uint rd,
 717                                      [Values(1u, 0u)] uint rn,
 718                                      [Values(2u, 0u)] uint rm,
 719                                      [ValueSource(nameof(_8B4H2S_))] ulong z,
 720                                      [ValueSource(nameof(_8B4H2S_))] ulong a,
 721                                      [ValueSource(nameof(_8B4H2S_))] ulong b,
 722                                      [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
 723          {
 724              uint opcode = 0x0E20BC00; // ADDP V0.8B, V0.8B, V0.8B
 725              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
 726              opcode |= ((size & 3) << 22);
 727  
 728              V128 v0 = MakeVectorE0E1(z, z);
 729              V128 v1 = MakeVectorE0(a);
 730              V128 v2 = MakeVectorE0(b);
 731  
 732              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
 733  
 734              CompareAgainstUnicorn();
 735          }
 736  
 737          [Test, Pairwise, Description("ADDP <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
 738          public void Addp_V_16B_8H_4S_2D([Values(0u)] uint rd,
 739                                          [Values(1u, 0u)] uint rn,
 740                                          [Values(2u, 0u)] uint rm,
 741                                          [ValueSource(nameof(_8B4H2S1D_))] ulong z,
 742                                          [ValueSource(nameof(_8B4H2S1D_))] ulong a,
 743                                          [ValueSource(nameof(_8B4H2S1D_))] ulong b,
 744                                          [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
 745          {
 746              uint opcode = 0x4E20BC00; // ADDP V0.16B, V0.16B, V0.16B
 747              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
 748              opcode |= ((size & 3) << 22);
 749  
 750              V128 v0 = MakeVectorE0E1(z, z);
 751              V128 v1 = MakeVectorE0E1(a, a);
 752              V128 v2 = MakeVectorE0E1(b, b);
 753  
 754              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
 755  
 756              CompareAgainstUnicorn();
 757          }
 758  
 759          [Test, Pairwise, Description("AND <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
 760          public void And_V_8B([Values(0u)] uint rd,
 761                               [Values(1u, 0u)] uint rn,
 762                               [Values(2u, 0u)] uint rm,
 763                               [ValueSource(nameof(_8B_))] ulong z,
 764                               [ValueSource(nameof(_8B_))] ulong a,
 765                               [ValueSource(nameof(_8B_))] ulong b)
 766          {
 767              uint opcode = 0x0E201C00; // AND V0.8B, V0.8B, V0.8B
 768              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
 769  
 770              V128 v0 = MakeVectorE0E1(z, z);
 771              V128 v1 = MakeVectorE0(a);
 772              V128 v2 = MakeVectorE0(b);
 773  
 774              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
 775  
 776              CompareAgainstUnicorn();
 777          }
 778  
 779          [Test, Pairwise, Description("AND <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
 780          public void And_V_16B([Values(0u)] uint rd,
 781                                [Values(1u, 0u)] uint rn,
 782                                [Values(2u, 0u)] uint rm,
 783                                [ValueSource(nameof(_8B_))] ulong z,
 784                                [ValueSource(nameof(_8B_))] ulong a,
 785                                [ValueSource(nameof(_8B_))] ulong b)
 786          {
 787              uint opcode = 0x4E201C00; // AND V0.16B, V0.16B, V0.16B
 788              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
 789  
 790              V128 v0 = MakeVectorE0E1(z, z);
 791              V128 v1 = MakeVectorE0E1(a, a);
 792              V128 v2 = MakeVectorE0E1(b, b);
 793  
 794              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
 795  
 796              CompareAgainstUnicorn();
 797          }
 798  
 799          [Test, Pairwise, Description("BIC <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
 800          public void Bic_V_8B([Values(0u)] uint rd,
 801                               [Values(1u, 0u)] uint rn,
 802                               [Values(2u, 0u)] uint rm,
 803                               [ValueSource(nameof(_8B_))] ulong z,
 804                               [ValueSource(nameof(_8B_))] ulong a,
 805                               [ValueSource(nameof(_8B_))] ulong b)
 806          {
 807              uint opcode = 0x0E601C00; // BIC V0.8B, V0.8B, V0.8B
 808              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
 809  
 810              V128 v0 = MakeVectorE0E1(z, z);
 811              V128 v1 = MakeVectorE0(a);
 812              V128 v2 = MakeVectorE0(b);
 813  
 814              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
 815  
 816              CompareAgainstUnicorn();
 817          }
 818  
 819          [Test, Pairwise, Description("BIC <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
 820          public void Bic_V_16B([Values(0u)] uint rd,
 821                                [Values(1u, 0u)] uint rn,
 822                                [Values(2u, 0u)] uint rm,
 823                                [ValueSource(nameof(_8B_))] ulong z,
 824                                [ValueSource(nameof(_8B_))] ulong a,
 825                                [ValueSource(nameof(_8B_))] ulong b)
 826          {
 827              uint opcode = 0x4E601C00; // BIC V0.16B, V0.16B, V0.16B
 828              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
 829  
 830              V128 v0 = MakeVectorE0E1(z, z);
 831              V128 v1 = MakeVectorE0E1(a, a);
 832              V128 v2 = MakeVectorE0E1(b, b);
 833  
 834              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
 835  
 836              CompareAgainstUnicorn();
 837          }
 838  
 839          [Test, Pairwise, Description("BIF <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
 840          public void Bif_V_8B([Values(0u)] uint rd,
 841                               [Values(1u, 0u)] uint rn,
 842                               [Values(2u, 0u)] uint rm,
 843                               [ValueSource(nameof(_8B_))] ulong z,
 844                               [ValueSource(nameof(_8B_))] ulong a,
 845                               [ValueSource(nameof(_8B_))] ulong b)
 846          {
 847              uint opcode = 0x2EE01C00; // BIF V0.8B, V0.8B, V0.8B
 848              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
 849  
 850              V128 v0 = MakeVectorE0E1(z, z);
 851              V128 v1 = MakeVectorE0(a);
 852              V128 v2 = MakeVectorE0(b);
 853  
 854              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
 855  
 856              CompareAgainstUnicorn();
 857          }
 858  
 859          [Test, Pairwise, Description("BIF <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
 860          public void Bif_V_16B([Values(0u)] uint rd,
 861                                [Values(1u, 0u)] uint rn,
 862                                [Values(2u, 0u)] uint rm,
 863                                [ValueSource(nameof(_8B_))] ulong z,
 864                                [ValueSource(nameof(_8B_))] ulong a,
 865                                [ValueSource(nameof(_8B_))] ulong b)
 866          {
 867              uint opcode = 0x6EE01C00; // BIF V0.16B, V0.16B, V0.16B
 868              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
 869  
 870              V128 v0 = MakeVectorE0E1(z, z);
 871              V128 v1 = MakeVectorE0E1(a, a);
 872              V128 v2 = MakeVectorE0E1(b, b);
 873  
 874              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
 875  
 876              CompareAgainstUnicorn();
 877          }
 878  
 879          [Test, Pairwise, Description("BIT <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
 880          public void Bit_V_8B([Values(0u)] uint rd,
 881                               [Values(1u, 0u)] uint rn,
 882                               [Values(2u, 0u)] uint rm,
 883                               [ValueSource(nameof(_8B_))] ulong z,
 884                               [ValueSource(nameof(_8B_))] ulong a,
 885                               [ValueSource(nameof(_8B_))] ulong b)
 886          {
 887              uint opcode = 0x2EA01C00; // BIT V0.8B, V0.8B, V0.8B
 888              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
 889  
 890              V128 v0 = MakeVectorE0E1(z, z);
 891              V128 v1 = MakeVectorE0(a);
 892              V128 v2 = MakeVectorE0(b);
 893  
 894              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
 895  
 896              CompareAgainstUnicorn();
 897          }
 898  
 899          [Test, Pairwise, Description("BIT <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
 900          public void Bit_V_16B([Values(0u)] uint rd,
 901                                [Values(1u, 0u)] uint rn,
 902                                [Values(2u, 0u)] uint rm,
 903                                [ValueSource(nameof(_8B_))] ulong z,
 904                                [ValueSource(nameof(_8B_))] ulong a,
 905                                [ValueSource(nameof(_8B_))] ulong b)
 906          {
 907              uint opcode = 0x6EA01C00; // BIT V0.16B, V0.16B, V0.16B
 908              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
 909  
 910              V128 v0 = MakeVectorE0E1(z, z);
 911              V128 v1 = MakeVectorE0E1(a, a);
 912              V128 v2 = MakeVectorE0E1(b, b);
 913  
 914              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
 915  
 916              CompareAgainstUnicorn();
 917          }
 918  
 919          [Test, Pairwise, Description("BSL <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
 920          public void Bsl_V_8B([Values(0u)] uint rd,
 921                               [Values(1u, 0u)] uint rn,
 922                               [Values(2u, 0u)] uint rm,
 923                               [ValueSource(nameof(_8B_))] ulong z,
 924                               [ValueSource(nameof(_8B_))] ulong a,
 925                               [ValueSource(nameof(_8B_))] ulong b)
 926          {
 927              uint opcode = 0x2E601C00; // BSL V0.8B, V0.8B, V0.8B
 928              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
 929  
 930              V128 v0 = MakeVectorE0E1(z, z);
 931              V128 v1 = MakeVectorE0(a);
 932              V128 v2 = MakeVectorE0(b);
 933  
 934              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
 935  
 936              CompareAgainstUnicorn();
 937          }
 938  
 939          [Test, Pairwise, Description("BSL <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
 940          public void Bsl_V_16B([Values(0u)] uint rd,
 941                                [Values(1u, 0u)] uint rn,
 942                                [Values(2u, 0u)] uint rm,
 943                                [ValueSource(nameof(_8B_))] ulong z,
 944                                [ValueSource(nameof(_8B_))] ulong a,
 945                                [ValueSource(nameof(_8B_))] ulong b)
 946          {
 947              uint opcode = 0x6E601C00; // BSL V0.16B, V0.16B, V0.16B
 948              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
 949  
 950              V128 v0 = MakeVectorE0E1(z, z);
 951              V128 v1 = MakeVectorE0E1(a, a);
 952              V128 v2 = MakeVectorE0E1(b, b);
 953  
 954              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
 955  
 956              CompareAgainstUnicorn();
 957          }
 958  
 959          [Test, Pairwise, Description("CMEQ <V><d>, <V><n>, <V><m>")]
 960          public void Cmeq_S_D([Values(0u)] uint rd,
 961                               [Values(1u, 0u)] uint rn,
 962                               [Values(2u, 0u)] uint rm,
 963                               [ValueSource(nameof(_1D_))] ulong z,
 964                               [ValueSource(nameof(_1D_))] ulong a,
 965                               [ValueSource(nameof(_1D_))] ulong b)
 966          {
 967              uint opcode = 0x7EE08C00; // CMEQ D0, D0, D0
 968              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
 969  
 970              V128 v0 = MakeVectorE0E1(z, z);
 971              V128 v1 = MakeVectorE0(a);
 972              V128 v2 = MakeVectorE0(b);
 973  
 974              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
 975  
 976              CompareAgainstUnicorn();
 977          }
 978  
 979          [Test, Pairwise, Description("CMEQ <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
 980          public void Cmeq_V_8B_4H_2S([Values(0u)] uint rd,
 981                                      [Values(1u, 0u)] uint rn,
 982                                      [Values(2u, 0u)] uint rm,
 983                                      [ValueSource(nameof(_8B4H2S_))] ulong z,
 984                                      [ValueSource(nameof(_8B4H2S_))] ulong a,
 985                                      [ValueSource(nameof(_8B4H2S_))] ulong b,
 986                                      [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
 987          {
 988              uint opcode = 0x2E208C00; // CMEQ V0.8B, V0.8B, V0.8B
 989              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
 990              opcode |= ((size & 3) << 22);
 991  
 992              V128 v0 = MakeVectorE0E1(z, z);
 993              V128 v1 = MakeVectorE0(a);
 994              V128 v2 = MakeVectorE0(b);
 995  
 996              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
 997  
 998              CompareAgainstUnicorn();
 999          }
1000  
1001          [Test, Pairwise, Description("CMEQ <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
1002          public void Cmeq_V_16B_8H_4S_2D([Values(0u)] uint rd,
1003                                          [Values(1u, 0u)] uint rn,
1004                                          [Values(2u, 0u)] uint rm,
1005                                          [ValueSource(nameof(_8B4H2S1D_))] ulong z,
1006                                          [ValueSource(nameof(_8B4H2S1D_))] ulong a,
1007                                          [ValueSource(nameof(_8B4H2S1D_))] ulong b,
1008                                          [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
1009          {
1010              uint opcode = 0x6E208C00; // CMEQ V0.16B, V0.16B, V0.16B
1011              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1012              opcode |= ((size & 3) << 22);
1013  
1014              V128 v0 = MakeVectorE0E1(z, z);
1015              V128 v1 = MakeVectorE0E1(a, a);
1016              V128 v2 = MakeVectorE0E1(b, b);
1017  
1018              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1019  
1020              CompareAgainstUnicorn();
1021          }
1022  
1023          [Test, Pairwise, Description("CMGE <V><d>, <V><n>, <V><m>")]
1024          public void Cmge_S_D([Values(0u)] uint rd,
1025                               [Values(1u, 0u)] uint rn,
1026                               [Values(2u, 0u)] uint rm,
1027                               [ValueSource(nameof(_1D_))] ulong z,
1028                               [ValueSource(nameof(_1D_))] ulong a,
1029                               [ValueSource(nameof(_1D_))] ulong b)
1030          {
1031              uint opcode = 0x5EE03C00; // CMGE D0, D0, D0
1032              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1033  
1034              V128 v0 = MakeVectorE0E1(z, z);
1035              V128 v1 = MakeVectorE0(a);
1036              V128 v2 = MakeVectorE0(b);
1037  
1038              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1039  
1040              CompareAgainstUnicorn();
1041          }
1042  
1043          [Test, Pairwise, Description("CMGE <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
1044          public void Cmge_V_8B_4H_2S([Values(0u)] uint rd,
1045                                      [Values(1u, 0u)] uint rn,
1046                                      [Values(2u, 0u)] uint rm,
1047                                      [ValueSource(nameof(_8B4H2S_))] ulong z,
1048                                      [ValueSource(nameof(_8B4H2S_))] ulong a,
1049                                      [ValueSource(nameof(_8B4H2S_))] ulong b,
1050                                      [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
1051          {
1052              uint opcode = 0x0E203C00; // CMGE V0.8B, V0.8B, V0.8B
1053              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1054              opcode |= ((size & 3) << 22);
1055  
1056              V128 v0 = MakeVectorE0E1(z, z);
1057              V128 v1 = MakeVectorE0(a);
1058              V128 v2 = MakeVectorE0(b);
1059  
1060              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1061  
1062              CompareAgainstUnicorn();
1063          }
1064  
1065          [Test, Pairwise, Description("CMGE <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
1066          public void Cmge_V_16B_8H_4S_2D([Values(0u)] uint rd,
1067                                          [Values(1u, 0u)] uint rn,
1068                                          [Values(2u, 0u)] uint rm,
1069                                          [ValueSource(nameof(_8B4H2S1D_))] ulong z,
1070                                          [ValueSource(nameof(_8B4H2S1D_))] ulong a,
1071                                          [ValueSource(nameof(_8B4H2S1D_))] ulong b,
1072                                          [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
1073          {
1074              uint opcode = 0x4E203C00; // CMGE V0.16B, V0.16B, V0.16B
1075              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1076              opcode |= ((size & 3) << 22);
1077  
1078              V128 v0 = MakeVectorE0E1(z, z);
1079              V128 v1 = MakeVectorE0E1(a, a);
1080              V128 v2 = MakeVectorE0E1(b, b);
1081  
1082              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1083  
1084              CompareAgainstUnicorn();
1085          }
1086  
1087          [Test, Pairwise, Description("CMGT <V><d>, <V><n>, <V><m>")]
1088          public void Cmgt_S_D([Values(0u)] uint rd,
1089                               [Values(1u, 0u)] uint rn,
1090                               [Values(2u, 0u)] uint rm,
1091                               [ValueSource(nameof(_1D_))] ulong z,
1092                               [ValueSource(nameof(_1D_))] ulong a,
1093                               [ValueSource(nameof(_1D_))] ulong b)
1094          {
1095              uint opcode = 0x5EE03400; // CMGT D0, D0, D0
1096              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1097  
1098              V128 v0 = MakeVectorE0E1(z, z);
1099              V128 v1 = MakeVectorE0(a);
1100              V128 v2 = MakeVectorE0(b);
1101  
1102              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1103  
1104              CompareAgainstUnicorn();
1105          }
1106  
1107          [Test, Pairwise, Description("CMGT <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
1108          public void Cmgt_V_8B_4H_2S([Values(0u)] uint rd,
1109                                      [Values(1u, 0u)] uint rn,
1110                                      [Values(2u, 0u)] uint rm,
1111                                      [ValueSource(nameof(_8B4H2S_))] ulong z,
1112                                      [ValueSource(nameof(_8B4H2S_))] ulong a,
1113                                      [ValueSource(nameof(_8B4H2S_))] ulong b,
1114                                      [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
1115          {
1116              uint opcode = 0x0E203400; // CMGT V0.8B, V0.8B, V0.8B
1117              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1118              opcode |= ((size & 3) << 22);
1119  
1120              V128 v0 = MakeVectorE0E1(z, z);
1121              V128 v1 = MakeVectorE0(a);
1122              V128 v2 = MakeVectorE0(b);
1123  
1124              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1125  
1126              CompareAgainstUnicorn();
1127          }
1128  
1129          [Test, Pairwise, Description("CMGT <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
1130          public void Cmgt_V_16B_8H_4S_2D([Values(0u)] uint rd,
1131                                          [Values(1u, 0u)] uint rn,
1132                                          [Values(2u, 0u)] uint rm,
1133                                          [ValueSource(nameof(_8B4H2S1D_))] ulong z,
1134                                          [ValueSource(nameof(_8B4H2S1D_))] ulong a,
1135                                          [ValueSource(nameof(_8B4H2S1D_))] ulong b,
1136                                          [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
1137          {
1138              uint opcode = 0x4E203400; // CMGT V0.16B, V0.16B, V0.16B
1139              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1140              opcode |= ((size & 3) << 22);
1141  
1142              V128 v0 = MakeVectorE0E1(z, z);
1143              V128 v1 = MakeVectorE0E1(a, a);
1144              V128 v2 = MakeVectorE0E1(b, b);
1145  
1146              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1147  
1148              CompareAgainstUnicorn();
1149          }
1150  
1151          [Test, Pairwise, Description("CMHI <V><d>, <V><n>, <V><m>")]
1152          public void Cmhi_S_D([Values(0u)] uint rd,
1153                               [Values(1u, 0u)] uint rn,
1154                               [Values(2u, 0u)] uint rm,
1155                               [ValueSource(nameof(_1D_))] ulong z,
1156                               [ValueSource(nameof(_1D_))] ulong a,
1157                               [ValueSource(nameof(_1D_))] ulong b)
1158          {
1159              uint opcode = 0x7EE03400; // CMHI D0, D0, D0
1160              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1161  
1162              V128 v0 = MakeVectorE0E1(z, z);
1163              V128 v1 = MakeVectorE0(a);
1164              V128 v2 = MakeVectorE0(b);
1165  
1166              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1167  
1168              CompareAgainstUnicorn();
1169          }
1170  
1171          [Test, Pairwise, Description("CMHI <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
1172          public void Cmhi_V_8B_4H_2S([Values(0u)] uint rd,
1173                                      [Values(1u, 0u)] uint rn,
1174                                      [Values(2u, 0u)] uint rm,
1175                                      [ValueSource(nameof(_8B4H2S_))] ulong z,
1176                                      [ValueSource(nameof(_8B4H2S_))] ulong a,
1177                                      [ValueSource(nameof(_8B4H2S_))] ulong b,
1178                                      [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
1179          {
1180              uint opcode = 0x2E203400; // CMHI V0.8B, V0.8B, V0.8B
1181              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1182              opcode |= ((size & 3) << 22);
1183  
1184              V128 v0 = MakeVectorE0E1(z, z);
1185              V128 v1 = MakeVectorE0(a);
1186              V128 v2 = MakeVectorE0(b);
1187  
1188              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1189  
1190              CompareAgainstUnicorn();
1191          }
1192  
1193          [Test, Pairwise, Description("CMHI <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
1194          public void Cmhi_V_16B_8H_4S_2D([Values(0u)] uint rd,
1195                                          [Values(1u, 0u)] uint rn,
1196                                          [Values(2u, 0u)] uint rm,
1197                                          [ValueSource(nameof(_8B4H2S1D_))] ulong z,
1198                                          [ValueSource(nameof(_8B4H2S1D_))] ulong a,
1199                                          [ValueSource(nameof(_8B4H2S1D_))] ulong b,
1200                                          [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
1201          {
1202              uint opcode = 0x6E203400; // CMHI V0.16B, V0.16B, V0.16B
1203              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1204              opcode |= ((size & 3) << 22);
1205  
1206              V128 v0 = MakeVectorE0E1(z, z);
1207              V128 v1 = MakeVectorE0E1(a, a);
1208              V128 v2 = MakeVectorE0E1(b, b);
1209  
1210              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1211  
1212              CompareAgainstUnicorn();
1213          }
1214  
1215          [Test, Pairwise, Description("CMHS <V><d>, <V><n>, <V><m>")]
1216          public void Cmhs_S_D([Values(0u)] uint rd,
1217                               [Values(1u, 0u)] uint rn,
1218                               [Values(2u, 0u)] uint rm,
1219                               [ValueSource(nameof(_1D_))] ulong z,
1220                               [ValueSource(nameof(_1D_))] ulong a,
1221                               [ValueSource(nameof(_1D_))] ulong b)
1222          {
1223              uint opcode = 0x7EE03C00; // CMHS D0, D0, D0
1224              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1225  
1226              V128 v0 = MakeVectorE0E1(z, z);
1227              V128 v1 = MakeVectorE0(a);
1228              V128 v2 = MakeVectorE0(b);
1229  
1230              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1231  
1232              CompareAgainstUnicorn();
1233          }
1234  
1235          [Test, Pairwise, Description("CMHS <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
1236          public void Cmhs_V_8B_4H_2S([Values(0u)] uint rd,
1237                                      [Values(1u, 0u)] uint rn,
1238                                      [Values(2u, 0u)] uint rm,
1239                                      [ValueSource(nameof(_8B4H2S_))] ulong z,
1240                                      [ValueSource(nameof(_8B4H2S_))] ulong a,
1241                                      [ValueSource(nameof(_8B4H2S_))] ulong b,
1242                                      [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
1243          {
1244              uint opcode = 0x2E203C00; // CMHS V0.8B, V0.8B, V0.8B
1245              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1246              opcode |= ((size & 3) << 22);
1247  
1248              V128 v0 = MakeVectorE0E1(z, z);
1249              V128 v1 = MakeVectorE0(a);
1250              V128 v2 = MakeVectorE0(b);
1251  
1252              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1253  
1254              CompareAgainstUnicorn();
1255          }
1256  
1257          [Test, Pairwise, Description("CMHS <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
1258          public void Cmhs_V_16B_8H_4S_2D([Values(0u)] uint rd,
1259                                          [Values(1u, 0u)] uint rn,
1260                                          [Values(2u, 0u)] uint rm,
1261                                          [ValueSource(nameof(_8B4H2S1D_))] ulong z,
1262                                          [ValueSource(nameof(_8B4H2S1D_))] ulong a,
1263                                          [ValueSource(nameof(_8B4H2S1D_))] ulong b,
1264                                          [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
1265          {
1266              uint opcode = 0x6E203C00; // CMHS V0.16B, V0.16B, V0.16B
1267              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1268              opcode |= ((size & 3) << 22);
1269  
1270              V128 v0 = MakeVectorE0E1(z, z);
1271              V128 v1 = MakeVectorE0E1(a, a);
1272              V128 v2 = MakeVectorE0E1(b, b);
1273  
1274              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1275  
1276              CompareAgainstUnicorn();
1277          }
1278  
1279          [Test, Pairwise, Description("CMTST <V><d>, <V><n>, <V><m>")]
1280          public void Cmtst_S_D([Values(0u)] uint rd,
1281                                [Values(1u, 0u)] uint rn,
1282                                [Values(2u, 0u)] uint rm,
1283                                [ValueSource(nameof(_1D_))] ulong z,
1284                                [ValueSource(nameof(_1D_))] ulong a,
1285                                [ValueSource(nameof(_1D_))] ulong b)
1286          {
1287              uint opcode = 0x5EE08C00; // CMTST D0, D0, D0
1288              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1289  
1290              V128 v0 = MakeVectorE0E1(z, z);
1291              V128 v1 = MakeVectorE0(a);
1292              V128 v2 = MakeVectorE0(b);
1293  
1294              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1295  
1296              CompareAgainstUnicorn();
1297          }
1298  
1299          [Test, Pairwise, Description("CMTST <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
1300          public void Cmtst_V_8B_4H_2S([Values(0u)] uint rd,
1301                                       [Values(1u, 0u)] uint rn,
1302                                       [Values(2u, 0u)] uint rm,
1303                                       [ValueSource(nameof(_8B4H2S_))] ulong z,
1304                                       [ValueSource(nameof(_8B4H2S_))] ulong a,
1305                                       [ValueSource(nameof(_8B4H2S_))] ulong b,
1306                                       [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
1307          {
1308              uint opcode = 0x0E208C00; // CMTST V0.8B, V0.8B, V0.8B
1309              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1310              opcode |= ((size & 3) << 22);
1311  
1312              V128 v0 = MakeVectorE0E1(z, z);
1313              V128 v1 = MakeVectorE0(a);
1314              V128 v2 = MakeVectorE0(b);
1315  
1316              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1317  
1318              CompareAgainstUnicorn();
1319          }
1320  
1321          [Test, Pairwise, Description("CMTST <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
1322          public void Cmtst_V_16B_8H_4S_2D([Values(0u)] uint rd,
1323                                           [Values(1u, 0u)] uint rn,
1324                                           [Values(2u, 0u)] uint rm,
1325                                           [ValueSource(nameof(_8B4H2S1D_))] ulong z,
1326                                           [ValueSource(nameof(_8B4H2S1D_))] ulong a,
1327                                           [ValueSource(nameof(_8B4H2S1D_))] ulong b,
1328                                           [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
1329          {
1330              uint opcode = 0x4E208C00; // CMTST V0.16B, V0.16B, V0.16B
1331              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1332              opcode |= ((size & 3) << 22);
1333  
1334              V128 v0 = MakeVectorE0E1(z, z);
1335              V128 v1 = MakeVectorE0E1(a, a);
1336              V128 v2 = MakeVectorE0E1(b, b);
1337  
1338              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1339  
1340              CompareAgainstUnicorn();
1341          }
1342  
1343          [Test, Pairwise, Description("EOR <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
1344          public void Eor_V_8B([Values(0u)] uint rd,
1345                               [Values(1u, 0u)] uint rn,
1346                               [Values(2u, 0u)] uint rm,
1347                               [ValueSource(nameof(_8B_))] ulong z,
1348                               [ValueSource(nameof(_8B_))] ulong a,
1349                               [ValueSource(nameof(_8B_))] ulong b)
1350          {
1351              uint opcode = 0x2E201C00; // EOR V0.8B, V0.8B, V0.8B
1352              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1353  
1354              V128 v0 = MakeVectorE0E1(z, z);
1355              V128 v1 = MakeVectorE0(a);
1356              V128 v2 = MakeVectorE0(b);
1357  
1358              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1359  
1360              CompareAgainstUnicorn();
1361          }
1362  
1363          [Test, Pairwise, Description("EOR <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
1364          public void Eor_V_16B([Values(0u)] uint rd,
1365                                [Values(1u, 0u)] uint rn,
1366                                [Values(2u, 0u)] uint rm,
1367                                [ValueSource(nameof(_8B_))] ulong z,
1368                                [ValueSource(nameof(_8B_))] ulong a,
1369                                [ValueSource(nameof(_8B_))] ulong b)
1370          {
1371              uint opcode = 0x6E201C00; // EOR V0.16B, V0.16B, V0.16B
1372              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1373  
1374              V128 v0 = MakeVectorE0E1(z, z);
1375              V128 v1 = MakeVectorE0E1(a, a);
1376              V128 v2 = MakeVectorE0E1(b, b);
1377  
1378              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1379  
1380              CompareAgainstUnicorn();
1381          }
1382  
1383          [Test, Pairwise]
1384          [Explicit]
1385          public void F_Abd_Add_Div_Mul_Mulx_Nmul_Sub_S_S([ValueSource(nameof(_F_Abd_Add_Div_Mul_Mulx_Nmul_Sub_S_S_))] uint opcodes,
1386                                                          [ValueSource(nameof(_1S_F_))] ulong a,
1387                                                          [ValueSource(nameof(_1S_F_))] ulong b)
1388          {
1389              ulong z = TestContext.CurrentContext.Random.NextULong();
1390              V128 v0 = MakeVectorE0E1(z, z);
1391              V128 v1 = MakeVectorE0(a);
1392              V128 v2 = MakeVectorE0(b);
1393  
1394              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1395  
1396              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1397              fpcr |= rnd & (1 << (int)Fpcr.Dn);
1398  
1399              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, fpcr: fpcr);
1400  
1401              CompareAgainstUnicorn(fpsrMask: Fpsr.Ioc | Fpsr.Dzc | Fpsr.Idc);
1402          }
1403  
1404          [Test, Pairwise]
1405          [Explicit]
1406          public void F_Abd_Add_Div_Mul_Mulx_Nmul_Sub_S_D([ValueSource(nameof(_F_Abd_Add_Div_Mul_Mulx_Nmul_Sub_S_D_))] uint opcodes,
1407                                                          [ValueSource(nameof(_1D_F_))] ulong a,
1408                                                          [ValueSource(nameof(_1D_F_))] ulong b)
1409          {
1410              ulong z = TestContext.CurrentContext.Random.NextULong();
1411              V128 v0 = MakeVectorE1(z);
1412              V128 v1 = MakeVectorE0(a);
1413              V128 v2 = MakeVectorE0(b);
1414  
1415              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1416  
1417              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1418              fpcr |= rnd & (1 << (int)Fpcr.Dn);
1419  
1420              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, fpcr: fpcr);
1421  
1422              CompareAgainstUnicorn(fpsrMask: Fpsr.Ioc | Fpsr.Dzc | Fpsr.Idc);
1423          }
1424  
1425          [Test, Pairwise]
1426          [Explicit]
1427          public void F_Abd_Add_Div_Mul_Mulx_Sub_P_V_2S_4S([ValueSource(nameof(_F_Abd_Add_Div_Mul_Mulx_Sub_P_V_2S_4S_))] uint opcodes,
1428                                                           [Values(0u)] uint rd,
1429                                                           [Values(1u, 0u)] uint rn,
1430                                                           [Values(2u, 0u)] uint rm,
1431                                                           [ValueSource(nameof(_2S_F_))] ulong z,
1432                                                           [ValueSource(nameof(_2S_F_))] ulong a,
1433                                                           [ValueSource(nameof(_2S_F_))] ulong b,
1434                                                           [Values(0b0u, 0b1u)] uint q) // <2S, 4S>
1435          {
1436              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1437              opcodes |= ((q & 1) << 30);
1438  
1439              V128 v0 = MakeVectorE0E1(z, z);
1440              V128 v1 = MakeVectorE0E1(a, a * q);
1441              V128 v2 = MakeVectorE0E1(b, b * q);
1442  
1443              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1444  
1445              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1446              fpcr |= rnd & (1 << (int)Fpcr.Dn);
1447  
1448              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, fpcr: fpcr);
1449  
1450              CompareAgainstUnicorn(fpsrMask: Fpsr.Ioc | Fpsr.Dzc | Fpsr.Idc);
1451          }
1452  
1453          [Test, Pairwise]
1454          [Explicit]
1455          public void F_Abd_Add_Div_Mul_Mulx_Sub_P_V_2D([ValueSource(nameof(_F_Abd_Add_Div_Mul_Mulx_Sub_P_V_2D_))] uint opcodes,
1456                                                        [Values(0u)] uint rd,
1457                                                        [Values(1u, 0u)] uint rn,
1458                                                        [Values(2u, 0u)] uint rm,
1459                                                        [ValueSource(nameof(_1D_F_))] ulong z,
1460                                                        [ValueSource(nameof(_1D_F_))] ulong a,
1461                                                        [ValueSource(nameof(_1D_F_))] ulong b)
1462          {
1463              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1464  
1465              V128 v0 = MakeVectorE0E1(z, z);
1466              V128 v1 = MakeVectorE0E1(a, a);
1467              V128 v2 = MakeVectorE0E1(b, b);
1468  
1469              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1470  
1471              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1472              fpcr |= rnd & (1 << (int)Fpcr.Dn);
1473  
1474              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, fpcr: fpcr);
1475  
1476              CompareAgainstUnicorn(fpsrMask: Fpsr.Ioc | Fpsr.Dzc | Fpsr.Idc);
1477          }
1478  
1479          [Test, Pairwise]
1480          [Explicit]
1481          public void F_AcCm_EqGeGt_S_S([ValueSource(nameof(_F_AcCm_EqGeGt_S_S_))] uint opcodes,
1482                                        [ValueSource(nameof(_1S_F_))] ulong a,
1483                                        [ValueSource(nameof(_1S_F_))] ulong b)
1484          {
1485              ulong z = TestContext.CurrentContext.Random.NextULong();
1486              V128 v0 = MakeVectorE0E1(z, z);
1487              V128 v1 = MakeVectorE0(a);
1488              V128 v2 = MakeVectorE0(b);
1489  
1490              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1491  
1492              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1493  
1494              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, fpcr: fpcr);
1495  
1496              CompareAgainstUnicorn(fpsrMask: Fpsr.Ioc | Fpsr.Idc);
1497          }
1498  
1499          [Test, Pairwise]
1500          [Explicit]
1501          public void F_AcCm_EqGeGt_S_D([ValueSource(nameof(_F_AcCm_EqGeGt_S_D_))] uint opcodes,
1502                                        [ValueSource(nameof(_1D_F_))] ulong a,
1503                                        [ValueSource(nameof(_1D_F_))] ulong b)
1504          {
1505              ulong z = TestContext.CurrentContext.Random.NextULong();
1506              V128 v0 = MakeVectorE1(z);
1507              V128 v1 = MakeVectorE0(a);
1508              V128 v2 = MakeVectorE0(b);
1509  
1510              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1511  
1512              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1513  
1514              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, fpcr: fpcr);
1515  
1516              CompareAgainstUnicorn(fpsrMask: Fpsr.Ioc | Fpsr.Idc);
1517          }
1518  
1519          [Test, Pairwise]
1520          [Explicit]
1521          public void F_AcCm_EqGeGt_V_2S_4S([ValueSource(nameof(_F_AcCm_EqGeGt_V_2S_4S_))] uint opcodes,
1522                                            [Values(0u)] uint rd,
1523                                            [Values(1u, 0u)] uint rn,
1524                                            [Values(2u, 0u)] uint rm,
1525                                            [ValueSource(nameof(_2S_F_))] ulong z,
1526                                            [ValueSource(nameof(_2S_F_))] ulong a,
1527                                            [ValueSource(nameof(_2S_F_))] ulong b,
1528                                            [Values(0b0u, 0b1u)] uint q) // <2S, 4S>
1529          {
1530              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1531              opcodes |= ((q & 1) << 30);
1532  
1533              V128 v0 = MakeVectorE0E1(z, z);
1534              V128 v1 = MakeVectorE0E1(a, a * q);
1535              V128 v2 = MakeVectorE0E1(b, b * q);
1536  
1537              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1538  
1539              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1540  
1541              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, fpcr: fpcr);
1542  
1543              CompareAgainstUnicorn(fpsrMask: Fpsr.Ioc | Fpsr.Idc);
1544          }
1545  
1546          [Test, Pairwise]
1547          [Explicit]
1548          public void F_AcCm_EqGeGt_V_2D([ValueSource(nameof(_F_AcCm_EqGeGt_V_2D_))] uint opcodes,
1549                                         [Values(0u)] uint rd,
1550                                         [Values(1u, 0u)] uint rn,
1551                                         [Values(2u, 0u)] uint rm,
1552                                         [ValueSource(nameof(_1D_F_))] ulong z,
1553                                         [ValueSource(nameof(_1D_F_))] ulong a,
1554                                         [ValueSource(nameof(_1D_F_))] ulong b)
1555          {
1556              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1557  
1558              V128 v0 = MakeVectorE0E1(z, z);
1559              V128 v1 = MakeVectorE0E1(a, a);
1560              V128 v2 = MakeVectorE0E1(b, b);
1561  
1562              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1563  
1564              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1565  
1566              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, fpcr: fpcr);
1567  
1568              CompareAgainstUnicorn(fpsrMask: Fpsr.Ioc | Fpsr.Idc);
1569          }
1570  
1571          [Test, Pairwise]
1572          [Explicit]
1573          public void F_Cmp_Cmpe_S_S([ValueSource(nameof(_F_Cmp_Cmpe_S_S_))] uint opcodes,
1574                                     [ValueSource(nameof(_1S_F_))] ulong a,
1575                                     [ValueSource(nameof(_1S_F_))] ulong b)
1576          {
1577              V128 v1 = MakeVectorE0(a);
1578              V128 v2 = MakeVectorE0(b);
1579  
1580              bool v = TestContext.CurrentContext.Random.NextBool();
1581              bool c = TestContext.CurrentContext.Random.NextBool();
1582              bool z = TestContext.CurrentContext.Random.NextBool();
1583              bool n = TestContext.CurrentContext.Random.NextBool();
1584  
1585              SingleOpcode(opcodes, v1: v1, v2: v2, overflow: v, carry: c, zero: z, negative: n);
1586  
1587              CompareAgainstUnicorn(fpsrMask: Fpsr.Ioc);
1588          }
1589  
1590          [Test, Pairwise]
1591          [Explicit]
1592          public void F_Cmp_Cmpe_S_D([ValueSource(nameof(_F_Cmp_Cmpe_S_D_))] uint opcodes,
1593                                     [ValueSource(nameof(_1D_F_))] ulong a,
1594                                     [ValueSource(nameof(_1D_F_))] ulong b)
1595          {
1596              V128 v1 = MakeVectorE0(a);
1597              V128 v2 = MakeVectorE0(b);
1598  
1599              bool v = TestContext.CurrentContext.Random.NextBool();
1600              bool c = TestContext.CurrentContext.Random.NextBool();
1601              bool z = TestContext.CurrentContext.Random.NextBool();
1602              bool n = TestContext.CurrentContext.Random.NextBool();
1603  
1604              SingleOpcode(opcodes, v1: v1, v2: v2, overflow: v, carry: c, zero: z, negative: n);
1605  
1606              CompareAgainstUnicorn(fpsrMask: Fpsr.Ioc);
1607          }
1608  
1609          // Fused.
1610          [Test, Pairwise]
1611          [Explicit]
1612          public void F_Madd_Msub_Nmadd_Nmsub_S_S([ValueSource(nameof(_F_Madd_Msub_Nmadd_Nmsub_S_S_))] uint opcodes,
1613                                                  [ValueSource(nameof(_1S_F_))] ulong a,
1614                                                  [ValueSource(nameof(_1S_F_))] ulong b,
1615                                                  [ValueSource(nameof(_1S_F_))] ulong c)
1616          {
1617              ulong z = TestContext.CurrentContext.Random.NextULong();
1618              V128 v0 = MakeVectorE0E1(z, z);
1619              V128 v1 = MakeVectorE0(a);
1620              V128 v2 = MakeVectorE0(b);
1621              V128 v3 = MakeVectorE0(c);
1622  
1623              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1624  
1625              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1626              fpcr |= rnd & (1 << (int)Fpcr.Dn);
1627  
1628              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, v3: v3, fpcr: fpcr);
1629  
1630              CompareAgainstUnicorn(Fpsr.Ioc | Fpsr.Idc, FpSkips.IfUnderflow, FpTolerances.UpToOneUlpsS);
1631          }
1632  
1633          // Fused.
1634          [Test, Pairwise]
1635          [Explicit]
1636          public void F_Madd_Msub_Nmadd_Nmsub_S_D([ValueSource(nameof(_F_Madd_Msub_Nmadd_Nmsub_S_D_))] uint opcodes,
1637                                                  [ValueSource(nameof(_1D_F_))] ulong a,
1638                                                  [ValueSource(nameof(_1D_F_))] ulong b,
1639                                                  [ValueSource(nameof(_1D_F_))] ulong c)
1640          {
1641              ulong z = TestContext.CurrentContext.Random.NextULong();
1642              V128 v0 = MakeVectorE1(z);
1643              V128 v1 = MakeVectorE0(a);
1644              V128 v2 = MakeVectorE0(b);
1645              V128 v3 = MakeVectorE0(c);
1646  
1647              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1648  
1649              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1650              fpcr |= rnd & (1 << (int)Fpcr.Dn);
1651  
1652              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, v3: v3, fpcr: fpcr);
1653  
1654              CompareAgainstUnicorn(Fpsr.Ioc | Fpsr.Idc, FpSkips.IfUnderflow, FpTolerances.UpToOneUlpsD);
1655          }
1656  
1657          [Test, Pairwise]
1658          [Explicit]
1659          public void F_Max_Min_Nm_S_S([ValueSource(nameof(_F_Max_Min_Nm_S_S_))] uint opcodes,
1660                                       [ValueSource(nameof(_1S_F_))] ulong a,
1661                                       [ValueSource(nameof(_1S_F_))] ulong b)
1662          {
1663              ulong z = TestContext.CurrentContext.Random.NextULong();
1664              V128 v0 = MakeVectorE0E1(z, z);
1665              V128 v1 = MakeVectorE0(a);
1666              V128 v2 = MakeVectorE0(b);
1667  
1668              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1669  
1670              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1671              fpcr |= rnd & (1 << (int)Fpcr.Dn);
1672  
1673              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, fpcr: fpcr);
1674  
1675              CompareAgainstUnicorn(fpsrMask: Fpsr.Ioc | Fpsr.Idc);
1676          }
1677  
1678          [Test, Pairwise]
1679          [Explicit]
1680          public void F_Max_Min_Nm_S_D([ValueSource(nameof(_F_Max_Min_Nm_S_D_))] uint opcodes,
1681                                       [ValueSource(nameof(_1D_F_))] ulong a,
1682                                       [ValueSource(nameof(_1D_F_))] ulong b)
1683          {
1684              ulong z = TestContext.CurrentContext.Random.NextULong();
1685              V128 v0 = MakeVectorE1(z);
1686              V128 v1 = MakeVectorE0(a);
1687              V128 v2 = MakeVectorE0(b);
1688  
1689              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1690  
1691              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1692              fpcr |= rnd & (1 << (int)Fpcr.Dn);
1693  
1694              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, fpcr: fpcr);
1695  
1696              CompareAgainstUnicorn(fpsrMask: Fpsr.Ioc | Fpsr.Idc);
1697          }
1698  
1699          [Test, Pairwise]
1700          [Explicit]
1701          public void F_Max_Min_Nm_P_V_2S_4S([ValueSource(nameof(_F_Max_Min_Nm_P_V_2S_4S_))] uint opcodes,
1702                                             [Values(0u)] uint rd,
1703                                             [Values(1u, 0u)] uint rn,
1704                                             [Values(2u, 0u)] uint rm,
1705                                             [ValueSource(nameof(_2S_F_))] ulong z,
1706                                             [ValueSource(nameof(_2S_F_))] ulong a,
1707                                             [ValueSource(nameof(_2S_F_))] ulong b,
1708                                             [Values(0b0u, 0b1u)] uint q) // <2S, 4S>
1709          {
1710              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1711              opcodes |= ((q & 1) << 30);
1712  
1713              V128 v0 = MakeVectorE0E1(z, z);
1714              V128 v1 = MakeVectorE0E1(a, a * q);
1715              V128 v2 = MakeVectorE0E1(b, b * q);
1716  
1717              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1718  
1719              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1720              fpcr |= rnd & (1 << (int)Fpcr.Dn);
1721  
1722              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, fpcr: fpcr);
1723  
1724              CompareAgainstUnicorn(fpsrMask: Fpsr.Ioc | Fpsr.Idc);
1725          }
1726  
1727          [Test, Pairwise]
1728          [Explicit]
1729          public void F_Max_Min_Nm_P_V_2D([ValueSource(nameof(_F_Max_Min_Nm_P_V_2D_))] uint opcodes,
1730                                          [Values(0u)] uint rd,
1731                                          [Values(1u, 0u)] uint rn,
1732                                          [Values(2u, 0u)] uint rm,
1733                                          [ValueSource(nameof(_1D_F_))] ulong z,
1734                                          [ValueSource(nameof(_1D_F_))] ulong a,
1735                                          [ValueSource(nameof(_1D_F_))] ulong b)
1736          {
1737              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1738  
1739              V128 v0 = MakeVectorE0E1(z, z);
1740              V128 v1 = MakeVectorE0E1(a, a);
1741              V128 v2 = MakeVectorE0E1(b, b);
1742  
1743              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1744  
1745              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1746              fpcr |= rnd & (1 << (int)Fpcr.Dn);
1747  
1748              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, fpcr: fpcr);
1749  
1750              CompareAgainstUnicorn(fpsrMask: Fpsr.Ioc | Fpsr.Idc);
1751          }
1752  
1753          // Fused.
1754          [Test, Pairwise]
1755          [Explicit]
1756          public void F_Mla_Mls_V_2S_4S([ValueSource(nameof(_F_Mla_Mls_V_2S_4S_))] uint opcodes,
1757                                        [Values(0u)] uint rd,
1758                                        [Values(1u, 0u)] uint rn,
1759                                        [Values(2u, 0u)] uint rm,
1760                                        [ValueSource(nameof(_2S_F_))] ulong z,
1761                                        [ValueSource(nameof(_2S_F_))] ulong a,
1762                                        [ValueSource(nameof(_2S_F_))] ulong b,
1763                                        [Values(0b0u, 0b1u)] uint q) // <2S, 4S>
1764          {
1765              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1766              opcodes |= ((q & 1) << 30);
1767  
1768              V128 v0 = MakeVectorE0E1(z, z);
1769              V128 v1 = MakeVectorE0E1(a, a * q);
1770              V128 v2 = MakeVectorE0E1(b, b * q);
1771  
1772              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1773  
1774              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1775              fpcr |= rnd & (1 << (int)Fpcr.Dn);
1776  
1777              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, fpcr: fpcr);
1778  
1779              CompareAgainstUnicorn(Fpsr.Ioc | Fpsr.Idc, FpSkips.IfUnderflow, FpTolerances.UpToOneUlpsS);
1780          }
1781  
1782          // Fused.
1783          [Test, Pairwise]
1784          [Explicit]
1785          public void F_Mla_Mls_V_2D([ValueSource(nameof(_F_Mla_Mls_V_2D_))] uint opcodes,
1786                                     [Values(0u)] uint rd,
1787                                     [Values(1u, 0u)] uint rn,
1788                                     [Values(2u, 0u)] uint rm,
1789                                     [ValueSource(nameof(_1D_F_))] ulong z,
1790                                     [ValueSource(nameof(_1D_F_))] ulong a,
1791                                     [ValueSource(nameof(_1D_F_))] ulong b)
1792          {
1793              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1794  
1795              V128 v0 = MakeVectorE0E1(z, z);
1796              V128 v1 = MakeVectorE0E1(a, a);
1797              V128 v2 = MakeVectorE0E1(b, b);
1798  
1799              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1800  
1801              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1802              fpcr |= rnd & (1 << (int)Fpcr.Dn);
1803  
1804              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, fpcr: fpcr);
1805  
1806              CompareAgainstUnicorn(Fpsr.Ioc | Fpsr.Idc, FpSkips.IfUnderflow, FpTolerances.UpToOneUlpsD);
1807          }
1808  
1809          // Fused.
1810          [Test, Pairwise]
1811          [Explicit]
1812          public void F_Recps_Rsqrts_S_S([ValueSource(nameof(_F_Recps_Rsqrts_S_S_))] uint opcodes,
1813                                         [ValueSource(nameof(_1S_F_))] ulong a,
1814                                         [ValueSource(nameof(_1S_F_))] ulong b)
1815          {
1816              ulong z = TestContext.CurrentContext.Random.NextULong();
1817              V128 v0 = MakeVectorE0E1(z, z);
1818              V128 v1 = MakeVectorE0(a);
1819              V128 v2 = MakeVectorE0(b);
1820  
1821              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1822  
1823              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1824              fpcr |= rnd & (1 << (int)Fpcr.Dn);
1825  
1826              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, fpcr: fpcr);
1827  
1828              CompareAgainstUnicorn(Fpsr.Ioc | Fpsr.Idc, FpSkips.IfUnderflow, FpTolerances.UpToOneUlpsS);
1829          }
1830  
1831          // Fused.
1832          [Test, Pairwise]
1833          [Explicit]
1834          public void F_Recps_Rsqrts_S_D([ValueSource(nameof(_F_Recps_Rsqrts_S_D_))] uint opcodes,
1835                                         [ValueSource(nameof(_1D_F_))] ulong a,
1836                                         [ValueSource(nameof(_1D_F_))] ulong b)
1837          {
1838              ulong z = TestContext.CurrentContext.Random.NextULong();
1839              V128 v0 = MakeVectorE1(z);
1840              V128 v1 = MakeVectorE0(a);
1841              V128 v2 = MakeVectorE0(b);
1842  
1843              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1844  
1845              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1846              fpcr |= rnd & (1 << (int)Fpcr.Dn);
1847  
1848              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, fpcr: fpcr);
1849  
1850              CompareAgainstUnicorn(Fpsr.Ioc | Fpsr.Idc, FpSkips.IfUnderflow, FpTolerances.UpToOneUlpsD);
1851          }
1852  
1853          // Fused.
1854          [Test, Pairwise]
1855          [Explicit]
1856          public void F_Recps_Rsqrts_V_2S_4S([ValueSource(nameof(_F_Recps_Rsqrts_V_2S_4S_))] uint opcodes,
1857                                             [Values(0u)] uint rd,
1858                                             [Values(1u, 0u)] uint rn,
1859                                             [Values(2u, 0u)] uint rm,
1860                                             [ValueSource(nameof(_2S_F_))] ulong z,
1861                                             [ValueSource(nameof(_2S_F_))] ulong a,
1862                                             [ValueSource(nameof(_2S_F_))] ulong b,
1863                                             [Values(0b0u, 0b1u)] uint q) // <2S, 4S>
1864          {
1865              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1866              opcodes |= ((q & 1) << 30);
1867  
1868              V128 v0 = MakeVectorE0E1(z, z);
1869              V128 v1 = MakeVectorE0E1(a, a * q);
1870              V128 v2 = MakeVectorE0E1(b, b * q);
1871  
1872              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1873  
1874              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1875              fpcr |= rnd & (1 << (int)Fpcr.Dn);
1876  
1877              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, fpcr: fpcr);
1878  
1879              CompareAgainstUnicorn(Fpsr.Ioc | Fpsr.Idc, FpSkips.IfUnderflow, FpTolerances.UpToOneUlpsS);
1880          }
1881  
1882          // Fused.
1883          [Test, Pairwise]
1884          [Explicit]
1885          public void F_Recps_Rsqrts_V_2D([ValueSource(nameof(_F_Recps_Rsqrts_V_2D_))] uint opcodes,
1886                                          [Values(0u)] uint rd,
1887                                          [Values(1u, 0u)] uint rn,
1888                                          [Values(2u, 0u)] uint rm,
1889                                          [ValueSource(nameof(_1D_F_))] ulong z,
1890                                          [ValueSource(nameof(_1D_F_))] ulong a,
1891                                          [ValueSource(nameof(_1D_F_))] ulong b)
1892          {
1893              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1894  
1895              V128 v0 = MakeVectorE0E1(z, z);
1896              V128 v1 = MakeVectorE0E1(a, a);
1897              V128 v2 = MakeVectorE0E1(b, b);
1898  
1899              int rnd = (int)TestContext.CurrentContext.Random.NextUInt();
1900  
1901              int fpcr = rnd & (1 << (int)Fpcr.Fz);
1902              fpcr |= rnd & (1 << (int)Fpcr.Dn);
1903  
1904              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2, fpcr: fpcr);
1905  
1906              CompareAgainstUnicorn(Fpsr.Ioc | Fpsr.Idc, FpSkips.IfUnderflow, FpTolerances.UpToOneUlpsD);
1907          }
1908  
1909          [Test, Pairwise]
1910          public void Mla_Mls_Mul_V_8B_4H_2S([ValueSource(nameof(_Mla_Mls_Mul_V_8B_4H_2S_))] uint opcodes,
1911                                             [Values(0u)] uint rd,
1912                                             [Values(1u, 0u)] uint rn,
1913                                             [Values(2u, 0u)] uint rm,
1914                                             [ValueSource(nameof(_8B4H2S_))] ulong z,
1915                                             [ValueSource(nameof(_8B4H2S_))] ulong a,
1916                                             [ValueSource(nameof(_8B4H2S_))] ulong b,
1917                                             [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
1918          {
1919              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1920              opcodes |= ((size & 3) << 22);
1921  
1922              V128 v0 = MakeVectorE0E1(z, z);
1923              V128 v1 = MakeVectorE0(a);
1924              V128 v2 = MakeVectorE0(b);
1925  
1926              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2);
1927  
1928              CompareAgainstUnicorn();
1929          }
1930  
1931          [Test, Pairwise]
1932          public void Mla_Mls_Mul_V_16B_8H_4S([ValueSource(nameof(_Mla_Mls_Mul_V_16B_8H_4S_))] uint opcodes,
1933                                              [Values(0u)] uint rd,
1934                                              [Values(1u, 0u)] uint rn,
1935                                              [Values(2u, 0u)] uint rm,
1936                                              [ValueSource(nameof(_8B4H2S_))] ulong z,
1937                                              [ValueSource(nameof(_8B4H2S_))] ulong a,
1938                                              [ValueSource(nameof(_8B4H2S_))] ulong b,
1939                                              [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
1940          {
1941              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1942              opcodes |= ((size & 3) << 22);
1943  
1944              V128 v0 = MakeVectorE0E1(z, z);
1945              V128 v1 = MakeVectorE0E1(a, a);
1946              V128 v2 = MakeVectorE0E1(b, b);
1947  
1948              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2);
1949  
1950              CompareAgainstUnicorn();
1951          }
1952  
1953          [Test, Pairwise, Description("ORN <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
1954          public void Orn_V_8B([Values(0u)] uint rd,
1955                               [Values(1u, 0u)] uint rn,
1956                               [Values(2u, 0u)] uint rm,
1957                               [ValueSource(nameof(_8B_))] ulong z,
1958                               [ValueSource(nameof(_8B_))] ulong a,
1959                               [ValueSource(nameof(_8B_))] ulong b)
1960          {
1961              uint opcode = 0x0EE01C00; // ORN V0.8B, V0.8B, V0.8B
1962              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1963  
1964              V128 v0 = MakeVectorE0E1(z, z);
1965              V128 v1 = MakeVectorE0(a);
1966              V128 v2 = MakeVectorE0(b);
1967  
1968              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1969  
1970              CompareAgainstUnicorn();
1971          }
1972  
1973          [Test, Pairwise, Description("ORN <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
1974          public void Orn_V_16B([Values(0u)] uint rd,
1975                                [Values(1u, 0u)] uint rn,
1976                                [Values(2u, 0u)] uint rm,
1977                                [ValueSource(nameof(_8B_))] ulong z,
1978                                [ValueSource(nameof(_8B_))] ulong a,
1979                                [ValueSource(nameof(_8B_))] ulong b)
1980          {
1981              uint opcode = 0x4EE01C00; // ORN V0.16B, V0.16B, V0.16B
1982              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
1983  
1984              V128 v0 = MakeVectorE0E1(z, z);
1985              V128 v1 = MakeVectorE0E1(a, a);
1986              V128 v2 = MakeVectorE0E1(b, b);
1987  
1988              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
1989  
1990              CompareAgainstUnicorn();
1991          }
1992  
1993          [Test, Pairwise, Description("ORR <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
1994          public void Orr_V_8B([Values(0u)] uint rd,
1995                               [Values(1u, 0u)] uint rn,
1996                               [Values(2u, 0u)] uint rm,
1997                               [ValueSource(nameof(_8B_))] ulong z,
1998                               [ValueSource(nameof(_8B_))] ulong a,
1999                               [ValueSource(nameof(_8B_))] ulong b)
2000          {
2001              uint opcode = 0x0EA01C00; // ORR V0.8B, V0.8B, V0.8B
2002              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2003  
2004              V128 v0 = MakeVectorE0E1(z, z);
2005              V128 v1 = MakeVectorE0(a);
2006              V128 v2 = MakeVectorE0(b);
2007  
2008              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2009  
2010              CompareAgainstUnicorn();
2011          }
2012  
2013          [Test, Pairwise, Description("ORR <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
2014          public void Orr_V_16B([Values(0u)] uint rd,
2015                                [Values(1u, 0u)] uint rn,
2016                                [Values(2u, 0u)] uint rm,
2017                                [ValueSource(nameof(_8B_))] ulong z,
2018                                [ValueSource(nameof(_8B_))] ulong a,
2019                                [ValueSource(nameof(_8B_))] ulong b)
2020          {
2021              uint opcode = 0x4EA01C00; // ORR V0.16B, V0.16B, V0.16B
2022              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2023  
2024              V128 v0 = MakeVectorE0E1(z, z);
2025              V128 v1 = MakeVectorE0E1(a, a);
2026              V128 v2 = MakeVectorE0E1(b, b);
2027  
2028              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2029  
2030              CompareAgainstUnicorn();
2031          }
2032  
2033          [Test, Pairwise, Description("PMULL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
2034          public void Pmull_V([Values(0u)] uint rd,
2035                              [Values(1u, 0u)] uint rn,
2036                              [Values(2u, 0u)] uint rm,
2037                              [ValueSource(nameof(_8B1D_))] ulong z0,
2038                              [ValueSource(nameof(_8B1D_))] ulong z1,
2039                              [ValueSource(nameof(_8B1D_))] ulong a0,
2040                              [ValueSource(nameof(_8B1D_))] ulong a1,
2041                              [ValueSource(nameof(_8B1D_))] ulong b0,
2042                              [ValueSource(nameof(_8B1D_))] ulong b1,
2043                              [Values(0b00u, 0b11u)] uint size, // Q0: <8B,  1D> => <8H, 1Q>
2044                              [Values(0b0u, 0b1u)] uint q) // Q1: <16B, 2D> => <8H, 1Q>
2045          {
2046              uint opcode = 0x0E20E000; // PMULL V0.8H, V0.8B, V0.8B
2047              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2048              opcode |= ((size & 3) << 22);
2049              opcode |= ((q & 1) << 30);
2050  
2051              V128 v0 = MakeVectorE0E1(z0, z1);
2052              V128 v1 = MakeVectorE0E1(a0, a1);
2053              V128 v2 = MakeVectorE0E1(b0, b1);
2054  
2055              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2056  
2057              CompareAgainstUnicorn();
2058          }
2059  
2060          [Test, Pairwise, Description("RADDHN{2} <Vd>.<Tb>, <Vn>.<Ta>, <Vm>.<Ta>")]
2061          public void Raddhn_V_8H8B_4S4H_2D2S([Values(0u)] uint rd,
2062                                              [Values(1u, 0u)] uint rn,
2063                                              [Values(2u, 0u)] uint rm,
2064                                              [ValueSource(nameof(_4H2S1D_))] ulong z,
2065                                              [ValueSource(nameof(_4H2S1D_))] ulong a,
2066                                              [ValueSource(nameof(_4H2S1D_))] ulong b,
2067                                              [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H8B, 4S4H, 2D2S>
2068          {
2069              uint opcode = 0x2E204000; // RADDHN V0.8B, V0.8H, V0.8H
2070              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2071              opcode |= ((size & 3) << 22);
2072  
2073              V128 v0 = MakeVectorE0E1(z, z);
2074              V128 v1 = MakeVectorE0E1(a, a);
2075              V128 v2 = MakeVectorE0E1(b, b);
2076  
2077              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2078  
2079              CompareAgainstUnicorn();
2080          }
2081  
2082          [Test, Pairwise, Description("RADDHN{2} <Vd>.<Tb>, <Vn>.<Ta>, <Vm>.<Ta>")]
2083          public void Raddhn_V_8H16B_4S8H_2D4S([Values(0u)] uint rd,
2084                                               [Values(1u, 0u)] uint rn,
2085                                               [Values(2u, 0u)] uint rm,
2086                                               [ValueSource(nameof(_4H2S1D_))] ulong z,
2087                                               [ValueSource(nameof(_4H2S1D_))] ulong a,
2088                                               [ValueSource(nameof(_4H2S1D_))] ulong b,
2089                                               [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H16B, 4S8H, 2D4S>
2090          {
2091              uint opcode = 0x6E204000; // RADDHN2 V0.16B, V0.8H, V0.8H
2092              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2093              opcode |= ((size & 3) << 22);
2094  
2095              V128 v0 = MakeVectorE0E1(z, z);
2096              V128 v1 = MakeVectorE0E1(a, a);
2097              V128 v2 = MakeVectorE0E1(b, b);
2098  
2099              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2100  
2101              CompareAgainstUnicorn();
2102          }
2103  
2104          [Test, Pairwise, Description("RSUBHN{2} <Vd>.<Tb>, <Vn>.<Ta>, <Vm>.<Ta>")]
2105          public void Rsubhn_V_8H8B_4S4H_2D2S([Values(0u)] uint rd,
2106                                              [Values(1u, 0u)] uint rn,
2107                                              [Values(2u, 0u)] uint rm,
2108                                              [ValueSource(nameof(_4H2S1D_))] ulong z,
2109                                              [ValueSource(nameof(_4H2S1D_))] ulong a,
2110                                              [ValueSource(nameof(_4H2S1D_))] ulong b,
2111                                              [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H8B, 4S4H, 2D2S>
2112          {
2113              uint opcode = 0x2E206000; // RSUBHN V0.8B, V0.8H, V0.8H
2114              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2115              opcode |= ((size & 3) << 22);
2116  
2117              V128 v0 = MakeVectorE0E1(z, z);
2118              V128 v1 = MakeVectorE0E1(a, a);
2119              V128 v2 = MakeVectorE0E1(b, b);
2120  
2121              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2122  
2123              CompareAgainstUnicorn();
2124          }
2125  
2126          [Test, Pairwise, Description("RSUBHN{2} <Vd>.<Tb>, <Vn>.<Ta>, <Vm>.<Ta>")]
2127          public void Rsubhn_V_8H16B_4S8H_2D4S([Values(0u)] uint rd,
2128                                               [Values(1u, 0u)] uint rn,
2129                                               [Values(2u, 0u)] uint rm,
2130                                               [ValueSource(nameof(_4H2S1D_))] ulong z,
2131                                               [ValueSource(nameof(_4H2S1D_))] ulong a,
2132                                               [ValueSource(nameof(_4H2S1D_))] ulong b,
2133                                               [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H16B, 4S8H, 2D4S>
2134          {
2135              uint opcode = 0x6E206000; // RSUBHN2 V0.16B, V0.8H, V0.8H
2136              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2137              opcode |= ((size & 3) << 22);
2138  
2139              V128 v0 = MakeVectorE0E1(z, z);
2140              V128 v1 = MakeVectorE0E1(a, a);
2141              V128 v2 = MakeVectorE0E1(b, b);
2142  
2143              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2144  
2145              CompareAgainstUnicorn();
2146          }
2147  
2148          [Test, Pairwise, Description("SABA <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
2149          public void Saba_V_8B_4H_2S([Values(0u)] uint rd,
2150                                      [Values(1u, 0u)] uint rn,
2151                                      [Values(2u, 0u)] uint rm,
2152                                      [ValueSource(nameof(_8B4H2S_))] ulong z,
2153                                      [ValueSource(nameof(_8B4H2S_))] ulong a,
2154                                      [ValueSource(nameof(_8B4H2S_))] ulong b,
2155                                      [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
2156          {
2157              uint opcode = 0x0E207C00; // SABA V0.8B, V0.8B, V0.8B
2158              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2159              opcode |= ((size & 3) << 22);
2160  
2161              V128 v0 = MakeVectorE0E1(z, z);
2162              V128 v1 = MakeVectorE0(a);
2163              V128 v2 = MakeVectorE0(b);
2164  
2165              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2166  
2167              CompareAgainstUnicorn();
2168          }
2169  
2170          [Test, Pairwise, Description("SABA <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
2171          public void Saba_V_16B_8H_4S([Values(0u)] uint rd,
2172                                       [Values(1u, 0u)] uint rn,
2173                                       [Values(2u, 0u)] uint rm,
2174                                       [ValueSource(nameof(_8B4H2S_))] ulong z,
2175                                       [ValueSource(nameof(_8B4H2S_))] ulong a,
2176                                       [ValueSource(nameof(_8B4H2S_))] ulong b,
2177                                       [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
2178          {
2179              uint opcode = 0x4E207C00; // SABA V0.16B, V0.16B, V0.16B
2180              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2181              opcode |= ((size & 3) << 22);
2182  
2183              V128 v0 = MakeVectorE0E1(z, z);
2184              V128 v1 = MakeVectorE0E1(a, a);
2185              V128 v2 = MakeVectorE0E1(b, b);
2186  
2187              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2188  
2189              CompareAgainstUnicorn();
2190          }
2191  
2192          [Test, Pairwise, Description("SABAL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
2193          public void Sabal_V_8B8H_4H4S_2S2D([Values(0u)] uint rd,
2194                                             [Values(1u, 0u)] uint rn,
2195                                             [Values(2u, 0u)] uint rm,
2196                                             [ValueSource(nameof(_8B4H2S_))] ulong z,
2197                                             [ValueSource(nameof(_8B4H2S_))] ulong a,
2198                                             [ValueSource(nameof(_8B4H2S_))] ulong b,
2199                                             [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H, 4H4S, 2S2D>
2200          {
2201              uint opcode = 0x0E205000; // SABAL V0.8H, V0.8B, V0.8B
2202              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2203              opcode |= ((size & 3) << 22);
2204  
2205              V128 v0 = MakeVectorE0E1(z, z);
2206              V128 v1 = MakeVectorE0(a);
2207              V128 v2 = MakeVectorE0(b);
2208  
2209              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2210  
2211              CompareAgainstUnicorn();
2212          }
2213  
2214          [Test, Pairwise, Description("SABAL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
2215          public void Sabal_V_16B8H_8H4S_4S2D([Values(0u)] uint rd,
2216                                              [Values(1u, 0u)] uint rn,
2217                                              [Values(2u, 0u)] uint rm,
2218                                              [ValueSource(nameof(_8B4H2S_))] ulong z,
2219                                              [ValueSource(nameof(_8B4H2S_))] ulong a,
2220                                              [ValueSource(nameof(_8B4H2S_))] ulong b,
2221                                              [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H, 8H4S, 4S2D>
2222          {
2223              uint opcode = 0x4E205000; // SABAL2 V0.8H, V0.16B, V0.16B
2224              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2225              opcode |= ((size & 3) << 22);
2226  
2227              V128 v0 = MakeVectorE0E1(z, z);
2228              V128 v1 = MakeVectorE1(a);
2229              V128 v2 = MakeVectorE1(b);
2230  
2231              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2232  
2233              CompareAgainstUnicorn();
2234          }
2235  
2236          [Test, Pairwise, Description("SABD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
2237          public void Sabd_V_8B_4H_2S([Values(0u)] uint rd,
2238                                      [Values(1u, 0u)] uint rn,
2239                                      [Values(2u, 0u)] uint rm,
2240                                      [ValueSource(nameof(_8B4H2S_))] ulong z,
2241                                      [ValueSource(nameof(_8B4H2S_))] ulong a,
2242                                      [ValueSource(nameof(_8B4H2S_))] ulong b,
2243                                      [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
2244          {
2245              uint opcode = 0x0E207400; // SABD V0.8B, V0.8B, V0.8B
2246              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2247              opcode |= ((size & 3) << 22);
2248  
2249              V128 v0 = MakeVectorE0E1(z, z);
2250              V128 v1 = MakeVectorE0(a);
2251              V128 v2 = MakeVectorE0(b);
2252  
2253              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2254  
2255              CompareAgainstUnicorn();
2256          }
2257  
2258          [Test, Pairwise, Description("SABD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
2259          public void Sabd_V_16B_8H_4S([Values(0u)] uint rd,
2260                                       [Values(1u, 0u)] uint rn,
2261                                       [Values(2u, 0u)] uint rm,
2262                                       [ValueSource(nameof(_8B4H2S_))] ulong z,
2263                                       [ValueSource(nameof(_8B4H2S_))] ulong a,
2264                                       [ValueSource(nameof(_8B4H2S_))] ulong b,
2265                                       [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
2266          {
2267              uint opcode = 0x4E207400; // SABD V0.16B, V0.16B, V0.16B
2268              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2269              opcode |= ((size & 3) << 22);
2270  
2271              V128 v0 = MakeVectorE0E1(z, z);
2272              V128 v1 = MakeVectorE0E1(a, a);
2273              V128 v2 = MakeVectorE0E1(b, b);
2274  
2275              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2276  
2277              CompareAgainstUnicorn();
2278          }
2279  
2280          [Test, Pairwise, Description("SABDL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
2281          public void Sabdl_V_8B8H_4H4S_2S2D([Values(0u)] uint rd,
2282                                             [Values(1u, 0u)] uint rn,
2283                                             [Values(2u, 0u)] uint rm,
2284                                             [ValueSource(nameof(_8B4H2S_))] ulong z,
2285                                             [ValueSource(nameof(_8B4H2S_))] ulong a,
2286                                             [ValueSource(nameof(_8B4H2S_))] ulong b,
2287                                             [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H, 4H4S, 2S2D>
2288          {
2289              uint opcode = 0x0E207000; // SABDL V0.8H, V0.8B, V0.8B
2290              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2291              opcode |= ((size & 3) << 22);
2292  
2293              V128 v0 = MakeVectorE0E1(z, z);
2294              V128 v1 = MakeVectorE0(a);
2295              V128 v2 = MakeVectorE0(b);
2296  
2297              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2298  
2299              CompareAgainstUnicorn();
2300          }
2301  
2302          [Test, Pairwise, Description("SABDL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
2303          public void Sabdl_V_16B8H_8H4S_4S2D([Values(0u)] uint rd,
2304                                              [Values(1u, 0u)] uint rn,
2305                                              [Values(2u, 0u)] uint rm,
2306                                              [ValueSource(nameof(_8B4H2S_))] ulong z,
2307                                              [ValueSource(nameof(_8B4H2S_))] ulong a,
2308                                              [ValueSource(nameof(_8B4H2S_))] ulong b,
2309                                              [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H, 8H4S, 4S2D>
2310          {
2311              uint opcode = 0x4E207000; // SABDL2 V0.8H, V0.16B, V0.16B
2312              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2313              opcode |= ((size & 3) << 22);
2314  
2315              V128 v0 = MakeVectorE0E1(z, z);
2316              V128 v1 = MakeVectorE1(a);
2317              V128 v2 = MakeVectorE1(b);
2318  
2319              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2320  
2321              CompareAgainstUnicorn();
2322          }
2323  
2324          [Test, Pairwise, Description("SADDL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
2325          public void Saddl_V_8B8H_4H4S_2S2D([Values(0u)] uint rd,
2326                                             [Values(1u, 0u)] uint rn,
2327                                             [Values(2u, 0u)] uint rm,
2328                                             [ValueSource(nameof(_8B4H2S_))] ulong z,
2329                                             [ValueSource(nameof(_8B4H2S_))] ulong a,
2330                                             [ValueSource(nameof(_8B4H2S_))] ulong b,
2331                                             [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H, 4H4S, 2S2D>
2332          {
2333              uint opcode = 0x0E200000; // SADDL V0.8H, V0.8B, V0.8B
2334              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2335              opcode |= ((size & 3) << 22);
2336  
2337              V128 v0 = MakeVectorE0E1(z, z);
2338              V128 v1 = MakeVectorE0(a);
2339              V128 v2 = MakeVectorE0(b);
2340  
2341              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2342  
2343              CompareAgainstUnicorn();
2344          }
2345  
2346          [Test, Pairwise, Description("SADDL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
2347          public void Saddl_V_16B8H_8H4S_4S2D([Values(0u)] uint rd,
2348                                              [Values(1u, 0u)] uint rn,
2349                                              [Values(2u, 0u)] uint rm,
2350                                              [ValueSource(nameof(_8B4H2S_))] ulong z,
2351                                              [ValueSource(nameof(_8B4H2S_))] ulong a,
2352                                              [ValueSource(nameof(_8B4H2S_))] ulong b,
2353                                              [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H, 8H4S, 4S2D>
2354          {
2355              uint opcode = 0x4E200000; // SADDL2 V0.8H, V0.16B, V0.16B
2356              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2357              opcode |= ((size & 3) << 22);
2358  
2359              V128 v0 = MakeVectorE0E1(z, z);
2360              V128 v1 = MakeVectorE1(a);
2361              V128 v2 = MakeVectorE1(b);
2362  
2363              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2364  
2365              CompareAgainstUnicorn();
2366          }
2367  
2368          [Test, Pairwise, Description("SADDW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
2369          public void Saddw_V_8B8H8H_4H4S4S_2S2D2D([Values(0u)] uint rd,
2370                                                   [Values(1u, 0u)] uint rn,
2371                                                   [Values(2u, 0u)] uint rm,
2372                                                   [ValueSource(nameof(_8B4H2S1D_))] ulong z,
2373                                                   [ValueSource(nameof(_4H2S1D_))][Random(RndCnt)] ulong a,
2374                                                   [ValueSource(nameof(_8B4H2S_))][Random(RndCnt)] ulong b,
2375                                                   [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H8H, 4H4S4S, 2S2D2D>
2376          {
2377              uint opcode = 0x0E201000; // SADDW V0.8H, V0.8H, V0.8B
2378              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2379              opcode |= ((size & 3) << 22);
2380  
2381              V128 v0 = MakeVectorE0E1(z, z);
2382              V128 v1 = MakeVectorE0E1(a, a);
2383              V128 v2 = MakeVectorE0(b);
2384  
2385              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2386  
2387              CompareAgainstUnicorn();
2388          }
2389  
2390          [Test, Pairwise, Description("SADDW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
2391          public void Saddw_V_16B8H8H_8H4S4S_4S2D2D([Values(0u)] uint rd,
2392                                                    [Values(1u, 0u)] uint rn,
2393                                                    [Values(2u, 0u)] uint rm,
2394                                                    [ValueSource(nameof(_8B4H2S1D_))] ulong z,
2395                                                    [ValueSource(nameof(_4H2S1D_))][Random(RndCnt)] ulong a,
2396                                                    [ValueSource(nameof(_8B4H2S_))][Random(RndCnt)] ulong b,
2397                                                    [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H8H, 8H4S4S, 4S2D2D>
2398          {
2399              uint opcode = 0x4E201000; // SADDW2 V0.8H, V0.8H, V0.16B
2400              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2401              opcode |= ((size & 3) << 22);
2402  
2403              V128 v0 = MakeVectorE0E1(z, z);
2404              V128 v1 = MakeVectorE0E1(a, a);
2405              V128 v2 = MakeVectorE1(b);
2406  
2407              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2408  
2409              CompareAgainstUnicorn();
2410          }
2411  
2412          [Test, Pairwise]
2413          public void Sha1c_Sha1m_Sha1p_Sha1su0_V([ValueSource(nameof(_Sha1c_Sha1m_Sha1p_Sha1su0_V_))] uint opcodes,
2414                                                  [Values(0u)] uint rd,
2415                                                  [Values(1u, 0u)] uint rn,
2416                                                  [Values(2u, 0u)] uint rm,
2417                                                  [Random(RndCnt / 2)] ulong z0, [Random(RndCnt / 2)] ulong z1,
2418                                                  [Random(RndCnt / 2)] ulong a0, [Random(RndCnt / 2)] ulong a1,
2419                                                  [Random(RndCnt / 2)] ulong b0, [Random(RndCnt / 2)] ulong b1)
2420          {
2421              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2422  
2423              V128 v0 = MakeVectorE0E1(z0, z1);
2424              V128 v1 = MakeVectorE0E1(a0, a1);
2425              V128 v2 = MakeVectorE0E1(b0, b1);
2426  
2427              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2);
2428  
2429              CompareAgainstUnicorn();
2430          }
2431  
2432          [Test, Pairwise]
2433          public void Sha256h_Sha256h2_Sha256su1_V([ValueSource(nameof(_Sha256h_Sha256h2_Sha256su1_V_))] uint opcodes,
2434                                                   [Values(0u)] uint rd,
2435                                                   [Values(1u, 0u)] uint rn,
2436                                                   [Values(2u, 0u)] uint rm,
2437                                                   [Random(RndCnt / 2)] ulong z0, [Random(RndCnt / 2)] ulong z1,
2438                                                   [Random(RndCnt / 2)] ulong a0, [Random(RndCnt / 2)] ulong a1,
2439                                                   [Random(RndCnt / 2)] ulong b0, [Random(RndCnt / 2)] ulong b1)
2440          {
2441              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2442  
2443              V128 v0 = MakeVectorE0E1(z0, z1);
2444              V128 v1 = MakeVectorE0E1(a0, a1);
2445              V128 v2 = MakeVectorE0E1(b0, b1);
2446  
2447              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2);
2448  
2449              CompareAgainstUnicorn();
2450          }
2451  
2452          [Test, Pairwise, Description("SHADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
2453          public void Shadd_V_8B_4H_2S([Values(0u)] uint rd,
2454                                       [Values(1u, 0u)] uint rn,
2455                                       [Values(2u, 0u)] uint rm,
2456                                       [ValueSource(nameof(_8B4H2S_))] ulong z,
2457                                       [ValueSource(nameof(_8B4H2S_))] ulong a,
2458                                       [ValueSource(nameof(_8B4H2S_))] ulong b,
2459                                       [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
2460          {
2461              uint opcode = 0x0E200400; // SHADD V0.8B, V0.8B, V0.8B
2462              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2463              opcode |= ((size & 3) << 22);
2464  
2465              V128 v0 = MakeVectorE0E1(z, z);
2466              V128 v1 = MakeVectorE0(a);
2467              V128 v2 = MakeVectorE0(b);
2468  
2469              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2470  
2471              CompareAgainstUnicorn();
2472          }
2473  
2474          [Test, Pairwise, Description("SHADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
2475          public void Shadd_V_16B_8H_4S([Values(0u)] uint rd,
2476                                        [Values(1u, 0u)] uint rn,
2477                                        [Values(2u, 0u)] uint rm,
2478                                        [ValueSource(nameof(_8B4H2S_))] ulong z,
2479                                        [ValueSource(nameof(_8B4H2S_))] ulong a,
2480                                        [ValueSource(nameof(_8B4H2S_))] ulong b,
2481                                        [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
2482          {
2483              uint opcode = 0x4E200400; // SHADD V0.16B, V0.16B, V0.16B
2484              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2485              opcode |= ((size & 3) << 22);
2486  
2487              V128 v0 = MakeVectorE0E1(z, z);
2488              V128 v1 = MakeVectorE0E1(a, a);
2489              V128 v2 = MakeVectorE0E1(b, b);
2490  
2491              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2492  
2493              CompareAgainstUnicorn();
2494          }
2495  
2496          [Test, Pairwise, Description("SHSUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
2497          public void Shsub_V_8B_4H_2S([Values(0u)] uint rd,
2498                                       [Values(1u, 0u)] uint rn,
2499                                       [Values(2u, 0u)] uint rm,
2500                                       [ValueSource(nameof(_8B4H2S_))] ulong z,
2501                                       [ValueSource(nameof(_8B4H2S_))] ulong a,
2502                                       [ValueSource(nameof(_8B4H2S_))] ulong b,
2503                                       [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
2504          {
2505              uint opcode = 0x0E202400; // SHSUB V0.8B, V0.8B, V0.8B
2506              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2507              opcode |= ((size & 3) << 22);
2508  
2509              V128 v0 = MakeVectorE0E1(z, z);
2510              V128 v1 = MakeVectorE0(a);
2511              V128 v2 = MakeVectorE0(b);
2512  
2513              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2514  
2515              CompareAgainstUnicorn();
2516          }
2517  
2518          [Test, Pairwise, Description("SHSUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
2519          public void Shsub_V_16B_8H_4S([Values(0u)] uint rd,
2520                                        [Values(1u, 0u)] uint rn,
2521                                        [Values(2u, 0u)] uint rm,
2522                                        [ValueSource(nameof(_8B4H2S_))] ulong z,
2523                                        [ValueSource(nameof(_8B4H2S_))] ulong a,
2524                                        [ValueSource(nameof(_8B4H2S_))] ulong b,
2525                                        [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
2526          {
2527              uint opcode = 0x4E202400; // SHSUB V0.16B, V0.16B, V0.16B
2528              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2529              opcode |= ((size & 3) << 22);
2530  
2531              V128 v0 = MakeVectorE0E1(z, z);
2532              V128 v1 = MakeVectorE0E1(a, a);
2533              V128 v2 = MakeVectorE0E1(b, b);
2534  
2535              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2536  
2537              CompareAgainstUnicorn();
2538          }
2539  
2540          [Test, Pairwise]
2541          public void SU_Max_Min_P_V([ValueSource(nameof(_SU_Max_Min_P_V_))] uint opcodes,
2542                                     [Values(0u)] uint rd,
2543                                     [Values(1u, 0u)] uint rn,
2544                                     [Values(2u, 0u)] uint rm,
2545                                     [ValueSource(nameof(_8B4H2S_))] ulong z,
2546                                     [ValueSource(nameof(_8B4H2S_))] ulong a,
2547                                     [ValueSource(nameof(_8B4H2S_))] ulong b,
2548                                     [Values(0b00u, 0b01u, 0b10u)] uint size, // Q0: <8B,  4H, 2S>
2549                                     [Values(0b0u, 0b1u)] uint q)             // Q1: <16B, 8H, 4S>
2550          {
2551              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2552              opcodes |= ((size & 3) << 22);
2553              opcodes |= ((q & 1) << 30);
2554  
2555              V128 v0 = MakeVectorE0E1(z, z);
2556              V128 v1 = MakeVectorE0E1(a, a * q);
2557              V128 v2 = MakeVectorE0E1(b, b * q);
2558  
2559              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2);
2560  
2561              CompareAgainstUnicorn();
2562          }
2563  
2564          [Test, Pairwise]
2565          public void SU_Mlal_Mlsl_Mull_V_8B8H_4H4S_2S2D([ValueSource(nameof(_SU_Mlal_Mlsl_Mull_V_8B8H_4H4S_2S2D_))] uint opcodes,
2566                                                         [Values(0u)] uint rd,
2567                                                         [Values(1u, 0u)] uint rn,
2568                                                         [Values(2u, 0u)] uint rm,
2569                                                         [ValueSource(nameof(_8B4H2S_))] ulong z,
2570                                                         [ValueSource(nameof(_8B4H2S_))] ulong a,
2571                                                         [ValueSource(nameof(_8B4H2S_))] ulong b,
2572                                                         [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H, 4H4S, 2S2D>
2573          {
2574              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2575              opcodes |= ((size & 3) << 22);
2576  
2577              V128 v0 = MakeVectorE0E1(z, z);
2578              V128 v1 = MakeVectorE0(a);
2579              V128 v2 = MakeVectorE0(b);
2580  
2581              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2);
2582  
2583              CompareAgainstUnicorn();
2584          }
2585  
2586          [Test, Pairwise]
2587          public void SU_Mlal_Mlsl_Mull_V_16B8H_8H4S_4S2D([ValueSource(nameof(_SU_Mlal_Mlsl_Mull_V_16B8H_8H4S_4S2D_))] uint opcodes,
2588                                                          [Values(0u)] uint rd,
2589                                                          [Values(1u, 0u)] uint rn,
2590                                                          [Values(2u, 0u)] uint rm,
2591                                                          [ValueSource(nameof(_8B4H2S_))] ulong z,
2592                                                          [ValueSource(nameof(_8B4H2S_))] ulong a,
2593                                                          [ValueSource(nameof(_8B4H2S_))] ulong b,
2594                                                          [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H, 8H4S, 4S2D>
2595          {
2596              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2597              opcodes |= ((size & 3) << 22);
2598  
2599              V128 v0 = MakeVectorE0E1(z, z);
2600              V128 v1 = MakeVectorE1(a);
2601              V128 v2 = MakeVectorE1(b);
2602  
2603              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2);
2604  
2605              CompareAgainstUnicorn();
2606          }
2607  
2608          [Test, Pairwise, Description("SQADD <V><d>, <V><n>, <V><m>")]
2609          public void Sqadd_S_B_H_S_D([Values(0u)] uint rd,
2610                                      [Values(1u, 0u)] uint rn,
2611                                      [Values(2u, 0u)] uint rm,
2612                                      [ValueSource(nameof(_1B1H1S1D_))] ulong z,
2613                                      [ValueSource(nameof(_1B1H1S1D_))] ulong a,
2614                                      [ValueSource(nameof(_1B1H1S1D_))] ulong b,
2615                                      [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <b, H, S, D>
2616          {
2617              uint opcode = 0x5E200C00; // SQADD B0, B0, B0
2618              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2619              opcode |= ((size & 3) << 22);
2620  
2621              V128 v0 = MakeVectorE0E1(z, z);
2622              V128 v1 = MakeVectorE0(a);
2623              V128 v2 = MakeVectorE0(b);
2624  
2625              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2626  
2627              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
2628          }
2629  
2630          [Test, Pairwise, Description("SQADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
2631          public void Sqadd_V_8B_4H_2S([Values(0u)] uint rd,
2632                                       [Values(1u, 0u)] uint rn,
2633                                       [Values(2u, 0u)] uint rm,
2634                                       [ValueSource(nameof(_8B4H2S_))] ulong z,
2635                                       [ValueSource(nameof(_8B4H2S_))] ulong a,
2636                                       [ValueSource(nameof(_8B4H2S_))] ulong b,
2637                                       [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
2638          {
2639              uint opcode = 0x0E200C00; // SQADD V0.8B, V0.8B, V0.8B
2640              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2641              opcode |= ((size & 3) << 22);
2642  
2643              V128 v0 = MakeVectorE0E1(z, z);
2644              V128 v1 = MakeVectorE0(a);
2645              V128 v2 = MakeVectorE0(b);
2646  
2647              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2648  
2649              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
2650          }
2651  
2652          [Test, Pairwise, Description("SQADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
2653          public void Sqadd_V_16B_8H_4S_2D([Values(0u)] uint rd,
2654                                           [Values(1u, 0u)] uint rn,
2655                                           [Values(2u, 0u)] uint rm,
2656                                           [ValueSource(nameof(_8B4H2S1D_))] ulong z,
2657                                           [ValueSource(nameof(_8B4H2S1D_))] ulong a,
2658                                           [ValueSource(nameof(_8B4H2S1D_))] ulong b,
2659                                           [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
2660          {
2661              uint opcode = 0x4E200C00; // SQADD V0.16B, V0.16B, V0.16B
2662              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2663              opcode |= ((size & 3) << 22);
2664  
2665              V128 v0 = MakeVectorE0E1(z, z);
2666              V128 v1 = MakeVectorE0E1(a, a);
2667              V128 v2 = MakeVectorE0E1(b, b);
2668  
2669              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2670  
2671              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
2672          }
2673  
2674          [Test, Pairwise, Description("SQDMULH <V><d>, <V><n>, <V><m>")]
2675          public void Sqdmulh_S_H_S([Values(0u)] uint rd,
2676                                    [Values(1u, 0u)] uint rn,
2677                                    [Values(2u, 0u)] uint rm,
2678                                    [ValueSource(nameof(_1H1S_))] ulong z,
2679                                    [ValueSource(nameof(_1H1S_))] ulong a,
2680                                    [ValueSource(nameof(_1H1S_))] ulong b,
2681                                    [Values(0b01u, 0b10u)] uint size) // <H, S>
2682          {
2683              uint opcode = 0x5E20B400; // SQDMULH B0, B0, B0 (RESERVED)
2684              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2685              opcode |= ((size & 3) << 22);
2686  
2687              V128 v0 = MakeVectorE0E1(z, z);
2688              V128 v1 = MakeVectorE0(a);
2689              V128 v2 = MakeVectorE0(b);
2690  
2691              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2692  
2693              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
2694          }
2695  
2696          [Test, Pairwise, Description("SQDMULH <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
2697          public void Sqdmulh_V_4H_2S([Values(0u)] uint rd,
2698                                      [Values(1u, 0u)] uint rn,
2699                                      [Values(2u, 0u)] uint rm,
2700                                      [ValueSource(nameof(_4H2S_))] ulong z,
2701                                      [ValueSource(nameof(_4H2S_))] ulong a,
2702                                      [ValueSource(nameof(_4H2S_))] ulong b,
2703                                      [Values(0b01u, 0b10u)] uint size) // <4H, 2S>
2704          {
2705              uint opcode = 0x0E20B400; // SQDMULH V0.8B, V0.8B, V0.8B (RESERVED)
2706              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2707              opcode |= ((size & 3) << 22);
2708  
2709              V128 v0 = MakeVectorE0E1(z, z);
2710              V128 v1 = MakeVectorE0(a);
2711              V128 v2 = MakeVectorE0(b);
2712  
2713              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2714  
2715              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
2716          }
2717  
2718          [Test, Pairwise, Description("SQDMULH <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
2719          public void Sqdmulh_V_8H_4S([Values(0u)] uint rd,
2720                                      [Values(1u, 0u)] uint rn,
2721                                      [Values(2u, 0u)] uint rm,
2722                                      [ValueSource(nameof(_4H2S_))] ulong z,
2723                                      [ValueSource(nameof(_4H2S_))] ulong a,
2724                                      [ValueSource(nameof(_4H2S_))] ulong b,
2725                                      [Values(0b01u, 0b10u)] uint size) // <8H, 4S>
2726          {
2727              uint opcode = 0x4E20B400; // SQDMULH V0.16B, V0.16B, V0.16B (RESERVED)
2728              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2729              opcode |= ((size & 3) << 22);
2730  
2731              V128 v0 = MakeVectorE0E1(z, z);
2732              V128 v1 = MakeVectorE0E1(a, a);
2733              V128 v2 = MakeVectorE0E1(b, b);
2734  
2735              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2736  
2737              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
2738          }
2739  
2740          [Test, Pairwise, Description("SQRDMULH <V><d>, <V><n>, <V><m>")]
2741          public void Sqrdmulh_S_H_S([Values(0u)] uint rd,
2742                                     [Values(1u, 0u)] uint rn,
2743                                     [Values(2u, 0u)] uint rm,
2744                                     [ValueSource(nameof(_1H1S_))] ulong z,
2745                                     [ValueSource(nameof(_1H1S_))] ulong a,
2746                                     [ValueSource(nameof(_1H1S_))] ulong b,
2747                                     [Values(0b01u, 0b10u)] uint size) // <H, S>
2748          {
2749              uint opcode = 0x7E20B400; // SQRDMULH B0, B0, B0 (RESERVED)
2750              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2751              opcode |= ((size & 3) << 22);
2752  
2753              V128 v0 = MakeVectorE0E1(z, z);
2754              V128 v1 = MakeVectorE0(a);
2755              V128 v2 = MakeVectorE0(b);
2756  
2757              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2758  
2759              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
2760          }
2761  
2762          [Test, Pairwise, Description("SQRDMULH <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
2763          public void Sqrdmulh_V_4H_2S([Values(0u)] uint rd,
2764                                       [Values(1u, 0u)] uint rn,
2765                                       [Values(2u, 0u)] uint rm,
2766                                       [ValueSource(nameof(_4H2S_))] ulong z,
2767                                       [ValueSource(nameof(_4H2S_))] ulong a,
2768                                       [ValueSource(nameof(_4H2S_))] ulong b,
2769                                       [Values(0b01u, 0b10u)] uint size) // <4H, 2S>
2770          {
2771              uint opcode = 0x2E20B400; // SQRDMULH V0.8B, V0.8B, V0.8B (RESERVED)
2772              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2773              opcode |= ((size & 3) << 22);
2774  
2775              V128 v0 = MakeVectorE0E1(z, z);
2776              V128 v1 = MakeVectorE0(a);
2777              V128 v2 = MakeVectorE0(b);
2778  
2779              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2780  
2781              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
2782          }
2783  
2784          [Test, Pairwise, Description("SQRDMULH <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
2785          public void Sqrdmulh_V_8H_4S([Values(0u)] uint rd,
2786                                       [Values(1u, 0u)] uint rn,
2787                                       [Values(2u, 0u)] uint rm,
2788                                       [ValueSource(nameof(_4H2S_))] ulong z,
2789                                       [ValueSource(nameof(_4H2S_))] ulong a,
2790                                       [ValueSource(nameof(_4H2S_))] ulong b,
2791                                       [Values(0b01u, 0b10u)] uint size) // <8H, 4S>
2792          {
2793              uint opcode = 0x6E20B400; // SQRDMULH V0.16B, V0.16B, V0.16B (RESERVED)
2794              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2795              opcode |= ((size & 3) << 22);
2796  
2797              V128 v0 = MakeVectorE0E1(z, z);
2798              V128 v1 = MakeVectorE0E1(a, a);
2799              V128 v2 = MakeVectorE0E1(b, b);
2800  
2801              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2802  
2803              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
2804          }
2805  
2806          [Test, Pairwise, Description("SQSUB <V><d>, <V><n>, <V><m>")]
2807          public void Sqsub_S_B_H_S_D([Values(0u)] uint rd,
2808                                      [Values(1u, 0u)] uint rn,
2809                                      [Values(2u, 0u)] uint rm,
2810                                      [ValueSource(nameof(_1B1H1S1D_))] ulong z,
2811                                      [ValueSource(nameof(_1B1H1S1D_))] ulong a,
2812                                      [ValueSource(nameof(_1B1H1S1D_))] ulong b,
2813                                      [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <b, H, S, D>
2814          {
2815              uint opcode = 0x5E202C00; // SQSUB B0, B0, B0
2816              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2817              opcode |= ((size & 3) << 22);
2818  
2819              V128 v0 = MakeVectorE0E1(z, z);
2820              V128 v1 = MakeVectorE0(a);
2821              V128 v2 = MakeVectorE0(b);
2822  
2823              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2824  
2825              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
2826          }
2827  
2828          [Test, Pairwise, Description("SQSUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
2829          public void Sqsub_V_8B_4H_2S([Values(0u)] uint rd,
2830                                       [Values(1u, 0u)] uint rn,
2831                                       [Values(2u, 0u)] uint rm,
2832                                       [ValueSource(nameof(_8B4H2S_))] ulong z,
2833                                       [ValueSource(nameof(_8B4H2S_))] ulong a,
2834                                       [ValueSource(nameof(_8B4H2S_))] ulong b,
2835                                       [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
2836          {
2837              uint opcode = 0x0E202C00; // SQSUB V0.8B, V0.8B, V0.8B
2838              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2839              opcode |= ((size & 3) << 22);
2840  
2841              V128 v0 = MakeVectorE0E1(z, z);
2842              V128 v1 = MakeVectorE0(a);
2843              V128 v2 = MakeVectorE0(b);
2844  
2845              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2846  
2847              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
2848          }
2849  
2850          [Test, Pairwise, Description("SQSUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
2851          public void Sqsub_V_16B_8H_4S_2D([Values(0u)] uint rd,
2852                                           [Values(1u, 0u)] uint rn,
2853                                           [Values(2u, 0u)] uint rm,
2854                                           [ValueSource(nameof(_8B4H2S1D_))] ulong z,
2855                                           [ValueSource(nameof(_8B4H2S1D_))] ulong a,
2856                                           [ValueSource(nameof(_8B4H2S1D_))] ulong b,
2857                                           [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
2858          {
2859              uint opcode = 0x4E202C00; // SQSUB V0.16B, V0.16B, V0.16B
2860              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2861              opcode |= ((size & 3) << 22);
2862  
2863              V128 v0 = MakeVectorE0E1(z, z);
2864              V128 v1 = MakeVectorE0E1(a, a);
2865              V128 v2 = MakeVectorE0E1(b, b);
2866  
2867              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2868  
2869              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
2870          }
2871  
2872          [Test, Pairwise, Description("SRHADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
2873          public void Srhadd_V_8B_4H_2S([Values(0u)] uint rd,
2874                                        [Values(1u, 0u)] uint rn,
2875                                        [Values(2u, 0u)] uint rm,
2876                                        [ValueSource(nameof(_8B4H2S_))] ulong z,
2877                                        [ValueSource(nameof(_8B4H2S_))] ulong a,
2878                                        [ValueSource(nameof(_8B4H2S_))] ulong b,
2879                                        [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
2880          {
2881              uint opcode = 0x0E201400; // SRHADD V0.8B, V0.8B, V0.8B
2882              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2883              opcode |= ((size & 3) << 22);
2884  
2885              V128 v0 = MakeVectorE0E1(z, z);
2886              V128 v1 = MakeVectorE0(a);
2887              V128 v2 = MakeVectorE0(b);
2888  
2889              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2890  
2891              CompareAgainstUnicorn();
2892          }
2893  
2894          [Test, Pairwise, Description("SRHADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
2895          public void Srhadd_V_16B_8H_4S([Values(0u)] uint rd,
2896                                         [Values(1u, 0u)] uint rn,
2897                                         [Values(2u, 0u)] uint rm,
2898                                         [ValueSource(nameof(_8B4H2S_))] ulong z,
2899                                         [ValueSource(nameof(_8B4H2S_))] ulong a,
2900                                         [ValueSource(nameof(_8B4H2S_))] ulong b,
2901                                         [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
2902          {
2903              uint opcode = 0x4E201400; // SRHADD V0.16B, V0.16B, V0.16B
2904              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2905              opcode |= ((size & 3) << 22);
2906  
2907              V128 v0 = MakeVectorE0E1(z, z);
2908              V128 v1 = MakeVectorE0E1(a, a);
2909              V128 v2 = MakeVectorE0E1(b, b);
2910  
2911              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2912  
2913              CompareAgainstUnicorn();
2914          }
2915  
2916          [Test, Pairwise]
2917          public void ShlReg_S_D([ValueSource(nameof(_ShlReg_S_D_))] uint opcodes,
2918                                 [Values(0u)] uint rd,
2919                                 [Values(1u, 0u)] uint rn,
2920                                 [Values(2u, 0u)] uint rm,
2921                                 [ValueSource(nameof(_1D_))] ulong z,
2922                                 [ValueSource(nameof(_1D_))] ulong a,
2923                                 [ValueSource(nameof(_1D_))] ulong b)
2924          {
2925              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2926  
2927              V128 v0 = MakeVectorE0E1(z, z);
2928              V128 v1 = MakeVectorE0(a);
2929              V128 v2 = MakeVectorE0(b);
2930  
2931              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2);
2932  
2933              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
2934          }
2935  
2936          [Test, Pairwise]
2937          public void ShlReg_V_8B_4H_2S([ValueSource(nameof(_ShlReg_V_8B_4H_2S_))] uint opcodes,
2938                                        [Values(0u)] uint rd,
2939                                        [Values(1u, 0u)] uint rn,
2940                                        [Values(2u, 0u)] uint rm,
2941                                        [ValueSource(nameof(_8B4H2S_))] ulong z,
2942                                        [ValueSource(nameof(_8B4H2S_))] ulong a,
2943                                        [ValueSource(nameof(_8B4H2S_))] ulong b,
2944                                        [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
2945          {
2946              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2947              opcodes |= ((size & 3) << 22);
2948  
2949              V128 v0 = MakeVectorE0E1(z, z);
2950              V128 v1 = MakeVectorE0(a);
2951              V128 v2 = MakeVectorE0(b);
2952  
2953              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2);
2954  
2955              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
2956          }
2957  
2958          [Test, Pairwise]
2959          public void ShlReg_V_16B_8H_4S_2D([ValueSource(nameof(_ShlReg_V_16B_8H_4S_2D_))] uint opcodes,
2960                                            [Values(0u)] uint rd,
2961                                            [Values(1u, 0u)] uint rn,
2962                                            [Values(2u, 0u)] uint rm,
2963                                            [ValueSource(nameof(_8B4H2S1D_))] ulong z,
2964                                            [ValueSource(nameof(_8B4H2S1D_))] ulong a,
2965                                            [ValueSource(nameof(_8B4H2S1D_))] ulong b,
2966                                            [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
2967          {
2968              opcodes |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2969              opcodes |= ((size & 3) << 22);
2970  
2971              V128 v0 = MakeVectorE0E1(z, z);
2972              V128 v1 = MakeVectorE0E1(a, a);
2973              V128 v2 = MakeVectorE0E1(b, b);
2974  
2975              SingleOpcode(opcodes, v0: v0, v1: v1, v2: v2);
2976  
2977              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
2978          }
2979  
2980          [Test, Pairwise, Description("SSUBL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
2981          public void Ssubl_V_8B8H_4H4S_2S2D([Values(0u)] uint rd,
2982                                             [Values(1u, 0u)] uint rn,
2983                                             [Values(2u, 0u)] uint rm,
2984                                             [ValueSource(nameof(_8B4H2S_))] ulong z,
2985                                             [ValueSource(nameof(_8B4H2S_))] ulong a,
2986                                             [ValueSource(nameof(_8B4H2S_))] ulong b,
2987                                             [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H, 4H4S, 2S2D>
2988          {
2989              uint opcode = 0x0E202000; // SSUBL V0.8H, V0.8B, V0.8B
2990              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
2991              opcode |= ((size & 3) << 22);
2992  
2993              V128 v0 = MakeVectorE0E1(z, z);
2994              V128 v1 = MakeVectorE0(a);
2995              V128 v2 = MakeVectorE0(b);
2996  
2997              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
2998  
2999              CompareAgainstUnicorn();
3000          }
3001  
3002          [Test, Pairwise, Description("SSUBL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
3003          public void Ssubl_V_16B8H_8H4S_4S2D([Values(0u)] uint rd,
3004                                              [Values(1u, 0u)] uint rn,
3005                                              [Values(2u, 0u)] uint rm,
3006                                              [ValueSource(nameof(_8B4H2S_))] ulong z,
3007                                              [ValueSource(nameof(_8B4H2S_))] ulong a,
3008                                              [ValueSource(nameof(_8B4H2S_))] ulong b,
3009                                              [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H, 8H4S, 4S2D>
3010          {
3011              uint opcode = 0x4E202000; // SSUBL2 V0.8H, V0.16B, V0.16B
3012              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3013              opcode |= ((size & 3) << 22);
3014  
3015              V128 v0 = MakeVectorE0E1(z, z);
3016              V128 v1 = MakeVectorE1(a);
3017              V128 v2 = MakeVectorE1(b);
3018  
3019              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3020  
3021              CompareAgainstUnicorn();
3022          }
3023  
3024          [Test, Pairwise, Description("SSUBW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
3025          public void Ssubw_V_8B8H8H_4H4S4S_2S2D2D([Values(0u)] uint rd,
3026                                                   [Values(1u, 0u)] uint rn,
3027                                                   [Values(2u, 0u)] uint rm,
3028                                                   [ValueSource(nameof(_8B4H2S1D_))] ulong z,
3029                                                   [ValueSource(nameof(_4H2S1D_))][Random(RndCnt)] ulong a,
3030                                                   [ValueSource(nameof(_8B4H2S_))][Random(RndCnt)] ulong b,
3031                                                   [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H8H, 4H4S4S, 2S2D2D>
3032          {
3033              uint opcode = 0x0E203000; // SSUBW V0.8H, V0.8H, V0.8B
3034              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3035              opcode |= ((size & 3) << 22);
3036  
3037              V128 v0 = MakeVectorE0E1(z, z);
3038              V128 v1 = MakeVectorE0E1(a, a);
3039              V128 v2 = MakeVectorE0(b);
3040  
3041              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3042  
3043              CompareAgainstUnicorn();
3044          }
3045  
3046          [Test, Pairwise, Description("SSUBW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
3047          public void Ssubw_V_16B8H8H_8H4S4S_4S2D2D([Values(0u)] uint rd,
3048                                                    [Values(1u, 0u)] uint rn,
3049                                                    [Values(2u, 0u)] uint rm,
3050                                                    [ValueSource(nameof(_8B4H2S1D_))] ulong z,
3051                                                    [ValueSource(nameof(_4H2S1D_))][Random(RndCnt)] ulong a,
3052                                                    [ValueSource(nameof(_8B4H2S_))][Random(RndCnt)] ulong b,
3053                                                    [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H8H, 8H4S4S, 4S2D2D>
3054          {
3055              uint opcode = 0x4E203000; // SSUBW2 V0.8H, V0.8H, V0.16B
3056              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3057              opcode |= ((size & 3) << 22);
3058  
3059              V128 v0 = MakeVectorE0E1(z, z);
3060              V128 v1 = MakeVectorE0E1(a, a);
3061              V128 v2 = MakeVectorE1(b);
3062  
3063              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3064  
3065              CompareAgainstUnicorn();
3066          }
3067  
3068          [Test, Pairwise, Description("SUB <V><d>, <V><n>, <V><m>")]
3069          public void Sub_S_D([Values(0u)] uint rd,
3070                              [Values(1u, 0u)] uint rn,
3071                              [Values(2u, 0u)] uint rm,
3072                              [ValueSource(nameof(_1D_))] ulong z,
3073                              [ValueSource(nameof(_1D_))] ulong a,
3074                              [ValueSource(nameof(_1D_))] ulong b)
3075          {
3076              uint opcode = 0x7EE08400; // SUB D0, D0, D0
3077              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3078  
3079              V128 v0 = MakeVectorE0E1(z, z);
3080              V128 v1 = MakeVectorE0(a);
3081              V128 v2 = MakeVectorE0(b);
3082  
3083              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3084  
3085              CompareAgainstUnicorn();
3086          }
3087  
3088          [Test, Pairwise, Description("SUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3089          public void Sub_V_8B_4H_2S([Values(0u)] uint rd,
3090                                     [Values(1u, 0u)] uint rn,
3091                                     [Values(2u, 0u)] uint rm,
3092                                     [ValueSource(nameof(_8B4H2S_))] ulong z,
3093                                     [ValueSource(nameof(_8B4H2S_))] ulong a,
3094                                     [ValueSource(nameof(_8B4H2S_))] ulong b,
3095                                     [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
3096          {
3097              uint opcode = 0x2E208400; // SUB V0.8B, V0.8B, V0.8B
3098              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3099              opcode |= ((size & 3) << 22);
3100  
3101              V128 v0 = MakeVectorE0E1(z, z);
3102              V128 v1 = MakeVectorE0(a);
3103              V128 v2 = MakeVectorE0(b);
3104  
3105              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3106  
3107              CompareAgainstUnicorn();
3108          }
3109  
3110          [Test, Pairwise, Description("SUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3111          public void Sub_V_16B_8H_4S_2D([Values(0u)] uint rd,
3112                                         [Values(1u, 0u)] uint rn,
3113                                         [Values(2u, 0u)] uint rm,
3114                                         [ValueSource(nameof(_8B4H2S1D_))] ulong z,
3115                                         [ValueSource(nameof(_8B4H2S1D_))] ulong a,
3116                                         [ValueSource(nameof(_8B4H2S1D_))] ulong b,
3117                                         [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
3118          {
3119              uint opcode = 0x6E208400; // SUB V0.16B, V0.16B, V0.16B
3120              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3121              opcode |= ((size & 3) << 22);
3122  
3123              V128 v0 = MakeVectorE0E1(z, z);
3124              V128 v1 = MakeVectorE0E1(a, a);
3125              V128 v2 = MakeVectorE0E1(b, b);
3126  
3127              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3128  
3129              CompareAgainstUnicorn();
3130          }
3131  
3132          [Test, Pairwise, Description("SUBHN{2} <Vd>.<Tb>, <Vn>.<Ta>, <Vm>.<Ta>")]
3133          public void Subhn_V_8H8B_4S4H_2D2S([Values(0u)] uint rd,
3134                                             [Values(1u, 0u)] uint rn,
3135                                             [Values(2u, 0u)] uint rm,
3136                                             [ValueSource(nameof(_4H2S1D_))] ulong z,
3137                                             [ValueSource(nameof(_4H2S1D_))] ulong a,
3138                                             [ValueSource(nameof(_4H2S1D_))] ulong b,
3139                                             [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H8B, 4S4H, 2D2S>
3140          {
3141              uint opcode = 0x0E206000; // SUBHN V0.8B, V0.8H, V0.8H
3142              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3143              opcode |= ((size & 3) << 22);
3144  
3145              V128 v0 = MakeVectorE0E1(z, z);
3146              V128 v1 = MakeVectorE0E1(a, a);
3147              V128 v2 = MakeVectorE0E1(b, b);
3148  
3149              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3150  
3151              CompareAgainstUnicorn();
3152          }
3153  
3154          [Test, Pairwise, Description("SUBHN{2} <Vd>.<Tb>, <Vn>.<Ta>, <Vm>.<Ta>")]
3155          public void Subhn_V_8H16B_4S8H_2D4S([Values(0u)] uint rd,
3156                                              [Values(1u, 0u)] uint rn,
3157                                              [Values(2u, 0u)] uint rm,
3158                                              [ValueSource(nameof(_4H2S1D_))] ulong z,
3159                                              [ValueSource(nameof(_4H2S1D_))] ulong a,
3160                                              [ValueSource(nameof(_4H2S1D_))] ulong b,
3161                                              [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H16B, 4S8H, 2D4S>
3162          {
3163              uint opcode = 0x4E206000; // SUBHN2 V0.16B, V0.8H, V0.8H
3164              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3165              opcode |= ((size & 3) << 22);
3166  
3167              V128 v0 = MakeVectorE0E1(z, z);
3168              V128 v1 = MakeVectorE0E1(a, a);
3169              V128 v2 = MakeVectorE0E1(b, b);
3170  
3171              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3172  
3173              CompareAgainstUnicorn();
3174          }
3175  
3176          [Test, Pairwise, Description("TRN1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3177          public void Trn1_V_8B_4H_2S([Values(0u)] uint rd,
3178                                      [Values(1u, 0u)] uint rn,
3179                                      [Values(2u, 0u)] uint rm,
3180                                      [ValueSource(nameof(_8B4H2S_))] ulong z,
3181                                      [ValueSource(nameof(_8B4H2S_))] ulong a,
3182                                      [ValueSource(nameof(_8B4H2S_))] ulong b,
3183                                      [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
3184          {
3185              uint opcode = 0x0E002800; // TRN1 V0.8B, V0.8B, V0.8B
3186              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3187              opcode |= ((size & 3) << 22);
3188  
3189              V128 v0 = MakeVectorE0E1(z, z);
3190              V128 v1 = MakeVectorE0(a);
3191              V128 v2 = MakeVectorE0(b);
3192  
3193              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3194  
3195              CompareAgainstUnicorn();
3196          }
3197  
3198          [Test, Pairwise, Description("TRN1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3199          public void Trn1_V_16B_8H_4S_2D([Values(0u)] uint rd,
3200                                          [Values(1u, 0u)] uint rn,
3201                                          [Values(2u, 0u)] uint rm,
3202                                          [ValueSource(nameof(_8B4H2S1D_))] ulong z,
3203                                          [ValueSource(nameof(_8B4H2S1D_))] ulong a,
3204                                          [ValueSource(nameof(_8B4H2S1D_))] ulong b,
3205                                          [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
3206          {
3207              uint opcode = 0x4E002800; // TRN1 V0.16B, V0.16B, V0.16B
3208              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3209              opcode |= ((size & 3) << 22);
3210  
3211              V128 v0 = MakeVectorE0E1(z, ~z);
3212              V128 v1 = MakeVectorE0E1(a, ~a);
3213              V128 v2 = MakeVectorE0E1(b, ~b);
3214  
3215              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3216  
3217              CompareAgainstUnicorn();
3218          }
3219  
3220          [Test, Pairwise, Description("TRN2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3221          public void Trn2_V_8B_4H_2S([Values(0u)] uint rd,
3222                                      [Values(1u, 0u)] uint rn,
3223                                      [Values(2u, 0u)] uint rm,
3224                                      [ValueSource(nameof(_8B4H2S_))] ulong z,
3225                                      [ValueSource(nameof(_8B4H2S_))] ulong a,
3226                                      [ValueSource(nameof(_8B4H2S_))] ulong b,
3227                                      [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
3228          {
3229              uint opcode = 0x0E006800; // TRN2 V0.8B, V0.8B, V0.8B
3230              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3231              opcode |= ((size & 3) << 22);
3232  
3233              V128 v0 = MakeVectorE0E1(z, z);
3234              V128 v1 = MakeVectorE0(a);
3235              V128 v2 = MakeVectorE0(b);
3236  
3237              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3238  
3239              CompareAgainstUnicorn();
3240          }
3241  
3242          [Test, Pairwise, Description("TRN2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3243          public void Trn2_V_16B_8H_4S_2D([Values(0u)] uint rd,
3244                                          [Values(1u, 0u)] uint rn,
3245                                          [Values(2u, 0u)] uint rm,
3246                                          [ValueSource(nameof(_8B4H2S1D_))] ulong z,
3247                                          [ValueSource(nameof(_8B4H2S1D_))] ulong a,
3248                                          [ValueSource(nameof(_8B4H2S1D_))] ulong b,
3249                                          [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
3250          {
3251              uint opcode = 0x4E006800; // TRN2 V0.16B, V0.16B, V0.16B
3252              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3253              opcode |= ((size & 3) << 22);
3254  
3255              V128 v0 = MakeVectorE0E1(z, ~z);
3256              V128 v1 = MakeVectorE0E1(a, ~a);
3257              V128 v2 = MakeVectorE0E1(b, ~b);
3258  
3259              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3260  
3261              CompareAgainstUnicorn();
3262          }
3263  
3264          [Test, Pairwise, Description("UABA <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3265          public void Uaba_V_8B_4H_2S([Values(0u)] uint rd,
3266                                      [Values(1u, 0u)] uint rn,
3267                                      [Values(2u, 0u)] uint rm,
3268                                      [ValueSource(nameof(_8B4H2S_))] ulong z,
3269                                      [ValueSource(nameof(_8B4H2S_))] ulong a,
3270                                      [ValueSource(nameof(_8B4H2S_))] ulong b,
3271                                      [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
3272          {
3273              uint opcode = 0x2E207C00; // UABA V0.8B, V0.8B, V0.8B
3274              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3275              opcode |= ((size & 3) << 22);
3276  
3277              V128 v0 = MakeVectorE0E1(z, z);
3278              V128 v1 = MakeVectorE0(a);
3279              V128 v2 = MakeVectorE0(b);
3280  
3281              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3282  
3283              CompareAgainstUnicorn();
3284          }
3285  
3286          [Test, Pairwise, Description("UABA <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3287          public void Uaba_V_16B_8H_4S([Values(0u)] uint rd,
3288                                       [Values(1u, 0u)] uint rn,
3289                                       [Values(2u, 0u)] uint rm,
3290                                       [ValueSource(nameof(_8B4H2S_))] ulong z,
3291                                       [ValueSource(nameof(_8B4H2S_))] ulong a,
3292                                       [ValueSource(nameof(_8B4H2S_))] ulong b,
3293                                       [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
3294          {
3295              uint opcode = 0x6E207C00; // UABA V0.16B, V0.16B, V0.16B
3296              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3297              opcode |= ((size & 3) << 22);
3298  
3299              V128 v0 = MakeVectorE0E1(z, z);
3300              V128 v1 = MakeVectorE0E1(a, a);
3301              V128 v2 = MakeVectorE0E1(b, b);
3302  
3303              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3304  
3305              CompareAgainstUnicorn();
3306          }
3307  
3308          [Test, Pairwise, Description("UABAL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
3309          public void Uabal_V_8B8H_4H4S_2S2D([Values(0u)] uint rd,
3310                                             [Values(1u, 0u)] uint rn,
3311                                             [Values(2u, 0u)] uint rm,
3312                                             [ValueSource(nameof(_8B4H2S_))] ulong z,
3313                                             [ValueSource(nameof(_8B4H2S_))] ulong a,
3314                                             [ValueSource(nameof(_8B4H2S_))] ulong b,
3315                                             [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H, 4H4S, 2S2D>
3316          {
3317              uint opcode = 0x2E205000; // UABAL V0.8H, V0.8B, V0.8B
3318              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3319              opcode |= ((size & 3) << 22);
3320  
3321              V128 v0 = MakeVectorE0E1(z, z);
3322              V128 v1 = MakeVectorE0(a);
3323              V128 v2 = MakeVectorE0(b);
3324  
3325              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3326  
3327              CompareAgainstUnicorn();
3328          }
3329  
3330          [Test, Pairwise, Description("UABAL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
3331          public void Uabal_V_16B8H_8H4S_4S2D([Values(0u)] uint rd,
3332                                              [Values(1u, 0u)] uint rn,
3333                                              [Values(2u, 0u)] uint rm,
3334                                              [ValueSource(nameof(_8B4H2S_))] ulong z,
3335                                              [ValueSource(nameof(_8B4H2S_))] ulong a,
3336                                              [ValueSource(nameof(_8B4H2S_))] ulong b,
3337                                              [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H, 8H4S, 4S2D>
3338          {
3339              uint opcode = 0x6E205000; // UABAL2 V0.8H, V0.16B, V0.16B
3340              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3341              opcode |= ((size & 3) << 22);
3342  
3343              V128 v0 = MakeVectorE0E1(z, z);
3344              V128 v1 = MakeVectorE1(a);
3345              V128 v2 = MakeVectorE1(b);
3346  
3347              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3348  
3349              CompareAgainstUnicorn();
3350          }
3351  
3352          [Test, Pairwise, Description("UABD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3353          public void Uabd_V_8B_4H_2S([Values(0u)] uint rd,
3354                                      [Values(1u, 0u)] uint rn,
3355                                      [Values(2u, 0u)] uint rm,
3356                                      [ValueSource(nameof(_8B4H2S_))] ulong z,
3357                                      [ValueSource(nameof(_8B4H2S_))] ulong a,
3358                                      [ValueSource(nameof(_8B4H2S_))] ulong b,
3359                                      [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
3360          {
3361              uint opcode = 0x2E207400; // UABD V0.8B, V0.8B, V0.8B
3362              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3363              opcode |= ((size & 3) << 22);
3364  
3365              V128 v0 = MakeVectorE0E1(z, z);
3366              V128 v1 = MakeVectorE0(a);
3367              V128 v2 = MakeVectorE0(b);
3368  
3369              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3370  
3371              CompareAgainstUnicorn();
3372          }
3373  
3374          [Test, Pairwise, Description("UABD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3375          public void Uabd_V_16B_8H_4S([Values(0u)] uint rd,
3376                                       [Values(1u, 0u)] uint rn,
3377                                       [Values(2u, 0u)] uint rm,
3378                                       [ValueSource(nameof(_8B4H2S_))] ulong z,
3379                                       [ValueSource(nameof(_8B4H2S_))] ulong a,
3380                                       [ValueSource(nameof(_8B4H2S_))] ulong b,
3381                                       [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
3382          {
3383              uint opcode = 0x6E207400; // UABD V0.16B, V0.16B, V0.16B
3384              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3385              opcode |= ((size & 3) << 22);
3386  
3387              V128 v0 = MakeVectorE0E1(z, z);
3388              V128 v1 = MakeVectorE0E1(a, a);
3389              V128 v2 = MakeVectorE0E1(b, b);
3390  
3391              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3392  
3393              CompareAgainstUnicorn();
3394          }
3395  
3396          [Test, Pairwise, Description("UABDL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
3397          public void Uabdl_V_8B8H_4H4S_2S2D([Values(0u)] uint rd,
3398                                             [Values(1u, 0u)] uint rn,
3399                                             [Values(2u, 0u)] uint rm,
3400                                             [ValueSource(nameof(_8B4H2S_))] ulong z,
3401                                             [ValueSource(nameof(_8B4H2S_))] ulong a,
3402                                             [ValueSource(nameof(_8B4H2S_))] ulong b,
3403                                             [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H, 4H4S, 2S2D>
3404          {
3405              uint opcode = 0x2E207000; // UABDL V0.8H, V0.8B, V0.8B
3406              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3407              opcode |= ((size & 3) << 22);
3408  
3409              V128 v0 = MakeVectorE0E1(z, z);
3410              V128 v1 = MakeVectorE0(a);
3411              V128 v2 = MakeVectorE0(b);
3412  
3413              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3414  
3415              CompareAgainstUnicorn();
3416          }
3417  
3418          [Test, Pairwise, Description("UABDL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
3419          public void Uabdl_V_16B8H_8H4S_4S2D([Values(0u)] uint rd,
3420                                              [Values(1u, 0u)] uint rn,
3421                                              [Values(2u, 0u)] uint rm,
3422                                              [ValueSource(nameof(_8B4H2S_))] ulong z,
3423                                              [ValueSource(nameof(_8B4H2S_))] ulong a,
3424                                              [ValueSource(nameof(_8B4H2S_))] ulong b,
3425                                              [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H, 8H4S, 4S2D>
3426          {
3427              uint opcode = 0x6E207000; // UABDL2 V0.8H, V0.16B, V0.16B
3428              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3429              opcode |= ((size & 3) << 22);
3430  
3431              V128 v0 = MakeVectorE0E1(z, z);
3432              V128 v1 = MakeVectorE1(a);
3433              V128 v2 = MakeVectorE1(b);
3434  
3435              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3436  
3437              CompareAgainstUnicorn();
3438          }
3439  
3440          [Test, Pairwise, Description("UADDL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
3441          public void Uaddl_V_8B8H_4H4S_2S2D([Values(0u)] uint rd,
3442                                             [Values(1u, 0u)] uint rn,
3443                                             [Values(2u, 0u)] uint rm,
3444                                             [ValueSource(nameof(_8B4H2S_))] ulong z,
3445                                             [ValueSource(nameof(_8B4H2S_))] ulong a,
3446                                             [ValueSource(nameof(_8B4H2S_))] ulong b,
3447                                             [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H, 4H4S, 2S2D>
3448          {
3449              uint opcode = 0x2E200000; // UADDL V0.8H, V0.8B, V0.8B
3450              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3451              opcode |= ((size & 3) << 22);
3452  
3453              V128 v0 = MakeVectorE0E1(z, z);
3454              V128 v1 = MakeVectorE0(a);
3455              V128 v2 = MakeVectorE0(b);
3456  
3457              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3458  
3459              CompareAgainstUnicorn();
3460          }
3461  
3462          [Test, Pairwise, Description("UADDL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
3463          public void Uaddl_V_16B8H_8H4S_4S2D([Values(0u)] uint rd,
3464                                              [Values(1u, 0u)] uint rn,
3465                                              [Values(2u, 0u)] uint rm,
3466                                              [ValueSource(nameof(_8B4H2S_))] ulong z,
3467                                              [ValueSource(nameof(_8B4H2S_))] ulong a,
3468                                              [ValueSource(nameof(_8B4H2S_))] ulong b,
3469                                              [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H, 8H4S, 4S2D>
3470          {
3471              uint opcode = 0x6E200000; // UADDL2 V0.8H, V0.16B, V0.16B
3472              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3473              opcode |= ((size & 3) << 22);
3474  
3475              V128 v0 = MakeVectorE0E1(z, z);
3476              V128 v1 = MakeVectorE1(a);
3477              V128 v2 = MakeVectorE1(b);
3478  
3479              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3480  
3481              CompareAgainstUnicorn();
3482          }
3483  
3484          [Test, Pairwise, Description("UADDW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
3485          public void Uaddw_V_8B8H8H_4H4S4S_2S2D2D([Values(0u)] uint rd,
3486                                                   [Values(1u, 0u)] uint rn,
3487                                                   [Values(2u, 0u)] uint rm,
3488                                                   [ValueSource(nameof(_8B4H2S1D_))] ulong z,
3489                                                   [ValueSource(nameof(_4H2S1D_))][Random(RndCnt)] ulong a,
3490                                                   [ValueSource(nameof(_8B4H2S_))][Random(RndCnt)] ulong b,
3491                                                   [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H8H, 4H4S4S, 2S2D2D>
3492          {
3493              uint opcode = 0x2E201000; // UADDW V0.8H, V0.8H, V0.8B
3494              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3495              opcode |= ((size & 3) << 22);
3496  
3497              V128 v0 = MakeVectorE0E1(z, z);
3498              V128 v1 = MakeVectorE0E1(a, a);
3499              V128 v2 = MakeVectorE0(b);
3500  
3501              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3502  
3503              CompareAgainstUnicorn();
3504          }
3505  
3506          [Test, Pairwise, Description("UADDW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
3507          public void Uaddw_V_16B8H8H_8H4S4S_4S2D2D([Values(0u)] uint rd,
3508                                                    [Values(1u, 0u)] uint rn,
3509                                                    [Values(2u, 0u)] uint rm,
3510                                                    [ValueSource(nameof(_8B4H2S1D_))] ulong z,
3511                                                    [ValueSource(nameof(_4H2S1D_))][Random(RndCnt)] ulong a,
3512                                                    [ValueSource(nameof(_8B4H2S_))][Random(RndCnt)] ulong b,
3513                                                    [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H8H, 8H4S4S, 4S2D2D>
3514          {
3515              uint opcode = 0x6E201000; // UADDW2 V0.8H, V0.8H, V0.16B
3516              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3517              opcode |= ((size & 3) << 22);
3518  
3519              V128 v0 = MakeVectorE0E1(z, z);
3520              V128 v1 = MakeVectorE0E1(a, a);
3521              V128 v2 = MakeVectorE1(b);
3522  
3523              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3524  
3525              CompareAgainstUnicorn();
3526          }
3527  
3528          [Test, Pairwise, Description("UHADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3529          public void Uhadd_V_8B_4H_2S([Values(0u)] uint rd,
3530                                       [Values(1u, 0u)] uint rn,
3531                                       [Values(2u, 0u)] uint rm,
3532                                       [ValueSource(nameof(_8B4H2S_))] ulong z,
3533                                       [ValueSource(nameof(_8B4H2S_))] ulong a,
3534                                       [ValueSource(nameof(_8B4H2S_))] ulong b,
3535                                       [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
3536          {
3537              uint opcode = 0x2E200400; // UHADD V0.8B, V0.8B, V0.8B
3538              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3539              opcode |= ((size & 3) << 22);
3540  
3541              V128 v0 = MakeVectorE0E1(z, z);
3542              V128 v1 = MakeVectorE0(a);
3543              V128 v2 = MakeVectorE0(b);
3544  
3545              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3546  
3547              CompareAgainstUnicorn();
3548          }
3549  
3550          [Test, Pairwise, Description("UHADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3551          public void Uhadd_V_16B_8H_4S([Values(0u)] uint rd,
3552                                        [Values(1u, 0u)] uint rn,
3553                                        [Values(2u, 0u)] uint rm,
3554                                        [ValueSource(nameof(_8B4H2S_))] ulong z,
3555                                        [ValueSource(nameof(_8B4H2S_))] ulong a,
3556                                        [ValueSource(nameof(_8B4H2S_))] ulong b,
3557                                        [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
3558          {
3559              uint opcode = 0x6E200400; // UHADD V0.16B, V0.16B, V0.16B
3560              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3561              opcode |= ((size & 3) << 22);
3562  
3563              V128 v0 = MakeVectorE0E1(z, z);
3564              V128 v1 = MakeVectorE0E1(a, a);
3565              V128 v2 = MakeVectorE0E1(b, b);
3566  
3567              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3568  
3569              CompareAgainstUnicorn();
3570          }
3571  
3572          [Test, Pairwise, Description("UHSUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3573          public void Uhsub_V_8B_4H_2S([Values(0u)] uint rd,
3574                                       [Values(1u, 0u)] uint rn,
3575                                       [Values(2u, 0u)] uint rm,
3576                                       [ValueSource(nameof(_8B4H2S_))] ulong z,
3577                                       [ValueSource(nameof(_8B4H2S_))] ulong a,
3578                                       [ValueSource(nameof(_8B4H2S_))] ulong b,
3579                                       [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
3580          {
3581              uint opcode = 0x2E202400; // UHSUB V0.8B, V0.8B, V0.8B
3582              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3583              opcode |= ((size & 3) << 22);
3584  
3585              V128 v0 = MakeVectorE0E1(z, z);
3586              V128 v1 = MakeVectorE0(a);
3587              V128 v2 = MakeVectorE0(b);
3588  
3589              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3590  
3591              CompareAgainstUnicorn();
3592          }
3593  
3594          [Test, Pairwise, Description("UHSUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3595          public void Uhsub_V_16B_8H_4S([Values(0u)] uint rd,
3596                                        [Values(1u, 0u)] uint rn,
3597                                        [Values(2u, 0u)] uint rm,
3598                                        [ValueSource(nameof(_8B4H2S_))] ulong z,
3599                                        [ValueSource(nameof(_8B4H2S_))] ulong a,
3600                                        [ValueSource(nameof(_8B4H2S_))] ulong b,
3601                                        [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
3602          {
3603              uint opcode = 0x6E202400; // UHSUB V0.16B, V0.16B, V0.16B
3604              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3605              opcode |= ((size & 3) << 22);
3606  
3607              V128 v0 = MakeVectorE0E1(z, z);
3608              V128 v1 = MakeVectorE0E1(a, a);
3609              V128 v2 = MakeVectorE0E1(b, b);
3610  
3611              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3612  
3613              CompareAgainstUnicorn();
3614          }
3615  
3616          [Test, Pairwise, Description("UQADD <V><d>, <V><n>, <V><m>")]
3617          public void Uqadd_S_B_H_S_D([Values(0u)] uint rd,
3618                                      [Values(1u, 0u)] uint rn,
3619                                      [Values(2u, 0u)] uint rm,
3620                                      [ValueSource(nameof(_1B1H1S1D_))] ulong z,
3621                                      [ValueSource(nameof(_1B1H1S1D_))] ulong a,
3622                                      [ValueSource(nameof(_1B1H1S1D_))] ulong b,
3623                                      [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <b, H, S, D>
3624          {
3625              uint opcode = 0x7E200C00; // UQADD B0, B0, B0
3626              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3627              opcode |= ((size & 3) << 22);
3628  
3629              V128 v0 = MakeVectorE0E1(z, z);
3630              V128 v1 = MakeVectorE0(a);
3631              V128 v2 = MakeVectorE0(b);
3632  
3633              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3634  
3635              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
3636          }
3637  
3638          [Test, Pairwise, Description("UQADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3639          public void Uqadd_V_8B_4H_2S([Values(0u)] uint rd,
3640                                       [Values(1u, 0u)] uint rn,
3641                                       [Values(2u, 0u)] uint rm,
3642                                       [ValueSource(nameof(_8B4H2S_))] ulong z,
3643                                       [ValueSource(nameof(_8B4H2S_))] ulong a,
3644                                       [ValueSource(nameof(_8B4H2S_))] ulong b,
3645                                       [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
3646          {
3647              uint opcode = 0x2E200C00; // UQADD V0.8B, V0.8B, V0.8B
3648              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3649              opcode |= ((size & 3) << 22);
3650  
3651              V128 v0 = MakeVectorE0E1(z, z);
3652              V128 v1 = MakeVectorE0(a);
3653              V128 v2 = MakeVectorE0(b);
3654  
3655              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3656  
3657              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
3658          }
3659  
3660          [Test, Pairwise, Description("UQADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3661          public void Uqadd_V_16B_8H_4S_2D([Values(0u)] uint rd,
3662                                           [Values(1u, 0u)] uint rn,
3663                                           [Values(2u, 0u)] uint rm,
3664                                           [ValueSource(nameof(_8B4H2S1D_))] ulong z,
3665                                           [ValueSource(nameof(_8B4H2S1D_))] ulong a,
3666                                           [ValueSource(nameof(_8B4H2S1D_))] ulong b,
3667                                           [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
3668          {
3669              uint opcode = 0x6E200C00; // UQADD V0.16B, V0.16B, V0.16B
3670              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3671              opcode |= ((size & 3) << 22);
3672  
3673              V128 v0 = MakeVectorE0E1(z, z);
3674              V128 v1 = MakeVectorE0E1(a, a);
3675              V128 v2 = MakeVectorE0E1(b, b);
3676  
3677              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3678  
3679              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
3680          }
3681  
3682          [Test, Pairwise, Description("UQSUB <V><d>, <V><n>, <V><m>")]
3683          public void Uqsub_S_B_H_S_D([Values(0u)] uint rd,
3684                                      [Values(1u, 0u)] uint rn,
3685                                      [Values(2u, 0u)] uint rm,
3686                                      [ValueSource(nameof(_1B1H1S1D_))] ulong z,
3687                                      [ValueSource(nameof(_1B1H1S1D_))] ulong a,
3688                                      [ValueSource(nameof(_1B1H1S1D_))] ulong b,
3689                                      [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <b, H, S, D>
3690          {
3691              uint opcode = 0x7E202C00; // UQSUB B0, B0, B0
3692              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3693              opcode |= ((size & 3) << 22);
3694  
3695              V128 v0 = MakeVectorE0E1(z, z);
3696              V128 v1 = MakeVectorE0(a);
3697              V128 v2 = MakeVectorE0(b);
3698  
3699              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3700  
3701              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
3702          }
3703  
3704          [Test, Pairwise, Description("UQSUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3705          public void Uqsub_V_8B_4H_2S([Values(0u)] uint rd,
3706                                       [Values(1u, 0u)] uint rn,
3707                                       [Values(2u, 0u)] uint rm,
3708                                       [ValueSource(nameof(_8B4H2S_))] ulong z,
3709                                       [ValueSource(nameof(_8B4H2S_))] ulong a,
3710                                       [ValueSource(nameof(_8B4H2S_))] ulong b,
3711                                       [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
3712          {
3713              uint opcode = 0x2E202C00; // UQSUB V0.8B, V0.8B, V0.8B
3714              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3715              opcode |= ((size & 3) << 22);
3716  
3717              V128 v0 = MakeVectorE0E1(z, z);
3718              V128 v1 = MakeVectorE0(a);
3719              V128 v2 = MakeVectorE0(b);
3720  
3721              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3722  
3723              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
3724          }
3725  
3726          [Test, Pairwise, Description("UQSUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3727          public void Uqsub_V_16B_8H_4S_2D([Values(0u)] uint rd,
3728                                           [Values(1u, 0u)] uint rn,
3729                                           [Values(2u, 0u)] uint rm,
3730                                           [ValueSource(nameof(_8B4H2S1D_))] ulong z,
3731                                           [ValueSource(nameof(_8B4H2S1D_))] ulong a,
3732                                           [ValueSource(nameof(_8B4H2S1D_))] ulong b,
3733                                           [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
3734          {
3735              uint opcode = 0x6E202C00; // UQSUB V0.16B, V0.16B, V0.16B
3736              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3737              opcode |= ((size & 3) << 22);
3738  
3739              V128 v0 = MakeVectorE0E1(z, z);
3740              V128 v1 = MakeVectorE0E1(a, a);
3741              V128 v2 = MakeVectorE0E1(b, b);
3742  
3743              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3744  
3745              CompareAgainstUnicorn(fpsrMask: Fpsr.Qc);
3746          }
3747  
3748          [Test, Pairwise, Description("URHADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3749          public void Urhadd_V_8B_4H_2S([Values(0u)] uint rd,
3750                                        [Values(1u, 0u)] uint rn,
3751                                        [Values(2u, 0u)] uint rm,
3752                                        [ValueSource(nameof(_8B4H2S_))] ulong z,
3753                                        [ValueSource(nameof(_8B4H2S_))] ulong a,
3754                                        [ValueSource(nameof(_8B4H2S_))] ulong b,
3755                                        [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
3756          {
3757              uint opcode = 0x2E201400; // URHADD V0.8B, V0.8B, V0.8B
3758              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3759              opcode |= ((size & 3) << 22);
3760  
3761              V128 v0 = MakeVectorE0E1(z, z);
3762              V128 v1 = MakeVectorE0(a);
3763              V128 v2 = MakeVectorE0(b);
3764  
3765              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3766  
3767              CompareAgainstUnicorn();
3768          }
3769  
3770          [Test, Pairwise, Description("URHADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3771          public void Urhadd_V_16B_8H_4S([Values(0u)] uint rd,
3772                                         [Values(1u, 0u)] uint rn,
3773                                         [Values(2u, 0u)] uint rm,
3774                                         [ValueSource(nameof(_8B4H2S_))] ulong z,
3775                                         [ValueSource(nameof(_8B4H2S_))] ulong a,
3776                                         [ValueSource(nameof(_8B4H2S_))] ulong b,
3777                                         [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
3778          {
3779              uint opcode = 0x6E201400; // URHADD V0.16B, V0.16B, V0.16B
3780              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3781              opcode |= ((size & 3) << 22);
3782  
3783              V128 v0 = MakeVectorE0E1(z, z);
3784              V128 v1 = MakeVectorE0E1(a, a);
3785              V128 v2 = MakeVectorE0E1(b, b);
3786  
3787              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3788  
3789              CompareAgainstUnicorn();
3790          }
3791  
3792          [Test, Pairwise, Description("USUBL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
3793          public void Usubl_V_8B8H_4H4S_2S2D([Values(0u)] uint rd,
3794                                             [Values(1u, 0u)] uint rn,
3795                                             [Values(2u, 0u)] uint rm,
3796                                             [ValueSource(nameof(_8B4H2S_))] ulong z,
3797                                             [ValueSource(nameof(_8B4H2S_))] ulong a,
3798                                             [ValueSource(nameof(_8B4H2S_))] ulong b,
3799                                             [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H, 4H4S, 2S2D>
3800          {
3801              uint opcode = 0x2E202000; // USUBL V0.8H, V0.8B, V0.8B
3802              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3803              opcode |= ((size & 3) << 22);
3804  
3805              V128 v0 = MakeVectorE0E1(z, z);
3806              V128 v1 = MakeVectorE0(a);
3807              V128 v2 = MakeVectorE0(b);
3808  
3809              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3810  
3811              CompareAgainstUnicorn();
3812          }
3813  
3814          [Test, Pairwise, Description("USUBL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
3815          public void Usubl_V_16B8H_8H4S_4S2D([Values(0u)] uint rd,
3816                                              [Values(1u, 0u)] uint rn,
3817                                              [Values(2u, 0u)] uint rm,
3818                                              [ValueSource(nameof(_8B4H2S_))] ulong z,
3819                                              [ValueSource(nameof(_8B4H2S_))] ulong a,
3820                                              [ValueSource(nameof(_8B4H2S_))] ulong b,
3821                                              [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H, 8H4S, 4S2D>
3822          {
3823              uint opcode = 0x6E202000; // USUBL2 V0.8H, V0.16B, V0.16B
3824              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3825              opcode |= ((size & 3) << 22);
3826  
3827              V128 v0 = MakeVectorE0E1(z, z);
3828              V128 v1 = MakeVectorE1(a);
3829              V128 v2 = MakeVectorE1(b);
3830  
3831              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3832  
3833              CompareAgainstUnicorn();
3834          }
3835  
3836          [Test, Pairwise, Description("USUBW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
3837          public void Usubw_V_8B8H8H_4H4S4S_2S2D2D([Values(0u)] uint rd,
3838                                                   [Values(1u, 0u)] uint rn,
3839                                                   [Values(2u, 0u)] uint rm,
3840                                                   [ValueSource(nameof(_8B4H2S1D_))] ulong z,
3841                                                   [ValueSource(nameof(_4H2S1D_))][Random(RndCnt)] ulong a,
3842                                                   [ValueSource(nameof(_8B4H2S_))][Random(RndCnt)] ulong b,
3843                                                   [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H8H, 4H4S4S, 2S2D2D>
3844          {
3845              uint opcode = 0x2E203000; // USUBW V0.8H, V0.8H, V0.8B
3846              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3847              opcode |= ((size & 3) << 22);
3848  
3849              V128 v0 = MakeVectorE0E1(z, z);
3850              V128 v1 = MakeVectorE0E1(a, a);
3851              V128 v2 = MakeVectorE0(b);
3852  
3853              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3854  
3855              CompareAgainstUnicorn();
3856          }
3857  
3858          [Test, Pairwise, Description("USUBW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
3859          public void Usubw_V_16B8H8H_8H4S4S_4S2D2D([Values(0u)] uint rd,
3860                                                    [Values(1u, 0u)] uint rn,
3861                                                    [Values(2u, 0u)] uint rm,
3862                                                    [ValueSource(nameof(_8B4H2S1D_))] ulong z,
3863                                                    [ValueSource(nameof(_4H2S1D_))][Random(RndCnt)] ulong a,
3864                                                    [ValueSource(nameof(_8B4H2S_))][Random(RndCnt)] ulong b,
3865                                                    [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H8H, 8H4S4S, 4S2D2D>
3866          {
3867              uint opcode = 0x6E203000; // USUBW2 V0.8H, V0.8H, V0.16B
3868              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3869              opcode |= ((size & 3) << 22);
3870  
3871              V128 v0 = MakeVectorE0E1(z, z);
3872              V128 v1 = MakeVectorE0E1(a, a);
3873              V128 v2 = MakeVectorE1(b);
3874  
3875              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3876  
3877              CompareAgainstUnicorn();
3878          }
3879  
3880          [Test, Pairwise, Description("UZP1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3881          public void Uzp1_V_8B_4H_2S([Values(0u)] uint rd,
3882                                      [Values(1u, 0u)] uint rn,
3883                                      [Values(2u, 0u)] uint rm,
3884                                      [ValueSource(nameof(_8B4H2S_))] ulong z,
3885                                      [ValueSource(nameof(_8B4H2S_))] ulong a,
3886                                      [ValueSource(nameof(_8B4H2S_))] ulong b,
3887                                      [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
3888          {
3889              uint opcode = 0x0E001800; // UZP1 V0.8B, V0.8B, V0.8B
3890              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3891              opcode |= ((size & 3) << 22);
3892  
3893              V128 v0 = MakeVectorE0E1(z, z);
3894              V128 v1 = MakeVectorE0(a);
3895              V128 v2 = MakeVectorE0(b);
3896  
3897              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3898  
3899              CompareAgainstUnicorn();
3900          }
3901  
3902          [Test, Pairwise, Description("UZP1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3903          public void Uzp1_V_16B_8H_4S_2D([Values(0u)] uint rd,
3904                                          [Values(1u, 0u)] uint rn,
3905                                          [Values(2u, 0u)] uint rm,
3906                                          [ValueSource(nameof(_8B4H2S1D_))] ulong z,
3907                                          [ValueSource(nameof(_8B4H2S1D_))] ulong a,
3908                                          [ValueSource(nameof(_8B4H2S1D_))] ulong b,
3909                                          [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
3910          {
3911              uint opcode = 0x4E001800; // UZP1 V0.16B, V0.16B, V0.16B
3912              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3913              opcode |= ((size & 3) << 22);
3914  
3915              V128 v0 = MakeVectorE0E1(z, ~z);
3916              V128 v1 = MakeVectorE0E1(a, ~a);
3917              V128 v2 = MakeVectorE0E1(b, ~b);
3918  
3919              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3920  
3921              CompareAgainstUnicorn();
3922          }
3923  
3924          [Test, Pairwise, Description("UZP2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3925          public void Uzp2_V_8B_4H_2S([Values(0u)] uint rd,
3926                                      [Values(1u, 0u)] uint rn,
3927                                      [Values(2u, 0u)] uint rm,
3928                                      [ValueSource(nameof(_8B4H2S_))] ulong z,
3929                                      [ValueSource(nameof(_8B4H2S_))] ulong a,
3930                                      [ValueSource(nameof(_8B4H2S_))] ulong b,
3931                                      [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
3932          {
3933              uint opcode = 0x0E005800; // UZP2 V0.8B, V0.8B, V0.8B
3934              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3935              opcode |= ((size & 3) << 22);
3936  
3937              V128 v0 = MakeVectorE0E1(z, z);
3938              V128 v1 = MakeVectorE0(a);
3939              V128 v2 = MakeVectorE0(b);
3940  
3941              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3942  
3943              CompareAgainstUnicorn();
3944          }
3945  
3946          [Test, Pairwise, Description("UZP2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3947          public void Uzp2_V_16B_8H_4S_2D([Values(0u)] uint rd,
3948                                          [Values(1u, 0u)] uint rn,
3949                                          [Values(2u, 0u)] uint rm,
3950                                          [ValueSource(nameof(_8B4H2S1D_))] ulong z,
3951                                          [ValueSource(nameof(_8B4H2S1D_))] ulong a,
3952                                          [ValueSource(nameof(_8B4H2S1D_))] ulong b,
3953                                          [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
3954          {
3955              uint opcode = 0x4E005800; // UZP2 V0.16B, V0.16B, V0.16B
3956              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3957              opcode |= ((size & 3) << 22);
3958  
3959              V128 v0 = MakeVectorE0E1(z, ~z);
3960              V128 v1 = MakeVectorE0E1(a, ~a);
3961              V128 v2 = MakeVectorE0E1(b, ~b);
3962  
3963              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3964  
3965              CompareAgainstUnicorn();
3966          }
3967  
3968          [Test, Pairwise, Description("ZIP1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3969          public void Zip1_V_8B_4H_2S([Values(0u)] uint rd,
3970                                      [Values(1u, 0u)] uint rn,
3971                                      [Values(2u, 0u)] uint rm,
3972                                      [ValueSource(nameof(_8B4H2S_))] ulong z,
3973                                      [ValueSource(nameof(_8B4H2S_))] ulong a,
3974                                      [ValueSource(nameof(_8B4H2S_))] ulong b,
3975                                      [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
3976          {
3977              uint opcode = 0x0E003800; // ZIP1 V0.8B, V0.8B, V0.8B
3978              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
3979              opcode |= ((size & 3) << 22);
3980  
3981              V128 v0 = MakeVectorE0E1(z, z);
3982              V128 v1 = MakeVectorE0(a);
3983              V128 v2 = MakeVectorE0(b);
3984  
3985              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
3986  
3987              CompareAgainstUnicorn();
3988          }
3989  
3990          [Test, Pairwise, Description("ZIP1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
3991          public void Zip1_V_16B_8H_4S_2D([Values(0u)] uint rd,
3992                                          [Values(1u, 0u)] uint rn,
3993                                          [Values(2u, 0u)] uint rm,
3994                                          [ValueSource(nameof(_8B4H2S1D_))] ulong z,
3995                                          [ValueSource(nameof(_8B4H2S1D_))] ulong a,
3996                                          [ValueSource(nameof(_8B4H2S1D_))] ulong b,
3997                                          [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
3998          {
3999              uint opcode = 0x4E003800; // ZIP1 V0.16B, V0.16B, V0.16B
4000              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
4001              opcode |= ((size & 3) << 22);
4002  
4003              V128 v0 = MakeVectorE0E1(z, ~z);
4004              V128 v1 = MakeVectorE0E1(a, ~a);
4005              V128 v2 = MakeVectorE0E1(b, ~b);
4006  
4007              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
4008  
4009              CompareAgainstUnicorn();
4010          }
4011  
4012          [Test, Pairwise, Description("ZIP2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
4013          public void Zip2_V_8B_4H_2S([Values(0u)] uint rd,
4014                                      [Values(1u, 0u)] uint rn,
4015                                      [Values(2u, 0u)] uint rm,
4016                                      [ValueSource(nameof(_8B4H2S_))] ulong z,
4017                                      [ValueSource(nameof(_8B4H2S_))] ulong a,
4018                                      [ValueSource(nameof(_8B4H2S_))] ulong b,
4019                                      [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
4020          {
4021              uint opcode = 0x0E007800; // ZIP2 V0.8B, V0.8B, V0.8B
4022              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
4023              opcode |= ((size & 3) << 22);
4024  
4025              V128 v0 = MakeVectorE0E1(z, z);
4026              V128 v1 = MakeVectorE0(a);
4027              V128 v2 = MakeVectorE0(b);
4028  
4029              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
4030  
4031              CompareAgainstUnicorn();
4032          }
4033  
4034          [Test, Pairwise, Description("ZIP2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
4035          public void Zip2_V_16B_8H_4S_2D([Values(0u)] uint rd,
4036                                          [Values(1u, 0u)] uint rn,
4037                                          [Values(2u, 0u)] uint rm,
4038                                          [ValueSource(nameof(_8B4H2S1D_))] ulong z,
4039                                          [ValueSource(nameof(_8B4H2S1D_))] ulong a,
4040                                          [ValueSource(nameof(_8B4H2S1D_))] ulong b,
4041                                          [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
4042          {
4043              uint opcode = 0x4E007800; // ZIP2 V0.16B, V0.16B, V0.16B
4044              opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
4045              opcode |= ((size & 3) << 22);
4046  
4047              V128 v0 = MakeVectorE0E1(z, ~z);
4048              V128 v1 = MakeVectorE0E1(a, ~a);
4049              V128 v2 = MakeVectorE0E1(b, ~b);
4050  
4051              SingleOpcode(opcode, v0: v0, v1: v1, v2: v2);
4052  
4053              CompareAgainstUnicorn();
4054          }
4055  #endif
4056      }
4057  }