diff --git a/build/zinstructions.go b/build/zinstructions.go index a0cffd7..28dedb5 100644 --- a/build/zinstructions.go +++ b/build/zinstructions.go @@ -16894,10 +16894,14 @@ func VADDSUBPS(mxy, xy, xy1 operand.Op) { ctx.VADDSUBPS(mxy, xy, xy1) } // // VAESDEC m128 xmm xmm // VAESDEC xmm xmm xmm +// VAESDEC m256 ymm ymm +// VAESDEC ymm ymm ymm +// VAESDEC m512 zmm zmm +// VAESDEC zmm zmm zmm // // Construct and append a VAESDEC instruction to the active function. -func (c *Context) VAESDEC(mx, x, x1 operand.Op) { - c.addinstruction(x86.VAESDEC(mx, x, x1)) +func (c *Context) VAESDEC(mxyz, xyz, xyz1 operand.Op) { + c.addinstruction(x86.VAESDEC(mxyz, xyz, xyz1)) } // VAESDEC: Perform One Round of an AES Decryption Flow. @@ -16906,10 +16910,14 @@ func (c *Context) VAESDEC(mx, x, x1 operand.Op) { // // VAESDEC m128 xmm xmm // VAESDEC xmm xmm xmm +// VAESDEC m256 ymm ymm +// VAESDEC ymm ymm ymm +// VAESDEC m512 zmm zmm +// VAESDEC zmm zmm zmm // // Construct and append a VAESDEC instruction to the active function. // Operates on the global context. -func VAESDEC(mx, x, x1 operand.Op) { ctx.VAESDEC(mx, x, x1) } +func VAESDEC(mxyz, xyz, xyz1 operand.Op) { ctx.VAESDEC(mxyz, xyz, xyz1) } // VAESDECLAST: Perform Last Round of an AES Decryption Flow. // @@ -16917,10 +16925,14 @@ func VAESDEC(mx, x, x1 operand.Op) { ctx.VAESDEC(mx, x, x1) } // // VAESDECLAST m128 xmm xmm // VAESDECLAST xmm xmm xmm +// VAESDECLAST m256 ymm ymm +// VAESDECLAST ymm ymm ymm +// VAESDECLAST m512 zmm zmm +// VAESDECLAST zmm zmm zmm // // Construct and append a VAESDECLAST instruction to the active function. -func (c *Context) VAESDECLAST(mx, x, x1 operand.Op) { - c.addinstruction(x86.VAESDECLAST(mx, x, x1)) +func (c *Context) VAESDECLAST(mxyz, xyz, xyz1 operand.Op) { + c.addinstruction(x86.VAESDECLAST(mxyz, xyz, xyz1)) } // VAESDECLAST: Perform Last Round of an AES Decryption Flow. @@ -16929,10 +16941,14 @@ func (c *Context) VAESDECLAST(mx, x, x1 operand.Op) { // // VAESDECLAST m128 xmm xmm // VAESDECLAST xmm xmm xmm +// VAESDECLAST m256 ymm ymm +// VAESDECLAST ymm ymm ymm +// VAESDECLAST m512 zmm zmm +// VAESDECLAST zmm zmm zmm // // Construct and append a VAESDECLAST instruction to the active function. // Operates on the global context. -func VAESDECLAST(mx, x, x1 operand.Op) { ctx.VAESDECLAST(mx, x, x1) } +func VAESDECLAST(mxyz, xyz, xyz1 operand.Op) { ctx.VAESDECLAST(mxyz, xyz, xyz1) } // VAESENC: Perform One Round of an AES Encryption Flow. // @@ -16940,10 +16956,14 @@ func VAESDECLAST(mx, x, x1 operand.Op) { ctx.VAESDECLAST(mx, x, x1) } // // VAESENC m128 xmm xmm // VAESENC xmm xmm xmm +// VAESENC m256 ymm ymm +// VAESENC ymm ymm ymm +// VAESENC m512 zmm zmm +// VAESENC zmm zmm zmm // // Construct and append a VAESENC instruction to the active function. -func (c *Context) VAESENC(mx, x, x1 operand.Op) { - c.addinstruction(x86.VAESENC(mx, x, x1)) +func (c *Context) VAESENC(mxyz, xyz, xyz1 operand.Op) { + c.addinstruction(x86.VAESENC(mxyz, xyz, xyz1)) } // VAESENC: Perform One Round of an AES Encryption Flow. @@ -16952,10 +16972,14 @@ func (c *Context) VAESENC(mx, x, x1 operand.Op) { // // VAESENC m128 xmm xmm // VAESENC xmm xmm xmm +// VAESENC m256 ymm ymm +// VAESENC ymm ymm ymm +// VAESENC m512 zmm zmm +// VAESENC zmm zmm zmm // // Construct and append a VAESENC instruction to the active function. // Operates on the global context. -func VAESENC(mx, x, x1 operand.Op) { ctx.VAESENC(mx, x, x1) } +func VAESENC(mxyz, xyz, xyz1 operand.Op) { ctx.VAESENC(mxyz, xyz, xyz1) } // VAESENCLAST: Perform Last Round of an AES Encryption Flow. // @@ -16963,10 +16987,14 @@ func VAESENC(mx, x, x1 operand.Op) { ctx.VAESENC(mx, x, x1) } // // VAESENCLAST m128 xmm xmm // VAESENCLAST xmm xmm xmm +// VAESENCLAST m256 ymm ymm +// VAESENCLAST ymm ymm ymm +// VAESENCLAST m512 zmm zmm +// VAESENCLAST zmm zmm zmm // // Construct and append a VAESENCLAST instruction to the active function. -func (c *Context) VAESENCLAST(mx, x, x1 operand.Op) { - c.addinstruction(x86.VAESENCLAST(mx, x, x1)) +func (c *Context) VAESENCLAST(mxyz, xyz, xyz1 operand.Op) { + c.addinstruction(x86.VAESENCLAST(mxyz, xyz, xyz1)) } // VAESENCLAST: Perform Last Round of an AES Encryption Flow. @@ -16975,10 +17003,14 @@ func (c *Context) VAESENCLAST(mx, x, x1 operand.Op) { // // VAESENCLAST m128 xmm xmm // VAESENCLAST xmm xmm xmm +// VAESENCLAST m256 ymm ymm +// VAESENCLAST ymm ymm ymm +// VAESENCLAST m512 zmm zmm +// VAESENCLAST zmm zmm zmm // // Construct and append a VAESENCLAST instruction to the active function. // Operates on the global context. -func VAESENCLAST(mx, x, x1 operand.Op) { ctx.VAESENCLAST(mx, x, x1) } +func VAESENCLAST(mxyz, xyz, xyz1 operand.Op) { ctx.VAESENCLAST(mxyz, xyz, xyz1) } // VAESIMC: Perform the AES InvMixColumn Transformation. // diff --git a/internal/inst/ztable.go b/internal/inst/ztable.go index bfb50fa..1a16b28 100644 --- a/internal/inst/ztable.go +++ b/internal/inst/ztable.go @@ -17437,6 +17437,42 @@ var Instructions = []Instruction{ }, EncodingType: 0x3, }, + { + ISA: []string{"VAES"}, + Operands: []Operand{ + {Type: "m256", Action: 0x1}, + {Type: "ymm", Action: 0x1}, + {Type: "ymm", Action: 0x2}, + }, + EncodingType: 0x3, + }, + { + ISA: []string{"VAES"}, + Operands: []Operand{ + {Type: "ymm", Action: 0x1}, + {Type: "ymm", Action: 0x1}, + {Type: "ymm", Action: 0x2}, + }, + EncodingType: 0x3, + }, + { + ISA: []string{"AVX512F", "VAES"}, + Operands: []Operand{ + {Type: "m512", Action: 0x1}, + {Type: "zmm", Action: 0x1}, + {Type: "zmm", Action: 0x2}, + }, + EncodingType: 0x4, + }, + { + ISA: []string{"AVX512F", "VAES"}, + Operands: []Operand{ + {Type: "zmm", Action: 0x1}, + {Type: "zmm", Action: 0x1}, + {Type: "zmm", Action: 0x2}, + }, + EncodingType: 0x4, + }, }, }, { @@ -17461,6 +17497,42 @@ var Instructions = []Instruction{ }, EncodingType: 0x3, }, + { + ISA: []string{"VAES"}, + Operands: []Operand{ + {Type: "m256", Action: 0x1}, + {Type: "ymm", Action: 0x1}, + {Type: "ymm", Action: 0x2}, + }, + EncodingType: 0x3, + }, + { + ISA: []string{"VAES"}, + Operands: []Operand{ + {Type: "ymm", Action: 0x1}, + {Type: "ymm", Action: 0x1}, + {Type: "ymm", Action: 0x2}, + }, + EncodingType: 0x3, + }, + { + ISA: []string{"AVX512F", "VAES"}, + Operands: []Operand{ + {Type: "m512", Action: 0x1}, + {Type: "zmm", Action: 0x1}, + {Type: "zmm", Action: 0x2}, + }, + EncodingType: 0x4, + }, + { + ISA: []string{"AVX512F", "VAES"}, + Operands: []Operand{ + {Type: "zmm", Action: 0x1}, + {Type: "zmm", Action: 0x1}, + {Type: "zmm", Action: 0x2}, + }, + EncodingType: 0x4, + }, }, }, { @@ -17485,6 +17557,42 @@ var Instructions = []Instruction{ }, EncodingType: 0x3, }, + { + ISA: []string{"VAES"}, + Operands: []Operand{ + {Type: "m256", Action: 0x1}, + {Type: "ymm", Action: 0x1}, + {Type: "ymm", Action: 0x2}, + }, + EncodingType: 0x3, + }, + { + ISA: []string{"VAES"}, + Operands: []Operand{ + {Type: "ymm", Action: 0x1}, + {Type: "ymm", Action: 0x1}, + {Type: "ymm", Action: 0x2}, + }, + EncodingType: 0x3, + }, + { + ISA: []string{"AVX512F", "VAES"}, + Operands: []Operand{ + {Type: "m512", Action: 0x1}, + {Type: "zmm", Action: 0x1}, + {Type: "zmm", Action: 0x2}, + }, + EncodingType: 0x4, + }, + { + ISA: []string{"AVX512F", "VAES"}, + Operands: []Operand{ + {Type: "zmm", Action: 0x1}, + {Type: "zmm", Action: 0x1}, + {Type: "zmm", Action: 0x2}, + }, + EncodingType: 0x4, + }, }, }, { @@ -17509,6 +17617,42 @@ var Instructions = []Instruction{ }, EncodingType: 0x3, }, + { + ISA: []string{"VAES"}, + Operands: []Operand{ + {Type: "m256", Action: 0x1}, + {Type: "ymm", Action: 0x1}, + {Type: "ymm", Action: 0x2}, + }, + EncodingType: 0x3, + }, + { + ISA: []string{"VAES"}, + Operands: []Operand{ + {Type: "ymm", Action: 0x1}, + {Type: "ymm", Action: 0x1}, + {Type: "ymm", Action: 0x2}, + }, + EncodingType: 0x3, + }, + { + ISA: []string{"AVX512F", "VAES"}, + Operands: []Operand{ + {Type: "m512", Action: 0x1}, + {Type: "zmm", Action: 0x1}, + {Type: "zmm", Action: 0x2}, + }, + EncodingType: 0x4, + }, + { + ISA: []string{"AVX512F", "VAES"}, + Operands: []Operand{ + {Type: "zmm", Action: 0x1}, + {Type: "zmm", Action: 0x1}, + {Type: "zmm", Action: 0x2}, + }, + EncodingType: 0x4, + }, }, }, { diff --git a/internal/opcodesextra/instructions.go b/internal/opcodesextra/instructions.go index 39a4249..9935662 100644 --- a/internal/opcodesextra/instructions.go +++ b/internal/opcodesextra/instructions.go @@ -7,6 +7,7 @@ import "github.com/mmcloughlin/avo/internal/inst" var sets = [][]*inst.Instruction{ movlqzx, gfni, + vaes, } // Instructions returns a list of extras to add to the instructions database. diff --git a/internal/opcodesextra/vaes.go b/internal/opcodesextra/vaes.go new file mode 100644 index 0000000..ccb0bd6 --- /dev/null +++ b/internal/opcodesextra/vaes.go @@ -0,0 +1,184 @@ +package opcodesextra + +import "github.com/mmcloughlin/avo/internal/inst" + +// vaes is the "Vector Advanced Encryption Standard" instruction set. +var vaes = []*inst.Instruction{ + // Reference: https://github.com/golang/go/blob/go1.19.3/src/cmd/internal/obj/x86/avx_optabs.go#L1217-L1244 + // + // {as: AVAESDEC, ytab: _yvaesdec, prefix: Pavx, op: opBytes{ + // avxEscape | vex128 | vex66 | vex0F38 | vexW0, 0xDE, + // avxEscape | vex256 | vex66 | vex0F38 | vexW0, 0xDE, + // avxEscape | evex128 | evex66 | evex0F38 | evexW0, evexN16, 0xDE, + // avxEscape | evex256 | evex66 | evex0F38 | evexW0, evexN32, 0xDE, + // avxEscape | evex512 | evex66 | evex0F38 | evexW0, evexN64, 0xDE, + // }}, + // {as: AVAESDECLAST, ytab: _yvaesdec, prefix: Pavx, op: opBytes{ + // avxEscape | vex128 | vex66 | vex0F38 | vexW0, 0xDF, + // avxEscape | vex256 | vex66 | vex0F38 | vexW0, 0xDF, + // avxEscape | evex128 | evex66 | evex0F38 | evexW0, evexN16, 0xDF, + // avxEscape | evex256 | evex66 | evex0F38 | evexW0, evexN32, 0xDF, + // avxEscape | evex512 | evex66 | evex0F38 | evexW0, evexN64, 0xDF, + // }}, + // {as: AVAESENC, ytab: _yvaesdec, prefix: Pavx, op: opBytes{ + // avxEscape | vex128 | vex66 | vex0F38 | vexW0, 0xDC, + // avxEscape | vex256 | vex66 | vex0F38 | vexW0, 0xDC, + // avxEscape | evex128 | evex66 | evex0F38 | evexW0, evexN16, 0xDC, + // avxEscape | evex256 | evex66 | evex0F38 | evexW0, evexN32, 0xDC, + // avxEscape | evex512 | evex66 | evex0F38 | evexW0, evexN64, 0xDC, + // }}, + // {as: AVAESENCLAST, ytab: _yvaesdec, prefix: Pavx, op: opBytes{ + // avxEscape | vex128 | vex66 | vex0F38 | vexW0, 0xDD, + // avxEscape | vex256 | vex66 | vex0F38 | vexW0, 0xDD, + // avxEscape | evex128 | evex66 | evex0F38 | evexW0, evexN16, 0xDD, + // avxEscape | evex256 | evex66 | evex0F38 | evexW0, evexN32, 0xDD, + // avxEscape | evex512 | evex66 | evex0F38 | evexW0, evexN64, 0xDD, + // }}, + // + { + Opcode: "VAESDEC", + Summary: "Perform One Round of an AES Decryption Flow", + Forms: vaesforms, + }, + { + Opcode: "VAESDECLAST", + Summary: "Perform Last Round of an AES Decryption Flow", + Forms: vaesforms, + }, + { + Opcode: "VAESENC", + Summary: "Perform One Round of an AES Encryption Flow", + Forms: vaesforms, + }, + { + Opcode: "VAESENCLAST", + Summary: "Perform Last Round of an AES Encryption Flow", + Forms: vaesforms, + }, +} + +// VAESDEC, VAESDECLAST, VAESENC and VAESENCLAST forms. +// +// See: https://software.intel.com/en-us/download/intel-64-and-ia-32-architectures-sdm-combined-volumes-1-2a-2b-2c-2d-3a-3b-3c-3d-and-4 +// +// Reference: https://github.com/golang/go/blob/go1.19.3/src/cmd/internal/obj/x86/avx_optabs.go#L111-L117 +// +// var _yvaesdec = []ytab{ +// {zcase: Zvex_rm_v_r, zoffset: 2, args: argList{Yxm, Yxr, Yxr}}, +// {zcase: Zvex_rm_v_r, zoffset: 2, args: argList{Yym, Yyr, Yyr}}, +// {zcase: Zevex_rm_v_r, zoffset: 3, args: argList{YxmEvex, YxrEvex, YxrEvex}}, +// {zcase: Zevex_rm_v_r, zoffset: 3, args: argList{YymEvex, YyrEvex, YyrEvex}}, +// {zcase: Zevex_rm_v_r, zoffset: 3, args: argList{Yzm, Yzr, Yzr}}, +// } +var vaesforms = inst.Forms{ + // VEX.128.66.0F38.WIG DE /r VAESDEC xmm1, xmm2, xmm3/m128 AVX + AES + // VEX.128.66.0F38.WIG DF /r VAESDECLAST xmm1, xmm2, xmm3/m128 AVX + AES + // VEX.128.66.0F38.WIG DC /r VAESENC xmm1, xmm2, xmm3/m128 AVX + AES + // VEX.128.66.0F38.WIG DD /r VAESENCLAST xmm1, xmm2, xmm3/m128 AVX + AES + { + ISA: []string{"AES", "AVX"}, + Operands: []inst.Operand{ + {Type: "m128", Action: inst.R}, + {Type: "xmm", Action: inst.R}, + {Type: "xmm", Action: inst.W}, + }, + EncodingType: inst.EncodingTypeVEX, + }, + { + ISA: []string{"AES", "AVX"}, + Operands: []inst.Operand{ + {Type: "xmm", Action: inst.R}, + {Type: "xmm", Action: inst.R}, + {Type: "xmm", Action: inst.W}, + }, + EncodingType: inst.EncodingTypeVEX, + }, + // VEX.256.66.0F38.WIG DE /r VAESDEC ymm1, ymm2, ymm3/m256 VAES + // VEX.256.66.0F38.WIG DF /r VAESDECLAST ymm1, ymm2, ymm3/m256 VAES + // VEX.256.66.0F38.WIG DC /r VAESENC ymm1, ymm2, ymm3/m256 VAES + // VEX.256.66.0F38.WIG DD /r VAESENCLAST ymm1, ymm2, ymm3/m256 VAES + { + ISA: []string{"VAES"}, + Operands: []inst.Operand{ + {Type: "m256", Action: inst.R}, + {Type: "ymm", Action: inst.R}, + {Type: "ymm", Action: inst.W}, + }, + EncodingType: inst.EncodingTypeVEX, + }, + { + ISA: []string{"VAES"}, + Operands: []inst.Operand{ + {Type: "ymm", Action: inst.R}, + {Type: "ymm", Action: inst.R}, + {Type: "ymm", Action: inst.W}, + }, + EncodingType: inst.EncodingTypeVEX, + }, + // EVEX.128.66.0F38.WIG DE /r VAESDEC xmm1, xmm2, xmm3/m128 AVX512VL + VAES + // EVEX.128.66.0F38.WIG DF /r VAESDECLAST xmm1, xmm2, xmm3/m128 AVX512VL + VAES + // EVEX.128.66.0F38.WIG DC /r VAESENC xmm1, xmm2, xmm3/m128 AVX512VL + VAES + // EVEX.128.66.0F38.WIG DD /r VAESENCLAST xmm1, xmm2, xmm3/m128 AVX512VL + VAES + { + ISA: []string{"AVX512VL", "VAES"}, + Operands: []inst.Operand{ + {Type: "m128", Action: inst.R}, + {Type: "xmm", Action: inst.R}, + {Type: "xmm", Action: inst.W}, + }, + EncodingType: inst.EncodingTypeEVEX, + }, + { + ISA: []string{"AVX512VL", "VAES"}, + Operands: []inst.Operand{ + {Type: "xmm", Action: inst.R}, + {Type: "xmm", Action: inst.R}, + {Type: "xmm", Action: inst.W}, + }, + EncodingType: inst.EncodingTypeEVEX, + }, + // EVEX.256.66.0F38.WIG DE /r VAESDEC ymm1, ymm2, ymm3/m256 AVX512VL + VAES + // EVEX.256.66.0F38.WIG DF /r VAESDECLAST ymm1, ymm2, ymm3/m256 AVX512VL + VAES + // EVEX.256.66.0F38.WIG DC /r VAESENC ymm1, ymm2, ymm3/m256 AVX512VL + VAES + // EVEX.256.66.0F38.WIG DD /r VAESENCLAST ymm1, ymm2, ymm3/m256 AVX512VL + VAES + { + ISA: []string{"AVX512VL", "VAES"}, + Operands: []inst.Operand{ + {Type: "m256", Action: inst.R}, + {Type: "ymm", Action: inst.R}, + {Type: "ymm", Action: inst.W}, + }, + EncodingType: inst.EncodingTypeEVEX, + }, + { + ISA: []string{"AVX512VL", "VAES"}, + Operands: []inst.Operand{ + {Type: "ymm", Action: inst.R}, + {Type: "ymm", Action: inst.R}, + {Type: "ymm", Action: inst.W}, + }, + EncodingType: inst.EncodingTypeEVEX, + }, + // EVEX.512.66.0F38.WIG DE /r VAESDEC zmm1, zmm2, zmm3/m512 AVX512F + VAES + // EVEX.512.66.0F38.WIG DF /r VAESDECLAST zmm1, zmm2, zmm3/m512 AVX512F + VAES + // EVEX.512.66.0F38.WIG DC /r VAESENC zmm1, zmm2, zmm3/m512 AVX512F + VAES + // EVEX.512.66.0F38.WIG DD /r VAESENCLAST zmm1, zmm2, zmm3/m512 AVX512F + VAES + { + ISA: []string{"AVX512F", "VAES"}, + Operands: []inst.Operand{ + {Type: "m512", Action: inst.R}, + {Type: "zmm", Action: inst.R}, + {Type: "zmm", Action: inst.W}, + }, + EncodingType: inst.EncodingTypeEVEX, + }, + { + ISA: []string{"AVX512F", "VAES"}, + Operands: []inst.Operand{ + {Type: "zmm", Action: inst.R}, + {Type: "zmm", Action: inst.R}, + {Type: "zmm", Action: inst.W}, + }, + EncodingType: inst.EncodingTypeEVEX, + }, +} diff --git a/x86/zctors.go b/x86/zctors.go index 85a2ee6..c8cdc3f 100644 --- a/x86/zctors.go +++ b/x86/zctors.go @@ -7396,8 +7396,12 @@ func VADDSUBPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) { // // VAESDEC m128 xmm xmm // VAESDEC xmm xmm xmm -func VAESDEC(mx, x, x1 operand.Op) (*intrep.Instruction, error) { - return build(opcVAESDEC.Forms(), sffxs{}, []operand.Op{mx, x, x1}) +// VAESDEC m256 ymm ymm +// VAESDEC ymm ymm ymm +// VAESDEC m512 zmm zmm +// VAESDEC zmm zmm zmm +func VAESDEC(mxyz, xyz, xyz1 operand.Op) (*intrep.Instruction, error) { + return build(opcVAESDEC.Forms(), sffxs{}, []operand.Op{mxyz, xyz, xyz1}) } // VAESDECLAST: Perform Last Round of an AES Decryption Flow. @@ -7406,8 +7410,12 @@ func VAESDEC(mx, x, x1 operand.Op) (*intrep.Instruction, error) { // // VAESDECLAST m128 xmm xmm // VAESDECLAST xmm xmm xmm -func VAESDECLAST(mx, x, x1 operand.Op) (*intrep.Instruction, error) { - return build(opcVAESDECLAST.Forms(), sffxs{}, []operand.Op{mx, x, x1}) +// VAESDECLAST m256 ymm ymm +// VAESDECLAST ymm ymm ymm +// VAESDECLAST m512 zmm zmm +// VAESDECLAST zmm zmm zmm +func VAESDECLAST(mxyz, xyz, xyz1 operand.Op) (*intrep.Instruction, error) { + return build(opcVAESDECLAST.Forms(), sffxs{}, []operand.Op{mxyz, xyz, xyz1}) } // VAESENC: Perform One Round of an AES Encryption Flow. @@ -7416,8 +7424,12 @@ func VAESDECLAST(mx, x, x1 operand.Op) (*intrep.Instruction, error) { // // VAESENC m128 xmm xmm // VAESENC xmm xmm xmm -func VAESENC(mx, x, x1 operand.Op) (*intrep.Instruction, error) { - return build(opcVAESENC.Forms(), sffxs{}, []operand.Op{mx, x, x1}) +// VAESENC m256 ymm ymm +// VAESENC ymm ymm ymm +// VAESENC m512 zmm zmm +// VAESENC zmm zmm zmm +func VAESENC(mxyz, xyz, xyz1 operand.Op) (*intrep.Instruction, error) { + return build(opcVAESENC.Forms(), sffxs{}, []operand.Op{mxyz, xyz, xyz1}) } // VAESENCLAST: Perform Last Round of an AES Encryption Flow. @@ -7426,8 +7438,12 @@ func VAESENC(mx, x, x1 operand.Op) (*intrep.Instruction, error) { // // VAESENCLAST m128 xmm xmm // VAESENCLAST xmm xmm xmm -func VAESENCLAST(mx, x, x1 operand.Op) (*intrep.Instruction, error) { - return build(opcVAESENCLAST.Forms(), sffxs{}, []operand.Op{mx, x, x1}) +// VAESENCLAST m256 ymm ymm +// VAESENCLAST ymm ymm ymm +// VAESENCLAST m512 zmm zmm +// VAESENCLAST zmm zmm zmm +func VAESENCLAST(mxyz, xyz, xyz1 operand.Op) (*intrep.Instruction, error) { + return build(opcVAESENCLAST.Forms(), sffxs{}, []operand.Op{mxyz, xyz, xyz1}) } // VAESIMC: Perform the AES InvMixColumn Transformation. diff --git a/x86/zctors_test.go b/x86/zctors_test.go index c7b707f..2c323e1 100644 --- a/x86/zctors_test.go +++ b/x86/zctors_test.go @@ -7467,6 +7467,18 @@ func TestVAESDECValidFormsNoError(t *testing.T) { if _, err := VAESDEC(opxmm, opxmm, opxmm); err != nil { t.Fatal(err) } + if _, err := VAESDEC(opm256, opymm, opymm); err != nil { + t.Fatal(err) + } + if _, err := VAESDEC(opymm, opymm, opymm); err != nil { + t.Fatal(err) + } + if _, err := VAESDEC(opm512, opzmm, opzmm); err != nil { + t.Fatal(err) + } + if _, err := VAESDEC(opzmm, opzmm, opzmm); err != nil { + t.Fatal(err) + } } func TestVAESDECLASTValidFormsNoError(t *testing.T) { @@ -7476,6 +7488,18 @@ func TestVAESDECLASTValidFormsNoError(t *testing.T) { if _, err := VAESDECLAST(opxmm, opxmm, opxmm); err != nil { t.Fatal(err) } + if _, err := VAESDECLAST(opm256, opymm, opymm); err != nil { + t.Fatal(err) + } + if _, err := VAESDECLAST(opymm, opymm, opymm); err != nil { + t.Fatal(err) + } + if _, err := VAESDECLAST(opm512, opzmm, opzmm); err != nil { + t.Fatal(err) + } + if _, err := VAESDECLAST(opzmm, opzmm, opzmm); err != nil { + t.Fatal(err) + } } func TestVAESENCValidFormsNoError(t *testing.T) { @@ -7485,6 +7509,18 @@ func TestVAESENCValidFormsNoError(t *testing.T) { if _, err := VAESENC(opxmm, opxmm, opxmm); err != nil { t.Fatal(err) } + if _, err := VAESENC(opm256, opymm, opymm); err != nil { + t.Fatal(err) + } + if _, err := VAESENC(opymm, opymm, opymm); err != nil { + t.Fatal(err) + } + if _, err := VAESENC(opm512, opzmm, opzmm); err != nil { + t.Fatal(err) + } + if _, err := VAESENC(opzmm, opzmm, opzmm); err != nil { + t.Fatal(err) + } } func TestVAESENCLASTValidFormsNoError(t *testing.T) { @@ -7494,6 +7530,18 @@ func TestVAESENCLASTValidFormsNoError(t *testing.T) { if _, err := VAESENCLAST(opxmm, opxmm, opxmm); err != nil { t.Fatal(err) } + if _, err := VAESENCLAST(opm256, opymm, opymm); err != nil { + t.Fatal(err) + } + if _, err := VAESENCLAST(opymm, opymm, opymm); err != nil { + t.Fatal(err) + } + if _, err := VAESENCLAST(opm512, opzmm, opzmm); err != nil { + t.Fatal(err) + } + if _, err := VAESENCLAST(opzmm, opzmm, opzmm); err != nil { + t.Fatal(err) + } } func TestVAESIMCValidFormsNoError(t *testing.T) { diff --git a/x86/zoptab.go b/x86/zoptab.go index 34608a4..a738027 100644 --- a/x86/zoptab.go +++ b/x86/zoptab.go @@ -300,6 +300,8 @@ const ( isasAVX isasAVX512F_AVX512VL isasAES_AVX + isasVAES + isasAVX512F_VAES isasAVX512DQ_AVX512VL isasAVX2 isasF16C @@ -362,6 +364,8 @@ var isaslisttable = [][]string{ {"AVX"}, {"AVX512F", "AVX512VL"}, {"AES", "AVX"}, + {"VAES"}, + {"AVX512F", "VAES"}, {"AVX512DQ", "AVX512VL"}, {"AVX2"}, {"F16C"}, @@ -4704,12 +4708,28 @@ var forms = []form{ {opcVADDSUBPS, sffxsclsNIL, 0, isasAVX, 3, oprnds{{uint8(oprndtypeYMM), false, actionR}, {uint8(oprndtypeYMM), false, actionR}, {uint8(oprndtypeYMM), false, actionW}}}, {opcVAESDEC, sffxsclsNIL, 0, isasAES_AVX, 3, oprnds{{uint8(oprndtypeM128), false, actionR}, {uint8(oprndtypeXMM), false, actionR}, {uint8(oprndtypeXMM), false, actionW}}}, {opcVAESDEC, sffxsclsNIL, 0, isasAES_AVX, 3, oprnds{{uint8(oprndtypeXMM), false, actionR}, {uint8(oprndtypeXMM), false, actionR}, {uint8(oprndtypeXMM), false, actionW}}}, + {opcVAESDEC, sffxsclsNIL, 0, isasVAES, 3, oprnds{{uint8(oprndtypeM256), false, actionR}, {uint8(oprndtypeYMM), false, actionR}, {uint8(oprndtypeYMM), false, actionW}}}, + {opcVAESDEC, sffxsclsNIL, 0, isasVAES, 3, oprnds{{uint8(oprndtypeYMM), false, actionR}, {uint8(oprndtypeYMM), false, actionR}, {uint8(oprndtypeYMM), false, actionW}}}, + {opcVAESDEC, sffxsclsNIL, 0, isasAVX512F_VAES, 3, oprnds{{uint8(oprndtypeM512), false, actionR}, {uint8(oprndtypeZMM), false, actionR}, {uint8(oprndtypeZMM), false, actionW}}}, + {opcVAESDEC, sffxsclsNIL, 0, isasAVX512F_VAES, 3, oprnds{{uint8(oprndtypeZMM), false, actionR}, {uint8(oprndtypeZMM), false, actionR}, {uint8(oprndtypeZMM), false, actionW}}}, {opcVAESDECLAST, sffxsclsNIL, 0, isasAES_AVX, 3, oprnds{{uint8(oprndtypeM128), false, actionR}, {uint8(oprndtypeXMM), false, actionR}, {uint8(oprndtypeXMM), false, actionW}}}, {opcVAESDECLAST, sffxsclsNIL, 0, isasAES_AVX, 3, oprnds{{uint8(oprndtypeXMM), false, actionR}, {uint8(oprndtypeXMM), false, actionR}, {uint8(oprndtypeXMM), false, actionW}}}, + {opcVAESDECLAST, sffxsclsNIL, 0, isasVAES, 3, oprnds{{uint8(oprndtypeM256), false, actionR}, {uint8(oprndtypeYMM), false, actionR}, {uint8(oprndtypeYMM), false, actionW}}}, + {opcVAESDECLAST, sffxsclsNIL, 0, isasVAES, 3, oprnds{{uint8(oprndtypeYMM), false, actionR}, {uint8(oprndtypeYMM), false, actionR}, {uint8(oprndtypeYMM), false, actionW}}}, + {opcVAESDECLAST, sffxsclsNIL, 0, isasAVX512F_VAES, 3, oprnds{{uint8(oprndtypeM512), false, actionR}, {uint8(oprndtypeZMM), false, actionR}, {uint8(oprndtypeZMM), false, actionW}}}, + {opcVAESDECLAST, sffxsclsNIL, 0, isasAVX512F_VAES, 3, oprnds{{uint8(oprndtypeZMM), false, actionR}, {uint8(oprndtypeZMM), false, actionR}, {uint8(oprndtypeZMM), false, actionW}}}, {opcVAESENC, sffxsclsNIL, 0, isasAES_AVX, 3, oprnds{{uint8(oprndtypeM128), false, actionR}, {uint8(oprndtypeXMM), false, actionR}, {uint8(oprndtypeXMM), false, actionW}}}, {opcVAESENC, sffxsclsNIL, 0, isasAES_AVX, 3, oprnds{{uint8(oprndtypeXMM), false, actionR}, {uint8(oprndtypeXMM), false, actionR}, {uint8(oprndtypeXMM), false, actionW}}}, + {opcVAESENC, sffxsclsNIL, 0, isasVAES, 3, oprnds{{uint8(oprndtypeM256), false, actionR}, {uint8(oprndtypeYMM), false, actionR}, {uint8(oprndtypeYMM), false, actionW}}}, + {opcVAESENC, sffxsclsNIL, 0, isasVAES, 3, oprnds{{uint8(oprndtypeYMM), false, actionR}, {uint8(oprndtypeYMM), false, actionR}, {uint8(oprndtypeYMM), false, actionW}}}, + {opcVAESENC, sffxsclsNIL, 0, isasAVX512F_VAES, 3, oprnds{{uint8(oprndtypeM512), false, actionR}, {uint8(oprndtypeZMM), false, actionR}, {uint8(oprndtypeZMM), false, actionW}}}, + {opcVAESENC, sffxsclsNIL, 0, isasAVX512F_VAES, 3, oprnds{{uint8(oprndtypeZMM), false, actionR}, {uint8(oprndtypeZMM), false, actionR}, {uint8(oprndtypeZMM), false, actionW}}}, {opcVAESENCLAST, sffxsclsNIL, 0, isasAES_AVX, 3, oprnds{{uint8(oprndtypeM128), false, actionR}, {uint8(oprndtypeXMM), false, actionR}, {uint8(oprndtypeXMM), false, actionW}}}, {opcVAESENCLAST, sffxsclsNIL, 0, isasAES_AVX, 3, oprnds{{uint8(oprndtypeXMM), false, actionR}, {uint8(oprndtypeXMM), false, actionR}, {uint8(oprndtypeXMM), false, actionW}}}, + {opcVAESENCLAST, sffxsclsNIL, 0, isasVAES, 3, oprnds{{uint8(oprndtypeM256), false, actionR}, {uint8(oprndtypeYMM), false, actionR}, {uint8(oprndtypeYMM), false, actionW}}}, + {opcVAESENCLAST, sffxsclsNIL, 0, isasVAES, 3, oprnds{{uint8(oprndtypeYMM), false, actionR}, {uint8(oprndtypeYMM), false, actionR}, {uint8(oprndtypeYMM), false, actionW}}}, + {opcVAESENCLAST, sffxsclsNIL, 0, isasAVX512F_VAES, 3, oprnds{{uint8(oprndtypeM512), false, actionR}, {uint8(oprndtypeZMM), false, actionR}, {uint8(oprndtypeZMM), false, actionW}}}, + {opcVAESENCLAST, sffxsclsNIL, 0, isasAVX512F_VAES, 3, oprnds{{uint8(oprndtypeZMM), false, actionR}, {uint8(oprndtypeZMM), false, actionR}, {uint8(oprndtypeZMM), false, actionW}}}, {opcVAESIMC, sffxsclsNIL, 0, isasAES_AVX, 2, oprnds{{uint8(oprndtypeM128), false, actionR}, {uint8(oprndtypeXMM), false, actionW}}}, {opcVAESIMC, sffxsclsNIL, 0, isasAES_AVX, 2, oprnds{{uint8(oprndtypeXMM), false, actionR}, {uint8(oprndtypeXMM), false, actionW}}}, {opcVAESKEYGENASSIST, sffxsclsNIL, 0, isasAES_AVX, 3, oprnds{{uint8(oprndtypeIMM8), false, actionN}, {uint8(oprndtypeM128), false, actionR}, {uint8(oprndtypeXMM), false, actionW}}}, @@ -15102,627 +15122,627 @@ var opcformstable = [][]form{ forms[1714:1723], forms[1723:1727], forms[1727:1731], - forms[1731:1733], - forms[1733:1735], - forms[1735:1737], - forms[1737:1739], - forms[1739:1741], - forms[1741:1743], - forms[1743:1770], - forms[1770:1797], - forms[1797:1824], - forms[1824:1851], - forms[1851:1878], - forms[1878:1905], - forms[1905:1932], - forms[1932:1959], - forms[1959:1963], - forms[1963:1967], - forms[1967:1971], - forms[1971:1975], - forms[1975:1976], - forms[1976:1988], - forms[1988:1994], - forms[1994:1997], - forms[1997:2003], - forms[2003:2006], - forms[2006:2007], - forms[2007:2025], - forms[2025:2031], - forms[2031:2034], - forms[2034:2040], - forms[2040:2043], - forms[2043:2055], - forms[2055:2069], - forms[2069:2093], - forms[2093:2117], - forms[2117:2125], - forms[2125:2133], - forms[2133:2136], - forms[2136:2139], - forms[2139:2157], - forms[2157:2175], - forms[2175:2202], - forms[2202:2232], - forms[2232:2244], - forms[2244:2253], - forms[2253:2262], - forms[2262:2274], - forms[2274:2283], - forms[2283:2292], - forms[2292:2322], - forms[2322:2334], - forms[2334:2343], - forms[2343:2352], - forms[2352:2382], - forms[2382:2403], - forms[2403:2433], - forms[2433:2463], - forms[2463:2484], - forms[2484:2514], - forms[2514:2544], - forms[2544:2574], - forms[2574:2604], - forms[2604:2616], - forms[2616:2625], - forms[2625:2634], - forms[2634:2637], - forms[2637:2640], - forms[2640:2649], - forms[2649:2652], - forms[2652:2655], - forms[2655:2657], - forms[2657:2660], - forms[2660:2663], - forms[2663:2666], - forms[2666:2675], - forms[2675:2678], - forms[2678:2681], - forms[2681:2684], - forms[2684:2687], - forms[2687:2699], - forms[2699:2708], - forms[2708:2717], - forms[2717:2747], - forms[2747:2759], - forms[2759:2768], - forms[2768:2777], - forms[2777:2807], - forms[2807:2837], - forms[2837:2867], - forms[2867:2897], - forms[2897:2927], - forms[2927:2930], - forms[2930:2933], - forms[2933:2936], - forms[2936:2939], - forms[2939:2942], - forms[2942:2945], - forms[2945:2948], - forms[2948:2951], - forms[2951:2978], - forms[2978:3008], - forms[3008:3038], - forms[3038:3050], - forms[3050:3059], - forms[3059:3068], - forms[3068:3070], - forms[3070:3073], - forms[3073:3076], - forms[3076:3079], - forms[3079:3097], - forms[3097:3127], - forms[3127:3157], - forms[3157:3166], - forms[3166:3175], - forms[3175:3177], - forms[3177:3181], - forms[3181:3193], - forms[3193:3205], - forms[3205:3223], - forms[3223:3241], - forms[3241:3243], - forms[3243:3255], - forms[3255:3261], - forms[3261:3273], - forms[3273:3279], - forms[3279:3281], - forms[3281:3293], - forms[3293:3299], - forms[3299:3311], - forms[3311:3317], - forms[3317:3319], - forms[3319:3349], - forms[3349:3379], - forms[3379:3388], - forms[3388:3397], - forms[3397:3427], - forms[3427:3457], - forms[3457:3466], - forms[3466:3475], - forms[3475:3505], - forms[3505:3535], - forms[3535:3544], - forms[3544:3553], - forms[3553:3583], - forms[3583:3613], - forms[3613:3622], - forms[3622:3631], - forms[3631:3661], - forms[3661:3691], - forms[3691:3721], - forms[3721:3751], - forms[3751:3781], - forms[3781:3811], - forms[3811:3841], - forms[3841:3871], - forms[3871:3880], - forms[3880:3889], - forms[3889:3919], - forms[3919:3949], - forms[3949:3958], - forms[3958:3967], - forms[3967:3997], - forms[3997:4027], - forms[4027:4036], - forms[4036:4045], - forms[4045:4075], - forms[4075:4105], - forms[4105:4135], - forms[4135:4165], - forms[4165:4195], - forms[4195:4225], - forms[4225:4255], - forms[4255:4285], - forms[4285:4294], - forms[4294:4303], - forms[4303:4333], - forms[4333:4363], - forms[4363:4372], - forms[4372:4381], - forms[4381:4411], - forms[4411:4441], - forms[4441:4450], - forms[4450:4459], - forms[4459:4489], - forms[4489:4519], - forms[4519:4528], - forms[4528:4537], - forms[4537:4567], - forms[4567:4597], - forms[4597:4606], - forms[4606:4615], - forms[4615:4645], - forms[4645:4675], - forms[4675:4684], - forms[4684:4693], - forms[4693:4699], - forms[4699:4705], - forms[4705:4711], - forms[4711:4717], - forms[4717:4723], - forms[4723:4729], - forms[4729:4733], - forms[4733:4737], - forms[4737:4742], - forms[4742:4747], - forms[4747:4752], - forms[4752:4757], - forms[4757:4787], - forms[4787:4817], - forms[4817:4826], - forms[4826:4835], - forms[4835:4865], - forms[4865:4895], - forms[4895:4904], - forms[4904:4913], - forms[4913:4940], - forms[4940:4967], - forms[4967:4985], - forms[4985:4989], - forms[4989:4993], - forms[4993:4997], - forms[4997:5001], - forms[5001:5003], - forms[5003:5015], - forms[5015:5021], - forms[5021:5033], - forms[5033:5039], - forms[5039:5041], - forms[5041:5053], - forms[5053:5059], - forms[5059:5071], - forms[5071:5077], - forms[5077:5079], - forms[5079:5081], - forms[5081:5082], - forms[5082:5083], - forms[5083:5087], - forms[5087:5091], - forms[5091:5121], - forms[5121:5151], - forms[5151:5160], - forms[5160:5169], - forms[5169:5199], - forms[5199:5229], - forms[5229:5238], - forms[5238:5247], - forms[5247:5274], - forms[5274:5301], - forms[5301:5305], - forms[5305:5323], - forms[5323:5329], - forms[5329:5356], - forms[5356:5383], - forms[5383:5389], - forms[5389:5416], - forms[5416:5443], - forms[5443:5470], - forms[5470:5497], - forms[5497:5498], - forms[5498:5500], - forms[5500:5502], - forms[5502:5503], - forms[5503:5505], - forms[5505:5507], - forms[5507:5509], - forms[5509:5511], - forms[5511:5514], - forms[5514:5517], - forms[5517:5520], - forms[5520:5523], - forms[5523:5528], - forms[5528:5536], - forms[5536:5554], - forms[5554:5572], - forms[5572:5580], - forms[5580:5607], - forms[5607:5634], - forms[5634:5638], - forms[5638:5668], - forms[5668:5698], - forms[5698:5707], - forms[5707:5716], - forms[5716:5743], - forms[5743:5770], - forms[5770:5788], - forms[5788:5815], - forms[5815:5842], - forms[5842:5860], - forms[5860:5887], - forms[5887:5905], - forms[5905:5932], - forms[5932:5950], - forms[5950:5968], - forms[5968:5995], - forms[5995:6022], - forms[6022:6040], - forms[6040:6058], - forms[6058:6076], - forms[6076:6094], - forms[6094:6112], - forms[6112:6130], - forms[6130:6134], - forms[6134:6161], - forms[6161:6165], - forms[6165:6192], - forms[6192:6219], - forms[6219:6246], - forms[6246:6264], - forms[6264:6282], - forms[6282:6286], - forms[6286:6304], - forms[6304:6331], - forms[6331:6358], - forms[6358:6376], - forms[6376:6380], - forms[6380:6384], - forms[6384:6411], - forms[6411:6438], - forms[6438:6441], - forms[6441:6444], - forms[6444:6471], - forms[6471:6498], - forms[6498:6500], - forms[6500:6512], - forms[6512:6530], - forms[6530:6546], - forms[6546:6568], - forms[6568:6590], - forms[6590:6606], - forms[6606:6608], - forms[6608:6610], - forms[6610:6626], - forms[6626:6648], - forms[6648:6670], - forms[6670:6686], - forms[6686:6688], - forms[6688:6690], - forms[6690:6708], - forms[6708:6720], - forms[6720:6738], - forms[6738:6756], - forms[6756:6768], - forms[6768:6780], - forms[6780:6798], - forms[6798:6816], - forms[6816:6843], - forms[6843:6870], - forms[6870:6872], - forms[6872:6874], - forms[6874:6892], - forms[6892:6910], - forms[6910:6928], - forms[6928:6955], - forms[6955:6982], - forms[6982:7009], - forms[7009:7036], - forms[7036:7054], - forms[7054:7108], - forms[7108:7162], - forms[7162:7198], - forms[7198:7216], - forms[7216:7252], - forms[7252:7270], - forms[7270:7297], - forms[7297:7324], - forms[7324:7351], - forms[7351:7378], - forms[7378:7396], - forms[7396:7414], - forms[7414:7432], - forms[7432:7450], - forms[7450:7452], - forms[7452:7454], - forms[7454:7456], - forms[7456:7458], - forms[7458:7463], - forms[7463:7468], - forms[7468:7473], - forms[7473:7478], - forms[7478:7482], - forms[7482:7486], - forms[7486:7490], - forms[7490:7492], - forms[7492:7496], - forms[7496:7500], - forms[7500:7504], - forms[7504:7506], + forms[1731:1737], + forms[1737:1743], + forms[1743:1749], + forms[1749:1755], + forms[1755:1757], + forms[1757:1759], + forms[1759:1786], + forms[1786:1813], + forms[1813:1840], + forms[1840:1867], + forms[1867:1894], + forms[1894:1921], + forms[1921:1948], + forms[1948:1975], + forms[1975:1979], + forms[1979:1983], + forms[1983:1987], + forms[1987:1991], + forms[1991:1992], + forms[1992:2004], + forms[2004:2010], + forms[2010:2013], + forms[2013:2019], + forms[2019:2022], + forms[2022:2023], + forms[2023:2041], + forms[2041:2047], + forms[2047:2050], + forms[2050:2056], + forms[2056:2059], + forms[2059:2071], + forms[2071:2085], + forms[2085:2109], + forms[2109:2133], + forms[2133:2141], + forms[2141:2149], + forms[2149:2152], + forms[2152:2155], + forms[2155:2173], + forms[2173:2191], + forms[2191:2218], + forms[2218:2248], + forms[2248:2260], + forms[2260:2269], + forms[2269:2278], + forms[2278:2290], + forms[2290:2299], + forms[2299:2308], + forms[2308:2338], + forms[2338:2350], + forms[2350:2359], + forms[2359:2368], + forms[2368:2398], + forms[2398:2419], + forms[2419:2449], + forms[2449:2479], + forms[2479:2500], + forms[2500:2530], + forms[2530:2560], + forms[2560:2590], + forms[2590:2620], + forms[2620:2632], + forms[2632:2641], + forms[2641:2650], + forms[2650:2653], + forms[2653:2656], + forms[2656:2665], + forms[2665:2668], + forms[2668:2671], + forms[2671:2673], + forms[2673:2676], + forms[2676:2679], + forms[2679:2682], + forms[2682:2691], + forms[2691:2694], + forms[2694:2697], + forms[2697:2700], + forms[2700:2703], + forms[2703:2715], + forms[2715:2724], + forms[2724:2733], + forms[2733:2763], + forms[2763:2775], + forms[2775:2784], + forms[2784:2793], + forms[2793:2823], + forms[2823:2853], + forms[2853:2883], + forms[2883:2913], + forms[2913:2943], + forms[2943:2946], + forms[2946:2949], + forms[2949:2952], + forms[2952:2955], + forms[2955:2958], + forms[2958:2961], + forms[2961:2964], + forms[2964:2967], + forms[2967:2994], + forms[2994:3024], + forms[3024:3054], + forms[3054:3066], + forms[3066:3075], + forms[3075:3084], + forms[3084:3086], + forms[3086:3089], + forms[3089:3092], + forms[3092:3095], + forms[3095:3113], + forms[3113:3143], + forms[3143:3173], + forms[3173:3182], + forms[3182:3191], + forms[3191:3193], + forms[3193:3197], + forms[3197:3209], + forms[3209:3221], + forms[3221:3239], + forms[3239:3257], + forms[3257:3259], + forms[3259:3271], + forms[3271:3277], + forms[3277:3289], + forms[3289:3295], + forms[3295:3297], + forms[3297:3309], + forms[3309:3315], + forms[3315:3327], + forms[3327:3333], + forms[3333:3335], + forms[3335:3365], + forms[3365:3395], + forms[3395:3404], + forms[3404:3413], + forms[3413:3443], + forms[3443:3473], + forms[3473:3482], + forms[3482:3491], + forms[3491:3521], + forms[3521:3551], + forms[3551:3560], + forms[3560:3569], + forms[3569:3599], + forms[3599:3629], + forms[3629:3638], + forms[3638:3647], + forms[3647:3677], + forms[3677:3707], + forms[3707:3737], + forms[3737:3767], + forms[3767:3797], + forms[3797:3827], + forms[3827:3857], + forms[3857:3887], + forms[3887:3896], + forms[3896:3905], + forms[3905:3935], + forms[3935:3965], + forms[3965:3974], + forms[3974:3983], + forms[3983:4013], + forms[4013:4043], + forms[4043:4052], + forms[4052:4061], + forms[4061:4091], + forms[4091:4121], + forms[4121:4151], + forms[4151:4181], + forms[4181:4211], + forms[4211:4241], + forms[4241:4271], + forms[4271:4301], + forms[4301:4310], + forms[4310:4319], + forms[4319:4349], + forms[4349:4379], + forms[4379:4388], + forms[4388:4397], + forms[4397:4427], + forms[4427:4457], + forms[4457:4466], + forms[4466:4475], + forms[4475:4505], + forms[4505:4535], + forms[4535:4544], + forms[4544:4553], + forms[4553:4583], + forms[4583:4613], + forms[4613:4622], + forms[4622:4631], + forms[4631:4661], + forms[4661:4691], + forms[4691:4700], + forms[4700:4709], + forms[4709:4715], + forms[4715:4721], + forms[4721:4727], + forms[4727:4733], + forms[4733:4739], + forms[4739:4745], + forms[4745:4749], + forms[4749:4753], + forms[4753:4758], + forms[4758:4763], + forms[4763:4768], + forms[4768:4773], + forms[4773:4803], + forms[4803:4833], + forms[4833:4842], + forms[4842:4851], + forms[4851:4881], + forms[4881:4911], + forms[4911:4920], + forms[4920:4929], + forms[4929:4956], + forms[4956:4983], + forms[4983:5001], + forms[5001:5005], + forms[5005:5009], + forms[5009:5013], + forms[5013:5017], + forms[5017:5019], + forms[5019:5031], + forms[5031:5037], + forms[5037:5049], + forms[5049:5055], + forms[5055:5057], + forms[5057:5069], + forms[5069:5075], + forms[5075:5087], + forms[5087:5093], + forms[5093:5095], + forms[5095:5097], + forms[5097:5098], + forms[5098:5099], + forms[5099:5103], + forms[5103:5107], + forms[5107:5137], + forms[5137:5167], + forms[5167:5176], + forms[5176:5185], + forms[5185:5215], + forms[5215:5245], + forms[5245:5254], + forms[5254:5263], + forms[5263:5290], + forms[5290:5317], + forms[5317:5321], + forms[5321:5339], + forms[5339:5345], + forms[5345:5372], + forms[5372:5399], + forms[5399:5405], + forms[5405:5432], + forms[5432:5459], + forms[5459:5486], + forms[5486:5513], + forms[5513:5514], + forms[5514:5516], + forms[5516:5518], + forms[5518:5519], + forms[5519:5521], + forms[5521:5523], + forms[5523:5525], + forms[5525:5527], + forms[5527:5530], + forms[5530:5533], + forms[5533:5536], + forms[5536:5539], + forms[5539:5544], + forms[5544:5552], + forms[5552:5570], + forms[5570:5588], + forms[5588:5596], + forms[5596:5623], + forms[5623:5650], + forms[5650:5654], + forms[5654:5684], + forms[5684:5714], + forms[5714:5723], + forms[5723:5732], + forms[5732:5759], + forms[5759:5786], + forms[5786:5804], + forms[5804:5831], + forms[5831:5858], + forms[5858:5876], + forms[5876:5903], + forms[5903:5921], + forms[5921:5948], + forms[5948:5966], + forms[5966:5984], + forms[5984:6011], + forms[6011:6038], + forms[6038:6056], + forms[6056:6074], + forms[6074:6092], + forms[6092:6110], + forms[6110:6128], + forms[6128:6146], + forms[6146:6150], + forms[6150:6177], + forms[6177:6181], + forms[6181:6208], + forms[6208:6235], + forms[6235:6262], + forms[6262:6280], + forms[6280:6298], + forms[6298:6302], + forms[6302:6320], + forms[6320:6347], + forms[6347:6374], + forms[6374:6392], + forms[6392:6396], + forms[6396:6400], + forms[6400:6427], + forms[6427:6454], + forms[6454:6457], + forms[6457:6460], + forms[6460:6487], + forms[6487:6514], + forms[6514:6516], + forms[6516:6528], + forms[6528:6546], + forms[6546:6562], + forms[6562:6584], + forms[6584:6606], + forms[6606:6622], + forms[6622:6624], + forms[6624:6626], + forms[6626:6642], + forms[6642:6664], + forms[6664:6686], + forms[6686:6702], + forms[6702:6704], + forms[6704:6706], + forms[6706:6724], + forms[6724:6736], + forms[6736:6754], + forms[6754:6772], + forms[6772:6784], + forms[6784:6796], + forms[6796:6814], + forms[6814:6832], + forms[6832:6859], + forms[6859:6886], + forms[6886:6888], + forms[6888:6890], + forms[6890:6908], + forms[6908:6926], + forms[6926:6944], + forms[6944:6971], + forms[6971:6998], + forms[6998:7025], + forms[7025:7052], + forms[7052:7070], + forms[7070:7124], + forms[7124:7178], + forms[7178:7214], + forms[7214:7232], + forms[7232:7268], + forms[7268:7286], + forms[7286:7313], + forms[7313:7340], + forms[7340:7367], + forms[7367:7394], + forms[7394:7412], + forms[7412:7430], + forms[7430:7448], + forms[7448:7466], + forms[7466:7468], + forms[7468:7470], + forms[7470:7472], + forms[7472:7474], + forms[7474:7479], + forms[7479:7484], + forms[7484:7489], + forms[7489:7494], + forms[7494:7498], + forms[7498:7502], + forms[7502:7506], forms[7506:7508], - forms[7508:7510], - forms[7510:7512], - forms[7512:7539], - forms[7539:7566], - forms[7566:7593], - forms[7593:7620], - forms[7620:7638], - forms[7638:7656], - forms[7656:7660], - forms[7660:7664], - forms[7664:7682], - forms[7682:7709], - forms[7709:7736], - forms[7736:7754], - forms[7754:7772], - forms[7772:7799], - forms[7799:7826], - forms[7826:7844], - forms[7844:7862], - forms[7862:7889], - forms[7889:7916], - forms[7916:7934], - forms[7934:7952], - forms[7952:7979], - forms[7979:8006], - forms[8006:8024], - forms[8024:8027], - forms[8027:8030], - forms[8030:8048], - forms[8048:8066], - forms[8066:8069], - forms[8069:8072], - forms[8072:8075], - forms[8075:8078], - forms[8078:8080], - forms[8080:8083], - forms[8083:8101], - forms[8101:8119], - forms[8119:8137], - forms[8137:8155], - forms[8155:8173], - forms[8173:8191], - forms[8191:8209], - forms[8209:8227], - forms[8227:8245], - forms[8245:8263], - forms[8263:8281], - forms[8281:8299], - forms[8299:8317], - forms[8317:8335], - forms[8335:8353], - forms[8353:8371], - forms[8371:8389], - forms[8389:8407], - forms[8407:8425], - forms[8425:8443], - forms[8443:8461], - forms[8461:8464], - forms[8464:8482], - forms[8482:8500], - forms[8500:8518], - forms[8518:8536], - forms[8536:8554], - forms[8554:8572], - forms[8572:8590], - forms[8590:8617], - forms[8617:8635], - forms[8635:8653], - forms[8653:8671], - forms[8671:8698], - forms[8698:8725], - forms[8725:8743], - forms[8743:8770], - forms[8770:8797], - forms[8797:8806], - forms[8806:8815], - forms[8815:8819], - forms[8819:8846], - forms[8846:8873], - forms[8873:8900], - forms[8900:8927], - forms[8927:8954], - forms[8954:8981], - forms[8981:9008], - forms[9008:9035], - forms[9035:9062], - forms[9062:9089], - forms[9089:9095], - forms[9095:9098], - forms[9098:9101], - forms[9101:9104], - forms[9104:9107], - forms[9107:9125], - forms[9125:9152], - forms[9152:9170], - forms[9170:9188], - forms[9188:9192], - forms[9192:9196], - forms[9196:9200], - forms[9200:9245], - forms[9245:9251], - forms[9251:9296], - forms[9296:9323], - forms[9323:9350], - forms[9350:9368], - forms[9368:9404], - forms[9404:9449], - forms[9449:9494], - forms[9494:9521], - forms[9521:9548], - forms[9548:9566], - forms[9566:9602], - forms[9602:9647], - forms[9647:9653], - forms[9653:9698], - forms[9698:9725], - forms[9725:9752], - forms[9752:9770], - forms[9770:9806], - forms[9806:9824], - forms[9824:9851], - forms[9851:9878], - forms[9878:9896], - forms[9896:9914], - forms[9914:9932], - forms[9932:9950], - forms[9950:9968], - forms[9968:9995], - forms[9995:10022], - forms[10022:10026], - forms[10026:10038], - forms[10038:10056], - forms[10056:10074], - forms[10074:10086], - forms[10086:10098], - forms[10098:10116], - forms[10116:10134], - forms[10134:10146], - forms[10146:10164], - forms[10164:10191], - forms[10191:10218], - forms[10218:10236], - forms[10236:10254], - forms[10254:10281], - forms[10281:10308], - forms[10308:10326], - forms[10326:10330], - forms[10330:10357], - forms[10357:10384], - forms[10384:10414], - forms[10414:10444], - forms[10444:10453], - forms[10453:10462], - forms[10462:10489], - forms[10489:10516], - forms[10516:10522], - forms[10522:10528], - forms[10528:10540], - forms[10540:10552], - forms[10552:10561], - forms[10561:10570], - forms[10570:10574], - forms[10574:10576], - forms[10576:10603], - forms[10603:10630], - forms[10630:10636], - forms[10636:10642], - forms[10642:10672], - forms[10672:10702], - forms[10702:10711], - forms[10711:10720], - forms[10720:10724], - forms[10724:10728], - forms[10728:10730], - forms[10730:10732], - forms[10732:10759], - forms[10759:10786], - forms[10786:10792], - forms[10792:10798], - forms[10798:10810], - forms[10810:10822], - forms[10822:10831], - forms[10831:10840], - forms[10840:10844], - forms[10844:10846], - forms[10846:10876], - forms[10876:10906], - forms[10906:10915], - forms[10915:10924], - forms[10924:10927], - forms[10927:10930], - forms[10930:10933], - forms[10933:10936], - forms[10936:10954], - forms[10954:10972], - forms[10972:10990], - forms[10990:11008], - forms[11008:11035], - forms[11035:11062], - forms[11062:11092], - forms[11092:11122], - forms[11122:11131], - forms[11131:11140], - forms[11140:11141], - forms[11141:11171], - forms[11171:11201], - forms[11201:11210], - forms[11210:11219], - forms[11219:11223], - forms[11223:11227], - forms[11227:11230], - forms[11230:11233], - forms[11233:11260], - forms[11260:11287], - forms[11287:11314], - forms[11314:11341], - forms[11341:11368], - forms[11368:11395], - forms[11395:11396], - forms[11396:11397], - forms[11397:11399], - forms[11399:11401], - forms[11401:11403], - forms[11403:11405], - forms[11405:11408], - forms[11408:11413], - forms[11413:11418], - forms[11418:11423], - forms[11423:11424], - forms[11424:11425], - forms[11425:11431], - forms[11431:11439], - forms[11439:11441], - forms[11441:11443], - forms[11443:11451], - forms[11451:11459], + forms[7508:7512], + forms[7512:7516], + forms[7516:7520], + forms[7520:7522], + forms[7522:7524], + forms[7524:7526], + forms[7526:7528], + forms[7528:7555], + forms[7555:7582], + forms[7582:7609], + forms[7609:7636], + forms[7636:7654], + forms[7654:7672], + forms[7672:7676], + forms[7676:7680], + forms[7680:7698], + forms[7698:7725], + forms[7725:7752], + forms[7752:7770], + forms[7770:7788], + forms[7788:7815], + forms[7815:7842], + forms[7842:7860], + forms[7860:7878], + forms[7878:7905], + forms[7905:7932], + forms[7932:7950], + forms[7950:7968], + forms[7968:7995], + forms[7995:8022], + forms[8022:8040], + forms[8040:8043], + forms[8043:8046], + forms[8046:8064], + forms[8064:8082], + forms[8082:8085], + forms[8085:8088], + forms[8088:8091], + forms[8091:8094], + forms[8094:8096], + forms[8096:8099], + forms[8099:8117], + forms[8117:8135], + forms[8135:8153], + forms[8153:8171], + forms[8171:8189], + forms[8189:8207], + forms[8207:8225], + forms[8225:8243], + forms[8243:8261], + forms[8261:8279], + forms[8279:8297], + forms[8297:8315], + forms[8315:8333], + forms[8333:8351], + forms[8351:8369], + forms[8369:8387], + forms[8387:8405], + forms[8405:8423], + forms[8423:8441], + forms[8441:8459], + forms[8459:8477], + forms[8477:8480], + forms[8480:8498], + forms[8498:8516], + forms[8516:8534], + forms[8534:8552], + forms[8552:8570], + forms[8570:8588], + forms[8588:8606], + forms[8606:8633], + forms[8633:8651], + forms[8651:8669], + forms[8669:8687], + forms[8687:8714], + forms[8714:8741], + forms[8741:8759], + forms[8759:8786], + forms[8786:8813], + forms[8813:8822], + forms[8822:8831], + forms[8831:8835], + forms[8835:8862], + forms[8862:8889], + forms[8889:8916], + forms[8916:8943], + forms[8943:8970], + forms[8970:8997], + forms[8997:9024], + forms[9024:9051], + forms[9051:9078], + forms[9078:9105], + forms[9105:9111], + forms[9111:9114], + forms[9114:9117], + forms[9117:9120], + forms[9120:9123], + forms[9123:9141], + forms[9141:9168], + forms[9168:9186], + forms[9186:9204], + forms[9204:9208], + forms[9208:9212], + forms[9212:9216], + forms[9216:9261], + forms[9261:9267], + forms[9267:9312], + forms[9312:9339], + forms[9339:9366], + forms[9366:9384], + forms[9384:9420], + forms[9420:9465], + forms[9465:9510], + forms[9510:9537], + forms[9537:9564], + forms[9564:9582], + forms[9582:9618], + forms[9618:9663], + forms[9663:9669], + forms[9669:9714], + forms[9714:9741], + forms[9741:9768], + forms[9768:9786], + forms[9786:9822], + forms[9822:9840], + forms[9840:9867], + forms[9867:9894], + forms[9894:9912], + forms[9912:9930], + forms[9930:9948], + forms[9948:9966], + forms[9966:9984], + forms[9984:10011], + forms[10011:10038], + forms[10038:10042], + forms[10042:10054], + forms[10054:10072], + forms[10072:10090], + forms[10090:10102], + forms[10102:10114], + forms[10114:10132], + forms[10132:10150], + forms[10150:10162], + forms[10162:10180], + forms[10180:10207], + forms[10207:10234], + forms[10234:10252], + forms[10252:10270], + forms[10270:10297], + forms[10297:10324], + forms[10324:10342], + forms[10342:10346], + forms[10346:10373], + forms[10373:10400], + forms[10400:10430], + forms[10430:10460], + forms[10460:10469], + forms[10469:10478], + forms[10478:10505], + forms[10505:10532], + forms[10532:10538], + forms[10538:10544], + forms[10544:10556], + forms[10556:10568], + forms[10568:10577], + forms[10577:10586], + forms[10586:10590], + forms[10590:10592], + forms[10592:10619], + forms[10619:10646], + forms[10646:10652], + forms[10652:10658], + forms[10658:10688], + forms[10688:10718], + forms[10718:10727], + forms[10727:10736], + forms[10736:10740], + forms[10740:10744], + forms[10744:10746], + forms[10746:10748], + forms[10748:10775], + forms[10775:10802], + forms[10802:10808], + forms[10808:10814], + forms[10814:10826], + forms[10826:10838], + forms[10838:10847], + forms[10847:10856], + forms[10856:10860], + forms[10860:10862], + forms[10862:10892], + forms[10892:10922], + forms[10922:10931], + forms[10931:10940], + forms[10940:10943], + forms[10943:10946], + forms[10946:10949], + forms[10949:10952], + forms[10952:10970], + forms[10970:10988], + forms[10988:11006], + forms[11006:11024], + forms[11024:11051], + forms[11051:11078], + forms[11078:11108], + forms[11108:11138], + forms[11138:11147], + forms[11147:11156], + forms[11156:11157], + forms[11157:11187], + forms[11187:11217], + forms[11217:11226], + forms[11226:11235], + forms[11235:11239], + forms[11239:11243], + forms[11243:11246], + forms[11246:11249], + forms[11249:11276], + forms[11276:11303], + forms[11303:11330], + forms[11330:11357], + forms[11357:11384], + forms[11384:11411], + forms[11411:11412], + forms[11412:11413], + forms[11413:11415], + forms[11415:11417], + forms[11417:11419], + forms[11419:11421], + forms[11421:11424], + forms[11424:11429], + forms[11429:11434], + forms[11434:11439], + forms[11439:11440], + forms[11440:11441], + forms[11441:11447], + forms[11447:11455], + forms[11455:11457], + forms[11457:11459], + forms[11459:11467], + forms[11467:11475], }