summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2001-05-12 12:12:18 +0000
committerAlan Modra <amodra@bigpond.net.au>2001-05-12 12:12:18 +0000
commitf413f33dfdcba5e7206c1d18d397b994ea390662 (patch)
treeaa3499bb1cf8fae99ff6a9ca6c638edbb8d014ec
parent066af1fb400d394daab6e17e7a64f1afc804844f (diff)
downloadgdb-f413f33dfdcba5e7206c1d18d397b994ea390662.tar.gz
* i386-dis.c (twobyte_has_modrm): Update table.
(need_modrm): Give it file scope. (MODRM_CHECK): Define. (dofloat): Use MODRM_CHECK. (OP_E): Likewise. (OP_EM): Likewise. (OP_EX): Likewise. and fix testsuite yet again now that we are getting correct disassembly.
-rw-r--r--opcodes/ChangeLog7
-rw-r--r--opcodes/i386-dis.c28
2 files changed, 27 insertions, 8 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index fca7e51821c..83fb7d67e4d 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -2,6 +2,13 @@
* i386-dis.c (prefix_user_table): Correct movq2dq, movdq2q, and
movq operands.
+ (twobyte_has_modrm): Update table.
+ (need_modrm): Give it file scope.
+ (MODRM_CHECK): Define.
+ (dofloat): Use MODRM_CHECK.
+ (OP_E): Likewise.
+ (OP_EM): Likewise.
+ (OP_EX): Likewise.
2001-05-04 Alan Modra <amodra@one.net.au>
diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c
index f1d9e140559..4eb57da3823 100644
--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -2228,20 +2228,20 @@ static const unsigned char twobyte_has_modrm[256] = {
/* ------------------------------- */
/* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
/* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, /* 1f */
- /* 20 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 2f */
+ /* 20 */ 1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1, /* 2f */
/* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */
/* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
- /* 50 */ 1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1, /* 5f */
- /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1, /* 6f */
+ /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
+ /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
/* 70 */ 1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1, /* 7f */
/* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
/* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
- /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
+ /* a0 */ 0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1, /* af */
/* b0 */ 1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1, /* bf */
/* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
- /* d0 */ 0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1, /* df */
- /* e0 */ 1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1, /* ef */
- /* f0 */ 0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0 /* ff */
+ /* d0 */ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
+ /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
+ /* f0 */ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
/* ------------------------------- */
/* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
};
@@ -2279,8 +2279,14 @@ static disassemble_info *the_info;
static int mod;
static int rm;
static int reg;
+static unsigned char need_modrm;
static void oappend PARAMS ((const char *s));
+/* If we are accessing mod/rm/reg without need_modrm set, then the
+ values are stale. Hitting this abort likely indicates that you
+ need to update onebyte_has_modrm or twobyte_has_modrm. */
+#define MODRM_CHECK if (!need_modrm) abort ()
+
static const char *names64[] = {
"%rax","%rcx","%rdx","%rbx", "%rsp","%rbp","%rsi","%rdi",
"%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
@@ -2989,7 +2995,6 @@ print_insn_i386 (pc, info)
int two_source_ops;
char *first, *second, *third;
int needcomma;
- unsigned char need_modrm;
unsigned char uses_SSE_prefix;
VOLATILE int sizeflag;
VOLATILE int orig_sizeflag;
@@ -3624,6 +3629,8 @@ dofloat (sizeflag)
OP_E (v_mode, sizeflag);
return;
}
+ /* skip mod/rm byte */
+ MODRM_CHECK;
codep++;
dp = &float_reg[floatop - 0xd8][reg];
@@ -4038,6 +4045,7 @@ OP_E (bytemode, sizeflag)
add += 8;
/* skip mod/rm byte */
+ MODRM_CHECK;
codep++;
if (mod == 3)
@@ -4927,6 +4935,8 @@ OP_EM (bytemode, sizeflag)
if (rex & REX_EXTZ)
add = 8;
+ /* skip mod/rm byte */
+ MODRM_CHECK;
codep++;
used_prefixes |= (prefixes & PREFIX_DATA);
if (prefixes & PREFIX_DATA)
@@ -4951,6 +4961,8 @@ OP_EX (bytemode, sizeflag)
if (rex & REX_EXTZ)
add = 8;
+ /* skip mod/rm byte */
+ MODRM_CHECK;
codep++;
sprintf (scratchbuf, "%%xmm%d", rm + add);
oappend (scratchbuf);