all: add GFNI instructions (#344)

Adds support for the GFNI "Galois Field New Instructions" instruction set.

These instructions are not included in the Opcodes database, therefore they're
added using the "extras" mechanism introduced in #345.

For simplicity, the loading phase is updated slightly so that AVX-512 form
expansion rules are applied after extras are added to the list. This greatly
reduces the number of forms that have to be specified by hand.

Based on #343
Fixes #335

Co-authored-by: Klaus Post <klauspost@gmail.com>
This commit is contained in:
Michael McLoughlin
2022-11-27 18:53:46 -08:00
committed by GitHub
parent a0ea0f3e6f
commit 946323570a
10 changed files with 2362 additions and 398 deletions

View File

@@ -23273,6 +23273,252 @@ func TestVGETMANTSS_ZValidFormsNoError(t *testing.T) {
}
}
func TestVGF2P8AFFINEINVQBValidFormsNoError(t *testing.T) {
if _, err := VGF2P8AFFINEINVQB(opimm8, opm128, opxmm, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB(opimm8, opm256, opymm, opymm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB(opimm8, opxmm, opxmm, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB(opimm8, opymm, opymm, opymm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB(opimm8, opm512, opzmm, opk, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB(opimm8, opm512, opzmm, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB(opimm8, opzmm, opzmm, opk, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB(opimm8, opzmm, opzmm, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB(opimm8, opm128, opxmm, opk, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB(opimm8, opm256, opymm, opk, opymm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB(opimm8, opxmm, opxmm, opk, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB(opimm8, opymm, opymm, opk, opymm); err != nil {
t.Fatal(err)
}
}
func TestVGF2P8AFFINEINVQB_BCSTValidFormsNoError(t *testing.T) {
if _, err := VGF2P8AFFINEINVQB_BCST(opimm8, opm64, opzmm, opk, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB_BCST(opimm8, opm64, opzmm, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB_BCST(opimm8, opm64, opxmm, opk, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB_BCST(opimm8, opm64, opxmm, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB_BCST(opimm8, opm64, opymm, opk, opymm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB_BCST(opimm8, opm64, opymm, opymm); err != nil {
t.Fatal(err)
}
}
func TestVGF2P8AFFINEINVQB_BCST_ZValidFormsNoError(t *testing.T) {
if _, err := VGF2P8AFFINEINVQB_BCST_Z(opimm8, opm64, opzmm, opk, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB_BCST_Z(opimm8, opm64, opxmm, opk, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB_BCST_Z(opimm8, opm64, opymm, opk, opymm); err != nil {
t.Fatal(err)
}
}
func TestVGF2P8AFFINEINVQB_ZValidFormsNoError(t *testing.T) {
if _, err := VGF2P8AFFINEINVQB_Z(opimm8, opm512, opzmm, opk, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB_Z(opimm8, opzmm, opzmm, opk, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB_Z(opimm8, opm128, opxmm, opk, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB_Z(opimm8, opm256, opymm, opk, opymm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB_Z(opimm8, opxmm, opxmm, opk, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEINVQB_Z(opimm8, opymm, opymm, opk, opymm); err != nil {
t.Fatal(err)
}
}
func TestVGF2P8AFFINEQBValidFormsNoError(t *testing.T) {
if _, err := VGF2P8AFFINEQB(opimm8, opm128, opxmm, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB(opimm8, opm256, opymm, opymm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB(opimm8, opxmm, opxmm, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB(opimm8, opymm, opymm, opymm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB(opimm8, opm512, opzmm, opk, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB(opimm8, opm512, opzmm, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB(opimm8, opzmm, opzmm, opk, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB(opimm8, opzmm, opzmm, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB(opimm8, opm128, opxmm, opk, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB(opimm8, opm256, opymm, opk, opymm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB(opimm8, opxmm, opxmm, opk, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB(opimm8, opymm, opymm, opk, opymm); err != nil {
t.Fatal(err)
}
}
func TestVGF2P8AFFINEQB_BCSTValidFormsNoError(t *testing.T) {
if _, err := VGF2P8AFFINEQB_BCST(opimm8, opm64, opzmm, opk, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB_BCST(opimm8, opm64, opzmm, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB_BCST(opimm8, opm64, opxmm, opk, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB_BCST(opimm8, opm64, opxmm, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB_BCST(opimm8, opm64, opymm, opk, opymm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB_BCST(opimm8, opm64, opymm, opymm); err != nil {
t.Fatal(err)
}
}
func TestVGF2P8AFFINEQB_BCST_ZValidFormsNoError(t *testing.T) {
if _, err := VGF2P8AFFINEQB_BCST_Z(opimm8, opm64, opzmm, opk, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB_BCST_Z(opimm8, opm64, opxmm, opk, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB_BCST_Z(opimm8, opm64, opymm, opk, opymm); err != nil {
t.Fatal(err)
}
}
func TestVGF2P8AFFINEQB_ZValidFormsNoError(t *testing.T) {
if _, err := VGF2P8AFFINEQB_Z(opimm8, opm512, opzmm, opk, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB_Z(opimm8, opzmm, opzmm, opk, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB_Z(opimm8, opm128, opxmm, opk, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB_Z(opimm8, opm256, opymm, opk, opymm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB_Z(opimm8, opxmm, opxmm, opk, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8AFFINEQB_Z(opimm8, opymm, opymm, opk, opymm); err != nil {
t.Fatal(err)
}
}
func TestVGF2P8MULBValidFormsNoError(t *testing.T) {
if _, err := VGF2P8MULB(opm128, opxmm, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8MULB(opm256, opymm, opymm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8MULB(opxmm, opxmm, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8MULB(opymm, opymm, opymm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8MULB(opm512, opzmm, opk, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8MULB(opm512, opzmm, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8MULB(opzmm, opzmm, opk, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8MULB(opzmm, opzmm, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8MULB(opm128, opxmm, opk, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8MULB(opm256, opymm, opk, opymm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8MULB(opxmm, opxmm, opk, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8MULB(opymm, opymm, opk, opymm); err != nil {
t.Fatal(err)
}
}
func TestVGF2P8MULB_ZValidFormsNoError(t *testing.T) {
if _, err := VGF2P8MULB_Z(opm512, opzmm, opk, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8MULB_Z(opzmm, opzmm, opk, opzmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8MULB_Z(opm128, opxmm, opk, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8MULB_Z(opm256, opymm, opk, opymm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8MULB_Z(opxmm, opxmm, opk, opxmm); err != nil {
t.Fatal(err)
}
if _, err := VGF2P8MULB_Z(opymm, opymm, opk, opymm); err != nil {
t.Fatal(err)
}
}
func TestVHADDPDValidFormsNoError(t *testing.T) {
if _, err := VHADDPD(opm128, opxmm, opxmm); err != nil {
t.Fatal(err)