diff options
author | Craig Topper <craig.topper@gmail.com> | 2015-12-26 04:50:07 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@gmail.com> | 2015-12-26 04:50:07 +0000 |
commit | d4000194479da8fc986fd925d0198479fdcec65a (patch) | |
tree | 4e933d25592f7b869d94f85c96e5b5738e7c9234 /llvm/lib/Target/X86/X86MCInstLower.cpp | |
parent | 23561f8215f5c99e39815e5f55685b5c4740c704 (diff) | |
download | bcm5719-llvm-d4000194479da8fc986fd925d0198479fdcec65a.tar.gz bcm5719-llvm-d4000194479da8fc986fd925d0198479fdcec65a.zip |
[X86] Fix shuffle decoding for variable VPERMIL to be tolerant of the Constant type not matching due to folding in the constant pool and to get VPERMILPD correct.
llvm-svn: 256433
Diffstat (limited to 'llvm/lib/Target/X86/X86MCInstLower.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86MCInstLower.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/llvm/lib/Target/X86/X86MCInstLower.cpp b/llvm/lib/Target/X86/X86MCInstLower.cpp index d0c03d6ab7c..74f31259866 100644 --- a/llvm/lib/Target/X86/X86MCInstLower.cpp +++ b/llvm/lib/Target/X86/X86MCInstLower.cpp @@ -1303,9 +1303,16 @@ void X86AsmPrinter::EmitInstruction(const MachineInstr *MI) { const MachineOperand &SrcOp = MI->getOperand(1); const MachineOperand &MaskOp = MI->getOperand(5); + unsigned ElSize; + switch (MI->getOpcode()) { + default: llvm_unreachable("Invalid opcode"); + case X86::VPERMILPSrm: case X86::VPERMILPSYrm: ElSize = 32; break; + case X86::VPERMILPDrm: case X86::VPERMILPDYrm: ElSize = 64; break; + } + if (auto *C = getConstantFromPool(*MI, MaskOp)) { SmallVector<int, 16> Mask; - DecodeVPERMILPMask(C, Mask); + DecodeVPERMILPMask(C, ElSize, Mask); if (!Mask.empty()) OutStreamer->AddComment(getShuffleComment(DstOp, SrcOp, Mask)); } |