diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/IR/AutoUpgrade.cpp | 32 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86IntrinsicsInfo.h | 3 | 
2 files changed, 31 insertions, 4 deletions
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index 45f4d3930a7..86f827e1506 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -177,6 +177,7 @@ static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) {          Name.startswith("x86.avx2.vbroadcast") ||          Name.startswith("x86.avx2.pbroadcast") ||          Name.startswith("x86.avx.vpermil.") || +        Name.startswith("x86.sse2.pshuf") ||          Name.startswith("x86.sse41.pmovsx") ||          Name.startswith("x86.sse41.pmovzx") ||          Name.startswith("x86.avx2.pmovsx") || @@ -880,7 +881,8 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {        Rep = Builder.CreateShuffleVector(Op0, UndefV, Idxs);      } else if (Name == "llvm.stackprotectorcheck") {        Rep = nullptr; -    } else if (Name.startswith("llvm.x86.avx.vpermil.")) { +    } else if (Name.startswith("llvm.x86.avx.vpermil.") || +               Name == "llvm.x86.sse2.pshuf.d") {        Value *Op0 = CI->getArgOperand(0);        unsigned Imm = cast<ConstantInt>(CI->getArgOperand(1))->getZExtValue();        VectorType *VecTy = cast<VectorType>(CI->getType()); @@ -897,6 +899,34 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {          Idxs[i] = ((Imm >> ((i * IdxSize) % 8)) & IdxMask) | (i & ~IdxMask);        Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs); +    } else if (Name == "llvm.x86.sse2.pshufl.w") { +      Value *Op0 = CI->getArgOperand(0); +      unsigned Imm = cast<ConstantInt>(CI->getArgOperand(1))->getZExtValue(); +      unsigned NumElts = CI->getType()->getVectorNumElements(); + +      SmallVector<uint32_t, 16> Idxs(NumElts); +      for (unsigned l = 0; l != NumElts; l += 8) { +        for (unsigned i = 0; i != 4; ++i) +          Idxs[i + l] = ((Imm >> (2 * i)) & 0x3) + l; +        for (unsigned i = 4; i != 8; ++i) +          Idxs[i + l] = i + l; +      } + +      Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs); +    } else if (Name == "llvm.x86.sse2.pshufh.w") { +      Value *Op0 = CI->getArgOperand(0); +      unsigned Imm = cast<ConstantInt>(CI->getArgOperand(1))->getZExtValue(); +      unsigned NumElts = CI->getType()->getVectorNumElements(); + +      SmallVector<uint32_t, 16> Idxs(NumElts); +      for (unsigned l = 0; l != NumElts; l += 8) { +        for (unsigned i = 0; i != 4; ++i) +          Idxs[i + l] = i + l; +        for (unsigned i = 0; i != 4; ++i) +          Idxs[i + l + 4] = ((Imm >> (2 * i)) & 0x3) + 4 + l; +      } + +      Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs);      } else {        llvm_unreachable("Unknown function for CallInst upgrade.");      } diff --git a/llvm/lib/Target/X86/X86IntrinsicsInfo.h b/llvm/lib/Target/X86/X86IntrinsicsInfo.h index 54d97df5b82..d732606c87d 100644 --- a/llvm/lib/Target/X86/X86IntrinsicsInfo.h +++ b/llvm/lib/Target/X86/X86IntrinsicsInfo.h @@ -2133,9 +2133,6 @@ static const IntrinsicData  IntrinsicsWithoutChain[] = {    X86_INTRINSIC_DATA(sse2_pmulhu_w,     INTR_TYPE_2OP, ISD::MULHU, 0),    X86_INTRINSIC_DATA(sse2_pmulu_dq,     INTR_TYPE_2OP, X86ISD::PMULUDQ, 0),    X86_INTRINSIC_DATA(sse2_psad_bw,      INTR_TYPE_2OP, X86ISD::PSADBW, 0), -  X86_INTRINSIC_DATA(sse2_pshuf_d,      INTR_TYPE_2OP, X86ISD::PSHUFD, 0), -  X86_INTRINSIC_DATA(sse2_pshufh_w,     INTR_TYPE_2OP, X86ISD::PSHUFHW, 0), -  X86_INTRINSIC_DATA(sse2_pshufl_w,     INTR_TYPE_2OP, X86ISD::PSHUFLW, 0),    X86_INTRINSIC_DATA(sse2_psll_d,       INTR_TYPE_2OP, X86ISD::VSHL, 0),    X86_INTRINSIC_DATA(sse2_psll_q,       INTR_TYPE_2OP, X86ISD::VSHL, 0),    X86_INTRINSIC_DATA(sse2_psll_w,       INTR_TYPE_2OP, X86ISD::VSHL, 0),  | 

