aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/testsuite/ChangeLog7
-rw-r--r--gas/testsuite/gas/i386/fma4.d2
-rw-r--r--gas/testsuite/gas/i386/fma4.s2
-rw-r--r--gas/testsuite/gas/i386/x86-64-fma4.d2
-rw-r--r--gas/testsuite/gas/i386/x86-64-fma4.s2
-rw-r--r--opcodes/ChangeLog6
-rw-r--r--opcodes/i386-dis.c117
7 files changed, 84 insertions, 54 deletions
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index ea8c2b5..97983b2 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2009-12-11 Quentin Neill <quentin.neill@amd.com>
+
+ * 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.
+
2009-12-07 H.J. Lu <hongjiu.lu@intel.com>
PR gas/11037
diff --git a/gas/testsuite/gas/i386/fma4.d b/gas/testsuite/gas/i386/fma4.d
index 8479cf7..8cb5377 100644
--- a/gas/testsuite/gas/i386/fma4.d
+++ b/gas/testsuite/gas/i386/fma4.d
@@ -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
diff --git a/gas/testsuite/gas/i386/fma4.s b/gas/testsuite/gas/i386/fma4.s
index c1ec47f..8f4c950 100644
--- a/gas/testsuite/gas/i386/fma4.s
+++ b/gas/testsuite/gas/i386/fma4.s
@@ -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
diff --git a/gas/testsuite/gas/i386/x86-64-fma4.d b/gas/testsuite/gas/i386/x86-64-fma4.d
index 4f7a7c0..35ccdda 100644
--- a/gas/testsuite/gas/i386/x86-64-fma4.d
+++ b/gas/testsuite/gas/i386/x86-64-fma4.d
@@ -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
diff --git a/gas/testsuite/gas/i386/x86-64-fma4.s b/gas/testsuite/gas/i386/x86-64-fma4.s
index e6370c9..df6e3d3 100644
--- a/gas/testsuite/gas/i386/x86-64-fma4.s
+++ b/gas/testsuite/gas/i386/x86-64-fma4.s
@@ -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
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;
+ }
}
}
}