Index: lib/CodeGen/CGBuiltin.cpp =================================================================== --- lib/CodeGen/CGBuiltin.cpp +++ lib/CodeGen/CGBuiltin.cpp @@ -7485,11 +7485,34 @@ static Value *EmitX86SExtMask(CodeGenFunction &CGF, Value *Op, llvm::Type *DstTy) { - unsigned NumberOfElements = DstTy->getVectorNumElements(); + unsigned NumberOfElements = DstTy->getVectorNumElements(); Value *Mask = getMaskVecValue(CGF, Op, NumberOfElements); return CGF.Builder.CreateSExt(Mask, DstTy, "vpmovm2"); } +static Value *EmitX86Mask(CodeGenFunction &CGF, ArrayRef Ops) { + llvm::Type *Typ1 = Ops[0]->getType(); + Value *Cmp = CGF.Builder.CreateICmp(CmpInst::Predicate::ICMP_SLT, Ops[0], + llvm::ConstantVector::getNullValue(Typ1)); + Value *BitCast = CGF.Builder.CreateBitCast( + Cmp, llvm::Type::getIntNTy(CGF.Builder.getContext(), + Typ1->getVectorNumElements())); + return (Typ1->getVectorNumElements() < 32) + ? CGF.Builder.CreateZExt( + BitCast, llvm::Type::getInt32Ty(CGF.getLLVMContext())) + : BitCast; +} + +static Value *EmitX86MaskFloat(CodeGenFunction &CGF, ArrayRef Ops) { + Value *FloatOp = Ops[0]; + unsigned DstTypEle = FloatOp->getType()->getVectorNumElements(); + llvm::Type *IntTy = llvm::Type::getIntNTy( + CGF.Builder.getContext(), FloatOp->getType()->getScalarSizeInBits()); + llvm::Type *DstTyp = llvm::VectorType::get(IntTy, DstTypEle); + Value *BitCastFloatToInt = CGF.Builder.CreateBitCast(FloatOp, DstTyp); + return EmitX86Mask(CGF, BitCastFloatToInt); +} + Value *CodeGenFunction::EmitX86CpuIs(const CallExpr *E) { const Expr *CPUExpr = E->getArg(0)->IgnoreParenCasts(); StringRef CPUStr = cast(CPUExpr)->getString(); @@ -7860,6 +7883,14 @@ case X86::BI__builtin_ia32_cvtmask2q512: return EmitX86SExtMask(*this, Ops[0], ConvertType(E->getType())); + case X86::BI__builtin_ia32_pmovmskb128: + case X86::BI__builtin_ia32_pmovmskb256: + return EmitX86Mask(*this, Ops); + case X86::BI__builtin_ia32_movmskps256: + case X86::BI__builtin_ia32_movmskpd256: + case X86::BI__builtin_ia32_movmskps: + case X86::BI__builtin_ia32_movmskpd: + return EmitX86MaskFloat(*this, Ops); case X86::BI__builtin_ia32_movdqa32store128_mask: case X86::BI__builtin_ia32_movdqa64store128_mask: case X86::BI__builtin_ia32_storeaps128_mask: