summaryrefslogtreecommitdiff
path: root/opcodes/i386-dis.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2010-05-26 16:08:22 +0000
committerH.J. Lu <hjl.tools@gmail.com>2010-05-26 16:08:22 +0000
commit68d67cdef38450b3d48ad73b6d61ef54af228d2a (patch)
tree0f1499af7b87e48217062a05da7f30b57241656b /opcodes/i386-dis.c
parenta836db1e0cb00764558b6364d2d7111f1168a283 (diff)
downloadbinutils-redhat-68d67cdef38450b3d48ad73b6d61ef54af228d2a.tar.gz
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.
Diffstat (limited to 'opcodes/i386-dis.c')
-rw-r--r--opcodes/i386-dis.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c
index fef9185e5f..ecd8cca2a2 100644
--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -2305,6 +2305,13 @@ modrm;
static unsigned char need_modrm;
static struct
{
+ int scale;
+ int index;
+ int base;
+ }
+sib;
+static struct
+ {
int register_specifier;
int length;
int prefix;
@@ -11243,6 +11250,22 @@ get_valid_dis386 (const struct dis386 *dp, disassemble_info *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
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)
{
+ get_sib (info);
dofloat (sizeflag);
}
else
@@ -11535,6 +11559,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
dp = get_valid_dis386 (dp, info);
if (dp != NULL && putop (dp->name, sizeflag) == 0)
{
+ get_sib (info);
for (i = 0; i < MAX_OPERANDS; ++i)
{
obufp = op_out[i];
@@ -12935,10 +12960,9 @@ OP_E_memory (int bytemode, int sizeflag)
if (base == 4)
{
havesib = 1;
- FETCH_DATA (the_info, codep + 1);
- vindex = (*codep >> 3) & 7;
- scale = (*codep >> 6) & 3;
- base = *codep & 7;
+ vindex = sib.index;
+ scale = sib.scale;
+ base = sib.base;
USED_REX (REX_X);
if (rex & REX_X)
vindex += 8;