diff options
author | Ian Lance Taylor <ian@airs.com> | 1996-02-15 00:08:45 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1996-02-15 00:08:45 +0000 |
commit | 03db5a9303329f81138bb2f08ffd8ee30ed01cbe (patch) | |
tree | 9274370790c143e3b8bfb4ba4baccf2ec8df5c7f /opcodes | |
parent | 95d31c3c8ff521b38b504bc360bd3343882dac25 (diff) | |
download | gdb-03db5a9303329f81138bb2f08ffd8ee30ed01cbe.zip gdb-03db5a9303329f81138bb2f08ffd8ee30ed01cbe.tar.gz gdb-03db5a9303329f81138bb2f08ffd8ee30ed01cbe.tar.bz2 |
Wed Feb 14 19:01:27 1996 Alan Modra <alan@spri.levels.unisa.edu.au>
* 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.
Diffstat (limited to 'opcodes')
-rw-r--r-- | opcodes/ChangeLog | 11 | ||||
-rw-r--r-- | 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 <alan@spri.levels.unisa.edu.au> + + * 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 <ian@cygnus.com> + + * Makefile.in ($(SHLINK)): Check ts against $(SHLIB), not + $(SHLINK). + Mon Feb 12 16:26:06 1996 Michael Meissner <meissner@tiktok.cygnus.com> * 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) { |