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:
Jan Beulich
2022-01-17 10:25:40 +01:00
parent 2a78304e29
commit e1f9fbb8ad

@ -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)");
} }