projects
/
deliverable
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
x86: drop bogus IgnoreSize from AVX512BW insns
[deliverable/binutils-gdb.git]
/
opcodes
/
i386-dis.c
diff --git
a/opcodes/i386-dis.c
b/opcodes/i386-dis.c
index d6fb42a1de9ccb1af2f47362c058f66f268c6895..930569e0f73a2544d317e4542a0fe5d9dd54e4cd 100644
(file)
--- a/
opcodes/i386-dis.c
+++ b/
opcodes/i386-dis.c
@@
-273,6
+273,7
@@
fetch_data (struct disassemble_info *info, bfd_byte *addr)
#define Mo { OP_M, o_mode }
#define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
#define Mq { OP_M, q_mode }
#define Mo { OP_M, o_mode }
#define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
#define Mq { OP_M, q_mode }
+#define Mv_bnd { OP_M, v_bndmk_mode }
#define Mx { OP_M, x_mode }
#define Mxmm { OP_M, xmm_mode }
#define Gb { OP_G, b_mode }
#define Mx { OP_M, x_mode }
#define Mxmm { OP_M, xmm_mode }
#define Gb { OP_G, b_mode }
@@
-281,6
+282,7
@@
fetch_data (struct disassemble_info *info, bfd_byte *addr)
#define Gd { OP_G, d_mode }
#define Gdq { OP_G, dq_mode }
#define Gm { OP_G, m_mode }
#define Gd { OP_G, d_mode }
#define Gdq { OP_G, dq_mode }
#define Gm { OP_G, m_mode }
+#define Gva { OP_G, va_mode }
#define Gw { OP_G, w_mode }
#define Rd { OP_R, d_mode }
#define Rdq { OP_R, dq_mode }
#define Gw { OP_G, w_mode }
#define Rd { OP_R, d_mode }
#define Rdq { OP_R, dq_mode }
@@
-560,6
+562,8
@@
enum
cond_jump_mode,
loop_jcxz_mode,
v_bnd_mode,
cond_jump_mode,
loop_jcxz_mode,
v_bnd_mode,
+ /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
+ v_bndmk_mode,
/* operand size depends on REX prefixes. */
dq_mode,
/* registers like dq_mode, memory like w_mode. */
/* operand size depends on REX prefixes. */
dq_mode,
/* registers like dq_mode, memory like w_mode. */
@@
-738,6
+742,7
@@
enum
REG_0F01,
REG_0F0D,
REG_0F18,
REG_0F01,
REG_0F0D,
REG_0F18,
+ REG_0F1C_MOD_0,
REG_0F1E_MOD_3,
REG_0F71,
REG_0F72,
REG_0F1E_MOD_3,
REG_0F71,
REG_0F72,
@@
-792,6
+797,7
@@
enum
MOD_0F1A_PREFIX_0,
MOD_0F1B_PREFIX_0,
MOD_0F1B_PREFIX_1,
MOD_0F1A_PREFIX_0,
MOD_0F1B_PREFIX_0,
MOD_0F1B_PREFIX_1,
+ MOD_0F1C_PREFIX_0,
MOD_0F1E_PREFIX_1,
MOD_0F24,
MOD_0F26,
MOD_0F1E_PREFIX_1,
MOD_0F24,
MOD_0F26,
@@
-833,6
+839,8
@@
enum
MOD_0F382A_PREFIX_2,
MOD_0F38F5_PREFIX_2,
MOD_0F38F6_PREFIX_0,
MOD_0F382A_PREFIX_2,
MOD_0F38F5_PREFIX_2,
MOD_0F38F6_PREFIX_0,
+ MOD_0F38F8_PREFIX_2,
+ MOD_0F38F9_PREFIX_0,
MOD_62_32BIT,
MOD_C4_32BIT,
MOD_C5_32BIT,
MOD_62_32BIT,
MOD_C4_32BIT,
MOD_C5_32BIT,
@@
-970,6
+978,7
@@
enum
PREFIX_0F16,
PREFIX_0F1A,
PREFIX_0F1B,
PREFIX_0F16,
PREFIX_0F1A,
PREFIX_0F1B,
+ PREFIX_0F1C,
PREFIX_0F1E,
PREFIX_0F2A,
PREFIX_0F2B,
PREFIX_0F1E,
PREFIX_0F2A,
PREFIX_0F2B,
@@
-1078,6
+1087,8
@@
enum
PREFIX_0F38F1,
PREFIX_0F38F5,
PREFIX_0F38F6,
PREFIX_0F38F1,
PREFIX_0F38F5,
PREFIX_0F38F6,
+ PREFIX_0F38F8,
+ PREFIX_0F38F9,
PREFIX_0F3A08,
PREFIX_0F3A09,
PREFIX_0F3A0A,
PREFIX_0F3A08,
PREFIX_0F3A09,
PREFIX_0F3A0A,
@@
-2898,7
+2909,7
@@
static const struct dis386 dis386_twobyte[] = {
{ "nopQ", { Ev }, 0 },
{ PREFIX_TABLE (PREFIX_0F1A) },
{ PREFIX_TABLE (PREFIX_0F1B) },
{ "nopQ", { Ev }, 0 },
{ PREFIX_TABLE (PREFIX_0F1A) },
{ PREFIX_TABLE (PREFIX_0F1B) },
- {
"nopQ", { Ev }, 0
},
+ {
PREFIX_TABLE (PREFIX_0F1C)
},
{ "nopQ", { Ev }, 0 },
{ PREFIX_TABLE (PREFIX_0F1E) },
{ "nopQ", { Ev }, 0 },
{ "nopQ", { Ev }, 0 },
{ PREFIX_TABLE (PREFIX_0F1E) },
{ "nopQ", { Ev }, 0 },
@@
-3650,6
+3661,17
@@
static const struct dis386 reg_table[][8] = {
{ MOD_TABLE (MOD_0F18_REG_6) },
{ MOD_TABLE (MOD_0F18_REG_7) },
},
{ MOD_TABLE (MOD_0F18_REG_6) },
{ MOD_TABLE (MOD_0F18_REG_7) },
},
+ /* REG_0F1C_MOD_0 */
+ {
+ { "cldemote", { Mb }, 0 },
+ { "nopQ", { Ev }, 0 },
+ { "nopQ", { Ev }, 0 },
+ { "nopQ", { Ev }, 0 },
+ { "nopQ", { Ev }, 0 },
+ { "nopQ", { Ev }, 0 },
+ { "nopQ", { Ev }, 0 },
+ { "nopQ", { Ev }, 0 },
+ },
/* REG_0F1E_MOD_3 */
{
{ "nopQ", { Ev }, 0 },
/* REG_0F1E_MOD_3 */
{
{ "nopQ", { Ev }, 0 },
@@
-3901,6
+3923,14
@@
static const struct dis386 prefix_table[][4] = {
{ "bndcn", { Gbnd, Ev_bnd }, 0 },
},
{ "bndcn", { Gbnd, Ev_bnd }, 0 },
},
+ /* PREFIX_0F1C */
+ {
+ { MOD_TABLE (MOD_0F1C_PREFIX_0) },
+ { "nopQ", { Ev }, PREFIX_OPCODE },
+ { "nopQ", { Ev }, PREFIX_OPCODE },
+ { "nopQ", { Ev }, PREFIX_OPCODE },
+ },
+
/* PREFIX_0F1E */
{
{ "nopQ", { Ev }, PREFIX_OPCODE },
/* PREFIX_0F1E */
{
{ "nopQ", { Ev }, PREFIX_OPCODE },
@@
-4206,8
+4236,8
@@
static const struct dis386 prefix_table[][4] = {
{
{ RM_TABLE (RM_0FAE_REG_6) },
{ "umonitor", { Eva }, PREFIX_OPCODE },
{
{ RM_TABLE (RM_0FAE_REG_6) },
{ "umonitor", { Eva }, PREFIX_OPCODE },
- { "tpause", { E
m
}, PREFIX_OPCODE },
- { "umwait", { E
m
}, PREFIX_OPCODE },
+ { "tpause", { E
dq
}, PREFIX_OPCODE },
+ { "umwait", { E
dq
}, PREFIX_OPCODE },
},
/* PREFIX_0FAE_REG_7 */
},
/* PREFIX_0FAE_REG_7 */
@@
-4658,6
+4688,18
@@
static const struct dis386 prefix_table[][4] = {
{ Bad_Opcode },
},
{ Bad_Opcode },
},
+ /* PREFIX_0F38F8 */
+ {
+ { Bad_Opcode },
+ { Bad_Opcode },
+ { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
+ },
+
+ /* PREFIX_0F38F9 */
+ {
+ { MOD_TABLE (MOD_0F38F9_PREFIX_0) },
+ },
+
/* PREFIX_0F3A08 */
{
{ Bad_Opcode },
/* PREFIX_0F3A08 */
{
{ Bad_Opcode },
@@
-7422,8
+7464,8
@@
static const struct dis386 three_byte_table[][256] = {
{ PREFIX_TABLE (PREFIX_0F38F6) },
{ Bad_Opcode },
/* f8 */
{ PREFIX_TABLE (PREFIX_0F38F6) },
{ Bad_Opcode },
/* f8 */
- {
Bad_Opcode
},
- {
Bad_Opcode
},
+ {
PREFIX_TABLE (PREFIX_0F38F8)
},
+ {
PREFIX_TABLE (PREFIX_0F38F9)
},
{ Bad_Opcode },
{ Bad_Opcode },
{ Bad_Opcode },
{ Bad_Opcode },
{ Bad_Opcode },
{ Bad_Opcode },
@@
-11607,17
+11649,22
@@
static const struct dis386 mod_table[][2] = {
},
{
/* MOD_0F1A_PREFIX_0 */
},
{
/* MOD_0F1A_PREFIX_0 */
- { "bndldx", { Gbnd,
E
v_bnd }, 0 },
+ { "bndldx", { Gbnd,
M
v_bnd }, 0 },
{ "nopQ", { Ev }, 0 },
},
{
/* MOD_0F1B_PREFIX_0 */
{ "nopQ", { Ev }, 0 },
},
{
/* MOD_0F1B_PREFIX_0 */
- { "bndstx", {
E
v_bnd, Gbnd }, 0 },
+ { "bndstx", {
M
v_bnd, Gbnd }, 0 },
{ "nopQ", { Ev }, 0 },
},
{
/* MOD_0F1B_PREFIX_1 */
{ "nopQ", { Ev }, 0 },
},
{
/* MOD_0F1B_PREFIX_1 */
- { "bndmk", { Gbnd, Ev_bnd }, 0 },
+ { "bndmk", { Gbnd, Mv_bnd }, 0 },
+ { "nopQ", { Ev }, 0 },
+ },
+ {
+ /* MOD_0F1C_PREFIX_0 */
+ { REG_TABLE (REG_0F1C_MOD_0) },
{ "nopQ", { Ev }, 0 },
},
{
{ "nopQ", { Ev }, 0 },
},
{
@@
-11809,6
+11856,14
@@
static const struct dis386 mod_table[][2] = {
/* MOD_0F38F6_PREFIX_0 */
{ "wrssK", { M, Gdq }, PREFIX_OPCODE },
},
/* MOD_0F38F6_PREFIX_0 */
{ "wrssK", { M, Gdq }, PREFIX_OPCODE },
},
+ {
+ /* MOD_0F38F8_PREFIX_2 */
+ { "movdir64b", { Gva, M }, PREFIX_OPCODE },
+ },
+ {
+ /* MOD_0F38F9_PREFIX_0 */
+ { "movdiri", { Em, Gv }, PREFIX_OPCODE },
+ },
{
/* MOD_62_32BIT */
{ "bound{S|}", { Gv, Ma }, 0 },
{
/* MOD_62_32BIT */
{ "bound{S|}", { Gv, Ma }, 0 },
@@
-15031,6
+15086,7
@@
intel_operand_size (int bytemode, int sizeflag)
oappend ("WORD PTR ");
break;
case v_bnd_mode:
oappend ("WORD PTR ");
break;
case v_bnd_mode:
+ case v_bndmk_mode:
default:
break;
}
default:
break;
}
@@
-15285,11
+15341,13
@@
OP_E_memory (int bytemode, int sizeflag)
int havebase;
int haveindex;
int needindex;
int havebase;
int haveindex;
int needindex;
+ int needaddr32;
int base, rbase;
int vindex = 0;
int scale = 0;
int addr32flag = !((sizeflag & AFLAG)
|| bytemode == v_bnd_mode
int base, rbase;
int vindex = 0;
int scale = 0;
int addr32flag = !((sizeflag & AFLAG)
|| bytemode == v_bnd_mode
+ || bytemode == v_bndmk_mode
|| bytemode == bnd_mode
|| bytemode == bnd_swap_mode);
const char **indexes64 = names64;
|| bytemode == bnd_mode
|| bytemode == bnd_swap_mode);
const char **indexes64 = names64;
@@
-15366,6
+15424,11
@@
OP_E_memory (int bytemode, int sizeflag)
if (address_mode == mode_64bit && !havesib)
riprel = 1;
disp = get32s ();
if (address_mode == mode_64bit && !havesib)
riprel = 1;
disp = get32s ();
+ if (riprel && bytemode == v_bndmk_mode)
+ {
+ oappend ("(bad)");
+ return;
+ }
}
break;
case 1:
}
break;
case 1:
@@
-15381,12
+15444,27
@@
OP_E_memory (int bytemode, int sizeflag)
break;
}
break;
}
- /* In 32bit mode, we need index register to tell [offset] from
- [eiz*1 + offset]. */
- needindex = (havesib
- && !havebase
- && !haveindex
- && address_mode == mode_32bit);
+ needindex = 0;
+ needaddr32 = 0;
+ if (havesib
+ && !havebase
+ && !haveindex
+ && address_mode != mode_16bit)
+ {
+ if (address_mode == mode_64bit)
+ {
+ /* Display eiz instead of addr32. */
+ needindex = addr32flag;
+ needaddr32 = 1;
+ }
+ else
+ {
+ /* In 32-bit mode, we need index register to tell [offset]
+ from [eiz*1 + offset]. */
+ needindex = 1;
+ }
+ }
+
havedisp = (havebase
|| needindex
|| (havesib && (haveindex || scale != 0)));
havedisp = (havebase
|| needindex
|| (havesib && (haveindex || scale != 0)));
@@
-15406,8
+15484,9
@@
OP_E_memory (int bytemode, int sizeflag)
}
}
}
}
- if ((havebase || haveindex || riprel)
+ if ((havebase || haveindex ||
needaddr32 ||
riprel)
&& (bytemode != v_bnd_mode)
&& (bytemode != v_bnd_mode)
+ && (bytemode != v_bndmk_mode)
&& (bytemode != bnd_mode)
&& (bytemode != bnd_swap_mode))
used_prefixes |= PREFIX_ADDR;
&& (bytemode != bnd_mode)
&& (bytemode != bnd_swap_mode))
used_prefixes |= PREFIX_ADDR;
@@
-15625,6
+15704,7
@@
static void
OP_G (int bytemode, int sizeflag)
{
int add = 0;
OP_G (int bytemode, int sizeflag)
{
int add = 0;
+ const char **names;
USED_REX (REX_R);
if (rex & REX_R)
add += 8;
USED_REX (REX_R);
if (rex & REX_R)
add += 8;
@@
-15673,6
+15753,24
@@
OP_G (int bytemode, int sizeflag)
used_prefixes |= (prefixes & PREFIX_DATA);
}
break;
used_prefixes |= (prefixes & PREFIX_DATA);
}
break;
+ case va_mode:
+ names = (address_mode == mode_64bit
+ ? names64 : names32);
+ if (!(prefixes & PREFIX_ADDR))
+ {
+ if (address_mode == mode_16bit)
+ names = names16;
+ }
+ else
+ {
+ /* Remove "addr16/addr32". */
+ all_prefixes[last_addr_prefix] = 0;
+ names = (address_mode != mode_32bit
+ ? names32 : names16);
+ used_prefixes |= PREFIX_ADDR;
+ }
+ oappend (names[modrm.reg + add]);
+ break;
case m_mode:
if (address_mode == mode_64bit)
oappend (names64[modrm.reg + add]);
case m_mode:
if (address_mode == mode_64bit)
oappend (names64[modrm.reg + add]);
This page took
0.029127 seconds
and
4
git commands to generate.