...

Source file src/golang.org/x/arch/x86/x86avxgen/avxgen_test.go

Documentation: golang.org/x/arch/x86/x86avxgen

     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  }
   914  

View as plain text