2023-01-09 22:36:27 -08:00
|
|
|
package opcodesextra
|
|
|
|
|
|
2026-03-06 20:14:02 +00:00
|
|
|
import "sources.truenas.cloud/code/avo/internal/inst"
|
2023-01-09 22:36:27 -08:00
|
|
|
|
2023-01-14 16:12:42 -08:00
|
|
|
// vpopcntdq is the "Vector Population Count" instruction set.
|
2023-01-09 22:36:27 -08:00
|
|
|
var vpopcntdq = []*inst.Instruction{
|
|
|
|
|
// Reference: https://github.com/golang/go/blob/go1.19.3/src/cmd/internal/obj/x86/avx_optabs.go#L3741-L3750
|
|
|
|
|
//
|
|
|
|
|
// {as: AVPOPCNTD, ytab: _yvexpandpd, prefix: Pavx, op: opBytes{
|
|
|
|
|
// avxEscape | evex128 | evex66 | evex0F38 | evexW0, evexN16 | evexBcstN4 | evexZeroingEnabled, 0x55,
|
|
|
|
|
// avxEscape | evex256 | evex66 | evex0F38 | evexW0, evexN32 | evexBcstN4 | evexZeroingEnabled, 0x55,
|
|
|
|
|
// avxEscape | evex512 | evex66 | evex0F38 | evexW0, evexN64 | evexBcstN4 | evexZeroingEnabled, 0x55,
|
|
|
|
|
// }},
|
|
|
|
|
// {as: AVPOPCNTQ, ytab: _yvexpandpd, prefix: Pavx, op: opBytes{
|
|
|
|
|
// avxEscape | evex128 | evex66 | evex0F38 | evexW1, evexN16 | evexBcstN8 | evexZeroingEnabled, 0x55,
|
|
|
|
|
// avxEscape | evex256 | evex66 | evex0F38 | evexW1, evexN32 | evexBcstN8 | evexZeroingEnabled, 0x55,
|
|
|
|
|
// avxEscape | evex512 | evex66 | evex0F38 | evexW1, evexN64 | evexBcstN8 | evexZeroingEnabled, 0x55,
|
|
|
|
|
// }},
|
|
|
|
|
//
|
|
|
|
|
// Note the opcodes database already contains the non-AVX512VL forms. They
|
|
|
|
|
// are overridden by the definitions below.
|
|
|
|
|
{
|
|
|
|
|
Opcode: "VPOPCNTD",
|
|
|
|
|
Summary: "Packed Population Count for Doubleword Integers",
|
2023-01-14 13:25:44 -08:00
|
|
|
Forms: vpopcntdqforms("/m32bcst"),
|
2023-01-09 22:36:27 -08:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Opcode: "VPOPCNTQ",
|
|
|
|
|
Summary: "Packed Population Count for Quadword Integers",
|
2023-01-14 13:25:44 -08:00
|
|
|
Forms: vpopcntdqforms("/m64bcst"),
|
2023-01-09 22:36:27 -08:00
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// VPOPCNTD and VPOPCNTQ forms.
|
|
|
|
|
//
|
|
|
|
|
// See: https://www.felixcloutier.com/x86/vpopcnt
|
|
|
|
|
//
|
|
|
|
|
// 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}},
|
|
|
|
|
// }
|
2023-01-14 13:25:44 -08:00
|
|
|
func vpopcntdqforms(bcst string) inst.Forms { return _yvexpandpd("AVX512VPOPCNTDQ", bcst) }
|