From a7a4b836a38bfdb1c25137d0e473fbe2f9c44406 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Wed, 21 Jan 2015 22:02:30 +0000 Subject: [PATCH] [X86][SSE] movddup shuffle mask decodes Patch to provide shuffle decodes and asm comments for the SSE3/AVX1 movddup double duplication instructions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@226705 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../X86/InstPrinter/X86InstComments.cpp | 30 +++++++++++++++---- lib/Target/X86/Utils/X86ShuffleDecode.cpp | 26 ++++++++++++---- lib/Target/X86/Utils/X86ShuffleDecode.h | 14 +++++---- 3 files changed, 52 insertions(+), 18 deletions(-) diff --git a/lib/Target/X86/InstPrinter/X86InstComments.cpp b/lib/Target/X86/InstPrinter/X86InstComments.cpp index a4c0ca882c7..b7b2ba36ce7 100644 --- a/lib/Target/X86/InstPrinter/X86InstComments.cpp +++ b/lib/Target/X86/InstPrinter/X86InstComments.cpp @@ -200,12 +200,30 @@ bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS, case X86::MOVSHDUPrm: case X86::VMOVSHDUPrm: DestName = getRegName(MI->getOperand(0).getReg()); - DecodeMOVSHDUPMask(MVT::v4f32, ShuffleMask); - break; - - case X86::PSLLDQri: - case X86::VPSLLDQri: - Src1Name = getRegName(MI->getOperand(1).getReg()); + DecodeMOVSHDUPMask(MVT::v4f32, ShuffleMask); + break; + + case X86::VMOVDDUPYrr: + Src1Name = getRegName(MI->getOperand(1).getReg()); + // FALL THROUGH. + case X86::VMOVDDUPYrm: + DestName = getRegName(MI->getOperand(0).getReg()); + DecodeMOVDDUPMask(MVT::v4f64, ShuffleMask); + break; + + case X86::MOVDDUPrr: + case X86::VMOVDDUPrr: + Src1Name = getRegName(MI->getOperand(1).getReg()); + // FALL THROUGH. + case X86::MOVDDUPrm: + case X86::VMOVDDUPrm: + DestName = getRegName(MI->getOperand(0).getReg()); + DecodeMOVDDUPMask(MVT::v2f64, ShuffleMask); + break; + + case X86::PSLLDQri: + case X86::VPSLLDQri: + Src1Name = getRegName(MI->getOperand(1).getReg()); DestName = getRegName(MI->getOperand(0).getReg()); if(MI->getOperand(MI->getNumOperands()-1).isImm()) DecodePSLLDQMask(MVT::v16i8, diff --git a/lib/Target/X86/Utils/X86ShuffleDecode.cpp b/lib/Target/X86/Utils/X86ShuffleDecode.cpp index e4c58d42c5d..399d5834188 100644 --- a/lib/Target/X86/Utils/X86ShuffleDecode.cpp +++ b/lib/Target/X86/Utils/X86ShuffleDecode.cpp @@ -76,12 +76,26 @@ void DecodeMOVSHDUPMask(MVT VT, SmallVectorImpl &ShuffleMask) { for (int i = 0, e = NumElts / 2; i < e; ++i) { ShuffleMask.push_back(2 * i + 1); ShuffleMask.push_back(2 * i + 1); - } -} - -void DecodePSLLDQMask(MVT VT, unsigned Imm, SmallVectorImpl &ShuffleMask) { - unsigned VectorSizeInBits = VT.getSizeInBits(); - unsigned NumElts = VectorSizeInBits / 8; + } +} + +void DecodeMOVDDUPMask(MVT VT, SmallVectorImpl &ShuffleMask) { + unsigned VectorSizeInBits = VT.getSizeInBits(); + unsigned ScalarSizeInBits = VT.getScalarSizeInBits(); + unsigned NumElts = VT.getVectorNumElements(); + unsigned NumLanes = VectorSizeInBits / 128; + unsigned NumLaneElts = NumElts / NumLanes; + unsigned NumLaneSubElts = 64 / ScalarSizeInBits; + + for (unsigned l = 0; l < NumElts; l += NumLaneElts) + for (unsigned i = 0; i < NumLaneElts; i += NumLaneSubElts) + for (unsigned s = 0; s != NumLaneSubElts; s++) + ShuffleMask.push_back(l + s); +} + +void DecodePSLLDQMask(MVT VT, unsigned Imm, SmallVectorImpl &ShuffleMask) { + unsigned VectorSizeInBits = VT.getSizeInBits(); + unsigned NumElts = VectorSizeInBits / 8; unsigned NumLanes = VectorSizeInBits / 128; unsigned NumLaneElts = NumElts / NumLanes; diff --git a/lib/Target/X86/Utils/X86ShuffleDecode.h b/lib/Target/X86/Utils/X86ShuffleDecode.h index 6ba3c64f8ec..188ea41bb57 100644 --- a/lib/Target/X86/Utils/X86ShuffleDecode.h +++ b/lib/Target/X86/Utils/X86ShuffleDecode.h @@ -37,12 +37,14 @@ void DecodeMOVHLPSMask(unsigned NElts, SmallVectorImpl &ShuffleMask); void DecodeMOVLHPSMask(unsigned NElts, SmallVectorImpl &ShuffleMask); void DecodeMOVSLDUPMask(MVT VT, SmallVectorImpl &ShuffleMask); - -void DecodeMOVSHDUPMask(MVT VT, SmallVectorImpl &ShuffleMask); - -void DecodePSLLDQMask(MVT VT, unsigned Imm, SmallVectorImpl &ShuffleMask); - -void DecodePSRLDQMask(MVT VT, unsigned Imm, SmallVectorImpl &ShuffleMask); + +void DecodeMOVSHDUPMask(MVT VT, SmallVectorImpl &ShuffleMask); + +void DecodeMOVDDUPMask(MVT VT, SmallVectorImpl &ShuffleMask); + +void DecodePSLLDQMask(MVT VT, unsigned Imm, SmallVectorImpl &ShuffleMask); + +void DecodePSRLDQMask(MVT VT, unsigned Imm, SmallVectorImpl &ShuffleMask); void DecodePALIGNRMask(MVT VT, unsigned Imm, SmallVectorImpl &ShuffleMask);