* [PATCH 0/5] x86: adjustments to struct instr_info (and more)
@ 2022-01-14 13:51 Jan Beulich
2022-01-14 13:52 ` [PATCH 1/5] x86: constify disassembler static data Jan Beulich
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Jan Beulich @ 2022-01-14 13:51 UTC (permalink / raw)
To: Binutils
Some of this I was meaning to do for a long time, and now it (and
further aspects) have been prompted by the thread-safety rework
1: constify disassembler static data
2: fold variables in memory operand index handling
3: drop most Intel syntax register name arrays
4: drop index16 field
5: adjust struct instr_info field types
Jan
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/5] x86: constify disassembler static data
2022-01-14 13:51 [PATCH 0/5] x86: adjustments to struct instr_info (and more) Jan Beulich
@ 2022-01-14 13:52 ` Jan Beulich
2022-01-14 13:52 ` [PATCH 2/5] x86: fold variables in memory operand index handling Jan Beulich
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Jan Beulich @ 2022-01-14 13:52 UTC (permalink / raw)
To: Binutils
Now that the code is intended to be largely thread-safe, we'd better not
have any writable static objects.
--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -219,22 +219,22 @@ struct instr_info
vex;
unsigned char need_vex;
- const char **names64;
- const char **names32;
- const char **names16;
- const char **names8;
- const char **names8rex;
- const char **names_seg;
+ const char *const *names64;
+ const char *const *names32;
+ const char *const *names16;
+ const char *const *names8;
+ const char *const *names8rex;
+ const char *const *names_seg;
const char *index64;
const char *index32;
- const char **index16;
- const char **names_bnd;
- const char **names_mm;
- const char **names_xmm;
- const char **names_ymm;
- const char **names_zmm;
- const char **names_tmm;
- const char **names_mask;
+ const char *const *index16;
+ const char *const *names_bnd;
+ const char *const *names_mm;
+ const char *const *names_xmm;
+ const char *const *names_ymm;
+ const char *const *names_zmm;
+ const char *const *names_tmm;
+ const char *const *names_mask;
/* Remember if the current op is a jump instruction. */
bool op_is_jump;
@@ -2423,80 +2423,80 @@ struct op
need to update onebyte_has_modrm or twobyte_has_modrm. */
#define MODRM_CHECK if (!ins->need_modrm) abort ()
-static const char *intel_names64[] = {
+static const char *const intel_names64[] = {
"rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
};
-static const char *intel_names32[] = {
+static const char *const intel_names32[] = {
"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
"r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
};
-static const char *intel_names16[] = {
+static const char *const intel_names16[] = {
"ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
"r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
};
-static const char *intel_names8[] = {
+static const char *const intel_names8[] = {
"al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
};
-static const char *intel_names8rex[] = {
+static const char *const intel_names8rex[] = {
"al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
"r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
};
-static const char *intel_names_seg[] = {
+static const char *const intel_names_seg[] = {
"es", "cs", "ss", "ds", "fs", "gs", "?", "?",
};
-static const char *intel_index64 = "riz";
-static const char *intel_index32 = "eiz";
-static const char *intel_index16[] = {
+static const char intel_index64[] = "riz";
+static const char intel_index32[] = "eiz";
+static const char *const intel_index16[] = {
"bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
};
-static const char *att_names64[] = {
+static const char *const att_names64[] = {
"%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
"%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
};
-static const char *att_names32[] = {
+static const char *const att_names32[] = {
"%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
"%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
};
-static const char *att_names16[] = {
+static const char *const att_names16[] = {
"%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
"%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
};
-static const char *att_names8[] = {
+static const char *const att_names8[] = {
"%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
};
-static const char *att_names8rex[] = {
+static const char *const att_names8rex[] = {
"%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
"%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
};
-static const char *att_names_seg[] = {
+static const char *const att_names_seg[] = {
"%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
};
-static const char *att_index64 = "%riz";
-static const char *att_index32 = "%eiz";
-static const char *att_index16[] = {
+static const char att_index64[] = "%riz";
+static const char att_index32[] = "%eiz";
+static const char *const att_index16[] = {
"%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
};
-static const char *intel_names_mm[] = {
+static const char *const intel_names_mm[] = {
"mm0", "mm1", "mm2", "mm3",
"mm4", "mm5", "mm6", "mm7"
};
-static const char *att_names_mm[] = {
+static const char *const att_names_mm[] = {
"%mm0", "%mm1", "%mm2", "%mm3",
"%mm4", "%mm5", "%mm6", "%mm7"
};
-static const char *intel_names_bnd[] = {
+static const char *const intel_names_bnd[] = {
"bnd0", "bnd1", "bnd2", "bnd3"
};
-static const char *att_names_bnd[] = {
+static const char *const att_names_bnd[] = {
"%bnd0", "%bnd1", "%bnd2", "%bnd3"
};
-static const char *intel_names_xmm[] = {
+static const char *const intel_names_xmm[] = {
"xmm0", "xmm1", "xmm2", "xmm3",
"xmm4", "xmm5", "xmm6", "xmm7",
"xmm8", "xmm9", "xmm10", "xmm11",
@@ -2506,7 +2506,7 @@ static const char *intel_names_xmm[] = {
"xmm24", "xmm25", "xmm26", "xmm27",
"xmm28", "xmm29", "xmm30", "xmm31"
};
-static const char *att_names_xmm[] = {
+static const char *const att_names_xmm[] = {
"%xmm0", "%xmm1", "%xmm2", "%xmm3",
"%xmm4", "%xmm5", "%xmm6", "%xmm7",
"%xmm8", "%xmm9", "%xmm10", "%xmm11",
@@ -2517,7 +2517,7 @@ static const char *att_names_xmm[] = {
"%xmm28", "%xmm29", "%xmm30", "%xmm31"
};
-static const char *intel_names_ymm[] = {
+static const char *const intel_names_ymm[] = {
"ymm0", "ymm1", "ymm2", "ymm3",
"ymm4", "ymm5", "ymm6", "ymm7",
"ymm8", "ymm9", "ymm10", "ymm11",
@@ -2527,7 +2527,7 @@ static const char *intel_names_ymm[] = {
"ymm24", "ymm25", "ymm26", "ymm27",
"ymm28", "ymm29", "ymm30", "ymm31"
};
-static const char *att_names_ymm[] = {
+static const char *const att_names_ymm[] = {
"%ymm0", "%ymm1", "%ymm2", "%ymm3",
"%ymm4", "%ymm5", "%ymm6", "%ymm7",
"%ymm8", "%ymm9", "%ymm10", "%ymm11",
@@ -2538,7 +2538,7 @@ static const char *att_names_ymm[] = {
"%ymm28", "%ymm29", "%ymm30", "%ymm31"
};
-static const char *intel_names_zmm[] = {
+static const char *const intel_names_zmm[] = {
"zmm0", "zmm1", "zmm2", "zmm3",
"zmm4", "zmm5", "zmm6", "zmm7",
"zmm8", "zmm9", "zmm10", "zmm11",
@@ -2548,7 +2548,7 @@ static const char *intel_names_zmm[] = {
"zmm24", "zmm25", "zmm26", "zmm27",
"zmm28", "zmm29", "zmm30", "zmm31"
};
-static const char *att_names_zmm[] = {
+static const char *const att_names_zmm[] = {
"%zmm0", "%zmm1", "%zmm2", "%zmm3",
"%zmm4", "%zmm5", "%zmm6", "%zmm7",
"%zmm8", "%zmm9", "%zmm10", "%zmm11",
@@ -2559,19 +2559,19 @@ static const char *att_names_zmm[] = {
"%zmm28", "%zmm29", "%zmm30", "%zmm31"
};
-static const char *intel_names_tmm[] = {
+static const char *const intel_names_tmm[] = {
"tmm0", "tmm1", "tmm2", "tmm3",
"tmm4", "tmm5", "tmm6", "tmm7"
};
-static const char *att_names_tmm[] = {
+static const char *const att_names_tmm[] = {
"%tmm0", "%tmm1", "%tmm2", "%tmm3",
"%tmm4", "%tmm5", "%tmm6", "%tmm7"
};
-static const char *intel_names_mask[] = {
+static const char *const intel_names_mask[] = {
"k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
};
-static const char *att_names_mask[] = {
+static const char *const att_names_mask[] = {
"%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
};
@@ -10185,7 +10185,7 @@ static const struct dis386 float_reg[][8
},
};
-static char *fgrps[][8] = {
+static const char *const fgrps[][8] = {
/* Bad opcode 0 */
{
"(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
@@ -11283,7 +11283,7 @@ static void
print_register (instr_info *ins, unsigned int reg, unsigned int rexmask,
int bytemode, int sizeflag)
{
- const char **names;
+ const char *const *names;
USED_REX (rexmask);
if (ins->rex & rexmask)
@@ -11524,8 +11524,8 @@ OP_E_memory (instr_info *ins, int bytemo
|| bytemode == bnd_mode
|| bytemode == bnd_swap_mode);
bool check_gather = false;
- const char **indexes64 = ins->names64;
- const char **indexes32 = ins->names32;
+ const char *const *indexes64 = ins->names64;
+ const char *const *indexes32 = ins->names32;
havesib = 0;
havebase = 1;
@@ -12556,7 +12556,7 @@ OP_MMX (instr_info *ins, int bytemode AT
int sizeflag ATTRIBUTE_UNUSED)
{
int reg = ins->modrm.reg;
- const char **names;
+ const char *const *names;
ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
if (ins->prefixes & PREFIX_DATA)
@@ -12574,7 +12574,7 @@ OP_MMX (instr_info *ins, int bytemode AT
static void
print_vector_reg (instr_info *ins, unsigned int reg, int bytemode)
{
- const char **names;
+ const char *const *names;
if (bytemode == xmmq_mode
|| bytemode == evex_half_bcst_xmmqh_mode
@@ -12670,7 +12670,7 @@ static void
OP_EM (instr_info *ins, int bytemode, int sizeflag)
{
int reg;
- const char **names;
+ const char *const *names;
if (ins->modrm.mod != 3)
{
@@ -13040,8 +13040,8 @@ OP_Monitor (instr_info *ins, int bytemod
/* monitor %{e,r,}ax,%ecx,%edx" */
if (!ins->intel_syntax)
{
- const char **names = (ins->address_mode == mode_64bit
- ? ins->names64 : ins->names32);
+ const char *const *names = (ins->address_mode == mode_64bit
+ ? ins->names64 : ins->names32);
if (ins->prefixes & PREFIX_ADDR)
{
@@ -13217,7 +13217,7 @@ CMPXCHG8B_Fixup (instr_info *ins, int by
static void
XMM_Fixup (instr_info *ins, int reg, int sizeflag ATTRIBUTE_UNUSED)
{
- const char **names;
+ const char *const *names;
if (ins->need_vex)
{
@@ -13261,7 +13261,7 @@ static void
OP_VEX (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
{
int reg, modrm_reg, sib_index = -1;
- const char **names;
+ const char *const *names;
if (!ins->need_vex)
abort ();
@@ -13432,7 +13432,7 @@ static void
OP_REG_VexI4 (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
{
int reg;
- const char **names = ins->names_xmm;
+ const char *const *names = ins->names_xmm;
FETCH_DATA (ins->info, ins->codep + 1);
reg = *ins->codep++;
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 2/5] x86: fold variables in memory operand index handling
2022-01-14 13:51 [PATCH 0/5] x86: adjustments to struct instr_info (and more) Jan Beulich
2022-01-14 13:52 ` [PATCH 1/5] x86: constify disassembler static data Jan Beulich
@ 2022-01-14 13:52 ` Jan Beulich
2022-01-14 13:53 ` [PATCH 3/5] x86: drop most Intel syntax register name arrays Jan Beulich
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Jan Beulich @ 2022-01-14 13:52 UTC (permalink / raw)
To: Binutils
There's no real need for the pseudo-boolean "haveindex" or for separate
32-bit / 64-bit index pointers. Fold them into a single "indexes" and
set that uniformly to AT&T names, compensating by emitting the register
name via oappend_maybe_intel().
--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -11512,7 +11512,6 @@ OP_E_memory (instr_info *ins, int bytemo
int havedisp;
int havesib;
int havebase;
- int haveindex;
int needindex;
int needaddr32;
int base, rbase;
@@ -11524,12 +11523,10 @@ OP_E_memory (instr_info *ins, int bytemo
|| bytemode == bnd_mode
|| bytemode == bnd_swap_mode);
bool check_gather = false;
- const char *const *indexes64 = ins->names64;
- const char *const *indexes32 = ins->names32;
+ const char *const *indexes = NULL;
havesib = 0;
havebase = 1;
- haveindex = 0;
base = ins->modrm.rm;
if (base == 4)
@@ -11552,32 +11549,33 @@ OP_E_memory (instr_info *ins, int bytemo
check_gather = ins->obufp == ins->op_out[1];
}
- haveindex = 1;
switch (ins->vex.length)
{
case 128:
- indexes64 = indexes32 = ins->names_xmm;
+ indexes = att_names_xmm;
break;
case 256:
if (!ins->vex.w
|| bytemode == vex_vsib_q_w_dq_mode)
- indexes64 = indexes32 = ins->names_ymm;
+ indexes = att_names_ymm;
else
- indexes64 = indexes32 = ins->names_xmm;
+ indexes = att_names_xmm;
break;
case 512:
if (!ins->vex.w
|| bytemode == vex_vsib_q_w_dq_mode)
- indexes64 = indexes32 = ins->names_zmm;
+ indexes = att_names_zmm;
else
- indexes64 = indexes32 = ins->names_ymm;
+ indexes = att_names_ymm;
break;
default:
abort ();
}
break;
default:
- haveindex = vindex != 4;
+ if (vindex != 4)
+ indexes = ins->address_mode == mode_64bit && !addr32flag
+ ? att_names64 : att_names32;
break;
}
scale = ins->sib.scale;
@@ -11630,7 +11628,7 @@ OP_E_memory (instr_info *ins, int bytemo
needaddr32 = 0;
if (havesib
&& !havebase
- && !haveindex
+ && !indexes
&& ins->address_mode != mode_16bit)
{
if (ins->address_mode == mode_64bit)
@@ -11654,7 +11652,7 @@ OP_E_memory (instr_info *ins, int bytemo
havedisp = (havebase
|| needindex
- || (havesib && (haveindex || scale != 0)));
+ || (havesib && (indexes || scale != 0)));
if (!ins->intel_syntax)
if (ins->modrm.mod != 0 || base == 5)
@@ -11671,7 +11669,7 @@ OP_E_memory (instr_info *ins, int bytemo
}
}
- if ((havebase || haveindex || needindex || needaddr32 || riprel)
+ if ((havebase || indexes || needindex || needaddr32 || riprel)
&& (ins->address_mode != mode_64bit
|| ((bytemode != v_bnd_mode)
&& (bytemode != v_bndmk_mode)
@@ -11697,7 +11695,7 @@ OP_E_memory (instr_info *ins, int bytemo
print index to tell base + index from base. */
if (scale != 0
|| needindex
- || haveindex
+ || indexes
|| (havebase && base != ESP_REG_NUM))
{
if (!ins->intel_syntax || havebase)
@@ -11705,12 +11703,10 @@ OP_E_memory (instr_info *ins, int bytemo
*ins->obufp++ = ins->separator_char;
*ins->obufp = '\0';
}
- if (haveindex)
+ if (indexes)
{
if (ins->address_mode == mode_64bit || vindex < 16)
- oappend (ins, ins->address_mode == mode_64bit
- && !addr32flag
- ? indexes64[vindex] : indexes32[vindex]);
+ oappend_maybe_intel (ins, indexes[vindex]);
else
oappend (ins, "(bad)");
}
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 3/5] x86: drop most Intel syntax register name arrays
2022-01-14 13:51 [PATCH 0/5] x86: adjustments to struct instr_info (and more) Jan Beulich
2022-01-14 13:52 ` [PATCH 1/5] x86: constify disassembler static data Jan Beulich
2022-01-14 13:52 ` [PATCH 2/5] x86: fold variables in memory operand index handling Jan Beulich
@ 2022-01-14 13:53 ` Jan Beulich
2022-01-14 13:53 ` [PATCH 4/5] x86: drop index16 field Jan Beulich
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Jan Beulich @ 2022-01-14 13:53 UTC (permalink / raw)
To: Binutils
By making use of, in particular, oappend_maybe_intel() there's no need
for this redundant set of static data.
--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -219,22 +219,7 @@ struct instr_info
vex;
unsigned char need_vex;
- const char *const *names64;
- const char *const *names32;
- const char *const *names16;
- const char *const *names8;
- const char *const *names8rex;
- const char *const *names_seg;
- const char *index64;
- const char *index32;
const char *const *index16;
- const char *const *names_bnd;
- const char *const *names_mm;
- const char *const *names_xmm;
- const char *const *names_ymm;
- const char *const *names_zmm;
- const char *const *names_tmm;
- const char *const *names_mask;
/* Remember if the current op is a jump instruction. */
bool op_is_jump;
@@ -2423,30 +2408,6 @@ struct op
need to update onebyte_has_modrm or twobyte_has_modrm. */
#define MODRM_CHECK if (!ins->need_modrm) abort ()
-static const char *const intel_names64[] = {
- "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
- "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
-};
-static const char *const intel_names32[] = {
- "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
- "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
-};
-static const char *const intel_names16[] = {
- "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
- "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
-};
-static const char *const intel_names8[] = {
- "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
-};
-static const char *const intel_names8rex[] = {
- "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
- "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
-};
-static const char *const intel_names_seg[] = {
- "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
-};
-static const char intel_index64[] = "riz";
-static const char intel_index32[] = "eiz";
static const char *const intel_index16[] = {
"bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
};
@@ -2479,33 +2440,15 @@ static const char *const att_index16[] =
"%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
};
-static const char *const intel_names_mm[] = {
- "mm0", "mm1", "mm2", "mm3",
- "mm4", "mm5", "mm6", "mm7"
-};
static const char *const att_names_mm[] = {
"%mm0", "%mm1", "%mm2", "%mm3",
"%mm4", "%mm5", "%mm6", "%mm7"
};
-static const char *const intel_names_bnd[] = {
- "bnd0", "bnd1", "bnd2", "bnd3"
-};
-
static const char *const att_names_bnd[] = {
"%bnd0", "%bnd1", "%bnd2", "%bnd3"
};
-static const char *const intel_names_xmm[] = {
- "xmm0", "xmm1", "xmm2", "xmm3",
- "xmm4", "xmm5", "xmm6", "xmm7",
- "xmm8", "xmm9", "xmm10", "xmm11",
- "xmm12", "xmm13", "xmm14", "xmm15",
- "xmm16", "xmm17", "xmm18", "xmm19",
- "xmm20", "xmm21", "xmm22", "xmm23",
- "xmm24", "xmm25", "xmm26", "xmm27",
- "xmm28", "xmm29", "xmm30", "xmm31"
-};
static const char *const att_names_xmm[] = {
"%xmm0", "%xmm1", "%xmm2", "%xmm3",
"%xmm4", "%xmm5", "%xmm6", "%xmm7",
@@ -2517,16 +2460,6 @@ static const char *const att_names_xmm[]
"%xmm28", "%xmm29", "%xmm30", "%xmm31"
};
-static const char *const intel_names_ymm[] = {
- "ymm0", "ymm1", "ymm2", "ymm3",
- "ymm4", "ymm5", "ymm6", "ymm7",
- "ymm8", "ymm9", "ymm10", "ymm11",
- "ymm12", "ymm13", "ymm14", "ymm15",
- "ymm16", "ymm17", "ymm18", "ymm19",
- "ymm20", "ymm21", "ymm22", "ymm23",
- "ymm24", "ymm25", "ymm26", "ymm27",
- "ymm28", "ymm29", "ymm30", "ymm31"
-};
static const char *const att_names_ymm[] = {
"%ymm0", "%ymm1", "%ymm2", "%ymm3",
"%ymm4", "%ymm5", "%ymm6", "%ymm7",
@@ -2538,16 +2471,6 @@ static const char *const att_names_ymm[]
"%ymm28", "%ymm29", "%ymm30", "%ymm31"
};
-static const char *const intel_names_zmm[] = {
- "zmm0", "zmm1", "zmm2", "zmm3",
- "zmm4", "zmm5", "zmm6", "zmm7",
- "zmm8", "zmm9", "zmm10", "zmm11",
- "zmm12", "zmm13", "zmm14", "zmm15",
- "zmm16", "zmm17", "zmm18", "zmm19",
- "zmm20", "zmm21", "zmm22", "zmm23",
- "zmm24", "zmm25", "zmm26", "zmm27",
- "zmm28", "zmm29", "zmm30", "zmm31"
-};
static const char *const att_names_zmm[] = {
"%zmm0", "%zmm1", "%zmm2", "%zmm3",
"%zmm4", "%zmm5", "%zmm6", "%zmm7",
@@ -2559,18 +2482,11 @@ static const char *const att_names_zmm[]
"%zmm28", "%zmm29", "%zmm30", "%zmm31"
};
-static const char *const intel_names_tmm[] = {
- "tmm0", "tmm1", "tmm2", "tmm3",
- "tmm4", "tmm5", "tmm6", "tmm7"
-};
static const char *const att_names_tmm[] = {
"%tmm0", "%tmm1", "%tmm2", "%tmm3",
"%tmm4", "%tmm5", "%tmm6", "%tmm7"
};
-static const char *const intel_names_mask[] = {
- "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
-};
static const char *const att_names_mask[] = {
"%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
};
@@ -9377,6 +9293,14 @@ get_sib (instr_info *ins, int sizeflag)
}
}
+/* Like oappend (below), but S is a string starting with '%'.
+ In Intel syntax, the '%' is elided. */
+static void
+oappend_maybe_intel (instr_info *ins, const char *s)
+{
+ oappend (ins, s + ins->intel_syntax);
+}
+
static int
print_insn (bfd_vma pc, instr_info *ins)
{
@@ -9480,21 +9404,6 @@ print_insn (bfd_vma pc, instr_info *ins)
if (ins->intel_syntax)
{
- ins->names64 = intel_names64;
- ins->names32 = intel_names32;
- ins->names16 = intel_names16;
- ins->names8 = intel_names8;
- ins->names8rex = intel_names8rex;
- ins->names_seg = intel_names_seg;
- ins->names_mm = intel_names_mm;
- ins->names_bnd = intel_names_bnd;
- ins->names_xmm = intel_names_xmm;
- ins->names_ymm = intel_names_ymm;
- ins->names_zmm = intel_names_zmm;
- ins->names_tmm = intel_names_tmm;
- ins->index64 = intel_index64;
- ins->index32 = intel_index32;
- ins->names_mask = intel_names_mask;
ins->index16 = intel_index16;
ins->open_char = '[';
ins->close_char = ']';
@@ -9503,21 +9412,6 @@ print_insn (bfd_vma pc, instr_info *ins)
}
else
{
- ins->names64 = att_names64;
- ins->names32 = att_names32;
- ins->names16 = att_names16;
- ins->names8 = att_names8;
- ins->names8rex = att_names8rex;
- ins->names_seg = att_names_seg;
- ins->names_mm = att_names_mm;
- ins->names_bnd = att_names_bnd;
- ins->names_xmm = att_names_xmm;
- ins->names_ymm = att_names_ymm;
- ins->names_zmm = att_names_zmm;
- ins->names_tmm = att_names_tmm;
- ins->index64 = att_index64;
- ins->index32 = att_index32;
- ins->names_mask = att_names_mask;
ins->index16 = att_index16;
ins->open_char = '(';
ins->close_char = ')';
@@ -9673,8 +9567,9 @@ print_insn (bfd_vma pc, instr_info *ins)
if (ins->vex.mask_register_specifier)
{
oappend (ins, "{");
- oappend (ins,
- ins->names_mask[ins->vex.mask_register_specifier]);
+ oappend_maybe_intel (ins,
+ att_names_mask
+ [ins->vex.mask_register_specifier]);
oappend (ins, "}");
}
if (ins->vex.zeroing)
@@ -10285,7 +10180,7 @@ dofloat (instr_info *ins, int sizeflag)
/* Instruction fnstsw is only one with strange arg. */
if (floatop == 0xdf && ins->codep[-1] == 0xe0)
- strcpy (ins->op_out[0], ins->names16[0]);
+ strcpy (ins->op_out[0], att_names16[0] + ins->intel_syntax);
}
else
{
@@ -10303,14 +10198,6 @@ dofloat (instr_info *ins, int sizeflag)
}
}
-/* Like oappend (below), but S is a string starting with '%'.
- In Intel syntax, the '%' is elided. */
-static void
-oappend_maybe_intel (instr_info *ins, const char *s)
-{
- oappend (ins, s + ins->intel_syntax);
-}
-
static void
OP_ST (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
int sizeflag ATTRIBUTE_UNUSED)
@@ -11296,24 +11183,24 @@ print_register (instr_info *ins, unsigne
if (reg & 4)
USED_REX (0);
if (ins->rex)
- names = ins->names8rex;
+ names = att_names8rex;
else
- names = ins->names8;
+ names = att_names8;
break;
case w_mode:
- names = ins->names16;
+ names = att_names16;
break;
case d_mode:
case dw_mode:
case db_mode:
- names = ins->names32;
+ names = att_names32;
break;
case q_mode:
- names = ins->names64;
+ names = att_names64;
break;
case m_mode:
case v_bnd_mode:
- names = ins->address_mode == mode_64bit ? ins->names64 : ins->names32;
+ names = ins->address_mode == mode_64bit ? att_names64 : att_names32;
break;
case bnd_mode:
case bnd_swap_mode:
@@ -11322,12 +11209,12 @@ print_register (instr_info *ins, unsigne
oappend (ins, "(bad)");
return;
}
- names = ins->names_bnd;
+ names = att_names_bnd;
break;
case indir_v_mode:
if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
{
- names = ins->names64;
+ names = att_names64;
break;
}
/* Fall through. */
@@ -11335,7 +11222,7 @@ print_register (instr_info *ins, unsigne
if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
|| (ins->rex & REX_W)))
{
- names = ins->names64;
+ names = att_names64;
break;
}
bytemode = v_mode;
@@ -11345,37 +11232,37 @@ print_register (instr_info *ins, unsigne
case dq_mode:
USED_REX (REX_W);
if (ins->rex & REX_W)
- names = ins->names64;
+ names = att_names64;
else if (bytemode != v_mode && bytemode != v_swap_mode)
- names = ins->names32;
+ names = att_names32;
else
{
if (sizeflag & DFLAG)
- names = ins->names32;
+ names = att_names32;
else
- names = ins->names16;
+ names = att_names16;
ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
}
break;
case movsxd_mode:
if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
- names = ins->names16;
+ names = att_names16;
else
- names = ins->names32;
+ names = att_names32;
ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
break;
case va_mode:
names = (ins->address_mode == mode_64bit
- ? ins->names64 : ins->names32);
+ ? att_names64 : att_names32);
if (!(ins->prefixes & PREFIX_ADDR))
names = (ins->address_mode == mode_16bit
- ? ins->names16 : names);
+ ? att_names16 : names);
else
{
/* Remove "addr16/addr32". */
ins->all_prefixes[ins->last_addr_prefix] = 0;
names = (ins->address_mode != mode_32bit
- ? ins->names32 : ins->names16);
+ ? att_names32 : att_names16);
ins->used_prefixes |= PREFIX_ADDR;
}
break;
@@ -11386,7 +11273,7 @@ print_register (instr_info *ins, unsigne
oappend (ins, "(bad)");
return;
}
- names = ins->names_mask;
+ names = att_names_mask;
break;
case 0:
return;
@@ -11394,7 +11281,7 @@ print_register (instr_info *ins, unsigne
oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
return;
}
- oappend (ins, names[reg]);
+ oappend_maybe_intel (ins, names[reg]);
}
static void
@@ -11687,8 +11574,9 @@ OP_E_memory (instr_info *ins, int bytemo
}
*ins->obufp = '\0';
if (havebase)
- oappend (ins, ins->address_mode == mode_64bit && !addr32flag
- ? ins->names64[rbase] : ins->names32[rbase]);
+ oappend_maybe_intel (ins,
+ (ins->address_mode == mode_64bit && !addr32flag
+ ? att_names64 : att_names32)[rbase]);
if (havesib)
{
/* ESP/RSP won't allow index. If base isn't ESP/RSP,
@@ -11711,8 +11599,10 @@ OP_E_memory (instr_info *ins, int bytemo
oappend (ins, "(bad)");
}
else
- oappend (ins, ins->address_mode == mode_64bit && !addr32flag
- ? ins->index64 : ins->index32);
+ oappend_maybe_intel (ins,
+ ins->address_mode == mode_64bit
+ && !addr32flag ? att_index64
+ : att_index32);
*ins->obufp++ = ins->scale_char;
*ins->obufp = '\0';
@@ -11764,7 +11654,7 @@ OP_E_memory (instr_info *ins, int bytemo
{
if (!ins->active_seg_prefix)
{
- oappend (ins, ins->names_seg[ds_reg - es_reg]);
+ oappend_maybe_intel (ins, att_names_seg[ds_reg - es_reg]);
oappend (ins, ":");
}
print_operand_value (ins, ins->scratchbuf, 1, disp);
@@ -11849,7 +11739,7 @@ OP_E_memory (instr_info *ins, int bytemo
{
if (!ins->active_seg_prefix)
{
- oappend (ins, ins->names_seg[ds_reg - es_reg]);
+ oappend_maybe_intel (ins, att_names_seg[ds_reg - es_reg]);
oappend (ins, ":");
}
print_operand_value (ins, ins->scratchbuf, 1, disp & 0xffff);
@@ -12065,7 +11955,7 @@ OP_REG (instr_info *ins, int code, int s
{
case es_reg: case ss_reg: case cs_reg:
case ds_reg: case fs_reg: case gs_reg:
- oappend (ins, ins->names_seg[code - es_reg]);
+ oappend_maybe_intel (ins, att_names_seg[code - es_reg]);
return;
}
@@ -12079,23 +11969,23 @@ OP_REG (instr_info *ins, int code, int s
{
case ax_reg: case cx_reg: case dx_reg: case bx_reg:
case sp_reg: case bp_reg: case si_reg: case di_reg:
- s = ins->names16[code - ax_reg + add];
+ s = att_names16[code - ax_reg + add];
break;
case ah_reg: case ch_reg: case dh_reg: case bh_reg:
USED_REX (0);
/* Fall through. */
case al_reg: case cl_reg: case dl_reg: case bl_reg:
if (ins->rex)
- s = ins->names8rex[code - al_reg + add];
+ s = att_names8rex[code - al_reg + add];
else
- s = ins->names8[code - al_reg];
+ s = att_names8[code - al_reg];
break;
case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
if (ins->address_mode == mode_64bit
&& ((sizeflag & DFLAG) || (ins->rex & REX_W)))
{
- s = ins->names64[code - rAX_reg + add];
+ s = att_names64[code - rAX_reg + add];
break;
}
code += eAX_reg - rAX_reg;
@@ -12104,21 +11994,21 @@ OP_REG (instr_info *ins, int code, int s
case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
USED_REX (REX_W);
if (ins->rex & REX_W)
- s = ins->names64[code - eAX_reg + add];
+ s = att_names64[code - eAX_reg + add];
else
{
if (sizeflag & DFLAG)
- s = ins->names32[code - eAX_reg + add];
+ s = att_names32[code - eAX_reg + add];
else
- s = ins->names16[code - eAX_reg + add];
+ s = att_names16[code - eAX_reg + add];
ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
}
break;
default:
- s = INTERNAL_DISASSEMBLER_ERROR;
- break;
+ oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
+ return;
}
- oappend (ins, s);
+ oappend_maybe_intel (ins, s);
}
static void
@@ -12129,35 +12019,37 @@ OP_IMREG (instr_info *ins, int code, int
switch (code)
{
case indir_dx_reg:
- if (ins->intel_syntax)
- s = "dx";
- else
- s = "(%dx)";
+ if (!ins->intel_syntax)
+ {
+ oappend (ins, "(%dx)");
+ return;
+ }
+ s = att_names16[dx_reg - ax_reg];
break;
case al_reg: case cl_reg:
- s = ins->names8[code - al_reg];
+ s = att_names8[code - al_reg];
break;
case eAX_reg:
USED_REX (REX_W);
if (ins->rex & REX_W)
{
- s = *ins->names64;
+ s = *att_names64;
break;
}
/* Fall through. */
case z_mode_ax_reg:
if ((ins->rex & REX_W) || (sizeflag & DFLAG))
- s = *ins->names32;
+ s = *att_names32;
else
- s = *ins->names16;
+ s = *att_names16;
if (!(ins->rex & REX_W))
ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
break;
default:
- s = INTERNAL_DISASSEMBLER_ERROR;
- break;
+ oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
+ return;
}
- oappend (ins, s);
+ oappend_maybe_intel (ins, s);
}
static void
@@ -12342,7 +12234,7 @@ static void
OP_SEG (instr_info *ins, int bytemode, int sizeflag)
{
if (bytemode == w_mode)
- oappend (ins, ins->names_seg[ins->modrm.reg]);
+ oappend_maybe_intel (ins, att_names_seg[ins->modrm.reg]);
else
OP_E (ins, ins->modrm.mod == 3 ? bytemode : w_mode, sizeflag);
}
@@ -12388,7 +12280,7 @@ OP_OFF (instr_info *ins, int bytemode, i
{
if (!ins->active_seg_prefix)
{
- oappend (ins, ins->names_seg[ds_reg - es_reg]);
+ oappend_maybe_intel (ins, att_names_seg[ds_reg - es_reg]);
oappend (ins, ":");
}
}
@@ -12418,7 +12310,7 @@ OP_OFF64 (instr_info *ins, int bytemode,
{
if (!ins->active_seg_prefix)
{
- oappend (ins, ins->names_seg[ds_reg - es_reg]);
+ oappend_maybe_intel (ins, att_names_seg[ds_reg - es_reg]);
oappend (ins, ":");
}
}
@@ -12436,15 +12328,15 @@ ptr_reg (instr_info *ins, int code, int
if (ins->address_mode == mode_64bit)
{
if (!(sizeflag & AFLAG))
- s = ins->names32[code - eAX_reg];
+ s = att_names32[code - eAX_reg];
else
- s = ins->names64[code - eAX_reg];
+ s = att_names64[code - eAX_reg];
}
else if (sizeflag & AFLAG)
- s = ins->names32[code - eAX_reg];
+ s = att_names32[code - eAX_reg];
else
- s = ins->names16[code - eAX_reg];
- oappend (ins, s);
+ s = att_names16[code - eAX_reg];
+ oappend_maybe_intel (ins, s);
*ins->obufp++ = ins->close_char;
*ins->obufp = 0;
}
@@ -12557,14 +12449,14 @@ OP_MMX (instr_info *ins, int bytemode AT
ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
if (ins->prefixes & PREFIX_DATA)
{
- names = ins->names_xmm;
+ names = att_names_xmm;
USED_REX (REX_R);
if (ins->rex & REX_R)
reg += 8;
}
else
- names = ins->names_mm;
- oappend (ins, names[reg]);
+ names = att_names_mm;
+ oappend_maybe_intel (ins, names[reg]);
}
static void
@@ -12580,17 +12472,17 @@ print_vector_reg (instr_info *ins, unsig
{
case 128:
case 256:
- names = ins->names_xmm;
+ names = att_names_xmm;
break;
case 512:
- names = ins->names_ymm;
+ names = att_names_ymm;
break;
default:
abort ();
}
}
else if (bytemode == ymm_mode)
- names = ins->names_ymm;
+ names = att_names_ymm;
else if (bytemode == tmm_mode)
{
if (reg >= 8)
@@ -12598,7 +12490,7 @@ print_vector_reg (instr_info *ins, unsig
oappend (ins, "(bad)");
return;
}
- names = ins->names_tmm;
+ names = att_names_tmm;
}
else if (ins->need_vex
&& bytemode != xmm_mode
@@ -12615,29 +12507,29 @@ print_vector_reg (instr_info *ins, unsig
switch (ins->vex.length)
{
case 128:
- names = ins->names_xmm;
+ names = att_names_xmm;
break;
case 256:
if (ins->vex.w
|| bytemode != vex_vsib_q_w_dq_mode)
- names = ins->names_ymm;
+ names = att_names_ymm;
else
- names = ins->names_xmm;
+ names = att_names_xmm;
break;
case 512:
if (ins->vex.w
|| bytemode != vex_vsib_q_w_dq_mode)
- names = ins->names_zmm;
+ names = att_names_zmm;
else
- names = ins->names_ymm;
+ names = att_names_ymm;
break;
default:
abort ();
}
}
else
- names = ins->names_xmm;
- oappend (ins, names[reg]);
+ names = att_names_xmm;
+ oappend_maybe_intel (ins, names[reg]);
}
static void
@@ -12690,14 +12582,14 @@ OP_EM (instr_info *ins, int bytemode, in
reg = ins->modrm.rm;
if (ins->prefixes & PREFIX_DATA)
{
- names = ins->names_xmm;
+ names = att_names_xmm;
USED_REX (REX_B);
if (ins->rex & REX_B)
reg += 8;
}
else
- names = ins->names_mm;
- oappend (ins, names[reg]);
+ names = att_names_mm;
+ oappend_maybe_intel (ins, names[reg]);
}
/* cvt* are the only instructions in sse2 which have
@@ -12723,7 +12615,7 @@ OP_EMC (instr_info *ins, int bytemode, i
MODRM_CHECK;
ins->codep++;
ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
- oappend (ins, ins->names_mm[ins->modrm.rm]);
+ oappend_maybe_intel (ins, att_names_mm[ins->modrm.rm]);
}
static void
@@ -12731,7 +12623,7 @@ OP_MXC (instr_info *ins, int bytemode AT
int sizeflag ATTRIBUTE_UNUSED)
{
ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
- oappend (ins, ins->names_mm[ins->modrm.reg]);
+ oappend_maybe_intel (ins, att_names_mm[ins->modrm.reg]);
}
static void
@@ -13018,10 +12910,10 @@ OP_Mwait (instr_info *ins, int bytemode,
/* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
if (!ins->intel_syntax)
{
- strcpy (ins->op_out[0], ins->names32[0]);
- strcpy (ins->op_out[1], ins->names32[1]);
+ strcpy (ins->op_out[0], att_names32[0] + ins->intel_syntax);
+ strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
if (bytemode == eBX_reg)
- strcpy (ins->op_out[2], ins->names32[3]);
+ strcpy (ins->op_out[2], att_names32[3] + ins->intel_syntax);
ins->two_source_ops = 1;
}
/* Skip mod/rm byte. */
@@ -13037,21 +12929,21 @@ OP_Monitor (instr_info *ins, int bytemod
if (!ins->intel_syntax)
{
const char *const *names = (ins->address_mode == mode_64bit
- ? ins->names64 : ins->names32);
+ ? att_names64 : att_names32);
if (ins->prefixes & PREFIX_ADDR)
{
/* Remove "addr16/addr32". */
ins->all_prefixes[ins->last_addr_prefix] = 0;
names = (ins->address_mode != mode_32bit
- ? ins->names32 : ins->names16);
+ ? att_names32 : att_names16);
ins->used_prefixes |= PREFIX_ADDR;
}
else if (ins->address_mode == mode_16bit)
- names = ins->names16;
- strcpy (ins->op_out[0], names[0]);
- strcpy (ins->op_out[1], ins->names32[1]);
- strcpy (ins->op_out[2], ins->names32[2]);
+ names = att_names16;
+ strcpy (ins->op_out[0], names[0] + ins->intel_syntax);
+ strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
+ strcpy (ins->op_out[2], att_names32[2] + ins->intel_syntax);
ins->two_source_ops = 1;
}
/* Skip mod/rm byte. */
@@ -13213,25 +13105,22 @@ CMPXCHG8B_Fixup (instr_info *ins, int by
static void
XMM_Fixup (instr_info *ins, int reg, int sizeflag ATTRIBUTE_UNUSED)
{
- const char *const *names;
+ const char *const *names = att_names_xmm;
if (ins->need_vex)
{
switch (ins->vex.length)
{
case 128:
- names = ins->names_xmm;
break;
case 256:
- names = ins->names_ymm;
+ names = att_names_ymm;
break;
default:
abort ();
}
}
- else
- names = ins->names_xmm;
- oappend (ins, names[reg]);
+ oappend_maybe_intel (ins, names[reg]);
}
static void
@@ -13280,7 +13169,7 @@ OP_VEX (instr_info *ins, int bytemode, i
switch (bytemode)
{
case scalar_mode:
- oappend (ins, ins->names_xmm[reg]);
+ oappend_maybe_intel (ins, att_names_xmm[reg]);
return;
case vex_vsib_d_w_dq_mode:
@@ -13291,9 +13180,9 @@ OP_VEX (instr_info *ins, int bytemode, i
if (ins->vex.length == 128
|| (bytemode != vex_vsib_d_w_dq_mode
&& !ins->vex.w))
- oappend (ins, ins->names_xmm[reg]);
+ oappend_maybe_intel (ins, att_names_xmm[reg]);
else
- oappend (ins, ins->names_ymm[reg]);
+ oappend_maybe_intel (ins, att_names_ymm[reg]);
/* All 3 XMM/YMM registers must be distinct. */
modrm_reg = ins->modrm.reg;
@@ -13325,7 +13214,7 @@ OP_VEX (instr_info *ins, int bytemode, i
/* This must be the 3rd operand. */
if (ins->obufp != ins->op_out[2])
abort ();
- oappend (ins, ins->names_tmm[reg]);
+ oappend_maybe_intel (ins, att_names_tmm[reg]);
if (reg == ins->modrm.reg || reg == ins->modrm.rm)
strcpy (ins->obufp, "/(bad)");
}
@@ -13350,13 +13239,13 @@ OP_VEX (instr_info *ins, int bytemode, i
switch (bytemode)
{
case x_mode:
- names = ins->names_xmm;
+ names = att_names_xmm;
break;
case dq_mode:
if (ins->rex & REX_W)
- names = ins->names64;
+ names = att_names64;
else
- names = ins->names32;
+ names = att_names32;
break;
case mask_bd_mode:
case mask_mode:
@@ -13365,7 +13254,7 @@ OP_VEX (instr_info *ins, int bytemode, i
oappend (ins, "(bad)");
return;
}
- names = ins->names_mask;
+ names = att_names_mask;
break;
default:
abort ();
@@ -13376,7 +13265,7 @@ OP_VEX (instr_info *ins, int bytemode, i
switch (bytemode)
{
case x_mode:
- names = ins->names_ymm;
+ names = att_names_ymm;
break;
case mask_bd_mode:
case mask_mode:
@@ -13385,7 +13274,7 @@ OP_VEX (instr_info *ins, int bytemode, i
oappend (ins, "(bad)");
return;
}
- names = ins->names_mask;
+ names = att_names_mask;
break;
default:
/* See PR binutils/20893 for a reproducer. */
@@ -13394,13 +13283,13 @@ OP_VEX (instr_info *ins, int bytemode, i
}
break;
case 512:
- names = ins->names_zmm;
+ names = att_names_zmm;
break;
default:
abort ();
break;
}
- oappend (ins, names[reg]);
+ oappend_maybe_intel (ins, names[reg]);
}
static void
@@ -13428,7 +13317,7 @@ static void
OP_REG_VexI4 (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
{
int reg;
- const char *const *names = ins->names_xmm;
+ const char *const *names = att_names_xmm;
FETCH_DATA (ins->info, ins->codep + 1);
reg = *ins->codep++;
@@ -13441,9 +13330,9 @@ OP_REG_VexI4 (instr_info *ins, int bytem
reg &= 7;
if (bytemode == x_mode && ins->vex.length == 256)
- names = ins->names_ymm;
+ names = att_names_ymm;
- oappend (ins, names[reg]);
+ oappend_maybe_intel (ins, names[reg]);
if (ins->vex.w)
{
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 4/5] x86: drop index16 field
2022-01-14 13:51 [PATCH 0/5] x86: adjustments to struct instr_info (and more) Jan Beulich
` (2 preceding siblings ...)
2022-01-14 13:53 ` [PATCH 3/5] x86: drop most Intel syntax register name arrays Jan Beulich
@ 2022-01-14 13:53 ` Jan Beulich
2022-01-14 13:54 ` [PATCH 5/5] x86: adjust struct instr_info field types Jan Beulich
2022-01-14 14:36 ` [PATCH 0/5] x86: adjustments to struct instr_info (and more) H.J. Lu
5 siblings, 0 replies; 7+ messages in thread
From: Jan Beulich @ 2022-01-14 13:53 UTC (permalink / raw)
To: Binutils
There's a single use on a generally infrequently taken code path. Put the
necessary conditional there instead.
--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -219,8 +219,6 @@ struct instr_info
vex;
unsigned char need_vex;
- const char *const *index16;
-
/* Remember if the current op is a jump instruction. */
bool op_is_jump;
@@ -9404,7 +9402,6 @@ print_insn (bfd_vma pc, instr_info *ins)
if (ins->intel_syntax)
{
- ins->index16 = intel_index16;
ins->open_char = '[';
ins->close_char = ']';
ins->separator_char = '+';
@@ -9412,7 +9409,6 @@ print_insn (bfd_vma pc, instr_info *ins)
}
else
{
- ins->index16 = att_index16;
ins->open_char = '(';
ins->close_char = ')';
ins->separator_char = ',';
@@ -11712,7 +11708,9 @@ OP_E_memory (instr_info *ins, int bytemo
{
*ins->obufp++ = ins->open_char;
*ins->obufp = '\0';
- oappend (ins, ins->index16[ins->modrm.rm]);
+ oappend (ins,
+ (ins->intel_syntax ? intel_index16
+ : att_index16)[ins->modrm.rm]);
if (ins->intel_syntax
&& (disp || ins->modrm.mod != 0 || ins->modrm.rm == 6))
{
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 5/5] x86: adjust struct instr_info field types
2022-01-14 13:51 [PATCH 0/5] x86: adjustments to struct instr_info (and more) Jan Beulich
` (3 preceding siblings ...)
2022-01-14 13:53 ` [PATCH 4/5] x86: drop index16 field Jan Beulich
@ 2022-01-14 13:54 ` Jan Beulich
2022-01-14 14:36 ` [PATCH 0/5] x86: adjustments to struct instr_info (and more) H.J. Lu
5 siblings, 0 replies; 7+ messages in thread
From: Jan Beulich @ 2022-01-14 13:54 UTC (permalink / raw)
To: Binutils
Now that this lives on the stack, let's have it be a little less
wasteful in terms of space. Switch boolean fields to "bool" (also when
this doesn't change their size) and also limit the widths of "rex",
"rex_used", "op_ad", and "op_index". Do a little bit of re-ordering as
well to limit the number of padding holes.
---
Obviously we could go further and use bitfields.
--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -147,9 +147,12 @@ struct instr_info
int prefixes;
/* REX prefix the current instruction. See below. */
- int rex;
+ unsigned char rex;
/* Bits of REX we've already used. */
- int rex_used;
+ unsigned char rex_used;
+
+ bool need_modrm;
+ bool need_vex;
/* Flags for ins->prefixes which we somehow handled when printing the
current instruction. */
@@ -191,7 +194,6 @@ struct instr_info
int rm;
}
modrm;
- unsigned char need_modrm;
struct
{
@@ -206,25 +208,26 @@ struct instr_info
int register_specifier;
int length;
int prefix;
- int w;
- int evex;
- int r;
- int v;
int mask_register_specifier;
- int zeroing;
int ll;
- int b;
- int no_broadcast;
+ bool w;
+ bool evex;
+ bool r;
+ bool v;
+ bool zeroing;
+ bool b;
+ bool no_broadcast;
}
vex;
- unsigned char need_vex;
/* Remember if the current op is a jump instruction. */
bool op_is_jump;
+ bool two_source_ops;
+
+ unsigned char op_ad;
+ signed char op_index[MAX_OPERANDS];
char op_out[MAX_OPERANDS][100];
- int op_ad, op_index[MAX_OPERANDS];
- int two_source_ops;
bfd_vma op_address[MAX_OPERANDS];
bfd_vma op_riprel[MAX_OPERANDS];
bfd_vma start_pc;
@@ -237,7 +240,7 @@ struct instr_info
* The function returns the length of this instruction in bytes.
*/
char intel_syntax;
- char intel_mnemonic;
+ bool intel_mnemonic;
char open_char;
char close_char;
char separator_char;
@@ -2348,7 +2351,7 @@ static const struct dis386 dis386_twobyt
{ "ud0S", { Gv, Ev }, 0 },
};
-static const unsigned char onebyte_has_modrm[256] = {
+static const bool onebyte_has_modrm[256] = {
/* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
/* ------------------------------- */
/* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
@@ -2371,7 +2374,7 @@ static const unsigned char onebyte_has_m
/* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
};
-static const unsigned char twobyte_has_modrm[256] = {
+static const bool twobyte_has_modrm[256] = {
/* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
/* ------------------------------- */
/* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
@@ -9029,7 +9032,7 @@ get_valid_dis386 (const struct dis386 *d
ins->vex.prefix = REPNE_PREFIX_OPCODE;
break;
}
- ins->need_vex = 1;
+ ins->need_vex = true;
ins->codep++;
vindex = *ins->codep++;
dp = &xop_table[vex_table_index][vindex];
@@ -9095,7 +9098,7 @@ get_valid_dis386 (const struct dis386 *d
ins->vex.prefix = REPNE_PREFIX_OPCODE;
break;
}
- ins->need_vex = 1;
+ ins->need_vex = true;
ins->codep++;
vindex = *ins->codep++;
dp = &vex_table[vex_table_index][vindex];
@@ -9133,7 +9136,7 @@ get_valid_dis386 (const struct dis386 *d
ins->vex.prefix = REPNE_PREFIX_OPCODE;
break;
}
- ins->need_vex = 1;
+ ins->need_vex = true;
ins->codep++;
vindex = *ins->codep++;
dp = &vex_table[dp->op[1].bytemode][vindex];
@@ -9152,13 +9155,13 @@ get_valid_dis386 (const struct dis386 *d
if (!ins->need_vex)
abort ();
- dp = &vex_w_table[dp->op[1].bytemode][ins->vex.w ? 1 : 0];
+ dp = &vex_w_table[dp->op[1].bytemode][ins->vex.w];
break;
case USE_EVEX_TABLE:
- ins->two_source_ops = 0;
+ ins->two_source_ops = false;
/* EVEX prefix. */
- ins->vex.evex = 1;
+ ins->vex.evex = true;
FETCH_DATA (ins->info, ins->codep + 4);
/* The first byte after 0x62. */
ins->rex = ~(*ins->codep >> 5) & 0x7;
@@ -9216,7 +9219,7 @@ get_valid_dis386 (const struct dis386 *d
/* Remember the static rounding bits. */
ins->vex.ll = (*ins->codep >> 5) & 3;
- ins->vex.b = (*ins->codep & 0x10) != 0;
+ ins->vex.b = *ins->codep & 0x10;
ins->vex.v = *ins->codep & 0x8;
ins->vex.mask_register_specifier = *ins->codep & 0x7;
@@ -9226,10 +9229,10 @@ get_valid_dis386 (const struct dis386 *d
{
/* In 16/32-bit mode silently ignore following bits. */
ins->rex &= ~REX_B;
- ins->vex.r = 1;
+ ins->vex.r = true;
}
- ins->need_vex = 1;
+ ins->need_vex = true;
ins->codep++;
vindex = *ins->codep++;
dp = &evex_table[vex_table_index][vindex];
@@ -9353,13 +9356,13 @@ print_insn (bfd_vma pc, instr_info *ins)
{
ins->intel_syntax = 1;
if (startswith (p + 5, "-mnemonic"))
- ins->intel_mnemonic = 1;
+ ins->intel_mnemonic = true;
}
else if (startswith (p, "att"))
{
ins->intel_syntax = 0;
if (startswith (p + 3, "-mnemonic"))
- ins->intel_mnemonic = 0;
+ ins->intel_mnemonic = false;
}
else if (startswith (p, "addr"))
{
@@ -9535,7 +9538,7 @@ print_insn (bfd_vma pc, instr_info *ins)
else
memset (&ins->modrm, 0, sizeof (ins->modrm));
- ins->need_vex = 0;
+ ins->need_vex = false;
memset (&ins->vex, 0, sizeof (ins->vex));
if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
@@ -10402,7 +10405,7 @@ putop (instr_info *ins, const char *in_t
}
else if (l == 1 && last[0] == 'X')
{
- if (ins->vex.w == 0)
+ if (!ins->vex.w)
*ins->obufp++ = 'h';
else
oappend (ins, "{bad}");
@@ -10922,7 +10925,7 @@ intel_operand_size (instr_info *ins, int
oappend (ins, "WORD PTR ");
break;
default:
- ins->vex.no_broadcast = 1;
+ ins->vex.no_broadcast = true;
break;
}
return;
@@ -11750,7 +11753,7 @@ OP_E_memory (instr_info *ins, int bytemo
/* Broadcast can only ever be valid for memory sources. */
if (ins->obufp == ins->op_out[0])
- ins->vex.no_broadcast = 1;
+ ins->vex.no_broadcast = true;
if (!ins->vex.no_broadcast)
{
@@ -11778,7 +11781,7 @@ OP_E_memory (instr_info *ins, int bytemo
}
else if (bytemode == q_mode
|| bytemode == ymmq_mode)
- ins->vex.no_broadcast = 1;
+ ins->vex.no_broadcast = true;
else if (ins->vex.w
|| bytemode == evex_half_bcst_xmmqdh_mode
|| bytemode == evex_half_bcst_xmmq_mode)
@@ -11817,7 +11820,7 @@ OP_E_memory (instr_info *ins, int bytemo
}
}
else
- ins->vex.no_broadcast = 1;
+ ins->vex.no_broadcast = true;
}
if (ins->vex.no_broadcast)
oappend (ins, "{bad}");
@@ -12547,7 +12550,7 @@ OP_XMM (instr_info *ins, int bytemode, i
if (bytemode == tmm_mode)
ins->modrm.reg = reg;
else if (bytemode == scalar_mode)
- ins->vex.no_broadcast = 1;
+ ins->vex.no_broadcast = true;
print_vector_reg (ins, reg, bytemode);
}
@@ -12912,7 +12915,7 @@ OP_Mwait (instr_info *ins, int bytemode,
strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
if (bytemode == eBX_reg)
strcpy (ins->op_out[2], att_names32[3] + ins->intel_syntax);
- ins->two_source_ops = 1;
+ ins->two_source_ops = true;
}
/* Skip mod/rm byte. */
MODRM_CHECK;
@@ -12942,7 +12945,7 @@ OP_Monitor (instr_info *ins, int bytemod
strcpy (ins->op_out[0], names[0] + ins->intel_syntax);
strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
strcpy (ins->op_out[2], att_names32[2] + ins->intel_syntax);
- ins->two_source_ops = 1;
+ ins->two_source_ops = true;
}
/* Skip mod/rm byte. */
MODRM_CHECK;
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 0/5] x86: adjustments to struct instr_info (and more)
2022-01-14 13:51 [PATCH 0/5] x86: adjustments to struct instr_info (and more) Jan Beulich
` (4 preceding siblings ...)
2022-01-14 13:54 ` [PATCH 5/5] x86: adjust struct instr_info field types Jan Beulich
@ 2022-01-14 14:36 ` H.J. Lu
5 siblings, 0 replies; 7+ messages in thread
From: H.J. Lu @ 2022-01-14 14:36 UTC (permalink / raw)
To: Jan Beulich; +Cc: Binutils
On Fri, Jan 14, 2022 at 5:51 AM Jan Beulich <jbeulich@suse.com> wrote:
>
> Some of this I was meaning to do for a long time, and now it (and
> further aspects) have been prompted by the thread-safety rework
>
> 1: constify disassembler static data
> 2: fold variables in memory operand index handling
> 3: drop most Intel syntax register name arrays
> 4: drop index16 field
> 5: adjust struct instr_info field types
>
> Jan
>
OK for all.
Thanks.
--
H.J.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-01-14 14:37 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-14 13:51 [PATCH 0/5] x86: adjustments to struct instr_info (and more) Jan Beulich
2022-01-14 13:52 ` [PATCH 1/5] x86: constify disassembler static data Jan Beulich
2022-01-14 13:52 ` [PATCH 2/5] x86: fold variables in memory operand index handling Jan Beulich
2022-01-14 13:53 ` [PATCH 3/5] x86: drop most Intel syntax register name arrays Jan Beulich
2022-01-14 13:53 ` [PATCH 4/5] x86: drop index16 field Jan Beulich
2022-01-14 13:54 ` [PATCH 5/5] x86: adjust struct instr_info field types Jan Beulich
2022-01-14 14:36 ` [PATCH 0/5] x86: adjustments to struct instr_info (and more) H.J. Lu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).