diff options
author | Sebastian Pop <sebastian.pop@amd.com> | 2009-12-11 20:38:51 +0000 |
---|---|---|
committer | Sebastian Pop <sebastian.pop@amd.com> | 2009-12-11 20:38:51 +0000 |
commit | 02e647f9419e1134c3bd1e8ff8959c8429fd5e64 (patch) | |
tree | 404577a623921360ea1d842d3917ec8f0652b09a /opcodes | |
parent | 2e98972ef6211756ea3aed4c172fa873557a2a09 (diff) | |
download | fsf-binutils-gdb-02e647f9419e1134c3bd1e8ff8959c8429fd5e64.zip fsf-binutils-gdb-02e647f9419e1134c3bd1e8ff8959c8429fd5e64.tar.gz fsf-binutils-gdb-02e647f9419e1134c3bd1e8ff8959c8429fd5e64.tar.bz2 |
2009-12-11 Quentin Neill <quentin.neill@amd.com>
gas/testsuite/
* gas/i386/fma4.d: Add test cases.
* gas/i386/fma4.s: Add test cases.
* gas/i386/x86-64-fma4.d: Add test cases.
* gas/i386/x86-64-fma4.s: Add test cases.
opcodes/
* i386-dis.c (get_vex_imm8): Extend logic to apply in all
cases, to avoid fetching ahead for the immediate bytes when
OP_E_memory has already been called. Fix indentation.
Diffstat (limited to 'opcodes')
-rw-r--r-- | opcodes/ChangeLog | 6 | ||||
-rw-r--r-- | opcodes/i386-dis.c | 117 |
2 files changed, 69 insertions, 54 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 04d35ff..8a605d2 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,9 @@ +2009-12-11 Quentin Neill <quentin.neill@amd.com> + + * i386-dis.c (get_vex_imm8): Extend logic to apply in all cases, + to avoid fetching ahead for the immediate bytes when OP_E_memory + has already been called. Fix indentation. + 2009-12-11 Nick Clifton <nickc@redhat.com> * Makefile.in: Regenerate. diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 5ecf963..c739309 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -13717,67 +13717,76 @@ get_vex_imm8 (int sizeflag, int opnum) { /* There are SIB/displacement bytes. */ if ((sizeflag & AFLAG) || address_mode == mode_64bit) - { + { /* 32/64 bit address mode */ - int base = modrm.rm; + int base = modrm.rm; /* Check SIB byte. */ - if (base == 4) - { - FETCH_DATA (the_info, codep + 1); - base = *codep & 7; - /* When decoding the third source, don't increase - bytes_before_imm as this has already been incremented - by one in OP_E_memory while decoding the second - source operand. */ + if (base == 4) + { + FETCH_DATA (the_info, codep + 1); + base = *codep & 7; + /* When decoding the third source, don't increase + bytes_before_imm as this has already been incremented + by one in OP_E_memory while decoding the second + source operand. */ if (opnum == 0) bytes_before_imm++; - } - switch (modrm.mod) - { - case 0: - /* When modrm.rm == 5 or modrm.rm == 4 and base in - SIB == 5, there is a 4 byte displacement. */ - if (base != 5) - /* No displacement. */ - break; - case 2: - /* 4 byte displacement. */ - bytes_before_imm += 4; - break; - case 1: - /* 1 byte displacement: when decoding the third source, - don't increase bytes_before_imm as this has already - been incremented by one in OP_E_memory while decoding - the second source operand. */ - if (opnum == 0) - bytes_before_imm++; - - break; - } - } + } + + /* Don't increase bytes_before_imm when decoding the third source, + it has already been incremented by OP_E_memory while decoding + the second source operand. */ + if (opnum == 0) + { + switch (modrm.mod) + { + case 0: + /* When modrm.rm == 5 or modrm.rm == 4 and base in + SIB == 5, there is a 4 byte displacement. */ + if (base != 5) + /* No displacement. */ + break; + case 2: + /* 4 byte displacement. */ + bytes_before_imm += 4; + break; + case 1: + /* 1 byte displacement. */ + bytes_before_imm++; + break; + } + } + } else - { /* 16 bit address mode */ - switch (modrm.mod) - { - case 0: - /* When modrm.rm == 6, there is a 2 byte displacement. */ - if (modrm.rm != 6) - /* No displacement. */ - break; - case 2: - /* 2 byte displacement. */ - bytes_before_imm += 2; - break; - case 1: - /* 1 byte displacement: when decoding the third source, - don't increase bytes_before_imm as this has already - been incremented by one in OP_E_memory while decoding - the second source operand. */ - if (opnum == 0) - bytes_before_imm++; + { + /* 16 bit address mode */ + /* Don't increase bytes_before_imm when decoding the third source, + it has already been incremented by OP_E_memory while decoding + the second source operand. */ + if (opnum == 0) + { + switch (modrm.mod) + { + case 0: + /* When modrm.rm == 6, there is a 2 byte displacement. */ + if (modrm.rm != 6) + /* No displacement. */ + break; + case 2: + /* 2 byte displacement. */ + bytes_before_imm += 2; + break; + case 1: + /* 1 byte displacement: when decoding the third source, + don't increase bytes_before_imm as this has already + been incremented by one in OP_E_memory while decoding + the second source operand. */ + if (opnum == 0) + bytes_before_imm++; - break; + break; + } } } } |