From 4bba68155df1ff42f84c1dab62423444cde7ea02 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sat, 12 May 2001 12:07:10 +0000 Subject: [PATCH] * 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. --- gas/testsuite/ChangeLog | 2 +- gas/testsuite/gas/i386/sse2.d | 2 +- opcodes/ChangeLog | 7 +++++++ opcodes/i386-dis.c | 28 ++++++++++++++++++++-------- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index c1d821ba74e..51785868aaa 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,7 +1,7 @@ 2001-05-12 Alan Modra * gas/i386/sse2.s: Correct cvtps2dq, movdq2q, and movq2dq - * gas/i386/sse2.d: Likewise. Fix pmuludq too. + * gas/i386/sse2.d: Likewise. Fix pmuludq and punpckhqdq too. * gas/i386/ssemmx2.d: Correct movq. diff --git a/gas/testsuite/gas/i386/sse2.d b/gas/testsuite/gas/i386/sse2.d index 4e9365fcce7..b7aa48909d2 100644 --- a/gas/testsuite/gas/i386/sse2.d +++ b/gas/testsuite/gas/i386/sse2.d @@ -152,5 +152,5 @@ Disassembly of section .text: 26b: f2 0f 70 c8 01[ ]+pshuflw \$0x1,%xmm0,%xmm1 270: 66 0f 73 f8 01[ ]+pslldq \$0x1,%xmm0 275: 66 0f 73 d8 01[ ]+psrldq \$0x1,%xmm0 - 27a: 66 0f 6d c8[ ]+punpckhqdq %xmm0,%xmm3 + 27a: 66 0f 6d c8[ ]+punpckhqdq %xmm0,%xmm1 27e: 89 f6[ ]+mov[ ]+%esi,%esi diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index b4f61fc4ce7..ed1b0a87016 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-07 Frank Ch. Eigler 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); -- 2.30.2