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 }