diff options
author | Adrian Hunter <adrian.hunter@intel.com> | 2016-07-20 04:30:35 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-07-21 08:37:11 -0400 |
commit | 25af37f4e1e0a747824e3713b80d6b97dad28b7c (patch) | |
tree | bd62c50bb1cb1f58e7c71e3425d41fd518038c6a /arch/x86/tools | |
parent | 6f6ef07f412c5bfc37cde57e94b1fec789471907 (diff) |
x86/insn: Add AVX-512 support to the instruction decoder
Add support for Intel's AVX-512 instructions to the instruction decoder.
AVX-512 instructions are documented in Intel Architecture Instruction
Set Extensions Programming Reference (February 2016).
AVX-512 instructions are identified by a EVEX prefix which, for the
purpose of instruction decoding, can be treated as though it were a
4-byte VEX prefix.
Existing instructions which can now accept an EVEX prefix need not be
further annotated in the op code map (x86-opcode-map.txt). In the case
of new instructions, the op code map is updated accordingly.
Also add associated Mask Instructions that are used to manipulate mask
registers used in AVX-512 instructions.
The 'perf tools' instruction decoder is updated in a subsequent patch.
And a representative set of instructions is added to the perf tools new
instructions test in a subsequent patch.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Acked-by: Ingo Molnar <mingo@kernel.org>
Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: X86 ML <x86@kernel.org>
Link: http://lkml.kernel.org/r/1469003437-32706-3-git-send-email-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'arch/x86/tools')
-rw-r--r-- | arch/x86/tools/gen-insn-attr-x86.awk | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/arch/x86/tools/gen-insn-attr-x86.awk b/arch/x86/tools/gen-insn-attr-x86.awk index 093a892026f9..a3d2c62fd805 100644 --- a/arch/x86/tools/gen-insn-attr-x86.awk +++ b/arch/x86/tools/gen-insn-attr-x86.awk | |||
@@ -72,12 +72,14 @@ BEGIN { | |||
72 | lprefix_expr = "\\((66|F2|F3)\\)" | 72 | lprefix_expr = "\\((66|F2|F3)\\)" |
73 | max_lprefix = 4 | 73 | max_lprefix = 4 |
74 | 74 | ||
75 | # All opcodes starting with lower-case 'v' or with (v1) superscript | 75 | # All opcodes starting with lower-case 'v', 'k' or with (v1) superscript |
76 | # accepts VEX prefix | 76 | # accepts VEX prefix |
77 | vexok_opcode_expr = "^v.*" | 77 | vexok_opcode_expr = "^[vk].*" |
78 | vexok_expr = "\\(v1\\)" | 78 | vexok_expr = "\\(v1\\)" |
79 | # All opcodes with (v) superscript supports *only* VEX prefix | 79 | # All opcodes with (v) superscript supports *only* VEX prefix |
80 | vexonly_expr = "\\(v\\)" | 80 | vexonly_expr = "\\(v\\)" |
81 | # All opcodes with (ev) superscript supports *only* EVEX prefix | ||
82 | evexonly_expr = "\\(ev\\)" | ||
81 | 83 | ||
82 | prefix_expr = "\\(Prefix\\)" | 84 | prefix_expr = "\\(Prefix\\)" |
83 | prefix_num["Operand-Size"] = "INAT_PFX_OPNDSZ" | 85 | prefix_num["Operand-Size"] = "INAT_PFX_OPNDSZ" |
@@ -95,6 +97,7 @@ BEGIN { | |||
95 | prefix_num["Address-Size"] = "INAT_PFX_ADDRSZ" | 97 | prefix_num["Address-Size"] = "INAT_PFX_ADDRSZ" |
96 | prefix_num["VEX+1byte"] = "INAT_PFX_VEX2" | 98 | prefix_num["VEX+1byte"] = "INAT_PFX_VEX2" |
97 | prefix_num["VEX+2byte"] = "INAT_PFX_VEX3" | 99 | prefix_num["VEX+2byte"] = "INAT_PFX_VEX3" |
100 | prefix_num["EVEX"] = "INAT_PFX_EVEX" | ||
98 | 101 | ||
99 | clear_vars() | 102 | clear_vars() |
100 | } | 103 | } |
@@ -319,7 +322,9 @@ function convert_operands(count,opnd, i,j,imm,mod) | |||
319 | flags = add_flags(flags, "INAT_MODRM") | 322 | flags = add_flags(flags, "INAT_MODRM") |
320 | 323 | ||
321 | # check VEX codes | 324 | # check VEX codes |
322 | if (match(ext, vexonly_expr)) | 325 | if (match(ext, evexonly_expr)) |
326 | flags = add_flags(flags, "INAT_VEXOK | INAT_EVEXONLY") | ||
327 | else if (match(ext, vexonly_expr)) | ||
323 | flags = add_flags(flags, "INAT_VEXOK | INAT_VEXONLY") | 328 | flags = add_flags(flags, "INAT_VEXOK | INAT_VEXONLY") |
324 | else if (match(ext, vexok_expr) || match(opcode, vexok_opcode_expr)) | 329 | else if (match(ext, vexok_expr) || match(opcode, vexok_opcode_expr)) |
325 | flags = add_flags(flags, "INAT_VEXOK") | 330 | flags = add_flags(flags, "INAT_VEXOK") |