all: VBMI2 instructions (#363)

Adds the "Vector Bit Manipulation Instructions 2" instruction set.

These new instructions are added via the `opcodesextra` mechanism #345, since
they're missing from the opcodes database.

Contributed by @vsivsi. Extracted from #349 with simplifications.
Specifically, as prompted by the `dupl` linter we extract some common forms
lists into a helper `forms.go` file.

Co-authored-by: Vaughn Iverson <vsivsi@yahoo.com>
This commit is contained in:
Michael McLoughlin
2023-01-14 13:25:44 -08:00
committed by GitHub
parent 05ed388d0f
commit e2c0a40f50
11 changed files with 8609 additions and 400 deletions

View File

@@ -133,56 +133,4 @@ var vpshufbitqmb = inst.Forms{
// {zcase: Zevex_rm_v_r, zoffset: 0, args: argList{Yzm, Yzr}},
// {zcase: Zevex_rm_k_r, zoffset: 3, args: argList{Yzm, Yknot0, Yzr}},
// }
var vpopcntb = inst.Forms{
// EVEX.128.66.0F38.W0 54 /r VPOPCNTB xmm1{k1}{z}, xmm2/m128
{
ISA: []string{"AVX512BITALG", "AVX512VL"},
Operands: []inst.Operand{
{Type: "m128", Action: inst.R},
{Type: "xmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
{
ISA: []string{"AVX512BITALG", "AVX512VL"},
Operands: []inst.Operand{
{Type: "xmm", Action: inst.R},
{Type: "xmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
// EVEX.256.66.0F38.W0 54 /r VPOPCNTB ymm1{k1}{z}, ymm2/m256
{
ISA: []string{"AVX512BITALG", "AVX512VL"},
Operands: []inst.Operand{
{Type: "m256", Action: inst.R},
{Type: "ymm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
{
ISA: []string{"AVX512BITALG", "AVX512VL"},
Operands: []inst.Operand{
{Type: "ymm", Action: inst.R},
{Type: "ymm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
// EVEX.512.66.0F38.W0 54 /r VPOPCNTB zmm1{k1}{z}, zmm2/m512
{
ISA: []string{"AVX512BITALG"},
Operands: []inst.Operand{
{Type: "m512", Action: inst.R},
{Type: "zmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
{
ISA: []string{"AVX512BITALG"},
Operands: []inst.Operand{
{Type: "zmm", Action: inst.R},
{Type: "zmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
}
var vpopcntb = _yvexpandpd("AVX512BITALG", "")

View File

@@ -0,0 +1,72 @@
package opcodesextra
import "github.com/mmcloughlin/avo/internal/inst"
// Reference: https://github.com/golang/go/blob/go1.19.3/src/cmd/internal/obj/x86/avx_optabs.go#L376-L383
//
// var _yvexpandpd = []ytab{
// {zcase: Zevex_rm_v_r, zoffset: 0, args: argList{YxmEvex, YxrEvex}},
// {zcase: Zevex_rm_k_r, zoffset: 3, args: argList{YxmEvex, Yknot0, YxrEvex}},
// {zcase: Zevex_rm_v_r, zoffset: 0, args: argList{YymEvex, YyrEvex}},
// {zcase: Zevex_rm_k_r, zoffset: 3, args: argList{YymEvex, Yknot0, YyrEvex}},
// {zcase: Zevex_rm_v_r, zoffset: 0, args: argList{Yzm, Yzr}},
// {zcase: Zevex_rm_k_r, zoffset: 3, args: argList{Yzm, Yknot0, Yzr}},
// }
func _yvexpandpd(isa, bcst string) inst.Forms {
return inst.Forms{
// EVEX.128.66.0F38.W0 62 /r VPEXPANDB xmm1{k1}{z}, m128 A V/V AVX512_VBMI2 AVX512VL
{
ISA: []string{isa, "AVX512VL"},
Operands: []inst.Operand{
{Type: "m128" + bcst, Action: inst.R},
{Type: "xmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
// EVEX.128.66.0F38.W0 62 /r VPEXPANDB xmm1{k1}{z}, xmm2 B V/V AVX512_VBMI2 AVX512VL
{
ISA: []string{isa, "AVX512VL"},
Operands: []inst.Operand{
{Type: "xmm", Action: inst.R},
{Type: "xmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
// EVEX.256.66.0F38.W0 62 /r VPEXPANDB ymm1{k1}{z}, m256 A V/V AVX512_VBMI2 AVX512VL
{
ISA: []string{isa, "AVX512VL"},
Operands: []inst.Operand{
{Type: "m256" + bcst, Action: inst.R},
{Type: "ymm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
// EVEX.256.66.0F38.W0 62 /r VPEXPANDB ymm1{k1}{z}, ymm2 B V/V AVX512_VBMI2 AVX512VL
{
ISA: []string{isa, "AVX512VL"},
Operands: []inst.Operand{
{Type: "ymm", Action: inst.R},
{Type: "ymm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
// EVEX.512.66.0F38.W0 62 /r VPEXPANDB zmm1{k1}{z}, m512 A V/V AVX512_VBMI2
{
ISA: []string{isa},
Operands: []inst.Operand{
{Type: "m512" + bcst, Action: inst.R},
{Type: "zmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
// EVEX.512.66.0F38.W0 62 /r VPEXPANDB zmm1{k1}{z}, zmm2 B V/V AVX512_VBMI2
{
ISA: []string{isa},
Operands: []inst.Operand{
{Type: "zmm", Action: inst.R},
{Type: "zmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
}
}

View File

@@ -1,7 +1,11 @@
// Package opcodesextra provides curated extensions to the instruction database.
package opcodesextra
import "github.com/mmcloughlin/avo/internal/inst"
import (
"sort"
"github.com/mmcloughlin/avo/internal/inst"
)
// sets of extra instructions.
var sets = [][]*inst.Instruction{
@@ -12,6 +16,7 @@ var sets = [][]*inst.Instruction{
vpclmulqdq,
vpopcntdq,
bitalg,
vbmi2,
}
// Instructions returns a list of extras to add to the instructions database.
@@ -34,5 +39,15 @@ func Instructions() []*inst.Instruction {
is = append(is, &c)
}
}
// Sort ISA lists. Similarly, this facilitates sharing helper functions for
// building forms lists without worrying about whether the ISA list is in
// the right order.
for _, i := range is {
for idx := range i.Forms {
sort.Strings(i.Forms[idx].ISA)
}
}
return is
}

View File

@@ -0,0 +1,433 @@
package opcodesextra
import (
"github.com/mmcloughlin/avo/internal/inst"
)
// vbmi2 is the "Vector Bit Manipulation Instructions 2" instruction set.
var vbmi2 = []*inst.Instruction{
// Reference: https://github.com/golang/go/blob/go1.19.3/src/cmd/internal/obj/x86/avx_optabs.go#L3026-L3030
//
// {as: AVPCOMPRESSB, ytab: _yvcompresspd, prefix: Pavx, op: opBytes{
// avxEscape | evex128 | evex66 | evex0F38 | evexW0, evexN1 | evexZeroingEnabled, 0x63,
// avxEscape | evex256 | evex66 | evex0F38 | evexW0, evexN1 | evexZeroingEnabled, 0x63,
// avxEscape | evex512 | evex66 | evex0F38 | evexW0, evexN1 | evexZeroingEnabled, 0x63,
// }},
//
// Reference: https://github.com/golang/go/blob/go1.19.3/src/cmd/internal/obj/x86/avx_optabs.go#L3041-L3045
//
// {as: AVPCOMPRESSW, ytab: _yvcompresspd, prefix: Pavx, op: opBytes{
// avxEscape | evex128 | evex66 | evex0F38 | evexW1, evexN2 | evexZeroingEnabled, 0x63,
// avxEscape | evex256 | evex66 | evex0F38 | evexW1, evexN2 | evexZeroingEnabled, 0x63,
// avxEscape | evex512 | evex66 | evex0F38 | evexW1, evexN2 | evexZeroingEnabled, 0x63,
// }},
//
{
Opcode: "VPCOMPRESSB",
Summary: "Store Sparse Packed Byte Integer Values into Dense Memory/Register",
Forms: vpcompressb,
},
{
Opcode: "VPCOMPRESSW",
Summary: "Store Sparse Packed Word Integer Values into Dense Memory/Register",
Forms: vpcompressb,
},
// Reference: https://github.com/golang/go/blob/go1.19.3/src/cmd/internal/obj/x86/avx_optabs.go#L3200-L3204
//
// {as: AVPEXPANDB, ytab: _yvexpandpd, prefix: Pavx, op: opBytes{
// avxEscape | evex128 | evex66 | evex0F38 | evexW0, evexN1 | evexZeroingEnabled, 0x62,
// avxEscape | evex256 | evex66 | evex0F38 | evexW0, evexN1 | evexZeroingEnabled, 0x62,
// avxEscape | evex512 | evex66 | evex0F38 | evexW0, evexN1 | evexZeroingEnabled, 0x62,
// }},
//
// Reference: https://github.com/golang/go/blob/go1.19.3/src/cmd/internal/obj/x86/avx_optabs.go#L3215-L3219
//
// {as: AVPEXPANDW, ytab: _yvexpandpd, prefix: Pavx, op: opBytes{
// avxEscape | evex128 | evex66 | evex0F38 | evexW1, evexN2 | evexZeroingEnabled, 0x62,
// avxEscape | evex256 | evex66 | evex0F38 | evexW1, evexN2 | evexZeroingEnabled, 0x62,
// avxEscape | evex512 | evex66 | evex0F38 | evexW1, evexN2 | evexZeroingEnabled, 0x62,
// }},
//
{
Opcode: "VPEXPANDB",
Summary: "Load Sparse Packed Byte Integer Values from Dense Memory/Register",
Forms: vpexpandb,
},
{
Opcode: "VPEXPANDW",
Summary: "Load Sparse Packed Word Integer Values from Dense Memory/Register",
Forms: vpexpandb,
},
// Reference: https://github.com/golang/go/blob/go1.19.3/src/cmd/internal/obj/x86/avx_optabs.go#L3837-L3896
//
// {as: AVPSHLDD, ytab: _yvalignd, prefix: Pavx, op: opBytes{
// avxEscape | evex128 | evex66 | evex0F3A | evexW0, evexN16 | evexBcstN4 | evexZeroingEnabled, 0x71,
// avxEscape | evex256 | evex66 | evex0F3A | evexW0, evexN32 | evexBcstN4 | evexZeroingEnabled, 0x71,
// avxEscape | evex512 | evex66 | evex0F3A | evexW0, evexN64 | evexBcstN4 | evexZeroingEnabled, 0x71,
// }},
// {as: AVPSHLDQ, ytab: _yvalignd, prefix: Pavx, op: opBytes{
// avxEscape | evex128 | evex66 | evex0F3A | evexW1, evexN16 | evexBcstN8 | evexZeroingEnabled, 0x71,
// avxEscape | evex256 | evex66 | evex0F3A | evexW1, evexN32 | evexBcstN8 | evexZeroingEnabled, 0x71,
// avxEscape | evex512 | evex66 | evex0F3A | evexW1, evexN64 | evexBcstN8 | evexZeroingEnabled, 0x71,
// }},
// {as: AVPSHLDVD, ytab: _yvblendmpd, prefix: Pavx, op: opBytes{
// avxEscape | evex128 | evex66 | evex0F38 | evexW0, evexN16 | evexBcstN4 | evexZeroingEnabled, 0x71,
// avxEscape | evex256 | evex66 | evex0F38 | evexW0, evexN32 | evexBcstN4 | evexZeroingEnabled, 0x71,
// avxEscape | evex512 | evex66 | evex0F38 | evexW0, evexN64 | evexBcstN4 | evexZeroingEnabled, 0x71,
// }},
// {as: AVPSHLDVQ, ytab: _yvblendmpd, prefix: Pavx, op: opBytes{
// avxEscape | evex128 | evex66 | evex0F38 | evexW1, evexN16 | evexBcstN8 | evexZeroingEnabled, 0x71,
// avxEscape | evex256 | evex66 | evex0F38 | evexW1, evexN32 | evexBcstN8 | evexZeroingEnabled, 0x71,
// avxEscape | evex512 | evex66 | evex0F38 | evexW1, evexN64 | evexBcstN8 | evexZeroingEnabled, 0x71,
// }},
// {as: AVPSHLDVW, ytab: _yvblendmpd, prefix: Pavx, op: opBytes{
// avxEscape | evex128 | evex66 | evex0F38 | evexW1, evexN16 | evexZeroingEnabled, 0x70,
// avxEscape | evex256 | evex66 | evex0F38 | evexW1, evexN32 | evexZeroingEnabled, 0x70,
// avxEscape | evex512 | evex66 | evex0F38 | evexW1, evexN64 | evexZeroingEnabled, 0x70,
// }},
// {as: AVPSHLDW, ytab: _yvalignd, prefix: Pavx, op: opBytes{
// avxEscape | evex128 | evex66 | evex0F3A | evexW1, evexN16 | evexZeroingEnabled, 0x70,
// avxEscape | evex256 | evex66 | evex0F3A | evexW1, evexN32 | evexZeroingEnabled, 0x70,
// avxEscape | evex512 | evex66 | evex0F3A | evexW1, evexN64 | evexZeroingEnabled, 0x70,
// }},
// {as: AVPSHRDD, ytab: _yvalignd, prefix: Pavx, op: opBytes{
// avxEscape | evex128 | evex66 | evex0F3A | evexW0, evexN16 | evexBcstN4 | evexZeroingEnabled, 0x73,
// avxEscape | evex256 | evex66 | evex0F3A | evexW0, evexN32 | evexBcstN4 | evexZeroingEnabled, 0x73,
// avxEscape | evex512 | evex66 | evex0F3A | evexW0, evexN64 | evexBcstN4 | evexZeroingEnabled, 0x73,
// }},
// {as: AVPSHRDQ, ytab: _yvalignd, prefix: Pavx, op: opBytes{
// avxEscape | evex128 | evex66 | evex0F3A | evexW1, evexN16 | evexBcstN8 | evexZeroingEnabled, 0x73,
// avxEscape | evex256 | evex66 | evex0F3A | evexW1, evexN32 | evexBcstN8 | evexZeroingEnabled, 0x73,
// avxEscape | evex512 | evex66 | evex0F3A | evexW1, evexN64 | evexBcstN8 | evexZeroingEnabled, 0x73,
// }},
// {as: AVPSHRDVD, ytab: _yvblendmpd, prefix: Pavx, op: opBytes{
// avxEscape | evex128 | evex66 | evex0F38 | evexW0, evexN16 | evexBcstN4 | evexZeroingEnabled, 0x73,
// avxEscape | evex256 | evex66 | evex0F38 | evexW0, evexN32 | evexBcstN4 | evexZeroingEnabled, 0x73,
// avxEscape | evex512 | evex66 | evex0F38 | evexW0, evexN64 | evexBcstN4 | evexZeroingEnabled, 0x73,
// }},
// {as: AVPSHRDVQ, ytab: _yvblendmpd, prefix: Pavx, op: opBytes{
// avxEscape | evex128 | evex66 | evex0F38 | evexW1, evexN16 | evexBcstN8 | evexZeroingEnabled, 0x73,
// avxEscape | evex256 | evex66 | evex0F38 | evexW1, evexN32 | evexBcstN8 | evexZeroingEnabled, 0x73,
// avxEscape | evex512 | evex66 | evex0F38 | evexW1, evexN64 | evexBcstN8 | evexZeroingEnabled, 0x73,
// }},
// {as: AVPSHRDVW, ytab: _yvblendmpd, prefix: Pavx, op: opBytes{
// avxEscape | evex128 | evex66 | evex0F38 | evexW1, evexN16 | evexZeroingEnabled, 0x72,
// avxEscape | evex256 | evex66 | evex0F38 | evexW1, evexN32 | evexZeroingEnabled, 0x72,
// avxEscape | evex512 | evex66 | evex0F38 | evexW1, evexN64 | evexZeroingEnabled, 0x72,
// }},
// {as: AVPSHRDW, ytab: _yvalignd, prefix: Pavx, op: opBytes{
// avxEscape | evex128 | evex66 | evex0F3A | evexW1, evexN16 | evexZeroingEnabled, 0x72,
// avxEscape | evex256 | evex66 | evex0F3A | evexW1, evexN32 | evexZeroingEnabled, 0x72,
// avxEscape | evex512 | evex66 | evex0F3A | evexW1, evexN64 | evexZeroingEnabled, 0x72,
// }},
//
{
Opcode: "VPSHLDW",
Summary: "Concatenate Words and Shift Packed Data Left Logical",
Forms: vpshld(""),
},
{
Opcode: "VPSHLDD",
Summary: "Concatenate Dwords and Shift Packed Data Left Logical",
Forms: vpshld("/m32bcst"),
},
{
Opcode: "VPSHLDQ",
Summary: "Concatenate Quadwords and Shift Packed Data Left Logical",
Forms: vpshld("/m64bcst"),
},
{
Opcode: "VPSHRDW",
Summary: "Concatenate Words and Shift Packed Data Right Logical",
Forms: vpshld(""),
},
{
Opcode: "VPSHRDD",
Summary: "Concatenate Dwords and Shift Packed Data Right Logical",
Forms: vpshld("/m32bcst"),
},
{
Opcode: "VPSHRDQ",
Summary: "Concatenate Quadwords and Shift Packed Data Right Logical",
Forms: vpshld("/m64bcst"),
},
{
Opcode: "VPSHLDVW",
Summary: "Concatenate Words and Variable Shift Packed Data Left Logical",
Forms: vpshldv(""),
},
{
Opcode: "VPSHLDVD",
Summary: "Concatenate Dwords and Variable Shift Packed Data Left Logical",
Forms: vpshldv("/m32bcst"),
},
{
Opcode: "VPSHLDVQ",
Summary: "Concatenate Quadwords and Variable Shift Packed Data Left Logical",
Forms: vpshldv("/m64bcst"),
},
{
Opcode: "VPSHRDVW",
Summary: "Concatenate Words and Variable Shift Packed Data Right Logical",
Forms: vpshldv(""),
},
{
Opcode: "VPSHRDVD",
Summary: "Concatenate Dwords and Variable Shift Packed Data Right Logical",
Forms: vpshldv("/m32bcst"),
},
{
Opcode: "VPSHRDVQ",
Summary: "Concatenate Quadwords and Variable Shift Packed Data Right Logical",
Forms: vpshldv("/m64bcst"),
},
}
// VPCOMPRESSB and VPCOMPRESSW forms.
//
// Reference: https://github.com/golang/go/blob/go1.19.3/src/cmd/internal/obj/x86/avx_optabs.go#L240-L247
//
// var _yvcompresspd = []ytab{
// {zcase: Zevex_r_v_rm, zoffset: 0, args: argList{YxrEvex, YxmEvex}},
// {zcase: Zevex_r_k_rm, zoffset: 3, args: argList{YxrEvex, Yknot0, YxmEvex}},
// {zcase: Zevex_r_v_rm, zoffset: 0, args: argList{YyrEvex, YymEvex}},
// {zcase: Zevex_r_k_rm, zoffset: 3, args: argList{YyrEvex, Yknot0, YymEvex}},
// {zcase: Zevex_r_v_rm, zoffset: 0, args: argList{Yzr, Yzm}},
// {zcase: Zevex_r_k_rm, zoffset: 3, args: argList{Yzr, Yknot0, Yzm}},
// }
var vpcompressb = inst.Forms{
// EVEX.128.66.0F38.W0 63 /r VPCOMPRESSB m128{k1}, xmm1 A V/V AVX512_VBMI2 AVX512VL
{
ISA: []string{"AVX512VBMI2", "AVX512VL"},
Operands: []inst.Operand{
{Type: "xmm", Action: inst.R},
{Type: "m128{k}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
// EVEX.128.66.0F38.W0 63 /r VPCOMPRESSB xmm1{k1}{z}, xmm2 B V/V AVX512_VBMI2 AVX512VL
{
ISA: []string{"AVX512VBMI2", "AVX512VL"},
Operands: []inst.Operand{
{Type: "xmm", Action: inst.R},
{Type: "xmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
// EVEX.256.66.0F38.W0 63 /r VPCOMPRESSB m256{k1}, ymm1 A V/V AVX512_VBMI2 AVX512VL
{
ISA: []string{"AVX512VBMI2", "AVX512VL"},
Operands: []inst.Operand{
{Type: "ymm", Action: inst.R},
{Type: "m256{k}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
// EVEX.256.66.0F38.W0 63 /r VPCOMPRESSB ymm1{k1}{z}, ymm2 B V/V AVX512_VBMI2 AVX512VL
{
ISA: []string{"AVX512VBMI2", "AVX512VL"},
Operands: []inst.Operand{
{Type: "ymm", Action: inst.R},
{Type: "ymm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
// EVEX.512.66.0F38.W0 63 /r VPCOMPRESSB m512{k1}, zmm1 A V/V AVX512_VBMI2
{
ISA: []string{"AVX512VBMI2"},
Operands: []inst.Operand{
{Type: "zmm", Action: inst.R},
{Type: "m512{k}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
// EVEX.512.66.0F38.W0 63 /r VPCOMPRESSB zmm1{k1}{z}, zmm2 B V/V AVX512_VBMI2
{
ISA: []string{"AVX512VBMI2"},
Operands: []inst.Operand{
{Type: "zmm", Action: inst.R},
{Type: "zmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
}
// VPEXPANDB and VPEXPANDW forms.
//
// Reference: https://github.com/golang/go/blob/go1.19.3/src/cmd/internal/obj/x86/avx_optabs.go#L376-L383
//
// var _yvexpandpd = []ytab{
// {zcase: Zevex_rm_v_r, zoffset: 0, args: argList{YxmEvex, YxrEvex}},
// {zcase: Zevex_rm_k_r, zoffset: 3, args: argList{YxmEvex, Yknot0, YxrEvex}},
// {zcase: Zevex_rm_v_r, zoffset: 0, args: argList{YymEvex, YyrEvex}},
// {zcase: Zevex_rm_k_r, zoffset: 3, args: argList{YymEvex, Yknot0, YyrEvex}},
// {zcase: Zevex_rm_v_r, zoffset: 0, args: argList{Yzm, Yzr}},
// {zcase: Zevex_rm_k_r, zoffset: 3, args: argList{Yzm, Yknot0, Yzr}},
// }
var vpexpandb = _yvexpandpd("AVX512VBMI2", "")
// VPSH{L,R}D{W,D,Q} forms.
//
// Reference: https://github.com/golang/go/blob/go1.19.3/src/cmd/internal/obj/x86/avx_optabs.go#L128-L135
//
// var _yvalignd = []ytab{
// {zcase: Zevex_i_rm_v_r, zoffset: 0, args: argList{Yu8, YxmEvex, YxrEvex, YxrEvex}},
// {zcase: Zevex_i_rm_v_k_r, zoffset: 3, args: argList{Yu8, YxmEvex, YxrEvex, Yknot0, YxrEvex}},
// {zcase: Zevex_i_rm_v_r, zoffset: 0, args: argList{Yu8, YymEvex, YyrEvex, YyrEvex}},
// {zcase: Zevex_i_rm_v_k_r, zoffset: 3, args: argList{Yu8, YymEvex, YyrEvex, Yknot0, YyrEvex}},
// {zcase: Zevex_i_rm_v_r, zoffset: 0, args: argList{Yu8, Yzm, Yzr, Yzr}},
// {zcase: Zevex_i_rm_v_k_r, zoffset: 3, args: argList{Yu8, Yzm, Yzr, Yknot0, Yzr}},
// }
func vpshld(bcst string) inst.Forms {
return inst.Forms{
// EVEX.128.66.0F3A.W1 70 /r /ib VPSHLDW xmm1{k1}{z}, xmm2, xmm3/m128, imm8 A V/V AVX512_VBMI2 AVX512VL
// EVEX.128.66.0F3A.W0 71 /r /ib VPSHLDD xmm1{k1}{z}, xmm2, xmm3/m128/m32bcst, imm8 B V/V AVX512_VBMI2 AVX512VL
// EVEX.128.66.0F3A.W1 71 /r /ib VPSHLDQ xmm1{k1}{z}, xmm2, xmm3/m128/m64bcst, imm8 B V/V AVX512_VBMI2 AVX512VL
{
ISA: []string{"AVX512VBMI2", "AVX512VL"},
Operands: []inst.Operand{
{Type: "imm8"},
{Type: "xmm", Action: inst.R},
{Type: "xmm", Action: inst.R},
{Type: "xmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
{
ISA: []string{"AVX512VBMI2", "AVX512VL"},
Operands: []inst.Operand{
{Type: "imm8"},
{Type: "m128" + bcst, Action: inst.R},
{Type: "xmm", Action: inst.R},
{Type: "xmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
// EVEX.256.66.0F3A.W1 70 /r /ib VPSHLDW ymm1{k1}{z}, ymm2, ymm3/m256, imm8 A V/V AVX512_VBMI2 AVX512VL
// EVEX.256.66.0F3A.W0 71 /r /ib VPSHLDD ymm1{k1}{z}, ymm2, ymm3/m256/m32bcst, imm8 B V/V AVX512_VBMI2 AVX512VL
// EVEX.256.66.0F3A.W1 71 /r /ib VPSHLDQ ymm1{k1}{z}, ymm2, ymm3/m256/m64bcst, imm8 B V/V AVX512_VBMI2 AVX512VL
{
ISA: []string{"AVX512VBMI2", "AVX512VL"},
Operands: []inst.Operand{
{Type: "imm8"},
{Type: "ymm", Action: inst.R},
{Type: "ymm", Action: inst.R},
{Type: "ymm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
{
ISA: []string{"AVX512VBMI2", "AVX512VL"},
Operands: []inst.Operand{
{Type: "imm8"},
{Type: "m256" + bcst, Action: inst.R},
{Type: "ymm", Action: inst.R},
{Type: "ymm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
// EVEX.512.66.0F3A.W1 70 /r /ib VPSHLDW zmm1{k1}{z}, zmm2, zmm3/m512, imm8 A V/V AVX512_VBMI2
// EVEX.512.66.0F3A.W0 71 /r /ib VPSHLDD zmm1{k1}{z}, zmm2, zmm3/m512/m32bcst, imm8 B V/V AVX512_VBMI2
// EVEX.512.66.0F3A.W1 71 /r /ib VPSHLDQ zmm1{k1}{z}, zmm2, zmm3/m512/m64bcst, imm8 B V/V AVX512_VBMI2
{
ISA: []string{"AVX512VBMI2"},
Operands: []inst.Operand{
{Type: "imm8"},
{Type: "zmm", Action: inst.R},
{Type: "zmm", Action: inst.R},
{Type: "zmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
{
ISA: []string{"AVX512VBMI2"},
Operands: []inst.Operand{
{Type: "imm8"},
{Type: "m512" + bcst, Action: inst.R},
{Type: "zmm", Action: inst.R},
{Type: "zmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
}
}
// VPSH{L,R}DV{W,D,Q} forms.
//
// Reference: https://github.com/golang/go/blob/go1.19.3/src/cmd/internal/obj/x86/avx_optabs.go#L148-L155
//
// var _yvblendmpd = []ytab{
// {zcase: Zevex_rm_v_r, zoffset: 0, args: argList{YxmEvex, YxrEvex, YxrEvex}},
// {zcase: Zevex_rm_v_k_r, zoffset: 3, args: argList{YxmEvex, YxrEvex, Yknot0, YxrEvex}},
// {zcase: Zevex_rm_v_r, zoffset: 0, args: argList{YymEvex, YyrEvex, YyrEvex}},
// {zcase: Zevex_rm_v_k_r, zoffset: 3, args: argList{YymEvex, YyrEvex, Yknot0, YyrEvex}},
// {zcase: Zevex_rm_v_r, zoffset: 0, args: argList{Yzm, Yzr, Yzr}},
// {zcase: Zevex_rm_v_k_r, zoffset: 3, args: argList{Yzm, Yzr, Yknot0, Yzr}},
// }
func vpshldv(bcst string) inst.Forms {
return inst.Forms{
// EVEX.128.66.0F38.W1 70 /r VPSHLDVW xmm1{k1}{z}, xmm2, xmm3/m128 A V/V AVX512_VBMI2 AVX512VL
// EVEX.128.66.0F38.W0 71 /r VPSHLDVD xmm1{k1}{z}, xmm2, xmm3/m128/m32bcst B V/V AVX512_VBMI2 AVX512VL
// EVEX.128.66.0F38.W1 71 /r VPSHLDVQ xmm1{k1}{z}, xmm2, xmm3/m128/m64bcst B V/V AVX512_VBMI2 AVX512VL
{
ISA: []string{"AVX512VBMI2", "AVX512VL"},
Operands: []inst.Operand{
{Type: "xmm", Action: inst.R},
{Type: "xmm", Action: inst.R},
{Type: "xmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
{
ISA: []string{"AVX512VBMI2", "AVX512VL"},
Operands: []inst.Operand{
{Type: "m128" + bcst, Action: inst.R},
{Type: "xmm", Action: inst.R},
{Type: "xmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
// EVEX.256.66.0F38.W1 70 /r VPSHLDVW ymm1{k1}{z}, ymm2, ymm3/m256 A V/V AVX512_VBMI2 AVX512VL
// EVEX.256.66.0F38.W0 71 /r VPSHLDVD ymm1{k1}{z}, ymm2, ymm3/m256/m32bcst B V/V AVX512_VBMI2 AVX512VL
// EVEX.256.66.0F38.W1 71 /r VPSHLDVQ ymm1{k1}{z}, ymm2, ymm3/m256/m64bcst B V/V AVX512_VBMI2 AVX512VL
{
ISA: []string{"AVX512VBMI2", "AVX512VL"},
Operands: []inst.Operand{
{Type: "ymm", Action: inst.R},
{Type: "ymm", Action: inst.R},
{Type: "ymm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
{
ISA: []string{"AVX512VBMI2", "AVX512VL"},
Operands: []inst.Operand{
{Type: "m256" + bcst, Action: inst.R},
{Type: "ymm", Action: inst.R},
{Type: "ymm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
// EVEX.512.66.0F38.W1 70 /r VPSHLDVW zmm1{k1}{z}, zmm2, zmm3/m512 A V/V AVX512_VBMI2
// EVEX.512.66.0F38.W0 71 /r VPSHLDVD zmm1{k1}{z}, zmm2, zmm3/m512/m32bcst B V/V AVX512_VBMI2
// EVEX.512.66.0F38.W1 71 /r VPSHLDVQ zmm1{k1}{z}, zmm2, zmm3/m512/m64bcst B V/V AVX512_VBMI2
{
ISA: []string{"AVX512VBMI2"},
Operands: []inst.Operand{
{Type: "zmm", Action: inst.R},
{Type: "zmm", Action: inst.R},
{Type: "zmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
{
ISA: []string{"AVX512VBMI2"},
Operands: []inst.Operand{
{Type: "m512" + bcst, Action: inst.R},
{Type: "zmm", Action: inst.R},
{Type: "zmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
}
}

View File

@@ -23,12 +23,12 @@ var vpopcntdq = []*inst.Instruction{
{
Opcode: "VPOPCNTD",
Summary: "Packed Population Count for Doubleword Integers",
Forms: vpopcntdqforms("m32bcst"),
Forms: vpopcntdqforms("/m32bcst"),
},
{
Opcode: "VPOPCNTQ",
Summary: "Packed Population Count for Quadword Integers",
Forms: vpopcntdqforms("m64bcst"),
Forms: vpopcntdqforms("/m64bcst"),
},
}
@@ -46,61 +46,4 @@ var vpopcntdq = []*inst.Instruction{
// {zcase: Zevex_rm_v_r, zoffset: 0, args: argList{Yzm, Yzr}},
// {zcase: Zevex_rm_k_r, zoffset: 3, args: argList{Yzm, Yknot0, Yzr}},
// }
func vpopcntdqforms(mbcst string) inst.Forms {
return inst.Forms{
// EVEX.128.66.0F38.W0 55 /r VPOPCNTD xmm1{k1}{z}, xmm2/m128/m32bcst
// EVEX.128.66.0F38.W1 55 /r VPOPCNTQ xmm1{k1}{z}, xmm2/m128/m64bcst
{
ISA: []string{"AVX512VL", "AVX512VPOPCNTDQ"},
Operands: []inst.Operand{
{Type: "m128/" + mbcst, Action: inst.R},
{Type: "xmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
{
ISA: []string{"AVX512VL", "AVX512VPOPCNTDQ"},
Operands: []inst.Operand{
{Type: "xmm", Action: inst.R},
{Type: "xmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
// EVEX.256.66.0F38.W0 55 /r VPOPCNTD ymm1{k1}{z}, ymm2/m256/m32bcst
// EVEX.256.66.0F38.W1 55 /r VPOPCNTQ ymm1{k1}{z}, ymm2/m256/m64bcst
{
ISA: []string{"AVX512VL", "AVX512VPOPCNTDQ"},
Operands: []inst.Operand{
{Type: "m256/" + mbcst, Action: inst.R},
{Type: "ymm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
{
ISA: []string{"AVX512VL", "AVX512VPOPCNTDQ"},
Operands: []inst.Operand{
{Type: "ymm", Action: inst.R},
{Type: "ymm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
// EVEX.512.66.0F38.W0 55 /r VPOPCNTD zmm1{k1}{z}, zmm2/m512/m32bcst
// EVEX.512.66.0F38.W1 55 /r VPOPCNTQ zmm1{k1}{z}, zmm2/m512/m64bcst
{
ISA: []string{"AVX512VPOPCNTDQ"},
Operands: []inst.Operand{
{Type: "m512/" + mbcst, Action: inst.R},
{Type: "zmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
{
ISA: []string{"AVX512VPOPCNTDQ"},
Operands: []inst.Operand{
{Type: "zmm", Action: inst.R},
{Type: "zmm{k}{z}", Action: inst.W},
},
EncodingType: inst.EncodingTypeEVEX,
},
}
}
func vpopcntdqforms(bcst string) inst.Forms { return _yvexpandpd("AVX512VPOPCNTDQ", bcst) }