mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-09-11 16:46:14 +08:00
Add SIB.
2010-05-26 H.J. Lu <hongjiu.lu@intel.com> * i386-dis.c (sib): New. (get_sib): Likewise. (print_insn): Call get_sib. OP_E_memory): Use sib.
This commit is contained in:
@ -1,3 +1,10 @@
|
|||||||
|
2010-05-26 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
* i386-dis.c (sib): New.
|
||||||
|
(get_sib): Likewise.
|
||||||
|
(print_insn): Call get_sib.
|
||||||
|
OP_E_memory): Use sib.
|
||||||
|
|
||||||
2010-05-26 Catherine Moore <clm@codesoourcery.com>
|
2010-05-26 Catherine Moore <clm@codesoourcery.com>
|
||||||
|
|
||||||
* mips-dis.c (mips_arch): Remove INSN_MIPS16.
|
* mips-dis.c (mips_arch): Remove INSN_MIPS16.
|
||||||
|
@ -2303,6 +2303,13 @@ static struct
|
|||||||
}
|
}
|
||||||
modrm;
|
modrm;
|
||||||
static unsigned char need_modrm;
|
static unsigned char need_modrm;
|
||||||
|
static struct
|
||||||
|
{
|
||||||
|
int scale;
|
||||||
|
int index;
|
||||||
|
int base;
|
||||||
|
}
|
||||||
|
sib;
|
||||||
static struct
|
static struct
|
||||||
{
|
{
|
||||||
int register_specifier;
|
int register_specifier;
|
||||||
@ -11243,6 +11250,22 @@ get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
|
|||||||
return get_valid_dis386 (dp, info);
|
return get_valid_dis386 (dp, info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
get_sib (disassemble_info *info)
|
||||||
|
{
|
||||||
|
/* If modrm.mod == 3, operand must be register. */
|
||||||
|
if (need_modrm
|
||||||
|
&& address_mode != mode_16bit
|
||||||
|
&& modrm.mod != 3
|
||||||
|
&& modrm.rm == 4)
|
||||||
|
{
|
||||||
|
FETCH_DATA (info, codep + 2);
|
||||||
|
sib.index = (codep [1] >> 3) & 7;
|
||||||
|
sib.scale = (codep [1] >> 6) & 3;
|
||||||
|
sib.base = codep [1] & 7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
print_insn (bfd_vma pc, disassemble_info *info)
|
print_insn (bfd_vma pc, disassemble_info *info)
|
||||||
{
|
{
|
||||||
@ -11528,6 +11551,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
|
|||||||
|
|
||||||
if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
|
if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
|
||||||
{
|
{
|
||||||
|
get_sib (info);
|
||||||
dofloat (sizeflag);
|
dofloat (sizeflag);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -11535,6 +11559,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
|
|||||||
dp = get_valid_dis386 (dp, info);
|
dp = get_valid_dis386 (dp, info);
|
||||||
if (dp != NULL && putop (dp->name, sizeflag) == 0)
|
if (dp != NULL && putop (dp->name, sizeflag) == 0)
|
||||||
{
|
{
|
||||||
|
get_sib (info);
|
||||||
for (i = 0; i < MAX_OPERANDS; ++i)
|
for (i = 0; i < MAX_OPERANDS; ++i)
|
||||||
{
|
{
|
||||||
obufp = op_out[i];
|
obufp = op_out[i];
|
||||||
@ -12935,10 +12960,9 @@ OP_E_memory (int bytemode, int sizeflag)
|
|||||||
if (base == 4)
|
if (base == 4)
|
||||||
{
|
{
|
||||||
havesib = 1;
|
havesib = 1;
|
||||||
FETCH_DATA (the_info, codep + 1);
|
vindex = sib.index;
|
||||||
vindex = (*codep >> 3) & 7;
|
scale = sib.scale;
|
||||||
scale = (*codep >> 6) & 3;
|
base = sib.base;
|
||||||
base = *codep & 7;
|
|
||||||
USED_REX (REX_X);
|
USED_REX (REX_X);
|
||||||
if (rex & REX_X)
|
if (rex & REX_X)
|
||||||
vindex += 8;
|
vindex += 8;
|
||||||
|
Reference in New Issue
Block a user