summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2018-06-06 19:15:15 +0000
committerCraig Topper <craig.topper@intel.com>2018-06-06 19:15:15 +0000
commitef813a5226e9b82d31c92c9096d6edb6de4b89c3 (patch)
tree5ce7b3256f4bd219a6d2f9772298a8de87f6d15b /llvm
parentd04cc8e64075c9e004d833ec9206980f7fb46ff4 (diff)
downloadbcm5719-llvm-ef813a5226e9b82d31c92c9096d6edb6de4b89c3.tar.gz
bcm5719-llvm-ef813a5226e9b82d31c92c9096d6edb6de4b89c3.zip
[X86] Properly disassemble gather/scatter instructions where xmm4/ymm4/zmm4 are used as the index.
These encodings correspond to the cases in the normal encoding scheme where there is no index and our modrm reading code initially decodes it as such. The VSIB handling code tried to compensate for this, but failed to add the base needed to make later code do the right thing. Fixes PR37712. llvm-svn: 334121
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp2
-rw-r--r--llvm/test/MC/Disassembler/X86/avx-512.txt3
2 files changed, 4 insertions, 1 deletions
diff --git a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp
index e08c1a6e194..7badda457f4 100644
--- a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp
+++ b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp
@@ -1773,7 +1773,7 @@ static int readOperands(struct InternalInstruction* insn) {
// If sibIndex was set to SIB_INDEX_NONE, index offset is 4.
if (insn->sibIndex == SIB_INDEX_NONE)
- insn->sibIndex = (SIBIndex)4;
+ insn->sibIndex = (SIBIndex)(insn->sibIndexBase + 4);
// If EVEX.v2 is set this is one of the 16-31 registers.
if (insn->vectorExtensionType == TYPE_EVEX && insn->mode == MODE_64BIT &&
diff --git a/llvm/test/MC/Disassembler/X86/avx-512.txt b/llvm/test/MC/Disassembler/X86/avx-512.txt
index f617451bc96..563f6c6a275 100644
--- a/llvm/test/MC/Disassembler/X86/avx-512.txt
+++ b/llvm/test/MC/Disassembler/X86/avx-512.txt
@@ -47,6 +47,9 @@
# CHECK: vgatherdpd (%rsi,%ymm0,4), %zmm1 {%k2}
0x62 0xf2 0xfd 0x4a 0x92 0x0c 0x86
+# CHECK: vgatherqps (%r13,%zmm4), %ymm5 {%k2}
+0x62 0xd2 0x7d 0x4a 0x93 0x6c 0x25 0x00
+
# CHECK: vpslld $16, %zmm21, %zmm22
0x62 0xb1 0x4d 0x40 0x72 0xf5 0x10
OpenPOWER on IntegriCloud