From 03db5a9303329f81138bb2f08ffd8ee30ed01cbe Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 15 Feb 1996 00:08:45 +0000 Subject: Wed Feb 14 19:01:27 1996 Alan Modra * i386-dis.c (onebyte_has_modrm): New static array. (twobyte_has_modrm): New static array. (print_insn_i386): Only fetch the mod/reg/rm byte if it is needed. --- opcodes/ChangeLog | 11 ++++++++ opcodes/i386-dis.c | 79 +++++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 71 insertions(+), 19 deletions(-) diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 7fa9e9d..9115021 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,14 @@ +Wed Feb 14 19:01:27 1996 Alan Modra + + * i386-dis.c (onebyte_has_modrm): New static array. + (twobyte_has_modrm): New static array. + (print_insn_i386): Only fetch the mod/reg/rm byte if it is needed. + +Tue Feb 13 15:15:01 1996 Ian Lance Taylor + + * Makefile.in ($(SHLINK)): Check ts against $(SHLIB), not + $(SHLINK). + Mon Feb 12 16:26:06 1996 Michael Meissner * ppc-opc.c (PPC): Undef, so default defination on Windows NT diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 4628a1f..b21e276 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -348,23 +348,23 @@ struct dis386 dis386[] = { { "outsb", indirDX, Xb }, { "outsS", indirDX, Xv }, /* 70 */ - { "jo", Jb }, + { "jo", Jb }, { "jno", Jb }, - { "jb", Jb }, + { "jb", Jb }, { "jae", Jb }, - { "je", Jb }, + { "je", Jb }, { "jne", Jb }, { "jbe", Jb }, - { "ja", Jb }, + { "ja", Jb }, /* 78 */ - { "js", Jb }, + { "js", Jb }, { "jns", Jb }, - { "jp", Jb }, + { "jp", Jb }, { "jnp", Jb }, - { "jl", Jb }, + { "jl", Jb }, { "jnl", Jb }, { "jle", Jb }, - { "jg", Jb }, + { "jg", Jb }, /* 80 */ { GRP1b }, { GRP1S }, @@ -685,6 +685,44 @@ struct dis386 dis386_twobyte[] = { { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, }; +static const unsigned char onebyte_has_modrm[256] = { + 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, + 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, + 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, + 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, + 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 +}; + +static const unsigned char twobyte_has_modrm[256] = { + 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, + 1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; + static char obuf[100]; static char *obufp; static char scratchbuf[100]; @@ -993,7 +1031,8 @@ print_insn_i386 (pc, info) int enter_instruction; char *first, *second, *third; int needcomma; - + unsigned char need_modrm; + struct dis_private priv; bfd_byte *inbuf = priv.the_buffer; @@ -1058,20 +1097,22 @@ print_insn_i386 (pc, info) { FETCH_DATA (info, codep + 2); dp = &dis386_twobyte[*++codep]; + need_modrm = twobyte_has_modrm[*codep]; } else - dp = &dis386[*codep]; + { + dp = &dis386[*codep]; + need_modrm = onebyte_has_modrm[*codep]; + } codep++; - /* Fetch the mod/reg/rm byte. FIXME: We should be only fetching - this if we need it. As it is, this code loses if there is a - one-byte instruction (without a mod/reg/rm byte) at the end of - the address space. */ - - FETCH_DATA (info, codep + 1); - mod = (*codep >> 6) & 3; - reg = (*codep >> 3) & 7; - rm = *codep & 7; + if (need_modrm) + { + FETCH_DATA (info, codep + 1); + mod = (*codep >> 6) & 3; + reg = (*codep >> 3) & 7; + rm = *codep & 7; + } if (dp->name == NULL && dp->bytemode1 == FLOATCODE) { -- cgit v1.1