mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 14:49:38 +08:00
x86: fold variables in memory operand index handling
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().
This commit is contained in:
@ -11512,7 +11512,6 @@ OP_E_memory (instr_info *ins, int bytemode, int sizeflag)
|
|||||||
int havedisp;
|
int havedisp;
|
||||||
int havesib;
|
int havesib;
|
||||||
int havebase;
|
int havebase;
|
||||||
int haveindex;
|
|
||||||
int needindex;
|
int needindex;
|
||||||
int needaddr32;
|
int needaddr32;
|
||||||
int base, rbase;
|
int base, rbase;
|
||||||
@ -11524,12 +11523,10 @@ OP_E_memory (instr_info *ins, int bytemode, int sizeflag)
|
|||||||
|| bytemode == bnd_mode
|
|| bytemode == bnd_mode
|
||||||
|| bytemode == bnd_swap_mode);
|
|| bytemode == bnd_swap_mode);
|
||||||
bool check_gather = false;
|
bool check_gather = false;
|
||||||
const char *const *indexes64 = ins->names64;
|
const char *const *indexes = NULL;
|
||||||
const char *const *indexes32 = ins->names32;
|
|
||||||
|
|
||||||
havesib = 0;
|
havesib = 0;
|
||||||
havebase = 1;
|
havebase = 1;
|
||||||
haveindex = 0;
|
|
||||||
base = ins->modrm.rm;
|
base = ins->modrm.rm;
|
||||||
|
|
||||||
if (base == 4)
|
if (base == 4)
|
||||||
@ -11552,32 +11549,33 @@ OP_E_memory (instr_info *ins, int bytemode, int sizeflag)
|
|||||||
check_gather = ins->obufp == ins->op_out[1];
|
check_gather = ins->obufp == ins->op_out[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
haveindex = 1;
|
|
||||||
switch (ins->vex.length)
|
switch (ins->vex.length)
|
||||||
{
|
{
|
||||||
case 128:
|
case 128:
|
||||||
indexes64 = indexes32 = ins->names_xmm;
|
indexes = att_names_xmm;
|
||||||
break;
|
break;
|
||||||
case 256:
|
case 256:
|
||||||
if (!ins->vex.w
|
if (!ins->vex.w
|
||||||
|| bytemode == vex_vsib_q_w_dq_mode)
|
|| bytemode == vex_vsib_q_w_dq_mode)
|
||||||
indexes64 = indexes32 = ins->names_ymm;
|
indexes = att_names_ymm;
|
||||||
else
|
else
|
||||||
indexes64 = indexes32 = ins->names_xmm;
|
indexes = att_names_xmm;
|
||||||
break;
|
break;
|
||||||
case 512:
|
case 512:
|
||||||
if (!ins->vex.w
|
if (!ins->vex.w
|
||||||
|| bytemode == vex_vsib_q_w_dq_mode)
|
|| bytemode == vex_vsib_q_w_dq_mode)
|
||||||
indexes64 = indexes32 = ins->names_zmm;
|
indexes = att_names_zmm;
|
||||||
else
|
else
|
||||||
indexes64 = indexes32 = ins->names_ymm;
|
indexes = att_names_ymm;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
haveindex = vindex != 4;
|
if (vindex != 4)
|
||||||
|
indexes = ins->address_mode == mode_64bit && !addr32flag
|
||||||
|
? att_names64 : att_names32;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
scale = ins->sib.scale;
|
scale = ins->sib.scale;
|
||||||
@ -11630,7 +11628,7 @@ OP_E_memory (instr_info *ins, int bytemode, int sizeflag)
|
|||||||
needaddr32 = 0;
|
needaddr32 = 0;
|
||||||
if (havesib
|
if (havesib
|
||||||
&& !havebase
|
&& !havebase
|
||||||
&& !haveindex
|
&& !indexes
|
||||||
&& ins->address_mode != mode_16bit)
|
&& ins->address_mode != mode_16bit)
|
||||||
{
|
{
|
||||||
if (ins->address_mode == mode_64bit)
|
if (ins->address_mode == mode_64bit)
|
||||||
@ -11654,7 +11652,7 @@ OP_E_memory (instr_info *ins, int bytemode, int sizeflag)
|
|||||||
|
|
||||||
havedisp = (havebase
|
havedisp = (havebase
|
||||||
|| needindex
|
|| needindex
|
||||||
|| (havesib && (haveindex || scale != 0)));
|
|| (havesib && (indexes || scale != 0)));
|
||||||
|
|
||||||
if (!ins->intel_syntax)
|
if (!ins->intel_syntax)
|
||||||
if (ins->modrm.mod != 0 || base == 5)
|
if (ins->modrm.mod != 0 || base == 5)
|
||||||
@ -11671,7 +11669,7 @@ OP_E_memory (instr_info *ins, int bytemode, int sizeflag)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((havebase || haveindex || needindex || needaddr32 || riprel)
|
if ((havebase || indexes || needindex || needaddr32 || riprel)
|
||||||
&& (ins->address_mode != mode_64bit
|
&& (ins->address_mode != mode_64bit
|
||||||
|| ((bytemode != v_bnd_mode)
|
|| ((bytemode != v_bnd_mode)
|
||||||
&& (bytemode != v_bndmk_mode)
|
&& (bytemode != v_bndmk_mode)
|
||||||
@ -11697,7 +11695,7 @@ OP_E_memory (instr_info *ins, int bytemode, int sizeflag)
|
|||||||
print index to tell base + index from base. */
|
print index to tell base + index from base. */
|
||||||
if (scale != 0
|
if (scale != 0
|
||||||
|| needindex
|
|| needindex
|
||||||
|| haveindex
|
|| indexes
|
||||||
|| (havebase && base != ESP_REG_NUM))
|
|| (havebase && base != ESP_REG_NUM))
|
||||||
{
|
{
|
||||||
if (!ins->intel_syntax || havebase)
|
if (!ins->intel_syntax || havebase)
|
||||||
@ -11705,12 +11703,10 @@ OP_E_memory (instr_info *ins, int bytemode, int sizeflag)
|
|||||||
*ins->obufp++ = ins->separator_char;
|
*ins->obufp++ = ins->separator_char;
|
||||||
*ins->obufp = '\0';
|
*ins->obufp = '\0';
|
||||||
}
|
}
|
||||||
if (haveindex)
|
if (indexes)
|
||||||
{
|
{
|
||||||
if (ins->address_mode == mode_64bit || vindex < 16)
|
if (ins->address_mode == mode_64bit || vindex < 16)
|
||||||
oappend (ins, ins->address_mode == mode_64bit
|
oappend_maybe_intel (ins, indexes[vindex]);
|
||||||
&& !addr32flag
|
|
||||||
? indexes64[vindex] : indexes32[vindex]);
|
|
||||||
else
|
else
|
||||||
oappend (ins, "(bad)");
|
oappend (ins, "(bad)");
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user