summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>2010-09-02 21:51:11 +0000
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>2010-09-02 21:51:11 +0000
commit55945607667e71dc1d4d32cffa60e3b817f2f3ef (patch)
tree846127feb54e4905e71e7a000d79bf8ce529beef /lib
parent3f74a116c80b483ffc7c2e6922ff62f0f73d83f5 (diff)
downloadllvm-55945607667e71dc1d4d32cffa60e3b817f2f3ef.tar.gz
llvm-55945607667e71dc1d4d32cffa60e3b817f2f3ef.tar.bz2
llvm-55945607667e71dc1d4d32cffa60e3b817f2f3ef.tar.xz
Move decoding of insertps back to avoid unused warnings in x86 isel lowering, and fix movlhps/movhlps to decode 4 elements shuffles
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@112869 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Target/X86/AsmPrinter/X86InstComments.cpp32
-rw-r--r--lib/Target/X86/X86ShuffleDecode.h42
2 files changed, 44 insertions, 30 deletions
diff --git a/lib/Target/X86/AsmPrinter/X86InstComments.cpp b/lib/Target/X86/AsmPrinter/X86InstComments.cpp
index fa1e50b153..61f5065211 100644
--- a/lib/Target/X86/AsmPrinter/X86InstComments.cpp
+++ b/lib/Target/X86/AsmPrinter/X86InstComments.cpp
@@ -20,6 +20,34 @@
using namespace llvm;
//===----------------------------------------------------------------------===//
+// Vector Mask Decoding for non-shuffles
+//===----------------------------------------------------------------------===//
+
+static void DecodeINSERTPSMask(unsigned Imm,
+ SmallVectorImpl<unsigned> &ShuffleMask) {
+ // Defaults the copying the dest value.
+ ShuffleMask.push_back(0);
+ ShuffleMask.push_back(1);
+ ShuffleMask.push_back(2);
+ ShuffleMask.push_back(3);
+
+ // Decode the immediate.
+ unsigned ZMask = Imm & 15;
+ unsigned CountD = (Imm >> 4) & 3;
+ unsigned CountS = (Imm >> 6) & 3;
+
+ // CountS selects which input element to use.
+ unsigned InVal = 4+CountS;
+ // CountD specifies which element of destination to update.
+ ShuffleMask[CountD] = InVal;
+ // ZMask zaps values, potentially overriding the CountD elt.
+ if (ZMask & 1) ShuffleMask[0] = SM_SentinelZero;
+ if (ZMask & 2) ShuffleMask[1] = SM_SentinelZero;
+ if (ZMask & 4) ShuffleMask[2] = SM_SentinelZero;
+ if (ZMask & 8) ShuffleMask[3] = SM_SentinelZero;
+}
+
+//===----------------------------------------------------------------------===//
// Top Level Entrypoint
//===----------------------------------------------------------------------===//
@@ -42,13 +70,13 @@ void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
case X86::MOVLHPSrr:
Src2Name = getRegName(MI->getOperand(2).getReg());
Src1Name = getRegName(MI->getOperand(0).getReg());
- DecodeMOVLHPSMask(ShuffleMask);
+ DecodeMOVLHPSMask(2, ShuffleMask);
break;
case X86::MOVHLPSrr:
Src2Name = getRegName(MI->getOperand(2).getReg());
Src1Name = getRegName(MI->getOperand(0).getReg());
- DecodeMOVHLPSMask(ShuffleMask);
+ DecodeMOVHLPSMask(2, ShuffleMask);
break;
case X86::PSHUFDri:
diff --git a/lib/Target/X86/X86ShuffleDecode.h b/lib/Target/X86/X86ShuffleDecode.h
index 4d24c839f5..818f7ca74b 100644
--- a/lib/Target/X86/X86ShuffleDecode.h
+++ b/lib/Target/X86/X86ShuffleDecode.h
@@ -26,38 +26,24 @@ enum {
SM_SentinelZero = ~0U
};
-static void DecodeINSERTPSMask(unsigned Imm,
- SmallVectorImpl<unsigned> &ShuffleMask) {
- // Defaults the copying the dest value.
- ShuffleMask.push_back(0);
- ShuffleMask.push_back(1);
- ShuffleMask.push_back(2);
- ShuffleMask.push_back(3);
+// <3,1> or <6,7,2,3>
+static void DecodeMOVHLPSMask(unsigned NElts,
+ SmallVectorImpl<unsigned> &ShuffleMask) {
+ for (unsigned i = NElts/2; i != NElts; ++i)
+ ShuffleMask.push_back(NElts+i);
- // Decode the immediate.
- unsigned ZMask = Imm & 15;
- unsigned CountD = (Imm >> 4) & 3;
- unsigned CountS = (Imm >> 6) & 3;
-
- // CountS selects which input element to use.
- unsigned InVal = 4+CountS;
- // CountD specifies which element of destination to update.
- ShuffleMask[CountD] = InVal;
- // ZMask zaps values, potentially overriding the CountD elt.
- if (ZMask & 1) ShuffleMask[0] = SM_SentinelZero;
- if (ZMask & 2) ShuffleMask[1] = SM_SentinelZero;
- if (ZMask & 4) ShuffleMask[2] = SM_SentinelZero;
- if (ZMask & 8) ShuffleMask[3] = SM_SentinelZero;
+ for (unsigned i = NElts/2; i != NElts; ++i)
+ ShuffleMask.push_back(i);
}
-static void DecodeMOVHLPSMask(SmallVectorImpl<unsigned> &ShuffleMask) {
- ShuffleMask.push_back(3);
- ShuffleMask.push_back(1);
-}
+// <0,2> or <0,1,4,5>
+static void DecodeMOVLHPSMask(unsigned NElts,
+ SmallVectorImpl<unsigned> &ShuffleMask) {
+ for (unsigned i = 0; i != NElts/2; ++i)
+ ShuffleMask.push_back(i);
-static void DecodeMOVLHPSMask(SmallVectorImpl<unsigned> &ShuffleMask) {
- ShuffleMask.push_back(0);
- ShuffleMask.push_back(2);
+ for (unsigned i = 0; i != NElts/2; ++i)
+ ShuffleMask.push_back(NElts+i);
}
static void DecodePSHUFMask(unsigned NElts, unsigned Imm,