2 * x86 instruction attribute tables
4 * Written by Masami Hiramatsu <mhiramat@redhat.com>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 /* Attribute tables are generated from opcode map */
24 #include "inat-tables.c"
26 /* Attribute search APIs */
27 insn_attr_t
inat_get_opcode_attribute(insn_byte_t opcode
)
29 return inat_primary_table
[opcode
];
32 insn_attr_t
inat_get_escape_attribute(insn_byte_t opcode
, insn_byte_t last_pfx
,
35 const insn_attr_t
*table
;
36 insn_attr_t lpfx_attr
;
39 n
= inat_escape_id(esc_attr
);
41 lpfx_attr
= inat_get_opcode_attribute(last_pfx
);
42 m
= inat_last_prefix_id(lpfx_attr
);
44 table
= inat_escape_tables
[n
][0];
47 if (inat_has_variant(table
[opcode
]) && m
) {
48 table
= inat_escape_tables
[n
][m
];
55 insn_attr_t
inat_get_group_attribute(insn_byte_t modrm
, insn_byte_t last_pfx
,
58 const insn_attr_t
*table
;
59 insn_attr_t lpfx_attr
;
62 n
= inat_group_id(grp_attr
);
64 lpfx_attr
= inat_get_opcode_attribute(last_pfx
);
65 m
= inat_last_prefix_id(lpfx_attr
);
67 table
= inat_group_tables
[n
][0];
69 return inat_group_common_attribute(grp_attr
);
70 if (inat_has_variant(table
[X86_MODRM_REG(modrm
)]) && m
) {
71 table
= inat_group_tables
[n
][m
];
73 return inat_group_common_attribute(grp_attr
);
75 return table
[X86_MODRM_REG(modrm
)] |
76 inat_group_common_attribute(grp_attr
);
79 insn_attr_t
inat_get_avx_attribute(insn_byte_t opcode
, insn_byte_t vex_m
,
82 const insn_attr_t
*table
;
83 if (vex_m
> X86_VEX_M_MAX
|| vex_p
> INAT_LSTPFX_MAX
)
85 /* At first, this checks the master table */
86 table
= inat_avx_tables
[vex_m
][0];
89 if (!inat_is_group(table
[opcode
]) && vex_p
) {
90 /* If this is not a group, get attribute directly */
91 table
= inat_avx_tables
[vex_m
][vex_p
];