* gas/testsuite/gas/i386/fma4.d: Add test cases. * gas/testsuite/gas/i386/fma4.s: Add test cases. * gas/testsuite/gas/i386/x86-64-fma4.d: Add test cases. * gas/testsuite/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. Index: gas/testsuite/gas/i386/fma4.d =================================================================== RCS file: /cvs/src/src/gas/testsuite/gas/i386/fma4.d,v retrieving revision 1.3 diff -u -d -d -u -p -r1.3 fma4.d --- gas/testsuite/gas/i386/fma4.d 29 Oct 2009 22:22:59 -0000 1.3 +++ gas/testsuite/gas/i386/fma4.d 9 Dec 2009 23:39:15 -0000 @@ -10,6 +10,8 @@ Disassembly of section .text: [ ]*[a-f0-9]+: c4 e3 ed 69 39 60 vfmaddpd \(%ecx\),%ymm6,%ymm2,%ymm7 [ ]*[a-f0-9]+: c4 e3 ed 68 fc 60 vfmaddps %ymm4,%ymm6,%ymm2,%ymm7 [ ]*[a-f0-9]+: c4 e3 ed 68 39 60 vfmaddps \(%ecx\),%ymm6,%ymm2,%ymm7 +[ ]*[a-f0-9]+: c4 e3 59 68 6c da 01 30 vfmaddps %xmm3,0x1\(%edx,%ebx,8\),%xmm4,%xmm5 +[ ]*[a-f0-9]+: c4 e3 49 68 8c 81 80 00 00 00 70 vfmaddps %xmm7,0x80\(%ecx,%eax,4\),%xmm6,%xmm1 [ ]*[a-f0-9]+: c4 e3 ed 5d fc 60 vfmaddsubpd %ymm4,%ymm6,%ymm2,%ymm7 [ ]*[a-f0-9]+: c4 e3 ed 5d 39 60 vfmaddsubpd \(%ecx\),%ymm6,%ymm2,%ymm7 [ ]*[a-f0-9]+: c4 e3 ed 5c fc 60 vfmaddsubps %ymm4,%ymm6,%ymm2,%ymm7 Index: gas/testsuite/gas/i386/fma4.s =================================================================== RCS file: /cvs/src/src/gas/testsuite/gas/i386/fma4.s,v retrieving revision 1.1 diff -u -d -d -u -p -r1.1 fma4.s --- gas/testsuite/gas/i386/fma4.s 6 Jul 2009 19:34:30 -0000 1.1 +++ gas/testsuite/gas/i386/fma4.s 9 Dec 2009 23:39:15 -0000 @@ -8,6 +8,8 @@ _start: vfmaddpd (%ecx),%ymm6,%ymm2,%ymm7 vfmaddps %ymm4,%ymm6,%ymm2,%ymm7 vfmaddps (%ecx),%ymm6,%ymm2,%ymm7 + vfmaddps %xmm3,0x01(%edx,%ebx,8),%xmm4,%xmm5 + vfmaddps %xmm7,0x80(%ecx,%eax,4),%xmm6,%xmm1 vfmaddsubpd %ymm4,%ymm6,%ymm2,%ymm7 vfmaddsubpd (%ecx),%ymm6,%ymm2,%ymm7 vfmaddsubps %ymm4,%ymm6,%ymm2,%ymm7 Index: gas/testsuite/gas/i386/x86-64-fma4.d =================================================================== RCS file: /cvs/src/src/gas/testsuite/gas/i386/x86-64-fma4.d,v retrieving revision 1.4 diff -u -d -d -u -p -r1.4 x86-64-fma4.d --- gas/testsuite/gas/i386/x86-64-fma4.d 25 Nov 2009 15:15:30 -0000 1.4 +++ gas/testsuite/gas/i386/x86-64-fma4.d 9 Dec 2009 23:39:15 -0000 @@ -10,6 +10,8 @@ Disassembly of section .text: [ ]*[a-f0-9]+: c4 e3 ed 69 39 60 vfmaddpd \(%rcx\),%ymm6,%ymm2,%ymm7 [ ]*[a-f0-9]+: c4 e3 ed 68 fc 60 vfmaddps %ymm4,%ymm6,%ymm2,%ymm7 [ ]*[a-f0-9]+: c4 e3 ed 68 39 60 vfmaddps \(%rcx\),%ymm6,%ymm2,%ymm7 +[ ]*[a-f0-9]+: c4 63 41 68 5c da 01 40 vfmaddps %xmm4,0x1\(%rdx,%rbx,8\),%xmm7,%xmm11 +[ ]*[a-f0-9]+: c4 e3 49 68 a4 81 80 00 00 00 80 vfmaddps %xmm8,0x80\(%rcx,%rax,4\),%xmm6,%xmm4 [ ]*[a-f0-9]+: c4 e3 ed 5d fc 60 vfmaddsubpd %ymm4,%ymm6,%ymm2,%ymm7 [ ]*[a-f0-9]+: c4 e3 ed 5d 39 60 vfmaddsubpd \(%rcx\),%ymm6,%ymm2,%ymm7 [ ]*[a-f0-9]+: c4 e3 ed 5c fc 60 vfmaddsubps %ymm4,%ymm6,%ymm2,%ymm7 Index: gas/testsuite/gas/i386/x86-64-fma4.s =================================================================== RCS file: /cvs/src/src/gas/testsuite/gas/i386/x86-64-fma4.s,v retrieving revision 1.2 diff -u -d -d -u -p -r1.2 x86-64-fma4.s --- gas/testsuite/gas/i386/x86-64-fma4.s 25 Nov 2009 15:15:30 -0000 1.2 +++ gas/testsuite/gas/i386/x86-64-fma4.s 9 Dec 2009 23:39:15 -0000 @@ -8,6 +8,8 @@ _start: vfmaddpd (%rcx),%ymm6,%ymm2,%ymm7 vfmaddps %ymm4,%ymm6,%ymm2,%ymm7 vfmaddps (%rcx),%ymm6,%ymm2,%ymm7 + vfmaddps %xmm4,0x01(%rdx,%rbx,8),%xmm7,%xmm11 + vfmaddps %xmm8,0x80(%rcx,%rax,4),%xmm6,%xmm4 vfmaddsubpd %ymm4,%ymm6,%ymm2,%ymm7 vfmaddsubpd (%rcx),%ymm6,%ymm2,%ymm7 vfmaddsubps %ymm4,%ymm6,%ymm2,%ymm7 Index: opcodes/i386-dis.c =================================================================== RCS file: /cvs/src/src/opcodes/i386-dis.c,v retrieving revision 1.217 diff -u -d -d -u -p -r1.217 i386-dis.c --- opcodes/i386-dis.c 4 Dec 2009 07:51:41 -0000 1.217 +++ opcodes/i386-dis.c 9 Dec 2009 23:39:15 -0000 @@ -13717,45 +13717,47 @@ 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 (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 (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++; + } - 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)