golang.org/x/arch@v0.17.0/x86/x86avxgen/avxgen_test.go (about) 1 // Copyright 2018 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "bytes" 9 "io/ioutil" 10 "path/filepath" 11 "regexp" 12 "strings" 13 "sync" 14 "testing" 15 16 "golang.org/x/arch/x86/xeddata" 17 ) 18 19 func newTestContext(t testing.TB) *context { 20 ctx := &context{xedPath: filepath.Join("testdata", "xedpath")} 21 db, err := xeddata.NewDatabase(ctx.xedPath) 22 if err != nil { 23 t.Fatalf("open test database: %v", err) 24 } 25 ctx.db = db 26 return ctx 27 } 28 29 func newStringSet(keys ...string) map[string]bool { 30 set := make(map[string]bool) 31 for _, k := range keys { 32 set[k] = true 33 } 34 return set 35 } 36 37 func generateToString(t *testing.T) string { 38 ctx := newTestContext(t) 39 buildTables(ctx) 40 var buf bytes.Buffer 41 writeTables(&buf, ctx) 42 return buf.String() 43 } 44 45 func TestOutput(t *testing.T) { 46 // Ytab lists and optabs output checks. 47 // 48 // These tests are very fragile. 49 // Slight changes can invalidate them. 50 // It is better to keep testCases count at the minimum. 51 52 type testCase struct { 53 opcode string 54 ytabs string 55 optabLines string 56 } 57 var testCases []testCase 58 { 59 opcodeRE := regexp.MustCompile(`as: ([A-Z][A-Z0-9]*)`) 60 data, err := ioutil.ReadFile(filepath.Join("testdata", "golden.txt")) 61 if err != nil { 62 t.Fatalf("read golden file: %v", err) 63 } 64 for _, entry := range bytes.Split(data, []byte("======")) { 65 parts := bytes.Split(entry, []byte("----")) 66 ytabs := parts[0] 67 optabLines := parts[1] 68 opcode := opcodeRE.FindSubmatch(optabLines)[1] 69 testCases = append(testCases, testCase{ 70 ytabs: strings.TrimSpace(string(ytabs)), 71 optabLines: strings.TrimSpace(string(optabLines)), 72 opcode: string(opcode)[len("A"):], 73 }) 74 } 75 } 76 77 output := generateToString(t) 78 for _, tc := range testCases { 79 if !strings.Contains(output, tc.ytabs) { 80 t.Errorf("%s: ytabs not matched", tc.opcode) 81 } 82 if !strings.Contains(output, tc.optabLines) { 83 t.Errorf("%s: optab lines not matched", tc.opcode) 84 } 85 } 86 } 87 88 func TestOutputStability(t *testing.T) { 89 // Generate output count+1 times and check that every time 90 // it is exactly the same string. 91 // 92 // The output should be deterministic to avoid unwanted diffs 93 // between each code generation. 94 const count = 8 95 96 want := generateToString(t) 97 var wg sync.WaitGroup 98 for i := 0; i < count; i++ { 99 wg.Add(1) 100 go func(i int) { 101 if want != generateToString(t) { 102 t.Errorf("output #%d mismatches", i) 103 } 104 wg.Done() 105 }(i) 106 } 107 wg.Wait() 108 } 109 110 func TestOpcodeCoverage(t *testing.T) { 111 // Check that generator produces all expected opcodes from testdata files. 112 // All opcodes are in Go syntax. 113 114 // VEX/EVEX opcodes collected from XED-based x86.csv. 115 expectedOpcodes := newStringSet( 116 "ANDNL", 117 "ANDNQ", 118 "BEXTRL", 119 "BEXTRQ", 120 "BLSIL", 121 "BLSIQ", 122 "BLSMSKL", 123 "BLSMSKQ", 124 "BLSRL", 125 "BLSRQ", 126 "BZHIL", 127 "BZHIQ", 128 "KADDB", 129 "KADDD", 130 "KADDQ", 131 "KADDW", 132 "KANDB", 133 "KANDD", 134 "KANDNB", 135 "KANDND", 136 "KANDNQ", 137 "KANDNW", 138 "KANDQ", 139 "KANDW", 140 "KMOVB", 141 "KMOVD", 142 "KMOVQ", 143 "KMOVW", 144 "KNOTB", 145 "KNOTD", 146 "KNOTQ", 147 "KNOTW", 148 "KORB", 149 "KORD", 150 "KORQ", 151 "KORTESTB", 152 "KORTESTD", 153 "KORTESTQ", 154 "KORTESTW", 155 "KORW", 156 "KSHIFTLB", 157 "KSHIFTLD", 158 "KSHIFTLQ", 159 "KSHIFTLW", 160 "KSHIFTRB", 161 "KSHIFTRD", 162 "KSHIFTRQ", 163 "KSHIFTRW", 164 "KTESTB", 165 "KTESTD", 166 "KTESTQ", 167 "KTESTW", 168 "KUNPCKBW", 169 "KUNPCKDQ", 170 "KUNPCKWD", 171 "KXNORB", 172 "KXNORD", 173 "KXNORQ", 174 "KXNORW", 175 "KXORB", 176 "KXORD", 177 "KXORQ", 178 "KXORW", 179 "MULXL", 180 "MULXQ", 181 "PDEPL", 182 "PDEPQ", 183 "PEXTL", 184 "PEXTQ", 185 "RORXL", 186 "RORXQ", 187 "SARXL", 188 "SARXQ", 189 "SHLXL", 190 "SHLXQ", 191 "SHRXL", 192 "SHRXQ", 193 "V4FMADDPS", 194 "V4FMADDSS", 195 "V4FNMADDPS", 196 "V4FNMADDSS", 197 "VADDPD", 198 "VADDPS", 199 "VADDSD", 200 "VADDSS", 201 "VADDSUBPD", 202 "VADDSUBPS", 203 "VAESDEC", 204 "VAESDECLAST", 205 "VAESENC", 206 "VAESENCLAST", 207 "VAESIMC", 208 "VAESKEYGENASSIST", 209 "VALIGND", 210 "VALIGNQ", 211 "VANDNPD", 212 "VANDNPS", 213 "VANDPD", 214 "VANDPS", 215 "VBLENDMPD", 216 "VBLENDMPS", 217 "VBLENDPD", 218 "VBLENDPS", 219 "VBLENDVPD", 220 "VBLENDVPS", 221 "VBROADCASTF128", 222 "VBROADCASTF32X2", 223 "VBROADCASTF32X4", 224 "VBROADCASTF32X8", 225 "VBROADCASTF64X2", 226 "VBROADCASTF64X4", 227 "VBROADCASTI128", 228 "VBROADCASTI32X2", 229 "VBROADCASTI32X4", 230 "VBROADCASTI32X8", 231 "VBROADCASTI64X2", 232 "VBROADCASTI64X4", 233 "VBROADCASTSD", 234 "VBROADCASTSS", 235 "VCMPPD", 236 "VCMPPS", 237 "VCMPSD", 238 "VCMPSS", 239 "VCOMISD", 240 "VCOMISS", 241 "VCOMPRESSPD", 242 "VCOMPRESSPS", 243 "VCVTDQ2PD", 244 "VCVTDQ2PS", 245 "VCVTPD2DQ", 246 "VCVTPD2DQX", 247 "VCVTPD2DQY", 248 "VCVTPD2PS", 249 "VCVTPD2PSX", 250 "VCVTPD2PSY", 251 "VCVTPD2QQ", 252 "VCVTPD2UDQ", 253 "VCVTPD2UDQX", 254 "VCVTPD2UDQY", 255 "VCVTPD2UQQ", 256 "VCVTPH2PS", 257 "VCVTPS2DQ", 258 "VCVTPS2PD", 259 "VCVTPS2PH", 260 "VCVTPS2QQ", 261 "VCVTPS2UDQ", 262 "VCVTPS2UQQ", 263 "VCVTQQ2PD", 264 "VCVTQQ2PS", 265 "VCVTQQ2PSX", 266 "VCVTQQ2PSY", 267 "VCVTSD2SI", 268 "VCVTSD2SIQ", 269 "VCVTSD2SS", 270 "VCVTSD2USIL", 271 "VCVTSD2USIQ", 272 "VCVTSI2SDL", 273 "VCVTSI2SDQ", 274 "VCVTSI2SSL", 275 "VCVTSI2SSQ", 276 "VCVTSS2SD", 277 "VCVTSS2SI", 278 "VCVTSS2SIQ", 279 "VCVTSS2USIL", 280 "VCVTSS2USIQ", 281 "VCVTTPD2DQ", 282 "VCVTTPD2DQX", 283 "VCVTTPD2DQY", 284 "VCVTTPD2QQ", 285 "VCVTTPD2UDQ", 286 "VCVTTPD2UDQX", 287 "VCVTTPD2UDQY", 288 "VCVTTPD2UQQ", 289 "VCVTTPS2DQ", 290 "VCVTTPS2QQ", 291 "VCVTTPS2UDQ", 292 "VCVTTPS2UQQ", 293 "VCVTTSD2SI", 294 "VCVTTSD2SIQ", 295 "VCVTTSD2USIL", 296 "VCVTTSD2USIQ", 297 "VCVTTSS2SI", 298 "VCVTTSS2SIQ", 299 "VCVTTSS2USIL", 300 "VCVTTSS2USIQ", 301 "VCVTUDQ2PD", 302 "VCVTUDQ2PS", 303 "VCVTUQQ2PD", 304 "VCVTUQQ2PS", 305 "VCVTUQQ2PSX", 306 "VCVTUQQ2PSY", 307 "VCVTUSI2SDL", 308 "VCVTUSI2SDQ", 309 "VCVTUSI2SSL", 310 "VCVTUSI2SSQ", 311 "VDBPSADBW", 312 "VDIVPD", 313 "VDIVPS", 314 "VDIVSD", 315 "VDIVSS", 316 "VDPPD", 317 "VDPPS", 318 "VEXP2PD", 319 "VEXP2PS", 320 "VEXPANDPD", 321 "VEXPANDPS", 322 "VEXTRACTF128", 323 "VEXTRACTF32X4", 324 "VEXTRACTF32X8", 325 "VEXTRACTF64X2", 326 "VEXTRACTF64X4", 327 "VEXTRACTI128", 328 "VEXTRACTI32X4", 329 "VEXTRACTI32X8", 330 "VEXTRACTI64X2", 331 "VEXTRACTI64X4", 332 "VEXTRACTPS", 333 "VFIXUPIMMPD", 334 "VFIXUPIMMPS", 335 "VFIXUPIMMSD", 336 "VFIXUPIMMSS", 337 "VFMADD132PD", 338 "VFMADD132PS", 339 "VFMADD132SD", 340 "VFMADD132SS", 341 "VFMADD213PD", 342 "VFMADD213PS", 343 "VFMADD213SD", 344 "VFMADD213SS", 345 "VFMADD231PD", 346 "VFMADD231PS", 347 "VFMADD231SD", 348 "VFMADD231SS", 349 "VFMADDPD", 350 "VFMADDPS", 351 "VFMADDSD", 352 "VFMADDSS", 353 "VFMADDSUB132PD", 354 "VFMADDSUB132PS", 355 "VFMADDSUB213PD", 356 "VFMADDSUB213PS", 357 "VFMADDSUB231PD", 358 "VFMADDSUB231PS", 359 "VFMADDSUBPD", 360 "VFMADDSUBPS", 361 "VFMSUB132PD", 362 "VFMSUB132PS", 363 "VFMSUB132SD", 364 "VFMSUB132SS", 365 "VFMSUB213PD", 366 "VFMSUB213PS", 367 "VFMSUB213SD", 368 "VFMSUB213SS", 369 "VFMSUB231PD", 370 "VFMSUB231PS", 371 "VFMSUB231SD", 372 "VFMSUB231SS", 373 "VFMSUBADD132PD", 374 "VFMSUBADD132PS", 375 "VFMSUBADD213PD", 376 "VFMSUBADD213PS", 377 "VFMSUBADD231PD", 378 "VFMSUBADD231PS", 379 "VFMSUBADDPD", 380 "VFMSUBADDPS", 381 "VFMSUBPD", 382 "VFMSUBPS", 383 "VFMSUBSD", 384 "VFMSUBSS", 385 "VFNMADD132PD", 386 "VFNMADD132PS", 387 "VFNMADD132SD", 388 "VFNMADD132SS", 389 "VFNMADD213PD", 390 "VFNMADD213PS", 391 "VFNMADD213SD", 392 "VFNMADD213SS", 393 "VFNMADD231PD", 394 "VFNMADD231PS", 395 "VFNMADD231SD", 396 "VFNMADD231SS", 397 "VFNMADDPD", 398 "VFNMADDPS", 399 "VFNMADDSD", 400 "VFNMADDSS", 401 "VFNMSUB132PD", 402 "VFNMSUB132PS", 403 "VFNMSUB132SD", 404 "VFNMSUB132SS", 405 "VFNMSUB213PD", 406 "VFNMSUB213PS", 407 "VFNMSUB213SD", 408 "VFNMSUB213SS", 409 "VFNMSUB231PD", 410 "VFNMSUB231PS", 411 "VFNMSUB231SD", 412 "VFNMSUB231SS", 413 "VFNMSUBPD", 414 "VFNMSUBPS", 415 "VFNMSUBSD", 416 "VFNMSUBSS", 417 "VFPCLASSPDX", 418 "VFPCLASSPDY", 419 "VFPCLASSPDZ", 420 "VFPCLASSPSX", 421 "VFPCLASSPSY", 422 "VFPCLASSPSZ", 423 "VFPCLASSSD", 424 "VFPCLASSSS", 425 "VGATHERDPD", 426 "VGATHERDPS", 427 "VGATHERPF0DPD", 428 "VGATHERPF0DPS", 429 "VGATHERPF0QPD", 430 "VGATHERPF0QPS", 431 "VGATHERPF1DPD", 432 "VGATHERPF1DPS", 433 "VGATHERPF1QPD", 434 "VGATHERPF1QPS", 435 "VGATHERQPD", 436 "VGATHERQPS", 437 "VGETEXPPD", 438 "VGETEXPPS", 439 "VGETEXPSD", 440 "VGETEXPSS", 441 "VGETMANTPD", 442 "VGETMANTPS", 443 "VGETMANTSD", 444 "VGETMANTSS", 445 "VGF2P8AFFINEINVQB", 446 "VGF2P8AFFINEQB", 447 "VGF2P8MULB", 448 "VHADDPD", 449 "VHADDPS", 450 "VHSUBPD", 451 "VHSUBPS", 452 "VINSERTF128", 453 "VINSERTF32X4", 454 "VINSERTF32X8", 455 "VINSERTF64X2", 456 "VINSERTF64X4", 457 "VINSERTI128", 458 "VINSERTI32X4", 459 "VINSERTI32X8", 460 "VINSERTI64X2", 461 "VINSERTI64X4", 462 "VINSERTPS", 463 "VLDDQU", 464 "VLDMXCSR", 465 "VMASKMOVDQU", 466 "VMASKMOVPD", 467 "VMASKMOVPS", 468 "VMAXPD", 469 "VMAXPS", 470 "VMAXSD", 471 "VMAXSS", 472 "VMINPD", 473 "VMINPS", 474 "VMINSD", 475 "VMINSS", 476 "VMOVAPD", 477 "VMOVAPS", 478 "VMOVD", 479 "VMOVDDUP", 480 "VMOVDQA", 481 "VMOVDQA32", 482 "VMOVDQA64", 483 "VMOVDQU", 484 "VMOVDQU16", 485 "VMOVDQU32", 486 "VMOVDQU64", 487 "VMOVDQU8", 488 "VMOVHLPS", 489 "VMOVHPD", 490 "VMOVHPS", 491 "VMOVLHPS", 492 "VMOVLPD", 493 "VMOVLPS", 494 "VMOVMSKPD", 495 "VMOVMSKPS", 496 "VMOVNTDQ", 497 "VMOVNTDQA", 498 "VMOVNTPD", 499 "VMOVNTPS", 500 "VMOVQ", 501 "VMOVSD", 502 "VMOVSHDUP", 503 "VMOVSLDUP", 504 "VMOVSS", 505 "VMOVUPD", 506 "VMOVUPS", 507 "VMPSADBW", 508 "VMULPD", 509 "VMULPS", 510 "VMULSD", 511 "VMULSS", 512 "VORPD", 513 "VORPS", 514 "VP4DPWSSD", 515 "VP4DPWSSDS", 516 "VPABSB", 517 "VPABSD", 518 "VPABSQ", 519 "VPABSW", 520 "VPACKSSDW", 521 "VPACKSSWB", 522 "VPACKUSDW", 523 "VPACKUSWB", 524 "VPADDB", 525 "VPADDD", 526 "VPADDQ", 527 "VPADDSB", 528 "VPADDSW", 529 "VPADDUSB", 530 "VPADDUSW", 531 "VPADDW", 532 "VPALIGNR", 533 "VPAND", 534 "VPANDD", 535 "VPANDN", 536 "VPANDND", 537 "VPANDNQ", 538 "VPANDQ", 539 "VPAVGB", 540 "VPAVGW", 541 "VPBLENDD", 542 "VPBLENDMB", 543 "VPBLENDMD", 544 "VPBLENDMQ", 545 "VPBLENDMW", 546 "VPBLENDVB", 547 "VPBLENDW", 548 "VPBROADCASTB", 549 "VPBROADCASTD", 550 "VPBROADCASTMB2Q", 551 "VPBROADCASTMW2D", 552 "VPBROADCASTQ", 553 "VPBROADCASTW", 554 "VPCLMULQDQ", 555 "VPCMPB", 556 "VPCMPD", 557 "VPCMPEQB", 558 "VPCMPEQD", 559 "VPCMPEQQ", 560 "VPCMPEQW", 561 "VPCMPESTRI", 562 "VPCMPESTRM", 563 "VPCMPGTB", 564 "VPCMPGTD", 565 "VPCMPGTQ", 566 "VPCMPGTW", 567 "VPCMPISTRI", 568 "VPCMPISTRM", 569 "VPCMPQ", 570 "VPCMPUB", 571 "VPCMPUD", 572 "VPCMPUQ", 573 "VPCMPUW", 574 "VPCMPW", 575 "VPCOMPRESSB", 576 "VPCOMPRESSD", 577 "VPCOMPRESSQ", 578 "VPCOMPRESSW", 579 "VPCONFLICTD", 580 "VPCONFLICTQ", 581 "VPDPBUSD", 582 "VPDPBUSDS", 583 "VPDPWSSD", 584 "VPDPWSSDS", 585 "VPERM2F128", 586 "VPERM2I128", 587 "VPERMB", 588 "VPERMD", 589 "VPERMI2B", 590 "VPERMI2D", 591 "VPERMI2PD", 592 "VPERMI2PS", 593 "VPERMI2Q", 594 "VPERMI2W", 595 "VPERMIL2PD", 596 "VPERMIL2PS", 597 "VPERMILPD", 598 "VPERMILPS", 599 "VPERMPD", 600 "VPERMPS", 601 "VPERMQ", 602 "VPERMT2B", 603 "VPERMT2D", 604 "VPERMT2PD", 605 "VPERMT2PS", 606 "VPERMT2Q", 607 "VPERMT2W", 608 "VPERMW", 609 "VPEXPANDB", 610 "VPEXPANDD", 611 "VPEXPANDQ", 612 "VPEXPANDW", 613 "VPEXTRB", 614 "VPEXTRD", 615 "VPEXTRQ", 616 "VPEXTRW", 617 "VPGATHERDD", 618 "VPGATHERDQ", 619 "VPGATHERQD", 620 "VPGATHERQQ", 621 "VPHADDD", 622 "VPHADDSW", 623 "VPHADDW", 624 "VPHMINPOSUW", 625 "VPHSUBD", 626 "VPHSUBSW", 627 "VPHSUBW", 628 "VPINSRB", 629 "VPINSRD", 630 "VPINSRQ", 631 "VPINSRW", 632 "VPLZCNTD", 633 "VPLZCNTQ", 634 "VPMADD52HUQ", 635 "VPMADD52LUQ", 636 "VPMADDUBSW", 637 "VPMADDWD", 638 "VPMASKMOVD", 639 "VPMASKMOVQ", 640 "VPMAXSB", 641 "VPMAXSD", 642 "VPMAXSQ", 643 "VPMAXSW", 644 "VPMAXUB", 645 "VPMAXUD", 646 "VPMAXUQ", 647 "VPMAXUW", 648 "VPMINSB", 649 "VPMINSD", 650 "VPMINSQ", 651 "VPMINSW", 652 "VPMINUB", 653 "VPMINUD", 654 "VPMINUQ", 655 "VPMINUW", 656 "VPMOVB2M", 657 "VPMOVD2M", 658 "VPMOVDB", 659 "VPMOVDW", 660 "VPMOVM2B", 661 "VPMOVM2D", 662 "VPMOVM2Q", 663 "VPMOVM2W", 664 "VPMOVMSKB", 665 "VPMOVQ2M", 666 "VPMOVQB", 667 "VPMOVQD", 668 "VPMOVQW", 669 "VPMOVSDB", 670 "VPMOVSDW", 671 "VPMOVSQB", 672 "VPMOVSQD", 673 "VPMOVSQW", 674 "VPMOVSWB", 675 "VPMOVSXBD", 676 "VPMOVSXBQ", 677 "VPMOVSXBW", 678 "VPMOVSXDQ", 679 "VPMOVSXWD", 680 "VPMOVSXWQ", 681 "VPMOVUSDB", 682 "VPMOVUSDW", 683 "VPMOVUSQB", 684 "VPMOVUSQD", 685 "VPMOVUSQW", 686 "VPMOVUSWB", 687 "VPMOVW2M", 688 "VPMOVWB", 689 "VPMOVZXBD", 690 "VPMOVZXBQ", 691 "VPMOVZXBW", 692 "VPMOVZXDQ", 693 "VPMOVZXWD", 694 "VPMOVZXWQ", 695 "VPMULDQ", 696 "VPMULHRSW", 697 "VPMULHUW", 698 "VPMULHW", 699 "VPMULLD", 700 "VPMULLQ", 701 "VPMULLW", 702 "VPMULTISHIFTQB", 703 "VPMULUDQ", 704 "VPOPCNTB", 705 "VPOPCNTD", 706 "VPOPCNTQ", 707 "VPOPCNTW", 708 "VPOR", 709 "VPORD", 710 "VPORQ", 711 "VPROLD", 712 "VPROLQ", 713 "VPROLVD", 714 "VPROLVQ", 715 "VPRORD", 716 "VPRORQ", 717 "VPRORVD", 718 "VPRORVQ", 719 "VPSADBW", 720 "VPSCATTERDD", 721 "VPSCATTERDQ", 722 "VPSCATTERQD", 723 "VPSCATTERQQ", 724 "VPSHLDD", 725 "VPSHLDQ", 726 "VPSHLDVD", 727 "VPSHLDVQ", 728 "VPSHLDVW", 729 "VPSHLDW", 730 "VPSHRDD", 731 "VPSHRDQ", 732 "VPSHRDVD", 733 "VPSHRDVQ", 734 "VPSHRDVW", 735 "VPSHRDW", 736 "VPSHUFB", 737 "VPSHUFBITQMB", 738 "VPSHUFD", 739 "VPSHUFHW", 740 "VPSHUFLW", 741 "VPSIGNB", 742 "VPSIGND", 743 "VPSIGNW", 744 "VPSLLD", 745 "VPSLLDQ", 746 "VPSLLQ", 747 "VPSLLVD", 748 "VPSLLVQ", 749 "VPSLLVW", 750 "VPSLLW", 751 "VPSRAD", 752 "VPSRAQ", 753 "VPSRAVD", 754 "VPSRAVQ", 755 "VPSRAVW", 756 "VPSRAW", 757 "VPSRLD", 758 "VPSRLDQ", 759 "VPSRLQ", 760 "VPSRLVD", 761 "VPSRLVQ", 762 "VPSRLVW", 763 "VPSRLW", 764 "VPSUBB", 765 "VPSUBD", 766 "VPSUBQ", 767 "VPSUBSB", 768 "VPSUBSW", 769 "VPSUBUSB", 770 "VPSUBUSW", 771 "VPSUBW", 772 "VPTERNLOGD", 773 "VPTERNLOGQ", 774 "VPTEST", 775 "VPTESTMB", 776 "VPTESTMD", 777 "VPTESTMQ", 778 "VPTESTMW", 779 "VPTESTNMB", 780 "VPTESTNMD", 781 "VPTESTNMQ", 782 "VPTESTNMW", 783 "VPUNPCKHBW", 784 "VPUNPCKHDQ", 785 "VPUNPCKHQDQ", 786 "VPUNPCKHWD", 787 "VPUNPCKLBW", 788 "VPUNPCKLDQ", 789 "VPUNPCKLQDQ", 790 "VPUNPCKLWD", 791 "VPXOR", 792 "VPXORD", 793 "VPXORQ", 794 "VRANGEPD", 795 "VRANGEPS", 796 "VRANGESD", 797 "VRANGESS", 798 "VRCP14PD", 799 "VRCP14PS", 800 "VRCP14SD", 801 "VRCP14SS", 802 "VRCP28PD", 803 "VRCP28PS", 804 "VRCP28SD", 805 "VRCP28SS", 806 "VRCPPS", 807 "VRCPSS", 808 "VREDUCEPD", 809 "VREDUCEPS", 810 "VREDUCESD", 811 "VREDUCESS", 812 "VRNDSCALEPD", 813 "VRNDSCALEPS", 814 "VRNDSCALESD", 815 "VRNDSCALESS", 816 "VROUNDPD", 817 "VROUNDPS", 818 "VROUNDSD", 819 "VROUNDSS", 820 "VRSQRT14PD", 821 "VRSQRT14PS", 822 "VRSQRT14SD", 823 "VRSQRT14SS", 824 "VRSQRT28PD", 825 "VRSQRT28PS", 826 "VRSQRT28SD", 827 "VRSQRT28SS", 828 "VRSQRTPS", 829 "VRSQRTSS", 830 "VSCALEFPD", 831 "VSCALEFPS", 832 "VSCALEFSD", 833 "VSCALEFSS", 834 "VSCATTERDPD", 835 "VSCATTERDPS", 836 "VSCATTERPF0DPD", 837 "VSCATTERPF0DPS", 838 "VSCATTERPF0QPD", 839 "VSCATTERPF0QPS", 840 "VSCATTERPF1DPD", 841 "VSCATTERPF1DPS", 842 "VSCATTERPF1QPD", 843 "VSCATTERPF1QPS", 844 "VSCATTERQPD", 845 "VSCATTERQPS", 846 "VSHUFF32X4", 847 "VSHUFF64X2", 848 "VSHUFI32X4", 849 "VSHUFI64X2", 850 "VSHUFPD", 851 "VSHUFPS", 852 "VSQRTPD", 853 "VSQRTPS", 854 "VSQRTSD", 855 "VSQRTSS", 856 "VSTMXCSR", 857 "VSUBPD", 858 "VSUBPS", 859 "VSUBSD", 860 "VSUBSS", 861 "VTESTPD", 862 "VTESTPS", 863 "VUCOMISD", 864 "VUCOMISS", 865 "VUNPCKHPD", 866 "VUNPCKHPS", 867 "VUNPCKLPD", 868 "VUNPCKLPS", 869 "VXORPD", 870 "VXORPS", 871 "VZEROALL", 872 "VZEROUPPER") 873 874 // AMD-specific VEX opcodes. 875 // Excluded from x86avxgen output for now. 876 amdOpcodes := newStringSet( 877 "VFMADDPD", 878 "VFMADDPS", 879 "VFMADDSD", 880 "VFMADDSS", 881 "VFMADDSUBPD", 882 "VFMADDSUBPS", 883 "VFMSUBADDPD", 884 "VFMSUBADDPS", 885 "VFMSUBPD", 886 "VFMSUBPS", 887 "VFMSUBSD", 888 "VFMSUBSS", 889 "VFNMADDPD", 890 "VFNMADDPS", 891 "VFNMADDSD", 892 "VFNMADDSS", 893 "VFNMSUBPD", 894 "VFNMSUBPS", 895 "VFNMSUBSD", 896 "VFNMSUBSS", 897 "VPERMIL2PD", 898 "VPERMIL2PS") 899 900 ctx := newTestContext(t) 901 buildTables(ctx) 902 903 for op := range amdOpcodes { 904 delete(expectedOpcodes, op) 905 } 906 for op := range ctx.optabs { 907 delete(expectedOpcodes, op) 908 } 909 910 for op := range expectedOpcodes { 911 t.Errorf("missing opcode: %s", op) 912 } 913 }