Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/clang/Basic/arm_mve_builtin_cg.inc is written in an unsupported language. File is not indexed.

0001 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_s64:
0002 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_u64:
0003 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_f32:
0004 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_s32:
0005 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_u32: {
0006   llvm::Type * Param0;
0007   llvm::Type * Param1;
0008   switch (BuiltinID) {
0009   case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_s64:
0010     Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
0011     Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
0012     break;
0013   case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_u64:
0014     Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
0015     Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
0016     break;
0017   case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_f32:
0018     Param0 = llvm::FixedVectorType::get(FloatTy, 4);
0019     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0020     break;
0021   case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_s32:
0022     Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
0023     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0024     break;
0025   case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_u32:
0026     Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
0027     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0028     break;
0029   }
0030   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0031   Value *Val1 = Builder.CreateLoad(Val0);
0032   Value *Val2 = EmitScalarExpr(E->getArg(1));
0033   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vldr_gather_base_wb, {Param0, Param1}), {Val1, Val2});
0034   Value *Val4 = Builder.CreateExtractValue(Val3, static_cast<unsigned>(1));
0035   Builder.CreateStore(Val4, Val0);
0036   return Builder.CreateExtractValue(Val3, static_cast<unsigned>(0));
0037 }
0038 case ARM::BI__builtin_arm_mve_vddupq_wb_u16:
0039 case ARM::BI__builtin_arm_mve_vddupq_wb_u32:
0040 case ARM::BI__builtin_arm_mve_vddupq_wb_u8:
0041 case ARM::BI__builtin_arm_mve_vidupq_wb_u16:
0042 case ARM::BI__builtin_arm_mve_vidupq_wb_u32:
0043 case ARM::BI__builtin_arm_mve_vidupq_wb_u8: {
0044   Intrinsic::ID  Param0;
0045   llvm::Type * Param1;
0046   switch (BuiltinID) {
0047   case ARM::BI__builtin_arm_mve_vddupq_wb_u16:
0048     Param0 = Intrinsic::arm_mve_vddup;
0049     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
0050     break;
0051   case ARM::BI__builtin_arm_mve_vddupq_wb_u32:
0052     Param0 = Intrinsic::arm_mve_vddup;
0053     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0054     break;
0055   case ARM::BI__builtin_arm_mve_vddupq_wb_u8:
0056     Param0 = Intrinsic::arm_mve_vddup;
0057     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
0058     break;
0059   case ARM::BI__builtin_arm_mve_vidupq_wb_u16:
0060     Param0 = Intrinsic::arm_mve_vidup;
0061     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
0062     break;
0063   case ARM::BI__builtin_arm_mve_vidupq_wb_u32:
0064     Param0 = Intrinsic::arm_mve_vidup;
0065     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0066     break;
0067   case ARM::BI__builtin_arm_mve_vidupq_wb_u8:
0068     Param0 = Intrinsic::arm_mve_vidup;
0069     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
0070     break;
0071   }
0072   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0073   Value *Val1 = Builder.CreateLoad(Val0);
0074   Value *Val2 = EmitScalarExpr(E->getArg(1));
0075   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val1, Val2});
0076   Value *Val4 = Builder.CreateExtractValue(Val3, static_cast<unsigned>(1));
0077   Builder.CreateStore(Val4, Val0);
0078   return Builder.CreateExtractValue(Val3, static_cast<unsigned>(0));
0079 }
0080 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_s64:
0081 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_u64:
0082 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_f32:
0083 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_s32:
0084 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_u32: {
0085   llvm::Type * Param0;
0086   llvm::Type * Param1;
0087   switch (BuiltinID) {
0088   case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_s64:
0089     Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
0090     Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
0091     break;
0092   case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_u64:
0093     Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
0094     Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
0095     break;
0096   case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_f32:
0097     Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
0098     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
0099     break;
0100   case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_s32:
0101     Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
0102     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0103     break;
0104   case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_u32:
0105     Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
0106     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0107     break;
0108   }
0109   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0110   Value *Val1 = Builder.CreateLoad(Val0);
0111   Value *Val2 = EmitScalarExpr(E->getArg(1));
0112   Value *Val3 = EmitScalarExpr(E->getArg(2));
0113   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vstr_scatter_base_wb, {Param0, Param1}), {Val1, Val2, Val3});
0114   return Builder.CreateStore(Val4, Val0);
0115 }
0116 case ARM::BI__builtin_arm_mve_vdwdupq_wb_u16:
0117 case ARM::BI__builtin_arm_mve_vdwdupq_wb_u32:
0118 case ARM::BI__builtin_arm_mve_vdwdupq_wb_u8:
0119 case ARM::BI__builtin_arm_mve_viwdupq_wb_u16:
0120 case ARM::BI__builtin_arm_mve_viwdupq_wb_u32:
0121 case ARM::BI__builtin_arm_mve_viwdupq_wb_u8: {
0122   Intrinsic::ID  Param0;
0123   llvm::Type * Param1;
0124   switch (BuiltinID) {
0125   case ARM::BI__builtin_arm_mve_vdwdupq_wb_u16:
0126     Param0 = Intrinsic::arm_mve_vdwdup;
0127     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
0128     break;
0129   case ARM::BI__builtin_arm_mve_vdwdupq_wb_u32:
0130     Param0 = Intrinsic::arm_mve_vdwdup;
0131     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0132     break;
0133   case ARM::BI__builtin_arm_mve_vdwdupq_wb_u8:
0134     Param0 = Intrinsic::arm_mve_vdwdup;
0135     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
0136     break;
0137   case ARM::BI__builtin_arm_mve_viwdupq_wb_u16:
0138     Param0 = Intrinsic::arm_mve_viwdup;
0139     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
0140     break;
0141   case ARM::BI__builtin_arm_mve_viwdupq_wb_u32:
0142     Param0 = Intrinsic::arm_mve_viwdup;
0143     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0144     break;
0145   case ARM::BI__builtin_arm_mve_viwdupq_wb_u8:
0146     Param0 = Intrinsic::arm_mve_viwdup;
0147     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
0148     break;
0149   }
0150   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0151   Value *Val1 = Builder.CreateLoad(Val0);
0152   Value *Val2 = EmitScalarExpr(E->getArg(1));
0153   Value *Val3 = EmitScalarExpr(E->getArg(2));
0154   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val1, Val2, Val3});
0155   Value *Val5 = Builder.CreateExtractValue(Val4, static_cast<unsigned>(1));
0156   Builder.CreateStore(Val5, Val0);
0157   return Builder.CreateExtractValue(Val4, static_cast<unsigned>(0));
0158 }
0159 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_z_s64:
0160 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_z_u64:
0161 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_z_f32:
0162 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_z_s32:
0163 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_z_u32: {
0164   llvm::Type * Param0;
0165   llvm::Type * Param1;
0166   llvm::Type * Param2;
0167   switch (BuiltinID) {
0168   case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_z_s64:
0169     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
0170     Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
0171     Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
0172     break;
0173   case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_z_u64:
0174     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
0175     Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
0176     Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
0177     break;
0178   case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_z_f32:
0179     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0180     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
0181     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
0182     break;
0183   case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_z_s32:
0184     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0185     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0186     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
0187     break;
0188   case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_z_u32:
0189     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0190     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0191     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
0192     break;
0193   }
0194   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0195   Value *Val1 = Builder.CreateLoad(Val0);
0196   Value *Val2 = EmitScalarExpr(E->getArg(1));
0197   Value *Val3 = EmitScalarExpr(E->getArg(2));
0198   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
0199   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val4});
0200   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vldr_gather_base_wb_predicated, {Param1, Param2, Param0}), {Val1, Val2, Val5});
0201   Value *Val7 = Builder.CreateExtractValue(Val6, static_cast<unsigned>(1));
0202   Builder.CreateStore(Val7, Val0);
0203   return Builder.CreateExtractValue(Val6, static_cast<unsigned>(0));
0204 }
0205 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_p_s64:
0206 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_p_u64:
0207 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_p_f32:
0208 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_p_s32:
0209 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_p_u32: {
0210   llvm::Type * Param0;
0211   llvm::Type * Param1;
0212   llvm::Type * Param2;
0213   switch (BuiltinID) {
0214   case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_p_s64:
0215     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
0216     Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
0217     Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
0218     break;
0219   case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_p_u64:
0220     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
0221     Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
0222     Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
0223     break;
0224   case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_p_f32:
0225     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0226     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0227     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
0228     break;
0229   case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_p_s32:
0230     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0231     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0232     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
0233     break;
0234   case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_p_u32:
0235     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0236     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0237     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
0238     break;
0239   }
0240   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0241   Value *Val1 = Builder.CreateLoad(Val0);
0242   Value *Val2 = EmitScalarExpr(E->getArg(1));
0243   Value *Val3 = EmitScalarExpr(E->getArg(2));
0244   Value *Val4 = EmitScalarExpr(E->getArg(3));
0245   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
0246   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val5});
0247   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vstr_scatter_base_wb_predicated, {Param1, Param2, Param0}), {Val1, Val2, Val3, Val6});
0248   return Builder.CreateStore(Val7, Val0);
0249 }
0250 case ARM::BI__builtin_arm_mve_vld1q_f32:
0251 case ARM::BI__builtin_arm_mve_vldrwq_f32: {
0252   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0253   Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(FloatTy, 4)));
0254   Address Val2 = Address(Val1, llvm::FixedVectorType::get(FloatTy, 4), CharUnits::fromQuantity(4));
0255   return Builder.CreateLoad(Val2);
0256 }
0257 case ARM::BI__builtin_arm_mve_vld1q_z_f32:
0258 case ARM::BI__builtin_arm_mve_vldrwq_z_f32: {
0259   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0260   Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(FloatTy, 4)));
0261   Value *Val2 = llvm::ConstantInt::get(Int32Ty, 4);
0262   Value *Val3 = EmitScalarExpr(E->getArg(1));
0263   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
0264   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
0265   llvm::Type *Val6 = llvm::FixedVectorType::get(FloatTy, 4);
0266   Value *Val7 = llvm::Constant::getNullValue(Val6);
0267   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_load, {llvm::FixedVectorType::get(FloatTy, 4), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(FloatTy, 4))}), {Val1, Val2, Val5, Val7});
0268 }
0269 case ARM::BI__builtin_arm_mve_vld1q_f16:
0270 case ARM::BI__builtin_arm_mve_vldrhq_f16: {
0271   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0272   Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(HalfTy, 8)));
0273   Address Val2 = Address(Val1, llvm::FixedVectorType::get(HalfTy, 8), CharUnits::fromQuantity(2));
0274   return Builder.CreateLoad(Val2);
0275 }
0276 case ARM::BI__builtin_arm_mve_vld1q_z_f16:
0277 case ARM::BI__builtin_arm_mve_vldrhq_z_f16: {
0278   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0279   Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(HalfTy, 8)));
0280   Value *Val2 = llvm::ConstantInt::get(Int32Ty, 2);
0281   Value *Val3 = EmitScalarExpr(E->getArg(1));
0282   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
0283   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4});
0284   llvm::Type *Val6 = llvm::FixedVectorType::get(HalfTy, 8);
0285   Value *Val7 = llvm::Constant::getNullValue(Val6);
0286   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_load, {llvm::FixedVectorType::get(HalfTy, 8), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(HalfTy, 8))}), {Val1, Val2, Val5, Val7});
0287 }
0288 case ARM::BI__builtin_arm_mve_vldrhq_s32:
0289 case ARM::BI__builtin_arm_mve_vldrhq_u32: {
0290   bool  Param0;
0291   switch (BuiltinID) {
0292   case ARM::BI__builtin_arm_mve_vldrhq_s32:
0293     Param0 = 0;
0294     break;
0295   case ARM::BI__builtin_arm_mve_vldrhq_u32:
0296     Param0 = 1;
0297     break;
0298   }
0299   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0300   Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 4)));
0301   Address Val2 = Address(Val1, llvm::FixedVectorType::get(Int16Ty, 4), CharUnits::fromQuantity(2));
0302   Value *Val3 = Builder.CreateLoad(Val2);
0303   llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
0304   return SignOrZeroExtend(Builder, Val3, Val4, static_cast<bool>(Param0));
0305 }
0306 case ARM::BI__builtin_arm_mve_vldrhq_z_s32:
0307 case ARM::BI__builtin_arm_mve_vldrhq_z_u32: {
0308   bool  Param0;
0309   switch (BuiltinID) {
0310   case ARM::BI__builtin_arm_mve_vldrhq_z_s32:
0311     Param0 = 0;
0312     break;
0313   case ARM::BI__builtin_arm_mve_vldrhq_z_u32:
0314     Param0 = 1;
0315     break;
0316   }
0317   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0318   Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 4)));
0319   Value *Val2 = llvm::ConstantInt::get(Int32Ty, 2);
0320   Value *Val3 = EmitScalarExpr(E->getArg(1));
0321   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
0322   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
0323   llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 4);
0324   Value *Val7 = llvm::Constant::getNullValue(Val6);
0325   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_load, {llvm::FixedVectorType::get(Int16Ty, 4), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 4))}), {Val1, Val2, Val5, Val7});
0326   llvm::Type *Val9 = llvm::FixedVectorType::get(Int32Ty, 4);
0327   return SignOrZeroExtend(Builder, Val8, Val9, static_cast<bool>(Param0));
0328 }
0329 case ARM::BI__builtin_arm_mve_vld1q_s16:
0330 case ARM::BI__builtin_arm_mve_vld1q_u16:
0331 case ARM::BI__builtin_arm_mve_vldrhq_s16:
0332 case ARM::BI__builtin_arm_mve_vldrhq_u16: {
0333   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0334   Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8)));
0335   Address Val2 = Address(Val1, llvm::FixedVectorType::get(Int16Ty, 8), CharUnits::fromQuantity(2));
0336   return Builder.CreateLoad(Val2);
0337 }
0338 case ARM::BI__builtin_arm_mve_vld1q_z_s16:
0339 case ARM::BI__builtin_arm_mve_vld1q_z_u16:
0340 case ARM::BI__builtin_arm_mve_vldrhq_z_s16:
0341 case ARM::BI__builtin_arm_mve_vldrhq_z_u16: {
0342   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0343   Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8)));
0344   Value *Val2 = llvm::ConstantInt::get(Int32Ty, 2);
0345   Value *Val3 = EmitScalarExpr(E->getArg(1));
0346   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
0347   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4});
0348   llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 8);
0349   Value *Val7 = llvm::Constant::getNullValue(Val6);
0350   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_load, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8))}), {Val1, Val2, Val5, Val7});
0351 }
0352 case ARM::BI__builtin_arm_mve_vld1q_s32:
0353 case ARM::BI__builtin_arm_mve_vld1q_u32:
0354 case ARM::BI__builtin_arm_mve_vldrwq_s32:
0355 case ARM::BI__builtin_arm_mve_vldrwq_u32: {
0356   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0357   Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4)));
0358   Address Val2 = Address(Val1, llvm::FixedVectorType::get(Int32Ty, 4), CharUnits::fromQuantity(4));
0359   return Builder.CreateLoad(Val2);
0360 }
0361 case ARM::BI__builtin_arm_mve_vld1q_z_s32:
0362 case ARM::BI__builtin_arm_mve_vld1q_z_u32:
0363 case ARM::BI__builtin_arm_mve_vldrwq_z_s32:
0364 case ARM::BI__builtin_arm_mve_vldrwq_z_u32: {
0365   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0366   Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4)));
0367   Value *Val2 = llvm::ConstantInt::get(Int32Ty, 4);
0368   Value *Val3 = EmitScalarExpr(E->getArg(1));
0369   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
0370   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
0371   llvm::Type *Val6 = llvm::FixedVectorType::get(Int32Ty, 4);
0372   Value *Val7 = llvm::Constant::getNullValue(Val6);
0373   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_load, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4))}), {Val1, Val2, Val5, Val7});
0374 }
0375 case ARM::BI__builtin_arm_mve_vld1q_s8:
0376 case ARM::BI__builtin_arm_mve_vld1q_u8:
0377 case ARM::BI__builtin_arm_mve_vldrbq_s8:
0378 case ARM::BI__builtin_arm_mve_vldrbq_u8: {
0379   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0380   Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16)));
0381   Address Val2 = Address(Val1, llvm::FixedVectorType::get(Int8Ty, 16), CharUnits::fromQuantity(1));
0382   return Builder.CreateLoad(Val2);
0383 }
0384 case ARM::BI__builtin_arm_mve_vld1q_z_s8:
0385 case ARM::BI__builtin_arm_mve_vld1q_z_u8:
0386 case ARM::BI__builtin_arm_mve_vldrbq_z_s8:
0387 case ARM::BI__builtin_arm_mve_vldrbq_z_u8: {
0388   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0389   Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16)));
0390   Value *Val2 = llvm::ConstantInt::get(Int32Ty, 1);
0391   Value *Val3 = EmitScalarExpr(E->getArg(1));
0392   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
0393   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val4});
0394   llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 16);
0395   Value *Val7 = llvm::Constant::getNullValue(Val6);
0396   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_load, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16))}), {Val1, Val2, Val5, Val7});
0397 }
0398 case ARM::BI__builtin_arm_mve_vldrbq_s32:
0399 case ARM::BI__builtin_arm_mve_vldrbq_u32: {
0400   bool  Param0;
0401   switch (BuiltinID) {
0402   case ARM::BI__builtin_arm_mve_vldrbq_s32:
0403     Param0 = 0;
0404     break;
0405   case ARM::BI__builtin_arm_mve_vldrbq_u32:
0406     Param0 = 1;
0407     break;
0408   }
0409   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0410   Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 4)));
0411   Address Val2 = Address(Val1, llvm::FixedVectorType::get(Int8Ty, 4), CharUnits::fromQuantity(1));
0412   Value *Val3 = Builder.CreateLoad(Val2);
0413   llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
0414   return SignOrZeroExtend(Builder, Val3, Val4, static_cast<bool>(Param0));
0415 }
0416 case ARM::BI__builtin_arm_mve_vldrbq_z_s32:
0417 case ARM::BI__builtin_arm_mve_vldrbq_z_u32: {
0418   bool  Param0;
0419   switch (BuiltinID) {
0420   case ARM::BI__builtin_arm_mve_vldrbq_z_s32:
0421     Param0 = 0;
0422     break;
0423   case ARM::BI__builtin_arm_mve_vldrbq_z_u32:
0424     Param0 = 1;
0425     break;
0426   }
0427   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0428   Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 4)));
0429   Value *Val2 = llvm::ConstantInt::get(Int32Ty, 1);
0430   Value *Val3 = EmitScalarExpr(E->getArg(1));
0431   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
0432   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
0433   llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 4);
0434   Value *Val7 = llvm::Constant::getNullValue(Val6);
0435   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_load, {llvm::FixedVectorType::get(Int8Ty, 4), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 4))}), {Val1, Val2, Val5, Val7});
0436   llvm::Type *Val9 = llvm::FixedVectorType::get(Int32Ty, 4);
0437   return SignOrZeroExtend(Builder, Val8, Val9, static_cast<bool>(Param0));
0438 }
0439 case ARM::BI__builtin_arm_mve_vldrbq_s16:
0440 case ARM::BI__builtin_arm_mve_vldrbq_u16: {
0441   bool  Param0;
0442   switch (BuiltinID) {
0443   case ARM::BI__builtin_arm_mve_vldrbq_s16:
0444     Param0 = 0;
0445     break;
0446   case ARM::BI__builtin_arm_mve_vldrbq_u16:
0447     Param0 = 1;
0448     break;
0449   }
0450   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0451   Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 8)));
0452   Address Val2 = Address(Val1, llvm::FixedVectorType::get(Int8Ty, 8), CharUnits::fromQuantity(1));
0453   Value *Val3 = Builder.CreateLoad(Val2);
0454   llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
0455   return SignOrZeroExtend(Builder, Val3, Val4, static_cast<bool>(Param0));
0456 }
0457 case ARM::BI__builtin_arm_mve_vldrbq_z_s16:
0458 case ARM::BI__builtin_arm_mve_vldrbq_z_u16: {
0459   bool  Param0;
0460   switch (BuiltinID) {
0461   case ARM::BI__builtin_arm_mve_vldrbq_z_s16:
0462     Param0 = 0;
0463     break;
0464   case ARM::BI__builtin_arm_mve_vldrbq_z_u16:
0465     Param0 = 1;
0466     break;
0467   }
0468   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0469   Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 8)));
0470   Value *Val2 = llvm::ConstantInt::get(Int32Ty, 1);
0471   Value *Val3 = EmitScalarExpr(E->getArg(1));
0472   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
0473   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4});
0474   llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 8);
0475   Value *Val7 = llvm::Constant::getNullValue(Val6);
0476   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_load, {llvm::FixedVectorType::get(Int8Ty, 8), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 8))}), {Val1, Val2, Val5, Val7});
0477   llvm::Type *Val9 = llvm::FixedVectorType::get(Int16Ty, 8);
0478   return SignOrZeroExtend(Builder, Val8, Val9, static_cast<bool>(Param0));
0479 }
0480 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_s16:
0481 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_s32:
0482 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_s8:
0483 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_u16:
0484 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_u32:
0485 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_u8:
0486 case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_p_s64:
0487 case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_p_u64:
0488 case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_p_s64:
0489 case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_p_u64:
0490 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_f16:
0491 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_s16:
0492 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_s32:
0493 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_u16:
0494 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_u32:
0495 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_f16:
0496 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_s16:
0497 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_s32:
0498 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_u16:
0499 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_u32:
0500 case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_p_f32:
0501 case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_p_s32:
0502 case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_p_u32:
0503 case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_p_f32:
0504 case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_p_s32:
0505 case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_p_u32: {
0506   uint32_t  Param0;
0507   uint32_t  Param1;
0508   llvm::Type * Param2;
0509   llvm::Type * Param3;
0510   llvm::Type * Param4;
0511   llvm::Type * Param5;
0512   switch (BuiltinID) {
0513   case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_s16:
0514     Param0 = 8;
0515     Param1 = 0;
0516     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
0517     Param3 = llvm::PointerType::getUnqual(Int8Ty);
0518     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0519     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
0520     break;
0521   case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_s32:
0522     Param0 = 8;
0523     Param1 = 0;
0524     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0525     Param3 = llvm::PointerType::getUnqual(Int8Ty);
0526     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0527     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0528     break;
0529   case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_s8:
0530     Param0 = 8;
0531     Param1 = 0;
0532     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
0533     Param3 = llvm::PointerType::getUnqual(Int8Ty);
0534     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
0535     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
0536     break;
0537   case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_u16:
0538     Param0 = 8;
0539     Param1 = 0;
0540     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
0541     Param3 = llvm::PointerType::getUnqual(Int8Ty);
0542     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0543     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
0544     break;
0545   case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_u32:
0546     Param0 = 8;
0547     Param1 = 0;
0548     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0549     Param3 = llvm::PointerType::getUnqual(Int8Ty);
0550     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0551     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0552     break;
0553   case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_u8:
0554     Param0 = 8;
0555     Param1 = 0;
0556     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
0557     Param3 = llvm::PointerType::getUnqual(Int8Ty);
0558     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
0559     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
0560     break;
0561   case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_p_s64:
0562     Param0 = 64;
0563     Param1 = 0;
0564     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
0565     Param3 = llvm::PointerType::getUnqual(Int64Ty);
0566     Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
0567     Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
0568     break;
0569   case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_p_u64:
0570     Param0 = 64;
0571     Param1 = 0;
0572     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
0573     Param3 = llvm::PointerType::getUnqual(Int64Ty);
0574     Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
0575     Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
0576     break;
0577   case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_p_s64:
0578     Param0 = 64;
0579     Param1 = 3;
0580     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
0581     Param3 = llvm::PointerType::getUnqual(Int64Ty);
0582     Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
0583     Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
0584     break;
0585   case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_p_u64:
0586     Param0 = 64;
0587     Param1 = 3;
0588     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
0589     Param3 = llvm::PointerType::getUnqual(Int64Ty);
0590     Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
0591     Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
0592     break;
0593   case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_f16:
0594     Param0 = 16;
0595     Param1 = 0;
0596     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
0597     Param3 = llvm::PointerType::getUnqual(HalfTy);
0598     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0599     Param5 = llvm::FixedVectorType::get(HalfTy, 8);
0600     break;
0601   case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_s16:
0602     Param0 = 16;
0603     Param1 = 0;
0604     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
0605     Param3 = llvm::PointerType::getUnqual(Int16Ty);
0606     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0607     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
0608     break;
0609   case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_s32:
0610     Param0 = 16;
0611     Param1 = 0;
0612     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0613     Param3 = llvm::PointerType::getUnqual(Int16Ty);
0614     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0615     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0616     break;
0617   case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_u16:
0618     Param0 = 16;
0619     Param1 = 0;
0620     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
0621     Param3 = llvm::PointerType::getUnqual(Int16Ty);
0622     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0623     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
0624     break;
0625   case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_u32:
0626     Param0 = 16;
0627     Param1 = 0;
0628     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0629     Param3 = llvm::PointerType::getUnqual(Int16Ty);
0630     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0631     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0632     break;
0633   case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_f16:
0634     Param0 = 16;
0635     Param1 = 1;
0636     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
0637     Param3 = llvm::PointerType::getUnqual(HalfTy);
0638     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0639     Param5 = llvm::FixedVectorType::get(HalfTy, 8);
0640     break;
0641   case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_s16:
0642     Param0 = 16;
0643     Param1 = 1;
0644     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
0645     Param3 = llvm::PointerType::getUnqual(Int16Ty);
0646     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0647     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
0648     break;
0649   case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_s32:
0650     Param0 = 16;
0651     Param1 = 1;
0652     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0653     Param3 = llvm::PointerType::getUnqual(Int16Ty);
0654     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0655     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0656     break;
0657   case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_u16:
0658     Param0 = 16;
0659     Param1 = 1;
0660     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
0661     Param3 = llvm::PointerType::getUnqual(Int16Ty);
0662     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0663     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
0664     break;
0665   case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_u32:
0666     Param0 = 16;
0667     Param1 = 1;
0668     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0669     Param3 = llvm::PointerType::getUnqual(Int16Ty);
0670     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0671     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0672     break;
0673   case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_p_f32:
0674     Param0 = 32;
0675     Param1 = 0;
0676     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0677     Param3 = llvm::PointerType::getUnqual(FloatTy);
0678     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0679     Param5 = llvm::FixedVectorType::get(FloatTy, 4);
0680     break;
0681   case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_p_s32:
0682     Param0 = 32;
0683     Param1 = 0;
0684     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0685     Param3 = llvm::PointerType::getUnqual(Int32Ty);
0686     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0687     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0688     break;
0689   case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_p_u32:
0690     Param0 = 32;
0691     Param1 = 0;
0692     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0693     Param3 = llvm::PointerType::getUnqual(Int32Ty);
0694     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0695     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0696     break;
0697   case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_p_f32:
0698     Param0 = 32;
0699     Param1 = 2;
0700     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0701     Param3 = llvm::PointerType::getUnqual(FloatTy);
0702     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0703     Param5 = llvm::FixedVectorType::get(FloatTy, 4);
0704     break;
0705   case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_p_s32:
0706     Param0 = 32;
0707     Param1 = 2;
0708     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0709     Param3 = llvm::PointerType::getUnqual(Int32Ty);
0710     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0711     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0712     break;
0713   case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_p_u32:
0714     Param0 = 32;
0715     Param1 = 2;
0716     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0717     Param3 = llvm::PointerType::getUnqual(Int32Ty);
0718     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0719     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0720     break;
0721   }
0722   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0723   Value *Val1 = EmitScalarExpr(E->getArg(1));
0724   Value *Val2 = EmitScalarExpr(E->getArg(2));
0725   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
0726   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
0727   Value *Val5 = EmitScalarExpr(E->getArg(3));
0728   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
0729   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param2}), {Val6});
0730   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vstr_scatter_offset_predicated, {Param3, Param4, Param5, Param2}), {(Val0.emitRawPointer(*this)), Val1, Val2, Val3, Val4, Val7});
0731 }
0732 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_s16:
0733 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_s32:
0734 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_s8:
0735 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_u16:
0736 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_u32:
0737 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_u8:
0738 case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_s64:
0739 case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_u64:
0740 case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_s64:
0741 case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_u64:
0742 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_f16:
0743 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_s16:
0744 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_s32:
0745 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_u16:
0746 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_u32:
0747 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_f16:
0748 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_s16:
0749 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_s32:
0750 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_u16:
0751 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_u32:
0752 case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_f32:
0753 case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_s32:
0754 case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_u32:
0755 case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_f32:
0756 case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_s32:
0757 case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_u32: {
0758   uint32_t  Param0;
0759   uint32_t  Param1;
0760   llvm::Type * Param2;
0761   llvm::Type * Param3;
0762   llvm::Type * Param4;
0763   switch (BuiltinID) {
0764   case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_s16:
0765     Param0 = 8;
0766     Param1 = 0;
0767     Param2 = llvm::PointerType::getUnqual(Int8Ty);
0768     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
0769     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0770     break;
0771   case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_s32:
0772     Param0 = 8;
0773     Param1 = 0;
0774     Param2 = llvm::PointerType::getUnqual(Int8Ty);
0775     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0776     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0777     break;
0778   case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_s8:
0779     Param0 = 8;
0780     Param1 = 0;
0781     Param2 = llvm::PointerType::getUnqual(Int8Ty);
0782     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
0783     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
0784     break;
0785   case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_u16:
0786     Param0 = 8;
0787     Param1 = 0;
0788     Param2 = llvm::PointerType::getUnqual(Int8Ty);
0789     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
0790     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0791     break;
0792   case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_u32:
0793     Param0 = 8;
0794     Param1 = 0;
0795     Param2 = llvm::PointerType::getUnqual(Int8Ty);
0796     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0797     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0798     break;
0799   case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_u8:
0800     Param0 = 8;
0801     Param1 = 0;
0802     Param2 = llvm::PointerType::getUnqual(Int8Ty);
0803     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
0804     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
0805     break;
0806   case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_s64:
0807     Param0 = 64;
0808     Param1 = 0;
0809     Param2 = llvm::PointerType::getUnqual(Int64Ty);
0810     Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
0811     Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
0812     break;
0813   case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_u64:
0814     Param0 = 64;
0815     Param1 = 0;
0816     Param2 = llvm::PointerType::getUnqual(Int64Ty);
0817     Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
0818     Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
0819     break;
0820   case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_s64:
0821     Param0 = 64;
0822     Param1 = 3;
0823     Param2 = llvm::PointerType::getUnqual(Int64Ty);
0824     Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
0825     Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
0826     break;
0827   case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_u64:
0828     Param0 = 64;
0829     Param1 = 3;
0830     Param2 = llvm::PointerType::getUnqual(Int64Ty);
0831     Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
0832     Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
0833     break;
0834   case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_f16:
0835     Param0 = 16;
0836     Param1 = 0;
0837     Param2 = llvm::PointerType::getUnqual(HalfTy);
0838     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
0839     Param4 = llvm::FixedVectorType::get(HalfTy, 8);
0840     break;
0841   case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_s16:
0842     Param0 = 16;
0843     Param1 = 0;
0844     Param2 = llvm::PointerType::getUnqual(Int16Ty);
0845     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
0846     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0847     break;
0848   case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_s32:
0849     Param0 = 16;
0850     Param1 = 0;
0851     Param2 = llvm::PointerType::getUnqual(Int16Ty);
0852     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0853     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0854     break;
0855   case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_u16:
0856     Param0 = 16;
0857     Param1 = 0;
0858     Param2 = llvm::PointerType::getUnqual(Int16Ty);
0859     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
0860     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0861     break;
0862   case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_u32:
0863     Param0 = 16;
0864     Param1 = 0;
0865     Param2 = llvm::PointerType::getUnqual(Int16Ty);
0866     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0867     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0868     break;
0869   case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_f16:
0870     Param0 = 16;
0871     Param1 = 1;
0872     Param2 = llvm::PointerType::getUnqual(HalfTy);
0873     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
0874     Param4 = llvm::FixedVectorType::get(HalfTy, 8);
0875     break;
0876   case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_s16:
0877     Param0 = 16;
0878     Param1 = 1;
0879     Param2 = llvm::PointerType::getUnqual(Int16Ty);
0880     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
0881     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0882     break;
0883   case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_s32:
0884     Param0 = 16;
0885     Param1 = 1;
0886     Param2 = llvm::PointerType::getUnqual(Int16Ty);
0887     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0888     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0889     break;
0890   case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_u16:
0891     Param0 = 16;
0892     Param1 = 1;
0893     Param2 = llvm::PointerType::getUnqual(Int16Ty);
0894     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
0895     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0896     break;
0897   case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_u32:
0898     Param0 = 16;
0899     Param1 = 1;
0900     Param2 = llvm::PointerType::getUnqual(Int16Ty);
0901     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0902     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0903     break;
0904   case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_f32:
0905     Param0 = 32;
0906     Param1 = 0;
0907     Param2 = llvm::PointerType::getUnqual(FloatTy);
0908     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0909     Param4 = llvm::FixedVectorType::get(FloatTy, 4);
0910     break;
0911   case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_s32:
0912     Param0 = 32;
0913     Param1 = 0;
0914     Param2 = llvm::PointerType::getUnqual(Int32Ty);
0915     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0916     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0917     break;
0918   case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_u32:
0919     Param0 = 32;
0920     Param1 = 0;
0921     Param2 = llvm::PointerType::getUnqual(Int32Ty);
0922     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0923     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0924     break;
0925   case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_f32:
0926     Param0 = 32;
0927     Param1 = 2;
0928     Param2 = llvm::PointerType::getUnqual(FloatTy);
0929     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0930     Param4 = llvm::FixedVectorType::get(FloatTy, 4);
0931     break;
0932   case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_s32:
0933     Param0 = 32;
0934     Param1 = 2;
0935     Param2 = llvm::PointerType::getUnqual(Int32Ty);
0936     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0937     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0938     break;
0939   case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_u32:
0940     Param0 = 32;
0941     Param1 = 2;
0942     Param2 = llvm::PointerType::getUnqual(Int32Ty);
0943     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0944     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0945     break;
0946   }
0947   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0948   Value *Val1 = EmitScalarExpr(E->getArg(1));
0949   Value *Val2 = EmitScalarExpr(E->getArg(2));
0950   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
0951   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
0952   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vstr_scatter_offset, {Param2, Param3, Param4}), {(Val0.emitRawPointer(*this)), Val1, Val2, Val3, Val4});
0953 }
0954 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_s16:
0955 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_s32:
0956 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_s8:
0957 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_u16:
0958 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_u32:
0959 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_u8:
0960 case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_z_s64:
0961 case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_z_u64:
0962 case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_z_s64:
0963 case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_z_u64:
0964 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_f16:
0965 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_s16:
0966 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_s32:
0967 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_u16:
0968 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_u32:
0969 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_f16:
0970 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_s16:
0971 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_s32:
0972 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_u16:
0973 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_u32:
0974 case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_z_f32:
0975 case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_z_s32:
0976 case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_z_u32:
0977 case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_z_f32:
0978 case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_z_s32:
0979 case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_z_u32: {
0980   uint32_t  Param0;
0981   uint32_t  Param1;
0982   uint32_t  Param2;
0983   llvm::Type * Param3;
0984   llvm::Type * Param4;
0985   llvm::Type * Param5;
0986   llvm::Type * Param6;
0987   switch (BuiltinID) {
0988   case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_s16:
0989     Param0 = 8;
0990     Param1 = 0;
0991     Param2 = 0;
0992     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
0993     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0994     Param5 = llvm::PointerType::getUnqual(Int8Ty);
0995     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
0996     break;
0997   case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_s32:
0998     Param0 = 8;
0999     Param1 = 0;
1000     Param2 = 0;
1001     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1002     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1003     Param5 = llvm::PointerType::getUnqual(Int8Ty);
1004     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1005     break;
1006   case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_s8:
1007     Param0 = 8;
1008     Param1 = 0;
1009     Param2 = 0;
1010     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1011     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
1012     Param5 = llvm::PointerType::getUnqual(Int8Ty);
1013     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
1014     break;
1015   case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_u16:
1016     Param0 = 8;
1017     Param1 = 0;
1018     Param2 = 1;
1019     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1020     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
1021     Param5 = llvm::PointerType::getUnqual(Int8Ty);
1022     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
1023     break;
1024   case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_u32:
1025     Param0 = 8;
1026     Param1 = 0;
1027     Param2 = 1;
1028     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1029     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1030     Param5 = llvm::PointerType::getUnqual(Int8Ty);
1031     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1032     break;
1033   case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_u8:
1034     Param0 = 8;
1035     Param1 = 0;
1036     Param2 = 1;
1037     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1038     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
1039     Param5 = llvm::PointerType::getUnqual(Int8Ty);
1040     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
1041     break;
1042   case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_z_s64:
1043     Param0 = 64;
1044     Param1 = 0;
1045     Param2 = 0;
1046     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
1047     Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
1048     Param5 = llvm::PointerType::getUnqual(Int64Ty);
1049     Param6 = llvm::FixedVectorType::get(Int64Ty, 2);
1050     break;
1051   case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_z_u64:
1052     Param0 = 64;
1053     Param1 = 0;
1054     Param2 = 1;
1055     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
1056     Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
1057     Param5 = llvm::PointerType::getUnqual(Int64Ty);
1058     Param6 = llvm::FixedVectorType::get(Int64Ty, 2);
1059     break;
1060   case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_z_s64:
1061     Param0 = 64;
1062     Param1 = 3;
1063     Param2 = 0;
1064     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
1065     Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
1066     Param5 = llvm::PointerType::getUnqual(Int64Ty);
1067     Param6 = llvm::FixedVectorType::get(Int64Ty, 2);
1068     break;
1069   case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_z_u64:
1070     Param0 = 64;
1071     Param1 = 3;
1072     Param2 = 1;
1073     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
1074     Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
1075     Param5 = llvm::PointerType::getUnqual(Int64Ty);
1076     Param6 = llvm::FixedVectorType::get(Int64Ty, 2);
1077     break;
1078   case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_f16:
1079     Param0 = 16;
1080     Param1 = 0;
1081     Param2 = 0;
1082     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1083     Param4 = llvm::FixedVectorType::get(HalfTy, 8);
1084     Param5 = llvm::PointerType::getUnqual(HalfTy);
1085     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
1086     break;
1087   case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_s16:
1088     Param0 = 16;
1089     Param1 = 0;
1090     Param2 = 0;
1091     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1092     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
1093     Param5 = llvm::PointerType::getUnqual(Int16Ty);
1094     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
1095     break;
1096   case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_s32:
1097     Param0 = 16;
1098     Param1 = 0;
1099     Param2 = 0;
1100     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1101     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1102     Param5 = llvm::PointerType::getUnqual(Int16Ty);
1103     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1104     break;
1105   case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_u16:
1106     Param0 = 16;
1107     Param1 = 0;
1108     Param2 = 1;
1109     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1110     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
1111     Param5 = llvm::PointerType::getUnqual(Int16Ty);
1112     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
1113     break;
1114   case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_u32:
1115     Param0 = 16;
1116     Param1 = 0;
1117     Param2 = 1;
1118     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1119     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1120     Param5 = llvm::PointerType::getUnqual(Int16Ty);
1121     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1122     break;
1123   case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_f16:
1124     Param0 = 16;
1125     Param1 = 1;
1126     Param2 = 0;
1127     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1128     Param4 = llvm::FixedVectorType::get(HalfTy, 8);
1129     Param5 = llvm::PointerType::getUnqual(HalfTy);
1130     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
1131     break;
1132   case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_s16:
1133     Param0 = 16;
1134     Param1 = 1;
1135     Param2 = 0;
1136     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1137     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
1138     Param5 = llvm::PointerType::getUnqual(Int16Ty);
1139     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
1140     break;
1141   case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_s32:
1142     Param0 = 16;
1143     Param1 = 1;
1144     Param2 = 0;
1145     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1146     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1147     Param5 = llvm::PointerType::getUnqual(Int16Ty);
1148     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1149     break;
1150   case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_u16:
1151     Param0 = 16;
1152     Param1 = 1;
1153     Param2 = 1;
1154     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1155     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
1156     Param5 = llvm::PointerType::getUnqual(Int16Ty);
1157     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
1158     break;
1159   case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_u32:
1160     Param0 = 16;
1161     Param1 = 1;
1162     Param2 = 1;
1163     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1164     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1165     Param5 = llvm::PointerType::getUnqual(Int16Ty);
1166     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1167     break;
1168   case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_z_f32:
1169     Param0 = 32;
1170     Param1 = 0;
1171     Param2 = 0;
1172     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1173     Param4 = llvm::FixedVectorType::get(FloatTy, 4);
1174     Param5 = llvm::PointerType::getUnqual(FloatTy);
1175     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1176     break;
1177   case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_z_s32:
1178     Param0 = 32;
1179     Param1 = 0;
1180     Param2 = 0;
1181     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1182     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1183     Param5 = llvm::PointerType::getUnqual(Int32Ty);
1184     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1185     break;
1186   case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_z_u32:
1187     Param0 = 32;
1188     Param1 = 0;
1189     Param2 = 1;
1190     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1191     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1192     Param5 = llvm::PointerType::getUnqual(Int32Ty);
1193     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1194     break;
1195   case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_z_f32:
1196     Param0 = 32;
1197     Param1 = 2;
1198     Param2 = 0;
1199     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1200     Param4 = llvm::FixedVectorType::get(FloatTy, 4);
1201     Param5 = llvm::PointerType::getUnqual(FloatTy);
1202     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1203     break;
1204   case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_z_s32:
1205     Param0 = 32;
1206     Param1 = 2;
1207     Param2 = 0;
1208     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1209     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1210     Param5 = llvm::PointerType::getUnqual(Int32Ty);
1211     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1212     break;
1213   case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_z_u32:
1214     Param0 = 32;
1215     Param1 = 2;
1216     Param2 = 1;
1217     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1218     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1219     Param5 = llvm::PointerType::getUnqual(Int32Ty);
1220     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1221     break;
1222   }
1223   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
1224   Value *Val1 = EmitScalarExpr(E->getArg(1));
1225   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
1226   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
1227   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
1228   Value *Val5 = EmitScalarExpr(E->getArg(2));
1229   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
1230   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val6});
1231   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vldr_gather_offset_predicated, {Param4, Param5, Param6, Param3}), {(Val0.emitRawPointer(*this)), Val1, Val2, Val3, Val4, Val7});
1232 }
1233 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_s16:
1234 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_s32:
1235 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_s8:
1236 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_u16:
1237 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_u32:
1238 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_u8:
1239 case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_s64:
1240 case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_u64:
1241 case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_s64:
1242 case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_u64:
1243 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_f16:
1244 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_s16:
1245 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_s32:
1246 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_u16:
1247 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_u32:
1248 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_f16:
1249 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_s16:
1250 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_s32:
1251 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_u16:
1252 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_u32:
1253 case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_f32:
1254 case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_s32:
1255 case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_u32:
1256 case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_f32:
1257 case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_s32:
1258 case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_u32: {
1259   uint32_t  Param0;
1260   uint32_t  Param1;
1261   uint32_t  Param2;
1262   llvm::Type * Param3;
1263   llvm::Type * Param4;
1264   llvm::Type * Param5;
1265   switch (BuiltinID) {
1266   case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_s16:
1267     Param0 = 8;
1268     Param1 = 0;
1269     Param2 = 0;
1270     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
1271     Param4 = llvm::PointerType::getUnqual(Int8Ty);
1272     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
1273     break;
1274   case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_s32:
1275     Param0 = 8;
1276     Param1 = 0;
1277     Param2 = 0;
1278     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1279     Param4 = llvm::PointerType::getUnqual(Int8Ty);
1280     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1281     break;
1282   case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_s8:
1283     Param0 = 8;
1284     Param1 = 0;
1285     Param2 = 0;
1286     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
1287     Param4 = llvm::PointerType::getUnqual(Int8Ty);
1288     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
1289     break;
1290   case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_u16:
1291     Param0 = 8;
1292     Param1 = 0;
1293     Param2 = 1;
1294     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
1295     Param4 = llvm::PointerType::getUnqual(Int8Ty);
1296     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
1297     break;
1298   case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_u32:
1299     Param0 = 8;
1300     Param1 = 0;
1301     Param2 = 1;
1302     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1303     Param4 = llvm::PointerType::getUnqual(Int8Ty);
1304     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1305     break;
1306   case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_u8:
1307     Param0 = 8;
1308     Param1 = 0;
1309     Param2 = 1;
1310     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
1311     Param4 = llvm::PointerType::getUnqual(Int8Ty);
1312     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
1313     break;
1314   case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_s64:
1315     Param0 = 64;
1316     Param1 = 0;
1317     Param2 = 0;
1318     Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
1319     Param4 = llvm::PointerType::getUnqual(Int64Ty);
1320     Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
1321     break;
1322   case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_u64:
1323     Param0 = 64;
1324     Param1 = 0;
1325     Param2 = 1;
1326     Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
1327     Param4 = llvm::PointerType::getUnqual(Int64Ty);
1328     Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
1329     break;
1330   case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_s64:
1331     Param0 = 64;
1332     Param1 = 3;
1333     Param2 = 0;
1334     Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
1335     Param4 = llvm::PointerType::getUnqual(Int64Ty);
1336     Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
1337     break;
1338   case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_u64:
1339     Param0 = 64;
1340     Param1 = 3;
1341     Param2 = 1;
1342     Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
1343     Param4 = llvm::PointerType::getUnqual(Int64Ty);
1344     Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
1345     break;
1346   case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_f16:
1347     Param0 = 16;
1348     Param1 = 0;
1349     Param2 = 0;
1350     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
1351     Param4 = llvm::PointerType::getUnqual(HalfTy);
1352     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
1353     break;
1354   case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_s16:
1355     Param0 = 16;
1356     Param1 = 0;
1357     Param2 = 0;
1358     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
1359     Param4 = llvm::PointerType::getUnqual(Int16Ty);
1360     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
1361     break;
1362   case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_s32:
1363     Param0 = 16;
1364     Param1 = 0;
1365     Param2 = 0;
1366     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1367     Param4 = llvm::PointerType::getUnqual(Int16Ty);
1368     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1369     break;
1370   case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_u16:
1371     Param0 = 16;
1372     Param1 = 0;
1373     Param2 = 1;
1374     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
1375     Param4 = llvm::PointerType::getUnqual(Int16Ty);
1376     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
1377     break;
1378   case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_u32:
1379     Param0 = 16;
1380     Param1 = 0;
1381     Param2 = 1;
1382     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1383     Param4 = llvm::PointerType::getUnqual(Int16Ty);
1384     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1385     break;
1386   case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_f16:
1387     Param0 = 16;
1388     Param1 = 1;
1389     Param2 = 0;
1390     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
1391     Param4 = llvm::PointerType::getUnqual(HalfTy);
1392     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
1393     break;
1394   case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_s16:
1395     Param0 = 16;
1396     Param1 = 1;
1397     Param2 = 0;
1398     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
1399     Param4 = llvm::PointerType::getUnqual(Int16Ty);
1400     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
1401     break;
1402   case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_s32:
1403     Param0 = 16;
1404     Param1 = 1;
1405     Param2 = 0;
1406     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1407     Param4 = llvm::PointerType::getUnqual(Int16Ty);
1408     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1409     break;
1410   case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_u16:
1411     Param0 = 16;
1412     Param1 = 1;
1413     Param2 = 1;
1414     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
1415     Param4 = llvm::PointerType::getUnqual(Int16Ty);
1416     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
1417     break;
1418   case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_u32:
1419     Param0 = 16;
1420     Param1 = 1;
1421     Param2 = 1;
1422     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1423     Param4 = llvm::PointerType::getUnqual(Int16Ty);
1424     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1425     break;
1426   case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_f32:
1427     Param0 = 32;
1428     Param1 = 0;
1429     Param2 = 0;
1430     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
1431     Param4 = llvm::PointerType::getUnqual(FloatTy);
1432     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1433     break;
1434   case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_s32:
1435     Param0 = 32;
1436     Param1 = 0;
1437     Param2 = 0;
1438     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1439     Param4 = llvm::PointerType::getUnqual(Int32Ty);
1440     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1441     break;
1442   case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_u32:
1443     Param0 = 32;
1444     Param1 = 0;
1445     Param2 = 1;
1446     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1447     Param4 = llvm::PointerType::getUnqual(Int32Ty);
1448     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1449     break;
1450   case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_f32:
1451     Param0 = 32;
1452     Param1 = 2;
1453     Param2 = 0;
1454     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
1455     Param4 = llvm::PointerType::getUnqual(FloatTy);
1456     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1457     break;
1458   case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_s32:
1459     Param0 = 32;
1460     Param1 = 2;
1461     Param2 = 0;
1462     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1463     Param4 = llvm::PointerType::getUnqual(Int32Ty);
1464     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1465     break;
1466   case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_u32:
1467     Param0 = 32;
1468     Param1 = 2;
1469     Param2 = 1;
1470     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1471     Param4 = llvm::PointerType::getUnqual(Int32Ty);
1472     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1473     break;
1474   }
1475   Address Val0 = EmitPointerWithAlignment(E->getArg(0));
1476   Value *Val1 = EmitScalarExpr(E->getArg(1));
1477   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
1478   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
1479   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
1480   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vldr_gather_offset, {Param3, Param4, Param5}), {(Val0.emitRawPointer(*this)), Val1, Val2, Val3, Val4});
1481 }
1482 case ARM::BI__builtin_arm_mve_vshlcq_s16:
1483 case ARM::BI__builtin_arm_mve_vshlcq_s32:
1484 case ARM::BI__builtin_arm_mve_vshlcq_s8:
1485 case ARM::BI__builtin_arm_mve_vshlcq_u16:
1486 case ARM::BI__builtin_arm_mve_vshlcq_u32:
1487 case ARM::BI__builtin_arm_mve_vshlcq_u8: {
1488   llvm::Type * Param0;
1489   switch (BuiltinID) {
1490   case ARM::BI__builtin_arm_mve_vshlcq_s16:
1491     Param0 = llvm::FixedVectorType::get(Int16Ty, 8);
1492     break;
1493   case ARM::BI__builtin_arm_mve_vshlcq_s32:
1494     Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
1495     break;
1496   case ARM::BI__builtin_arm_mve_vshlcq_s8:
1497     Param0 = llvm::FixedVectorType::get(Int8Ty, 16);
1498     break;
1499   case ARM::BI__builtin_arm_mve_vshlcq_u16:
1500     Param0 = llvm::FixedVectorType::get(Int16Ty, 8);
1501     break;
1502   case ARM::BI__builtin_arm_mve_vshlcq_u32:
1503     Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
1504     break;
1505   case ARM::BI__builtin_arm_mve_vshlcq_u8:
1506     Param0 = llvm::FixedVectorType::get(Int8Ty, 16);
1507     break;
1508   }
1509   Address Val0 = EmitPointerWithAlignment(E->getArg(1));
1510   Value *Val1 = Builder.CreateLoad(Val0);
1511   Value *Val2 = EmitScalarExpr(E->getArg(0));
1512   Value *Val3 = EmitScalarExpr(E->getArg(2));
1513   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshlc, {Param0}), {Val2, Val1, Val3});
1514   Value *Val5 = Builder.CreateExtractValue(Val4, static_cast<unsigned>(0));
1515   Builder.CreateStore(Val5, Val0);
1516   return Builder.CreateExtractValue(Val4, static_cast<unsigned>(1));
1517 }
1518 case ARM::BI__builtin_arm_mve_vddupq_m_wb_u16:
1519 case ARM::BI__builtin_arm_mve_vddupq_m_wb_u32:
1520 case ARM::BI__builtin_arm_mve_vddupq_m_wb_u8:
1521 case ARM::BI__builtin_arm_mve_vidupq_m_wb_u16:
1522 case ARM::BI__builtin_arm_mve_vidupq_m_wb_u32:
1523 case ARM::BI__builtin_arm_mve_vidupq_m_wb_u8:
1524 case ARM::BI__builtin_arm_mve_vshlcq_m_s16:
1525 case ARM::BI__builtin_arm_mve_vshlcq_m_s32:
1526 case ARM::BI__builtin_arm_mve_vshlcq_m_s8:
1527 case ARM::BI__builtin_arm_mve_vshlcq_m_u16:
1528 case ARM::BI__builtin_arm_mve_vshlcq_m_u32:
1529 case ARM::BI__builtin_arm_mve_vshlcq_m_u8: {
1530   llvm::Type * Param0;
1531   Intrinsic::ID  Param1;
1532   llvm::Type * Param2;
1533   unsigned  Param3;
1534   unsigned  Param4;
1535   switch (BuiltinID) {
1536   case ARM::BI__builtin_arm_mve_vddupq_m_wb_u16:
1537     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1538     Param1 = Intrinsic::arm_mve_vddup_predicated;
1539     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1540     Param3 = 1;
1541     Param4 = 0;
1542     break;
1543   case ARM::BI__builtin_arm_mve_vddupq_m_wb_u32:
1544     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1545     Param1 = Intrinsic::arm_mve_vddup_predicated;
1546     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
1547     Param3 = 1;
1548     Param4 = 0;
1549     break;
1550   case ARM::BI__builtin_arm_mve_vddupq_m_wb_u8:
1551     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1552     Param1 = Intrinsic::arm_mve_vddup_predicated;
1553     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1554     Param3 = 1;
1555     Param4 = 0;
1556     break;
1557   case ARM::BI__builtin_arm_mve_vidupq_m_wb_u16:
1558     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1559     Param1 = Intrinsic::arm_mve_vidup_predicated;
1560     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1561     Param3 = 1;
1562     Param4 = 0;
1563     break;
1564   case ARM::BI__builtin_arm_mve_vidupq_m_wb_u32:
1565     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1566     Param1 = Intrinsic::arm_mve_vidup_predicated;
1567     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
1568     Param3 = 1;
1569     Param4 = 0;
1570     break;
1571   case ARM::BI__builtin_arm_mve_vidupq_m_wb_u8:
1572     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1573     Param1 = Intrinsic::arm_mve_vidup_predicated;
1574     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1575     Param3 = 1;
1576     Param4 = 0;
1577     break;
1578   case ARM::BI__builtin_arm_mve_vshlcq_m_s16:
1579     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1580     Param1 = Intrinsic::arm_mve_vshlc_predicated;
1581     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1582     Param3 = 0;
1583     Param4 = 1;
1584     break;
1585   case ARM::BI__builtin_arm_mve_vshlcq_m_s32:
1586     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1587     Param1 = Intrinsic::arm_mve_vshlc_predicated;
1588     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
1589     Param3 = 0;
1590     Param4 = 1;
1591     break;
1592   case ARM::BI__builtin_arm_mve_vshlcq_m_s8:
1593     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1594     Param1 = Intrinsic::arm_mve_vshlc_predicated;
1595     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1596     Param3 = 0;
1597     Param4 = 1;
1598     break;
1599   case ARM::BI__builtin_arm_mve_vshlcq_m_u16:
1600     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1601     Param1 = Intrinsic::arm_mve_vshlc_predicated;
1602     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1603     Param3 = 0;
1604     Param4 = 1;
1605     break;
1606   case ARM::BI__builtin_arm_mve_vshlcq_m_u32:
1607     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1608     Param1 = Intrinsic::arm_mve_vshlc_predicated;
1609     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
1610     Param3 = 0;
1611     Param4 = 1;
1612     break;
1613   case ARM::BI__builtin_arm_mve_vshlcq_m_u8:
1614     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1615     Param1 = Intrinsic::arm_mve_vshlc_predicated;
1616     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1617     Param3 = 0;
1618     Param4 = 1;
1619     break;
1620   }
1621   Address Val0 = EmitPointerWithAlignment(E->getArg(1));
1622   Value *Val1 = Builder.CreateLoad(Val0);
1623   Value *Val2 = EmitScalarExpr(E->getArg(0));
1624   Value *Val3 = EmitScalarExpr(E->getArg(2));
1625   Value *Val4 = EmitScalarExpr(E->getArg(3));
1626   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
1627   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val5});
1628   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val2, Val1, Val3, Val6});
1629   Value *Val8 = Builder.CreateExtractValue(Val7, static_cast<unsigned>(Param3));
1630   Builder.CreateStore(Val8, Val0);
1631   return Builder.CreateExtractValue(Val7, static_cast<unsigned>(Param4));
1632 }
1633 case ARM::BI__builtin_arm_mve_vdwdupq_m_wb_u16:
1634 case ARM::BI__builtin_arm_mve_vdwdupq_m_wb_u32:
1635 case ARM::BI__builtin_arm_mve_vdwdupq_m_wb_u8:
1636 case ARM::BI__builtin_arm_mve_viwdupq_m_wb_u16:
1637 case ARM::BI__builtin_arm_mve_viwdupq_m_wb_u32:
1638 case ARM::BI__builtin_arm_mve_viwdupq_m_wb_u8: {
1639   llvm::Type * Param0;
1640   Intrinsic::ID  Param1;
1641   llvm::Type * Param2;
1642   switch (BuiltinID) {
1643   case ARM::BI__builtin_arm_mve_vdwdupq_m_wb_u16:
1644     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1645     Param1 = Intrinsic::arm_mve_vdwdup_predicated;
1646     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1647     break;
1648   case ARM::BI__builtin_arm_mve_vdwdupq_m_wb_u32:
1649     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1650     Param1 = Intrinsic::arm_mve_vdwdup_predicated;
1651     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
1652     break;
1653   case ARM::BI__builtin_arm_mve_vdwdupq_m_wb_u8:
1654     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1655     Param1 = Intrinsic::arm_mve_vdwdup_predicated;
1656     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1657     break;
1658   case ARM::BI__builtin_arm_mve_viwdupq_m_wb_u16:
1659     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1660     Param1 = Intrinsic::arm_mve_viwdup_predicated;
1661     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1662     break;
1663   case ARM::BI__builtin_arm_mve_viwdupq_m_wb_u32:
1664     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1665     Param1 = Intrinsic::arm_mve_viwdup_predicated;
1666     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
1667     break;
1668   case ARM::BI__builtin_arm_mve_viwdupq_m_wb_u8:
1669     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1670     Param1 = Intrinsic::arm_mve_viwdup_predicated;
1671     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1672     break;
1673   }
1674   Address Val0 = EmitPointerWithAlignment(E->getArg(1));
1675   Value *Val1 = Builder.CreateLoad(Val0);
1676   Value *Val2 = EmitScalarExpr(E->getArg(0));
1677   Value *Val3 = EmitScalarExpr(E->getArg(2));
1678   Value *Val4 = EmitScalarExpr(E->getArg(3));
1679   Value *Val5 = EmitScalarExpr(E->getArg(4));
1680   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
1681   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val6});
1682   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val2, Val1, Val3, Val4, Val7});
1683   Value *Val9 = Builder.CreateExtractValue(Val8, static_cast<unsigned>(1));
1684   Builder.CreateStore(Val9, Val0);
1685   return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
1686 }
1687 case ARM::BI__builtin_arm_mve_vld2q_f16:
1688 case ARM::BI__builtin_arm_mve_vld2q_f32:
1689 case ARM::BI__builtin_arm_mve_vld2q_s16:
1690 case ARM::BI__builtin_arm_mve_vld2q_s32:
1691 case ARM::BI__builtin_arm_mve_vld2q_s8:
1692 case ARM::BI__builtin_arm_mve_vld2q_u16:
1693 case ARM::BI__builtin_arm_mve_vld2q_u32:
1694 case ARM::BI__builtin_arm_mve_vld2q_u8: {
1695   CustomCodeGenType = CustomCodeGen::VLD24;
1696   IRIntr = Intrinsic::arm_mve_vld2q;
1697   NumVectors = 2;
1698   break; // custom code gen
1699 }
1700 case ARM::BI__builtin_arm_mve_vld4q_f16:
1701 case ARM::BI__builtin_arm_mve_vld4q_f32:
1702 case ARM::BI__builtin_arm_mve_vld4q_s16:
1703 case ARM::BI__builtin_arm_mve_vld4q_s32:
1704 case ARM::BI__builtin_arm_mve_vld4q_s8:
1705 case ARM::BI__builtin_arm_mve_vld4q_u16:
1706 case ARM::BI__builtin_arm_mve_vld4q_u32:
1707 case ARM::BI__builtin_arm_mve_vld4q_u8: {
1708   CustomCodeGenType = CustomCodeGen::VLD24;
1709   IRIntr = Intrinsic::arm_mve_vld4q;
1710   NumVectors = 4;
1711   break; // custom code gen
1712 }
1713 case ARM::BI__builtin_arm_mve_vst2q_f16:
1714 case ARM::BI__builtin_arm_mve_vst2q_f32:
1715 case ARM::BI__builtin_arm_mve_vst2q_s16:
1716 case ARM::BI__builtin_arm_mve_vst2q_s32:
1717 case ARM::BI__builtin_arm_mve_vst2q_s8:
1718 case ARM::BI__builtin_arm_mve_vst2q_u16:
1719 case ARM::BI__builtin_arm_mve_vst2q_u32:
1720 case ARM::BI__builtin_arm_mve_vst2q_u8: {
1721   CustomCodeGenType = CustomCodeGen::VST24;
1722   IRIntr = Intrinsic::arm_mve_vst2q;
1723   NumVectors = 2;
1724   break; // custom code gen
1725 }
1726 case ARM::BI__builtin_arm_mve_vst4q_f16:
1727 case ARM::BI__builtin_arm_mve_vst4q_f32:
1728 case ARM::BI__builtin_arm_mve_vst4q_s16:
1729 case ARM::BI__builtin_arm_mve_vst4q_s32:
1730 case ARM::BI__builtin_arm_mve_vst4q_s8:
1731 case ARM::BI__builtin_arm_mve_vst4q_u16:
1732 case ARM::BI__builtin_arm_mve_vst4q_u32:
1733 case ARM::BI__builtin_arm_mve_vst4q_u8: {
1734   CustomCodeGenType = CustomCodeGen::VST24;
1735   IRIntr = Intrinsic::arm_mve_vst4q;
1736   NumVectors = 4;
1737   break; // custom code gen
1738 }
1739 case ARM::BI__builtin_arm_mve_vmaxnmaq_f16:
1740 case ARM::BI__builtin_arm_mve_vmaxnmaq_f32:
1741 case ARM::BI__builtin_arm_mve_vminnmaq_f16:
1742 case ARM::BI__builtin_arm_mve_vminnmaq_f32: {
1743   llvm::Type * Param0;
1744   Intrinsic::ID  Param1;
1745   switch (BuiltinID) {
1746   case ARM::BI__builtin_arm_mve_vmaxnmaq_f16:
1747     Param0 = llvm::FixedVectorType::get(HalfTy, 8);
1748     Param1 = Intrinsic::maxnum;
1749     break;
1750   case ARM::BI__builtin_arm_mve_vmaxnmaq_f32:
1751     Param0 = llvm::FixedVectorType::get(FloatTy, 4);
1752     Param1 = Intrinsic::maxnum;
1753     break;
1754   case ARM::BI__builtin_arm_mve_vminnmaq_f16:
1755     Param0 = llvm::FixedVectorType::get(HalfTy, 8);
1756     Param1 = Intrinsic::minnum;
1757     break;
1758   case ARM::BI__builtin_arm_mve_vminnmaq_f32:
1759     Param0 = llvm::FixedVectorType::get(FloatTy, 4);
1760     Param1 = Intrinsic::minnum;
1761     break;
1762   }
1763   Value *Val0 = EmitScalarExpr(E->getArg(0));
1764   Value *Val1 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fabs, {Param0}), {Val0});
1765   Value *Val2 = EmitScalarExpr(E->getArg(1));
1766   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fabs, {Param0}), {Val2});
1767   return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param0}), {Val1, Val3});
1768 }
1769 case ARM::BI__builtin_arm_mve_vctp16q:
1770 case ARM::BI__builtin_arm_mve_vctp32q:
1771 case ARM::BI__builtin_arm_mve_vctp64q:
1772 case ARM::BI__builtin_arm_mve_vctp8q: {
1773   Intrinsic::ID  Param0;
1774   llvm::Type * Param1;
1775   switch (BuiltinID) {
1776   case ARM::BI__builtin_arm_mve_vctp16q:
1777     Param0 = Intrinsic::arm_mve_vctp16;
1778     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1779     break;
1780   case ARM::BI__builtin_arm_mve_vctp32q:
1781     Param0 = Intrinsic::arm_mve_vctp32;
1782     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1783     break;
1784   case ARM::BI__builtin_arm_mve_vctp64q:
1785     Param0 = Intrinsic::arm_mve_vctp64;
1786     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
1787     break;
1788   case ARM::BI__builtin_arm_mve_vctp8q:
1789     Param0 = Intrinsic::arm_mve_vctp8;
1790     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1791     break;
1792   }
1793   Value *Val0 = EmitScalarExpr(E->getArg(0));
1794   Value *Val1 = Builder.CreateCall(CGM.getIntrinsic(Param0), {Val0});
1795   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param1}), {Val1});
1796   return Builder.CreateIntCast(Val2, Int16Ty, false);
1797 }
1798 case ARM::BI__builtin_arm_mve_vmvnq_n_s32:
1799 case ARM::BI__builtin_arm_mve_vmvnq_n_u32: {
1800   bool  Param0;
1801   switch (BuiltinID) {
1802   case ARM::BI__builtin_arm_mve_vmvnq_n_s32:
1803     Param0 = true;
1804     break;
1805   case ARM::BI__builtin_arm_mve_vmvnq_n_u32:
1806     Param0 = false;
1807     break;
1808   }
1809   Value *Val0 = EmitScalarExpr(E->getArg(0));
1810   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, Param0);
1811   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
1812   return Builder.CreateNot(Val2);
1813 }
1814 case ARM::BI__builtin_arm_mve_vmvnq_n_s16:
1815 case ARM::BI__builtin_arm_mve_vmvnq_n_u16: {
1816   bool  Param0;
1817   switch (BuiltinID) {
1818   case ARM::BI__builtin_arm_mve_vmvnq_n_s16:
1819     Param0 = true;
1820     break;
1821   case ARM::BI__builtin_arm_mve_vmvnq_n_u16:
1822     Param0 = false;
1823     break;
1824   }
1825   Value *Val0 = EmitScalarExpr(E->getArg(0));
1826   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
1827   Value *Val2 = Builder.CreateIntCast(Val1, Int16Ty, Param0);
1828   Value *Val3 = ARMMVEVectorSplat(Builder, Val2);
1829   return Builder.CreateNot(Val3);
1830 }
1831 case ARM::BI__builtin_arm_mve_vmaxavq_s16:
1832 case ARM::BI__builtin_arm_mve_vmaxavq_s8:
1833 case ARM::BI__builtin_arm_mve_vminavq_s16:
1834 case ARM::BI__builtin_arm_mve_vminavq_s8: {
1835   Intrinsic::ID  Param0;
1836   llvm::Type * Param1;
1837   llvm::Type * Param2;
1838   switch (BuiltinID) {
1839   case ARM::BI__builtin_arm_mve_vmaxavq_s16:
1840     Param0 = Intrinsic::arm_mve_maxav;
1841     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
1842     Param2 = Int16Ty;
1843     break;
1844   case ARM::BI__builtin_arm_mve_vmaxavq_s8:
1845     Param0 = Intrinsic::arm_mve_maxav;
1846     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
1847     Param2 = Int8Ty;
1848     break;
1849   case ARM::BI__builtin_arm_mve_vminavq_s16:
1850     Param0 = Intrinsic::arm_mve_minav;
1851     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
1852     Param2 = Int16Ty;
1853     break;
1854   case ARM::BI__builtin_arm_mve_vminavq_s8:
1855     Param0 = Intrinsic::arm_mve_minav;
1856     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
1857     Param2 = Int8Ty;
1858     break;
1859   }
1860   Value *Val0 = EmitScalarExpr(E->getArg(0));
1861   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
1862   Value *Val2 = EmitScalarExpr(E->getArg(1));
1863   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val1, Val2});
1864   return Builder.CreateIntCast(Val3, Param2, false);
1865 }
1866 case ARM::BI__builtin_arm_mve_vmaxavq_p_s16:
1867 case ARM::BI__builtin_arm_mve_vmaxavq_p_s8:
1868 case ARM::BI__builtin_arm_mve_vminavq_p_s16:
1869 case ARM::BI__builtin_arm_mve_vminavq_p_s8: {
1870   llvm::Type * Param0;
1871   Intrinsic::ID  Param1;
1872   llvm::Type * Param2;
1873   llvm::Type * Param3;
1874   switch (BuiltinID) {
1875   case ARM::BI__builtin_arm_mve_vmaxavq_p_s16:
1876     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1877     Param1 = Intrinsic::arm_mve_maxav_predicated;
1878     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1879     Param3 = Int16Ty;
1880     break;
1881   case ARM::BI__builtin_arm_mve_vmaxavq_p_s8:
1882     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1883     Param1 = Intrinsic::arm_mve_maxav_predicated;
1884     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1885     Param3 = Int8Ty;
1886     break;
1887   case ARM::BI__builtin_arm_mve_vminavq_p_s16:
1888     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1889     Param1 = Intrinsic::arm_mve_minav_predicated;
1890     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1891     Param3 = Int16Ty;
1892     break;
1893   case ARM::BI__builtin_arm_mve_vminavq_p_s8:
1894     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1895     Param1 = Intrinsic::arm_mve_minav_predicated;
1896     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1897     Param3 = Int8Ty;
1898     break;
1899   }
1900   Value *Val0 = EmitScalarExpr(E->getArg(0));
1901   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
1902   Value *Val2 = EmitScalarExpr(E->getArg(1));
1903   Value *Val3 = EmitScalarExpr(E->getArg(2));
1904   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
1905   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val4});
1906   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val1, Val2, Val5});
1907   return Builder.CreateIntCast(Val6, Param3, false);
1908 }
1909 case ARM::BI__builtin_arm_mve_vmaxvq_s16:
1910 case ARM::BI__builtin_arm_mve_vmaxvq_s8:
1911 case ARM::BI__builtin_arm_mve_vmaxvq_u16:
1912 case ARM::BI__builtin_arm_mve_vmaxvq_u8:
1913 case ARM::BI__builtin_arm_mve_vminvq_s16:
1914 case ARM::BI__builtin_arm_mve_vminvq_s8:
1915 case ARM::BI__builtin_arm_mve_vminvq_u16:
1916 case ARM::BI__builtin_arm_mve_vminvq_u8: {
1917   uint32_t  Param0;
1918   Intrinsic::ID  Param1;
1919   llvm::Type * Param2;
1920   llvm::Type * Param3;
1921   bool  Param4;
1922   switch (BuiltinID) {
1923   case ARM::BI__builtin_arm_mve_vmaxvq_s16:
1924     Param0 = 0;
1925     Param1 = Intrinsic::arm_mve_maxv;
1926     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1927     Param3 = Int16Ty;
1928     Param4 = true;
1929     break;
1930   case ARM::BI__builtin_arm_mve_vmaxvq_s8:
1931     Param0 = 0;
1932     Param1 = Intrinsic::arm_mve_maxv;
1933     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1934     Param3 = Int8Ty;
1935     Param4 = true;
1936     break;
1937   case ARM::BI__builtin_arm_mve_vmaxvq_u16:
1938     Param0 = 1;
1939     Param1 = Intrinsic::arm_mve_maxv;
1940     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1941     Param3 = Int16Ty;
1942     Param4 = false;
1943     break;
1944   case ARM::BI__builtin_arm_mve_vmaxvq_u8:
1945     Param0 = 1;
1946     Param1 = Intrinsic::arm_mve_maxv;
1947     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1948     Param3 = Int8Ty;
1949     Param4 = false;
1950     break;
1951   case ARM::BI__builtin_arm_mve_vminvq_s16:
1952     Param0 = 0;
1953     Param1 = Intrinsic::arm_mve_minv;
1954     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1955     Param3 = Int16Ty;
1956     Param4 = true;
1957     break;
1958   case ARM::BI__builtin_arm_mve_vminvq_s8:
1959     Param0 = 0;
1960     Param1 = Intrinsic::arm_mve_minv;
1961     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1962     Param3 = Int8Ty;
1963     Param4 = true;
1964     break;
1965   case ARM::BI__builtin_arm_mve_vminvq_u16:
1966     Param0 = 1;
1967     Param1 = Intrinsic::arm_mve_minv;
1968     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1969     Param3 = Int16Ty;
1970     Param4 = false;
1971     break;
1972   case ARM::BI__builtin_arm_mve_vminvq_u8:
1973     Param0 = 1;
1974     Param1 = Intrinsic::arm_mve_minv;
1975     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1976     Param3 = Int8Ty;
1977     Param4 = false;
1978     break;
1979   }
1980   Value *Val0 = EmitScalarExpr(E->getArg(0));
1981   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
1982   Value *Val2 = EmitScalarExpr(E->getArg(1));
1983   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
1984   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2}), {Val1, Val2, Val3});
1985   return Builder.CreateIntCast(Val4, Param3, Param4);
1986 }
1987 case ARM::BI__builtin_arm_mve_vmaxvq_p_s16:
1988 case ARM::BI__builtin_arm_mve_vmaxvq_p_s8:
1989 case ARM::BI__builtin_arm_mve_vmaxvq_p_u16:
1990 case ARM::BI__builtin_arm_mve_vmaxvq_p_u8:
1991 case ARM::BI__builtin_arm_mve_vminvq_p_s16:
1992 case ARM::BI__builtin_arm_mve_vminvq_p_s8:
1993 case ARM::BI__builtin_arm_mve_vminvq_p_u16:
1994 case ARM::BI__builtin_arm_mve_vminvq_p_u8: {
1995   uint32_t  Param0;
1996   llvm::Type * Param1;
1997   Intrinsic::ID  Param2;
1998   llvm::Type * Param3;
1999   llvm::Type * Param4;
2000   bool  Param5;
2001   switch (BuiltinID) {
2002   case ARM::BI__builtin_arm_mve_vmaxvq_p_s16:
2003     Param0 = 0;
2004     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2005     Param2 = Intrinsic::arm_mve_maxv_predicated;
2006     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
2007     Param4 = Int16Ty;
2008     Param5 = true;
2009     break;
2010   case ARM::BI__builtin_arm_mve_vmaxvq_p_s8:
2011     Param0 = 0;
2012     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2013     Param2 = Intrinsic::arm_mve_maxv_predicated;
2014     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
2015     Param4 = Int8Ty;
2016     Param5 = true;
2017     break;
2018   case ARM::BI__builtin_arm_mve_vmaxvq_p_u16:
2019     Param0 = 1;
2020     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2021     Param2 = Intrinsic::arm_mve_maxv_predicated;
2022     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
2023     Param4 = Int16Ty;
2024     Param5 = false;
2025     break;
2026   case ARM::BI__builtin_arm_mve_vmaxvq_p_u8:
2027     Param0 = 1;
2028     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2029     Param2 = Intrinsic::arm_mve_maxv_predicated;
2030     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
2031     Param4 = Int8Ty;
2032     Param5 = false;
2033     break;
2034   case ARM::BI__builtin_arm_mve_vminvq_p_s16:
2035     Param0 = 0;
2036     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2037     Param2 = Intrinsic::arm_mve_minv_predicated;
2038     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
2039     Param4 = Int16Ty;
2040     Param5 = true;
2041     break;
2042   case ARM::BI__builtin_arm_mve_vminvq_p_s8:
2043     Param0 = 0;
2044     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2045     Param2 = Intrinsic::arm_mve_minv_predicated;
2046     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
2047     Param4 = Int8Ty;
2048     Param5 = true;
2049     break;
2050   case ARM::BI__builtin_arm_mve_vminvq_p_u16:
2051     Param0 = 1;
2052     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2053     Param2 = Intrinsic::arm_mve_minv_predicated;
2054     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
2055     Param4 = Int16Ty;
2056     Param5 = false;
2057     break;
2058   case ARM::BI__builtin_arm_mve_vminvq_p_u8:
2059     Param0 = 1;
2060     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2061     Param2 = Intrinsic::arm_mve_minv_predicated;
2062     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
2063     Param4 = Int8Ty;
2064     Param5 = false;
2065     break;
2066   }
2067   Value *Val0 = EmitScalarExpr(E->getArg(0));
2068   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
2069   Value *Val2 = EmitScalarExpr(E->getArg(1));
2070   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
2071   Value *Val4 = EmitScalarExpr(E->getArg(2));
2072   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
2073   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val5});
2074   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param1}), {Val1, Val2, Val3, Val6});
2075   return Builder.CreateIntCast(Val7, Param4, Param5);
2076 }
2077 case ARM::BI__builtin_arm_mve_vadcq_s32:
2078 case ARM::BI__builtin_arm_mve_vadcq_u32:
2079 case ARM::BI__builtin_arm_mve_vsbcq_s32:
2080 case ARM::BI__builtin_arm_mve_vsbcq_u32: {
2081   Intrinsic::ID  Param0;
2082   switch (BuiltinID) {
2083   case ARM::BI__builtin_arm_mve_vadcq_s32:
2084     Param0 = Intrinsic::arm_mve_vadc;
2085     break;
2086   case ARM::BI__builtin_arm_mve_vadcq_u32:
2087     Param0 = Intrinsic::arm_mve_vadc;
2088     break;
2089   case ARM::BI__builtin_arm_mve_vsbcq_s32:
2090     Param0 = Intrinsic::arm_mve_vsbc;
2091     break;
2092   case ARM::BI__builtin_arm_mve_vsbcq_u32:
2093     Param0 = Intrinsic::arm_mve_vsbc;
2094     break;
2095   }
2096   Value *Val0 = EmitScalarExpr(E->getArg(0));
2097   Value *Val1 = EmitScalarExpr(E->getArg(1));
2098   Address Val2 = EmitPointerWithAlignment(E->getArg(2));
2099   Value *Val3 = Builder.CreateLoad(Val2);
2100   Value *Val4 = llvm::ConstantInt::get(Int32Ty, 29);
2101   Value *Val5 = Builder.CreateShl(Val3, Val4);
2102   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4)}), {Val0, Val1, Val5});
2103   Value *Val7 = llvm::ConstantInt::get(Int32Ty, 1);
2104   Value *Val8 = Builder.CreateExtractValue(Val6, static_cast<unsigned>(1));
2105   Value *Val9 = llvm::ConstantInt::get(Int32Ty, 29);
2106   Value *Val10 = Builder.CreateLShr(Val8, Val9);
2107   Value *Val11 = Builder.CreateAnd(Val7, Val10);
2108   Builder.CreateStore(Val11, Val2);
2109   return Builder.CreateExtractValue(Val6, static_cast<unsigned>(0));
2110 }
2111 case ARM::BI__builtin_arm_mve_vcmpeqq_n_f16:
2112 case ARM::BI__builtin_arm_mve_vcmpeqq_n_f32: {
2113   llvm::Type * Param0;
2114   switch (BuiltinID) {
2115   case ARM::BI__builtin_arm_mve_vcmpeqq_n_f16:
2116     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2117     break;
2118   case ARM::BI__builtin_arm_mve_vcmpeqq_n_f32:
2119     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2120     break;
2121   }
2122   Value *Val0 = EmitScalarExpr(E->getArg(0));
2123   Value *Val1 = EmitScalarExpr(E->getArg(1));
2124   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2125   Value *Val3 = Builder.CreateFCmpOEQ(Val0, Val2);
2126   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2127   return Builder.CreateIntCast(Val4, Int16Ty, false);
2128 }
2129 case ARM::BI__builtin_arm_mve_vcmpgeq_n_f16:
2130 case ARM::BI__builtin_arm_mve_vcmpgeq_n_f32: {
2131   llvm::Type * Param0;
2132   switch (BuiltinID) {
2133   case ARM::BI__builtin_arm_mve_vcmpgeq_n_f16:
2134     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2135     break;
2136   case ARM::BI__builtin_arm_mve_vcmpgeq_n_f32:
2137     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2138     break;
2139   }
2140   Value *Val0 = EmitScalarExpr(E->getArg(0));
2141   Value *Val1 = EmitScalarExpr(E->getArg(1));
2142   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2143   Value *Val3 = Builder.CreateFCmpOGE(Val0, Val2);
2144   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2145   return Builder.CreateIntCast(Val4, Int16Ty, false);
2146 }
2147 case ARM::BI__builtin_arm_mve_vcmpgtq_n_f16:
2148 case ARM::BI__builtin_arm_mve_vcmpgtq_n_f32: {
2149   llvm::Type * Param0;
2150   switch (BuiltinID) {
2151   case ARM::BI__builtin_arm_mve_vcmpgtq_n_f16:
2152     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2153     break;
2154   case ARM::BI__builtin_arm_mve_vcmpgtq_n_f32:
2155     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2156     break;
2157   }
2158   Value *Val0 = EmitScalarExpr(E->getArg(0));
2159   Value *Val1 = EmitScalarExpr(E->getArg(1));
2160   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2161   Value *Val3 = Builder.CreateFCmpOGT(Val0, Val2);
2162   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2163   return Builder.CreateIntCast(Val4, Int16Ty, false);
2164 }
2165 case ARM::BI__builtin_arm_mve_vcmpleq_n_f16:
2166 case ARM::BI__builtin_arm_mve_vcmpleq_n_f32: {
2167   llvm::Type * Param0;
2168   switch (BuiltinID) {
2169   case ARM::BI__builtin_arm_mve_vcmpleq_n_f16:
2170     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2171     break;
2172   case ARM::BI__builtin_arm_mve_vcmpleq_n_f32:
2173     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2174     break;
2175   }
2176   Value *Val0 = EmitScalarExpr(E->getArg(0));
2177   Value *Val1 = EmitScalarExpr(E->getArg(1));
2178   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2179   Value *Val3 = Builder.CreateFCmpULE(Val0, Val2);
2180   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2181   return Builder.CreateIntCast(Val4, Int16Ty, false);
2182 }
2183 case ARM::BI__builtin_arm_mve_vcmpltq_n_f16:
2184 case ARM::BI__builtin_arm_mve_vcmpltq_n_f32: {
2185   llvm::Type * Param0;
2186   switch (BuiltinID) {
2187   case ARM::BI__builtin_arm_mve_vcmpltq_n_f16:
2188     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2189     break;
2190   case ARM::BI__builtin_arm_mve_vcmpltq_n_f32:
2191     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2192     break;
2193   }
2194   Value *Val0 = EmitScalarExpr(E->getArg(0));
2195   Value *Val1 = EmitScalarExpr(E->getArg(1));
2196   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2197   Value *Val3 = Builder.CreateFCmpULT(Val0, Val2);
2198   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2199   return Builder.CreateIntCast(Val4, Int16Ty, false);
2200 }
2201 case ARM::BI__builtin_arm_mve_vcmpneq_n_f16:
2202 case ARM::BI__builtin_arm_mve_vcmpneq_n_f32: {
2203   llvm::Type * Param0;
2204   switch (BuiltinID) {
2205   case ARM::BI__builtin_arm_mve_vcmpneq_n_f16:
2206     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2207     break;
2208   case ARM::BI__builtin_arm_mve_vcmpneq_n_f32:
2209     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2210     break;
2211   }
2212   Value *Val0 = EmitScalarExpr(E->getArg(0));
2213   Value *Val1 = EmitScalarExpr(E->getArg(1));
2214   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2215   Value *Val3 = Builder.CreateFCmpUNE(Val0, Val2);
2216   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2217   return Builder.CreateIntCast(Val4, Int16Ty, false);
2218 }
2219 case ARM::BI__builtin_arm_mve_vcmpeqq_n_s16:
2220 case ARM::BI__builtin_arm_mve_vcmpeqq_n_s32:
2221 case ARM::BI__builtin_arm_mve_vcmpeqq_n_s8:
2222 case ARM::BI__builtin_arm_mve_vcmpeqq_n_u16:
2223 case ARM::BI__builtin_arm_mve_vcmpeqq_n_u32:
2224 case ARM::BI__builtin_arm_mve_vcmpeqq_n_u8: {
2225   llvm::Type * Param0;
2226   switch (BuiltinID) {
2227   case ARM::BI__builtin_arm_mve_vcmpeqq_n_s16:
2228     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2229     break;
2230   case ARM::BI__builtin_arm_mve_vcmpeqq_n_s32:
2231     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2232     break;
2233   case ARM::BI__builtin_arm_mve_vcmpeqq_n_s8:
2234     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2235     break;
2236   case ARM::BI__builtin_arm_mve_vcmpeqq_n_u16:
2237     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2238     break;
2239   case ARM::BI__builtin_arm_mve_vcmpeqq_n_u32:
2240     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2241     break;
2242   case ARM::BI__builtin_arm_mve_vcmpeqq_n_u8:
2243     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2244     break;
2245   }
2246   Value *Val0 = EmitScalarExpr(E->getArg(0));
2247   Value *Val1 = EmitScalarExpr(E->getArg(1));
2248   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2249   Value *Val3 = Builder.CreateICmpEQ(Val0, Val2);
2250   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2251   return Builder.CreateIntCast(Val4, Int16Ty, false);
2252 }
2253 case ARM::BI__builtin_arm_mve_vcmpneq_n_s16:
2254 case ARM::BI__builtin_arm_mve_vcmpneq_n_s32:
2255 case ARM::BI__builtin_arm_mve_vcmpneq_n_s8:
2256 case ARM::BI__builtin_arm_mve_vcmpneq_n_u16:
2257 case ARM::BI__builtin_arm_mve_vcmpneq_n_u32:
2258 case ARM::BI__builtin_arm_mve_vcmpneq_n_u8: {
2259   llvm::Type * Param0;
2260   switch (BuiltinID) {
2261   case ARM::BI__builtin_arm_mve_vcmpneq_n_s16:
2262     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2263     break;
2264   case ARM::BI__builtin_arm_mve_vcmpneq_n_s32:
2265     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2266     break;
2267   case ARM::BI__builtin_arm_mve_vcmpneq_n_s8:
2268     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2269     break;
2270   case ARM::BI__builtin_arm_mve_vcmpneq_n_u16:
2271     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2272     break;
2273   case ARM::BI__builtin_arm_mve_vcmpneq_n_u32:
2274     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2275     break;
2276   case ARM::BI__builtin_arm_mve_vcmpneq_n_u8:
2277     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2278     break;
2279   }
2280   Value *Val0 = EmitScalarExpr(E->getArg(0));
2281   Value *Val1 = EmitScalarExpr(E->getArg(1));
2282   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2283   Value *Val3 = Builder.CreateICmpNE(Val0, Val2);
2284   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2285   return Builder.CreateIntCast(Val4, Int16Ty, false);
2286 }
2287 case ARM::BI__builtin_arm_mve_vcmpgeq_n_s16:
2288 case ARM::BI__builtin_arm_mve_vcmpgeq_n_s32:
2289 case ARM::BI__builtin_arm_mve_vcmpgeq_n_s8: {
2290   llvm::Type * Param0;
2291   switch (BuiltinID) {
2292   case ARM::BI__builtin_arm_mve_vcmpgeq_n_s16:
2293     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2294     break;
2295   case ARM::BI__builtin_arm_mve_vcmpgeq_n_s32:
2296     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2297     break;
2298   case ARM::BI__builtin_arm_mve_vcmpgeq_n_s8:
2299     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2300     break;
2301   }
2302   Value *Val0 = EmitScalarExpr(E->getArg(0));
2303   Value *Val1 = EmitScalarExpr(E->getArg(1));
2304   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2305   Value *Val3 = Builder.CreateICmpSGE(Val0, Val2);
2306   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2307   return Builder.CreateIntCast(Val4, Int16Ty, false);
2308 }
2309 case ARM::BI__builtin_arm_mve_vcmpgtq_n_s16:
2310 case ARM::BI__builtin_arm_mve_vcmpgtq_n_s32:
2311 case ARM::BI__builtin_arm_mve_vcmpgtq_n_s8: {
2312   llvm::Type * Param0;
2313   switch (BuiltinID) {
2314   case ARM::BI__builtin_arm_mve_vcmpgtq_n_s16:
2315     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2316     break;
2317   case ARM::BI__builtin_arm_mve_vcmpgtq_n_s32:
2318     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2319     break;
2320   case ARM::BI__builtin_arm_mve_vcmpgtq_n_s8:
2321     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2322     break;
2323   }
2324   Value *Val0 = EmitScalarExpr(E->getArg(0));
2325   Value *Val1 = EmitScalarExpr(E->getArg(1));
2326   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2327   Value *Val3 = Builder.CreateICmpSGT(Val0, Val2);
2328   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2329   return Builder.CreateIntCast(Val4, Int16Ty, false);
2330 }
2331 case ARM::BI__builtin_arm_mve_vcmpleq_n_s16:
2332 case ARM::BI__builtin_arm_mve_vcmpleq_n_s32:
2333 case ARM::BI__builtin_arm_mve_vcmpleq_n_s8: {
2334   llvm::Type * Param0;
2335   switch (BuiltinID) {
2336   case ARM::BI__builtin_arm_mve_vcmpleq_n_s16:
2337     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2338     break;
2339   case ARM::BI__builtin_arm_mve_vcmpleq_n_s32:
2340     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2341     break;
2342   case ARM::BI__builtin_arm_mve_vcmpleq_n_s8:
2343     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2344     break;
2345   }
2346   Value *Val0 = EmitScalarExpr(E->getArg(0));
2347   Value *Val1 = EmitScalarExpr(E->getArg(1));
2348   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2349   Value *Val3 = Builder.CreateICmpSLE(Val0, Val2);
2350   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2351   return Builder.CreateIntCast(Val4, Int16Ty, false);
2352 }
2353 case ARM::BI__builtin_arm_mve_vcmpltq_n_s16:
2354 case ARM::BI__builtin_arm_mve_vcmpltq_n_s32:
2355 case ARM::BI__builtin_arm_mve_vcmpltq_n_s8: {
2356   llvm::Type * Param0;
2357   switch (BuiltinID) {
2358   case ARM::BI__builtin_arm_mve_vcmpltq_n_s16:
2359     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2360     break;
2361   case ARM::BI__builtin_arm_mve_vcmpltq_n_s32:
2362     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2363     break;
2364   case ARM::BI__builtin_arm_mve_vcmpltq_n_s8:
2365     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2366     break;
2367   }
2368   Value *Val0 = EmitScalarExpr(E->getArg(0));
2369   Value *Val1 = EmitScalarExpr(E->getArg(1));
2370   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2371   Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
2372   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2373   return Builder.CreateIntCast(Val4, Int16Ty, false);
2374 }
2375 case ARM::BI__builtin_arm_mve_vcmpcsq_n_u16:
2376 case ARM::BI__builtin_arm_mve_vcmpcsq_n_u32:
2377 case ARM::BI__builtin_arm_mve_vcmpcsq_n_u8: {
2378   llvm::Type * Param0;
2379   switch (BuiltinID) {
2380   case ARM::BI__builtin_arm_mve_vcmpcsq_n_u16:
2381     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2382     break;
2383   case ARM::BI__builtin_arm_mve_vcmpcsq_n_u32:
2384     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2385     break;
2386   case ARM::BI__builtin_arm_mve_vcmpcsq_n_u8:
2387     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2388     break;
2389   }
2390   Value *Val0 = EmitScalarExpr(E->getArg(0));
2391   Value *Val1 = EmitScalarExpr(E->getArg(1));
2392   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2393   Value *Val3 = Builder.CreateICmpUGE(Val0, Val2);
2394   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2395   return Builder.CreateIntCast(Val4, Int16Ty, false);
2396 }
2397 case ARM::BI__builtin_arm_mve_vcmphiq_n_u16:
2398 case ARM::BI__builtin_arm_mve_vcmphiq_n_u32:
2399 case ARM::BI__builtin_arm_mve_vcmphiq_n_u8: {
2400   llvm::Type * Param0;
2401   switch (BuiltinID) {
2402   case ARM::BI__builtin_arm_mve_vcmphiq_n_u16:
2403     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2404     break;
2405   case ARM::BI__builtin_arm_mve_vcmphiq_n_u32:
2406     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2407     break;
2408   case ARM::BI__builtin_arm_mve_vcmphiq_n_u8:
2409     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2410     break;
2411   }
2412   Value *Val0 = EmitScalarExpr(E->getArg(0));
2413   Value *Val1 = EmitScalarExpr(E->getArg(1));
2414   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2415   Value *Val3 = Builder.CreateICmpUGT(Val0, Val2);
2416   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2417   return Builder.CreateIntCast(Val4, Int16Ty, false);
2418 }
2419 case ARM::BI__builtin_arm_mve_vqdmullbq_n_s16:
2420 case ARM::BI__builtin_arm_mve_vqdmullbq_n_s32:
2421 case ARM::BI__builtin_arm_mve_vqdmulltq_n_s16:
2422 case ARM::BI__builtin_arm_mve_vqdmulltq_n_s32: {
2423   uint32_t  Param0;
2424   llvm::Type * Param1;
2425   llvm::Type * Param2;
2426   switch (BuiltinID) {
2427   case ARM::BI__builtin_arm_mve_vqdmullbq_n_s16:
2428     Param0 = 0;
2429     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2430     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
2431     break;
2432   case ARM::BI__builtin_arm_mve_vqdmullbq_n_s32:
2433     Param0 = 0;
2434     Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
2435     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
2436     break;
2437   case ARM::BI__builtin_arm_mve_vqdmulltq_n_s16:
2438     Param0 = 1;
2439     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2440     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
2441     break;
2442   case ARM::BI__builtin_arm_mve_vqdmulltq_n_s32:
2443     Param0 = 1;
2444     Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
2445     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
2446     break;
2447   }
2448   Value *Val0 = EmitScalarExpr(E->getArg(0));
2449   Value *Val1 = EmitScalarExpr(E->getArg(1));
2450   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2451   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
2452   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vqdmull, {Param1, Param2}), {Val0, Val2, Val3});
2453 }
2454 case ARM::BI__builtin_arm_mve_vhaddq_n_s16:
2455 case ARM::BI__builtin_arm_mve_vhaddq_n_s32:
2456 case ARM::BI__builtin_arm_mve_vhaddq_n_s8:
2457 case ARM::BI__builtin_arm_mve_vhaddq_n_u16:
2458 case ARM::BI__builtin_arm_mve_vhaddq_n_u32:
2459 case ARM::BI__builtin_arm_mve_vhaddq_n_u8:
2460 case ARM::BI__builtin_arm_mve_vhsubq_n_s16:
2461 case ARM::BI__builtin_arm_mve_vhsubq_n_s32:
2462 case ARM::BI__builtin_arm_mve_vhsubq_n_s8:
2463 case ARM::BI__builtin_arm_mve_vhsubq_n_u16:
2464 case ARM::BI__builtin_arm_mve_vhsubq_n_u32:
2465 case ARM::BI__builtin_arm_mve_vhsubq_n_u8: {
2466   uint32_t  Param0;
2467   Intrinsic::ID  Param1;
2468   llvm::Type * Param2;
2469   switch (BuiltinID) {
2470   case ARM::BI__builtin_arm_mve_vhaddq_n_s16:
2471     Param0 = 0;
2472     Param1 = Intrinsic::arm_mve_vhadd;
2473     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
2474     break;
2475   case ARM::BI__builtin_arm_mve_vhaddq_n_s32:
2476     Param0 = 0;
2477     Param1 = Intrinsic::arm_mve_vhadd;
2478     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
2479     break;
2480   case ARM::BI__builtin_arm_mve_vhaddq_n_s8:
2481     Param0 = 0;
2482     Param1 = Intrinsic::arm_mve_vhadd;
2483     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
2484     break;
2485   case ARM::BI__builtin_arm_mve_vhaddq_n_u16:
2486     Param0 = 1;
2487     Param1 = Intrinsic::arm_mve_vhadd;
2488     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
2489     break;
2490   case ARM::BI__builtin_arm_mve_vhaddq_n_u32:
2491     Param0 = 1;
2492     Param1 = Intrinsic::arm_mve_vhadd;
2493     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
2494     break;
2495   case ARM::BI__builtin_arm_mve_vhaddq_n_u8:
2496     Param0 = 1;
2497     Param1 = Intrinsic::arm_mve_vhadd;
2498     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
2499     break;
2500   case ARM::BI__builtin_arm_mve_vhsubq_n_s16:
2501     Param0 = 0;
2502     Param1 = Intrinsic::arm_mve_vhsub;
2503     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
2504     break;
2505   case ARM::BI__builtin_arm_mve_vhsubq_n_s32:
2506     Param0 = 0;
2507     Param1 = Intrinsic::arm_mve_vhsub;
2508     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
2509     break;
2510   case ARM::BI__builtin_arm_mve_vhsubq_n_s8:
2511     Param0 = 0;
2512     Param1 = Intrinsic::arm_mve_vhsub;
2513     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
2514     break;
2515   case ARM::BI__builtin_arm_mve_vhsubq_n_u16:
2516     Param0 = 1;
2517     Param1 = Intrinsic::arm_mve_vhsub;
2518     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
2519     break;
2520   case ARM::BI__builtin_arm_mve_vhsubq_n_u32:
2521     Param0 = 1;
2522     Param1 = Intrinsic::arm_mve_vhsub;
2523     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
2524     break;
2525   case ARM::BI__builtin_arm_mve_vhsubq_n_u8:
2526     Param0 = 1;
2527     Param1 = Intrinsic::arm_mve_vhsub;
2528     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
2529     break;
2530   }
2531   Value *Val0 = EmitScalarExpr(E->getArg(0));
2532   Value *Val1 = EmitScalarExpr(E->getArg(1));
2533   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2534   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
2535   return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2}), {Val0, Val2, Val3});
2536 }
2537 case ARM::BI__builtin_arm_mve_vaddq_n_s16:
2538 case ARM::BI__builtin_arm_mve_vaddq_n_s32:
2539 case ARM::BI__builtin_arm_mve_vaddq_n_s8:
2540 case ARM::BI__builtin_arm_mve_vaddq_n_u16:
2541 case ARM::BI__builtin_arm_mve_vaddq_n_u32:
2542 case ARM::BI__builtin_arm_mve_vaddq_n_u8: {
2543   Value *Val0 = EmitScalarExpr(E->getArg(0));
2544   Value *Val1 = EmitScalarExpr(E->getArg(1));
2545   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2546   return Builder.CreateAdd(Val0, Val2);
2547 }
2548 case ARM::BI__builtin_arm_mve_vqaddq_n_s16:
2549 case ARM::BI__builtin_arm_mve_vqaddq_n_s32:
2550 case ARM::BI__builtin_arm_mve_vqaddq_n_s8:
2551 case ARM::BI__builtin_arm_mve_vqaddq_n_u16:
2552 case ARM::BI__builtin_arm_mve_vqaddq_n_u32:
2553 case ARM::BI__builtin_arm_mve_vqaddq_n_u8:
2554 case ARM::BI__builtin_arm_mve_vqdmulhq_n_s16:
2555 case ARM::BI__builtin_arm_mve_vqdmulhq_n_s32:
2556 case ARM::BI__builtin_arm_mve_vqdmulhq_n_s8:
2557 case ARM::BI__builtin_arm_mve_vqrdmulhq_n_s16:
2558 case ARM::BI__builtin_arm_mve_vqrdmulhq_n_s32:
2559 case ARM::BI__builtin_arm_mve_vqrdmulhq_n_s8:
2560 case ARM::BI__builtin_arm_mve_vqsubq_n_s16:
2561 case ARM::BI__builtin_arm_mve_vqsubq_n_s32:
2562 case ARM::BI__builtin_arm_mve_vqsubq_n_s8:
2563 case ARM::BI__builtin_arm_mve_vqsubq_n_u16:
2564 case ARM::BI__builtin_arm_mve_vqsubq_n_u32:
2565 case ARM::BI__builtin_arm_mve_vqsubq_n_u8: {
2566   Intrinsic::ID  Param0;
2567   llvm::Type * Param1;
2568   switch (BuiltinID) {
2569   case ARM::BI__builtin_arm_mve_vqaddq_n_s16:
2570     Param0 = Intrinsic::sadd_sat;
2571     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
2572     break;
2573   case ARM::BI__builtin_arm_mve_vqaddq_n_s32:
2574     Param0 = Intrinsic::sadd_sat;
2575     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2576     break;
2577   case ARM::BI__builtin_arm_mve_vqaddq_n_s8:
2578     Param0 = Intrinsic::sadd_sat;
2579     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
2580     break;
2581   case ARM::BI__builtin_arm_mve_vqaddq_n_u16:
2582     Param0 = Intrinsic::uadd_sat;
2583     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
2584     break;
2585   case ARM::BI__builtin_arm_mve_vqaddq_n_u32:
2586     Param0 = Intrinsic::uadd_sat;
2587     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2588     break;
2589   case ARM::BI__builtin_arm_mve_vqaddq_n_u8:
2590     Param0 = Intrinsic::uadd_sat;
2591     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
2592     break;
2593   case ARM::BI__builtin_arm_mve_vqdmulhq_n_s16:
2594     Param0 = Intrinsic::arm_mve_vqdmulh;
2595     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
2596     break;
2597   case ARM::BI__builtin_arm_mve_vqdmulhq_n_s32:
2598     Param0 = Intrinsic::arm_mve_vqdmulh;
2599     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2600     break;
2601   case ARM::BI__builtin_arm_mve_vqdmulhq_n_s8:
2602     Param0 = Intrinsic::arm_mve_vqdmulh;
2603     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
2604     break;
2605   case ARM::BI__builtin_arm_mve_vqrdmulhq_n_s16:
2606     Param0 = Intrinsic::arm_mve_vqrdmulh;
2607     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
2608     break;
2609   case ARM::BI__builtin_arm_mve_vqrdmulhq_n_s32:
2610     Param0 = Intrinsic::arm_mve_vqrdmulh;
2611     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2612     break;
2613   case ARM::BI__builtin_arm_mve_vqrdmulhq_n_s8:
2614     Param0 = Intrinsic::arm_mve_vqrdmulh;
2615     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
2616     break;
2617   case ARM::BI__builtin_arm_mve_vqsubq_n_s16:
2618     Param0 = Intrinsic::ssub_sat;
2619     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
2620     break;
2621   case ARM::BI__builtin_arm_mve_vqsubq_n_s32:
2622     Param0 = Intrinsic::ssub_sat;
2623     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2624     break;
2625   case ARM::BI__builtin_arm_mve_vqsubq_n_s8:
2626     Param0 = Intrinsic::ssub_sat;
2627     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
2628     break;
2629   case ARM::BI__builtin_arm_mve_vqsubq_n_u16:
2630     Param0 = Intrinsic::usub_sat;
2631     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
2632     break;
2633   case ARM::BI__builtin_arm_mve_vqsubq_n_u32:
2634     Param0 = Intrinsic::usub_sat;
2635     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2636     break;
2637   case ARM::BI__builtin_arm_mve_vqsubq_n_u8:
2638     Param0 = Intrinsic::usub_sat;
2639     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
2640     break;
2641   }
2642   Value *Val0 = EmitScalarExpr(E->getArg(0));
2643   Value *Val1 = EmitScalarExpr(E->getArg(1));
2644   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2645   return Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0, Val2});
2646 }
2647 case ARM::BI__builtin_arm_mve_vaddq_n_f16:
2648 case ARM::BI__builtin_arm_mve_vaddq_n_f32: {
2649   Value *Val0 = EmitScalarExpr(E->getArg(0));
2650   Value *Val1 = EmitScalarExpr(E->getArg(1));
2651   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2652   return Builder.CreateFAdd(Val0, Val2);
2653 }
2654 case ARM::BI__builtin_arm_mve_vmulq_n_f16:
2655 case ARM::BI__builtin_arm_mve_vmulq_n_f32: {
2656   Value *Val0 = EmitScalarExpr(E->getArg(0));
2657   Value *Val1 = EmitScalarExpr(E->getArg(1));
2658   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2659   return Builder.CreateFMul(Val0, Val2);
2660 }
2661 case ARM::BI__builtin_arm_mve_vsubq_n_f16:
2662 case ARM::BI__builtin_arm_mve_vsubq_n_f32: {
2663   Value *Val0 = EmitScalarExpr(E->getArg(0));
2664   Value *Val1 = EmitScalarExpr(E->getArg(1));
2665   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2666   return Builder.CreateFSub(Val0, Val2);
2667 }
2668 case ARM::BI__builtin_arm_mve_vmulq_n_s16:
2669 case ARM::BI__builtin_arm_mve_vmulq_n_s32:
2670 case ARM::BI__builtin_arm_mve_vmulq_n_s8:
2671 case ARM::BI__builtin_arm_mve_vmulq_n_u16:
2672 case ARM::BI__builtin_arm_mve_vmulq_n_u32:
2673 case ARM::BI__builtin_arm_mve_vmulq_n_u8: {
2674   Value *Val0 = EmitScalarExpr(E->getArg(0));
2675   Value *Val1 = EmitScalarExpr(E->getArg(1));
2676   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2677   return Builder.CreateMul(Val0, Val2);
2678 }
2679 case ARM::BI__builtin_arm_mve_vsubq_n_s16:
2680 case ARM::BI__builtin_arm_mve_vsubq_n_s32:
2681 case ARM::BI__builtin_arm_mve_vsubq_n_s8:
2682 case ARM::BI__builtin_arm_mve_vsubq_n_u16:
2683 case ARM::BI__builtin_arm_mve_vsubq_n_u32:
2684 case ARM::BI__builtin_arm_mve_vsubq_n_u8: {
2685   Value *Val0 = EmitScalarExpr(E->getArg(0));
2686   Value *Val1 = EmitScalarExpr(E->getArg(1));
2687   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2688   return Builder.CreateSub(Val0, Val2);
2689 }
2690 case ARM::BI__builtin_arm_mve_vmaxnmavq_f16:
2691 case ARM::BI__builtin_arm_mve_vmaxnmavq_f32:
2692 case ARM::BI__builtin_arm_mve_vmaxnmvq_f16:
2693 case ARM::BI__builtin_arm_mve_vmaxnmvq_f32:
2694 case ARM::BI__builtin_arm_mve_vminnmavq_f16:
2695 case ARM::BI__builtin_arm_mve_vminnmavq_f32:
2696 case ARM::BI__builtin_arm_mve_vminnmvq_f16:
2697 case ARM::BI__builtin_arm_mve_vminnmvq_f32: {
2698   Intrinsic::ID  Param0;
2699   llvm::Type * Param1;
2700   llvm::Type * Param2;
2701   switch (BuiltinID) {
2702   case ARM::BI__builtin_arm_mve_vmaxnmavq_f16:
2703     Param0 = Intrinsic::arm_mve_maxnmav;
2704     Param1 = HalfTy;
2705     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
2706     break;
2707   case ARM::BI__builtin_arm_mve_vmaxnmavq_f32:
2708     Param0 = Intrinsic::arm_mve_maxnmav;
2709     Param1 = FloatTy;
2710     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
2711     break;
2712   case ARM::BI__builtin_arm_mve_vmaxnmvq_f16:
2713     Param0 = Intrinsic::arm_mve_maxnmv;
2714     Param1 = HalfTy;
2715     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
2716     break;
2717   case ARM::BI__builtin_arm_mve_vmaxnmvq_f32:
2718     Param0 = Intrinsic::arm_mve_maxnmv;
2719     Param1 = FloatTy;
2720     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
2721     break;
2722   case ARM::BI__builtin_arm_mve_vminnmavq_f16:
2723     Param0 = Intrinsic::arm_mve_minnmav;
2724     Param1 = HalfTy;
2725     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
2726     break;
2727   case ARM::BI__builtin_arm_mve_vminnmavq_f32:
2728     Param0 = Intrinsic::arm_mve_minnmav;
2729     Param1 = FloatTy;
2730     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
2731     break;
2732   case ARM::BI__builtin_arm_mve_vminnmvq_f16:
2733     Param0 = Intrinsic::arm_mve_minnmv;
2734     Param1 = HalfTy;
2735     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
2736     break;
2737   case ARM::BI__builtin_arm_mve_vminnmvq_f32:
2738     Param0 = Intrinsic::arm_mve_minnmv;
2739     Param1 = FloatTy;
2740     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
2741     break;
2742   }
2743   Value *Val0 = EmitScalarExpr(E->getArg(0));
2744   Value *Val1 = EmitScalarExpr(E->getArg(1));
2745   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1, Param2}), {Val0, Val1});
2746   return (Val2);
2747 }
2748 case ARM::BI__builtin_arm_mve_vddupq_n_u16:
2749 case ARM::BI__builtin_arm_mve_vddupq_n_u32:
2750 case ARM::BI__builtin_arm_mve_vddupq_n_u8:
2751 case ARM::BI__builtin_arm_mve_vidupq_n_u16:
2752 case ARM::BI__builtin_arm_mve_vidupq_n_u32:
2753 case ARM::BI__builtin_arm_mve_vidupq_n_u8: {
2754   Intrinsic::ID  Param0;
2755   llvm::Type * Param1;
2756   switch (BuiltinID) {
2757   case ARM::BI__builtin_arm_mve_vddupq_n_u16:
2758     Param0 = Intrinsic::arm_mve_vddup;
2759     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
2760     break;
2761   case ARM::BI__builtin_arm_mve_vddupq_n_u32:
2762     Param0 = Intrinsic::arm_mve_vddup;
2763     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2764     break;
2765   case ARM::BI__builtin_arm_mve_vddupq_n_u8:
2766     Param0 = Intrinsic::arm_mve_vddup;
2767     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
2768     break;
2769   case ARM::BI__builtin_arm_mve_vidupq_n_u16:
2770     Param0 = Intrinsic::arm_mve_vidup;
2771     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
2772     break;
2773   case ARM::BI__builtin_arm_mve_vidupq_n_u32:
2774     Param0 = Intrinsic::arm_mve_vidup;
2775     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2776     break;
2777   case ARM::BI__builtin_arm_mve_vidupq_n_u8:
2778     Param0 = Intrinsic::arm_mve_vidup;
2779     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
2780     break;
2781   }
2782   Value *Val0 = EmitScalarExpr(E->getArg(0));
2783   Value *Val1 = EmitScalarExpr(E->getArg(1));
2784   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0, Val1});
2785   return Builder.CreateExtractValue(Val2, static_cast<unsigned>(0));
2786 }
2787 case ARM::BI__builtin_arm_mve_vmaxavq_s32:
2788 case ARM::BI__builtin_arm_mve_vminavq_s32: {
2789   Intrinsic::ID  Param0;
2790   switch (BuiltinID) {
2791   case ARM::BI__builtin_arm_mve_vmaxavq_s32:
2792     Param0 = Intrinsic::arm_mve_maxav;
2793     break;
2794   case ARM::BI__builtin_arm_mve_vminavq_s32:
2795     Param0 = Intrinsic::arm_mve_minav;
2796     break;
2797   }
2798   Value *Val0 = EmitScalarExpr(E->getArg(0));
2799   Value *Val1 = EmitScalarExpr(E->getArg(1));
2800   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4)}), {Val0, Val1});
2801   return Builder.CreateIntCast(Val2, Int32Ty, false);
2802 }
2803 case ARM::BI__builtin_arm_mve_vcmpeqq_f16:
2804 case ARM::BI__builtin_arm_mve_vcmpeqq_f32: {
2805   llvm::Type * Param0;
2806   switch (BuiltinID) {
2807   case ARM::BI__builtin_arm_mve_vcmpeqq_f16:
2808     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2809     break;
2810   case ARM::BI__builtin_arm_mve_vcmpeqq_f32:
2811     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2812     break;
2813   }
2814   Value *Val0 = EmitScalarExpr(E->getArg(0));
2815   Value *Val1 = EmitScalarExpr(E->getArg(1));
2816   Value *Val2 = Builder.CreateFCmpOEQ(Val0, Val1);
2817   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
2818   return Builder.CreateIntCast(Val3, Int16Ty, false);
2819 }
2820 case ARM::BI__builtin_arm_mve_vcmpgeq_f16:
2821 case ARM::BI__builtin_arm_mve_vcmpgeq_f32: {
2822   llvm::Type * Param0;
2823   switch (BuiltinID) {
2824   case ARM::BI__builtin_arm_mve_vcmpgeq_f16:
2825     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2826     break;
2827   case ARM::BI__builtin_arm_mve_vcmpgeq_f32:
2828     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2829     break;
2830   }
2831   Value *Val0 = EmitScalarExpr(E->getArg(0));
2832   Value *Val1 = EmitScalarExpr(E->getArg(1));
2833   Value *Val2 = Builder.CreateFCmpOGE(Val0, Val1);
2834   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
2835   return Builder.CreateIntCast(Val3, Int16Ty, false);
2836 }
2837 case ARM::BI__builtin_arm_mve_vcmpgtq_f16:
2838 case ARM::BI__builtin_arm_mve_vcmpgtq_f32: {
2839   llvm::Type * Param0;
2840   switch (BuiltinID) {
2841   case ARM::BI__builtin_arm_mve_vcmpgtq_f16:
2842     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2843     break;
2844   case ARM::BI__builtin_arm_mve_vcmpgtq_f32:
2845     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2846     break;
2847   }
2848   Value *Val0 = EmitScalarExpr(E->getArg(0));
2849   Value *Val1 = EmitScalarExpr(E->getArg(1));
2850   Value *Val2 = Builder.CreateFCmpOGT(Val0, Val1);
2851   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
2852   return Builder.CreateIntCast(Val3, Int16Ty, false);
2853 }
2854 case ARM::BI__builtin_arm_mve_vcmpleq_f16:
2855 case ARM::BI__builtin_arm_mve_vcmpleq_f32: {
2856   llvm::Type * Param0;
2857   switch (BuiltinID) {
2858   case ARM::BI__builtin_arm_mve_vcmpleq_f16:
2859     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2860     break;
2861   case ARM::BI__builtin_arm_mve_vcmpleq_f32:
2862     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2863     break;
2864   }
2865   Value *Val0 = EmitScalarExpr(E->getArg(0));
2866   Value *Val1 = EmitScalarExpr(E->getArg(1));
2867   Value *Val2 = Builder.CreateFCmpULE(Val0, Val1);
2868   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
2869   return Builder.CreateIntCast(Val3, Int16Ty, false);
2870 }
2871 case ARM::BI__builtin_arm_mve_vcmpltq_f16:
2872 case ARM::BI__builtin_arm_mve_vcmpltq_f32: {
2873   llvm::Type * Param0;
2874   switch (BuiltinID) {
2875   case ARM::BI__builtin_arm_mve_vcmpltq_f16:
2876     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2877     break;
2878   case ARM::BI__builtin_arm_mve_vcmpltq_f32:
2879     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2880     break;
2881   }
2882   Value *Val0 = EmitScalarExpr(E->getArg(0));
2883   Value *Val1 = EmitScalarExpr(E->getArg(1));
2884   Value *Val2 = Builder.CreateFCmpULT(Val0, Val1);
2885   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
2886   return Builder.CreateIntCast(Val3, Int16Ty, false);
2887 }
2888 case ARM::BI__builtin_arm_mve_vcmpneq_f16:
2889 case ARM::BI__builtin_arm_mve_vcmpneq_f32: {
2890   llvm::Type * Param0;
2891   switch (BuiltinID) {
2892   case ARM::BI__builtin_arm_mve_vcmpneq_f16:
2893     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2894     break;
2895   case ARM::BI__builtin_arm_mve_vcmpneq_f32:
2896     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2897     break;
2898   }
2899   Value *Val0 = EmitScalarExpr(E->getArg(0));
2900   Value *Val1 = EmitScalarExpr(E->getArg(1));
2901   Value *Val2 = Builder.CreateFCmpUNE(Val0, Val1);
2902   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
2903   return Builder.CreateIntCast(Val3, Int16Ty, false);
2904 }
2905 case ARM::BI__builtin_arm_mve_vcmpeqq_s16:
2906 case ARM::BI__builtin_arm_mve_vcmpeqq_s32:
2907 case ARM::BI__builtin_arm_mve_vcmpeqq_s8:
2908 case ARM::BI__builtin_arm_mve_vcmpeqq_u16:
2909 case ARM::BI__builtin_arm_mve_vcmpeqq_u32:
2910 case ARM::BI__builtin_arm_mve_vcmpeqq_u8: {
2911   llvm::Type * Param0;
2912   switch (BuiltinID) {
2913   case ARM::BI__builtin_arm_mve_vcmpeqq_s16:
2914     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2915     break;
2916   case ARM::BI__builtin_arm_mve_vcmpeqq_s32:
2917     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2918     break;
2919   case ARM::BI__builtin_arm_mve_vcmpeqq_s8:
2920     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2921     break;
2922   case ARM::BI__builtin_arm_mve_vcmpeqq_u16:
2923     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2924     break;
2925   case ARM::BI__builtin_arm_mve_vcmpeqq_u32:
2926     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2927     break;
2928   case ARM::BI__builtin_arm_mve_vcmpeqq_u8:
2929     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2930     break;
2931   }
2932   Value *Val0 = EmitScalarExpr(E->getArg(0));
2933   Value *Val1 = EmitScalarExpr(E->getArg(1));
2934   Value *Val2 = Builder.CreateICmpEQ(Val0, Val1);
2935   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
2936   return Builder.CreateIntCast(Val3, Int16Ty, false);
2937 }
2938 case ARM::BI__builtin_arm_mve_vcmpneq_s16:
2939 case ARM::BI__builtin_arm_mve_vcmpneq_s32:
2940 case ARM::BI__builtin_arm_mve_vcmpneq_s8:
2941 case ARM::BI__builtin_arm_mve_vcmpneq_u16:
2942 case ARM::BI__builtin_arm_mve_vcmpneq_u32:
2943 case ARM::BI__builtin_arm_mve_vcmpneq_u8: {
2944   llvm::Type * Param0;
2945   switch (BuiltinID) {
2946   case ARM::BI__builtin_arm_mve_vcmpneq_s16:
2947     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2948     break;
2949   case ARM::BI__builtin_arm_mve_vcmpneq_s32:
2950     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2951     break;
2952   case ARM::BI__builtin_arm_mve_vcmpneq_s8:
2953     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2954     break;
2955   case ARM::BI__builtin_arm_mve_vcmpneq_u16:
2956     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2957     break;
2958   case ARM::BI__builtin_arm_mve_vcmpneq_u32:
2959     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2960     break;
2961   case ARM::BI__builtin_arm_mve_vcmpneq_u8:
2962     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2963     break;
2964   }
2965   Value *Val0 = EmitScalarExpr(E->getArg(0));
2966   Value *Val1 = EmitScalarExpr(E->getArg(1));
2967   Value *Val2 = Builder.CreateICmpNE(Val0, Val1);
2968   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
2969   return Builder.CreateIntCast(Val3, Int16Ty, false);
2970 }
2971 case ARM::BI__builtin_arm_mve_vcmpgeq_s16:
2972 case ARM::BI__builtin_arm_mve_vcmpgeq_s32:
2973 case ARM::BI__builtin_arm_mve_vcmpgeq_s8: {
2974   llvm::Type * Param0;
2975   switch (BuiltinID) {
2976   case ARM::BI__builtin_arm_mve_vcmpgeq_s16:
2977     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2978     break;
2979   case ARM::BI__builtin_arm_mve_vcmpgeq_s32:
2980     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2981     break;
2982   case ARM::BI__builtin_arm_mve_vcmpgeq_s8:
2983     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2984     break;
2985   }
2986   Value *Val0 = EmitScalarExpr(E->getArg(0));
2987   Value *Val1 = EmitScalarExpr(E->getArg(1));
2988   Value *Val2 = Builder.CreateICmpSGE(Val0, Val1);
2989   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
2990   return Builder.CreateIntCast(Val3, Int16Ty, false);
2991 }
2992 case ARM::BI__builtin_arm_mve_vmaxq_s16:
2993 case ARM::BI__builtin_arm_mve_vmaxq_s32:
2994 case ARM::BI__builtin_arm_mve_vmaxq_s8: {
2995   Value *Val0 = EmitScalarExpr(E->getArg(0));
2996   Value *Val1 = EmitScalarExpr(E->getArg(1));
2997   Value *Val2 = Builder.CreateICmpSGE(Val0, Val1);
2998   return Builder.CreateSelect(Val2, Val0, Val1);
2999 }
3000 case ARM::BI__builtin_arm_mve_vcmpgtq_s16:
3001 case ARM::BI__builtin_arm_mve_vcmpgtq_s32:
3002 case ARM::BI__builtin_arm_mve_vcmpgtq_s8: {
3003   llvm::Type * Param0;
3004   switch (BuiltinID) {
3005   case ARM::BI__builtin_arm_mve_vcmpgtq_s16:
3006     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3007     break;
3008   case ARM::BI__builtin_arm_mve_vcmpgtq_s32:
3009     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3010     break;
3011   case ARM::BI__builtin_arm_mve_vcmpgtq_s8:
3012     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3013     break;
3014   }
3015   Value *Val0 = EmitScalarExpr(E->getArg(0));
3016   Value *Val1 = EmitScalarExpr(E->getArg(1));
3017   Value *Val2 = Builder.CreateICmpSGT(Val0, Val1);
3018   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
3019   return Builder.CreateIntCast(Val3, Int16Ty, false);
3020 }
3021 case ARM::BI__builtin_arm_mve_vcmpleq_s16:
3022 case ARM::BI__builtin_arm_mve_vcmpleq_s32:
3023 case ARM::BI__builtin_arm_mve_vcmpleq_s8: {
3024   llvm::Type * Param0;
3025   switch (BuiltinID) {
3026   case ARM::BI__builtin_arm_mve_vcmpleq_s16:
3027     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3028     break;
3029   case ARM::BI__builtin_arm_mve_vcmpleq_s32:
3030     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3031     break;
3032   case ARM::BI__builtin_arm_mve_vcmpleq_s8:
3033     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3034     break;
3035   }
3036   Value *Val0 = EmitScalarExpr(E->getArg(0));
3037   Value *Val1 = EmitScalarExpr(E->getArg(1));
3038   Value *Val2 = Builder.CreateICmpSLE(Val0, Val1);
3039   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
3040   return Builder.CreateIntCast(Val3, Int16Ty, false);
3041 }
3042 case ARM::BI__builtin_arm_mve_vminq_s16:
3043 case ARM::BI__builtin_arm_mve_vminq_s32:
3044 case ARM::BI__builtin_arm_mve_vminq_s8: {
3045   Value *Val0 = EmitScalarExpr(E->getArg(0));
3046   Value *Val1 = EmitScalarExpr(E->getArg(1));
3047   Value *Val2 = Builder.CreateICmpSLE(Val0, Val1);
3048   return Builder.CreateSelect(Val2, Val0, Val1);
3049 }
3050 case ARM::BI__builtin_arm_mve_vcmpltq_s16:
3051 case ARM::BI__builtin_arm_mve_vcmpltq_s32:
3052 case ARM::BI__builtin_arm_mve_vcmpltq_s8: {
3053   llvm::Type * Param0;
3054   switch (BuiltinID) {
3055   case ARM::BI__builtin_arm_mve_vcmpltq_s16:
3056     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3057     break;
3058   case ARM::BI__builtin_arm_mve_vcmpltq_s32:
3059     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3060     break;
3061   case ARM::BI__builtin_arm_mve_vcmpltq_s8:
3062     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3063     break;
3064   }
3065   Value *Val0 = EmitScalarExpr(E->getArg(0));
3066   Value *Val1 = EmitScalarExpr(E->getArg(1));
3067   Value *Val2 = Builder.CreateICmpSLT(Val0, Val1);
3068   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
3069   return Builder.CreateIntCast(Val3, Int16Ty, false);
3070 }
3071 case ARM::BI__builtin_arm_mve_vcmpcsq_u16:
3072 case ARM::BI__builtin_arm_mve_vcmpcsq_u32:
3073 case ARM::BI__builtin_arm_mve_vcmpcsq_u8: {
3074   llvm::Type * Param0;
3075   switch (BuiltinID) {
3076   case ARM::BI__builtin_arm_mve_vcmpcsq_u16:
3077     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3078     break;
3079   case ARM::BI__builtin_arm_mve_vcmpcsq_u32:
3080     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3081     break;
3082   case ARM::BI__builtin_arm_mve_vcmpcsq_u8:
3083     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3084     break;
3085   }
3086   Value *Val0 = EmitScalarExpr(E->getArg(0));
3087   Value *Val1 = EmitScalarExpr(E->getArg(1));
3088   Value *Val2 = Builder.CreateICmpUGE(Val0, Val1);
3089   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
3090   return Builder.CreateIntCast(Val3, Int16Ty, false);
3091 }
3092 case ARM::BI__builtin_arm_mve_vmaxq_u16:
3093 case ARM::BI__builtin_arm_mve_vmaxq_u32:
3094 case ARM::BI__builtin_arm_mve_vmaxq_u8: {
3095   Value *Val0 = EmitScalarExpr(E->getArg(0));
3096   Value *Val1 = EmitScalarExpr(E->getArg(1));
3097   Value *Val2 = Builder.CreateICmpUGE(Val0, Val1);
3098   return Builder.CreateSelect(Val2, Val0, Val1);
3099 }
3100 case ARM::BI__builtin_arm_mve_vcmphiq_u16:
3101 case ARM::BI__builtin_arm_mve_vcmphiq_u32:
3102 case ARM::BI__builtin_arm_mve_vcmphiq_u8: {
3103   llvm::Type * Param0;
3104   switch (BuiltinID) {
3105   case ARM::BI__builtin_arm_mve_vcmphiq_u16:
3106     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3107     break;
3108   case ARM::BI__builtin_arm_mve_vcmphiq_u32:
3109     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3110     break;
3111   case ARM::BI__builtin_arm_mve_vcmphiq_u8:
3112     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3113     break;
3114   }
3115   Value *Val0 = EmitScalarExpr(E->getArg(0));
3116   Value *Val1 = EmitScalarExpr(E->getArg(1));
3117   Value *Val2 = Builder.CreateICmpUGT(Val0, Val1);
3118   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
3119   return Builder.CreateIntCast(Val3, Int16Ty, false);
3120 }
3121 case ARM::BI__builtin_arm_mve_vminq_u16:
3122 case ARM::BI__builtin_arm_mve_vminq_u32:
3123 case ARM::BI__builtin_arm_mve_vminq_u8: {
3124   Value *Val0 = EmitScalarExpr(E->getArg(0));
3125   Value *Val1 = EmitScalarExpr(E->getArg(1));
3126   Value *Val2 = Builder.CreateICmpULE(Val0, Val1);
3127   return Builder.CreateSelect(Val2, Val0, Val1);
3128 }
3129 case ARM::BI__builtin_arm_mve_vbicq_n_s32:
3130 case ARM::BI__builtin_arm_mve_vbicq_n_u32: {
3131   bool  Param0;
3132   switch (BuiltinID) {
3133   case ARM::BI__builtin_arm_mve_vbicq_n_s32:
3134     Param0 = true;
3135     break;
3136   case ARM::BI__builtin_arm_mve_vbicq_n_u32:
3137     Param0 = false;
3138     break;
3139   }
3140   Value *Val0 = EmitScalarExpr(E->getArg(0));
3141   Value *Val1 = EmitScalarExpr(E->getArg(1));
3142   Value *Val2 = Builder.CreateIntCast(Val1, Int32Ty, Param0);
3143   Value *Val3 = ARMMVEVectorSplat(Builder, Val2);
3144   Value *Val4 = Builder.CreateNot(Val3);
3145   return Builder.CreateAnd(Val0, Val4);
3146 }
3147 case ARM::BI__builtin_arm_mve_vorrq_n_s32:
3148 case ARM::BI__builtin_arm_mve_vorrq_n_u32: {
3149   bool  Param0;
3150   switch (BuiltinID) {
3151   case ARM::BI__builtin_arm_mve_vorrq_n_s32:
3152     Param0 = true;
3153     break;
3154   case ARM::BI__builtin_arm_mve_vorrq_n_u32:
3155     Param0 = false;
3156     break;
3157   }
3158   Value *Val0 = EmitScalarExpr(E->getArg(0));
3159   Value *Val1 = EmitScalarExpr(E->getArg(1));
3160   Value *Val2 = Builder.CreateIntCast(Val1, Int32Ty, Param0);
3161   Value *Val3 = ARMMVEVectorSplat(Builder, Val2);
3162   return Builder.CreateOr(Val0, Val3);
3163 }
3164 case ARM::BI__builtin_arm_mve_vbicq_n_s16:
3165 case ARM::BI__builtin_arm_mve_vbicq_n_u16: {
3166   bool  Param0;
3167   switch (BuiltinID) {
3168   case ARM::BI__builtin_arm_mve_vbicq_n_s16:
3169     Param0 = true;
3170     break;
3171   case ARM::BI__builtin_arm_mve_vbicq_n_u16:
3172     Param0 = false;
3173     break;
3174   }
3175   Value *Val0 = EmitScalarExpr(E->getArg(0));
3176   Value *Val1 = EmitScalarExpr(E->getArg(1));
3177   Value *Val2 = Builder.CreateIntCast(Val1, Int32Ty, false);
3178   Value *Val3 = Builder.CreateIntCast(Val2, Int16Ty, Param0);
3179   Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
3180   Value *Val5 = Builder.CreateNot(Val4);
3181   return Builder.CreateAnd(Val0, Val5);
3182 }
3183 case ARM::BI__builtin_arm_mve_vorrq_n_s16:
3184 case ARM::BI__builtin_arm_mve_vorrq_n_u16: {
3185   bool  Param0;
3186   switch (BuiltinID) {
3187   case ARM::BI__builtin_arm_mve_vorrq_n_s16:
3188     Param0 = true;
3189     break;
3190   case ARM::BI__builtin_arm_mve_vorrq_n_u16:
3191     Param0 = false;
3192     break;
3193   }
3194   Value *Val0 = EmitScalarExpr(E->getArg(0));
3195   Value *Val1 = EmitScalarExpr(E->getArg(1));
3196   Value *Val2 = Builder.CreateIntCast(Val1, Int32Ty, false);
3197   Value *Val3 = Builder.CreateIntCast(Val2, Int16Ty, Param0);
3198   Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
3199   return Builder.CreateOr(Val0, Val4);
3200 }
3201 case ARM::BI__builtin_arm_mve_vshlq_n_s16:
3202 case ARM::BI__builtin_arm_mve_vshlq_n_s32:
3203 case ARM::BI__builtin_arm_mve_vshlq_n_s8:
3204 case ARM::BI__builtin_arm_mve_vshlq_n_u16:
3205 case ARM::BI__builtin_arm_mve_vshlq_n_u32:
3206 case ARM::BI__builtin_arm_mve_vshlq_n_u8: {
3207   llvm::Type * Param0;
3208   bool  Param1;
3209   switch (BuiltinID) {
3210   case ARM::BI__builtin_arm_mve_vshlq_n_s16:
3211     Param0 = Int16Ty;
3212     Param1 = true;
3213     break;
3214   case ARM::BI__builtin_arm_mve_vshlq_n_s32:
3215     Param0 = Int32Ty;
3216     Param1 = true;
3217     break;
3218   case ARM::BI__builtin_arm_mve_vshlq_n_s8:
3219     Param0 = Int8Ty;
3220     Param1 = true;
3221     break;
3222   case ARM::BI__builtin_arm_mve_vshlq_n_u16:
3223     Param0 = Int16Ty;
3224     Param1 = false;
3225     break;
3226   case ARM::BI__builtin_arm_mve_vshlq_n_u32:
3227     Param0 = Int32Ty;
3228     Param1 = false;
3229     break;
3230   case ARM::BI__builtin_arm_mve_vshlq_n_u8:
3231     Param0 = Int8Ty;
3232     Param1 = false;
3233     break;
3234   }
3235   Value *Val0 = EmitScalarExpr(E->getArg(0));
3236   Value *Val1 = EmitScalarExpr(E->getArg(1));
3237   Value *Val2 = Builder.CreateIntCast(Val1, Param0, Param1);
3238   Value *Val3 = ARMMVEVectorSplat(Builder, Val2);
3239   return Builder.CreateShl(Val0, Val3);
3240 }
3241 case ARM::BI__builtin_arm_mve_vmlasq_n_s16:
3242 case ARM::BI__builtin_arm_mve_vmlasq_n_s32:
3243 case ARM::BI__builtin_arm_mve_vmlasq_n_s8:
3244 case ARM::BI__builtin_arm_mve_vmlasq_n_u16:
3245 case ARM::BI__builtin_arm_mve_vmlasq_n_u32:
3246 case ARM::BI__builtin_arm_mve_vmlasq_n_u8: {
3247   Value *Val0 = EmitScalarExpr(E->getArg(0));
3248   Value *Val1 = EmitScalarExpr(E->getArg(1));
3249   Value *Val2 = Builder.CreateMul(Val0, Val1);
3250   Value *Val3 = EmitScalarExpr(E->getArg(2));
3251   Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
3252   return Builder.CreateAdd(Val2, Val4);
3253 }
3254 case ARM::BI__builtin_arm_mve_vbicq_s16:
3255 case ARM::BI__builtin_arm_mve_vbicq_s32:
3256 case ARM::BI__builtin_arm_mve_vbicq_s8:
3257 case ARM::BI__builtin_arm_mve_vbicq_u16:
3258 case ARM::BI__builtin_arm_mve_vbicq_u32:
3259 case ARM::BI__builtin_arm_mve_vbicq_u8: {
3260   Value *Val0 = EmitScalarExpr(E->getArg(0));
3261   Value *Val1 = EmitScalarExpr(E->getArg(1));
3262   Value *Val2 = Builder.CreateNot(Val1);
3263   return Builder.CreateAnd(Val0, Val2);
3264 }
3265 case ARM::BI__builtin_arm_mve_vornq_s16:
3266 case ARM::BI__builtin_arm_mve_vornq_s32:
3267 case ARM::BI__builtin_arm_mve_vornq_s8:
3268 case ARM::BI__builtin_arm_mve_vornq_u16:
3269 case ARM::BI__builtin_arm_mve_vornq_u32:
3270 case ARM::BI__builtin_arm_mve_vornq_u8: {
3271   Value *Val0 = EmitScalarExpr(E->getArg(0));
3272   Value *Val1 = EmitScalarExpr(E->getArg(1));
3273   Value *Val2 = Builder.CreateNot(Val1);
3274   return Builder.CreateOr(Val0, Val2);
3275 }
3276 case ARM::BI__builtin_arm_mve_vadcq_m_s32:
3277 case ARM::BI__builtin_arm_mve_vadcq_m_u32:
3278 case ARM::BI__builtin_arm_mve_vsbcq_m_s32:
3279 case ARM::BI__builtin_arm_mve_vsbcq_m_u32: {
3280   Intrinsic::ID  Param0;
3281   switch (BuiltinID) {
3282   case ARM::BI__builtin_arm_mve_vadcq_m_s32:
3283     Param0 = Intrinsic::arm_mve_vadc_predicated;
3284     break;
3285   case ARM::BI__builtin_arm_mve_vadcq_m_u32:
3286     Param0 = Intrinsic::arm_mve_vadc_predicated;
3287     break;
3288   case ARM::BI__builtin_arm_mve_vsbcq_m_s32:
3289     Param0 = Intrinsic::arm_mve_vsbc_predicated;
3290     break;
3291   case ARM::BI__builtin_arm_mve_vsbcq_m_u32:
3292     Param0 = Intrinsic::arm_mve_vsbc_predicated;
3293     break;
3294   }
3295   Value *Val0 = EmitScalarExpr(E->getArg(0));
3296   Value *Val1 = EmitScalarExpr(E->getArg(1));
3297   Value *Val2 = EmitScalarExpr(E->getArg(2));
3298   Address Val3 = EmitPointerWithAlignment(E->getArg(3));
3299   Value *Val4 = Builder.CreateLoad(Val3);
3300   Value *Val5 = llvm::ConstantInt::get(Int32Ty, 29);
3301   Value *Val6 = Builder.CreateShl(Val4, Val5);
3302   Value *Val7 = EmitScalarExpr(E->getArg(4));
3303   Value *Val8 = Builder.CreateIntCast(Val7, Int32Ty, false);
3304   Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val8});
3305   Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val0, Val1, Val2, Val6, Val9});
3306   Value *Val11 = llvm::ConstantInt::get(Int32Ty, 1);
3307   Value *Val12 = Builder.CreateExtractValue(Val10, static_cast<unsigned>(1));
3308   Value *Val13 = llvm::ConstantInt::get(Int32Ty, 29);
3309   Value *Val14 = Builder.CreateLShr(Val12, Val13);
3310   Value *Val15 = Builder.CreateAnd(Val11, Val14);
3311   Builder.CreateStore(Val15, Val3);
3312   return Builder.CreateExtractValue(Val10, static_cast<unsigned>(0));
3313 }
3314 case ARM::BI__builtin_arm_mve_vdwdupq_n_u16:
3315 case ARM::BI__builtin_arm_mve_vdwdupq_n_u32:
3316 case ARM::BI__builtin_arm_mve_vdwdupq_n_u8:
3317 case ARM::BI__builtin_arm_mve_viwdupq_n_u16:
3318 case ARM::BI__builtin_arm_mve_viwdupq_n_u32:
3319 case ARM::BI__builtin_arm_mve_viwdupq_n_u8: {
3320   Intrinsic::ID  Param0;
3321   llvm::Type * Param1;
3322   switch (BuiltinID) {
3323   case ARM::BI__builtin_arm_mve_vdwdupq_n_u16:
3324     Param0 = Intrinsic::arm_mve_vdwdup;
3325     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
3326     break;
3327   case ARM::BI__builtin_arm_mve_vdwdupq_n_u32:
3328     Param0 = Intrinsic::arm_mve_vdwdup;
3329     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
3330     break;
3331   case ARM::BI__builtin_arm_mve_vdwdupq_n_u8:
3332     Param0 = Intrinsic::arm_mve_vdwdup;
3333     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
3334     break;
3335   case ARM::BI__builtin_arm_mve_viwdupq_n_u16:
3336     Param0 = Intrinsic::arm_mve_viwdup;
3337     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
3338     break;
3339   case ARM::BI__builtin_arm_mve_viwdupq_n_u32:
3340     Param0 = Intrinsic::arm_mve_viwdup;
3341     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
3342     break;
3343   case ARM::BI__builtin_arm_mve_viwdupq_n_u8:
3344     Param0 = Intrinsic::arm_mve_viwdup;
3345     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
3346     break;
3347   }
3348   Value *Val0 = EmitScalarExpr(E->getArg(0));
3349   Value *Val1 = EmitScalarExpr(E->getArg(1));
3350   Value *Val2 = EmitScalarExpr(E->getArg(2));
3351   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0, Val1, Val2});
3352   return Builder.CreateExtractValue(Val3, static_cast<unsigned>(0));
3353 }
3354 case ARM::BI__builtin_arm_mve_vmaxnmavq_p_f16:
3355 case ARM::BI__builtin_arm_mve_vmaxnmavq_p_f32:
3356 case ARM::BI__builtin_arm_mve_vmaxnmvq_p_f16:
3357 case ARM::BI__builtin_arm_mve_vmaxnmvq_p_f32:
3358 case ARM::BI__builtin_arm_mve_vminnmavq_p_f16:
3359 case ARM::BI__builtin_arm_mve_vminnmavq_p_f32:
3360 case ARM::BI__builtin_arm_mve_vminnmvq_p_f16:
3361 case ARM::BI__builtin_arm_mve_vminnmvq_p_f32: {
3362   llvm::Type * Param0;
3363   Intrinsic::ID  Param1;
3364   llvm::Type * Param2;
3365   llvm::Type * Param3;
3366   switch (BuiltinID) {
3367   case ARM::BI__builtin_arm_mve_vmaxnmavq_p_f16:
3368     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3369     Param1 = Intrinsic::arm_mve_maxnmav_predicated;
3370     Param2 = HalfTy;
3371     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
3372     break;
3373   case ARM::BI__builtin_arm_mve_vmaxnmavq_p_f32:
3374     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3375     Param1 = Intrinsic::arm_mve_maxnmav_predicated;
3376     Param2 = FloatTy;
3377     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
3378     break;
3379   case ARM::BI__builtin_arm_mve_vmaxnmvq_p_f16:
3380     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3381     Param1 = Intrinsic::arm_mve_maxnmv_predicated;
3382     Param2 = HalfTy;
3383     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
3384     break;
3385   case ARM::BI__builtin_arm_mve_vmaxnmvq_p_f32:
3386     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3387     Param1 = Intrinsic::arm_mve_maxnmv_predicated;
3388     Param2 = FloatTy;
3389     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
3390     break;
3391   case ARM::BI__builtin_arm_mve_vminnmavq_p_f16:
3392     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3393     Param1 = Intrinsic::arm_mve_minnmav_predicated;
3394     Param2 = HalfTy;
3395     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
3396     break;
3397   case ARM::BI__builtin_arm_mve_vminnmavq_p_f32:
3398     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3399     Param1 = Intrinsic::arm_mve_minnmav_predicated;
3400     Param2 = FloatTy;
3401     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
3402     break;
3403   case ARM::BI__builtin_arm_mve_vminnmvq_p_f16:
3404     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3405     Param1 = Intrinsic::arm_mve_minnmv_predicated;
3406     Param2 = HalfTy;
3407     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
3408     break;
3409   case ARM::BI__builtin_arm_mve_vminnmvq_p_f32:
3410     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3411     Param1 = Intrinsic::arm_mve_minnmv_predicated;
3412     Param2 = FloatTy;
3413     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
3414     break;
3415   }
3416   Value *Val0 = EmitScalarExpr(E->getArg(0));
3417   Value *Val1 = EmitScalarExpr(E->getArg(1));
3418   Value *Val2 = EmitScalarExpr(E->getArg(2));
3419   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
3420   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val3});
3421   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param3, Param0}), {Val0, Val1, Val4});
3422   return (Val5);
3423 }
3424 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_z_s64:
3425 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_z_u64:
3426 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_z_f32:
3427 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_z_s32:
3428 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_z_u32: {
3429   llvm::Type * Param0;
3430   llvm::Type * Param1;
3431   llvm::Type * Param2;
3432   switch (BuiltinID) {
3433   case ARM::BI__builtin_arm_mve_vldrdq_gather_base_z_s64:
3434     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
3435     Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
3436     Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
3437     break;
3438   case ARM::BI__builtin_arm_mve_vldrdq_gather_base_z_u64:
3439     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
3440     Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
3441     Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
3442     break;
3443   case ARM::BI__builtin_arm_mve_vldrwq_gather_base_z_f32:
3444     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3445     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
3446     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3447     break;
3448   case ARM::BI__builtin_arm_mve_vldrwq_gather_base_z_s32:
3449     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3450     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
3451     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3452     break;
3453   case ARM::BI__builtin_arm_mve_vldrwq_gather_base_z_u32:
3454     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3455     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
3456     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3457     break;
3458   }
3459   Value *Val0 = EmitScalarExpr(E->getArg(0));
3460   Value *Val1 = EmitScalarExpr(E->getArg(1));
3461   Value *Val2 = EmitScalarExpr(E->getArg(2));
3462   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
3463   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val3});
3464   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vldr_gather_base_predicated, {Param1, Param2, Param0}), {Val0, Val1, Val4});
3465 }
3466 case ARM::BI__builtin_arm_mve_vmaxaq_m_s16:
3467 case ARM::BI__builtin_arm_mve_vmaxaq_m_s32:
3468 case ARM::BI__builtin_arm_mve_vmaxaq_m_s8:
3469 case ARM::BI__builtin_arm_mve_vmaxnmaq_m_f16:
3470 case ARM::BI__builtin_arm_mve_vmaxnmaq_m_f32:
3471 case ARM::BI__builtin_arm_mve_vminaq_m_s16:
3472 case ARM::BI__builtin_arm_mve_vminaq_m_s32:
3473 case ARM::BI__builtin_arm_mve_vminaq_m_s8:
3474 case ARM::BI__builtin_arm_mve_vminnmaq_m_f16:
3475 case ARM::BI__builtin_arm_mve_vminnmaq_m_f32: {
3476   llvm::Type * Param0;
3477   Intrinsic::ID  Param1;
3478   llvm::Type * Param2;
3479   switch (BuiltinID) {
3480   case ARM::BI__builtin_arm_mve_vmaxaq_m_s16:
3481     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3482     Param1 = Intrinsic::arm_mve_vmaxa_predicated;
3483     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3484     break;
3485   case ARM::BI__builtin_arm_mve_vmaxaq_m_s32:
3486     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3487     Param1 = Intrinsic::arm_mve_vmaxa_predicated;
3488     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3489     break;
3490   case ARM::BI__builtin_arm_mve_vmaxaq_m_s8:
3491     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3492     Param1 = Intrinsic::arm_mve_vmaxa_predicated;
3493     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3494     break;
3495   case ARM::BI__builtin_arm_mve_vmaxnmaq_m_f16:
3496     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3497     Param1 = Intrinsic::arm_mve_vmaxnma_predicated;
3498     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
3499     break;
3500   case ARM::BI__builtin_arm_mve_vmaxnmaq_m_f32:
3501     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3502     Param1 = Intrinsic::arm_mve_vmaxnma_predicated;
3503     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
3504     break;
3505   case ARM::BI__builtin_arm_mve_vminaq_m_s16:
3506     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3507     Param1 = Intrinsic::arm_mve_vmina_predicated;
3508     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3509     break;
3510   case ARM::BI__builtin_arm_mve_vminaq_m_s32:
3511     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3512     Param1 = Intrinsic::arm_mve_vmina_predicated;
3513     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3514     break;
3515   case ARM::BI__builtin_arm_mve_vminaq_m_s8:
3516     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3517     Param1 = Intrinsic::arm_mve_vmina_predicated;
3518     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3519     break;
3520   case ARM::BI__builtin_arm_mve_vminnmaq_m_f16:
3521     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3522     Param1 = Intrinsic::arm_mve_vminnma_predicated;
3523     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
3524     break;
3525   case ARM::BI__builtin_arm_mve_vminnmaq_m_f32:
3526     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3527     Param1 = Intrinsic::arm_mve_vminnma_predicated;
3528     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
3529     break;
3530   }
3531   Value *Val0 = EmitScalarExpr(E->getArg(0));
3532   Value *Val1 = EmitScalarExpr(E->getArg(1));
3533   Value *Val2 = EmitScalarExpr(E->getArg(2));
3534   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
3535   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val3});
3536   return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val1, Val4});
3537 }
3538 case ARM::BI__builtin_arm_mve_vmaxavq_p_s32:
3539 case ARM::BI__builtin_arm_mve_vminavq_p_s32: {
3540   Intrinsic::ID  Param0;
3541   switch (BuiltinID) {
3542   case ARM::BI__builtin_arm_mve_vmaxavq_p_s32:
3543     Param0 = Intrinsic::arm_mve_maxav_predicated;
3544     break;
3545   case ARM::BI__builtin_arm_mve_vminavq_p_s32:
3546     Param0 = Intrinsic::arm_mve_minav_predicated;
3547     break;
3548   }
3549   Value *Val0 = EmitScalarExpr(E->getArg(0));
3550   Value *Val1 = EmitScalarExpr(E->getArg(1));
3551   Value *Val2 = EmitScalarExpr(E->getArg(2));
3552   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
3553   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val3});
3554   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val0, Val1, Val4});
3555   return Builder.CreateIntCast(Val5, Int32Ty, false);
3556 }
3557 case ARM::BI__builtin_arm_mve_vmlaq_m_n_s16:
3558 case ARM::BI__builtin_arm_mve_vmlaq_m_n_s8:
3559 case ARM::BI__builtin_arm_mve_vmlaq_m_n_u16:
3560 case ARM::BI__builtin_arm_mve_vmlaq_m_n_u8:
3561 case ARM::BI__builtin_arm_mve_vmlasq_m_n_s16:
3562 case ARM::BI__builtin_arm_mve_vmlasq_m_n_s8:
3563 case ARM::BI__builtin_arm_mve_vmlasq_m_n_u16:
3564 case ARM::BI__builtin_arm_mve_vmlasq_m_n_u8:
3565 case ARM::BI__builtin_arm_mve_vqdmlahq_m_n_s16:
3566 case ARM::BI__builtin_arm_mve_vqdmlahq_m_n_s8:
3567 case ARM::BI__builtin_arm_mve_vqdmlashq_m_n_s16:
3568 case ARM::BI__builtin_arm_mve_vqdmlashq_m_n_s8:
3569 case ARM::BI__builtin_arm_mve_vqrdmlahq_m_n_s16:
3570 case ARM::BI__builtin_arm_mve_vqrdmlahq_m_n_s8:
3571 case ARM::BI__builtin_arm_mve_vqrdmlashq_m_n_s16:
3572 case ARM::BI__builtin_arm_mve_vqrdmlashq_m_n_s8: {
3573   llvm::Type * Param0;
3574   Intrinsic::ID  Param1;
3575   llvm::Type * Param2;
3576   switch (BuiltinID) {
3577   case ARM::BI__builtin_arm_mve_vmlaq_m_n_s16:
3578     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3579     Param1 = Intrinsic::arm_mve_vmla_n_predicated;
3580     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3581     break;
3582   case ARM::BI__builtin_arm_mve_vmlaq_m_n_s8:
3583     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3584     Param1 = Intrinsic::arm_mve_vmla_n_predicated;
3585     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3586     break;
3587   case ARM::BI__builtin_arm_mve_vmlaq_m_n_u16:
3588     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3589     Param1 = Intrinsic::arm_mve_vmla_n_predicated;
3590     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3591     break;
3592   case ARM::BI__builtin_arm_mve_vmlaq_m_n_u8:
3593     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3594     Param1 = Intrinsic::arm_mve_vmla_n_predicated;
3595     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3596     break;
3597   case ARM::BI__builtin_arm_mve_vmlasq_m_n_s16:
3598     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3599     Param1 = Intrinsic::arm_mve_vmlas_n_predicated;
3600     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3601     break;
3602   case ARM::BI__builtin_arm_mve_vmlasq_m_n_s8:
3603     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3604     Param1 = Intrinsic::arm_mve_vmlas_n_predicated;
3605     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3606     break;
3607   case ARM::BI__builtin_arm_mve_vmlasq_m_n_u16:
3608     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3609     Param1 = Intrinsic::arm_mve_vmlas_n_predicated;
3610     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3611     break;
3612   case ARM::BI__builtin_arm_mve_vmlasq_m_n_u8:
3613     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3614     Param1 = Intrinsic::arm_mve_vmlas_n_predicated;
3615     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3616     break;
3617   case ARM::BI__builtin_arm_mve_vqdmlahq_m_n_s16:
3618     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3619     Param1 = Intrinsic::arm_mve_vqdmlah_predicated;
3620     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3621     break;
3622   case ARM::BI__builtin_arm_mve_vqdmlahq_m_n_s8:
3623     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3624     Param1 = Intrinsic::arm_mve_vqdmlah_predicated;
3625     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3626     break;
3627   case ARM::BI__builtin_arm_mve_vqdmlashq_m_n_s16:
3628     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3629     Param1 = Intrinsic::arm_mve_vqdmlash_predicated;
3630     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3631     break;
3632   case ARM::BI__builtin_arm_mve_vqdmlashq_m_n_s8:
3633     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3634     Param1 = Intrinsic::arm_mve_vqdmlash_predicated;
3635     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3636     break;
3637   case ARM::BI__builtin_arm_mve_vqrdmlahq_m_n_s16:
3638     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3639     Param1 = Intrinsic::arm_mve_vqrdmlah_predicated;
3640     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3641     break;
3642   case ARM::BI__builtin_arm_mve_vqrdmlahq_m_n_s8:
3643     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3644     Param1 = Intrinsic::arm_mve_vqrdmlah_predicated;
3645     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3646     break;
3647   case ARM::BI__builtin_arm_mve_vqrdmlashq_m_n_s16:
3648     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3649     Param1 = Intrinsic::arm_mve_vqrdmlash_predicated;
3650     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3651     break;
3652   case ARM::BI__builtin_arm_mve_vqrdmlashq_m_n_s8:
3653     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3654     Param1 = Intrinsic::arm_mve_vqrdmlash_predicated;
3655     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3656     break;
3657   }
3658   Value *Val0 = EmitScalarExpr(E->getArg(0));
3659   Value *Val1 = EmitScalarExpr(E->getArg(1));
3660   Value *Val2 = EmitScalarExpr(E->getArg(2));
3661   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
3662   Value *Val4 = EmitScalarExpr(E->getArg(3));
3663   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
3664   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val5});
3665   return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val1, Val3, Val6});
3666 }
3667 case ARM::BI__builtin_arm_mve_vqdmlahq_n_s16:
3668 case ARM::BI__builtin_arm_mve_vqdmlahq_n_s8:
3669 case ARM::BI__builtin_arm_mve_vqdmlashq_n_s16:
3670 case ARM::BI__builtin_arm_mve_vqdmlashq_n_s8:
3671 case ARM::BI__builtin_arm_mve_vqrdmlahq_n_s16:
3672 case ARM::BI__builtin_arm_mve_vqrdmlahq_n_s8:
3673 case ARM::BI__builtin_arm_mve_vqrdmlashq_n_s16:
3674 case ARM::BI__builtin_arm_mve_vqrdmlashq_n_s8: {
3675   Intrinsic::ID  Param0;
3676   llvm::Type * Param1;
3677   switch (BuiltinID) {
3678   case ARM::BI__builtin_arm_mve_vqdmlahq_n_s16:
3679     Param0 = Intrinsic::arm_mve_vqdmlah;
3680     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
3681     break;
3682   case ARM::BI__builtin_arm_mve_vqdmlahq_n_s8:
3683     Param0 = Intrinsic::arm_mve_vqdmlah;
3684     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
3685     break;
3686   case ARM::BI__builtin_arm_mve_vqdmlashq_n_s16:
3687     Param0 = Intrinsic::arm_mve_vqdmlash;
3688     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
3689     break;
3690   case ARM::BI__builtin_arm_mve_vqdmlashq_n_s8:
3691     Param0 = Intrinsic::arm_mve_vqdmlash;
3692     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
3693     break;
3694   case ARM::BI__builtin_arm_mve_vqrdmlahq_n_s16:
3695     Param0 = Intrinsic::arm_mve_vqrdmlah;
3696     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
3697     break;
3698   case ARM::BI__builtin_arm_mve_vqrdmlahq_n_s8:
3699     Param0 = Intrinsic::arm_mve_vqrdmlah;
3700     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
3701     break;
3702   case ARM::BI__builtin_arm_mve_vqrdmlashq_n_s16:
3703     Param0 = Intrinsic::arm_mve_vqrdmlash;
3704     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
3705     break;
3706   case ARM::BI__builtin_arm_mve_vqrdmlashq_n_s8:
3707     Param0 = Intrinsic::arm_mve_vqrdmlash;
3708     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
3709     break;
3710   }
3711   Value *Val0 = EmitScalarExpr(E->getArg(0));
3712   Value *Val1 = EmitScalarExpr(E->getArg(1));
3713   Value *Val2 = EmitScalarExpr(E->getArg(2));
3714   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
3715   return Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0, Val1, Val3});
3716 }
3717 case ARM::BI__builtin_arm_mve_vddupq_m_n_u16:
3718 case ARM::BI__builtin_arm_mve_vddupq_m_n_u32:
3719 case ARM::BI__builtin_arm_mve_vddupq_m_n_u8:
3720 case ARM::BI__builtin_arm_mve_vidupq_m_n_u16:
3721 case ARM::BI__builtin_arm_mve_vidupq_m_n_u32:
3722 case ARM::BI__builtin_arm_mve_vidupq_m_n_u8: {
3723   llvm::Type * Param0;
3724   Intrinsic::ID  Param1;
3725   llvm::Type * Param2;
3726   switch (BuiltinID) {
3727   case ARM::BI__builtin_arm_mve_vddupq_m_n_u16:
3728     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3729     Param1 = Intrinsic::arm_mve_vddup_predicated;
3730     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3731     break;
3732   case ARM::BI__builtin_arm_mve_vddupq_m_n_u32:
3733     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3734     Param1 = Intrinsic::arm_mve_vddup_predicated;
3735     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3736     break;
3737   case ARM::BI__builtin_arm_mve_vddupq_m_n_u8:
3738     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3739     Param1 = Intrinsic::arm_mve_vddup_predicated;
3740     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3741     break;
3742   case ARM::BI__builtin_arm_mve_vidupq_m_n_u16:
3743     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3744     Param1 = Intrinsic::arm_mve_vidup_predicated;
3745     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3746     break;
3747   case ARM::BI__builtin_arm_mve_vidupq_m_n_u32:
3748     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3749     Param1 = Intrinsic::arm_mve_vidup_predicated;
3750     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3751     break;
3752   case ARM::BI__builtin_arm_mve_vidupq_m_n_u8:
3753     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3754     Param1 = Intrinsic::arm_mve_vidup_predicated;
3755     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3756     break;
3757   }
3758   Value *Val0 = EmitScalarExpr(E->getArg(0));
3759   Value *Val1 = EmitScalarExpr(E->getArg(1));
3760   Value *Val2 = EmitScalarExpr(E->getArg(2));
3761   Value *Val3 = EmitScalarExpr(E->getArg(3));
3762   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
3763   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val4});
3764   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val1, Val2, Val5});
3765   return Builder.CreateExtractValue(Val6, static_cast<unsigned>(0));
3766 }
3767 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_p_s64:
3768 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_p_u64:
3769 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_p_f32:
3770 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_p_s32:
3771 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_p_u32: {
3772   llvm::Type * Param0;
3773   llvm::Type * Param1;
3774   llvm::Type * Param2;
3775   switch (BuiltinID) {
3776   case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_p_s64:
3777     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
3778     Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
3779     Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
3780     break;
3781   case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_p_u64:
3782     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
3783     Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
3784     Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
3785     break;
3786   case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_p_f32:
3787     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3788     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
3789     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
3790     break;
3791   case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_p_s32:
3792     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3793     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
3794     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3795     break;
3796   case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_p_u32:
3797     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3798     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
3799     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3800     break;
3801   }
3802   Value *Val0 = EmitScalarExpr(E->getArg(0));
3803   Value *Val1 = EmitScalarExpr(E->getArg(1));
3804   Value *Val2 = EmitScalarExpr(E->getArg(2));
3805   Value *Val3 = EmitScalarExpr(E->getArg(3));
3806   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
3807   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val4});
3808   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vstr_scatter_base_predicated, {Param1, Param2, Param0}), {Val0, Val1, Val2, Val5});
3809 }
3810 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_f16:
3811 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_f32:
3812 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_s16:
3813 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_s32:
3814 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_s8:
3815 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_u16:
3816 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_u32:
3817 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_u8:
3818 case ARM::BI__builtin_arm_mve_vmlaq_m_n_s32:
3819 case ARM::BI__builtin_arm_mve_vmlaq_m_n_u32:
3820 case ARM::BI__builtin_arm_mve_vmlasq_m_n_s32:
3821 case ARM::BI__builtin_arm_mve_vmlasq_m_n_u32:
3822 case ARM::BI__builtin_arm_mve_vqdmlahq_m_n_s32:
3823 case ARM::BI__builtin_arm_mve_vqdmlashq_m_n_s32:
3824 case ARM::BI__builtin_arm_mve_vqrdmlahq_m_n_s32:
3825 case ARM::BI__builtin_arm_mve_vqrdmlashq_m_n_s32:
3826 case ARM::BI__builtin_arm_mve_vsliq_m_n_s16:
3827 case ARM::BI__builtin_arm_mve_vsliq_m_n_s32:
3828 case ARM::BI__builtin_arm_mve_vsliq_m_n_s8:
3829 case ARM::BI__builtin_arm_mve_vsliq_m_n_u16:
3830 case ARM::BI__builtin_arm_mve_vsliq_m_n_u32:
3831 case ARM::BI__builtin_arm_mve_vsliq_m_n_u8:
3832 case ARM::BI__builtin_arm_mve_vsriq_m_n_s16:
3833 case ARM::BI__builtin_arm_mve_vsriq_m_n_s32:
3834 case ARM::BI__builtin_arm_mve_vsriq_m_n_s8:
3835 case ARM::BI__builtin_arm_mve_vsriq_m_n_u16:
3836 case ARM::BI__builtin_arm_mve_vsriq_m_n_u32:
3837 case ARM::BI__builtin_arm_mve_vsriq_m_n_u8: {
3838   llvm::Type * Param0;
3839   Intrinsic::ID  Param1;
3840   llvm::Type * Param2;
3841   switch (BuiltinID) {
3842   case ARM::BI__builtin_arm_mve_vbrsrq_m_n_f16:
3843     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3844     Param1 = Intrinsic::arm_mve_vbrsr_predicated;
3845     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
3846     break;
3847   case ARM::BI__builtin_arm_mve_vbrsrq_m_n_f32:
3848     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3849     Param1 = Intrinsic::arm_mve_vbrsr_predicated;
3850     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
3851     break;
3852   case ARM::BI__builtin_arm_mve_vbrsrq_m_n_s16:
3853     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3854     Param1 = Intrinsic::arm_mve_vbrsr_predicated;
3855     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3856     break;
3857   case ARM::BI__builtin_arm_mve_vbrsrq_m_n_s32:
3858     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3859     Param1 = Intrinsic::arm_mve_vbrsr_predicated;
3860     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3861     break;
3862   case ARM::BI__builtin_arm_mve_vbrsrq_m_n_s8:
3863     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3864     Param1 = Intrinsic::arm_mve_vbrsr_predicated;
3865     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3866     break;
3867   case ARM::BI__builtin_arm_mve_vbrsrq_m_n_u16:
3868     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3869     Param1 = Intrinsic::arm_mve_vbrsr_predicated;
3870     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3871     break;
3872   case ARM::BI__builtin_arm_mve_vbrsrq_m_n_u32:
3873     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3874     Param1 = Intrinsic::arm_mve_vbrsr_predicated;
3875     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3876     break;
3877   case ARM::BI__builtin_arm_mve_vbrsrq_m_n_u8:
3878     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3879     Param1 = Intrinsic::arm_mve_vbrsr_predicated;
3880     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3881     break;
3882   case ARM::BI__builtin_arm_mve_vmlaq_m_n_s32:
3883     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3884     Param1 = Intrinsic::arm_mve_vmla_n_predicated;
3885     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3886     break;
3887   case ARM::BI__builtin_arm_mve_vmlaq_m_n_u32:
3888     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3889     Param1 = Intrinsic::arm_mve_vmla_n_predicated;
3890     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3891     break;
3892   case ARM::BI__builtin_arm_mve_vmlasq_m_n_s32:
3893     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3894     Param1 = Intrinsic::arm_mve_vmlas_n_predicated;
3895     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3896     break;
3897   case ARM::BI__builtin_arm_mve_vmlasq_m_n_u32:
3898     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3899     Param1 = Intrinsic::arm_mve_vmlas_n_predicated;
3900     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3901     break;
3902   case ARM::BI__builtin_arm_mve_vqdmlahq_m_n_s32:
3903     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3904     Param1 = Intrinsic::arm_mve_vqdmlah_predicated;
3905     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3906     break;
3907   case ARM::BI__builtin_arm_mve_vqdmlashq_m_n_s32:
3908     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3909     Param1 = Intrinsic::arm_mve_vqdmlash_predicated;
3910     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3911     break;
3912   case ARM::BI__builtin_arm_mve_vqrdmlahq_m_n_s32:
3913     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3914     Param1 = Intrinsic::arm_mve_vqrdmlah_predicated;
3915     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3916     break;
3917   case ARM::BI__builtin_arm_mve_vqrdmlashq_m_n_s32:
3918     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3919     Param1 = Intrinsic::arm_mve_vqrdmlash_predicated;
3920     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3921     break;
3922   case ARM::BI__builtin_arm_mve_vsliq_m_n_s16:
3923     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3924     Param1 = Intrinsic::arm_mve_vsli_predicated;
3925     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3926     break;
3927   case ARM::BI__builtin_arm_mve_vsliq_m_n_s32:
3928     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3929     Param1 = Intrinsic::arm_mve_vsli_predicated;
3930     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3931     break;
3932   case ARM::BI__builtin_arm_mve_vsliq_m_n_s8:
3933     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3934     Param1 = Intrinsic::arm_mve_vsli_predicated;
3935     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3936     break;
3937   case ARM::BI__builtin_arm_mve_vsliq_m_n_u16:
3938     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3939     Param1 = Intrinsic::arm_mve_vsli_predicated;
3940     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3941     break;
3942   case ARM::BI__builtin_arm_mve_vsliq_m_n_u32:
3943     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3944     Param1 = Intrinsic::arm_mve_vsli_predicated;
3945     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3946     break;
3947   case ARM::BI__builtin_arm_mve_vsliq_m_n_u8:
3948     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3949     Param1 = Intrinsic::arm_mve_vsli_predicated;
3950     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3951     break;
3952   case ARM::BI__builtin_arm_mve_vsriq_m_n_s16:
3953     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3954     Param1 = Intrinsic::arm_mve_vsri_predicated;
3955     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3956     break;
3957   case ARM::BI__builtin_arm_mve_vsriq_m_n_s32:
3958     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3959     Param1 = Intrinsic::arm_mve_vsri_predicated;
3960     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3961     break;
3962   case ARM::BI__builtin_arm_mve_vsriq_m_n_s8:
3963     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3964     Param1 = Intrinsic::arm_mve_vsri_predicated;
3965     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3966     break;
3967   case ARM::BI__builtin_arm_mve_vsriq_m_n_u16:
3968     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3969     Param1 = Intrinsic::arm_mve_vsri_predicated;
3970     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3971     break;
3972   case ARM::BI__builtin_arm_mve_vsriq_m_n_u32:
3973     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3974     Param1 = Intrinsic::arm_mve_vsri_predicated;
3975     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3976     break;
3977   case ARM::BI__builtin_arm_mve_vsriq_m_n_u8:
3978     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3979     Param1 = Intrinsic::arm_mve_vsri_predicated;
3980     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3981     break;
3982   }
3983   Value *Val0 = EmitScalarExpr(E->getArg(0));
3984   Value *Val1 = EmitScalarExpr(E->getArg(1));
3985   Value *Val2 = EmitScalarExpr(E->getArg(2));
3986   Value *Val3 = EmitScalarExpr(E->getArg(3));
3987   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
3988   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val4});
3989   return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val1, Val2, Val5});
3990 }
3991 case ARM::BI__builtin_arm_mve_vdwdupq_m_n_u16:
3992 case ARM::BI__builtin_arm_mve_vdwdupq_m_n_u32:
3993 case ARM::BI__builtin_arm_mve_vdwdupq_m_n_u8:
3994 case ARM::BI__builtin_arm_mve_viwdupq_m_n_u16:
3995 case ARM::BI__builtin_arm_mve_viwdupq_m_n_u32:
3996 case ARM::BI__builtin_arm_mve_viwdupq_m_n_u8: {
3997   llvm::Type * Param0;
3998   Intrinsic::ID  Param1;
3999   llvm::Type * Param2;
4000   switch (BuiltinID) {
4001   case ARM::BI__builtin_arm_mve_vdwdupq_m_n_u16:
4002     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4003     Param1 = Intrinsic::arm_mve_vdwdup_predicated;
4004     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
4005     break;
4006   case ARM::BI__builtin_arm_mve_vdwdupq_m_n_u32:
4007     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4008     Param1 = Intrinsic::arm_mve_vdwdup_predicated;
4009     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
4010     break;
4011   case ARM::BI__builtin_arm_mve_vdwdupq_m_n_u8:
4012     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4013     Param1 = Intrinsic::arm_mve_vdwdup_predicated;
4014     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
4015     break;
4016   case ARM::BI__builtin_arm_mve_viwdupq_m_n_u16:
4017     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4018     Param1 = Intrinsic::arm_mve_viwdup_predicated;
4019     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
4020     break;
4021   case ARM::BI__builtin_arm_mve_viwdupq_m_n_u32:
4022     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4023     Param1 = Intrinsic::arm_mve_viwdup_predicated;
4024     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
4025     break;
4026   case ARM::BI__builtin_arm_mve_viwdupq_m_n_u8:
4027     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4028     Param1 = Intrinsic::arm_mve_viwdup_predicated;
4029     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
4030     break;
4031   }
4032   Value *Val0 = EmitScalarExpr(E->getArg(0));
4033   Value *Val1 = EmitScalarExpr(E->getArg(1));
4034   Value *Val2 = EmitScalarExpr(E->getArg(2));
4035   Value *Val3 = EmitScalarExpr(E->getArg(3));
4036   Value *Val4 = EmitScalarExpr(E->getArg(4));
4037   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
4038   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val5});
4039   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val1, Val2, Val3, Val6});
4040   return Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
4041 }
4042 case ARM::BI__builtin_arm_mve_vadciq_m_s32:
4043 case ARM::BI__builtin_arm_mve_vadciq_m_u32: {
4044   Value *Val0 = EmitScalarExpr(E->getArg(0));
4045   Value *Val1 = EmitScalarExpr(E->getArg(1));
4046   Value *Val2 = EmitScalarExpr(E->getArg(2));
4047   Value *Val3 = llvm::ConstantInt::get(Int32Ty, 0);
4048   Value *Val4 = EmitScalarExpr(E->getArg(4));
4049   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
4050   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
4051   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vadc_predicated, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val0, Val1, Val2, Val3, Val6});
4052   Value *Val8 = llvm::ConstantInt::get(Int32Ty, 1);
4053   Value *Val9 = Builder.CreateExtractValue(Val7, static_cast<unsigned>(1));
4054   Value *Val10 = llvm::ConstantInt::get(Int32Ty, 29);
4055   Value *Val11 = Builder.CreateLShr(Val9, Val10);
4056   Value *Val12 = Builder.CreateAnd(Val8, Val11);
4057   Address Val13 = EmitPointerWithAlignment(E->getArg(3));
4058   Builder.CreateStore(Val12, Val13);
4059   return Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
4060 }
4061 case ARM::BI__builtin_arm_mve_vsbciq_m_s32:
4062 case ARM::BI__builtin_arm_mve_vsbciq_m_u32: {
4063   Value *Val0 = EmitScalarExpr(E->getArg(0));
4064   Value *Val1 = EmitScalarExpr(E->getArg(1));
4065   Value *Val2 = EmitScalarExpr(E->getArg(2));
4066   Value *Val3 = llvm::ConstantInt::get(Int32Ty, 1);
4067   Value *Val4 = llvm::ConstantInt::get(Int32Ty, 29);
4068   Value *Val5 = Builder.CreateShl(Val3, Val4);
4069   Value *Val6 = EmitScalarExpr(E->getArg(4));
4070   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
4071   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
4072   Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vsbc_predicated, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val0, Val1, Val2, Val5, Val8});
4073   Value *Val10 = llvm::ConstantInt::get(Int32Ty, 1);
4074   Value *Val11 = Builder.CreateExtractValue(Val9, static_cast<unsigned>(1));
4075   Value *Val12 = llvm::ConstantInt::get(Int32Ty, 29);
4076   Value *Val13 = Builder.CreateLShr(Val11, Val12);
4077   Value *Val14 = Builder.CreateAnd(Val10, Val13);
4078   Address Val15 = EmitPointerWithAlignment(E->getArg(3));
4079   Builder.CreateStore(Val14, Val15);
4080   return Builder.CreateExtractValue(Val9, static_cast<unsigned>(0));
4081 }
4082 case ARM::BI__builtin_arm_mve_vqdmladhq_m_s16:
4083 case ARM::BI__builtin_arm_mve_vqdmladhq_m_s32:
4084 case ARM::BI__builtin_arm_mve_vqdmladhq_m_s8:
4085 case ARM::BI__builtin_arm_mve_vqdmladhxq_m_s16:
4086 case ARM::BI__builtin_arm_mve_vqdmladhxq_m_s32:
4087 case ARM::BI__builtin_arm_mve_vqdmladhxq_m_s8:
4088 case ARM::BI__builtin_arm_mve_vqdmlsdhq_m_s16:
4089 case ARM::BI__builtin_arm_mve_vqdmlsdhq_m_s32:
4090 case ARM::BI__builtin_arm_mve_vqdmlsdhq_m_s8:
4091 case ARM::BI__builtin_arm_mve_vqdmlsdhxq_m_s16:
4092 case ARM::BI__builtin_arm_mve_vqdmlsdhxq_m_s32:
4093 case ARM::BI__builtin_arm_mve_vqdmlsdhxq_m_s8:
4094 case ARM::BI__builtin_arm_mve_vqrdmladhq_m_s16:
4095 case ARM::BI__builtin_arm_mve_vqrdmladhq_m_s32:
4096 case ARM::BI__builtin_arm_mve_vqrdmladhq_m_s8:
4097 case ARM::BI__builtin_arm_mve_vqrdmladhxq_m_s16:
4098 case ARM::BI__builtin_arm_mve_vqrdmladhxq_m_s32:
4099 case ARM::BI__builtin_arm_mve_vqrdmladhxq_m_s8:
4100 case ARM::BI__builtin_arm_mve_vqrdmlsdhq_m_s16:
4101 case ARM::BI__builtin_arm_mve_vqrdmlsdhq_m_s32:
4102 case ARM::BI__builtin_arm_mve_vqrdmlsdhq_m_s8:
4103 case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_m_s16:
4104 case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_m_s32:
4105 case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_m_s8: {
4106   uint32_t  Param0;
4107   uint32_t  Param1;
4108   uint32_t  Param2;
4109   llvm::Type * Param3;
4110   llvm::Type * Param4;
4111   switch (BuiltinID) {
4112   case ARM::BI__builtin_arm_mve_vqdmladhq_m_s16:
4113     Param0 = 0;
4114     Param1 = 0;
4115     Param2 = 0;
4116     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4117     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
4118     break;
4119   case ARM::BI__builtin_arm_mve_vqdmladhq_m_s32:
4120     Param0 = 0;
4121     Param1 = 0;
4122     Param2 = 0;
4123     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4124     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
4125     break;
4126   case ARM::BI__builtin_arm_mve_vqdmladhq_m_s8:
4127     Param0 = 0;
4128     Param1 = 0;
4129     Param2 = 0;
4130     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4131     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
4132     break;
4133   case ARM::BI__builtin_arm_mve_vqdmladhxq_m_s16:
4134     Param0 = 1;
4135     Param1 = 0;
4136     Param2 = 0;
4137     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4138     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
4139     break;
4140   case ARM::BI__builtin_arm_mve_vqdmladhxq_m_s32:
4141     Param0 = 1;
4142     Param1 = 0;
4143     Param2 = 0;
4144     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4145     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
4146     break;
4147   case ARM::BI__builtin_arm_mve_vqdmladhxq_m_s8:
4148     Param0 = 1;
4149     Param1 = 0;
4150     Param2 = 0;
4151     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4152     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
4153     break;
4154   case ARM::BI__builtin_arm_mve_vqdmlsdhq_m_s16:
4155     Param0 = 0;
4156     Param1 = 0;
4157     Param2 = 1;
4158     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4159     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
4160     break;
4161   case ARM::BI__builtin_arm_mve_vqdmlsdhq_m_s32:
4162     Param0 = 0;
4163     Param1 = 0;
4164     Param2 = 1;
4165     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4166     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
4167     break;
4168   case ARM::BI__builtin_arm_mve_vqdmlsdhq_m_s8:
4169     Param0 = 0;
4170     Param1 = 0;
4171     Param2 = 1;
4172     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4173     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
4174     break;
4175   case ARM::BI__builtin_arm_mve_vqdmlsdhxq_m_s16:
4176     Param0 = 1;
4177     Param1 = 0;
4178     Param2 = 1;
4179     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4180     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
4181     break;
4182   case ARM::BI__builtin_arm_mve_vqdmlsdhxq_m_s32:
4183     Param0 = 1;
4184     Param1 = 0;
4185     Param2 = 1;
4186     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4187     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
4188     break;
4189   case ARM::BI__builtin_arm_mve_vqdmlsdhxq_m_s8:
4190     Param0 = 1;
4191     Param1 = 0;
4192     Param2 = 1;
4193     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4194     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
4195     break;
4196   case ARM::BI__builtin_arm_mve_vqrdmladhq_m_s16:
4197     Param0 = 0;
4198     Param1 = 1;
4199     Param2 = 0;
4200     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4201     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
4202     break;
4203   case ARM::BI__builtin_arm_mve_vqrdmladhq_m_s32:
4204     Param0 = 0;
4205     Param1 = 1;
4206     Param2 = 0;
4207     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4208     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
4209     break;
4210   case ARM::BI__builtin_arm_mve_vqrdmladhq_m_s8:
4211     Param0 = 0;
4212     Param1 = 1;
4213     Param2 = 0;
4214     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4215     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
4216     break;
4217   case ARM::BI__builtin_arm_mve_vqrdmladhxq_m_s16:
4218     Param0 = 1;
4219     Param1 = 1;
4220     Param2 = 0;
4221     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4222     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
4223     break;
4224   case ARM::BI__builtin_arm_mve_vqrdmladhxq_m_s32:
4225     Param0 = 1;
4226     Param1 = 1;
4227     Param2 = 0;
4228     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4229     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
4230     break;
4231   case ARM::BI__builtin_arm_mve_vqrdmladhxq_m_s8:
4232     Param0 = 1;
4233     Param1 = 1;
4234     Param2 = 0;
4235     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4236     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
4237     break;
4238   case ARM::BI__builtin_arm_mve_vqrdmlsdhq_m_s16:
4239     Param0 = 0;
4240     Param1 = 1;
4241     Param2 = 1;
4242     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4243     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
4244     break;
4245   case ARM::BI__builtin_arm_mve_vqrdmlsdhq_m_s32:
4246     Param0 = 0;
4247     Param1 = 1;
4248     Param2 = 1;
4249     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4250     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
4251     break;
4252   case ARM::BI__builtin_arm_mve_vqrdmlsdhq_m_s8:
4253     Param0 = 0;
4254     Param1 = 1;
4255     Param2 = 1;
4256     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4257     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
4258     break;
4259   case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_m_s16:
4260     Param0 = 1;
4261     Param1 = 1;
4262     Param2 = 1;
4263     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4264     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
4265     break;
4266   case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_m_s32:
4267     Param0 = 1;
4268     Param1 = 1;
4269     Param2 = 1;
4270     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4271     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
4272     break;
4273   case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_m_s8:
4274     Param0 = 1;
4275     Param1 = 1;
4276     Param2 = 1;
4277     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4278     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
4279     break;
4280   }
4281   Value *Val0 = EmitScalarExpr(E->getArg(0));
4282   Value *Val1 = EmitScalarExpr(E->getArg(1));
4283   Value *Val2 = EmitScalarExpr(E->getArg(2));
4284   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
4285   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
4286   Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param2);
4287   Value *Val6 = EmitScalarExpr(E->getArg(3));
4288   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
4289   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val7});
4290   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vqdmlad_predicated, {Param4, Param3}), {Val0, Val1, Val2, Val3, Val4, Val5, Val8});
4291 }
4292 case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_s16:
4293 case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_s32:
4294 case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_u16:
4295 case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_u32:
4296 case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_s16:
4297 case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_s32:
4298 case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_u16:
4299 case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_u32:
4300 case ARM::BI__builtin_arm_mve_vqrshrunbq_m_n_s16:
4301 case ARM::BI__builtin_arm_mve_vqrshrunbq_m_n_s32:
4302 case ARM::BI__builtin_arm_mve_vqrshruntq_m_n_s16:
4303 case ARM::BI__builtin_arm_mve_vqrshruntq_m_n_s32:
4304 case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_s16:
4305 case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_s32:
4306 case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_u16:
4307 case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_u32:
4308 case ARM::BI__builtin_arm_mve_vqshrntq_m_n_s16:
4309 case ARM::BI__builtin_arm_mve_vqshrntq_m_n_s32:
4310 case ARM::BI__builtin_arm_mve_vqshrntq_m_n_u16:
4311 case ARM::BI__builtin_arm_mve_vqshrntq_m_n_u32:
4312 case ARM::BI__builtin_arm_mve_vqshrunbq_m_n_s16:
4313 case ARM::BI__builtin_arm_mve_vqshrunbq_m_n_s32:
4314 case ARM::BI__builtin_arm_mve_vqshruntq_m_n_s16:
4315 case ARM::BI__builtin_arm_mve_vqshruntq_m_n_s32:
4316 case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_s16:
4317 case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_s32:
4318 case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_u16:
4319 case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_u32:
4320 case ARM::BI__builtin_arm_mve_vrshrntq_m_n_s16:
4321 case ARM::BI__builtin_arm_mve_vrshrntq_m_n_s32:
4322 case ARM::BI__builtin_arm_mve_vrshrntq_m_n_u16:
4323 case ARM::BI__builtin_arm_mve_vrshrntq_m_n_u32:
4324 case ARM::BI__builtin_arm_mve_vshrnbq_m_n_s16:
4325 case ARM::BI__builtin_arm_mve_vshrnbq_m_n_s32:
4326 case ARM::BI__builtin_arm_mve_vshrnbq_m_n_u16:
4327 case ARM::BI__builtin_arm_mve_vshrnbq_m_n_u32:
4328 case ARM::BI__builtin_arm_mve_vshrntq_m_n_s16:
4329 case ARM::BI__builtin_arm_mve_vshrntq_m_n_s32:
4330 case ARM::BI__builtin_arm_mve_vshrntq_m_n_u16:
4331 case ARM::BI__builtin_arm_mve_vshrntq_m_n_u32: {
4332   uint32_t  Param0;
4333   uint32_t  Param1;
4334   uint32_t  Param2;
4335   uint32_t  Param3;
4336   uint32_t  Param4;
4337   llvm::Type * Param5;
4338   llvm::Type * Param6;
4339   llvm::Type * Param7;
4340   switch (BuiltinID) {
4341   case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_s16:
4342     Param0 = 1;
4343     Param1 = 1;
4344     Param2 = 0;
4345     Param3 = 0;
4346     Param4 = 0;
4347     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4348     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4349     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4350     break;
4351   case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_s32:
4352     Param0 = 1;
4353     Param1 = 1;
4354     Param2 = 0;
4355     Param3 = 0;
4356     Param4 = 0;
4357     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4358     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4359     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4360     break;
4361   case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_u16:
4362     Param0 = 1;
4363     Param1 = 1;
4364     Param2 = 1;
4365     Param3 = 1;
4366     Param4 = 0;
4367     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4368     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4369     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4370     break;
4371   case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_u32:
4372     Param0 = 1;
4373     Param1 = 1;
4374     Param2 = 1;
4375     Param3 = 1;
4376     Param4 = 0;
4377     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4378     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4379     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4380     break;
4381   case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_s16:
4382     Param0 = 1;
4383     Param1 = 1;
4384     Param2 = 0;
4385     Param3 = 0;
4386     Param4 = 1;
4387     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4388     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4389     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4390     break;
4391   case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_s32:
4392     Param0 = 1;
4393     Param1 = 1;
4394     Param2 = 0;
4395     Param3 = 0;
4396     Param4 = 1;
4397     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4398     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4399     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4400     break;
4401   case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_u16:
4402     Param0 = 1;
4403     Param1 = 1;
4404     Param2 = 1;
4405     Param3 = 1;
4406     Param4 = 1;
4407     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4408     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4409     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4410     break;
4411   case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_u32:
4412     Param0 = 1;
4413     Param1 = 1;
4414     Param2 = 1;
4415     Param3 = 1;
4416     Param4 = 1;
4417     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4418     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4419     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4420     break;
4421   case ARM::BI__builtin_arm_mve_vqrshrunbq_m_n_s16:
4422     Param0 = 1;
4423     Param1 = 1;
4424     Param2 = 1;
4425     Param3 = 0;
4426     Param4 = 0;
4427     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4428     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4429     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4430     break;
4431   case ARM::BI__builtin_arm_mve_vqrshrunbq_m_n_s32:
4432     Param0 = 1;
4433     Param1 = 1;
4434     Param2 = 1;
4435     Param3 = 0;
4436     Param4 = 0;
4437     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4438     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4439     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4440     break;
4441   case ARM::BI__builtin_arm_mve_vqrshruntq_m_n_s16:
4442     Param0 = 1;
4443     Param1 = 1;
4444     Param2 = 1;
4445     Param3 = 0;
4446     Param4 = 1;
4447     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4448     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4449     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4450     break;
4451   case ARM::BI__builtin_arm_mve_vqrshruntq_m_n_s32:
4452     Param0 = 1;
4453     Param1 = 1;
4454     Param2 = 1;
4455     Param3 = 0;
4456     Param4 = 1;
4457     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4458     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4459     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4460     break;
4461   case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_s16:
4462     Param0 = 1;
4463     Param1 = 0;
4464     Param2 = 0;
4465     Param3 = 0;
4466     Param4 = 0;
4467     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4468     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4469     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4470     break;
4471   case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_s32:
4472     Param0 = 1;
4473     Param1 = 0;
4474     Param2 = 0;
4475     Param3 = 0;
4476     Param4 = 0;
4477     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4478     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4479     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4480     break;
4481   case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_u16:
4482     Param0 = 1;
4483     Param1 = 0;
4484     Param2 = 1;
4485     Param3 = 1;
4486     Param4 = 0;
4487     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4488     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4489     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4490     break;
4491   case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_u32:
4492     Param0 = 1;
4493     Param1 = 0;
4494     Param2 = 1;
4495     Param3 = 1;
4496     Param4 = 0;
4497     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4498     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4499     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4500     break;
4501   case ARM::BI__builtin_arm_mve_vqshrntq_m_n_s16:
4502     Param0 = 1;
4503     Param1 = 0;
4504     Param2 = 0;
4505     Param3 = 0;
4506     Param4 = 1;
4507     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4508     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4509     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4510     break;
4511   case ARM::BI__builtin_arm_mve_vqshrntq_m_n_s32:
4512     Param0 = 1;
4513     Param1 = 0;
4514     Param2 = 0;
4515     Param3 = 0;
4516     Param4 = 1;
4517     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4518     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4519     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4520     break;
4521   case ARM::BI__builtin_arm_mve_vqshrntq_m_n_u16:
4522     Param0 = 1;
4523     Param1 = 0;
4524     Param2 = 1;
4525     Param3 = 1;
4526     Param4 = 1;
4527     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4528     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4529     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4530     break;
4531   case ARM::BI__builtin_arm_mve_vqshrntq_m_n_u32:
4532     Param0 = 1;
4533     Param1 = 0;
4534     Param2 = 1;
4535     Param3 = 1;
4536     Param4 = 1;
4537     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4538     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4539     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4540     break;
4541   case ARM::BI__builtin_arm_mve_vqshrunbq_m_n_s16:
4542     Param0 = 1;
4543     Param1 = 0;
4544     Param2 = 1;
4545     Param3 = 0;
4546     Param4 = 0;
4547     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4548     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4549     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4550     break;
4551   case ARM::BI__builtin_arm_mve_vqshrunbq_m_n_s32:
4552     Param0 = 1;
4553     Param1 = 0;
4554     Param2 = 1;
4555     Param3 = 0;
4556     Param4 = 0;
4557     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4558     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4559     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4560     break;
4561   case ARM::BI__builtin_arm_mve_vqshruntq_m_n_s16:
4562     Param0 = 1;
4563     Param1 = 0;
4564     Param2 = 1;
4565     Param3 = 0;
4566     Param4 = 1;
4567     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4568     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4569     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4570     break;
4571   case ARM::BI__builtin_arm_mve_vqshruntq_m_n_s32:
4572     Param0 = 1;
4573     Param1 = 0;
4574     Param2 = 1;
4575     Param3 = 0;
4576     Param4 = 1;
4577     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4578     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4579     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4580     break;
4581   case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_s16:
4582     Param0 = 0;
4583     Param1 = 1;
4584     Param2 = 0;
4585     Param3 = 0;
4586     Param4 = 0;
4587     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4588     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4589     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4590     break;
4591   case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_s32:
4592     Param0 = 0;
4593     Param1 = 1;
4594     Param2 = 0;
4595     Param3 = 0;
4596     Param4 = 0;
4597     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4598     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4599     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4600     break;
4601   case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_u16:
4602     Param0 = 0;
4603     Param1 = 1;
4604     Param2 = 1;
4605     Param3 = 1;
4606     Param4 = 0;
4607     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4608     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4609     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4610     break;
4611   case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_u32:
4612     Param0 = 0;
4613     Param1 = 1;
4614     Param2 = 1;
4615     Param3 = 1;
4616     Param4 = 0;
4617     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4618     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4619     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4620     break;
4621   case ARM::BI__builtin_arm_mve_vrshrntq_m_n_s16:
4622     Param0 = 0;
4623     Param1 = 1;
4624     Param2 = 0;
4625     Param3 = 0;
4626     Param4 = 1;
4627     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4628     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4629     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4630     break;
4631   case ARM::BI__builtin_arm_mve_vrshrntq_m_n_s32:
4632     Param0 = 0;
4633     Param1 = 1;
4634     Param2 = 0;
4635     Param3 = 0;
4636     Param4 = 1;
4637     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4638     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4639     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4640     break;
4641   case ARM::BI__builtin_arm_mve_vrshrntq_m_n_u16:
4642     Param0 = 0;
4643     Param1 = 1;
4644     Param2 = 1;
4645     Param3 = 1;
4646     Param4 = 1;
4647     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4648     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4649     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4650     break;
4651   case ARM::BI__builtin_arm_mve_vrshrntq_m_n_u32:
4652     Param0 = 0;
4653     Param1 = 1;
4654     Param2 = 1;
4655     Param3 = 1;
4656     Param4 = 1;
4657     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4658     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4659     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4660     break;
4661   case ARM::BI__builtin_arm_mve_vshrnbq_m_n_s16:
4662     Param0 = 0;
4663     Param1 = 0;
4664     Param2 = 0;
4665     Param3 = 0;
4666     Param4 = 0;
4667     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4668     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4669     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4670     break;
4671   case ARM::BI__builtin_arm_mve_vshrnbq_m_n_s32:
4672     Param0 = 0;
4673     Param1 = 0;
4674     Param2 = 0;
4675     Param3 = 0;
4676     Param4 = 0;
4677     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4678     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4679     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4680     break;
4681   case ARM::BI__builtin_arm_mve_vshrnbq_m_n_u16:
4682     Param0 = 0;
4683     Param1 = 0;
4684     Param2 = 1;
4685     Param3 = 1;
4686     Param4 = 0;
4687     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4688     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4689     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4690     break;
4691   case ARM::BI__builtin_arm_mve_vshrnbq_m_n_u32:
4692     Param0 = 0;
4693     Param1 = 0;
4694     Param2 = 1;
4695     Param3 = 1;
4696     Param4 = 0;
4697     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4698     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4699     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4700     break;
4701   case ARM::BI__builtin_arm_mve_vshrntq_m_n_s16:
4702     Param0 = 0;
4703     Param1 = 0;
4704     Param2 = 0;
4705     Param3 = 0;
4706     Param4 = 1;
4707     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4708     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4709     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4710     break;
4711   case ARM::BI__builtin_arm_mve_vshrntq_m_n_s32:
4712     Param0 = 0;
4713     Param1 = 0;
4714     Param2 = 0;
4715     Param3 = 0;
4716     Param4 = 1;
4717     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4718     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4719     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4720     break;
4721   case ARM::BI__builtin_arm_mve_vshrntq_m_n_u16:
4722     Param0 = 0;
4723     Param1 = 0;
4724     Param2 = 1;
4725     Param3 = 1;
4726     Param4 = 1;
4727     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4728     Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4729     Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4730     break;
4731   case ARM::BI__builtin_arm_mve_vshrntq_m_n_u32:
4732     Param0 = 0;
4733     Param1 = 0;
4734     Param2 = 1;
4735     Param3 = 1;
4736     Param4 = 1;
4737     Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4738     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4739     Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4740     break;
4741   }
4742   Value *Val0 = EmitScalarExpr(E->getArg(0));
4743   Value *Val1 = EmitScalarExpr(E->getArg(1));
4744   Value *Val2 = EmitScalarExpr(E->getArg(2));
4745   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
4746   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
4747   Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param2);
4748   Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param3);
4749   Value *Val7 = llvm::ConstantInt::get(Int32Ty, Param4);
4750   Value *Val8 = EmitScalarExpr(E->getArg(3));
4751   Value *Val9 = Builder.CreateIntCast(Val8, Int32Ty, false);
4752   Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param5}), {Val9});
4753   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshrn_predicated, {Param6, Param7, Param5}), {Val0, Val1, Val2, Val3, Val4, Val5, Val6, Val7, Val10});
4754 }
4755 case ARM::BI__builtin_arm_mve_vqrshrnbq_n_s16:
4756 case ARM::BI__builtin_arm_mve_vqrshrnbq_n_s32:
4757 case ARM::BI__builtin_arm_mve_vqrshrnbq_n_u16:
4758 case ARM::BI__builtin_arm_mve_vqrshrnbq_n_u32:
4759 case ARM::BI__builtin_arm_mve_vqrshrntq_n_s16:
4760 case ARM::BI__builtin_arm_mve_vqrshrntq_n_s32:
4761 case ARM::BI__builtin_arm_mve_vqrshrntq_n_u16:
4762 case ARM::BI__builtin_arm_mve_vqrshrntq_n_u32:
4763 case ARM::BI__builtin_arm_mve_vqrshrunbq_n_s16:
4764 case ARM::BI__builtin_arm_mve_vqrshrunbq_n_s32:
4765 case ARM::BI__builtin_arm_mve_vqrshruntq_n_s16:
4766 case ARM::BI__builtin_arm_mve_vqrshruntq_n_s32:
4767 case ARM::BI__builtin_arm_mve_vqshrnbq_n_s16:
4768 case ARM::BI__builtin_arm_mve_vqshrnbq_n_s32:
4769 case ARM::BI__builtin_arm_mve_vqshrnbq_n_u16:
4770 case ARM::BI__builtin_arm_mve_vqshrnbq_n_u32:
4771 case ARM::BI__builtin_arm_mve_vqshrntq_n_s16:
4772 case ARM::BI__builtin_arm_mve_vqshrntq_n_s32:
4773 case ARM::BI__builtin_arm_mve_vqshrntq_n_u16:
4774 case ARM::BI__builtin_arm_mve_vqshrntq_n_u32:
4775 case ARM::BI__builtin_arm_mve_vqshrunbq_n_s16:
4776 case ARM::BI__builtin_arm_mve_vqshrunbq_n_s32:
4777 case ARM::BI__builtin_arm_mve_vqshruntq_n_s16:
4778 case ARM::BI__builtin_arm_mve_vqshruntq_n_s32:
4779 case ARM::BI__builtin_arm_mve_vrshrnbq_n_s16:
4780 case ARM::BI__builtin_arm_mve_vrshrnbq_n_s32:
4781 case ARM::BI__builtin_arm_mve_vrshrnbq_n_u16:
4782 case ARM::BI__builtin_arm_mve_vrshrnbq_n_u32:
4783 case ARM::BI__builtin_arm_mve_vrshrntq_n_s16:
4784 case ARM::BI__builtin_arm_mve_vrshrntq_n_s32:
4785 case ARM::BI__builtin_arm_mve_vrshrntq_n_u16:
4786 case ARM::BI__builtin_arm_mve_vrshrntq_n_u32:
4787 case ARM::BI__builtin_arm_mve_vshrnbq_n_s16:
4788 case ARM::BI__builtin_arm_mve_vshrnbq_n_s32:
4789 case ARM::BI__builtin_arm_mve_vshrnbq_n_u16:
4790 case ARM::BI__builtin_arm_mve_vshrnbq_n_u32:
4791 case ARM::BI__builtin_arm_mve_vshrntq_n_s16:
4792 case ARM::BI__builtin_arm_mve_vshrntq_n_s32:
4793 case ARM::BI__builtin_arm_mve_vshrntq_n_u16:
4794 case ARM::BI__builtin_arm_mve_vshrntq_n_u32: {
4795   uint32_t  Param0;
4796   uint32_t  Param1;
4797   uint32_t  Param2;
4798   uint32_t  Param3;
4799   uint32_t  Param4;
4800   llvm::Type * Param5;
4801   llvm::Type * Param6;
4802   switch (BuiltinID) {
4803   case ARM::BI__builtin_arm_mve_vqrshrnbq_n_s16:
4804     Param0 = 1;
4805     Param1 = 1;
4806     Param2 = 0;
4807     Param3 = 0;
4808     Param4 = 0;
4809     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4810     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4811     break;
4812   case ARM::BI__builtin_arm_mve_vqrshrnbq_n_s32:
4813     Param0 = 1;
4814     Param1 = 1;
4815     Param2 = 0;
4816     Param3 = 0;
4817     Param4 = 0;
4818     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4819     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4820     break;
4821   case ARM::BI__builtin_arm_mve_vqrshrnbq_n_u16:
4822     Param0 = 1;
4823     Param1 = 1;
4824     Param2 = 1;
4825     Param3 = 1;
4826     Param4 = 0;
4827     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4828     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4829     break;
4830   case ARM::BI__builtin_arm_mve_vqrshrnbq_n_u32:
4831     Param0 = 1;
4832     Param1 = 1;
4833     Param2 = 1;
4834     Param3 = 1;
4835     Param4 = 0;
4836     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4837     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4838     break;
4839   case ARM::BI__builtin_arm_mve_vqrshrntq_n_s16:
4840     Param0 = 1;
4841     Param1 = 1;
4842     Param2 = 0;
4843     Param3 = 0;
4844     Param4 = 1;
4845     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4846     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4847     break;
4848   case ARM::BI__builtin_arm_mve_vqrshrntq_n_s32:
4849     Param0 = 1;
4850     Param1 = 1;
4851     Param2 = 0;
4852     Param3 = 0;
4853     Param4 = 1;
4854     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4855     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4856     break;
4857   case ARM::BI__builtin_arm_mve_vqrshrntq_n_u16:
4858     Param0 = 1;
4859     Param1 = 1;
4860     Param2 = 1;
4861     Param3 = 1;
4862     Param4 = 1;
4863     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4864     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4865     break;
4866   case ARM::BI__builtin_arm_mve_vqrshrntq_n_u32:
4867     Param0 = 1;
4868     Param1 = 1;
4869     Param2 = 1;
4870     Param3 = 1;
4871     Param4 = 1;
4872     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4873     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4874     break;
4875   case ARM::BI__builtin_arm_mve_vqrshrunbq_n_s16:
4876     Param0 = 1;
4877     Param1 = 1;
4878     Param2 = 1;
4879     Param3 = 0;
4880     Param4 = 0;
4881     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4882     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4883     break;
4884   case ARM::BI__builtin_arm_mve_vqrshrunbq_n_s32:
4885     Param0 = 1;
4886     Param1 = 1;
4887     Param2 = 1;
4888     Param3 = 0;
4889     Param4 = 0;
4890     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4891     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4892     break;
4893   case ARM::BI__builtin_arm_mve_vqrshruntq_n_s16:
4894     Param0 = 1;
4895     Param1 = 1;
4896     Param2 = 1;
4897     Param3 = 0;
4898     Param4 = 1;
4899     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4900     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4901     break;
4902   case ARM::BI__builtin_arm_mve_vqrshruntq_n_s32:
4903     Param0 = 1;
4904     Param1 = 1;
4905     Param2 = 1;
4906     Param3 = 0;
4907     Param4 = 1;
4908     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4909     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4910     break;
4911   case ARM::BI__builtin_arm_mve_vqshrnbq_n_s16:
4912     Param0 = 1;
4913     Param1 = 0;
4914     Param2 = 0;
4915     Param3 = 0;
4916     Param4 = 0;
4917     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4918     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4919     break;
4920   case ARM::BI__builtin_arm_mve_vqshrnbq_n_s32:
4921     Param0 = 1;
4922     Param1 = 0;
4923     Param2 = 0;
4924     Param3 = 0;
4925     Param4 = 0;
4926     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4927     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4928     break;
4929   case ARM::BI__builtin_arm_mve_vqshrnbq_n_u16:
4930     Param0 = 1;
4931     Param1 = 0;
4932     Param2 = 1;
4933     Param3 = 1;
4934     Param4 = 0;
4935     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4936     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4937     break;
4938   case ARM::BI__builtin_arm_mve_vqshrnbq_n_u32:
4939     Param0 = 1;
4940     Param1 = 0;
4941     Param2 = 1;
4942     Param3 = 1;
4943     Param4 = 0;
4944     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4945     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4946     break;
4947   case ARM::BI__builtin_arm_mve_vqshrntq_n_s16:
4948     Param0 = 1;
4949     Param1 = 0;
4950     Param2 = 0;
4951     Param3 = 0;
4952     Param4 = 1;
4953     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4954     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4955     break;
4956   case ARM::BI__builtin_arm_mve_vqshrntq_n_s32:
4957     Param0 = 1;
4958     Param1 = 0;
4959     Param2 = 0;
4960     Param3 = 0;
4961     Param4 = 1;
4962     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4963     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4964     break;
4965   case ARM::BI__builtin_arm_mve_vqshrntq_n_u16:
4966     Param0 = 1;
4967     Param1 = 0;
4968     Param2 = 1;
4969     Param3 = 1;
4970     Param4 = 1;
4971     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4972     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4973     break;
4974   case ARM::BI__builtin_arm_mve_vqshrntq_n_u32:
4975     Param0 = 1;
4976     Param1 = 0;
4977     Param2 = 1;
4978     Param3 = 1;
4979     Param4 = 1;
4980     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4981     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4982     break;
4983   case ARM::BI__builtin_arm_mve_vqshrunbq_n_s16:
4984     Param0 = 1;
4985     Param1 = 0;
4986     Param2 = 1;
4987     Param3 = 0;
4988     Param4 = 0;
4989     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4990     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4991     break;
4992   case ARM::BI__builtin_arm_mve_vqshrunbq_n_s32:
4993     Param0 = 1;
4994     Param1 = 0;
4995     Param2 = 1;
4996     Param3 = 0;
4997     Param4 = 0;
4998     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4999     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5000     break;
5001   case ARM::BI__builtin_arm_mve_vqshruntq_n_s16:
5002     Param0 = 1;
5003     Param1 = 0;
5004     Param2 = 1;
5005     Param3 = 0;
5006     Param4 = 1;
5007     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
5008     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
5009     break;
5010   case ARM::BI__builtin_arm_mve_vqshruntq_n_s32:
5011     Param0 = 1;
5012     Param1 = 0;
5013     Param2 = 1;
5014     Param3 = 0;
5015     Param4 = 1;
5016     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5017     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5018     break;
5019   case ARM::BI__builtin_arm_mve_vrshrnbq_n_s16:
5020     Param0 = 0;
5021     Param1 = 1;
5022     Param2 = 0;
5023     Param3 = 0;
5024     Param4 = 0;
5025     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
5026     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
5027     break;
5028   case ARM::BI__builtin_arm_mve_vrshrnbq_n_s32:
5029     Param0 = 0;
5030     Param1 = 1;
5031     Param2 = 0;
5032     Param3 = 0;
5033     Param4 = 0;
5034     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5035     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5036     break;
5037   case ARM::BI__builtin_arm_mve_vrshrnbq_n_u16:
5038     Param0 = 0;
5039     Param1 = 1;
5040     Param2 = 1;
5041     Param3 = 1;
5042     Param4 = 0;
5043     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
5044     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
5045     break;
5046   case ARM::BI__builtin_arm_mve_vrshrnbq_n_u32:
5047     Param0 = 0;
5048     Param1 = 1;
5049     Param2 = 1;
5050     Param3 = 1;
5051     Param4 = 0;
5052     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5053     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5054     break;
5055   case ARM::BI__builtin_arm_mve_vrshrntq_n_s16:
5056     Param0 = 0;
5057     Param1 = 1;
5058     Param2 = 0;
5059     Param3 = 0;
5060     Param4 = 1;
5061     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
5062     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
5063     break;
5064   case ARM::BI__builtin_arm_mve_vrshrntq_n_s32:
5065     Param0 = 0;
5066     Param1 = 1;
5067     Param2 = 0;
5068     Param3 = 0;
5069     Param4 = 1;
5070     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5071     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5072     break;
5073   case ARM::BI__builtin_arm_mve_vrshrntq_n_u16:
5074     Param0 = 0;
5075     Param1 = 1;
5076     Param2 = 1;
5077     Param3 = 1;
5078     Param4 = 1;
5079     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
5080     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
5081     break;
5082   case ARM::BI__builtin_arm_mve_vrshrntq_n_u32:
5083     Param0 = 0;
5084     Param1 = 1;
5085     Param2 = 1;
5086     Param3 = 1;
5087     Param4 = 1;
5088     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5089     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5090     break;
5091   case ARM::BI__builtin_arm_mve_vshrnbq_n_s16:
5092     Param0 = 0;
5093     Param1 = 0;
5094     Param2 = 0;
5095     Param3 = 0;
5096     Param4 = 0;
5097     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
5098     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
5099     break;
5100   case ARM::BI__builtin_arm_mve_vshrnbq_n_s32:
5101     Param0 = 0;
5102     Param1 = 0;
5103     Param2 = 0;
5104     Param3 = 0;
5105     Param4 = 0;
5106     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5107     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5108     break;
5109   case ARM::BI__builtin_arm_mve_vshrnbq_n_u16:
5110     Param0 = 0;
5111     Param1 = 0;
5112     Param2 = 1;
5113     Param3 = 1;
5114     Param4 = 0;
5115     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
5116     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
5117     break;
5118   case ARM::BI__builtin_arm_mve_vshrnbq_n_u32:
5119     Param0 = 0;
5120     Param1 = 0;
5121     Param2 = 1;
5122     Param3 = 1;
5123     Param4 = 0;
5124     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5125     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5126     break;
5127   case ARM::BI__builtin_arm_mve_vshrntq_n_s16:
5128     Param0 = 0;
5129     Param1 = 0;
5130     Param2 = 0;
5131     Param3 = 0;
5132     Param4 = 1;
5133     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
5134     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
5135     break;
5136   case ARM::BI__builtin_arm_mve_vshrntq_n_s32:
5137     Param0 = 0;
5138     Param1 = 0;
5139     Param2 = 0;
5140     Param3 = 0;
5141     Param4 = 1;
5142     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5143     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5144     break;
5145   case ARM::BI__builtin_arm_mve_vshrntq_n_u16:
5146     Param0 = 0;
5147     Param1 = 0;
5148     Param2 = 1;
5149     Param3 = 1;
5150     Param4 = 1;
5151     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
5152     Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
5153     break;
5154   case ARM::BI__builtin_arm_mve_vshrntq_n_u32:
5155     Param0 = 0;
5156     Param1 = 0;
5157     Param2 = 1;
5158     Param3 = 1;
5159     Param4 = 1;
5160     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5161     Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5162     break;
5163   }
5164   Value *Val0 = EmitScalarExpr(E->getArg(0));
5165   Value *Val1 = EmitScalarExpr(E->getArg(1));
5166   Value *Val2 = EmitScalarExpr(E->getArg(2));
5167   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
5168   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
5169   Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param2);
5170   Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param3);
5171   Value *Val7 = llvm::ConstantInt::get(Int32Ty, Param4);
5172   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshrn, {Param5, Param6}), {Val0, Val1, Val2, Val3, Val4, Val5, Val6, Val7});
5173 }
5174 case ARM::BI__builtin_arm_mve_vqdmladhq_s16:
5175 case ARM::BI__builtin_arm_mve_vqdmladhq_s32:
5176 case ARM::BI__builtin_arm_mve_vqdmladhq_s8:
5177 case ARM::BI__builtin_arm_mve_vqdmladhxq_s16:
5178 case ARM::BI__builtin_arm_mve_vqdmladhxq_s32:
5179 case ARM::BI__builtin_arm_mve_vqdmladhxq_s8:
5180 case ARM::BI__builtin_arm_mve_vqdmlsdhq_s16:
5181 case ARM::BI__builtin_arm_mve_vqdmlsdhq_s32:
5182 case ARM::BI__builtin_arm_mve_vqdmlsdhq_s8:
5183 case ARM::BI__builtin_arm_mve_vqdmlsdhxq_s16:
5184 case ARM::BI__builtin_arm_mve_vqdmlsdhxq_s32:
5185 case ARM::BI__builtin_arm_mve_vqdmlsdhxq_s8:
5186 case ARM::BI__builtin_arm_mve_vqrdmladhq_s16:
5187 case ARM::BI__builtin_arm_mve_vqrdmladhq_s32:
5188 case ARM::BI__builtin_arm_mve_vqrdmladhq_s8:
5189 case ARM::BI__builtin_arm_mve_vqrdmladhxq_s16:
5190 case ARM::BI__builtin_arm_mve_vqrdmladhxq_s32:
5191 case ARM::BI__builtin_arm_mve_vqrdmladhxq_s8:
5192 case ARM::BI__builtin_arm_mve_vqrdmlsdhq_s16:
5193 case ARM::BI__builtin_arm_mve_vqrdmlsdhq_s32:
5194 case ARM::BI__builtin_arm_mve_vqrdmlsdhq_s8:
5195 case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_s16:
5196 case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_s32:
5197 case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_s8: {
5198   uint32_t  Param0;
5199   uint32_t  Param1;
5200   uint32_t  Param2;
5201   llvm::Type * Param3;
5202   switch (BuiltinID) {
5203   case ARM::BI__builtin_arm_mve_vqdmladhq_s16:
5204     Param0 = 0;
5205     Param1 = 0;
5206     Param2 = 0;
5207     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5208     break;
5209   case ARM::BI__builtin_arm_mve_vqdmladhq_s32:
5210     Param0 = 0;
5211     Param1 = 0;
5212     Param2 = 0;
5213     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5214     break;
5215   case ARM::BI__builtin_arm_mve_vqdmladhq_s8:
5216     Param0 = 0;
5217     Param1 = 0;
5218     Param2 = 0;
5219     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
5220     break;
5221   case ARM::BI__builtin_arm_mve_vqdmladhxq_s16:
5222     Param0 = 1;
5223     Param1 = 0;
5224     Param2 = 0;
5225     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5226     break;
5227   case ARM::BI__builtin_arm_mve_vqdmladhxq_s32:
5228     Param0 = 1;
5229     Param1 = 0;
5230     Param2 = 0;
5231     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5232     break;
5233   case ARM::BI__builtin_arm_mve_vqdmladhxq_s8:
5234     Param0 = 1;
5235     Param1 = 0;
5236     Param2 = 0;
5237     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
5238     break;
5239   case ARM::BI__builtin_arm_mve_vqdmlsdhq_s16:
5240     Param0 = 0;
5241     Param1 = 0;
5242     Param2 = 1;
5243     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5244     break;
5245   case ARM::BI__builtin_arm_mve_vqdmlsdhq_s32:
5246     Param0 = 0;
5247     Param1 = 0;
5248     Param2 = 1;
5249     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5250     break;
5251   case ARM::BI__builtin_arm_mve_vqdmlsdhq_s8:
5252     Param0 = 0;
5253     Param1 = 0;
5254     Param2 = 1;
5255     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
5256     break;
5257   case ARM::BI__builtin_arm_mve_vqdmlsdhxq_s16:
5258     Param0 = 1;
5259     Param1 = 0;
5260     Param2 = 1;
5261     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5262     break;
5263   case ARM::BI__builtin_arm_mve_vqdmlsdhxq_s32:
5264     Param0 = 1;
5265     Param1 = 0;
5266     Param2 = 1;
5267     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5268     break;
5269   case ARM::BI__builtin_arm_mve_vqdmlsdhxq_s8:
5270     Param0 = 1;
5271     Param1 = 0;
5272     Param2 = 1;
5273     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
5274     break;
5275   case ARM::BI__builtin_arm_mve_vqrdmladhq_s16:
5276     Param0 = 0;
5277     Param1 = 1;
5278     Param2 = 0;
5279     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5280     break;
5281   case ARM::BI__builtin_arm_mve_vqrdmladhq_s32:
5282     Param0 = 0;
5283     Param1 = 1;
5284     Param2 = 0;
5285     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5286     break;
5287   case ARM::BI__builtin_arm_mve_vqrdmladhq_s8:
5288     Param0 = 0;
5289     Param1 = 1;
5290     Param2 = 0;
5291     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
5292     break;
5293   case ARM::BI__builtin_arm_mve_vqrdmladhxq_s16:
5294     Param0 = 1;
5295     Param1 = 1;
5296     Param2 = 0;
5297     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5298     break;
5299   case ARM::BI__builtin_arm_mve_vqrdmladhxq_s32:
5300     Param0 = 1;
5301     Param1 = 1;
5302     Param2 = 0;
5303     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5304     break;
5305   case ARM::BI__builtin_arm_mve_vqrdmladhxq_s8:
5306     Param0 = 1;
5307     Param1 = 1;
5308     Param2 = 0;
5309     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
5310     break;
5311   case ARM::BI__builtin_arm_mve_vqrdmlsdhq_s16:
5312     Param0 = 0;
5313     Param1 = 1;
5314     Param2 = 1;
5315     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5316     break;
5317   case ARM::BI__builtin_arm_mve_vqrdmlsdhq_s32:
5318     Param0 = 0;
5319     Param1 = 1;
5320     Param2 = 1;
5321     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5322     break;
5323   case ARM::BI__builtin_arm_mve_vqrdmlsdhq_s8:
5324     Param0 = 0;
5325     Param1 = 1;
5326     Param2 = 1;
5327     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
5328     break;
5329   case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_s16:
5330     Param0 = 1;
5331     Param1 = 1;
5332     Param2 = 1;
5333     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5334     break;
5335   case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_s32:
5336     Param0 = 1;
5337     Param1 = 1;
5338     Param2 = 1;
5339     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5340     break;
5341   case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_s8:
5342     Param0 = 1;
5343     Param1 = 1;
5344     Param2 = 1;
5345     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
5346     break;
5347   }
5348   Value *Val0 = EmitScalarExpr(E->getArg(0));
5349   Value *Val1 = EmitScalarExpr(E->getArg(1));
5350   Value *Val2 = EmitScalarExpr(E->getArg(2));
5351   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
5352   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
5353   Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param2);
5354   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vqdmlad, {Param3}), {Val0, Val1, Val2, Val3, Val4, Val5});
5355 }
5356 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_s64:
5357 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_u64:
5358 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_f32:
5359 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_s32:
5360 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_u32: {
5361   llvm::Type * Param0;
5362   llvm::Type * Param1;
5363   switch (BuiltinID) {
5364   case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_s64:
5365     Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
5366     Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
5367     break;
5368   case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_u64:
5369     Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
5370     Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
5371     break;
5372   case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_f32:
5373     Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
5374     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
5375     break;
5376   case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_s32:
5377     Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
5378     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5379     break;
5380   case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_u32:
5381     Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
5382     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5383     break;
5384   }
5385   Value *Val0 = EmitScalarExpr(E->getArg(0));
5386   Value *Val1 = EmitScalarExpr(E->getArg(1));
5387   Value *Val2 = EmitScalarExpr(E->getArg(2));
5388   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vstr_scatter_base, {Param0, Param1}), {Val0, Val1, Val2});
5389 }
5390 case ARM::BI__builtin_arm_mve_vqdmlahq_n_s32:
5391 case ARM::BI__builtin_arm_mve_vqdmlashq_n_s32:
5392 case ARM::BI__builtin_arm_mve_vqrdmlahq_n_s32:
5393 case ARM::BI__builtin_arm_mve_vqrdmlashq_n_s32:
5394 case ARM::BI__builtin_arm_mve_vsliq_n_s16:
5395 case ARM::BI__builtin_arm_mve_vsliq_n_s32:
5396 case ARM::BI__builtin_arm_mve_vsliq_n_s8:
5397 case ARM::BI__builtin_arm_mve_vsliq_n_u16:
5398 case ARM::BI__builtin_arm_mve_vsliq_n_u32:
5399 case ARM::BI__builtin_arm_mve_vsliq_n_u8:
5400 case ARM::BI__builtin_arm_mve_vsriq_n_s16:
5401 case ARM::BI__builtin_arm_mve_vsriq_n_s32:
5402 case ARM::BI__builtin_arm_mve_vsriq_n_s8:
5403 case ARM::BI__builtin_arm_mve_vsriq_n_u16:
5404 case ARM::BI__builtin_arm_mve_vsriq_n_u32:
5405 case ARM::BI__builtin_arm_mve_vsriq_n_u8: {
5406   Intrinsic::ID  Param0;
5407   llvm::Type * Param1;
5408   switch (BuiltinID) {
5409   case ARM::BI__builtin_arm_mve_vqdmlahq_n_s32:
5410     Param0 = Intrinsic::arm_mve_vqdmlah;
5411     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5412     break;
5413   case ARM::BI__builtin_arm_mve_vqdmlashq_n_s32:
5414     Param0 = Intrinsic::arm_mve_vqdmlash;
5415     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5416     break;
5417   case ARM::BI__builtin_arm_mve_vqrdmlahq_n_s32:
5418     Param0 = Intrinsic::arm_mve_vqrdmlah;
5419     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5420     break;
5421   case ARM::BI__builtin_arm_mve_vqrdmlashq_n_s32:
5422     Param0 = Intrinsic::arm_mve_vqrdmlash;
5423     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5424     break;
5425   case ARM::BI__builtin_arm_mve_vsliq_n_s16:
5426     Param0 = Intrinsic::arm_mve_vsli;
5427     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
5428     break;
5429   case ARM::BI__builtin_arm_mve_vsliq_n_s32:
5430     Param0 = Intrinsic::arm_mve_vsli;
5431     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5432     break;
5433   case ARM::BI__builtin_arm_mve_vsliq_n_s8:
5434     Param0 = Intrinsic::arm_mve_vsli;
5435     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
5436     break;
5437   case ARM::BI__builtin_arm_mve_vsliq_n_u16:
5438     Param0 = Intrinsic::arm_mve_vsli;
5439     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
5440     break;
5441   case ARM::BI__builtin_arm_mve_vsliq_n_u32:
5442     Param0 = Intrinsic::arm_mve_vsli;
5443     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5444     break;
5445   case ARM::BI__builtin_arm_mve_vsliq_n_u8:
5446     Param0 = Intrinsic::arm_mve_vsli;
5447     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
5448     break;
5449   case ARM::BI__builtin_arm_mve_vsriq_n_s16:
5450     Param0 = Intrinsic::arm_mve_vsri;
5451     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
5452     break;
5453   case ARM::BI__builtin_arm_mve_vsriq_n_s32:
5454     Param0 = Intrinsic::arm_mve_vsri;
5455     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5456     break;
5457   case ARM::BI__builtin_arm_mve_vsriq_n_s8:
5458     Param0 = Intrinsic::arm_mve_vsri;
5459     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
5460     break;
5461   case ARM::BI__builtin_arm_mve_vsriq_n_u16:
5462     Param0 = Intrinsic::arm_mve_vsri;
5463     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
5464     break;
5465   case ARM::BI__builtin_arm_mve_vsriq_n_u32:
5466     Param0 = Intrinsic::arm_mve_vsri;
5467     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5468     break;
5469   case ARM::BI__builtin_arm_mve_vsriq_n_u8:
5470     Param0 = Intrinsic::arm_mve_vsri;
5471     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
5472     break;
5473   }
5474   Value *Val0 = EmitScalarExpr(E->getArg(0));
5475   Value *Val1 = EmitScalarExpr(E->getArg(1));
5476   Value *Val2 = EmitScalarExpr(E->getArg(2));
5477   return Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0, Val1, Val2});
5478 }
5479 case ARM::BI__builtin_arm_mve_vadciq_s32:
5480 case ARM::BI__builtin_arm_mve_vadciq_u32: {
5481   Value *Val0 = EmitScalarExpr(E->getArg(0));
5482   Value *Val1 = EmitScalarExpr(E->getArg(1));
5483   Value *Val2 = llvm::ConstantInt::get(Int32Ty, 0);
5484   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vadc, {llvm::FixedVectorType::get(Int32Ty, 4)}), {Val0, Val1, Val2});
5485   Value *Val4 = llvm::ConstantInt::get(Int32Ty, 1);
5486   Value *Val5 = Builder.CreateExtractValue(Val3, static_cast<unsigned>(1));
5487   Value *Val6 = llvm::ConstantInt::get(Int32Ty, 29);
5488   Value *Val7 = Builder.CreateLShr(Val5, Val6);
5489   Value *Val8 = Builder.CreateAnd(Val4, Val7);
5490   Address Val9 = EmitPointerWithAlignment(E->getArg(2));
5491   Builder.CreateStore(Val8, Val9);
5492   return Builder.CreateExtractValue(Val3, static_cast<unsigned>(0));
5493 }
5494 case ARM::BI__builtin_arm_mve_vsbciq_s32:
5495 case ARM::BI__builtin_arm_mve_vsbciq_u32: {
5496   Value *Val0 = EmitScalarExpr(E->getArg(0));
5497   Value *Val1 = EmitScalarExpr(E->getArg(1));
5498   Value *Val2 = llvm::ConstantInt::get(Int32Ty, 1);
5499   Value *Val3 = llvm::ConstantInt::get(Int32Ty, 29);
5500   Value *Val4 = Builder.CreateShl(Val2, Val3);
5501   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vsbc, {llvm::FixedVectorType::get(Int32Ty, 4)}), {Val0, Val1, Val4});
5502   Value *Val6 = llvm::ConstantInt::get(Int32Ty, 1);
5503   Value *Val7 = Builder.CreateExtractValue(Val5, static_cast<unsigned>(1));
5504   Value *Val8 = llvm::ConstantInt::get(Int32Ty, 29);
5505   Value *Val9 = Builder.CreateLShr(Val7, Val8);
5506   Value *Val10 = Builder.CreateAnd(Val6, Val9);
5507   Address Val11 = EmitPointerWithAlignment(E->getArg(2));
5508   Builder.CreateStore(Val10, Val11);
5509   return Builder.CreateExtractValue(Val5, static_cast<unsigned>(0));
5510 }
5511 case ARM::BI__builtin_arm_mve_vmaxvq_s32:
5512 case ARM::BI__builtin_arm_mve_vmaxvq_u32:
5513 case ARM::BI__builtin_arm_mve_vminvq_s32:
5514 case ARM::BI__builtin_arm_mve_vminvq_u32: {
5515   uint32_t  Param0;
5516   Intrinsic::ID  Param1;
5517   bool  Param2;
5518   switch (BuiltinID) {
5519   case ARM::BI__builtin_arm_mve_vmaxvq_s32:
5520     Param0 = 0;
5521     Param1 = Intrinsic::arm_mve_maxv;
5522     Param2 = true;
5523     break;
5524   case ARM::BI__builtin_arm_mve_vmaxvq_u32:
5525     Param0 = 1;
5526     Param1 = Intrinsic::arm_mve_maxv;
5527     Param2 = false;
5528     break;
5529   case ARM::BI__builtin_arm_mve_vminvq_s32:
5530     Param0 = 0;
5531     Param1 = Intrinsic::arm_mve_minv;
5532     Param2 = true;
5533     break;
5534   case ARM::BI__builtin_arm_mve_vminvq_u32:
5535     Param0 = 1;
5536     Param1 = Intrinsic::arm_mve_minv;
5537     Param2 = false;
5538     break;
5539   }
5540   Value *Val0 = EmitScalarExpr(E->getArg(0));
5541   Value *Val1 = EmitScalarExpr(E->getArg(1));
5542   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
5543   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int32Ty, 4)}), {Val0, Val1, Val2});
5544   return Builder.CreateIntCast(Val3, Int32Ty, Param2);
5545 }
5546 case ARM::BI__builtin_arm_mve_vmovnbq_m_s16:
5547 case ARM::BI__builtin_arm_mve_vmovnbq_m_s32:
5548 case ARM::BI__builtin_arm_mve_vmovnbq_m_u16:
5549 case ARM::BI__builtin_arm_mve_vmovnbq_m_u32:
5550 case ARM::BI__builtin_arm_mve_vmovntq_m_s16:
5551 case ARM::BI__builtin_arm_mve_vmovntq_m_s32:
5552 case ARM::BI__builtin_arm_mve_vmovntq_m_u16:
5553 case ARM::BI__builtin_arm_mve_vmovntq_m_u32: {
5554   uint32_t  Param0;
5555   llvm::Type * Param1;
5556   llvm::Type * Param2;
5557   llvm::Type * Param3;
5558   switch (BuiltinID) {
5559   case ARM::BI__builtin_arm_mve_vmovnbq_m_s16:
5560     Param0 = 0;
5561     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5562     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
5563     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5564     break;
5565   case ARM::BI__builtin_arm_mve_vmovnbq_m_s32:
5566     Param0 = 0;
5567     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5568     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
5569     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5570     break;
5571   case ARM::BI__builtin_arm_mve_vmovnbq_m_u16:
5572     Param0 = 0;
5573     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5574     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
5575     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5576     break;
5577   case ARM::BI__builtin_arm_mve_vmovnbq_m_u32:
5578     Param0 = 0;
5579     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5580     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
5581     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5582     break;
5583   case ARM::BI__builtin_arm_mve_vmovntq_m_s16:
5584     Param0 = 1;
5585     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5586     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
5587     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5588     break;
5589   case ARM::BI__builtin_arm_mve_vmovntq_m_s32:
5590     Param0 = 1;
5591     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5592     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
5593     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5594     break;
5595   case ARM::BI__builtin_arm_mve_vmovntq_m_u16:
5596     Param0 = 1;
5597     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5598     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
5599     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5600     break;
5601   case ARM::BI__builtin_arm_mve_vmovntq_m_u32:
5602     Param0 = 1;
5603     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5604     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
5605     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5606     break;
5607   }
5608   Value *Val0 = EmitScalarExpr(E->getArg(0));
5609   Value *Val1 = EmitScalarExpr(E->getArg(1));
5610   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
5611   Value *Val3 = EmitScalarExpr(E->getArg(2));
5612   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
5613   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val4});
5614   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmovn_predicated, {Param2, Param3, Param1}), {Val0, Val1, Val2, Val5});
5615 }
5616 case ARM::BI__builtin_arm_mve_vmaxvq_p_s32:
5617 case ARM::BI__builtin_arm_mve_vmaxvq_p_u32:
5618 case ARM::BI__builtin_arm_mve_vminvq_p_s32:
5619 case ARM::BI__builtin_arm_mve_vminvq_p_u32: {
5620   uint32_t  Param0;
5621   Intrinsic::ID  Param1;
5622   bool  Param2;
5623   switch (BuiltinID) {
5624   case ARM::BI__builtin_arm_mve_vmaxvq_p_s32:
5625     Param0 = 0;
5626     Param1 = Intrinsic::arm_mve_maxv_predicated;
5627     Param2 = true;
5628     break;
5629   case ARM::BI__builtin_arm_mve_vmaxvq_p_u32:
5630     Param0 = 1;
5631     Param1 = Intrinsic::arm_mve_maxv_predicated;
5632     Param2 = false;
5633     break;
5634   case ARM::BI__builtin_arm_mve_vminvq_p_s32:
5635     Param0 = 0;
5636     Param1 = Intrinsic::arm_mve_minv_predicated;
5637     Param2 = true;
5638     break;
5639   case ARM::BI__builtin_arm_mve_vminvq_p_u32:
5640     Param0 = 1;
5641     Param1 = Intrinsic::arm_mve_minv_predicated;
5642     Param2 = false;
5643     break;
5644   }
5645   Value *Val0 = EmitScalarExpr(E->getArg(0));
5646   Value *Val1 = EmitScalarExpr(E->getArg(1));
5647   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
5648   Value *Val3 = EmitScalarExpr(E->getArg(2));
5649   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
5650   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
5651   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val0, Val1, Val2, Val5});
5652   return Builder.CreateIntCast(Val6, Int32Ty, Param2);
5653 }
5654 case ARM::BI__builtin_arm_mve_vcvtbq_m_f16_f32:
5655 case ARM::BI__builtin_arm_mve_vcvtbq_m_f32_f16:
5656 case ARM::BI__builtin_arm_mve_vcvttq_m_f16_f32:
5657 case ARM::BI__builtin_arm_mve_vcvttq_m_f32_f16: {
5658   uint32_t  Param0;
5659   Intrinsic::ID  Param1;
5660   switch (BuiltinID) {
5661   case ARM::BI__builtin_arm_mve_vcvtbq_m_f16_f32:
5662     Param0 = 0;
5663     Param1 = Intrinsic::arm_mve_vcvt_narrow_predicated;
5664     break;
5665   case ARM::BI__builtin_arm_mve_vcvtbq_m_f32_f16:
5666     Param0 = 0;
5667     Param1 = Intrinsic::arm_mve_vcvt_widen_predicated;
5668     break;
5669   case ARM::BI__builtin_arm_mve_vcvttq_m_f16_f32:
5670     Param0 = 1;
5671     Param1 = Intrinsic::arm_mve_vcvt_narrow_predicated;
5672     break;
5673   case ARM::BI__builtin_arm_mve_vcvttq_m_f32_f16:
5674     Param0 = 1;
5675     Param1 = Intrinsic::arm_mve_vcvt_widen_predicated;
5676     break;
5677   }
5678   Value *Val0 = EmitScalarExpr(E->getArg(0));
5679   Value *Val1 = EmitScalarExpr(E->getArg(1));
5680   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
5681   Value *Val3 = EmitScalarExpr(E->getArg(2));
5682   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
5683   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
5684   return Builder.CreateCall(CGM.getIntrinsic(Param1), {Val0, Val1, Val2, Val5});
5685 }
5686 case ARM::BI__builtin_arm_mve_vqmovnbq_m_s16:
5687 case ARM::BI__builtin_arm_mve_vqmovnbq_m_s32:
5688 case ARM::BI__builtin_arm_mve_vqmovnbq_m_u16:
5689 case ARM::BI__builtin_arm_mve_vqmovnbq_m_u32:
5690 case ARM::BI__builtin_arm_mve_vqmovntq_m_s16:
5691 case ARM::BI__builtin_arm_mve_vqmovntq_m_s32:
5692 case ARM::BI__builtin_arm_mve_vqmovntq_m_u16:
5693 case ARM::BI__builtin_arm_mve_vqmovntq_m_u32:
5694 case ARM::BI__builtin_arm_mve_vqmovunbq_m_s16:
5695 case ARM::BI__builtin_arm_mve_vqmovunbq_m_s32:
5696 case ARM::BI__builtin_arm_mve_vqmovuntq_m_s16:
5697 case ARM::BI__builtin_arm_mve_vqmovuntq_m_s32: {
5698   uint32_t  Param0;
5699   uint32_t  Param1;
5700   uint32_t  Param2;
5701   llvm::Type * Param3;
5702   llvm::Type * Param4;
5703   llvm::Type * Param5;
5704   switch (BuiltinID) {
5705   case ARM::BI__builtin_arm_mve_vqmovnbq_m_s16:
5706     Param0 = 0;
5707     Param1 = 0;
5708     Param2 = 0;
5709     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5710     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5711     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5712     break;
5713   case ARM::BI__builtin_arm_mve_vqmovnbq_m_s32:
5714     Param0 = 0;
5715     Param1 = 0;
5716     Param2 = 0;
5717     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5718     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5719     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
5720     break;
5721   case ARM::BI__builtin_arm_mve_vqmovnbq_m_u16:
5722     Param0 = 1;
5723     Param1 = 1;
5724     Param2 = 0;
5725     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5726     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5727     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5728     break;
5729   case ARM::BI__builtin_arm_mve_vqmovnbq_m_u32:
5730     Param0 = 1;
5731     Param1 = 1;
5732     Param2 = 0;
5733     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5734     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5735     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
5736     break;
5737   case ARM::BI__builtin_arm_mve_vqmovntq_m_s16:
5738     Param0 = 0;
5739     Param1 = 0;
5740     Param2 = 1;
5741     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5742     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5743     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5744     break;
5745   case ARM::BI__builtin_arm_mve_vqmovntq_m_s32:
5746     Param0 = 0;
5747     Param1 = 0;
5748     Param2 = 1;
5749     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5750     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5751     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
5752     break;
5753   case ARM::BI__builtin_arm_mve_vqmovntq_m_u16:
5754     Param0 = 1;
5755     Param1 = 1;
5756     Param2 = 1;
5757     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5758     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5759     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5760     break;
5761   case ARM::BI__builtin_arm_mve_vqmovntq_m_u32:
5762     Param0 = 1;
5763     Param1 = 1;
5764     Param2 = 1;
5765     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5766     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5767     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
5768     break;
5769   case ARM::BI__builtin_arm_mve_vqmovunbq_m_s16:
5770     Param0 = 1;
5771     Param1 = 0;
5772     Param2 = 0;
5773     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5774     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5775     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5776     break;
5777   case ARM::BI__builtin_arm_mve_vqmovunbq_m_s32:
5778     Param0 = 1;
5779     Param1 = 0;
5780     Param2 = 0;
5781     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5782     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5783     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
5784     break;
5785   case ARM::BI__builtin_arm_mve_vqmovuntq_m_s16:
5786     Param0 = 1;
5787     Param1 = 0;
5788     Param2 = 1;
5789     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5790     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5791     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5792     break;
5793   case ARM::BI__builtin_arm_mve_vqmovuntq_m_s32:
5794     Param0 = 1;
5795     Param1 = 0;
5796     Param2 = 1;
5797     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5798     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5799     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
5800     break;
5801   }
5802   Value *Val0 = EmitScalarExpr(E->getArg(0));
5803   Value *Val1 = EmitScalarExpr(E->getArg(1));
5804   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
5805   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
5806   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
5807   Value *Val5 = EmitScalarExpr(E->getArg(2));
5808   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
5809   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val6});
5810   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vqmovn_predicated, {Param4, Param5, Param3}), {Val0, Val1, Val2, Val3, Val4, Val7});
5811 }
5812 case ARM::BI__builtin_arm_mve_vqrshlq_m_n_s16:
5813 case ARM::BI__builtin_arm_mve_vqrshlq_m_n_s32:
5814 case ARM::BI__builtin_arm_mve_vqrshlq_m_n_s8:
5815 case ARM::BI__builtin_arm_mve_vqrshlq_m_n_u16:
5816 case ARM::BI__builtin_arm_mve_vqrshlq_m_n_u32:
5817 case ARM::BI__builtin_arm_mve_vqrshlq_m_n_u8:
5818 case ARM::BI__builtin_arm_mve_vqshlq_m_r_s16:
5819 case ARM::BI__builtin_arm_mve_vqshlq_m_r_s32:
5820 case ARM::BI__builtin_arm_mve_vqshlq_m_r_s8:
5821 case ARM::BI__builtin_arm_mve_vqshlq_m_r_u16:
5822 case ARM::BI__builtin_arm_mve_vqshlq_m_r_u32:
5823 case ARM::BI__builtin_arm_mve_vqshlq_m_r_u8:
5824 case ARM::BI__builtin_arm_mve_vrshlq_m_n_s16:
5825 case ARM::BI__builtin_arm_mve_vrshlq_m_n_s32:
5826 case ARM::BI__builtin_arm_mve_vrshlq_m_n_s8:
5827 case ARM::BI__builtin_arm_mve_vrshlq_m_n_u16:
5828 case ARM::BI__builtin_arm_mve_vrshlq_m_n_u32:
5829 case ARM::BI__builtin_arm_mve_vrshlq_m_n_u8:
5830 case ARM::BI__builtin_arm_mve_vshlq_m_r_s16:
5831 case ARM::BI__builtin_arm_mve_vshlq_m_r_s32:
5832 case ARM::BI__builtin_arm_mve_vshlq_m_r_s8:
5833 case ARM::BI__builtin_arm_mve_vshlq_m_r_u16:
5834 case ARM::BI__builtin_arm_mve_vshlq_m_r_u32:
5835 case ARM::BI__builtin_arm_mve_vshlq_m_r_u8: {
5836   uint32_t  Param0;
5837   uint32_t  Param1;
5838   uint32_t  Param2;
5839   llvm::Type * Param3;
5840   llvm::Type * Param4;
5841   switch (BuiltinID) {
5842   case ARM::BI__builtin_arm_mve_vqrshlq_m_n_s16:
5843     Param0 = 1;
5844     Param1 = 1;
5845     Param2 = 0;
5846     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5847     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5848     break;
5849   case ARM::BI__builtin_arm_mve_vqrshlq_m_n_s32:
5850     Param0 = 1;
5851     Param1 = 1;
5852     Param2 = 0;
5853     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5854     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
5855     break;
5856   case ARM::BI__builtin_arm_mve_vqrshlq_m_n_s8:
5857     Param0 = 1;
5858     Param1 = 1;
5859     Param2 = 0;
5860     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
5861     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5862     break;
5863   case ARM::BI__builtin_arm_mve_vqrshlq_m_n_u16:
5864     Param0 = 1;
5865     Param1 = 1;
5866     Param2 = 1;
5867     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5868     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5869     break;
5870   case ARM::BI__builtin_arm_mve_vqrshlq_m_n_u32:
5871     Param0 = 1;
5872     Param1 = 1;
5873     Param2 = 1;
5874     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5875     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
5876     break;
5877   case ARM::BI__builtin_arm_mve_vqrshlq_m_n_u8:
5878     Param0 = 1;
5879     Param1 = 1;
5880     Param2 = 1;
5881     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
5882     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5883     break;
5884   case ARM::BI__builtin_arm_mve_vqshlq_m_r_s16:
5885     Param0 = 1;
5886     Param1 = 0;
5887     Param2 = 0;
5888     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5889     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5890     break;
5891   case ARM::BI__builtin_arm_mve_vqshlq_m_r_s32:
5892     Param0 = 1;
5893     Param1 = 0;
5894     Param2 = 0;
5895     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5896     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
5897     break;
5898   case ARM::BI__builtin_arm_mve_vqshlq_m_r_s8:
5899     Param0 = 1;
5900     Param1 = 0;
5901     Param2 = 0;
5902     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
5903     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5904     break;
5905   case ARM::BI__builtin_arm_mve_vqshlq_m_r_u16:
5906     Param0 = 1;
5907     Param1 = 0;
5908     Param2 = 1;
5909     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5910     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5911     break;
5912   case ARM::BI__builtin_arm_mve_vqshlq_m_r_u32:
5913     Param0 = 1;
5914     Param1 = 0;
5915     Param2 = 1;
5916     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5917     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
5918     break;
5919   case ARM::BI__builtin_arm_mve_vqshlq_m_r_u8:
5920     Param0 = 1;
5921     Param1 = 0;
5922     Param2 = 1;
5923     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
5924     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5925     break;
5926   case ARM::BI__builtin_arm_mve_vrshlq_m_n_s16:
5927     Param0 = 0;
5928     Param1 = 1;
5929     Param2 = 0;
5930     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5931     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5932     break;
5933   case ARM::BI__builtin_arm_mve_vrshlq_m_n_s32:
5934     Param0 = 0;
5935     Param1 = 1;
5936     Param2 = 0;
5937     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5938     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
5939     break;
5940   case ARM::BI__builtin_arm_mve_vrshlq_m_n_s8:
5941     Param0 = 0;
5942     Param1 = 1;
5943     Param2 = 0;
5944     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
5945     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5946     break;
5947   case ARM::BI__builtin_arm_mve_vrshlq_m_n_u16:
5948     Param0 = 0;
5949     Param1 = 1;
5950     Param2 = 1;
5951     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5952     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5953     break;
5954   case ARM::BI__builtin_arm_mve_vrshlq_m_n_u32:
5955     Param0 = 0;
5956     Param1 = 1;
5957     Param2 = 1;
5958     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5959     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
5960     break;
5961   case ARM::BI__builtin_arm_mve_vrshlq_m_n_u8:
5962     Param0 = 0;
5963     Param1 = 1;
5964     Param2 = 1;
5965     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
5966     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5967     break;
5968   case ARM::BI__builtin_arm_mve_vshlq_m_r_s16:
5969     Param0 = 0;
5970     Param1 = 0;
5971     Param2 = 0;
5972     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5973     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5974     break;
5975   case ARM::BI__builtin_arm_mve_vshlq_m_r_s32:
5976     Param0 = 0;
5977     Param1 = 0;
5978     Param2 = 0;
5979     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5980     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
5981     break;
5982   case ARM::BI__builtin_arm_mve_vshlq_m_r_s8:
5983     Param0 = 0;
5984     Param1 = 0;
5985     Param2 = 0;
5986     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
5987     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5988     break;
5989   case ARM::BI__builtin_arm_mve_vshlq_m_r_u16:
5990     Param0 = 0;
5991     Param1 = 0;
5992     Param2 = 1;
5993     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5994     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5995     break;
5996   case ARM::BI__builtin_arm_mve_vshlq_m_r_u32:
5997     Param0 = 0;
5998     Param1 = 0;
5999     Param2 = 1;
6000     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
6001     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6002     break;
6003   case ARM::BI__builtin_arm_mve_vshlq_m_r_u8:
6004     Param0 = 0;
6005     Param1 = 0;
6006     Param2 = 1;
6007     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
6008     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6009     break;
6010   }
6011   Value *Val0 = EmitScalarExpr(E->getArg(0));
6012   Value *Val1 = EmitScalarExpr(E->getArg(1));
6013   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
6014   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
6015   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
6016   Value *Val5 = EmitScalarExpr(E->getArg(2));
6017   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
6018   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val6});
6019   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshl_scalar_predicated, {Param4, Param3}), {Val0, Val1, Val2, Val3, Val4, Val7});
6020 }
6021 case ARM::BI__builtin_arm_mve_vqrshlq_n_s16:
6022 case ARM::BI__builtin_arm_mve_vqrshlq_n_s32:
6023 case ARM::BI__builtin_arm_mve_vqrshlq_n_s8:
6024 case ARM::BI__builtin_arm_mve_vqrshlq_n_u16:
6025 case ARM::BI__builtin_arm_mve_vqrshlq_n_u32:
6026 case ARM::BI__builtin_arm_mve_vqrshlq_n_u8:
6027 case ARM::BI__builtin_arm_mve_vqshlq_r_s16:
6028 case ARM::BI__builtin_arm_mve_vqshlq_r_s32:
6029 case ARM::BI__builtin_arm_mve_vqshlq_r_s8:
6030 case ARM::BI__builtin_arm_mve_vqshlq_r_u16:
6031 case ARM::BI__builtin_arm_mve_vqshlq_r_u32:
6032 case ARM::BI__builtin_arm_mve_vqshlq_r_u8:
6033 case ARM::BI__builtin_arm_mve_vrshlq_n_s16:
6034 case ARM::BI__builtin_arm_mve_vrshlq_n_s32:
6035 case ARM::BI__builtin_arm_mve_vrshlq_n_s8:
6036 case ARM::BI__builtin_arm_mve_vrshlq_n_u16:
6037 case ARM::BI__builtin_arm_mve_vrshlq_n_u32:
6038 case ARM::BI__builtin_arm_mve_vrshlq_n_u8:
6039 case ARM::BI__builtin_arm_mve_vshlq_r_s16:
6040 case ARM::BI__builtin_arm_mve_vshlq_r_s32:
6041 case ARM::BI__builtin_arm_mve_vshlq_r_s8:
6042 case ARM::BI__builtin_arm_mve_vshlq_r_u16:
6043 case ARM::BI__builtin_arm_mve_vshlq_r_u32:
6044 case ARM::BI__builtin_arm_mve_vshlq_r_u8: {
6045   uint32_t  Param0;
6046   uint32_t  Param1;
6047   uint32_t  Param2;
6048   llvm::Type * Param3;
6049   switch (BuiltinID) {
6050   case ARM::BI__builtin_arm_mve_vqrshlq_n_s16:
6051     Param0 = 1;
6052     Param1 = 1;
6053     Param2 = 0;
6054     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6055     break;
6056   case ARM::BI__builtin_arm_mve_vqrshlq_n_s32:
6057     Param0 = 1;
6058     Param1 = 1;
6059     Param2 = 0;
6060     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6061     break;
6062   case ARM::BI__builtin_arm_mve_vqrshlq_n_s8:
6063     Param0 = 1;
6064     Param1 = 1;
6065     Param2 = 0;
6066     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6067     break;
6068   case ARM::BI__builtin_arm_mve_vqrshlq_n_u16:
6069     Param0 = 1;
6070     Param1 = 1;
6071     Param2 = 1;
6072     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6073     break;
6074   case ARM::BI__builtin_arm_mve_vqrshlq_n_u32:
6075     Param0 = 1;
6076     Param1 = 1;
6077     Param2 = 1;
6078     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6079     break;
6080   case ARM::BI__builtin_arm_mve_vqrshlq_n_u8:
6081     Param0 = 1;
6082     Param1 = 1;
6083     Param2 = 1;
6084     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6085     break;
6086   case ARM::BI__builtin_arm_mve_vqshlq_r_s16:
6087     Param0 = 1;
6088     Param1 = 0;
6089     Param2 = 0;
6090     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6091     break;
6092   case ARM::BI__builtin_arm_mve_vqshlq_r_s32:
6093     Param0 = 1;
6094     Param1 = 0;
6095     Param2 = 0;
6096     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6097     break;
6098   case ARM::BI__builtin_arm_mve_vqshlq_r_s8:
6099     Param0 = 1;
6100     Param1 = 0;
6101     Param2 = 0;
6102     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6103     break;
6104   case ARM::BI__builtin_arm_mve_vqshlq_r_u16:
6105     Param0 = 1;
6106     Param1 = 0;
6107     Param2 = 1;
6108     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6109     break;
6110   case ARM::BI__builtin_arm_mve_vqshlq_r_u32:
6111     Param0 = 1;
6112     Param1 = 0;
6113     Param2 = 1;
6114     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6115     break;
6116   case ARM::BI__builtin_arm_mve_vqshlq_r_u8:
6117     Param0 = 1;
6118     Param1 = 0;
6119     Param2 = 1;
6120     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6121     break;
6122   case ARM::BI__builtin_arm_mve_vrshlq_n_s16:
6123     Param0 = 0;
6124     Param1 = 1;
6125     Param2 = 0;
6126     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6127     break;
6128   case ARM::BI__builtin_arm_mve_vrshlq_n_s32:
6129     Param0 = 0;
6130     Param1 = 1;
6131     Param2 = 0;
6132     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6133     break;
6134   case ARM::BI__builtin_arm_mve_vrshlq_n_s8:
6135     Param0 = 0;
6136     Param1 = 1;
6137     Param2 = 0;
6138     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6139     break;
6140   case ARM::BI__builtin_arm_mve_vrshlq_n_u16:
6141     Param0 = 0;
6142     Param1 = 1;
6143     Param2 = 1;
6144     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6145     break;
6146   case ARM::BI__builtin_arm_mve_vrshlq_n_u32:
6147     Param0 = 0;
6148     Param1 = 1;
6149     Param2 = 1;
6150     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6151     break;
6152   case ARM::BI__builtin_arm_mve_vrshlq_n_u8:
6153     Param0 = 0;
6154     Param1 = 1;
6155     Param2 = 1;
6156     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6157     break;
6158   case ARM::BI__builtin_arm_mve_vshlq_r_s16:
6159     Param0 = 0;
6160     Param1 = 0;
6161     Param2 = 0;
6162     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6163     break;
6164   case ARM::BI__builtin_arm_mve_vshlq_r_s32:
6165     Param0 = 0;
6166     Param1 = 0;
6167     Param2 = 0;
6168     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6169     break;
6170   case ARM::BI__builtin_arm_mve_vshlq_r_s8:
6171     Param0 = 0;
6172     Param1 = 0;
6173     Param2 = 0;
6174     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6175     break;
6176   case ARM::BI__builtin_arm_mve_vshlq_r_u16:
6177     Param0 = 0;
6178     Param1 = 0;
6179     Param2 = 1;
6180     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6181     break;
6182   case ARM::BI__builtin_arm_mve_vshlq_r_u32:
6183     Param0 = 0;
6184     Param1 = 0;
6185     Param2 = 1;
6186     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6187     break;
6188   case ARM::BI__builtin_arm_mve_vshlq_r_u8:
6189     Param0 = 0;
6190     Param1 = 0;
6191     Param2 = 1;
6192     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6193     break;
6194   }
6195   Value *Val0 = EmitScalarExpr(E->getArg(0));
6196   Value *Val1 = EmitScalarExpr(E->getArg(1));
6197   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
6198   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
6199   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
6200   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshl_scalar, {Param3}), {Val0, Val1, Val2, Val3, Val4});
6201 }
6202 case ARM::BI__builtin_arm_mve_vqmovnbq_s16:
6203 case ARM::BI__builtin_arm_mve_vqmovnbq_s32:
6204 case ARM::BI__builtin_arm_mve_vqmovnbq_u16:
6205 case ARM::BI__builtin_arm_mve_vqmovnbq_u32:
6206 case ARM::BI__builtin_arm_mve_vqmovntq_s16:
6207 case ARM::BI__builtin_arm_mve_vqmovntq_s32:
6208 case ARM::BI__builtin_arm_mve_vqmovntq_u16:
6209 case ARM::BI__builtin_arm_mve_vqmovntq_u32:
6210 case ARM::BI__builtin_arm_mve_vqmovunbq_s16:
6211 case ARM::BI__builtin_arm_mve_vqmovunbq_s32:
6212 case ARM::BI__builtin_arm_mve_vqmovuntq_s16:
6213 case ARM::BI__builtin_arm_mve_vqmovuntq_s32:
6214 case ARM::BI__builtin_arm_mve_vqrshlq_s16:
6215 case ARM::BI__builtin_arm_mve_vqrshlq_s32:
6216 case ARM::BI__builtin_arm_mve_vqrshlq_s8:
6217 case ARM::BI__builtin_arm_mve_vqrshlq_u16:
6218 case ARM::BI__builtin_arm_mve_vqrshlq_u32:
6219 case ARM::BI__builtin_arm_mve_vqrshlq_u8:
6220 case ARM::BI__builtin_arm_mve_vqshlq_s16:
6221 case ARM::BI__builtin_arm_mve_vqshlq_s32:
6222 case ARM::BI__builtin_arm_mve_vqshlq_s8:
6223 case ARM::BI__builtin_arm_mve_vqshlq_u16:
6224 case ARM::BI__builtin_arm_mve_vqshlq_u32:
6225 case ARM::BI__builtin_arm_mve_vqshlq_u8:
6226 case ARM::BI__builtin_arm_mve_vrshlq_s16:
6227 case ARM::BI__builtin_arm_mve_vrshlq_s32:
6228 case ARM::BI__builtin_arm_mve_vrshlq_s8:
6229 case ARM::BI__builtin_arm_mve_vrshlq_u16:
6230 case ARM::BI__builtin_arm_mve_vrshlq_u32:
6231 case ARM::BI__builtin_arm_mve_vrshlq_u8:
6232 case ARM::BI__builtin_arm_mve_vshlq_s16:
6233 case ARM::BI__builtin_arm_mve_vshlq_s32:
6234 case ARM::BI__builtin_arm_mve_vshlq_s8:
6235 case ARM::BI__builtin_arm_mve_vshlq_u16:
6236 case ARM::BI__builtin_arm_mve_vshlq_u32:
6237 case ARM::BI__builtin_arm_mve_vshlq_u8: {
6238   uint32_t  Param0;
6239   uint32_t  Param1;
6240   uint32_t  Param2;
6241   Intrinsic::ID  Param3;
6242   llvm::Type * Param4;
6243   llvm::Type * Param5;
6244   switch (BuiltinID) {
6245   case ARM::BI__builtin_arm_mve_vqmovnbq_s16:
6246     Param0 = 0;
6247     Param1 = 0;
6248     Param2 = 0;
6249     Param3 = Intrinsic::arm_mve_vqmovn;
6250     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6251     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6252     break;
6253   case ARM::BI__builtin_arm_mve_vqmovnbq_s32:
6254     Param0 = 0;
6255     Param1 = 0;
6256     Param2 = 0;
6257     Param3 = Intrinsic::arm_mve_vqmovn;
6258     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6259     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6260     break;
6261   case ARM::BI__builtin_arm_mve_vqmovnbq_u16:
6262     Param0 = 1;
6263     Param1 = 1;
6264     Param2 = 0;
6265     Param3 = Intrinsic::arm_mve_vqmovn;
6266     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6267     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6268     break;
6269   case ARM::BI__builtin_arm_mve_vqmovnbq_u32:
6270     Param0 = 1;
6271     Param1 = 1;
6272     Param2 = 0;
6273     Param3 = Intrinsic::arm_mve_vqmovn;
6274     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6275     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6276     break;
6277   case ARM::BI__builtin_arm_mve_vqmovntq_s16:
6278     Param0 = 0;
6279     Param1 = 0;
6280     Param2 = 1;
6281     Param3 = Intrinsic::arm_mve_vqmovn;
6282     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6283     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6284     break;
6285   case ARM::BI__builtin_arm_mve_vqmovntq_s32:
6286     Param0 = 0;
6287     Param1 = 0;
6288     Param2 = 1;
6289     Param3 = Intrinsic::arm_mve_vqmovn;
6290     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6291     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6292     break;
6293   case ARM::BI__builtin_arm_mve_vqmovntq_u16:
6294     Param0 = 1;
6295     Param1 = 1;
6296     Param2 = 1;
6297     Param3 = Intrinsic::arm_mve_vqmovn;
6298     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6299     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6300     break;
6301   case ARM::BI__builtin_arm_mve_vqmovntq_u32:
6302     Param0 = 1;
6303     Param1 = 1;
6304     Param2 = 1;
6305     Param3 = Intrinsic::arm_mve_vqmovn;
6306     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6307     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6308     break;
6309   case ARM::BI__builtin_arm_mve_vqmovunbq_s16:
6310     Param0 = 1;
6311     Param1 = 0;
6312     Param2 = 0;
6313     Param3 = Intrinsic::arm_mve_vqmovn;
6314     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6315     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6316     break;
6317   case ARM::BI__builtin_arm_mve_vqmovunbq_s32:
6318     Param0 = 1;
6319     Param1 = 0;
6320     Param2 = 0;
6321     Param3 = Intrinsic::arm_mve_vqmovn;
6322     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6323     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6324     break;
6325   case ARM::BI__builtin_arm_mve_vqmovuntq_s16:
6326     Param0 = 1;
6327     Param1 = 0;
6328     Param2 = 1;
6329     Param3 = Intrinsic::arm_mve_vqmovn;
6330     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6331     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6332     break;
6333   case ARM::BI__builtin_arm_mve_vqmovuntq_s32:
6334     Param0 = 1;
6335     Param1 = 0;
6336     Param2 = 1;
6337     Param3 = Intrinsic::arm_mve_vqmovn;
6338     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6339     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6340     break;
6341   case ARM::BI__builtin_arm_mve_vqrshlq_s16:
6342     Param0 = 1;
6343     Param1 = 1;
6344     Param2 = 0;
6345     Param3 = Intrinsic::arm_mve_vshl_vector;
6346     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6347     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6348     break;
6349   case ARM::BI__builtin_arm_mve_vqrshlq_s32:
6350     Param0 = 1;
6351     Param1 = 1;
6352     Param2 = 0;
6353     Param3 = Intrinsic::arm_mve_vshl_vector;
6354     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6355     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6356     break;
6357   case ARM::BI__builtin_arm_mve_vqrshlq_s8:
6358     Param0 = 1;
6359     Param1 = 1;
6360     Param2 = 0;
6361     Param3 = Intrinsic::arm_mve_vshl_vector;
6362     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6363     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
6364     break;
6365   case ARM::BI__builtin_arm_mve_vqrshlq_u16:
6366     Param0 = 1;
6367     Param1 = 1;
6368     Param2 = 1;
6369     Param3 = Intrinsic::arm_mve_vshl_vector;
6370     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6371     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6372     break;
6373   case ARM::BI__builtin_arm_mve_vqrshlq_u32:
6374     Param0 = 1;
6375     Param1 = 1;
6376     Param2 = 1;
6377     Param3 = Intrinsic::arm_mve_vshl_vector;
6378     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6379     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6380     break;
6381   case ARM::BI__builtin_arm_mve_vqrshlq_u8:
6382     Param0 = 1;
6383     Param1 = 1;
6384     Param2 = 1;
6385     Param3 = Intrinsic::arm_mve_vshl_vector;
6386     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6387     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
6388     break;
6389   case ARM::BI__builtin_arm_mve_vqshlq_s16:
6390     Param0 = 1;
6391     Param1 = 0;
6392     Param2 = 0;
6393     Param3 = Intrinsic::arm_mve_vshl_vector;
6394     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6395     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6396     break;
6397   case ARM::BI__builtin_arm_mve_vqshlq_s32:
6398     Param0 = 1;
6399     Param1 = 0;
6400     Param2 = 0;
6401     Param3 = Intrinsic::arm_mve_vshl_vector;
6402     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6403     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6404     break;
6405   case ARM::BI__builtin_arm_mve_vqshlq_s8:
6406     Param0 = 1;
6407     Param1 = 0;
6408     Param2 = 0;
6409     Param3 = Intrinsic::arm_mve_vshl_vector;
6410     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6411     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
6412     break;
6413   case ARM::BI__builtin_arm_mve_vqshlq_u16:
6414     Param0 = 1;
6415     Param1 = 0;
6416     Param2 = 1;
6417     Param3 = Intrinsic::arm_mve_vshl_vector;
6418     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6419     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6420     break;
6421   case ARM::BI__builtin_arm_mve_vqshlq_u32:
6422     Param0 = 1;
6423     Param1 = 0;
6424     Param2 = 1;
6425     Param3 = Intrinsic::arm_mve_vshl_vector;
6426     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6427     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6428     break;
6429   case ARM::BI__builtin_arm_mve_vqshlq_u8:
6430     Param0 = 1;
6431     Param1 = 0;
6432     Param2 = 1;
6433     Param3 = Intrinsic::arm_mve_vshl_vector;
6434     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6435     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
6436     break;
6437   case ARM::BI__builtin_arm_mve_vrshlq_s16:
6438     Param0 = 0;
6439     Param1 = 1;
6440     Param2 = 0;
6441     Param3 = Intrinsic::arm_mve_vshl_vector;
6442     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6443     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6444     break;
6445   case ARM::BI__builtin_arm_mve_vrshlq_s32:
6446     Param0 = 0;
6447     Param1 = 1;
6448     Param2 = 0;
6449     Param3 = Intrinsic::arm_mve_vshl_vector;
6450     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6451     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6452     break;
6453   case ARM::BI__builtin_arm_mve_vrshlq_s8:
6454     Param0 = 0;
6455     Param1 = 1;
6456     Param2 = 0;
6457     Param3 = Intrinsic::arm_mve_vshl_vector;
6458     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6459     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
6460     break;
6461   case ARM::BI__builtin_arm_mve_vrshlq_u16:
6462     Param0 = 0;
6463     Param1 = 1;
6464     Param2 = 1;
6465     Param3 = Intrinsic::arm_mve_vshl_vector;
6466     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6467     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6468     break;
6469   case ARM::BI__builtin_arm_mve_vrshlq_u32:
6470     Param0 = 0;
6471     Param1 = 1;
6472     Param2 = 1;
6473     Param3 = Intrinsic::arm_mve_vshl_vector;
6474     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6475     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6476     break;
6477   case ARM::BI__builtin_arm_mve_vrshlq_u8:
6478     Param0 = 0;
6479     Param1 = 1;
6480     Param2 = 1;
6481     Param3 = Intrinsic::arm_mve_vshl_vector;
6482     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6483     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
6484     break;
6485   case ARM::BI__builtin_arm_mve_vshlq_s16:
6486     Param0 = 0;
6487     Param1 = 0;
6488     Param2 = 0;
6489     Param3 = Intrinsic::arm_mve_vshl_vector;
6490     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6491     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6492     break;
6493   case ARM::BI__builtin_arm_mve_vshlq_s32:
6494     Param0 = 0;
6495     Param1 = 0;
6496     Param2 = 0;
6497     Param3 = Intrinsic::arm_mve_vshl_vector;
6498     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6499     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6500     break;
6501   case ARM::BI__builtin_arm_mve_vshlq_s8:
6502     Param0 = 0;
6503     Param1 = 0;
6504     Param2 = 0;
6505     Param3 = Intrinsic::arm_mve_vshl_vector;
6506     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6507     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
6508     break;
6509   case ARM::BI__builtin_arm_mve_vshlq_u16:
6510     Param0 = 0;
6511     Param1 = 0;
6512     Param2 = 1;
6513     Param3 = Intrinsic::arm_mve_vshl_vector;
6514     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6515     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6516     break;
6517   case ARM::BI__builtin_arm_mve_vshlq_u32:
6518     Param0 = 0;
6519     Param1 = 0;
6520     Param2 = 1;
6521     Param3 = Intrinsic::arm_mve_vshl_vector;
6522     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6523     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6524     break;
6525   case ARM::BI__builtin_arm_mve_vshlq_u8:
6526     Param0 = 0;
6527     Param1 = 0;
6528     Param2 = 1;
6529     Param3 = Intrinsic::arm_mve_vshl_vector;
6530     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6531     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
6532     break;
6533   }
6534   Value *Val0 = EmitScalarExpr(E->getArg(0));
6535   Value *Val1 = EmitScalarExpr(E->getArg(1));
6536   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
6537   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
6538   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
6539   return Builder.CreateCall(CGM.getIntrinsic(Param3, {Param4, Param5}), {Val0, Val1, Val2, Val3, Val4});
6540 }
6541 case ARM::BI__builtin_arm_mve_vmullbq_int_s16:
6542 case ARM::BI__builtin_arm_mve_vmullbq_int_s32:
6543 case ARM::BI__builtin_arm_mve_vmullbq_int_s8:
6544 case ARM::BI__builtin_arm_mve_vmullbq_int_u16:
6545 case ARM::BI__builtin_arm_mve_vmullbq_int_u32:
6546 case ARM::BI__builtin_arm_mve_vmullbq_int_u8:
6547 case ARM::BI__builtin_arm_mve_vmulltq_int_s16:
6548 case ARM::BI__builtin_arm_mve_vmulltq_int_s32:
6549 case ARM::BI__builtin_arm_mve_vmulltq_int_s8:
6550 case ARM::BI__builtin_arm_mve_vmulltq_int_u16:
6551 case ARM::BI__builtin_arm_mve_vmulltq_int_u32:
6552 case ARM::BI__builtin_arm_mve_vmulltq_int_u8:
6553 case ARM::BI__builtin_arm_mve_vshllbq_n_s16:
6554 case ARM::BI__builtin_arm_mve_vshllbq_n_s8:
6555 case ARM::BI__builtin_arm_mve_vshllbq_n_u16:
6556 case ARM::BI__builtin_arm_mve_vshllbq_n_u8:
6557 case ARM::BI__builtin_arm_mve_vshlltq_n_s16:
6558 case ARM::BI__builtin_arm_mve_vshlltq_n_s8:
6559 case ARM::BI__builtin_arm_mve_vshlltq_n_u16:
6560 case ARM::BI__builtin_arm_mve_vshlltq_n_u8: {
6561   uint32_t  Param0;
6562   uint32_t  Param1;
6563   Intrinsic::ID  Param2;
6564   llvm::Type * Param3;
6565   llvm::Type * Param4;
6566   switch (BuiltinID) {
6567   case ARM::BI__builtin_arm_mve_vmullbq_int_s16:
6568     Param0 = 0;
6569     Param1 = 0;
6570     Param2 = Intrinsic::arm_mve_vmull;
6571     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6572     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6573     break;
6574   case ARM::BI__builtin_arm_mve_vmullbq_int_s32:
6575     Param0 = 0;
6576     Param1 = 0;
6577     Param2 = Intrinsic::arm_mve_vmull;
6578     Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
6579     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6580     break;
6581   case ARM::BI__builtin_arm_mve_vmullbq_int_s8:
6582     Param0 = 0;
6583     Param1 = 0;
6584     Param2 = Intrinsic::arm_mve_vmull;
6585     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6586     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6587     break;
6588   case ARM::BI__builtin_arm_mve_vmullbq_int_u16:
6589     Param0 = 1;
6590     Param1 = 0;
6591     Param2 = Intrinsic::arm_mve_vmull;
6592     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6593     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6594     break;
6595   case ARM::BI__builtin_arm_mve_vmullbq_int_u32:
6596     Param0 = 1;
6597     Param1 = 0;
6598     Param2 = Intrinsic::arm_mve_vmull;
6599     Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
6600     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6601     break;
6602   case ARM::BI__builtin_arm_mve_vmullbq_int_u8:
6603     Param0 = 1;
6604     Param1 = 0;
6605     Param2 = Intrinsic::arm_mve_vmull;
6606     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6607     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6608     break;
6609   case ARM::BI__builtin_arm_mve_vmulltq_int_s16:
6610     Param0 = 0;
6611     Param1 = 1;
6612     Param2 = Intrinsic::arm_mve_vmull;
6613     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6614     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6615     break;
6616   case ARM::BI__builtin_arm_mve_vmulltq_int_s32:
6617     Param0 = 0;
6618     Param1 = 1;
6619     Param2 = Intrinsic::arm_mve_vmull;
6620     Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
6621     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6622     break;
6623   case ARM::BI__builtin_arm_mve_vmulltq_int_s8:
6624     Param0 = 0;
6625     Param1 = 1;
6626     Param2 = Intrinsic::arm_mve_vmull;
6627     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6628     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6629     break;
6630   case ARM::BI__builtin_arm_mve_vmulltq_int_u16:
6631     Param0 = 1;
6632     Param1 = 1;
6633     Param2 = Intrinsic::arm_mve_vmull;
6634     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6635     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6636     break;
6637   case ARM::BI__builtin_arm_mve_vmulltq_int_u32:
6638     Param0 = 1;
6639     Param1 = 1;
6640     Param2 = Intrinsic::arm_mve_vmull;
6641     Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
6642     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6643     break;
6644   case ARM::BI__builtin_arm_mve_vmulltq_int_u8:
6645     Param0 = 1;
6646     Param1 = 1;
6647     Param2 = Intrinsic::arm_mve_vmull;
6648     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6649     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6650     break;
6651   case ARM::BI__builtin_arm_mve_vshllbq_n_s16:
6652     Param0 = 0;
6653     Param1 = 0;
6654     Param2 = Intrinsic::arm_mve_vshll_imm;
6655     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6656     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6657     break;
6658   case ARM::BI__builtin_arm_mve_vshllbq_n_s8:
6659     Param0 = 0;
6660     Param1 = 0;
6661     Param2 = Intrinsic::arm_mve_vshll_imm;
6662     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6663     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6664     break;
6665   case ARM::BI__builtin_arm_mve_vshllbq_n_u16:
6666     Param0 = 1;
6667     Param1 = 0;
6668     Param2 = Intrinsic::arm_mve_vshll_imm;
6669     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6670     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6671     break;
6672   case ARM::BI__builtin_arm_mve_vshllbq_n_u8:
6673     Param0 = 1;
6674     Param1 = 0;
6675     Param2 = Intrinsic::arm_mve_vshll_imm;
6676     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6677     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6678     break;
6679   case ARM::BI__builtin_arm_mve_vshlltq_n_s16:
6680     Param0 = 0;
6681     Param1 = 1;
6682     Param2 = Intrinsic::arm_mve_vshll_imm;
6683     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6684     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6685     break;
6686   case ARM::BI__builtin_arm_mve_vshlltq_n_s8:
6687     Param0 = 0;
6688     Param1 = 1;
6689     Param2 = Intrinsic::arm_mve_vshll_imm;
6690     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6691     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6692     break;
6693   case ARM::BI__builtin_arm_mve_vshlltq_n_u16:
6694     Param0 = 1;
6695     Param1 = 1;
6696     Param2 = Intrinsic::arm_mve_vshll_imm;
6697     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6698     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6699     break;
6700   case ARM::BI__builtin_arm_mve_vshlltq_n_u8:
6701     Param0 = 1;
6702     Param1 = 1;
6703     Param2 = Intrinsic::arm_mve_vshll_imm;
6704     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6705     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6706     break;
6707   }
6708   Value *Val0 = EmitScalarExpr(E->getArg(0));
6709   Value *Val1 = EmitScalarExpr(E->getArg(1));
6710   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
6711   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
6712   return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param4}), {Val0, Val1, Val2, Val3});
6713 }
6714 case ARM::BI__builtin_arm_mve_vcvtbq_f16_f32:
6715 case ARM::BI__builtin_arm_mve_vcvttq_f16_f32: {
6716   uint32_t  Param0;
6717   switch (BuiltinID) {
6718   case ARM::BI__builtin_arm_mve_vcvtbq_f16_f32:
6719     Param0 = 0;
6720     break;
6721   case ARM::BI__builtin_arm_mve_vcvttq_f16_f32:
6722     Param0 = 1;
6723     break;
6724   }
6725   Value *Val0 = EmitScalarExpr(E->getArg(0));
6726   Value *Val1 = EmitScalarExpr(E->getArg(1));
6727   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
6728   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_narrow), {Val0, Val1, Val2});
6729 }
6730 case ARM::BI__builtin_arm_mve_vmullbq_poly_p16:
6731 case ARM::BI__builtin_arm_mve_vmullbq_poly_p8:
6732 case ARM::BI__builtin_arm_mve_vmulltq_poly_p16:
6733 case ARM::BI__builtin_arm_mve_vmulltq_poly_p8:
6734 case ARM::BI__builtin_arm_mve_vqdmullbq_s16:
6735 case ARM::BI__builtin_arm_mve_vqdmullbq_s32:
6736 case ARM::BI__builtin_arm_mve_vqdmulltq_s16:
6737 case ARM::BI__builtin_arm_mve_vqdmulltq_s32: {
6738   uint32_t  Param0;
6739   Intrinsic::ID  Param1;
6740   llvm::Type * Param2;
6741   llvm::Type * Param3;
6742   switch (BuiltinID) {
6743   case ARM::BI__builtin_arm_mve_vmullbq_poly_p16:
6744     Param0 = 0;
6745     Param1 = Intrinsic::arm_mve_vmull_poly;
6746     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6747     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6748     break;
6749   case ARM::BI__builtin_arm_mve_vmullbq_poly_p8:
6750     Param0 = 0;
6751     Param1 = Intrinsic::arm_mve_vmull_poly;
6752     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6753     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6754     break;
6755   case ARM::BI__builtin_arm_mve_vmulltq_poly_p16:
6756     Param0 = 1;
6757     Param1 = Intrinsic::arm_mve_vmull_poly;
6758     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6759     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6760     break;
6761   case ARM::BI__builtin_arm_mve_vmulltq_poly_p8:
6762     Param0 = 1;
6763     Param1 = Intrinsic::arm_mve_vmull_poly;
6764     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6765     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6766     break;
6767   case ARM::BI__builtin_arm_mve_vqdmullbq_s16:
6768     Param0 = 0;
6769     Param1 = Intrinsic::arm_mve_vqdmull;
6770     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6771     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6772     break;
6773   case ARM::BI__builtin_arm_mve_vqdmullbq_s32:
6774     Param0 = 0;
6775     Param1 = Intrinsic::arm_mve_vqdmull;
6776     Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
6777     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6778     break;
6779   case ARM::BI__builtin_arm_mve_vqdmulltq_s16:
6780     Param0 = 1;
6781     Param1 = Intrinsic::arm_mve_vqdmull;
6782     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6783     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6784     break;
6785   case ARM::BI__builtin_arm_mve_vqdmulltq_s32:
6786     Param0 = 1;
6787     Param1 = Intrinsic::arm_mve_vqdmull;
6788     Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
6789     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6790     break;
6791   }
6792   Value *Val0 = EmitScalarExpr(E->getArg(0));
6793   Value *Val1 = EmitScalarExpr(E->getArg(1));
6794   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
6795   return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param3}), {Val0, Val1, Val2});
6796 }
6797 case ARM::BI__builtin_arm_mve_vabdq_f16:
6798 case ARM::BI__builtin_arm_mve_vabdq_f32:
6799 case ARM::BI__builtin_arm_mve_vabdq_s16:
6800 case ARM::BI__builtin_arm_mve_vabdq_s32:
6801 case ARM::BI__builtin_arm_mve_vabdq_s8:
6802 case ARM::BI__builtin_arm_mve_vabdq_u16:
6803 case ARM::BI__builtin_arm_mve_vabdq_u32:
6804 case ARM::BI__builtin_arm_mve_vabdq_u8:
6805 case ARM::BI__builtin_arm_mve_vhaddq_s16:
6806 case ARM::BI__builtin_arm_mve_vhaddq_s32:
6807 case ARM::BI__builtin_arm_mve_vhaddq_s8:
6808 case ARM::BI__builtin_arm_mve_vhaddq_u16:
6809 case ARM::BI__builtin_arm_mve_vhaddq_u32:
6810 case ARM::BI__builtin_arm_mve_vhaddq_u8:
6811 case ARM::BI__builtin_arm_mve_vhsubq_s16:
6812 case ARM::BI__builtin_arm_mve_vhsubq_s32:
6813 case ARM::BI__builtin_arm_mve_vhsubq_s8:
6814 case ARM::BI__builtin_arm_mve_vhsubq_u16:
6815 case ARM::BI__builtin_arm_mve_vhsubq_u32:
6816 case ARM::BI__builtin_arm_mve_vhsubq_u8:
6817 case ARM::BI__builtin_arm_mve_vmulhq_s16:
6818 case ARM::BI__builtin_arm_mve_vmulhq_s32:
6819 case ARM::BI__builtin_arm_mve_vmulhq_s8:
6820 case ARM::BI__builtin_arm_mve_vmulhq_u16:
6821 case ARM::BI__builtin_arm_mve_vmulhq_u32:
6822 case ARM::BI__builtin_arm_mve_vmulhq_u8:
6823 case ARM::BI__builtin_arm_mve_vqshlq_n_s16:
6824 case ARM::BI__builtin_arm_mve_vqshlq_n_s32:
6825 case ARM::BI__builtin_arm_mve_vqshlq_n_s8:
6826 case ARM::BI__builtin_arm_mve_vqshlq_n_u16:
6827 case ARM::BI__builtin_arm_mve_vqshlq_n_u32:
6828 case ARM::BI__builtin_arm_mve_vqshlq_n_u8:
6829 case ARM::BI__builtin_arm_mve_vrhaddq_s16:
6830 case ARM::BI__builtin_arm_mve_vrhaddq_s32:
6831 case ARM::BI__builtin_arm_mve_vrhaddq_s8:
6832 case ARM::BI__builtin_arm_mve_vrhaddq_u16:
6833 case ARM::BI__builtin_arm_mve_vrhaddq_u32:
6834 case ARM::BI__builtin_arm_mve_vrhaddq_u8:
6835 case ARM::BI__builtin_arm_mve_vrmulhq_s16:
6836 case ARM::BI__builtin_arm_mve_vrmulhq_s32:
6837 case ARM::BI__builtin_arm_mve_vrmulhq_s8:
6838 case ARM::BI__builtin_arm_mve_vrmulhq_u16:
6839 case ARM::BI__builtin_arm_mve_vrmulhq_u32:
6840 case ARM::BI__builtin_arm_mve_vrmulhq_u8:
6841 case ARM::BI__builtin_arm_mve_vrshrq_n_s16:
6842 case ARM::BI__builtin_arm_mve_vrshrq_n_s32:
6843 case ARM::BI__builtin_arm_mve_vrshrq_n_s8:
6844 case ARM::BI__builtin_arm_mve_vrshrq_n_u16:
6845 case ARM::BI__builtin_arm_mve_vrshrq_n_u32:
6846 case ARM::BI__builtin_arm_mve_vrshrq_n_u8: {
6847   uint32_t  Param0;
6848   Intrinsic::ID  Param1;
6849   llvm::Type * Param2;
6850   switch (BuiltinID) {
6851   case ARM::BI__builtin_arm_mve_vabdq_f16:
6852     Param0 = 0;
6853     Param1 = Intrinsic::arm_mve_vabd;
6854     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
6855     break;
6856   case ARM::BI__builtin_arm_mve_vabdq_f32:
6857     Param0 = 0;
6858     Param1 = Intrinsic::arm_mve_vabd;
6859     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
6860     break;
6861   case ARM::BI__builtin_arm_mve_vabdq_s16:
6862     Param0 = 0;
6863     Param1 = Intrinsic::arm_mve_vabd;
6864     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6865     break;
6866   case ARM::BI__builtin_arm_mve_vabdq_s32:
6867     Param0 = 0;
6868     Param1 = Intrinsic::arm_mve_vabd;
6869     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6870     break;
6871   case ARM::BI__builtin_arm_mve_vabdq_s8:
6872     Param0 = 0;
6873     Param1 = Intrinsic::arm_mve_vabd;
6874     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
6875     break;
6876   case ARM::BI__builtin_arm_mve_vabdq_u16:
6877     Param0 = 1;
6878     Param1 = Intrinsic::arm_mve_vabd;
6879     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6880     break;
6881   case ARM::BI__builtin_arm_mve_vabdq_u32:
6882     Param0 = 1;
6883     Param1 = Intrinsic::arm_mve_vabd;
6884     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6885     break;
6886   case ARM::BI__builtin_arm_mve_vabdq_u8:
6887     Param0 = 1;
6888     Param1 = Intrinsic::arm_mve_vabd;
6889     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
6890     break;
6891   case ARM::BI__builtin_arm_mve_vhaddq_s16:
6892     Param0 = 0;
6893     Param1 = Intrinsic::arm_mve_vhadd;
6894     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6895     break;
6896   case ARM::BI__builtin_arm_mve_vhaddq_s32:
6897     Param0 = 0;
6898     Param1 = Intrinsic::arm_mve_vhadd;
6899     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6900     break;
6901   case ARM::BI__builtin_arm_mve_vhaddq_s8:
6902     Param0 = 0;
6903     Param1 = Intrinsic::arm_mve_vhadd;
6904     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
6905     break;
6906   case ARM::BI__builtin_arm_mve_vhaddq_u16:
6907     Param0 = 1;
6908     Param1 = Intrinsic::arm_mve_vhadd;
6909     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6910     break;
6911   case ARM::BI__builtin_arm_mve_vhaddq_u32:
6912     Param0 = 1;
6913     Param1 = Intrinsic::arm_mve_vhadd;
6914     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6915     break;
6916   case ARM::BI__builtin_arm_mve_vhaddq_u8:
6917     Param0 = 1;
6918     Param1 = Intrinsic::arm_mve_vhadd;
6919     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
6920     break;
6921   case ARM::BI__builtin_arm_mve_vhsubq_s16:
6922     Param0 = 0;
6923     Param1 = Intrinsic::arm_mve_vhsub;
6924     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6925     break;
6926   case ARM::BI__builtin_arm_mve_vhsubq_s32:
6927     Param0 = 0;
6928     Param1 = Intrinsic::arm_mve_vhsub;
6929     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6930     break;
6931   case ARM::BI__builtin_arm_mve_vhsubq_s8:
6932     Param0 = 0;
6933     Param1 = Intrinsic::arm_mve_vhsub;
6934     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
6935     break;
6936   case ARM::BI__builtin_arm_mve_vhsubq_u16:
6937     Param0 = 1;
6938     Param1 = Intrinsic::arm_mve_vhsub;
6939     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6940     break;
6941   case ARM::BI__builtin_arm_mve_vhsubq_u32:
6942     Param0 = 1;
6943     Param1 = Intrinsic::arm_mve_vhsub;
6944     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6945     break;
6946   case ARM::BI__builtin_arm_mve_vhsubq_u8:
6947     Param0 = 1;
6948     Param1 = Intrinsic::arm_mve_vhsub;
6949     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
6950     break;
6951   case ARM::BI__builtin_arm_mve_vmulhq_s16:
6952     Param0 = 0;
6953     Param1 = Intrinsic::arm_mve_vmulh;
6954     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6955     break;
6956   case ARM::BI__builtin_arm_mve_vmulhq_s32:
6957     Param0 = 0;
6958     Param1 = Intrinsic::arm_mve_vmulh;
6959     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6960     break;
6961   case ARM::BI__builtin_arm_mve_vmulhq_s8:
6962     Param0 = 0;
6963     Param1 = Intrinsic::arm_mve_vmulh;
6964     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
6965     break;
6966   case ARM::BI__builtin_arm_mve_vmulhq_u16:
6967     Param0 = 1;
6968     Param1 = Intrinsic::arm_mve_vmulh;
6969     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6970     break;
6971   case ARM::BI__builtin_arm_mve_vmulhq_u32:
6972     Param0 = 1;
6973     Param1 = Intrinsic::arm_mve_vmulh;
6974     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6975     break;
6976   case ARM::BI__builtin_arm_mve_vmulhq_u8:
6977     Param0 = 1;
6978     Param1 = Intrinsic::arm_mve_vmulh;
6979     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
6980     break;
6981   case ARM::BI__builtin_arm_mve_vqshlq_n_s16:
6982     Param0 = 0;
6983     Param1 = Intrinsic::arm_mve_vqshl_imm;
6984     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6985     break;
6986   case ARM::BI__builtin_arm_mve_vqshlq_n_s32:
6987     Param0 = 0;
6988     Param1 = Intrinsic::arm_mve_vqshl_imm;
6989     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6990     break;
6991   case ARM::BI__builtin_arm_mve_vqshlq_n_s8:
6992     Param0 = 0;
6993     Param1 = Intrinsic::arm_mve_vqshl_imm;
6994     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
6995     break;
6996   case ARM::BI__builtin_arm_mve_vqshlq_n_u16:
6997     Param0 = 1;
6998     Param1 = Intrinsic::arm_mve_vqshl_imm;
6999     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
7000     break;
7001   case ARM::BI__builtin_arm_mve_vqshlq_n_u32:
7002     Param0 = 1;
7003     Param1 = Intrinsic::arm_mve_vqshl_imm;
7004     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7005     break;
7006   case ARM::BI__builtin_arm_mve_vqshlq_n_u8:
7007     Param0 = 1;
7008     Param1 = Intrinsic::arm_mve_vqshl_imm;
7009     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
7010     break;
7011   case ARM::BI__builtin_arm_mve_vrhaddq_s16:
7012     Param0 = 0;
7013     Param1 = Intrinsic::arm_mve_vrhadd;
7014     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
7015     break;
7016   case ARM::BI__builtin_arm_mve_vrhaddq_s32:
7017     Param0 = 0;
7018     Param1 = Intrinsic::arm_mve_vrhadd;
7019     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7020     break;
7021   case ARM::BI__builtin_arm_mve_vrhaddq_s8:
7022     Param0 = 0;
7023     Param1 = Intrinsic::arm_mve_vrhadd;
7024     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
7025     break;
7026   case ARM::BI__builtin_arm_mve_vrhaddq_u16:
7027     Param0 = 1;
7028     Param1 = Intrinsic::arm_mve_vrhadd;
7029     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
7030     break;
7031   case ARM::BI__builtin_arm_mve_vrhaddq_u32:
7032     Param0 = 1;
7033     Param1 = Intrinsic::arm_mve_vrhadd;
7034     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7035     break;
7036   case ARM::BI__builtin_arm_mve_vrhaddq_u8:
7037     Param0 = 1;
7038     Param1 = Intrinsic::arm_mve_vrhadd;
7039     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
7040     break;
7041   case ARM::BI__builtin_arm_mve_vrmulhq_s16:
7042     Param0 = 0;
7043     Param1 = Intrinsic::arm_mve_vrmulh;
7044     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
7045     break;
7046   case ARM::BI__builtin_arm_mve_vrmulhq_s32:
7047     Param0 = 0;
7048     Param1 = Intrinsic::arm_mve_vrmulh;
7049     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7050     break;
7051   case ARM::BI__builtin_arm_mve_vrmulhq_s8:
7052     Param0 = 0;
7053     Param1 = Intrinsic::arm_mve_vrmulh;
7054     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
7055     break;
7056   case ARM::BI__builtin_arm_mve_vrmulhq_u16:
7057     Param0 = 1;
7058     Param1 = Intrinsic::arm_mve_vrmulh;
7059     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
7060     break;
7061   case ARM::BI__builtin_arm_mve_vrmulhq_u32:
7062     Param0 = 1;
7063     Param1 = Intrinsic::arm_mve_vrmulh;
7064     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7065     break;
7066   case ARM::BI__builtin_arm_mve_vrmulhq_u8:
7067     Param0 = 1;
7068     Param1 = Intrinsic::arm_mve_vrmulh;
7069     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
7070     break;
7071   case ARM::BI__builtin_arm_mve_vrshrq_n_s16:
7072     Param0 = 0;
7073     Param1 = Intrinsic::arm_mve_vrshr_imm;
7074     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
7075     break;
7076   case ARM::BI__builtin_arm_mve_vrshrq_n_s32:
7077     Param0 = 0;
7078     Param1 = Intrinsic::arm_mve_vrshr_imm;
7079     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7080     break;
7081   case ARM::BI__builtin_arm_mve_vrshrq_n_s8:
7082     Param0 = 0;
7083     Param1 = Intrinsic::arm_mve_vrshr_imm;
7084     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
7085     break;
7086   case ARM::BI__builtin_arm_mve_vrshrq_n_u16:
7087     Param0 = 1;
7088     Param1 = Intrinsic::arm_mve_vrshr_imm;
7089     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
7090     break;
7091   case ARM::BI__builtin_arm_mve_vrshrq_n_u32:
7092     Param0 = 1;
7093     Param1 = Intrinsic::arm_mve_vrshr_imm;
7094     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7095     break;
7096   case ARM::BI__builtin_arm_mve_vrshrq_n_u8:
7097     Param0 = 1;
7098     Param1 = Intrinsic::arm_mve_vrshr_imm;
7099     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
7100     break;
7101   }
7102   Value *Val0 = EmitScalarExpr(E->getArg(0));
7103   Value *Val1 = EmitScalarExpr(E->getArg(1));
7104   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
7105   return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2}), {Val0, Val1, Val2});
7106 }
7107 case ARM::BI__builtin_arm_mve_vaddq_s16:
7108 case ARM::BI__builtin_arm_mve_vaddq_s32:
7109 case ARM::BI__builtin_arm_mve_vaddq_s8:
7110 case ARM::BI__builtin_arm_mve_vaddq_u16:
7111 case ARM::BI__builtin_arm_mve_vaddq_u32:
7112 case ARM::BI__builtin_arm_mve_vaddq_u8: {
7113   Value *Val0 = EmitScalarExpr(E->getArg(0));
7114   Value *Val1 = EmitScalarExpr(E->getArg(1));
7115   return Builder.CreateAdd(Val0, Val1);
7116 }
7117 case ARM::BI__builtin_arm_mve_vandq_s16:
7118 case ARM::BI__builtin_arm_mve_vandq_s32:
7119 case ARM::BI__builtin_arm_mve_vandq_s8:
7120 case ARM::BI__builtin_arm_mve_vandq_u16:
7121 case ARM::BI__builtin_arm_mve_vandq_u32:
7122 case ARM::BI__builtin_arm_mve_vandq_u8: {
7123   Value *Val0 = EmitScalarExpr(E->getArg(0));
7124   Value *Val1 = EmitScalarExpr(E->getArg(1));
7125   return Builder.CreateAnd(Val0, Val1);
7126 }
7127 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_s64:
7128 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_u64:
7129 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_f32:
7130 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_s32:
7131 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_u32: {
7132   llvm::Type * Param0;
7133   llvm::Type * Param1;
7134   switch (BuiltinID) {
7135   case ARM::BI__builtin_arm_mve_vldrdq_gather_base_s64:
7136     Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
7137     Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
7138     break;
7139   case ARM::BI__builtin_arm_mve_vldrdq_gather_base_u64:
7140     Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
7141     Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
7142     break;
7143   case ARM::BI__builtin_arm_mve_vldrwq_gather_base_f32:
7144     Param0 = llvm::FixedVectorType::get(FloatTy, 4);
7145     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7146     break;
7147   case ARM::BI__builtin_arm_mve_vldrwq_gather_base_s32:
7148     Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
7149     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7150     break;
7151   case ARM::BI__builtin_arm_mve_vldrwq_gather_base_u32:
7152     Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
7153     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7154     break;
7155   }
7156   Value *Val0 = EmitScalarExpr(E->getArg(0));
7157   Value *Val1 = EmitScalarExpr(E->getArg(1));
7158   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vldr_gather_base, {Param0, Param1}), {Val0, Val1});
7159 }
7160 case ARM::BI__builtin_arm_mve_sqrshr:
7161 case ARM::BI__builtin_arm_mve_sqshl:
7162 case ARM::BI__builtin_arm_mve_srshr:
7163 case ARM::BI__builtin_arm_mve_uqrshl:
7164 case ARM::BI__builtin_arm_mve_uqshl:
7165 case ARM::BI__builtin_arm_mve_urshr: {
7166   Intrinsic::ID  Param0;
7167   switch (BuiltinID) {
7168   case ARM::BI__builtin_arm_mve_sqrshr:
7169     Param0 = Intrinsic::arm_mve_sqrshr;
7170     break;
7171   case ARM::BI__builtin_arm_mve_sqshl:
7172     Param0 = Intrinsic::arm_mve_sqshl;
7173     break;
7174   case ARM::BI__builtin_arm_mve_srshr:
7175     Param0 = Intrinsic::arm_mve_srshr;
7176     break;
7177   case ARM::BI__builtin_arm_mve_uqrshl:
7178     Param0 = Intrinsic::arm_mve_uqrshl;
7179     break;
7180   case ARM::BI__builtin_arm_mve_uqshl:
7181     Param0 = Intrinsic::arm_mve_uqshl;
7182     break;
7183   case ARM::BI__builtin_arm_mve_urshr:
7184     Param0 = Intrinsic::arm_mve_urshr;
7185     break;
7186   }
7187   Value *Val0 = EmitScalarExpr(E->getArg(0));
7188   Value *Val1 = EmitScalarExpr(E->getArg(1));
7189   return Builder.CreateCall(CGM.getIntrinsic(Param0), {Val0, Val1});
7190 }
7191 case ARM::BI__builtin_arm_mve_vbrsrq_n_f16:
7192 case ARM::BI__builtin_arm_mve_vbrsrq_n_f32:
7193 case ARM::BI__builtin_arm_mve_vbrsrq_n_s16:
7194 case ARM::BI__builtin_arm_mve_vbrsrq_n_s32:
7195 case ARM::BI__builtin_arm_mve_vbrsrq_n_s8:
7196 case ARM::BI__builtin_arm_mve_vbrsrq_n_u16:
7197 case ARM::BI__builtin_arm_mve_vbrsrq_n_u32:
7198 case ARM::BI__builtin_arm_mve_vbrsrq_n_u8:
7199 case ARM::BI__builtin_arm_mve_vmaxnmq_f16:
7200 case ARM::BI__builtin_arm_mve_vmaxnmq_f32:
7201 case ARM::BI__builtin_arm_mve_vminnmq_f16:
7202 case ARM::BI__builtin_arm_mve_vminnmq_f32:
7203 case ARM::BI__builtin_arm_mve_vqaddq_s16:
7204 case ARM::BI__builtin_arm_mve_vqaddq_s32:
7205 case ARM::BI__builtin_arm_mve_vqaddq_s8:
7206 case ARM::BI__builtin_arm_mve_vqaddq_u16:
7207 case ARM::BI__builtin_arm_mve_vqaddq_u32:
7208 case ARM::BI__builtin_arm_mve_vqaddq_u8:
7209 case ARM::BI__builtin_arm_mve_vqdmulhq_s16:
7210 case ARM::BI__builtin_arm_mve_vqdmulhq_s32:
7211 case ARM::BI__builtin_arm_mve_vqdmulhq_s8:
7212 case ARM::BI__builtin_arm_mve_vqrdmulhq_s16:
7213 case ARM::BI__builtin_arm_mve_vqrdmulhq_s32:
7214 case ARM::BI__builtin_arm_mve_vqrdmulhq_s8:
7215 case ARM::BI__builtin_arm_mve_vqshluq_n_s16:
7216 case ARM::BI__builtin_arm_mve_vqshluq_n_s32:
7217 case ARM::BI__builtin_arm_mve_vqshluq_n_s8:
7218 case ARM::BI__builtin_arm_mve_vqsubq_s16:
7219 case ARM::BI__builtin_arm_mve_vqsubq_s32:
7220 case ARM::BI__builtin_arm_mve_vqsubq_s8:
7221 case ARM::BI__builtin_arm_mve_vqsubq_u16:
7222 case ARM::BI__builtin_arm_mve_vqsubq_u32:
7223 case ARM::BI__builtin_arm_mve_vqsubq_u8: {
7224   Intrinsic::ID  Param0;
7225   llvm::Type * Param1;
7226   switch (BuiltinID) {
7227   case ARM::BI__builtin_arm_mve_vbrsrq_n_f16:
7228     Param0 = Intrinsic::arm_mve_vbrsr;
7229     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
7230     break;
7231   case ARM::BI__builtin_arm_mve_vbrsrq_n_f32:
7232     Param0 = Intrinsic::arm_mve_vbrsr;
7233     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
7234     break;
7235   case ARM::BI__builtin_arm_mve_vbrsrq_n_s16:
7236     Param0 = Intrinsic::arm_mve_vbrsr;
7237     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
7238     break;
7239   case ARM::BI__builtin_arm_mve_vbrsrq_n_s32:
7240     Param0 = Intrinsic::arm_mve_vbrsr;
7241     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7242     break;
7243   case ARM::BI__builtin_arm_mve_vbrsrq_n_s8:
7244     Param0 = Intrinsic::arm_mve_vbrsr;
7245     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
7246     break;
7247   case ARM::BI__builtin_arm_mve_vbrsrq_n_u16:
7248     Param0 = Intrinsic::arm_mve_vbrsr;
7249     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
7250     break;
7251   case ARM::BI__builtin_arm_mve_vbrsrq_n_u32:
7252     Param0 = Intrinsic::arm_mve_vbrsr;
7253     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7254     break;
7255   case ARM::BI__builtin_arm_mve_vbrsrq_n_u8:
7256     Param0 = Intrinsic::arm_mve_vbrsr;
7257     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
7258     break;
7259   case ARM::BI__builtin_arm_mve_vmaxnmq_f16:
7260     Param0 = Intrinsic::maxnum;
7261     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
7262     break;
7263   case ARM::BI__builtin_arm_mve_vmaxnmq_f32:
7264     Param0 = Intrinsic::maxnum;
7265     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
7266     break;
7267   case ARM::BI__builtin_arm_mve_vminnmq_f16:
7268     Param0 = Intrinsic::minnum;
7269     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
7270     break;
7271   case ARM::BI__builtin_arm_mve_vminnmq_f32:
7272     Param0 = Intrinsic::minnum;
7273     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
7274     break;
7275   case ARM::BI__builtin_arm_mve_vqaddq_s16:
7276     Param0 = Intrinsic::sadd_sat;
7277     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
7278     break;
7279   case ARM::BI__builtin_arm_mve_vqaddq_s32:
7280     Param0 = Intrinsic::sadd_sat;
7281     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7282     break;
7283   case ARM::BI__builtin_arm_mve_vqaddq_s8:
7284     Param0 = Intrinsic::sadd_sat;
7285     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
7286     break;
7287   case ARM::BI__builtin_arm_mve_vqaddq_u16:
7288     Param0 = Intrinsic::uadd_sat;
7289     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
7290     break;
7291   case ARM::BI__builtin_arm_mve_vqaddq_u32:
7292     Param0 = Intrinsic::uadd_sat;
7293     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7294     break;
7295   case ARM::BI__builtin_arm_mve_vqaddq_u8:
7296     Param0 = Intrinsic::uadd_sat;
7297     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
7298     break;
7299   case ARM::BI__builtin_arm_mve_vqdmulhq_s16:
7300     Param0 = Intrinsic::arm_mve_vqdmulh;
7301     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
7302     break;
7303   case ARM::BI__builtin_arm_mve_vqdmulhq_s32:
7304     Param0 = Intrinsic::arm_mve_vqdmulh;
7305     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7306     break;
7307   case ARM::BI__builtin_arm_mve_vqdmulhq_s8:
7308     Param0 = Intrinsic::arm_mve_vqdmulh;
7309     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
7310     break;
7311   case ARM::BI__builtin_arm_mve_vqrdmulhq_s16:
7312     Param0 = Intrinsic::arm_mve_vqrdmulh;
7313     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
7314     break;
7315   case ARM::BI__builtin_arm_mve_vqrdmulhq_s32:
7316     Param0 = Intrinsic::arm_mve_vqrdmulh;
7317     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7318     break;
7319   case ARM::BI__builtin_arm_mve_vqrdmulhq_s8:
7320     Param0 = Intrinsic::arm_mve_vqrdmulh;
7321     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
7322     break;
7323   case ARM::BI__builtin_arm_mve_vqshluq_n_s16:
7324     Param0 = Intrinsic::arm_mve_vqshlu_imm;
7325     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
7326     break;
7327   case ARM::BI__builtin_arm_mve_vqshluq_n_s32:
7328     Param0 = Intrinsic::arm_mve_vqshlu_imm;
7329     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7330     break;
7331   case ARM::BI__builtin_arm_mve_vqshluq_n_s8:
7332     Param0 = Intrinsic::arm_mve_vqshlu_imm;
7333     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
7334     break;
7335   case ARM::BI__builtin_arm_mve_vqsubq_s16:
7336     Param0 = Intrinsic::ssub_sat;
7337     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
7338     break;
7339   case ARM::BI__builtin_arm_mve_vqsubq_s32:
7340     Param0 = Intrinsic::ssub_sat;
7341     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7342     break;
7343   case ARM::BI__builtin_arm_mve_vqsubq_s8:
7344     Param0 = Intrinsic::ssub_sat;
7345     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
7346     break;
7347   case ARM::BI__builtin_arm_mve_vqsubq_u16:
7348     Param0 = Intrinsic::usub_sat;
7349     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
7350     break;
7351   case ARM::BI__builtin_arm_mve_vqsubq_u32:
7352     Param0 = Intrinsic::usub_sat;
7353     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7354     break;
7355   case ARM::BI__builtin_arm_mve_vqsubq_u8:
7356     Param0 = Intrinsic::usub_sat;
7357     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
7358     break;
7359   }
7360   Value *Val0 = EmitScalarExpr(E->getArg(0));
7361   Value *Val1 = EmitScalarExpr(E->getArg(1));
7362   return Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0, Val1});
7363 }
7364 case ARM::BI__builtin_arm_mve_vgetq_lane_f16:
7365 case ARM::BI__builtin_arm_mve_vgetq_lane_f32:
7366 case ARM::BI__builtin_arm_mve_vgetq_lane_s16:
7367 case ARM::BI__builtin_arm_mve_vgetq_lane_s32:
7368 case ARM::BI__builtin_arm_mve_vgetq_lane_s64:
7369 case ARM::BI__builtin_arm_mve_vgetq_lane_s8:
7370 case ARM::BI__builtin_arm_mve_vgetq_lane_u16:
7371 case ARM::BI__builtin_arm_mve_vgetq_lane_u32:
7372 case ARM::BI__builtin_arm_mve_vgetq_lane_u64:
7373 case ARM::BI__builtin_arm_mve_vgetq_lane_u8: {
7374   Value *Val0 = EmitScalarExpr(E->getArg(0));
7375   Value *Val1 = EmitScalarExpr(E->getArg(1));
7376   return Builder.CreateExtractElement(Val0, Val1);
7377 }
7378 case ARM::BI__builtin_arm_mve_vaddq_f16:
7379 case ARM::BI__builtin_arm_mve_vaddq_f32: {
7380   Value *Val0 = EmitScalarExpr(E->getArg(0));
7381   Value *Val1 = EmitScalarExpr(E->getArg(1));
7382   return Builder.CreateFAdd(Val0, Val1);
7383 }
7384 case ARM::BI__builtin_arm_mve_vmulq_f16:
7385 case ARM::BI__builtin_arm_mve_vmulq_f32: {
7386   Value *Val0 = EmitScalarExpr(E->getArg(0));
7387   Value *Val1 = EmitScalarExpr(E->getArg(1));
7388   return Builder.CreateFMul(Val0, Val1);
7389 }
7390 case ARM::BI__builtin_arm_mve_vsubq_f16:
7391 case ARM::BI__builtin_arm_mve_vsubq_f32: {
7392   Value *Val0 = EmitScalarExpr(E->getArg(0));
7393   Value *Val1 = EmitScalarExpr(E->getArg(1));
7394   return Builder.CreateFSub(Val0, Val1);
7395 }
7396 case ARM::BI__builtin_arm_mve_vmulq_s16:
7397 case ARM::BI__builtin_arm_mve_vmulq_s32:
7398 case ARM::BI__builtin_arm_mve_vmulq_s8:
7399 case ARM::BI__builtin_arm_mve_vmulq_u16:
7400 case ARM::BI__builtin_arm_mve_vmulq_u32:
7401 case ARM::BI__builtin_arm_mve_vmulq_u8: {
7402   Value *Val0 = EmitScalarExpr(E->getArg(0));
7403   Value *Val1 = EmitScalarExpr(E->getArg(1));
7404   return Builder.CreateMul(Val0, Val1);
7405 }
7406 case ARM::BI__builtin_arm_mve_vorrq_s16:
7407 case ARM::BI__builtin_arm_mve_vorrq_s32:
7408 case ARM::BI__builtin_arm_mve_vorrq_s8:
7409 case ARM::BI__builtin_arm_mve_vorrq_u16:
7410 case ARM::BI__builtin_arm_mve_vorrq_u32:
7411 case ARM::BI__builtin_arm_mve_vorrq_u8: {
7412   Value *Val0 = EmitScalarExpr(E->getArg(0));
7413   Value *Val1 = EmitScalarExpr(E->getArg(1));
7414   return Builder.CreateOr(Val0, Val1);
7415 }
7416 case ARM::BI__builtin_arm_mve_vsubq_s16:
7417 case ARM::BI__builtin_arm_mve_vsubq_s32:
7418 case ARM::BI__builtin_arm_mve_vsubq_s8:
7419 case ARM::BI__builtin_arm_mve_vsubq_u16:
7420 case ARM::BI__builtin_arm_mve_vsubq_u32:
7421 case ARM::BI__builtin_arm_mve_vsubq_u8: {
7422   Value *Val0 = EmitScalarExpr(E->getArg(0));
7423   Value *Val1 = EmitScalarExpr(E->getArg(1));
7424   return Builder.CreateSub(Val0, Val1);
7425 }
7426 case ARM::BI__builtin_arm_mve_veorq_s16:
7427 case ARM::BI__builtin_arm_mve_veorq_s32:
7428 case ARM::BI__builtin_arm_mve_veorq_s8:
7429 case ARM::BI__builtin_arm_mve_veorq_u16:
7430 case ARM::BI__builtin_arm_mve_veorq_u32:
7431 case ARM::BI__builtin_arm_mve_veorq_u8: {
7432   Value *Val0 = EmitScalarExpr(E->getArg(0));
7433   Value *Val1 = EmitScalarExpr(E->getArg(1));
7434   return Builder.CreateXor(Val0, Val1);
7435 }
7436 case ARM::BI__builtin_arm_mve_vmovlbq_s8:
7437 case ARM::BI__builtin_arm_mve_vmovlbq_u8:
7438 case ARM::BI__builtin_arm_mve_vmovltq_s8:
7439 case ARM::BI__builtin_arm_mve_vmovltq_u8: {
7440   bool  Param0;
7441   bool  Param1;
7442   switch (BuiltinID) {
7443   case ARM::BI__builtin_arm_mve_vmovlbq_s8:
7444     Param0 = 0;
7445     Param1 = 0;
7446     break;
7447   case ARM::BI__builtin_arm_mve_vmovlbq_u8:
7448     Param0 = 0;
7449     Param1 = 1;
7450     break;
7451   case ARM::BI__builtin_arm_mve_vmovltq_s8:
7452     Param0 = 1;
7453     Param1 = 0;
7454     break;
7455   case ARM::BI__builtin_arm_mve_vmovltq_u8:
7456     Param0 = 1;
7457     Param1 = 1;
7458     break;
7459   }
7460   Value *Val0 = EmitScalarExpr(E->getArg(0));
7461   Value *Val1 = VectorUnzip(Builder, Val0, static_cast<bool>(Param0));
7462   llvm::Type *Val2 = llvm::FixedVectorType::get(Int16Ty, 8);
7463   return SignOrZeroExtend(Builder, Val1, Val2, static_cast<bool>(Param1));
7464 }
7465 case ARM::BI__builtin_arm_mve_vmovlbq_s16:
7466 case ARM::BI__builtin_arm_mve_vmovlbq_u16:
7467 case ARM::BI__builtin_arm_mve_vmovltq_s16:
7468 case ARM::BI__builtin_arm_mve_vmovltq_u16: {
7469   bool  Param0;
7470   bool  Param1;
7471   switch (BuiltinID) {
7472   case ARM::BI__builtin_arm_mve_vmovlbq_s16:
7473     Param0 = 0;
7474     Param1 = 0;
7475     break;
7476   case ARM::BI__builtin_arm_mve_vmovlbq_u16:
7477     Param0 = 0;
7478     Param1 = 1;
7479     break;
7480   case ARM::BI__builtin_arm_mve_vmovltq_s16:
7481     Param0 = 1;
7482     Param1 = 0;
7483     break;
7484   case ARM::BI__builtin_arm_mve_vmovltq_u16:
7485     Param0 = 1;
7486     Param1 = 1;
7487     break;
7488   }
7489   Value *Val0 = EmitScalarExpr(E->getArg(0));
7490   Value *Val1 = VectorUnzip(Builder, Val0, static_cast<bool>(Param0));
7491   llvm::Type *Val2 = llvm::FixedVectorType::get(Int32Ty, 4);
7492   return SignOrZeroExtend(Builder, Val1, Val2, static_cast<bool>(Param1));
7493 }
7494 case ARM::BI__builtin_arm_mve_vclzq_s16:
7495 case ARM::BI__builtin_arm_mve_vclzq_s32:
7496 case ARM::BI__builtin_arm_mve_vclzq_s8:
7497 case ARM::BI__builtin_arm_mve_vclzq_u16:
7498 case ARM::BI__builtin_arm_mve_vclzq_u32:
7499 case ARM::BI__builtin_arm_mve_vclzq_u8: {
7500   llvm::Type * Param0;
7501   switch (BuiltinID) {
7502   case ARM::BI__builtin_arm_mve_vclzq_s16:
7503     Param0 = llvm::FixedVectorType::get(Int16Ty, 8);
7504     break;
7505   case ARM::BI__builtin_arm_mve_vclzq_s32:
7506     Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
7507     break;
7508   case ARM::BI__builtin_arm_mve_vclzq_s8:
7509     Param0 = llvm::FixedVectorType::get(Int8Ty, 16);
7510     break;
7511   case ARM::BI__builtin_arm_mve_vclzq_u16:
7512     Param0 = llvm::FixedVectorType::get(Int16Ty, 8);
7513     break;
7514   case ARM::BI__builtin_arm_mve_vclzq_u32:
7515     Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
7516     break;
7517   case ARM::BI__builtin_arm_mve_vclzq_u8:
7518     Param0 = llvm::FixedVectorType::get(Int8Ty, 16);
7519     break;
7520   }
7521   Value *Val0 = EmitScalarExpr(E->getArg(0));
7522   Value *Val1 = llvm::ConstantInt::get(Builder.getInt1Ty(), static_cast<bool>(0));
7523   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::ctlz, {Param0}), {Val0, Val1});
7524 }
7525 case ARM::BI__builtin_arm_mve_vpnot: {
7526   Value *Val0 = EmitScalarExpr(E->getArg(0));
7527   Value *Val1 = llvm::ConstantInt::get(Int16Ty, 65535);
7528   return Builder.CreateXor(Val0, Val1);
7529 }
7530 case ARM::BI__builtin_arm_mve_vaddlvq_p_s32:
7531 case ARM::BI__builtin_arm_mve_vaddlvq_p_u32:
7532 case ARM::BI__builtin_arm_mve_vaddvq_p_s16:
7533 case ARM::BI__builtin_arm_mve_vaddvq_p_s32:
7534 case ARM::BI__builtin_arm_mve_vaddvq_p_s8:
7535 case ARM::BI__builtin_arm_mve_vaddvq_p_u16:
7536 case ARM::BI__builtin_arm_mve_vaddvq_p_u32:
7537 case ARM::BI__builtin_arm_mve_vaddvq_p_u8: {
7538   uint32_t  Param0;
7539   llvm::Type * Param1;
7540   Intrinsic::ID  Param2;
7541   llvm::Type * Param3;
7542   switch (BuiltinID) {
7543   case ARM::BI__builtin_arm_mve_vaddlvq_p_s32:
7544     Param0 = 0;
7545     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
7546     Param2 = Intrinsic::arm_mve_addlv_predicated;
7547     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
7548     break;
7549   case ARM::BI__builtin_arm_mve_vaddlvq_p_u32:
7550     Param0 = 1;
7551     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
7552     Param2 = Intrinsic::arm_mve_addlv_predicated;
7553     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
7554     break;
7555   case ARM::BI__builtin_arm_mve_vaddvq_p_s16:
7556     Param0 = 0;
7557     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
7558     Param2 = Intrinsic::arm_mve_addv_predicated;
7559     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
7560     break;
7561   case ARM::BI__builtin_arm_mve_vaddvq_p_s32:
7562     Param0 = 0;
7563     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
7564     Param2 = Intrinsic::arm_mve_addv_predicated;
7565     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
7566     break;
7567   case ARM::BI__builtin_arm_mve_vaddvq_p_s8:
7568     Param0 = 0;
7569     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
7570     Param2 = Intrinsic::arm_mve_addv_predicated;
7571     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
7572     break;
7573   case ARM::BI__builtin_arm_mve_vaddvq_p_u16:
7574     Param0 = 1;
7575     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
7576     Param2 = Intrinsic::arm_mve_addv_predicated;
7577     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
7578     break;
7579   case ARM::BI__builtin_arm_mve_vaddvq_p_u32:
7580     Param0 = 1;
7581     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
7582     Param2 = Intrinsic::arm_mve_addv_predicated;
7583     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
7584     break;
7585   case ARM::BI__builtin_arm_mve_vaddvq_p_u8:
7586     Param0 = 1;
7587     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
7588     Param2 = Intrinsic::arm_mve_addv_predicated;
7589     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
7590     break;
7591   }
7592   Value *Val0 = EmitScalarExpr(E->getArg(0));
7593   Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
7594   Value *Val2 = EmitScalarExpr(E->getArg(1));
7595   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
7596   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val3});
7597   return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param1}), {Val0, Val1, Val4});
7598 }
7599 case ARM::BI__builtin_arm_mve_vcvtbq_f32_f16:
7600 case ARM::BI__builtin_arm_mve_vcvttq_f32_f16: {
7601   uint32_t  Param0;
7602   switch (BuiltinID) {
7603   case ARM::BI__builtin_arm_mve_vcvtbq_f32_f16:
7604     Param0 = 0;
7605     break;
7606   case ARM::BI__builtin_arm_mve_vcvttq_f32_f16:
7607     Param0 = 1;
7608     break;
7609   }
7610   Value *Val0 = EmitScalarExpr(E->getArg(0));
7611   Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
7612   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_widen), {Val0, Val1});
7613 }
7614 case ARM::BI__builtin_arm_mve_vaddlvq_s32:
7615 case ARM::BI__builtin_arm_mve_vaddlvq_u32:
7616 case ARM::BI__builtin_arm_mve_vaddvq_s16:
7617 case ARM::BI__builtin_arm_mve_vaddvq_s32:
7618 case ARM::BI__builtin_arm_mve_vaddvq_s8:
7619 case ARM::BI__builtin_arm_mve_vaddvq_u16:
7620 case ARM::BI__builtin_arm_mve_vaddvq_u32:
7621 case ARM::BI__builtin_arm_mve_vaddvq_u8: {
7622   uint32_t  Param0;
7623   Intrinsic::ID  Param1;
7624   llvm::Type * Param2;
7625   switch (BuiltinID) {
7626   case ARM::BI__builtin_arm_mve_vaddlvq_s32:
7627     Param0 = 0;
7628     Param1 = Intrinsic::arm_mve_addlv;
7629     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7630     break;
7631   case ARM::BI__builtin_arm_mve_vaddlvq_u32:
7632     Param0 = 1;
7633     Param1 = Intrinsic::arm_mve_addlv;
7634     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7635     break;
7636   case ARM::BI__builtin_arm_mve_vaddvq_s16:
7637     Param0 = 0;
7638     Param1 = Intrinsic::arm_mve_addv;
7639     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
7640     break;
7641   case ARM::BI__builtin_arm_mve_vaddvq_s32:
7642     Param0 = 0;
7643     Param1 = Intrinsic::arm_mve_addv;
7644     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7645     break;
7646   case ARM::BI__builtin_arm_mve_vaddvq_s8:
7647     Param0 = 0;
7648     Param1 = Intrinsic::arm_mve_addv;
7649     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
7650     break;
7651   case ARM::BI__builtin_arm_mve_vaddvq_u16:
7652     Param0 = 1;
7653     Param1 = Intrinsic::arm_mve_addv;
7654     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
7655     break;
7656   case ARM::BI__builtin_arm_mve_vaddvq_u32:
7657     Param0 = 1;
7658     Param1 = Intrinsic::arm_mve_addv;
7659     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7660     break;
7661   case ARM::BI__builtin_arm_mve_vaddvq_u8:
7662     Param0 = 1;
7663     Param1 = Intrinsic::arm_mve_addv;
7664     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
7665     break;
7666   }
7667   Value *Val0 = EmitScalarExpr(E->getArg(0));
7668   Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
7669   return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2}), {Val0, Val1});
7670 }
7671 case ARM::BI__builtin_arm_mve_asrl:
7672 case ARM::BI__builtin_arm_mve_lsll:
7673 case ARM::BI__builtin_arm_mve_sqshll:
7674 case ARM::BI__builtin_arm_mve_srshrl:
7675 case ARM::BI__builtin_arm_mve_uqshll:
7676 case ARM::BI__builtin_arm_mve_urshrl: {
7677   Intrinsic::ID  Param0;
7678   switch (BuiltinID) {
7679   case ARM::BI__builtin_arm_mve_asrl:
7680     Param0 = Intrinsic::arm_mve_asrl;
7681     break;
7682   case ARM::BI__builtin_arm_mve_lsll:
7683     Param0 = Intrinsic::arm_mve_lsll;
7684     break;
7685   case ARM::BI__builtin_arm_mve_sqshll:
7686     Param0 = Intrinsic::arm_mve_sqshll;
7687     break;
7688   case ARM::BI__builtin_arm_mve_srshrl:
7689     Param0 = Intrinsic::arm_mve_srshrl;
7690     break;
7691   case ARM::BI__builtin_arm_mve_uqshll:
7692     Param0 = Intrinsic::arm_mve_uqshll;
7693     break;
7694   case ARM::BI__builtin_arm_mve_urshrl:
7695     Param0 = Intrinsic::arm_mve_urshrl;
7696     break;
7697   }
7698   Value *Val0 = EmitScalarExpr(E->getArg(0));
7699   Value *Val1 = llvm::ConstantInt::get(Int64Ty, 32);
7700   Value *Val2 = Builder.CreateLShr(Val0, Val1);
7701   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
7702   Value *Val4 = Builder.CreateIntCast(Val0, Int32Ty, false);
7703   Value *Val5 = EmitScalarExpr(E->getArg(1));
7704   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Param0), {Val4, Val3, Val5});
7705   Value *Val7 = Builder.CreateExtractValue(Val6, static_cast<unsigned>(1));
7706   Value *Val8 = Builder.CreateIntCast(Val7, Int64Ty, false);
7707   Value *Val9 = llvm::ConstantInt::get(Int64Ty, 32);
7708   Value *Val10 = Builder.CreateShl(Val8, Val9);
7709   Value *Val11 = Builder.CreateExtractValue(Val6, static_cast<unsigned>(0));
7710   Value *Val12 = Builder.CreateIntCast(Val11, Int64Ty, false);
7711   return Builder.CreateOr(Val10, Val12);
7712 }
7713 case ARM::BI__builtin_arm_mve_sqrshrl:
7714 case ARM::BI__builtin_arm_mve_sqrshrl_sat48: {
7715   uint32_t  Param0;
7716   switch (BuiltinID) {
7717   case ARM::BI__builtin_arm_mve_sqrshrl:
7718     Param0 = 64;
7719     break;
7720   case ARM::BI__builtin_arm_mve_sqrshrl_sat48:
7721     Param0 = 48;
7722     break;
7723   }
7724   Value *Val0 = EmitScalarExpr(E->getArg(0));
7725   Value *Val1 = llvm::ConstantInt::get(Int64Ty, 32);
7726   Value *Val2 = Builder.CreateLShr(Val0, Val1);
7727   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
7728   Value *Val4 = Builder.CreateIntCast(Val0, Int32Ty, false);
7729   Value *Val5 = EmitScalarExpr(E->getArg(1));
7730   Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param0);
7731   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_sqrshrl), {Val4, Val3, Val5, Val6});
7732   Value *Val8 = Builder.CreateExtractValue(Val7, static_cast<unsigned>(1));
7733   Value *Val9 = Builder.CreateIntCast(Val8, Int64Ty, false);
7734   Value *Val10 = llvm::ConstantInt::get(Int64Ty, 32);
7735   Value *Val11 = Builder.CreateShl(Val9, Val10);
7736   Value *Val12 = Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
7737   Value *Val13 = Builder.CreateIntCast(Val12, Int64Ty, false);
7738   return Builder.CreateOr(Val11, Val13);
7739 }
7740 case ARM::BI__builtin_arm_mve_uqrshll:
7741 case ARM::BI__builtin_arm_mve_uqrshll_sat48: {
7742   uint32_t  Param0;
7743   switch (BuiltinID) {
7744   case ARM::BI__builtin_arm_mve_uqrshll:
7745     Param0 = 64;
7746     break;
7747   case ARM::BI__builtin_arm_mve_uqrshll_sat48:
7748     Param0 = 48;
7749     break;
7750   }
7751   Value *Val0 = EmitScalarExpr(E->getArg(0));
7752   Value *Val1 = llvm::ConstantInt::get(Int64Ty, 32);
7753   Value *Val2 = Builder.CreateLShr(Val0, Val1);
7754   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
7755   Value *Val4 = Builder.CreateIntCast(Val0, Int32Ty, false);
7756   Value *Val5 = EmitScalarExpr(E->getArg(1));
7757   Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param0);
7758   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_uqrshll), {Val4, Val3, Val5, Val6});
7759   Value *Val8 = Builder.CreateExtractValue(Val7, static_cast<unsigned>(1));
7760   Value *Val9 = Builder.CreateIntCast(Val8, Int64Ty, false);
7761   Value *Val10 = llvm::ConstantInt::get(Int64Ty, 32);
7762   Value *Val11 = Builder.CreateShl(Val9, Val10);
7763   Value *Val12 = Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
7764   Value *Val13 = Builder.CreateIntCast(Val12, Int64Ty, false);
7765   return Builder.CreateOr(Val11, Val13);
7766 }
7767 case ARM::BI__builtin_arm_mve_vmlaldavaq_s16:
7768 case ARM::BI__builtin_arm_mve_vmlaldavaq_s32:
7769 case ARM::BI__builtin_arm_mve_vmlaldavaq_u16:
7770 case ARM::BI__builtin_arm_mve_vmlaldavaq_u32:
7771 case ARM::BI__builtin_arm_mve_vmlaldavaxq_s16:
7772 case ARM::BI__builtin_arm_mve_vmlaldavaxq_s32:
7773 case ARM::BI__builtin_arm_mve_vmlsldavaq_s16:
7774 case ARM::BI__builtin_arm_mve_vmlsldavaq_s32:
7775 case ARM::BI__builtin_arm_mve_vmlsldavaxq_s16:
7776 case ARM::BI__builtin_arm_mve_vmlsldavaxq_s32:
7777 case ARM::BI__builtin_arm_mve_vrmlaldavhaq_s32:
7778 case ARM::BI__builtin_arm_mve_vrmlaldavhaq_u32:
7779 case ARM::BI__builtin_arm_mve_vrmlaldavhaxq_s32:
7780 case ARM::BI__builtin_arm_mve_vrmlsldavhaq_s32:
7781 case ARM::BI__builtin_arm_mve_vrmlsldavhaxq_s32: {
7782   uint32_t  Param0;
7783   uint32_t  Param1;
7784   uint32_t  Param2;
7785   Intrinsic::ID  Param3;
7786   llvm::Type * Param4;
7787   switch (BuiltinID) {
7788   case ARM::BI__builtin_arm_mve_vmlaldavaq_s16:
7789     Param0 = 0;
7790     Param1 = 0;
7791     Param2 = 0;
7792     Param3 = Intrinsic::arm_mve_vmlldava;
7793     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
7794     break;
7795   case ARM::BI__builtin_arm_mve_vmlaldavaq_s32:
7796     Param0 = 0;
7797     Param1 = 0;
7798     Param2 = 0;
7799     Param3 = Intrinsic::arm_mve_vmlldava;
7800     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7801     break;
7802   case ARM::BI__builtin_arm_mve_vmlaldavaq_u16:
7803     Param0 = 1;
7804     Param1 = 0;
7805     Param2 = 0;
7806     Param3 = Intrinsic::arm_mve_vmlldava;
7807     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
7808     break;
7809   case ARM::BI__builtin_arm_mve_vmlaldavaq_u32:
7810     Param0 = 1;
7811     Param1 = 0;
7812     Param2 = 0;
7813     Param3 = Intrinsic::arm_mve_vmlldava;
7814     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7815     break;
7816   case ARM::BI__builtin_arm_mve_vmlaldavaxq_s16:
7817     Param0 = 0;
7818     Param1 = 0;
7819     Param2 = 1;
7820     Param3 = Intrinsic::arm_mve_vmlldava;
7821     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
7822     break;
7823   case ARM::BI__builtin_arm_mve_vmlaldavaxq_s32:
7824     Param0 = 0;
7825     Param1 = 0;
7826     Param2 = 1;
7827     Param3 = Intrinsic::arm_mve_vmlldava;
7828     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7829     break;
7830   case ARM::BI__builtin_arm_mve_vmlsldavaq_s16:
7831     Param0 = 0;
7832     Param1 = 1;
7833     Param2 = 0;
7834     Param3 = Intrinsic::arm_mve_vmlldava;
7835     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
7836     break;
7837   case ARM::BI__builtin_arm_mve_vmlsldavaq_s32:
7838     Param0 = 0;
7839     Param1 = 1;
7840     Param2 = 0;
7841     Param3 = Intrinsic::arm_mve_vmlldava;
7842     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7843     break;
7844   case ARM::BI__builtin_arm_mve_vmlsldavaxq_s16:
7845     Param0 = 0;
7846     Param1 = 1;
7847     Param2 = 1;
7848     Param3 = Intrinsic::arm_mve_vmlldava;
7849     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
7850     break;
7851   case ARM::BI__builtin_arm_mve_vmlsldavaxq_s32:
7852     Param0 = 0;
7853     Param1 = 1;
7854     Param2 = 1;
7855     Param3 = Intrinsic::arm_mve_vmlldava;
7856     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7857     break;
7858   case ARM::BI__builtin_arm_mve_vrmlaldavhaq_s32:
7859     Param0 = 0;
7860     Param1 = 0;
7861     Param2 = 0;
7862     Param3 = Intrinsic::arm_mve_vrmlldavha;
7863     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7864     break;
7865   case ARM::BI__builtin_arm_mve_vrmlaldavhaq_u32:
7866     Param0 = 1;
7867     Param1 = 0;
7868     Param2 = 0;
7869     Param3 = Intrinsic::arm_mve_vrmlldavha;
7870     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7871     break;
7872   case ARM::BI__builtin_arm_mve_vrmlaldavhaxq_s32:
7873     Param0 = 0;
7874     Param1 = 0;
7875     Param2 = 1;
7876     Param3 = Intrinsic::arm_mve_vrmlldavha;
7877     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7878     break;
7879   case ARM::BI__builtin_arm_mve_vrmlsldavhaq_s32:
7880     Param0 = 0;
7881     Param1 = 1;
7882     Param2 = 0;
7883     Param3 = Intrinsic::arm_mve_vrmlldavha;
7884     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7885     break;
7886   case ARM::BI__builtin_arm_mve_vrmlsldavhaxq_s32:
7887     Param0 = 0;
7888     Param1 = 1;
7889     Param2 = 1;
7890     Param3 = Intrinsic::arm_mve_vrmlldavha;
7891     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7892     break;
7893   }
7894   Value *Val0 = EmitScalarExpr(E->getArg(0));
7895   Value *Val1 = llvm::ConstantInt::get(Int64Ty, 32);
7896   Value *Val2 = Builder.CreateLShr(Val0, Val1);
7897   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
7898   Value *Val4 = Builder.CreateIntCast(Val0, Int32Ty, false);
7899   Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
7900   Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param1);
7901   Value *Val7 = llvm::ConstantInt::get(Int32Ty, Param2);
7902   Value *Val8 = EmitScalarExpr(E->getArg(1));
7903   Value *Val9 = EmitScalarExpr(E->getArg(2));
7904   Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Param3, {Param4}), {Val5, Val6, Val7, Val4, Val3, Val8, Val9});
7905   Value *Val11 = Builder.CreateExtractValue(Val10, static_cast<unsigned>(1));
7906   Value *Val12 = Builder.CreateIntCast(Val11, Int64Ty, false);
7907   Value *Val13 = llvm::ConstantInt::get(Int64Ty, 32);
7908   Value *Val14 = Builder.CreateShl(Val12, Val13);
7909   Value *Val15 = Builder.CreateExtractValue(Val10, static_cast<unsigned>(0));
7910   Value *Val16 = Builder.CreateIntCast(Val15, Int64Ty, false);
7911   return Builder.CreateOr(Val14, Val16);
7912 }
7913 case ARM::BI__builtin_arm_mve_vmlaldavaq_p_s16:
7914 case ARM::BI__builtin_arm_mve_vmlaldavaq_p_s32:
7915 case ARM::BI__builtin_arm_mve_vmlaldavaq_p_u16:
7916 case ARM::BI__builtin_arm_mve_vmlaldavaq_p_u32:
7917 case ARM::BI__builtin_arm_mve_vmlaldavaxq_p_s16:
7918 case ARM::BI__builtin_arm_mve_vmlaldavaxq_p_s32:
7919 case ARM::BI__builtin_arm_mve_vmlsldavaq_p_s16:
7920 case ARM::BI__builtin_arm_mve_vmlsldavaq_p_s32:
7921 case ARM::BI__builtin_arm_mve_vmlsldavaxq_p_s16:
7922 case ARM::BI__builtin_arm_mve_vmlsldavaxq_p_s32:
7923 case ARM::BI__builtin_arm_mve_vrmlaldavhaq_p_s32:
7924 case ARM::BI__builtin_arm_mve_vrmlaldavhaq_p_u32:
7925 case ARM::BI__builtin_arm_mve_vrmlaldavhaxq_p_s32:
7926 case ARM::BI__builtin_arm_mve_vrmlsldavhaq_p_s32:
7927 case ARM::BI__builtin_arm_mve_vrmlsldavhaxq_p_s32: {
7928   uint32_t  Param0;
7929   uint32_t  Param1;
7930   uint32_t  Param2;
7931   llvm::Type * Param3;
7932   Intrinsic::ID  Param4;
7933   llvm::Type * Param5;
7934   switch (BuiltinID) {
7935   case ARM::BI__builtin_arm_mve_vmlaldavaq_p_s16:
7936     Param0 = 0;
7937     Param1 = 0;
7938     Param2 = 0;
7939     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
7940     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
7941     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
7942     break;
7943   case ARM::BI__builtin_arm_mve_vmlaldavaq_p_s32:
7944     Param0 = 0;
7945     Param1 = 0;
7946     Param2 = 0;
7947     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
7948     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
7949     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
7950     break;
7951   case ARM::BI__builtin_arm_mve_vmlaldavaq_p_u16:
7952     Param0 = 1;
7953     Param1 = 0;
7954     Param2 = 0;
7955     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
7956     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
7957     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
7958     break;
7959   case ARM::BI__builtin_arm_mve_vmlaldavaq_p_u32:
7960     Param0 = 1;
7961     Param1 = 0;
7962     Param2 = 0;
7963     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
7964     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
7965     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
7966     break;
7967   case ARM::BI__builtin_arm_mve_vmlaldavaxq_p_s16:
7968     Param0 = 0;
7969     Param1 = 0;
7970     Param2 = 1;
7971     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
7972     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
7973     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
7974     break;
7975   case ARM::BI__builtin_arm_mve_vmlaldavaxq_p_s32:
7976     Param0 = 0;
7977     Param1 = 0;
7978     Param2 = 1;
7979     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
7980     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
7981     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
7982     break;
7983   case ARM::BI__builtin_arm_mve_vmlsldavaq_p_s16:
7984     Param0 = 0;
7985     Param1 = 1;
7986     Param2 = 0;
7987     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
7988     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
7989     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
7990     break;
7991   case ARM::BI__builtin_arm_mve_vmlsldavaq_p_s32:
7992     Param0 = 0;
7993     Param1 = 1;
7994     Param2 = 0;
7995     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
7996     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
7997     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
7998     break;
7999   case ARM::BI__builtin_arm_mve_vmlsldavaxq_p_s16:
8000     Param0 = 0;
8001     Param1 = 1;
8002     Param2 = 1;
8003     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
8004     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
8005     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
8006     break;
8007   case ARM::BI__builtin_arm_mve_vmlsldavaxq_p_s32:
8008     Param0 = 0;
8009     Param1 = 1;
8010     Param2 = 1;
8011     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8012     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
8013     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
8014     break;
8015   case ARM::BI__builtin_arm_mve_vrmlaldavhaq_p_s32:
8016     Param0 = 0;
8017     Param1 = 0;
8018     Param2 = 0;
8019     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8020     Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
8021     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
8022     break;
8023   case ARM::BI__builtin_arm_mve_vrmlaldavhaq_p_u32:
8024     Param0 = 1;
8025     Param1 = 0;
8026     Param2 = 0;
8027     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8028     Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
8029     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
8030     break;
8031   case ARM::BI__builtin_arm_mve_vrmlaldavhaxq_p_s32:
8032     Param0 = 0;
8033     Param1 = 0;
8034     Param2 = 1;
8035     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8036     Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
8037     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
8038     break;
8039   case ARM::BI__builtin_arm_mve_vrmlsldavhaq_p_s32:
8040     Param0 = 0;
8041     Param1 = 1;
8042     Param2 = 0;
8043     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8044     Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
8045     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
8046     break;
8047   case ARM::BI__builtin_arm_mve_vrmlsldavhaxq_p_s32:
8048     Param0 = 0;
8049     Param1 = 1;
8050     Param2 = 1;
8051     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8052     Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
8053     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
8054     break;
8055   }
8056   Value *Val0 = EmitScalarExpr(E->getArg(0));
8057   Value *Val1 = llvm::ConstantInt::get(Int64Ty, 32);
8058   Value *Val2 = Builder.CreateLShr(Val0, Val1);
8059   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
8060   Value *Val4 = Builder.CreateIntCast(Val0, Int32Ty, false);
8061   Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
8062   Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param1);
8063   Value *Val7 = llvm::ConstantInt::get(Int32Ty, Param2);
8064   Value *Val8 = EmitScalarExpr(E->getArg(1));
8065   Value *Val9 = EmitScalarExpr(E->getArg(2));
8066   Value *Val10 = EmitScalarExpr(E->getArg(3));
8067   Value *Val11 = Builder.CreateIntCast(Val10, Int32Ty, false);
8068   Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val11});
8069   Value *Val13 = Builder.CreateCall(CGM.getIntrinsic(Param4, {Param5, Param3}), {Val5, Val6, Val7, Val4, Val3, Val8, Val9, Val12});
8070   Value *Val14 = Builder.CreateExtractValue(Val13, static_cast<unsigned>(1));
8071   Value *Val15 = Builder.CreateIntCast(Val14, Int64Ty, false);
8072   Value *Val16 = llvm::ConstantInt::get(Int64Ty, 32);
8073   Value *Val17 = Builder.CreateShl(Val15, Val16);
8074   Value *Val18 = Builder.CreateExtractValue(Val13, static_cast<unsigned>(0));
8075   Value *Val19 = Builder.CreateIntCast(Val18, Int64Ty, false);
8076   return Builder.CreateOr(Val17, Val19);
8077 }
8078 case ARM::BI__builtin_arm_mve_vreinterpretq_f32_f16:
8079 case ARM::BI__builtin_arm_mve_vreinterpretq_f32_s16:
8080 case ARM::BI__builtin_arm_mve_vreinterpretq_f32_s32:
8081 case ARM::BI__builtin_arm_mve_vreinterpretq_f32_s64:
8082 case ARM::BI__builtin_arm_mve_vreinterpretq_f32_s8:
8083 case ARM::BI__builtin_arm_mve_vreinterpretq_f32_u16:
8084 case ARM::BI__builtin_arm_mve_vreinterpretq_f32_u32:
8085 case ARM::BI__builtin_arm_mve_vreinterpretq_f32_u64:
8086 case ARM::BI__builtin_arm_mve_vreinterpretq_f32_u8: {
8087   Value *Val0 = EmitScalarExpr(E->getArg(0));
8088   llvm::Type *Val1 = llvm::FixedVectorType::get(FloatTy, 4);
8089   return ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
8090 }
8091 case ARM::BI__builtin_arm_mve_vcvtq_f32_s32: {
8092   Value *Val0 = EmitScalarExpr(E->getArg(0));
8093   llvm::Type *Val1 = llvm::FixedVectorType::get(FloatTy, 4);
8094   return Builder.CreateSIToFP(Val0, Val1);
8095 }
8096 case ARM::BI__builtin_arm_mve_vcvtq_f32_u32: {
8097   Value *Val0 = EmitScalarExpr(E->getArg(0));
8098   llvm::Type *Val1 = llvm::FixedVectorType::get(FloatTy, 4);
8099   return Builder.CreateUIToFP(Val0, Val1);
8100 }
8101 case ARM::BI__builtin_arm_mve_vreinterpretq_f16_f32:
8102 case ARM::BI__builtin_arm_mve_vreinterpretq_f16_s16:
8103 case ARM::BI__builtin_arm_mve_vreinterpretq_f16_s32:
8104 case ARM::BI__builtin_arm_mve_vreinterpretq_f16_s64:
8105 case ARM::BI__builtin_arm_mve_vreinterpretq_f16_s8:
8106 case ARM::BI__builtin_arm_mve_vreinterpretq_f16_u16:
8107 case ARM::BI__builtin_arm_mve_vreinterpretq_f16_u32:
8108 case ARM::BI__builtin_arm_mve_vreinterpretq_f16_u64:
8109 case ARM::BI__builtin_arm_mve_vreinterpretq_f16_u8: {
8110   Value *Val0 = EmitScalarExpr(E->getArg(0));
8111   llvm::Type *Val1 = llvm::FixedVectorType::get(HalfTy, 8);
8112   return ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
8113 }
8114 case ARM::BI__builtin_arm_mve_vcvtq_f16_s16: {
8115   Value *Val0 = EmitScalarExpr(E->getArg(0));
8116   llvm::Type *Val1 = llvm::FixedVectorType::get(HalfTy, 8);
8117   return Builder.CreateSIToFP(Val0, Val1);
8118 }
8119 case ARM::BI__builtin_arm_mve_vcvtq_f16_u16: {
8120   Value *Val0 = EmitScalarExpr(E->getArg(0));
8121   llvm::Type *Val1 = llvm::FixedVectorType::get(HalfTy, 8);
8122   return Builder.CreateUIToFP(Val0, Val1);
8123 }
8124 case ARM::BI__builtin_arm_mve_vqnegq_s16: {
8125   Value *Val0 = EmitScalarExpr(E->getArg(0));
8126   llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8127   Value *Val2 = ARMMVEConstantSplat<1,0>(Builder, Val1);
8128   Value *Val3 = Builder.CreateICmpEQ(Val0, Val2);
8129   llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
8130   Value *Val5 = ARMMVEConstantSplat<0,1>(Builder, Val4);
8131   llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 8);
8132   Value *Val7 = llvm::Constant::getNullValue(Val6);
8133   Value *Val8 = Builder.CreateSub(Val7, Val0);
8134   return Builder.CreateSelect(Val3, Val5, Val8);
8135 }
8136 case ARM::BI__builtin_arm_mve_vmvnq_s16:
8137 case ARM::BI__builtin_arm_mve_vmvnq_u16: {
8138   Value *Val0 = EmitScalarExpr(E->getArg(0));
8139   llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8140   Value *Val2 = ARMMVEConstantSplat<1,1>(Builder, Val1);
8141   return Builder.CreateXor(Val0, Val2);
8142 }
8143 case ARM::BI__builtin_arm_mve_vmovntq_s16:
8144 case ARM::BI__builtin_arm_mve_vmovntq_u16: {
8145   Value *Val0 = EmitScalarExpr(E->getArg(0));
8146   llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8147   Value *Val2 = ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
8148   Value *Val3 = EmitScalarExpr(E->getArg(1));
8149   Value *Val4 = VectorZip(Builder, Val2, Val3);
8150   llvm::Type *Val5 = llvm::FixedVectorType::get(Int8Ty, 16);
8151   return Builder.CreateTrunc(Val4, Val5);
8152 }
8153 case ARM::BI__builtin_arm_mve_vandq_f16: {
8154   Value *Val0 = EmitScalarExpr(E->getArg(0));
8155   llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8156   Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8157   Value *Val3 = EmitScalarExpr(E->getArg(1));
8158   llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
8159   Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8160   Value *Val6 = Builder.CreateAnd(Val2, Val5);
8161   llvm::Type *Val7 = llvm::FixedVectorType::get(HalfTy, 8);
8162   return Builder.CreateBitCast(Val6, Val7);
8163 }
8164 case ARM::BI__builtin_arm_mve_vbicq_f16: {
8165   Value *Val0 = EmitScalarExpr(E->getArg(0));
8166   llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8167   Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8168   Value *Val3 = EmitScalarExpr(E->getArg(1));
8169   llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
8170   Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8171   Value *Val6 = Builder.CreateNot(Val5);
8172   Value *Val7 = Builder.CreateAnd(Val2, Val6);
8173   llvm::Type *Val8 = llvm::FixedVectorType::get(HalfTy, 8);
8174   return Builder.CreateBitCast(Val7, Val8);
8175 }
8176 case ARM::BI__builtin_arm_mve_vornq_f16: {
8177   Value *Val0 = EmitScalarExpr(E->getArg(0));
8178   llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8179   Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8180   Value *Val3 = EmitScalarExpr(E->getArg(1));
8181   llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
8182   Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8183   Value *Val6 = Builder.CreateNot(Val5);
8184   Value *Val7 = Builder.CreateOr(Val2, Val6);
8185   llvm::Type *Val8 = llvm::FixedVectorType::get(HalfTy, 8);
8186   return Builder.CreateBitCast(Val7, Val8);
8187 }
8188 case ARM::BI__builtin_arm_mve_vorrq_f16: {
8189   Value *Val0 = EmitScalarExpr(E->getArg(0));
8190   llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8191   Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8192   Value *Val3 = EmitScalarExpr(E->getArg(1));
8193   llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
8194   Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8195   Value *Val6 = Builder.CreateOr(Val2, Val5);
8196   llvm::Type *Val7 = llvm::FixedVectorType::get(HalfTy, 8);
8197   return Builder.CreateBitCast(Val6, Val7);
8198 }
8199 case ARM::BI__builtin_arm_mve_veorq_f16: {
8200   Value *Val0 = EmitScalarExpr(E->getArg(0));
8201   llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8202   Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8203   Value *Val3 = EmitScalarExpr(E->getArg(1));
8204   llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
8205   Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8206   Value *Val6 = Builder.CreateXor(Val2, Val5);
8207   llvm::Type *Val7 = llvm::FixedVectorType::get(HalfTy, 8);
8208   return Builder.CreateBitCast(Val6, Val7);
8209 }
8210 case ARM::BI__builtin_arm_mve_vqabsq_s16: {
8211   Value *Val0 = EmitScalarExpr(E->getArg(0));
8212   llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8213   Value *Val2 = llvm::Constant::getNullValue(Val1);
8214   Value *Val3 = Builder.CreateICmpSGT(Val0, Val2);
8215   llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
8216   Value *Val5 = ARMMVEConstantSplat<1,0>(Builder, Val4);
8217   Value *Val6 = Builder.CreateICmpEQ(Val0, Val5);
8218   llvm::Type *Val7 = llvm::FixedVectorType::get(Int16Ty, 8);
8219   Value *Val8 = ARMMVEConstantSplat<0,1>(Builder, Val7);
8220   llvm::Type *Val9 = llvm::FixedVectorType::get(Int16Ty, 8);
8221   Value *Val10 = llvm::Constant::getNullValue(Val9);
8222   Value *Val11 = Builder.CreateSub(Val10, Val0);
8223   Value *Val12 = Builder.CreateSelect(Val6, Val8, Val11);
8224   return Builder.CreateSelect(Val3, Val0, Val12);
8225 }
8226 case ARM::BI__builtin_arm_mve_vabsq_s16: {
8227   Value *Val0 = EmitScalarExpr(E->getArg(0));
8228   llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8229   Value *Val2 = llvm::Constant::getNullValue(Val1);
8230   Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
8231   llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
8232   Value *Val5 = llvm::Constant::getNullValue(Val4);
8233   Value *Val6 = Builder.CreateSub(Val5, Val0);
8234   return Builder.CreateSelect(Val3, Val6, Val0);
8235 }
8236 case ARM::BI__builtin_arm_mve_vreinterpretq_s16_f16:
8237 case ARM::BI__builtin_arm_mve_vreinterpretq_s16_f32:
8238 case ARM::BI__builtin_arm_mve_vreinterpretq_s16_s32:
8239 case ARM::BI__builtin_arm_mve_vreinterpretq_s16_s64:
8240 case ARM::BI__builtin_arm_mve_vreinterpretq_s16_s8:
8241 case ARM::BI__builtin_arm_mve_vreinterpretq_s16_u16:
8242 case ARM::BI__builtin_arm_mve_vreinterpretq_s16_u32:
8243 case ARM::BI__builtin_arm_mve_vreinterpretq_s16_u64:
8244 case ARM::BI__builtin_arm_mve_vreinterpretq_s16_u8:
8245 case ARM::BI__builtin_arm_mve_vreinterpretq_u16_f16:
8246 case ARM::BI__builtin_arm_mve_vreinterpretq_u16_f32:
8247 case ARM::BI__builtin_arm_mve_vreinterpretq_u16_s16:
8248 case ARM::BI__builtin_arm_mve_vreinterpretq_u16_s32:
8249 case ARM::BI__builtin_arm_mve_vreinterpretq_u16_s64:
8250 case ARM::BI__builtin_arm_mve_vreinterpretq_u16_s8:
8251 case ARM::BI__builtin_arm_mve_vreinterpretq_u16_u32:
8252 case ARM::BI__builtin_arm_mve_vreinterpretq_u16_u64:
8253 case ARM::BI__builtin_arm_mve_vreinterpretq_u16_u8: {
8254   Value *Val0 = EmitScalarExpr(E->getArg(0));
8255   llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8256   return ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
8257 }
8258 case ARM::BI__builtin_arm_mve_vcvtq_s16_f16: {
8259   Value *Val0 = EmitScalarExpr(E->getArg(0));
8260   llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8261   return Builder.CreateFPToSI(Val0, Val1);
8262 }
8263 case ARM::BI__builtin_arm_mve_vcvtq_u16_f16: {
8264   Value *Val0 = EmitScalarExpr(E->getArg(0));
8265   llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8266   return Builder.CreateFPToUI(Val0, Val1);
8267 }
8268 case ARM::BI__builtin_arm_mve_vqnegq_s32: {
8269   Value *Val0 = EmitScalarExpr(E->getArg(0));
8270   llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8271   Value *Val2 = ARMMVEConstantSplat<1,0>(Builder, Val1);
8272   Value *Val3 = Builder.CreateICmpEQ(Val0, Val2);
8273   llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
8274   Value *Val5 = ARMMVEConstantSplat<0,1>(Builder, Val4);
8275   llvm::Type *Val6 = llvm::FixedVectorType::get(Int32Ty, 4);
8276   Value *Val7 = llvm::Constant::getNullValue(Val6);
8277   Value *Val8 = Builder.CreateSub(Val7, Val0);
8278   return Builder.CreateSelect(Val3, Val5, Val8);
8279 }
8280 case ARM::BI__builtin_arm_mve_vmvnq_s32:
8281 case ARM::BI__builtin_arm_mve_vmvnq_u32: {
8282   Value *Val0 = EmitScalarExpr(E->getArg(0));
8283   llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8284   Value *Val2 = ARMMVEConstantSplat<1,1>(Builder, Val1);
8285   return Builder.CreateXor(Val0, Val2);
8286 }
8287 case ARM::BI__builtin_arm_mve_vmovntq_s32:
8288 case ARM::BI__builtin_arm_mve_vmovntq_u32: {
8289   Value *Val0 = EmitScalarExpr(E->getArg(0));
8290   llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8291   Value *Val2 = ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
8292   Value *Val3 = EmitScalarExpr(E->getArg(1));
8293   Value *Val4 = VectorZip(Builder, Val2, Val3);
8294   llvm::Type *Val5 = llvm::FixedVectorType::get(Int16Ty, 8);
8295   return Builder.CreateTrunc(Val4, Val5);
8296 }
8297 case ARM::BI__builtin_arm_mve_vandq_f32: {
8298   Value *Val0 = EmitScalarExpr(E->getArg(0));
8299   llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8300   Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8301   Value *Val3 = EmitScalarExpr(E->getArg(1));
8302   llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
8303   Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8304   Value *Val6 = Builder.CreateAnd(Val2, Val5);
8305   llvm::Type *Val7 = llvm::FixedVectorType::get(FloatTy, 4);
8306   return Builder.CreateBitCast(Val6, Val7);
8307 }
8308 case ARM::BI__builtin_arm_mve_vbicq_f32: {
8309   Value *Val0 = EmitScalarExpr(E->getArg(0));
8310   llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8311   Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8312   Value *Val3 = EmitScalarExpr(E->getArg(1));
8313   llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
8314   Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8315   Value *Val6 = Builder.CreateNot(Val5);
8316   Value *Val7 = Builder.CreateAnd(Val2, Val6);
8317   llvm::Type *Val8 = llvm::FixedVectorType::get(FloatTy, 4);
8318   return Builder.CreateBitCast(Val7, Val8);
8319 }
8320 case ARM::BI__builtin_arm_mve_vornq_f32: {
8321   Value *Val0 = EmitScalarExpr(E->getArg(0));
8322   llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8323   Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8324   Value *Val3 = EmitScalarExpr(E->getArg(1));
8325   llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
8326   Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8327   Value *Val6 = Builder.CreateNot(Val5);
8328   Value *Val7 = Builder.CreateOr(Val2, Val6);
8329   llvm::Type *Val8 = llvm::FixedVectorType::get(FloatTy, 4);
8330   return Builder.CreateBitCast(Val7, Val8);
8331 }
8332 case ARM::BI__builtin_arm_mve_vorrq_f32: {
8333   Value *Val0 = EmitScalarExpr(E->getArg(0));
8334   llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8335   Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8336   Value *Val3 = EmitScalarExpr(E->getArg(1));
8337   llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
8338   Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8339   Value *Val6 = Builder.CreateOr(Val2, Val5);
8340   llvm::Type *Val7 = llvm::FixedVectorType::get(FloatTy, 4);
8341   return Builder.CreateBitCast(Val6, Val7);
8342 }
8343 case ARM::BI__builtin_arm_mve_veorq_f32: {
8344   Value *Val0 = EmitScalarExpr(E->getArg(0));
8345   llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8346   Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8347   Value *Val3 = EmitScalarExpr(E->getArg(1));
8348   llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
8349   Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8350   Value *Val6 = Builder.CreateXor(Val2, Val5);
8351   llvm::Type *Val7 = llvm::FixedVectorType::get(FloatTy, 4);
8352   return Builder.CreateBitCast(Val6, Val7);
8353 }
8354 case ARM::BI__builtin_arm_mve_vqabsq_s32: {
8355   Value *Val0 = EmitScalarExpr(E->getArg(0));
8356   llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8357   Value *Val2 = llvm::Constant::getNullValue(Val1);
8358   Value *Val3 = Builder.CreateICmpSGT(Val0, Val2);
8359   llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
8360   Value *Val5 = ARMMVEConstantSplat<1,0>(Builder, Val4);
8361   Value *Val6 = Builder.CreateICmpEQ(Val0, Val5);
8362   llvm::Type *Val7 = llvm::FixedVectorType::get(Int32Ty, 4);
8363   Value *Val8 = ARMMVEConstantSplat<0,1>(Builder, Val7);
8364   llvm::Type *Val9 = llvm::FixedVectorType::get(Int32Ty, 4);
8365   Value *Val10 = llvm::Constant::getNullValue(Val9);
8366   Value *Val11 = Builder.CreateSub(Val10, Val0);
8367   Value *Val12 = Builder.CreateSelect(Val6, Val8, Val11);
8368   return Builder.CreateSelect(Val3, Val0, Val12);
8369 }
8370 case ARM::BI__builtin_arm_mve_vabsq_s32: {
8371   Value *Val0 = EmitScalarExpr(E->getArg(0));
8372   llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8373   Value *Val2 = llvm::Constant::getNullValue(Val1);
8374   Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
8375   llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
8376   Value *Val5 = llvm::Constant::getNullValue(Val4);
8377   Value *Val6 = Builder.CreateSub(Val5, Val0);
8378   return Builder.CreateSelect(Val3, Val6, Val0);
8379 }
8380 case ARM::BI__builtin_arm_mve_vreinterpretq_s32_f16:
8381 case ARM::BI__builtin_arm_mve_vreinterpretq_s32_f32:
8382 case ARM::BI__builtin_arm_mve_vreinterpretq_s32_s16:
8383 case ARM::BI__builtin_arm_mve_vreinterpretq_s32_s64:
8384 case ARM::BI__builtin_arm_mve_vreinterpretq_s32_s8:
8385 case ARM::BI__builtin_arm_mve_vreinterpretq_s32_u16:
8386 case ARM::BI__builtin_arm_mve_vreinterpretq_s32_u32:
8387 case ARM::BI__builtin_arm_mve_vreinterpretq_s32_u64:
8388 case ARM::BI__builtin_arm_mve_vreinterpretq_s32_u8:
8389 case ARM::BI__builtin_arm_mve_vreinterpretq_u32_f16:
8390 case ARM::BI__builtin_arm_mve_vreinterpretq_u32_f32:
8391 case ARM::BI__builtin_arm_mve_vreinterpretq_u32_s16:
8392 case ARM::BI__builtin_arm_mve_vreinterpretq_u32_s32:
8393 case ARM::BI__builtin_arm_mve_vreinterpretq_u32_s64:
8394 case ARM::BI__builtin_arm_mve_vreinterpretq_u32_s8:
8395 case ARM::BI__builtin_arm_mve_vreinterpretq_u32_u16:
8396 case ARM::BI__builtin_arm_mve_vreinterpretq_u32_u64:
8397 case ARM::BI__builtin_arm_mve_vreinterpretq_u32_u8: {
8398   Value *Val0 = EmitScalarExpr(E->getArg(0));
8399   llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8400   return ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
8401 }
8402 case ARM::BI__builtin_arm_mve_vcvtq_s32_f32: {
8403   Value *Val0 = EmitScalarExpr(E->getArg(0));
8404   llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8405   return Builder.CreateFPToSI(Val0, Val1);
8406 }
8407 case ARM::BI__builtin_arm_mve_vcvtq_u32_f32: {
8408   Value *Val0 = EmitScalarExpr(E->getArg(0));
8409   llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8410   return Builder.CreateFPToUI(Val0, Val1);
8411 }
8412 case ARM::BI__builtin_arm_mve_vreinterpretq_s64_f16:
8413 case ARM::BI__builtin_arm_mve_vreinterpretq_s64_f32:
8414 case ARM::BI__builtin_arm_mve_vreinterpretq_s64_s16:
8415 case ARM::BI__builtin_arm_mve_vreinterpretq_s64_s32:
8416 case ARM::BI__builtin_arm_mve_vreinterpretq_s64_s8:
8417 case ARM::BI__builtin_arm_mve_vreinterpretq_s64_u16:
8418 case ARM::BI__builtin_arm_mve_vreinterpretq_s64_u32:
8419 case ARM::BI__builtin_arm_mve_vreinterpretq_s64_u64:
8420 case ARM::BI__builtin_arm_mve_vreinterpretq_s64_u8:
8421 case ARM::BI__builtin_arm_mve_vreinterpretq_u64_f16:
8422 case ARM::BI__builtin_arm_mve_vreinterpretq_u64_f32:
8423 case ARM::BI__builtin_arm_mve_vreinterpretq_u64_s16:
8424 case ARM::BI__builtin_arm_mve_vreinterpretq_u64_s32:
8425 case ARM::BI__builtin_arm_mve_vreinterpretq_u64_s64:
8426 case ARM::BI__builtin_arm_mve_vreinterpretq_u64_s8:
8427 case ARM::BI__builtin_arm_mve_vreinterpretq_u64_u16:
8428 case ARM::BI__builtin_arm_mve_vreinterpretq_u64_u32:
8429 case ARM::BI__builtin_arm_mve_vreinterpretq_u64_u8: {
8430   Value *Val0 = EmitScalarExpr(E->getArg(0));
8431   llvm::Type *Val1 = llvm::FixedVectorType::get(Int64Ty, 2);
8432   return ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
8433 }
8434 case ARM::BI__builtin_arm_mve_vqnegq_s8: {
8435   Value *Val0 = EmitScalarExpr(E->getArg(0));
8436   llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
8437   Value *Val2 = ARMMVEConstantSplat<1,0>(Builder, Val1);
8438   Value *Val3 = Builder.CreateICmpEQ(Val0, Val2);
8439   llvm::Type *Val4 = llvm::FixedVectorType::get(Int8Ty, 16);
8440   Value *Val5 = ARMMVEConstantSplat<0,1>(Builder, Val4);
8441   llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 16);
8442   Value *Val7 = llvm::Constant::getNullValue(Val6);
8443   Value *Val8 = Builder.CreateSub(Val7, Val0);
8444   return Builder.CreateSelect(Val3, Val5, Val8);
8445 }
8446 case ARM::BI__builtin_arm_mve_vmvnq_s8:
8447 case ARM::BI__builtin_arm_mve_vmvnq_u8: {
8448   Value *Val0 = EmitScalarExpr(E->getArg(0));
8449   llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
8450   Value *Val2 = ARMMVEConstantSplat<1,1>(Builder, Val1);
8451   return Builder.CreateXor(Val0, Val2);
8452 }
8453 case ARM::BI__builtin_arm_mve_vqabsq_s8: {
8454   Value *Val0 = EmitScalarExpr(E->getArg(0));
8455   llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
8456   Value *Val2 = llvm::Constant::getNullValue(Val1);
8457   Value *Val3 = Builder.CreateICmpSGT(Val0, Val2);
8458   llvm::Type *Val4 = llvm::FixedVectorType::get(Int8Ty, 16);
8459   Value *Val5 = ARMMVEConstantSplat<1,0>(Builder, Val4);
8460   Value *Val6 = Builder.CreateICmpEQ(Val0, Val5);
8461   llvm::Type *Val7 = llvm::FixedVectorType::get(Int8Ty, 16);
8462   Value *Val8 = ARMMVEConstantSplat<0,1>(Builder, Val7);
8463   llvm::Type *Val9 = llvm::FixedVectorType::get(Int8Ty, 16);
8464   Value *Val10 = llvm::Constant::getNullValue(Val9);
8465   Value *Val11 = Builder.CreateSub(Val10, Val0);
8466   Value *Val12 = Builder.CreateSelect(Val6, Val8, Val11);
8467   return Builder.CreateSelect(Val3, Val0, Val12);
8468 }
8469 case ARM::BI__builtin_arm_mve_vabsq_s8: {
8470   Value *Val0 = EmitScalarExpr(E->getArg(0));
8471   llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
8472   Value *Val2 = llvm::Constant::getNullValue(Val1);
8473   Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
8474   llvm::Type *Val4 = llvm::FixedVectorType::get(Int8Ty, 16);
8475   Value *Val5 = llvm::Constant::getNullValue(Val4);
8476   Value *Val6 = Builder.CreateSub(Val5, Val0);
8477   return Builder.CreateSelect(Val3, Val6, Val0);
8478 }
8479 case ARM::BI__builtin_arm_mve_vreinterpretq_s8_f16:
8480 case ARM::BI__builtin_arm_mve_vreinterpretq_s8_f32:
8481 case ARM::BI__builtin_arm_mve_vreinterpretq_s8_s16:
8482 case ARM::BI__builtin_arm_mve_vreinterpretq_s8_s32:
8483 case ARM::BI__builtin_arm_mve_vreinterpretq_s8_s64:
8484 case ARM::BI__builtin_arm_mve_vreinterpretq_s8_u16:
8485 case ARM::BI__builtin_arm_mve_vreinterpretq_s8_u32:
8486 case ARM::BI__builtin_arm_mve_vreinterpretq_s8_u64:
8487 case ARM::BI__builtin_arm_mve_vreinterpretq_s8_u8:
8488 case ARM::BI__builtin_arm_mve_vreinterpretq_u8_f16:
8489 case ARM::BI__builtin_arm_mve_vreinterpretq_u8_f32:
8490 case ARM::BI__builtin_arm_mve_vreinterpretq_u8_s16:
8491 case ARM::BI__builtin_arm_mve_vreinterpretq_u8_s32:
8492 case ARM::BI__builtin_arm_mve_vreinterpretq_u8_s64:
8493 case ARM::BI__builtin_arm_mve_vreinterpretq_u8_s8:
8494 case ARM::BI__builtin_arm_mve_vreinterpretq_u8_u16:
8495 case ARM::BI__builtin_arm_mve_vreinterpretq_u8_u32:
8496 case ARM::BI__builtin_arm_mve_vreinterpretq_u8_u64: {
8497   Value *Val0 = EmitScalarExpr(E->getArg(0));
8498   llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
8499   return ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
8500 }
8501 case ARM::BI__builtin_arm_mve_vrev16q_s8:
8502 case ARM::BI__builtin_arm_mve_vrev16q_u8:
8503 case ARM::BI__builtin_arm_mve_vrev32q_f16:
8504 case ARM::BI__builtin_arm_mve_vrev32q_s16:
8505 case ARM::BI__builtin_arm_mve_vrev32q_s8:
8506 case ARM::BI__builtin_arm_mve_vrev32q_u16:
8507 case ARM::BI__builtin_arm_mve_vrev32q_u8:
8508 case ARM::BI__builtin_arm_mve_vrev64q_f16:
8509 case ARM::BI__builtin_arm_mve_vrev64q_f32:
8510 case ARM::BI__builtin_arm_mve_vrev64q_s16:
8511 case ARM::BI__builtin_arm_mve_vrev64q_s32:
8512 case ARM::BI__builtin_arm_mve_vrev64q_s8:
8513 case ARM::BI__builtin_arm_mve_vrev64q_u16:
8514 case ARM::BI__builtin_arm_mve_vrev64q_u32:
8515 case ARM::BI__builtin_arm_mve_vrev64q_u8: {
8516   unsigned  Param0;
8517   switch (BuiltinID) {
8518   case ARM::BI__builtin_arm_mve_vrev16q_s8:
8519     Param0 = 16;
8520     break;
8521   case ARM::BI__builtin_arm_mve_vrev16q_u8:
8522     Param0 = 16;
8523     break;
8524   case ARM::BI__builtin_arm_mve_vrev32q_f16:
8525     Param0 = 32;
8526     break;
8527   case ARM::BI__builtin_arm_mve_vrev32q_s16:
8528     Param0 = 32;
8529     break;
8530   case ARM::BI__builtin_arm_mve_vrev32q_s8:
8531     Param0 = 32;
8532     break;
8533   case ARM::BI__builtin_arm_mve_vrev32q_u16:
8534     Param0 = 32;
8535     break;
8536   case ARM::BI__builtin_arm_mve_vrev32q_u8:
8537     Param0 = 32;
8538     break;
8539   case ARM::BI__builtin_arm_mve_vrev64q_f16:
8540     Param0 = 64;
8541     break;
8542   case ARM::BI__builtin_arm_mve_vrev64q_f32:
8543     Param0 = 64;
8544     break;
8545   case ARM::BI__builtin_arm_mve_vrev64q_s16:
8546     Param0 = 64;
8547     break;
8548   case ARM::BI__builtin_arm_mve_vrev64q_s32:
8549     Param0 = 64;
8550     break;
8551   case ARM::BI__builtin_arm_mve_vrev64q_s8:
8552     Param0 = 64;
8553     break;
8554   case ARM::BI__builtin_arm_mve_vrev64q_u16:
8555     Param0 = 64;
8556     break;
8557   case ARM::BI__builtin_arm_mve_vrev64q_u32:
8558     Param0 = 64;
8559     break;
8560   case ARM::BI__builtin_arm_mve_vrev64q_u8:
8561     Param0 = 64;
8562     break;
8563   }
8564   Value *Val0 = EmitScalarExpr(E->getArg(0));
8565   return ARMMVEVectorElementReverse(Builder, Val0, static_cast<unsigned>(Param0));
8566 }
8567 case ARM::BI__builtin_arm_mve_vdupq_n_f16:
8568 case ARM::BI__builtin_arm_mve_vdupq_n_f32:
8569 case ARM::BI__builtin_arm_mve_vdupq_n_s16:
8570 case ARM::BI__builtin_arm_mve_vdupq_n_s32:
8571 case ARM::BI__builtin_arm_mve_vdupq_n_s8:
8572 case ARM::BI__builtin_arm_mve_vdupq_n_u16:
8573 case ARM::BI__builtin_arm_mve_vdupq_n_u32:
8574 case ARM::BI__builtin_arm_mve_vdupq_n_u8: {
8575   Value *Val0 = EmitScalarExpr(E->getArg(0));
8576   return ARMMVEVectorSplat(Builder, Val0);
8577 }
8578 case ARM::BI__builtin_arm_mve_vabsq_f16:
8579 case ARM::BI__builtin_arm_mve_vabsq_f32:
8580 case ARM::BI__builtin_arm_mve_vclsq_s16:
8581 case ARM::BI__builtin_arm_mve_vclsq_s32:
8582 case ARM::BI__builtin_arm_mve_vclsq_s8:
8583 case ARM::BI__builtin_arm_mve_vrndaq_f16:
8584 case ARM::BI__builtin_arm_mve_vrndaq_f32:
8585 case ARM::BI__builtin_arm_mve_vrndmq_f16:
8586 case ARM::BI__builtin_arm_mve_vrndmq_f32:
8587 case ARM::BI__builtin_arm_mve_vrndnq_f16:
8588 case ARM::BI__builtin_arm_mve_vrndnq_f32:
8589 case ARM::BI__builtin_arm_mve_vrndpq_f16:
8590 case ARM::BI__builtin_arm_mve_vrndpq_f32:
8591 case ARM::BI__builtin_arm_mve_vrndq_f16:
8592 case ARM::BI__builtin_arm_mve_vrndq_f32:
8593 case ARM::BI__builtin_arm_mve_vrndxq_f16:
8594 case ARM::BI__builtin_arm_mve_vrndxq_f32: {
8595   Intrinsic::ID  Param0;
8596   llvm::Type * Param1;
8597   switch (BuiltinID) {
8598   case ARM::BI__builtin_arm_mve_vabsq_f16:
8599     Param0 = Intrinsic::fabs;
8600     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
8601     break;
8602   case ARM::BI__builtin_arm_mve_vabsq_f32:
8603     Param0 = Intrinsic::fabs;
8604     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
8605     break;
8606   case ARM::BI__builtin_arm_mve_vclsq_s16:
8607     Param0 = Intrinsic::arm_mve_vcls;
8608     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
8609     break;
8610   case ARM::BI__builtin_arm_mve_vclsq_s32:
8611     Param0 = Intrinsic::arm_mve_vcls;
8612     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
8613     break;
8614   case ARM::BI__builtin_arm_mve_vclsq_s8:
8615     Param0 = Intrinsic::arm_mve_vcls;
8616     Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
8617     break;
8618   case ARM::BI__builtin_arm_mve_vrndaq_f16:
8619     Param0 = Intrinsic::round;
8620     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
8621     break;
8622   case ARM::BI__builtin_arm_mve_vrndaq_f32:
8623     Param0 = Intrinsic::round;
8624     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
8625     break;
8626   case ARM::BI__builtin_arm_mve_vrndmq_f16:
8627     Param0 = Intrinsic::floor;
8628     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
8629     break;
8630   case ARM::BI__builtin_arm_mve_vrndmq_f32:
8631     Param0 = Intrinsic::floor;
8632     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
8633     break;
8634   case ARM::BI__builtin_arm_mve_vrndnq_f16:
8635     Param0 = Intrinsic::arm_mve_vrintn;
8636     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
8637     break;
8638   case ARM::BI__builtin_arm_mve_vrndnq_f32:
8639     Param0 = Intrinsic::arm_mve_vrintn;
8640     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
8641     break;
8642   case ARM::BI__builtin_arm_mve_vrndpq_f16:
8643     Param0 = Intrinsic::ceil;
8644     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
8645     break;
8646   case ARM::BI__builtin_arm_mve_vrndpq_f32:
8647     Param0 = Intrinsic::ceil;
8648     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
8649     break;
8650   case ARM::BI__builtin_arm_mve_vrndq_f16:
8651     Param0 = Intrinsic::trunc;
8652     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
8653     break;
8654   case ARM::BI__builtin_arm_mve_vrndq_f32:
8655     Param0 = Intrinsic::trunc;
8656     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
8657     break;
8658   case ARM::BI__builtin_arm_mve_vrndxq_f16:
8659     Param0 = Intrinsic::rint;
8660     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
8661     break;
8662   case ARM::BI__builtin_arm_mve_vrndxq_f32:
8663     Param0 = Intrinsic::rint;
8664     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
8665     break;
8666   }
8667   Value *Val0 = EmitScalarExpr(E->getArg(0));
8668   return Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0});
8669 }
8670 case ARM::BI__builtin_arm_mve_vnegq_f16:
8671 case ARM::BI__builtin_arm_mve_vnegq_f32: {
8672   Value *Val0 = EmitScalarExpr(E->getArg(0));
8673   return Builder.CreateFNeg(Val0);
8674 }
8675 case ARM::BI__builtin_arm_mve_vshrq_n_s16:
8676 case ARM::BI__builtin_arm_mve_vshrq_n_s32:
8677 case ARM::BI__builtin_arm_mve_vshrq_n_s8:
8678 case ARM::BI__builtin_arm_mve_vshrq_n_u16:
8679 case ARM::BI__builtin_arm_mve_vshrq_n_u32:
8680 case ARM::BI__builtin_arm_mve_vshrq_n_u8: {
8681   bool  Param0;
8682   switch (BuiltinID) {
8683   case ARM::BI__builtin_arm_mve_vshrq_n_s16:
8684     Param0 = 0;
8685     break;
8686   case ARM::BI__builtin_arm_mve_vshrq_n_s32:
8687     Param0 = 0;
8688     break;
8689   case ARM::BI__builtin_arm_mve_vshrq_n_s8:
8690     Param0 = 0;
8691     break;
8692   case ARM::BI__builtin_arm_mve_vshrq_n_u16:
8693     Param0 = 1;
8694     break;
8695   case ARM::BI__builtin_arm_mve_vshrq_n_u32:
8696     Param0 = 1;
8697     break;
8698   case ARM::BI__builtin_arm_mve_vshrq_n_u8:
8699     Param0 = 1;
8700     break;
8701   }
8702   Value *Val0 = EmitScalarExpr(E->getArg(0));
8703   return MVEImmediateShr(Builder, Val0, GetIntegerConstantValue<unsigned>(E->getArg(1), getContext()), static_cast<bool>(Param0));
8704 }
8705 case ARM::BI__builtin_arm_mve_vst1q_p_f16:
8706 case ARM::BI__builtin_arm_mve_vst1q_p_f32:
8707 case ARM::BI__builtin_arm_mve_vst1q_p_s16:
8708 case ARM::BI__builtin_arm_mve_vst1q_p_s32:
8709 case ARM::BI__builtin_arm_mve_vst1q_p_s8:
8710 case ARM::BI__builtin_arm_mve_vst1q_p_u16:
8711 case ARM::BI__builtin_arm_mve_vst1q_p_u32:
8712 case ARM::BI__builtin_arm_mve_vst1q_p_u8:
8713 case ARM::BI__builtin_arm_mve_vstrbq_p_s8:
8714 case ARM::BI__builtin_arm_mve_vstrbq_p_u8:
8715 case ARM::BI__builtin_arm_mve_vstrhq_p_f16:
8716 case ARM::BI__builtin_arm_mve_vstrhq_p_s16:
8717 case ARM::BI__builtin_arm_mve_vstrhq_p_u16:
8718 case ARM::BI__builtin_arm_mve_vstrwq_p_f32:
8719 case ARM::BI__builtin_arm_mve_vstrwq_p_s32:
8720 case ARM::BI__builtin_arm_mve_vstrwq_p_u32: {
8721   llvm::Type * Param0;
8722   uint32_t  Param1;
8723   llvm::Type * Param2;
8724   llvm::Type * Param3;
8725   switch (BuiltinID) {
8726   case ARM::BI__builtin_arm_mve_vst1q_p_f16:
8727     Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(HalfTy, 8));
8728     Param1 = 2;
8729     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
8730     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
8731     break;
8732   case ARM::BI__builtin_arm_mve_vst1q_p_f32:
8733     Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(FloatTy, 4));
8734     Param1 = 4;
8735     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8736     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
8737     break;
8738   case ARM::BI__builtin_arm_mve_vst1q_p_s16:
8739     Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8));
8740     Param1 = 2;
8741     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
8742     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
8743     break;
8744   case ARM::BI__builtin_arm_mve_vst1q_p_s32:
8745     Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4));
8746     Param1 = 4;
8747     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8748     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
8749     break;
8750   case ARM::BI__builtin_arm_mve_vst1q_p_s8:
8751     Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16));
8752     Param1 = 1;
8753     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
8754     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
8755     break;
8756   case ARM::BI__builtin_arm_mve_vst1q_p_u16:
8757     Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8));
8758     Param1 = 2;
8759     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
8760     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
8761     break;
8762   case ARM::BI__builtin_arm_mve_vst1q_p_u32:
8763     Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4));
8764     Param1 = 4;
8765     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8766     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
8767     break;
8768   case ARM::BI__builtin_arm_mve_vst1q_p_u8:
8769     Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16));
8770     Param1 = 1;
8771     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
8772     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
8773     break;
8774   case ARM::BI__builtin_arm_mve_vstrbq_p_s8:
8775     Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16));
8776     Param1 = 1;
8777     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
8778     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
8779     break;
8780   case ARM::BI__builtin_arm_mve_vstrbq_p_u8:
8781     Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16));
8782     Param1 = 1;
8783     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
8784     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
8785     break;
8786   case ARM::BI__builtin_arm_mve_vstrhq_p_f16:
8787     Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(HalfTy, 8));
8788     Param1 = 2;
8789     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
8790     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
8791     break;
8792   case ARM::BI__builtin_arm_mve_vstrhq_p_s16:
8793     Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8));
8794     Param1 = 2;
8795     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
8796     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
8797     break;
8798   case ARM::BI__builtin_arm_mve_vstrhq_p_u16:
8799     Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8));
8800     Param1 = 2;
8801     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
8802     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
8803     break;
8804   case ARM::BI__builtin_arm_mve_vstrwq_p_f32:
8805     Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(FloatTy, 4));
8806     Param1 = 4;
8807     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8808     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
8809     break;
8810   case ARM::BI__builtin_arm_mve_vstrwq_p_s32:
8811     Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4));
8812     Param1 = 4;
8813     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8814     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
8815     break;
8816   case ARM::BI__builtin_arm_mve_vstrwq_p_u32:
8817     Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4));
8818     Param1 = 4;
8819     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8820     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
8821     break;
8822   }
8823   Value *Val0 = EmitScalarExpr(E->getArg(1));
8824   Address Val1 = EmitPointerWithAlignment(E->getArg(0));
8825   Value *Val2 = Builder.CreatePointerCast((Val1.emitRawPointer(*this)), Param0);
8826   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
8827   Value *Val4 = EmitScalarExpr(E->getArg(2));
8828   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
8829   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param2}), {Val5});
8830   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_store, {Param3, Param0}), {Val0, Val2, Val3, Val6});
8831 }
8832 case ARM::BI__builtin_arm_mve_vst1q_f32:
8833 case ARM::BI__builtin_arm_mve_vstrwq_f32: {
8834   Value *Val0 = EmitScalarExpr(E->getArg(1));
8835   Address Val1 = EmitPointerWithAlignment(E->getArg(0));
8836   Value *Val2 = Builder.CreatePointerCast((Val1.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(FloatTy, 4)));
8837   Address Val3 = Address(Val2, llvm::FixedVectorType::get(FloatTy, 4), CharUnits::fromQuantity(4));
8838   return Builder.CreateStore(Val0, Val3);
8839 }
8840 case ARM::BI__builtin_arm_mve_vst1q_f16:
8841 case ARM::BI__builtin_arm_mve_vstrhq_f16: {
8842   Value *Val0 = EmitScalarExpr(E->getArg(1));
8843   Address Val1 = EmitPointerWithAlignment(E->getArg(0));
8844   Value *Val2 = Builder.CreatePointerCast((Val1.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(HalfTy, 8)));
8845   Address Val3 = Address(Val2, llvm::FixedVectorType::get(HalfTy, 8), CharUnits::fromQuantity(2));
8846   return Builder.CreateStore(Val0, Val3);
8847 }
8848 case ARM::BI__builtin_arm_mve_vst1q_s16:
8849 case ARM::BI__builtin_arm_mve_vst1q_u16:
8850 case ARM::BI__builtin_arm_mve_vstrhq_s16:
8851 case ARM::BI__builtin_arm_mve_vstrhq_u16: {
8852   Value *Val0 = EmitScalarExpr(E->getArg(1));
8853   Address Val1 = EmitPointerWithAlignment(E->getArg(0));
8854   Value *Val2 = Builder.CreatePointerCast((Val1.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8)));
8855   Address Val3 = Address(Val2, llvm::FixedVectorType::get(Int16Ty, 8), CharUnits::fromQuantity(2));
8856   return Builder.CreateStore(Val0, Val3);
8857 }
8858 case ARM::BI__builtin_arm_mve_vst1q_s32:
8859 case ARM::BI__builtin_arm_mve_vst1q_u32:
8860 case ARM::BI__builtin_arm_mve_vstrwq_s32:
8861 case ARM::BI__builtin_arm_mve_vstrwq_u32: {
8862   Value *Val0 = EmitScalarExpr(E->getArg(1));
8863   Address Val1 = EmitPointerWithAlignment(E->getArg(0));
8864   Value *Val2 = Builder.CreatePointerCast((Val1.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4)));
8865   Address Val3 = Address(Val2, llvm::FixedVectorType::get(Int32Ty, 4), CharUnits::fromQuantity(4));
8866   return Builder.CreateStore(Val0, Val3);
8867 }
8868 case ARM::BI__builtin_arm_mve_vst1q_s8:
8869 case ARM::BI__builtin_arm_mve_vst1q_u8:
8870 case ARM::BI__builtin_arm_mve_vstrbq_s8:
8871 case ARM::BI__builtin_arm_mve_vstrbq_u8: {
8872   Value *Val0 = EmitScalarExpr(E->getArg(1));
8873   Address Val1 = EmitPointerWithAlignment(E->getArg(0));
8874   Value *Val2 = Builder.CreatePointerCast((Val1.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16)));
8875   Address Val3 = Address(Val2, llvm::FixedVectorType::get(Int8Ty, 16), CharUnits::fromQuantity(1));
8876   return Builder.CreateStore(Val0, Val3);
8877 }
8878 case ARM::BI__builtin_arm_mve_vctp16q_m:
8879 case ARM::BI__builtin_arm_mve_vctp32q_m:
8880 case ARM::BI__builtin_arm_mve_vctp64q_m:
8881 case ARM::BI__builtin_arm_mve_vctp8q_m: {
8882   llvm::Type * Param0;
8883   Intrinsic::ID  Param1;
8884   switch (BuiltinID) {
8885   case ARM::BI__builtin_arm_mve_vctp16q_m:
8886     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
8887     Param1 = Intrinsic::arm_mve_vctp16;
8888     break;
8889   case ARM::BI__builtin_arm_mve_vctp32q_m:
8890     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8891     Param1 = Intrinsic::arm_mve_vctp32;
8892     break;
8893   case ARM::BI__builtin_arm_mve_vctp64q_m:
8894     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
8895     Param1 = Intrinsic::arm_mve_vctp64;
8896     break;
8897   case ARM::BI__builtin_arm_mve_vctp8q_m:
8898     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
8899     Param1 = Intrinsic::arm_mve_vctp8;
8900     break;
8901   }
8902   Value *Val0 = EmitScalarExpr(E->getArg(1));
8903   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
8904   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
8905   Value *Val3 = EmitScalarExpr(E->getArg(0));
8906   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Param1), {Val3});
8907   Value *Val5 = Builder.CreateAnd(Val2, Val4);
8908   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val5});
8909   return Builder.CreateIntCast(Val6, Int16Ty, false);
8910 }
8911 case ARM::BI__builtin_arm_mve_vmovnbq_s16:
8912 case ARM::BI__builtin_arm_mve_vmovnbq_u16: {
8913   Value *Val0 = EmitScalarExpr(E->getArg(1));
8914   Value *Val1 = EmitScalarExpr(E->getArg(0));
8915   Value *Val2 = ARMMVEVectorElementReverse(Builder, Val1, static_cast<unsigned>(16));
8916   llvm::Type *Val3 = llvm::FixedVectorType::get(Int16Ty, 8);
8917   Value *Val4 = ARMMVEVectorReinterpret(Builder, this, Val2, Val3);
8918   Value *Val5 = VectorZip(Builder, Val0, Val4);
8919   llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 16);
8920   return Builder.CreateTrunc(Val5, Val6);
8921 }
8922 case ARM::BI__builtin_arm_mve_vmovnbq_s32:
8923 case ARM::BI__builtin_arm_mve_vmovnbq_u32: {
8924   Value *Val0 = EmitScalarExpr(E->getArg(1));
8925   Value *Val1 = EmitScalarExpr(E->getArg(0));
8926   Value *Val2 = ARMMVEVectorElementReverse(Builder, Val1, static_cast<unsigned>(32));
8927   llvm::Type *Val3 = llvm::FixedVectorType::get(Int32Ty, 4);
8928   Value *Val4 = ARMMVEVectorReinterpret(Builder, this, Val2, Val3);
8929   Value *Val5 = VectorZip(Builder, Val0, Val4);
8930   llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 8);
8931   return Builder.CreateTrunc(Val5, Val6);
8932 }
8933 case ARM::BI__builtin_arm_mve_vsetq_lane_f16:
8934 case ARM::BI__builtin_arm_mve_vsetq_lane_f32:
8935 case ARM::BI__builtin_arm_mve_vsetq_lane_s16:
8936 case ARM::BI__builtin_arm_mve_vsetq_lane_s32:
8937 case ARM::BI__builtin_arm_mve_vsetq_lane_s64:
8938 case ARM::BI__builtin_arm_mve_vsetq_lane_s8:
8939 case ARM::BI__builtin_arm_mve_vsetq_lane_u16:
8940 case ARM::BI__builtin_arm_mve_vsetq_lane_u32:
8941 case ARM::BI__builtin_arm_mve_vsetq_lane_u64:
8942 case ARM::BI__builtin_arm_mve_vsetq_lane_u8: {
8943   Value *Val0 = EmitScalarExpr(E->getArg(1));
8944   Value *Val1 = EmitScalarExpr(E->getArg(0));
8945   Value *Val2 = EmitScalarExpr(E->getArg(2));
8946   return Builder.CreateInsertElement(Val0, Val1, Val2);
8947 }
8948 case ARM::BI__builtin_arm_mve_vfmaq_m_f16:
8949 case ARM::BI__builtin_arm_mve_vfmaq_m_f32: {
8950   llvm::Type * Param0;
8951   llvm::Type * Param1;
8952   switch (BuiltinID) {
8953   case ARM::BI__builtin_arm_mve_vfmaq_m_f16:
8954     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
8955     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
8956     break;
8957   case ARM::BI__builtin_arm_mve_vfmaq_m_f32:
8958     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8959     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
8960     break;
8961   }
8962   Value *Val0 = EmitScalarExpr(E->getArg(1));
8963   Value *Val1 = EmitScalarExpr(E->getArg(2));
8964   Value *Val2 = (Val1);
8965   Value *Val3 = EmitScalarExpr(E->getArg(0));
8966   Value *Val4 = EmitScalarExpr(E->getArg(3));
8967   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
8968   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val5});
8969   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_fma_predicated, {Param1, Param0}), {Val0, Val2, Val3, Val6});
8970 }
8971 case ARM::BI__builtin_arm_mve_vfmaq_f16:
8972 case ARM::BI__builtin_arm_mve_vfmaq_f32: {
8973   llvm::Type * Param0;
8974   switch (BuiltinID) {
8975   case ARM::BI__builtin_arm_mve_vfmaq_f16:
8976     Param0 = llvm::FixedVectorType::get(HalfTy, 8);
8977     break;
8978   case ARM::BI__builtin_arm_mve_vfmaq_f32:
8979     Param0 = llvm::FixedVectorType::get(FloatTy, 4);
8980     break;
8981   }
8982   Value *Val0 = EmitScalarExpr(E->getArg(1));
8983   Value *Val1 = EmitScalarExpr(E->getArg(2));
8984   Value *Val2 = (Val1);
8985   Value *Val3 = EmitScalarExpr(E->getArg(0));
8986   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fma, {Param0}), {Val0, Val2, Val3});
8987 }
8988 case ARM::BI__builtin_arm_mve_vmlaq_n_s16:
8989 case ARM::BI__builtin_arm_mve_vmlaq_n_s32:
8990 case ARM::BI__builtin_arm_mve_vmlaq_n_s8:
8991 case ARM::BI__builtin_arm_mve_vmlaq_n_u16:
8992 case ARM::BI__builtin_arm_mve_vmlaq_n_u32:
8993 case ARM::BI__builtin_arm_mve_vmlaq_n_u8: {
8994   Value *Val0 = EmitScalarExpr(E->getArg(1));
8995   Value *Val1 = EmitScalarExpr(E->getArg(2));
8996   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
8997   Value *Val3 = Builder.CreateMul(Val0, Val2);
8998   Value *Val4 = EmitScalarExpr(E->getArg(0));
8999   return Builder.CreateAdd(Val3, Val4);
9000 }
9001 case ARM::BI__builtin_arm_mve_vaddq_m_n_f16:
9002 case ARM::BI__builtin_arm_mve_vaddq_m_n_f32:
9003 case ARM::BI__builtin_arm_mve_vaddq_m_n_s16:
9004 case ARM::BI__builtin_arm_mve_vaddq_m_n_s32:
9005 case ARM::BI__builtin_arm_mve_vaddq_m_n_s8:
9006 case ARM::BI__builtin_arm_mve_vaddq_m_n_u16:
9007 case ARM::BI__builtin_arm_mve_vaddq_m_n_u32:
9008 case ARM::BI__builtin_arm_mve_vaddq_m_n_u8:
9009 case ARM::BI__builtin_arm_mve_vmulq_m_n_f16:
9010 case ARM::BI__builtin_arm_mve_vmulq_m_n_f32:
9011 case ARM::BI__builtin_arm_mve_vmulq_m_n_s16:
9012 case ARM::BI__builtin_arm_mve_vmulq_m_n_s32:
9013 case ARM::BI__builtin_arm_mve_vmulq_m_n_s8:
9014 case ARM::BI__builtin_arm_mve_vmulq_m_n_u16:
9015 case ARM::BI__builtin_arm_mve_vmulq_m_n_u32:
9016 case ARM::BI__builtin_arm_mve_vmulq_m_n_u8:
9017 case ARM::BI__builtin_arm_mve_vqdmulhq_m_n_s16:
9018 case ARM::BI__builtin_arm_mve_vqdmulhq_m_n_s32:
9019 case ARM::BI__builtin_arm_mve_vqdmulhq_m_n_s8:
9020 case ARM::BI__builtin_arm_mve_vqrdmulhq_m_n_s16:
9021 case ARM::BI__builtin_arm_mve_vqrdmulhq_m_n_s32:
9022 case ARM::BI__builtin_arm_mve_vqrdmulhq_m_n_s8:
9023 case ARM::BI__builtin_arm_mve_vsubq_m_n_f16:
9024 case ARM::BI__builtin_arm_mve_vsubq_m_n_f32:
9025 case ARM::BI__builtin_arm_mve_vsubq_m_n_s16:
9026 case ARM::BI__builtin_arm_mve_vsubq_m_n_s32:
9027 case ARM::BI__builtin_arm_mve_vsubq_m_n_s8:
9028 case ARM::BI__builtin_arm_mve_vsubq_m_n_u16:
9029 case ARM::BI__builtin_arm_mve_vsubq_m_n_u32:
9030 case ARM::BI__builtin_arm_mve_vsubq_m_n_u8: {
9031   llvm::Type * Param0;
9032   Intrinsic::ID  Param1;
9033   llvm::Type * Param2;
9034   switch (BuiltinID) {
9035   case ARM::BI__builtin_arm_mve_vaddq_m_n_f16:
9036     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9037     Param1 = Intrinsic::arm_mve_add_predicated;
9038     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9039     break;
9040   case ARM::BI__builtin_arm_mve_vaddq_m_n_f32:
9041     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9042     Param1 = Intrinsic::arm_mve_add_predicated;
9043     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9044     break;
9045   case ARM::BI__builtin_arm_mve_vaddq_m_n_s16:
9046     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9047     Param1 = Intrinsic::arm_mve_add_predicated;
9048     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9049     break;
9050   case ARM::BI__builtin_arm_mve_vaddq_m_n_s32:
9051     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9052     Param1 = Intrinsic::arm_mve_add_predicated;
9053     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9054     break;
9055   case ARM::BI__builtin_arm_mve_vaddq_m_n_s8:
9056     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9057     Param1 = Intrinsic::arm_mve_add_predicated;
9058     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9059     break;
9060   case ARM::BI__builtin_arm_mve_vaddq_m_n_u16:
9061     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9062     Param1 = Intrinsic::arm_mve_add_predicated;
9063     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9064     break;
9065   case ARM::BI__builtin_arm_mve_vaddq_m_n_u32:
9066     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9067     Param1 = Intrinsic::arm_mve_add_predicated;
9068     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9069     break;
9070   case ARM::BI__builtin_arm_mve_vaddq_m_n_u8:
9071     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9072     Param1 = Intrinsic::arm_mve_add_predicated;
9073     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9074     break;
9075   case ARM::BI__builtin_arm_mve_vmulq_m_n_f16:
9076     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9077     Param1 = Intrinsic::arm_mve_mul_predicated;
9078     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9079     break;
9080   case ARM::BI__builtin_arm_mve_vmulq_m_n_f32:
9081     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9082     Param1 = Intrinsic::arm_mve_mul_predicated;
9083     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9084     break;
9085   case ARM::BI__builtin_arm_mve_vmulq_m_n_s16:
9086     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9087     Param1 = Intrinsic::arm_mve_mul_predicated;
9088     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9089     break;
9090   case ARM::BI__builtin_arm_mve_vmulq_m_n_s32:
9091     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9092     Param1 = Intrinsic::arm_mve_mul_predicated;
9093     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9094     break;
9095   case ARM::BI__builtin_arm_mve_vmulq_m_n_s8:
9096     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9097     Param1 = Intrinsic::arm_mve_mul_predicated;
9098     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9099     break;
9100   case ARM::BI__builtin_arm_mve_vmulq_m_n_u16:
9101     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9102     Param1 = Intrinsic::arm_mve_mul_predicated;
9103     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9104     break;
9105   case ARM::BI__builtin_arm_mve_vmulq_m_n_u32:
9106     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9107     Param1 = Intrinsic::arm_mve_mul_predicated;
9108     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9109     break;
9110   case ARM::BI__builtin_arm_mve_vmulq_m_n_u8:
9111     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9112     Param1 = Intrinsic::arm_mve_mul_predicated;
9113     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9114     break;
9115   case ARM::BI__builtin_arm_mve_vqdmulhq_m_n_s16:
9116     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9117     Param1 = Intrinsic::arm_mve_qdmulh_predicated;
9118     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9119     break;
9120   case ARM::BI__builtin_arm_mve_vqdmulhq_m_n_s32:
9121     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9122     Param1 = Intrinsic::arm_mve_qdmulh_predicated;
9123     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9124     break;
9125   case ARM::BI__builtin_arm_mve_vqdmulhq_m_n_s8:
9126     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9127     Param1 = Intrinsic::arm_mve_qdmulh_predicated;
9128     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9129     break;
9130   case ARM::BI__builtin_arm_mve_vqrdmulhq_m_n_s16:
9131     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9132     Param1 = Intrinsic::arm_mve_qrdmulh_predicated;
9133     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9134     break;
9135   case ARM::BI__builtin_arm_mve_vqrdmulhq_m_n_s32:
9136     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9137     Param1 = Intrinsic::arm_mve_qrdmulh_predicated;
9138     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9139     break;
9140   case ARM::BI__builtin_arm_mve_vqrdmulhq_m_n_s8:
9141     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9142     Param1 = Intrinsic::arm_mve_qrdmulh_predicated;
9143     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9144     break;
9145   case ARM::BI__builtin_arm_mve_vsubq_m_n_f16:
9146     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9147     Param1 = Intrinsic::arm_mve_sub_predicated;
9148     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9149     break;
9150   case ARM::BI__builtin_arm_mve_vsubq_m_n_f32:
9151     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9152     Param1 = Intrinsic::arm_mve_sub_predicated;
9153     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9154     break;
9155   case ARM::BI__builtin_arm_mve_vsubq_m_n_s16:
9156     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9157     Param1 = Intrinsic::arm_mve_sub_predicated;
9158     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9159     break;
9160   case ARM::BI__builtin_arm_mve_vsubq_m_n_s32:
9161     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9162     Param1 = Intrinsic::arm_mve_sub_predicated;
9163     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9164     break;
9165   case ARM::BI__builtin_arm_mve_vsubq_m_n_s8:
9166     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9167     Param1 = Intrinsic::arm_mve_sub_predicated;
9168     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9169     break;
9170   case ARM::BI__builtin_arm_mve_vsubq_m_n_u16:
9171     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9172     Param1 = Intrinsic::arm_mve_sub_predicated;
9173     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9174     break;
9175   case ARM::BI__builtin_arm_mve_vsubq_m_n_u32:
9176     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9177     Param1 = Intrinsic::arm_mve_sub_predicated;
9178     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9179     break;
9180   case ARM::BI__builtin_arm_mve_vsubq_m_n_u8:
9181     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9182     Param1 = Intrinsic::arm_mve_sub_predicated;
9183     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9184     break;
9185   }
9186   Value *Val0 = EmitScalarExpr(E->getArg(1));
9187   Value *Val1 = EmitScalarExpr(E->getArg(2));
9188   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
9189   Value *Val3 = EmitScalarExpr(E->getArg(3));
9190   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
9191   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val4});
9192   Value *Val6 = EmitScalarExpr(E->getArg(0));
9193   return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val2, Val5, Val6});
9194 }
9195 case ARM::BI__builtin_arm_mve_vqdmullbq_m_n_s16:
9196 case ARM::BI__builtin_arm_mve_vqdmullbq_m_n_s32:
9197 case ARM::BI__builtin_arm_mve_vqdmulltq_m_n_s16:
9198 case ARM::BI__builtin_arm_mve_vqdmulltq_m_n_s32: {
9199   uint32_t  Param0;
9200   llvm::Type * Param1;
9201   llvm::Type * Param2;
9202   llvm::Type * Param3;
9203   switch (BuiltinID) {
9204   case ARM::BI__builtin_arm_mve_vqdmullbq_m_n_s16:
9205     Param0 = 0;
9206     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9207     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9208     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9209     break;
9210   case ARM::BI__builtin_arm_mve_vqdmullbq_m_n_s32:
9211     Param0 = 0;
9212     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
9213     Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
9214     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9215     break;
9216   case ARM::BI__builtin_arm_mve_vqdmulltq_m_n_s16:
9217     Param0 = 1;
9218     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9219     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9220     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9221     break;
9222   case ARM::BI__builtin_arm_mve_vqdmulltq_m_n_s32:
9223     Param0 = 1;
9224     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
9225     Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
9226     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9227     break;
9228   }
9229   Value *Val0 = EmitScalarExpr(E->getArg(1));
9230   Value *Val1 = EmitScalarExpr(E->getArg(2));
9231   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
9232   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
9233   Value *Val4 = EmitScalarExpr(E->getArg(3));
9234   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
9235   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val5});
9236   Value *Val7 = EmitScalarExpr(E->getArg(0));
9237   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vqdmull_predicated, {Param2, Param3, Param1}), {Val0, Val2, Val3, Val6, Val7});
9238 }
9239 case ARM::BI__builtin_arm_mve_vhaddq_m_n_s16:
9240 case ARM::BI__builtin_arm_mve_vhaddq_m_n_s32:
9241 case ARM::BI__builtin_arm_mve_vhaddq_m_n_s8:
9242 case ARM::BI__builtin_arm_mve_vhaddq_m_n_u16:
9243 case ARM::BI__builtin_arm_mve_vhaddq_m_n_u32:
9244 case ARM::BI__builtin_arm_mve_vhaddq_m_n_u8:
9245 case ARM::BI__builtin_arm_mve_vhsubq_m_n_s16:
9246 case ARM::BI__builtin_arm_mve_vhsubq_m_n_s32:
9247 case ARM::BI__builtin_arm_mve_vhsubq_m_n_s8:
9248 case ARM::BI__builtin_arm_mve_vhsubq_m_n_u16:
9249 case ARM::BI__builtin_arm_mve_vhsubq_m_n_u32:
9250 case ARM::BI__builtin_arm_mve_vhsubq_m_n_u8:
9251 case ARM::BI__builtin_arm_mve_vqaddq_m_n_s16:
9252 case ARM::BI__builtin_arm_mve_vqaddq_m_n_s32:
9253 case ARM::BI__builtin_arm_mve_vqaddq_m_n_s8:
9254 case ARM::BI__builtin_arm_mve_vqaddq_m_n_u16:
9255 case ARM::BI__builtin_arm_mve_vqaddq_m_n_u32:
9256 case ARM::BI__builtin_arm_mve_vqaddq_m_n_u8:
9257 case ARM::BI__builtin_arm_mve_vqsubq_m_n_s16:
9258 case ARM::BI__builtin_arm_mve_vqsubq_m_n_s32:
9259 case ARM::BI__builtin_arm_mve_vqsubq_m_n_s8:
9260 case ARM::BI__builtin_arm_mve_vqsubq_m_n_u16:
9261 case ARM::BI__builtin_arm_mve_vqsubq_m_n_u32:
9262 case ARM::BI__builtin_arm_mve_vqsubq_m_n_u8: {
9263   uint32_t  Param0;
9264   llvm::Type * Param1;
9265   Intrinsic::ID  Param2;
9266   llvm::Type * Param3;
9267   switch (BuiltinID) {
9268   case ARM::BI__builtin_arm_mve_vhaddq_m_n_s16:
9269     Param0 = 0;
9270     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9271     Param2 = Intrinsic::arm_mve_hadd_predicated;
9272     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9273     break;
9274   case ARM::BI__builtin_arm_mve_vhaddq_m_n_s32:
9275     Param0 = 0;
9276     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9277     Param2 = Intrinsic::arm_mve_hadd_predicated;
9278     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9279     break;
9280   case ARM::BI__builtin_arm_mve_vhaddq_m_n_s8:
9281     Param0 = 0;
9282     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9283     Param2 = Intrinsic::arm_mve_hadd_predicated;
9284     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
9285     break;
9286   case ARM::BI__builtin_arm_mve_vhaddq_m_n_u16:
9287     Param0 = 1;
9288     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9289     Param2 = Intrinsic::arm_mve_hadd_predicated;
9290     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9291     break;
9292   case ARM::BI__builtin_arm_mve_vhaddq_m_n_u32:
9293     Param0 = 1;
9294     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9295     Param2 = Intrinsic::arm_mve_hadd_predicated;
9296     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9297     break;
9298   case ARM::BI__builtin_arm_mve_vhaddq_m_n_u8:
9299     Param0 = 1;
9300     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9301     Param2 = Intrinsic::arm_mve_hadd_predicated;
9302     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
9303     break;
9304   case ARM::BI__builtin_arm_mve_vhsubq_m_n_s16:
9305     Param0 = 0;
9306     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9307     Param2 = Intrinsic::arm_mve_hsub_predicated;
9308     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9309     break;
9310   case ARM::BI__builtin_arm_mve_vhsubq_m_n_s32:
9311     Param0 = 0;
9312     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9313     Param2 = Intrinsic::arm_mve_hsub_predicated;
9314     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9315     break;
9316   case ARM::BI__builtin_arm_mve_vhsubq_m_n_s8:
9317     Param0 = 0;
9318     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9319     Param2 = Intrinsic::arm_mve_hsub_predicated;
9320     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
9321     break;
9322   case ARM::BI__builtin_arm_mve_vhsubq_m_n_u16:
9323     Param0 = 1;
9324     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9325     Param2 = Intrinsic::arm_mve_hsub_predicated;
9326     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9327     break;
9328   case ARM::BI__builtin_arm_mve_vhsubq_m_n_u32:
9329     Param0 = 1;
9330     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9331     Param2 = Intrinsic::arm_mve_hsub_predicated;
9332     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9333     break;
9334   case ARM::BI__builtin_arm_mve_vhsubq_m_n_u8:
9335     Param0 = 1;
9336     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9337     Param2 = Intrinsic::arm_mve_hsub_predicated;
9338     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
9339     break;
9340   case ARM::BI__builtin_arm_mve_vqaddq_m_n_s16:
9341     Param0 = 0;
9342     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9343     Param2 = Intrinsic::arm_mve_qadd_predicated;
9344     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9345     break;
9346   case ARM::BI__builtin_arm_mve_vqaddq_m_n_s32:
9347     Param0 = 0;
9348     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9349     Param2 = Intrinsic::arm_mve_qadd_predicated;
9350     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9351     break;
9352   case ARM::BI__builtin_arm_mve_vqaddq_m_n_s8:
9353     Param0 = 0;
9354     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9355     Param2 = Intrinsic::arm_mve_qadd_predicated;
9356     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
9357     break;
9358   case ARM::BI__builtin_arm_mve_vqaddq_m_n_u16:
9359     Param0 = 1;
9360     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9361     Param2 = Intrinsic::arm_mve_qadd_predicated;
9362     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9363     break;
9364   case ARM::BI__builtin_arm_mve_vqaddq_m_n_u32:
9365     Param0 = 1;
9366     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9367     Param2 = Intrinsic::arm_mve_qadd_predicated;
9368     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9369     break;
9370   case ARM::BI__builtin_arm_mve_vqaddq_m_n_u8:
9371     Param0 = 1;
9372     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9373     Param2 = Intrinsic::arm_mve_qadd_predicated;
9374     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
9375     break;
9376   case ARM::BI__builtin_arm_mve_vqsubq_m_n_s16:
9377     Param0 = 0;
9378     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9379     Param2 = Intrinsic::arm_mve_qsub_predicated;
9380     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9381     break;
9382   case ARM::BI__builtin_arm_mve_vqsubq_m_n_s32:
9383     Param0 = 0;
9384     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9385     Param2 = Intrinsic::arm_mve_qsub_predicated;
9386     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9387     break;
9388   case ARM::BI__builtin_arm_mve_vqsubq_m_n_s8:
9389     Param0 = 0;
9390     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9391     Param2 = Intrinsic::arm_mve_qsub_predicated;
9392     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
9393     break;
9394   case ARM::BI__builtin_arm_mve_vqsubq_m_n_u16:
9395     Param0 = 1;
9396     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9397     Param2 = Intrinsic::arm_mve_qsub_predicated;
9398     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9399     break;
9400   case ARM::BI__builtin_arm_mve_vqsubq_m_n_u32:
9401     Param0 = 1;
9402     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9403     Param2 = Intrinsic::arm_mve_qsub_predicated;
9404     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9405     break;
9406   case ARM::BI__builtin_arm_mve_vqsubq_m_n_u8:
9407     Param0 = 1;
9408     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9409     Param2 = Intrinsic::arm_mve_qsub_predicated;
9410     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
9411     break;
9412   }
9413   Value *Val0 = EmitScalarExpr(E->getArg(1));
9414   Value *Val1 = EmitScalarExpr(E->getArg(2));
9415   Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
9416   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
9417   Value *Val4 = EmitScalarExpr(E->getArg(3));
9418   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
9419   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val5});
9420   Value *Val7 = EmitScalarExpr(E->getArg(0));
9421   return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param1}), {Val0, Val2, Val3, Val6, Val7});
9422 }
9423 case ARM::BI__builtin_arm_mve_vfmsq_m_f16:
9424 case ARM::BI__builtin_arm_mve_vfmsq_m_f32: {
9425   llvm::Type * Param0;
9426   llvm::Type * Param1;
9427   switch (BuiltinID) {
9428   case ARM::BI__builtin_arm_mve_vfmsq_m_f16:
9429     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9430     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
9431     break;
9432   case ARM::BI__builtin_arm_mve_vfmsq_m_f32:
9433     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9434     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
9435     break;
9436   }
9437   Value *Val0 = EmitScalarExpr(E->getArg(1));
9438   Value *Val1 = EmitScalarExpr(E->getArg(2));
9439   Value *Val2 = Builder.CreateFNeg(Val1);
9440   Value *Val3 = EmitScalarExpr(E->getArg(0));
9441   Value *Val4 = EmitScalarExpr(E->getArg(3));
9442   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
9443   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val5});
9444   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_fma_predicated, {Param1, Param0}), {Val0, Val2, Val3, Val6});
9445 }
9446 case ARM::BI__builtin_arm_mve_vfmsq_f16:
9447 case ARM::BI__builtin_arm_mve_vfmsq_f32: {
9448   llvm::Type * Param0;
9449   switch (BuiltinID) {
9450   case ARM::BI__builtin_arm_mve_vfmsq_f16:
9451     Param0 = llvm::FixedVectorType::get(HalfTy, 8);
9452     break;
9453   case ARM::BI__builtin_arm_mve_vfmsq_f32:
9454     Param0 = llvm::FixedVectorType::get(FloatTy, 4);
9455     break;
9456   }
9457   Value *Val0 = EmitScalarExpr(E->getArg(1));
9458   Value *Val1 = EmitScalarExpr(E->getArg(2));
9459   Value *Val2 = Builder.CreateFNeg(Val1);
9460   Value *Val3 = EmitScalarExpr(E->getArg(0));
9461   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fma, {Param0}), {Val0, Val2, Val3});
9462 }
9463 case ARM::BI__builtin_arm_mve_vabsq_m_f16:
9464 case ARM::BI__builtin_arm_mve_vabsq_m_f32:
9465 case ARM::BI__builtin_arm_mve_vabsq_m_s16:
9466 case ARM::BI__builtin_arm_mve_vabsq_m_s32:
9467 case ARM::BI__builtin_arm_mve_vabsq_m_s8:
9468 case ARM::BI__builtin_arm_mve_vclsq_m_s16:
9469 case ARM::BI__builtin_arm_mve_vclsq_m_s32:
9470 case ARM::BI__builtin_arm_mve_vclsq_m_s8:
9471 case ARM::BI__builtin_arm_mve_vclzq_m_s16:
9472 case ARM::BI__builtin_arm_mve_vclzq_m_s32:
9473 case ARM::BI__builtin_arm_mve_vclzq_m_s8:
9474 case ARM::BI__builtin_arm_mve_vclzq_m_u16:
9475 case ARM::BI__builtin_arm_mve_vclzq_m_u32:
9476 case ARM::BI__builtin_arm_mve_vclzq_m_u8:
9477 case ARM::BI__builtin_arm_mve_vmvnq_m_s16:
9478 case ARM::BI__builtin_arm_mve_vmvnq_m_s32:
9479 case ARM::BI__builtin_arm_mve_vmvnq_m_s8:
9480 case ARM::BI__builtin_arm_mve_vmvnq_m_u16:
9481 case ARM::BI__builtin_arm_mve_vmvnq_m_u32:
9482 case ARM::BI__builtin_arm_mve_vmvnq_m_u8:
9483 case ARM::BI__builtin_arm_mve_vnegq_m_f16:
9484 case ARM::BI__builtin_arm_mve_vnegq_m_f32:
9485 case ARM::BI__builtin_arm_mve_vnegq_m_s16:
9486 case ARM::BI__builtin_arm_mve_vnegq_m_s32:
9487 case ARM::BI__builtin_arm_mve_vnegq_m_s8:
9488 case ARM::BI__builtin_arm_mve_vqabsq_m_s16:
9489 case ARM::BI__builtin_arm_mve_vqabsq_m_s32:
9490 case ARM::BI__builtin_arm_mve_vqabsq_m_s8:
9491 case ARM::BI__builtin_arm_mve_vqnegq_m_s16:
9492 case ARM::BI__builtin_arm_mve_vqnegq_m_s32:
9493 case ARM::BI__builtin_arm_mve_vqnegq_m_s8:
9494 case ARM::BI__builtin_arm_mve_vrndaq_m_f16:
9495 case ARM::BI__builtin_arm_mve_vrndaq_m_f32:
9496 case ARM::BI__builtin_arm_mve_vrndmq_m_f16:
9497 case ARM::BI__builtin_arm_mve_vrndmq_m_f32:
9498 case ARM::BI__builtin_arm_mve_vrndnq_m_f16:
9499 case ARM::BI__builtin_arm_mve_vrndnq_m_f32:
9500 case ARM::BI__builtin_arm_mve_vrndpq_m_f16:
9501 case ARM::BI__builtin_arm_mve_vrndpq_m_f32:
9502 case ARM::BI__builtin_arm_mve_vrndq_m_f16:
9503 case ARM::BI__builtin_arm_mve_vrndq_m_f32:
9504 case ARM::BI__builtin_arm_mve_vrndxq_m_f16:
9505 case ARM::BI__builtin_arm_mve_vrndxq_m_f32: {
9506   llvm::Type * Param0;
9507   Intrinsic::ID  Param1;
9508   llvm::Type * Param2;
9509   switch (BuiltinID) {
9510   case ARM::BI__builtin_arm_mve_vabsq_m_f16:
9511     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9512     Param1 = Intrinsic::arm_mve_abs_predicated;
9513     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9514     break;
9515   case ARM::BI__builtin_arm_mve_vabsq_m_f32:
9516     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9517     Param1 = Intrinsic::arm_mve_abs_predicated;
9518     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9519     break;
9520   case ARM::BI__builtin_arm_mve_vabsq_m_s16:
9521     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9522     Param1 = Intrinsic::arm_mve_abs_predicated;
9523     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9524     break;
9525   case ARM::BI__builtin_arm_mve_vabsq_m_s32:
9526     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9527     Param1 = Intrinsic::arm_mve_abs_predicated;
9528     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9529     break;
9530   case ARM::BI__builtin_arm_mve_vabsq_m_s8:
9531     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9532     Param1 = Intrinsic::arm_mve_abs_predicated;
9533     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9534     break;
9535   case ARM::BI__builtin_arm_mve_vclsq_m_s16:
9536     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9537     Param1 = Intrinsic::arm_mve_cls_predicated;
9538     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9539     break;
9540   case ARM::BI__builtin_arm_mve_vclsq_m_s32:
9541     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9542     Param1 = Intrinsic::arm_mve_cls_predicated;
9543     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9544     break;
9545   case ARM::BI__builtin_arm_mve_vclsq_m_s8:
9546     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9547     Param1 = Intrinsic::arm_mve_cls_predicated;
9548     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9549     break;
9550   case ARM::BI__builtin_arm_mve_vclzq_m_s16:
9551     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9552     Param1 = Intrinsic::arm_mve_clz_predicated;
9553     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9554     break;
9555   case ARM::BI__builtin_arm_mve_vclzq_m_s32:
9556     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9557     Param1 = Intrinsic::arm_mve_clz_predicated;
9558     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9559     break;
9560   case ARM::BI__builtin_arm_mve_vclzq_m_s8:
9561     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9562     Param1 = Intrinsic::arm_mve_clz_predicated;
9563     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9564     break;
9565   case ARM::BI__builtin_arm_mve_vclzq_m_u16:
9566     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9567     Param1 = Intrinsic::arm_mve_clz_predicated;
9568     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9569     break;
9570   case ARM::BI__builtin_arm_mve_vclzq_m_u32:
9571     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9572     Param1 = Intrinsic::arm_mve_clz_predicated;
9573     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9574     break;
9575   case ARM::BI__builtin_arm_mve_vclzq_m_u8:
9576     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9577     Param1 = Intrinsic::arm_mve_clz_predicated;
9578     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9579     break;
9580   case ARM::BI__builtin_arm_mve_vmvnq_m_s16:
9581     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9582     Param1 = Intrinsic::arm_mve_mvn_predicated;
9583     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9584     break;
9585   case ARM::BI__builtin_arm_mve_vmvnq_m_s32:
9586     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9587     Param1 = Intrinsic::arm_mve_mvn_predicated;
9588     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9589     break;
9590   case ARM::BI__builtin_arm_mve_vmvnq_m_s8:
9591     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9592     Param1 = Intrinsic::arm_mve_mvn_predicated;
9593     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9594     break;
9595   case ARM::BI__builtin_arm_mve_vmvnq_m_u16:
9596     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9597     Param1 = Intrinsic::arm_mve_mvn_predicated;
9598     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9599     break;
9600   case ARM::BI__builtin_arm_mve_vmvnq_m_u32:
9601     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9602     Param1 = Intrinsic::arm_mve_mvn_predicated;
9603     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9604     break;
9605   case ARM::BI__builtin_arm_mve_vmvnq_m_u8:
9606     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9607     Param1 = Intrinsic::arm_mve_mvn_predicated;
9608     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9609     break;
9610   case ARM::BI__builtin_arm_mve_vnegq_m_f16:
9611     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9612     Param1 = Intrinsic::arm_mve_neg_predicated;
9613     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9614     break;
9615   case ARM::BI__builtin_arm_mve_vnegq_m_f32:
9616     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9617     Param1 = Intrinsic::arm_mve_neg_predicated;
9618     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9619     break;
9620   case ARM::BI__builtin_arm_mve_vnegq_m_s16:
9621     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9622     Param1 = Intrinsic::arm_mve_neg_predicated;
9623     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9624     break;
9625   case ARM::BI__builtin_arm_mve_vnegq_m_s32:
9626     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9627     Param1 = Intrinsic::arm_mve_neg_predicated;
9628     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9629     break;
9630   case ARM::BI__builtin_arm_mve_vnegq_m_s8:
9631     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9632     Param1 = Intrinsic::arm_mve_neg_predicated;
9633     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9634     break;
9635   case ARM::BI__builtin_arm_mve_vqabsq_m_s16:
9636     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9637     Param1 = Intrinsic::arm_mve_qabs_predicated;
9638     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9639     break;
9640   case ARM::BI__builtin_arm_mve_vqabsq_m_s32:
9641     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9642     Param1 = Intrinsic::arm_mve_qabs_predicated;
9643     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9644     break;
9645   case ARM::BI__builtin_arm_mve_vqabsq_m_s8:
9646     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9647     Param1 = Intrinsic::arm_mve_qabs_predicated;
9648     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9649     break;
9650   case ARM::BI__builtin_arm_mve_vqnegq_m_s16:
9651     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9652     Param1 = Intrinsic::arm_mve_qneg_predicated;
9653     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9654     break;
9655   case ARM::BI__builtin_arm_mve_vqnegq_m_s32:
9656     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9657     Param1 = Intrinsic::arm_mve_qneg_predicated;
9658     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9659     break;
9660   case ARM::BI__builtin_arm_mve_vqnegq_m_s8:
9661     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9662     Param1 = Intrinsic::arm_mve_qneg_predicated;
9663     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9664     break;
9665   case ARM::BI__builtin_arm_mve_vrndaq_m_f16:
9666     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9667     Param1 = Intrinsic::arm_mve_vrinta_predicated;
9668     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9669     break;
9670   case ARM::BI__builtin_arm_mve_vrndaq_m_f32:
9671     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9672     Param1 = Intrinsic::arm_mve_vrinta_predicated;
9673     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9674     break;
9675   case ARM::BI__builtin_arm_mve_vrndmq_m_f16:
9676     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9677     Param1 = Intrinsic::arm_mve_vrintm_predicated;
9678     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9679     break;
9680   case ARM::BI__builtin_arm_mve_vrndmq_m_f32:
9681     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9682     Param1 = Intrinsic::arm_mve_vrintm_predicated;
9683     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9684     break;
9685   case ARM::BI__builtin_arm_mve_vrndnq_m_f16:
9686     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9687     Param1 = Intrinsic::arm_mve_vrintn_predicated;
9688     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9689     break;
9690   case ARM::BI__builtin_arm_mve_vrndnq_m_f32:
9691     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9692     Param1 = Intrinsic::arm_mve_vrintn_predicated;
9693     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9694     break;
9695   case ARM::BI__builtin_arm_mve_vrndpq_m_f16:
9696     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9697     Param1 = Intrinsic::arm_mve_vrintp_predicated;
9698     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9699     break;
9700   case ARM::BI__builtin_arm_mve_vrndpq_m_f32:
9701     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9702     Param1 = Intrinsic::arm_mve_vrintp_predicated;
9703     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9704     break;
9705   case ARM::BI__builtin_arm_mve_vrndq_m_f16:
9706     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9707     Param1 = Intrinsic::arm_mve_vrintz_predicated;
9708     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9709     break;
9710   case ARM::BI__builtin_arm_mve_vrndq_m_f32:
9711     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9712     Param1 = Intrinsic::arm_mve_vrintz_predicated;
9713     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9714     break;
9715   case ARM::BI__builtin_arm_mve_vrndxq_m_f16:
9716     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9717     Param1 = Intrinsic::arm_mve_vrintx_predicated;
9718     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9719     break;
9720   case ARM::BI__builtin_arm_mve_vrndxq_m_f32:
9721     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9722     Param1 = Intrinsic::arm_mve_vrintx_predicated;
9723     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9724     break;
9725   }
9726   Value *Val0 = EmitScalarExpr(E->getArg(1));
9727   Value *Val1 = EmitScalarExpr(E->getArg(2));
9728   Value *Val2 = Builder.CreateIntCast(Val1, Int32Ty, false);
9729   Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val2});
9730   Value *Val4 = EmitScalarExpr(E->getArg(0));
9731   return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val3, Val4});
9732 }
9733 case ARM::BI__builtin_arm_mve_vaddq_m_f16:
9734 case ARM::BI__builtin_arm_mve_vaddq_m_f32:
9735 case ARM::BI__builtin_arm_mve_vaddq_m_s16:
9736 case ARM::BI__builtin_arm_mve_vaddq_m_s32:
9737 case ARM::BI__builtin_arm_mve_vaddq_m_s8:
9738 case ARM::BI__builtin_arm_mve_vaddq_m_u16:
9739 case ARM::BI__builtin_arm_mve_vaddq_m_u32:
9740 case ARM::BI__builtin_arm_mve_vaddq_m_u8:
9741 case ARM::BI__builtin_arm_mve_vmulq_m_f16:
9742 case ARM::BI__builtin_arm_mve_vmulq_m_f32:
9743 case ARM::BI__builtin_arm_mve_vmulq_m_s16:
9744 case ARM::BI__builtin_arm_mve_vmulq_m_s32:
9745 case ARM::BI__builtin_arm_mve_vmulq_m_s8:
9746 case ARM::BI__builtin_arm_mve_vmulq_m_u16:
9747 case ARM::BI__builtin_arm_mve_vmulq_m_u32:
9748 case ARM::BI__builtin_arm_mve_vmulq_m_u8:
9749 case ARM::BI__builtin_arm_mve_vqdmulhq_m_s16:
9750 case ARM::BI__builtin_arm_mve_vqdmulhq_m_s32:
9751 case ARM::BI__builtin_arm_mve_vqdmulhq_m_s8:
9752 case ARM::BI__builtin_arm_mve_vqrdmulhq_m_s16:
9753 case ARM::BI__builtin_arm_mve_vqrdmulhq_m_s32:
9754 case ARM::BI__builtin_arm_mve_vqrdmulhq_m_s8:
9755 case ARM::BI__builtin_arm_mve_vqshluq_m_n_s16:
9756 case ARM::BI__builtin_arm_mve_vqshluq_m_n_s32:
9757 case ARM::BI__builtin_arm_mve_vqshluq_m_n_s8:
9758 case ARM::BI__builtin_arm_mve_vshlq_m_n_s16:
9759 case ARM::BI__builtin_arm_mve_vshlq_m_n_s32:
9760 case ARM::BI__builtin_arm_mve_vshlq_m_n_s8:
9761 case ARM::BI__builtin_arm_mve_vshlq_m_n_u16:
9762 case ARM::BI__builtin_arm_mve_vshlq_m_n_u32:
9763 case ARM::BI__builtin_arm_mve_vshlq_m_n_u8:
9764 case ARM::BI__builtin_arm_mve_vsubq_m_f16:
9765 case ARM::BI__builtin_arm_mve_vsubq_m_f32:
9766 case ARM::BI__builtin_arm_mve_vsubq_m_s16:
9767 case ARM::BI__builtin_arm_mve_vsubq_m_s32:
9768 case ARM::BI__builtin_arm_mve_vsubq_m_s8:
9769 case ARM::BI__builtin_arm_mve_vsubq_m_u16:
9770 case ARM::BI__builtin_arm_mve_vsubq_m_u32:
9771 case ARM::BI__builtin_arm_mve_vsubq_m_u8: {
9772   llvm::Type * Param0;
9773   Intrinsic::ID  Param1;
9774   llvm::Type * Param2;
9775   switch (BuiltinID) {
9776   case ARM::BI__builtin_arm_mve_vaddq_m_f16:
9777     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9778     Param1 = Intrinsic::arm_mve_add_predicated;
9779     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9780     break;
9781   case ARM::BI__builtin_arm_mve_vaddq_m_f32:
9782     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9783     Param1 = Intrinsic::arm_mve_add_predicated;
9784     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9785     break;
9786   case ARM::BI__builtin_arm_mve_vaddq_m_s16:
9787     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9788     Param1 = Intrinsic::arm_mve_add_predicated;
9789     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9790     break;
9791   case ARM::BI__builtin_arm_mve_vaddq_m_s32:
9792     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9793     Param1 = Intrinsic::arm_mve_add_predicated;
9794     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9795     break;
9796   case ARM::BI__builtin_arm_mve_vaddq_m_s8:
9797     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9798     Param1 = Intrinsic::arm_mve_add_predicated;
9799     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9800     break;
9801   case ARM::BI__builtin_arm_mve_vaddq_m_u16:
9802     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9803     Param1 = Intrinsic::arm_mve_add_predicated;
9804     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9805     break;
9806   case ARM::BI__builtin_arm_mve_vaddq_m_u32:
9807     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9808     Param1 = Intrinsic::arm_mve_add_predicated;
9809     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9810     break;
9811   case ARM::BI__builtin_arm_mve_vaddq_m_u8:
9812     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9813     Param1 = Intrinsic::arm_mve_add_predicated;
9814     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9815     break;
9816   case ARM::BI__builtin_arm_mve_vmulq_m_f16:
9817     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9818     Param1 = Intrinsic::arm_mve_mul_predicated;
9819     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9820     break;
9821   case ARM::BI__builtin_arm_mve_vmulq_m_f32:
9822     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9823     Param1 = Intrinsic::arm_mve_mul_predicated;
9824     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9825     break;
9826   case ARM::BI__builtin_arm_mve_vmulq_m_s16:
9827     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9828     Param1 = Intrinsic::arm_mve_mul_predicated;
9829     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9830     break;
9831   case ARM::BI__builtin_arm_mve_vmulq_m_s32:
9832     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9833     Param1 = Intrinsic::arm_mve_mul_predicated;
9834     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9835     break;
9836   case ARM::BI__builtin_arm_mve_vmulq_m_s8:
9837     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9838     Param1 = Intrinsic::arm_mve_mul_predicated;
9839     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9840     break;
9841   case ARM::BI__builtin_arm_mve_vmulq_m_u16:
9842     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9843     Param1 = Intrinsic::arm_mve_mul_predicated;
9844     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9845     break;
9846   case ARM::BI__builtin_arm_mve_vmulq_m_u32:
9847     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9848     Param1 = Intrinsic::arm_mve_mul_predicated;
9849     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9850     break;
9851   case ARM::BI__builtin_arm_mve_vmulq_m_u8:
9852     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9853     Param1 = Intrinsic::arm_mve_mul_predicated;
9854     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9855     break;
9856   case ARM::BI__builtin_arm_mve_vqdmulhq_m_s16:
9857     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9858     Param1 = Intrinsic::arm_mve_qdmulh_predicated;
9859     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9860     break;
9861   case ARM::BI__builtin_arm_mve_vqdmulhq_m_s32:
9862     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9863     Param1 = Intrinsic::arm_mve_qdmulh_predicated;
9864     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9865     break;
9866   case ARM::BI__builtin_arm_mve_vqdmulhq_m_s8:
9867     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9868     Param1 = Intrinsic::arm_mve_qdmulh_predicated;
9869     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9870     break;
9871   case ARM::BI__builtin_arm_mve_vqrdmulhq_m_s16:
9872     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9873     Param1 = Intrinsic::arm_mve_qrdmulh_predicated;
9874     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9875     break;
9876   case ARM::BI__builtin_arm_mve_vqrdmulhq_m_s32:
9877     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9878     Param1 = Intrinsic::arm_mve_qrdmulh_predicated;
9879     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9880     break;
9881   case ARM::BI__builtin_arm_mve_vqrdmulhq_m_s8:
9882     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9883     Param1 = Intrinsic::arm_mve_qrdmulh_predicated;
9884     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9885     break;
9886   case ARM::BI__builtin_arm_mve_vqshluq_m_n_s16:
9887     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9888     Param1 = Intrinsic::arm_mve_vqshlu_imm_predicated;
9889     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9890     break;
9891   case ARM::BI__builtin_arm_mve_vqshluq_m_n_s32:
9892     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9893     Param1 = Intrinsic::arm_mve_vqshlu_imm_predicated;
9894     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9895     break;
9896   case ARM::BI__builtin_arm_mve_vqshluq_m_n_s8:
9897     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9898     Param1 = Intrinsic::arm_mve_vqshlu_imm_predicated;
9899     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9900     break;
9901   case ARM::BI__builtin_arm_mve_vshlq_m_n_s16:
9902     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9903     Param1 = Intrinsic::arm_mve_shl_imm_predicated;
9904     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9905     break;
9906   case ARM::BI__builtin_arm_mve_vshlq_m_n_s32:
9907     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9908     Param1 = Intrinsic::arm_mve_shl_imm_predicated;
9909     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9910     break;
9911   case ARM::BI__builtin_arm_mve_vshlq_m_n_s8:
9912     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9913     Param1 = Intrinsic::arm_mve_shl_imm_predicated;
9914     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9915     break;
9916   case ARM::BI__builtin_arm_mve_vshlq_m_n_u16:
9917     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9918     Param1 = Intrinsic::arm_mve_shl_imm_predicated;
9919     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9920     break;
9921   case ARM::BI__builtin_arm_mve_vshlq_m_n_u32:
9922     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9923     Param1 = Intrinsic::arm_mve_shl_imm_predicated;
9924     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9925     break;
9926   case ARM::BI__builtin_arm_mve_vshlq_m_n_u8:
9927     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9928     Param1 = Intrinsic::arm_mve_shl_imm_predicated;
9929     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9930     break;
9931   case ARM::BI__builtin_arm_mve_vsubq_m_f16:
9932     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9933     Param1 = Intrinsic::arm_mve_sub_predicated;
9934     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9935     break;
9936   case ARM::BI__builtin_arm_mve_vsubq_m_f32:
9937     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9938     Param1 = Intrinsic::arm_mve_sub_predicated;
9939     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9940     break;
9941   case ARM::BI__builtin_arm_mve_vsubq_m_s16:
9942     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9943     Param1 = Intrinsic::arm_mve_sub_predicated;
9944     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9945     break;
9946   case ARM::BI__builtin_arm_mve_vsubq_m_s32:
9947     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9948     Param1 = Intrinsic::arm_mve_sub_predicated;
9949     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9950     break;
9951   case ARM::BI__builtin_arm_mve_vsubq_m_s8:
9952     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9953     Param1 = Intrinsic::arm_mve_sub_predicated;
9954     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9955     break;
9956   case ARM::BI__builtin_arm_mve_vsubq_m_u16:
9957     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9958     Param1 = Intrinsic::arm_mve_sub_predicated;
9959     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9960     break;
9961   case ARM::BI__builtin_arm_mve_vsubq_m_u32:
9962     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9963     Param1 = Intrinsic::arm_mve_sub_predicated;
9964     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9965     break;
9966   case ARM::BI__builtin_arm_mve_vsubq_m_u8:
9967     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9968     Param1 = Intrinsic::arm_mve_sub_predicated;
9969     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9970     break;
9971   }
9972   Value *Val0 = EmitScalarExpr(E->getArg(1));
9973   Value *Val1 = EmitScalarExpr(E->getArg(2));
9974   Value *Val2 = EmitScalarExpr(E->getArg(3));
9975   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
9976   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val3});
9977   Value *Val5 = EmitScalarExpr(E->getArg(0));
9978   return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val1, Val4, Val5});
9979 }
9980 case ARM::BI__builtin_arm_mve_vabdq_m_f16:
9981 case ARM::BI__builtin_arm_mve_vabdq_m_f32:
9982 case ARM::BI__builtin_arm_mve_vabdq_m_s16:
9983 case ARM::BI__builtin_arm_mve_vabdq_m_s32:
9984 case ARM::BI__builtin_arm_mve_vabdq_m_s8:
9985 case ARM::BI__builtin_arm_mve_vabdq_m_u16:
9986 case ARM::BI__builtin_arm_mve_vabdq_m_u32:
9987 case ARM::BI__builtin_arm_mve_vabdq_m_u8:
9988 case ARM::BI__builtin_arm_mve_vhaddq_m_s16:
9989 case ARM::BI__builtin_arm_mve_vhaddq_m_s32:
9990 case ARM::BI__builtin_arm_mve_vhaddq_m_s8:
9991 case ARM::BI__builtin_arm_mve_vhaddq_m_u16:
9992 case ARM::BI__builtin_arm_mve_vhaddq_m_u32:
9993 case ARM::BI__builtin_arm_mve_vhaddq_m_u8:
9994 case ARM::BI__builtin_arm_mve_vhsubq_m_s16:
9995 case ARM::BI__builtin_arm_mve_vhsubq_m_s32:
9996 case ARM::BI__builtin_arm_mve_vhsubq_m_s8:
9997 case ARM::BI__builtin_arm_mve_vhsubq_m_u16:
9998 case ARM::BI__builtin_arm_mve_vhsubq_m_u32:
9999 case ARM::BI__builtin_arm_mve_vhsubq_m_u8:
10000 case ARM::BI__builtin_arm_mve_vmaxnmq_m_f16:
10001 case ARM::BI__builtin_arm_mve_vmaxnmq_m_f32:
10002 case ARM::BI__builtin_arm_mve_vmaxq_m_s16:
10003 case ARM::BI__builtin_arm_mve_vmaxq_m_s32:
10004 case ARM::BI__builtin_arm_mve_vmaxq_m_s8:
10005 case ARM::BI__builtin_arm_mve_vmaxq_m_u16:
10006 case ARM::BI__builtin_arm_mve_vmaxq_m_u32:
10007 case ARM::BI__builtin_arm_mve_vmaxq_m_u8:
10008 case ARM::BI__builtin_arm_mve_vminnmq_m_f16:
10009 case ARM::BI__builtin_arm_mve_vminnmq_m_f32:
10010 case ARM::BI__builtin_arm_mve_vminq_m_s16:
10011 case ARM::BI__builtin_arm_mve_vminq_m_s32:
10012 case ARM::BI__builtin_arm_mve_vminq_m_s8:
10013 case ARM::BI__builtin_arm_mve_vminq_m_u16:
10014 case ARM::BI__builtin_arm_mve_vminq_m_u32:
10015 case ARM::BI__builtin_arm_mve_vminq_m_u8:
10016 case ARM::BI__builtin_arm_mve_vmulhq_m_s16:
10017 case ARM::BI__builtin_arm_mve_vmulhq_m_s32:
10018 case ARM::BI__builtin_arm_mve_vmulhq_m_s8:
10019 case ARM::BI__builtin_arm_mve_vmulhq_m_u16:
10020 case ARM::BI__builtin_arm_mve_vmulhq_m_u32:
10021 case ARM::BI__builtin_arm_mve_vmulhq_m_u8:
10022 case ARM::BI__builtin_arm_mve_vqaddq_m_s16:
10023 case ARM::BI__builtin_arm_mve_vqaddq_m_s32:
10024 case ARM::BI__builtin_arm_mve_vqaddq_m_s8:
10025 case ARM::BI__builtin_arm_mve_vqaddq_m_u16:
10026 case ARM::BI__builtin_arm_mve_vqaddq_m_u32:
10027 case ARM::BI__builtin_arm_mve_vqaddq_m_u8:
10028 case ARM::BI__builtin_arm_mve_vqshlq_m_n_s16:
10029 case ARM::BI__builtin_arm_mve_vqshlq_m_n_s32:
10030 case ARM::BI__builtin_arm_mve_vqshlq_m_n_s8:
10031 case ARM::BI__builtin_arm_mve_vqshlq_m_n_u16:
10032 case ARM::BI__builtin_arm_mve_vqshlq_m_n_u32:
10033 case ARM::BI__builtin_arm_mve_vqshlq_m_n_u8:
10034 case ARM::BI__builtin_arm_mve_vqsubq_m_s16:
10035 case ARM::BI__builtin_arm_mve_vqsubq_m_s32:
10036 case ARM::BI__builtin_arm_mve_vqsubq_m_s8:
10037 case ARM::BI__builtin_arm_mve_vqsubq_m_u16:
10038 case ARM::BI__builtin_arm_mve_vqsubq_m_u32:
10039 case ARM::BI__builtin_arm_mve_vqsubq_m_u8:
10040 case ARM::BI__builtin_arm_mve_vrhaddq_m_s16:
10041 case ARM::BI__builtin_arm_mve_vrhaddq_m_s32:
10042 case ARM::BI__builtin_arm_mve_vrhaddq_m_s8:
10043 case ARM::BI__builtin_arm_mve_vrhaddq_m_u16:
10044 case ARM::BI__builtin_arm_mve_vrhaddq_m_u32:
10045 case ARM::BI__builtin_arm_mve_vrhaddq_m_u8:
10046 case ARM::BI__builtin_arm_mve_vrmulhq_m_s16:
10047 case ARM::BI__builtin_arm_mve_vrmulhq_m_s32:
10048 case ARM::BI__builtin_arm_mve_vrmulhq_m_s8:
10049 case ARM::BI__builtin_arm_mve_vrmulhq_m_u16:
10050 case ARM::BI__builtin_arm_mve_vrmulhq_m_u32:
10051 case ARM::BI__builtin_arm_mve_vrmulhq_m_u8:
10052 case ARM::BI__builtin_arm_mve_vrshrq_m_n_s16:
10053 case ARM::BI__builtin_arm_mve_vrshrq_m_n_s32:
10054 case ARM::BI__builtin_arm_mve_vrshrq_m_n_s8:
10055 case ARM::BI__builtin_arm_mve_vrshrq_m_n_u16:
10056 case ARM::BI__builtin_arm_mve_vrshrq_m_n_u32:
10057 case ARM::BI__builtin_arm_mve_vrshrq_m_n_u8:
10058 case ARM::BI__builtin_arm_mve_vshrq_m_n_s16:
10059 case ARM::BI__builtin_arm_mve_vshrq_m_n_s32:
10060 case ARM::BI__builtin_arm_mve_vshrq_m_n_s8:
10061 case ARM::BI__builtin_arm_mve_vshrq_m_n_u16:
10062 case ARM::BI__builtin_arm_mve_vshrq_m_n_u32:
10063 case ARM::BI__builtin_arm_mve_vshrq_m_n_u8: {
10064   uint32_t  Param0;
10065   llvm::Type * Param1;
10066   Intrinsic::ID  Param2;
10067   llvm::Type * Param3;
10068   switch (BuiltinID) {
10069   case ARM::BI__builtin_arm_mve_vabdq_m_f16:
10070     Param0 = 0;
10071     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10072     Param2 = Intrinsic::arm_mve_abd_predicated;
10073     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
10074     break;
10075   case ARM::BI__builtin_arm_mve_vabdq_m_f32:
10076     Param0 = 0;
10077     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10078     Param2 = Intrinsic::arm_mve_abd_predicated;
10079     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
10080     break;
10081   case ARM::BI__builtin_arm_mve_vabdq_m_s16:
10082     Param0 = 0;
10083     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10084     Param2 = Intrinsic::arm_mve_abd_predicated;
10085     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10086     break;
10087   case ARM::BI__builtin_arm_mve_vabdq_m_s32:
10088     Param0 = 0;
10089     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10090     Param2 = Intrinsic::arm_mve_abd_predicated;
10091     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10092     break;
10093   case ARM::BI__builtin_arm_mve_vabdq_m_s8:
10094     Param0 = 0;
10095     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10096     Param2 = Intrinsic::arm_mve_abd_predicated;
10097     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10098     break;
10099   case ARM::BI__builtin_arm_mve_vabdq_m_u16:
10100     Param0 = 1;
10101     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10102     Param2 = Intrinsic::arm_mve_abd_predicated;
10103     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10104     break;
10105   case ARM::BI__builtin_arm_mve_vabdq_m_u32:
10106     Param0 = 1;
10107     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10108     Param2 = Intrinsic::arm_mve_abd_predicated;
10109     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10110     break;
10111   case ARM::BI__builtin_arm_mve_vabdq_m_u8:
10112     Param0 = 1;
10113     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10114     Param2 = Intrinsic::arm_mve_abd_predicated;
10115     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10116     break;
10117   case ARM::BI__builtin_arm_mve_vhaddq_m_s16:
10118     Param0 = 0;
10119     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10120     Param2 = Intrinsic::arm_mve_hadd_predicated;
10121     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10122     break;
10123   case ARM::BI__builtin_arm_mve_vhaddq_m_s32:
10124     Param0 = 0;
10125     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10126     Param2 = Intrinsic::arm_mve_hadd_predicated;
10127     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10128     break;
10129   case ARM::BI__builtin_arm_mve_vhaddq_m_s8:
10130     Param0 = 0;
10131     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10132     Param2 = Intrinsic::arm_mve_hadd_predicated;
10133     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10134     break;
10135   case ARM::BI__builtin_arm_mve_vhaddq_m_u16:
10136     Param0 = 1;
10137     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10138     Param2 = Intrinsic::arm_mve_hadd_predicated;
10139     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10140     break;
10141   case ARM::BI__builtin_arm_mve_vhaddq_m_u32:
10142     Param0 = 1;
10143     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10144     Param2 = Intrinsic::arm_mve_hadd_predicated;
10145     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10146     break;
10147   case ARM::BI__builtin_arm_mve_vhaddq_m_u8:
10148     Param0 = 1;
10149     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10150     Param2 = Intrinsic::arm_mve_hadd_predicated;
10151     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10152     break;
10153   case ARM::BI__builtin_arm_mve_vhsubq_m_s16:
10154     Param0 = 0;
10155     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10156     Param2 = Intrinsic::arm_mve_hsub_predicated;
10157     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10158     break;
10159   case ARM::BI__builtin_arm_mve_vhsubq_m_s32:
10160     Param0 = 0;
10161     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10162     Param2 = Intrinsic::arm_mve_hsub_predicated;
10163     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10164     break;
10165   case ARM::BI__builtin_arm_mve_vhsubq_m_s8:
10166     Param0 = 0;
10167     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10168     Param2 = Intrinsic::arm_mve_hsub_predicated;
10169     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10170     break;
10171   case ARM::BI__builtin_arm_mve_vhsubq_m_u16:
10172     Param0 = 1;
10173     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10174     Param2 = Intrinsic::arm_mve_hsub_predicated;
10175     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10176     break;
10177   case ARM::BI__builtin_arm_mve_vhsubq_m_u32:
10178     Param0 = 1;
10179     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10180     Param2 = Intrinsic::arm_mve_hsub_predicated;
10181     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10182     break;
10183   case ARM::BI__builtin_arm_mve_vhsubq_m_u8:
10184     Param0 = 1;
10185     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10186     Param2 = Intrinsic::arm_mve_hsub_predicated;
10187     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10188     break;
10189   case ARM::BI__builtin_arm_mve_vmaxnmq_m_f16:
10190     Param0 = 0;
10191     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10192     Param2 = Intrinsic::arm_mve_max_predicated;
10193     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
10194     break;
10195   case ARM::BI__builtin_arm_mve_vmaxnmq_m_f32:
10196     Param0 = 0;
10197     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10198     Param2 = Intrinsic::arm_mve_max_predicated;
10199     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
10200     break;
10201   case ARM::BI__builtin_arm_mve_vmaxq_m_s16:
10202     Param0 = 0;
10203     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10204     Param2 = Intrinsic::arm_mve_max_predicated;
10205     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10206     break;
10207   case ARM::BI__builtin_arm_mve_vmaxq_m_s32:
10208     Param0 = 0;
10209     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10210     Param2 = Intrinsic::arm_mve_max_predicated;
10211     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10212     break;
10213   case ARM::BI__builtin_arm_mve_vmaxq_m_s8:
10214     Param0 = 0;
10215     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10216     Param2 = Intrinsic::arm_mve_max_predicated;
10217     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10218     break;
10219   case ARM::BI__builtin_arm_mve_vmaxq_m_u16:
10220     Param0 = 1;
10221     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10222     Param2 = Intrinsic::arm_mve_max_predicated;
10223     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10224     break;
10225   case ARM::BI__builtin_arm_mve_vmaxq_m_u32:
10226     Param0 = 1;
10227     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10228     Param2 = Intrinsic::arm_mve_max_predicated;
10229     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10230     break;
10231   case ARM::BI__builtin_arm_mve_vmaxq_m_u8:
10232     Param0 = 1;
10233     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10234     Param2 = Intrinsic::arm_mve_max_predicated;
10235     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10236     break;
10237   case ARM::BI__builtin_arm_mve_vminnmq_m_f16:
10238     Param0 = 0;
10239     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10240     Param2 = Intrinsic::arm_mve_min_predicated;
10241     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
10242     break;
10243   case ARM::BI__builtin_arm_mve_vminnmq_m_f32:
10244     Param0 = 0;
10245     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10246     Param2 = Intrinsic::arm_mve_min_predicated;
10247     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
10248     break;
10249   case ARM::BI__builtin_arm_mve_vminq_m_s16:
10250     Param0 = 0;
10251     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10252     Param2 = Intrinsic::arm_mve_min_predicated;
10253     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10254     break;
10255   case ARM::BI__builtin_arm_mve_vminq_m_s32:
10256     Param0 = 0;
10257     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10258     Param2 = Intrinsic::arm_mve_min_predicated;
10259     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10260     break;
10261   case ARM::BI__builtin_arm_mve_vminq_m_s8:
10262     Param0 = 0;
10263     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10264     Param2 = Intrinsic::arm_mve_min_predicated;
10265     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10266     break;
10267   case ARM::BI__builtin_arm_mve_vminq_m_u16:
10268     Param0 = 1;
10269     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10270     Param2 = Intrinsic::arm_mve_min_predicated;
10271     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10272     break;
10273   case ARM::BI__builtin_arm_mve_vminq_m_u32:
10274     Param0 = 1;
10275     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10276     Param2 = Intrinsic::arm_mve_min_predicated;
10277     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10278     break;
10279   case ARM::BI__builtin_arm_mve_vminq_m_u8:
10280     Param0 = 1;
10281     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10282     Param2 = Intrinsic::arm_mve_min_predicated;
10283     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10284     break;
10285   case ARM::BI__builtin_arm_mve_vmulhq_m_s16:
10286     Param0 = 0;
10287     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10288     Param2 = Intrinsic::arm_mve_mulh_predicated;
10289     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10290     break;
10291   case ARM::BI__builtin_arm_mve_vmulhq_m_s32:
10292     Param0 = 0;
10293     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10294     Param2 = Intrinsic::arm_mve_mulh_predicated;
10295     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10296     break;
10297   case ARM::BI__builtin_arm_mve_vmulhq_m_s8:
10298     Param0 = 0;
10299     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10300     Param2 = Intrinsic::arm_mve_mulh_predicated;
10301     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10302     break;
10303   case ARM::BI__builtin_arm_mve_vmulhq_m_u16:
10304     Param0 = 1;
10305     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10306     Param2 = Intrinsic::arm_mve_mulh_predicated;
10307     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10308     break;
10309   case ARM::BI__builtin_arm_mve_vmulhq_m_u32:
10310     Param0 = 1;
10311     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10312     Param2 = Intrinsic::arm_mve_mulh_predicated;
10313     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10314     break;
10315   case ARM::BI__builtin_arm_mve_vmulhq_m_u8:
10316     Param0 = 1;
10317     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10318     Param2 = Intrinsic::arm_mve_mulh_predicated;
10319     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10320     break;
10321   case ARM::BI__builtin_arm_mve_vqaddq_m_s16:
10322     Param0 = 0;
10323     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10324     Param2 = Intrinsic::arm_mve_qadd_predicated;
10325     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10326     break;
10327   case ARM::BI__builtin_arm_mve_vqaddq_m_s32:
10328     Param0 = 0;
10329     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10330     Param2 = Intrinsic::arm_mve_qadd_predicated;
10331     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10332     break;
10333   case ARM::BI__builtin_arm_mve_vqaddq_m_s8:
10334     Param0 = 0;
10335     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10336     Param2 = Intrinsic::arm_mve_qadd_predicated;
10337     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10338     break;
10339   case ARM::BI__builtin_arm_mve_vqaddq_m_u16:
10340     Param0 = 1;
10341     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10342     Param2 = Intrinsic::arm_mve_qadd_predicated;
10343     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10344     break;
10345   case ARM::BI__builtin_arm_mve_vqaddq_m_u32:
10346     Param0 = 1;
10347     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10348     Param2 = Intrinsic::arm_mve_qadd_predicated;
10349     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10350     break;
10351   case ARM::BI__builtin_arm_mve_vqaddq_m_u8:
10352     Param0 = 1;
10353     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10354     Param2 = Intrinsic::arm_mve_qadd_predicated;
10355     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10356     break;
10357   case ARM::BI__builtin_arm_mve_vqshlq_m_n_s16:
10358     Param0 = 0;
10359     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10360     Param2 = Intrinsic::arm_mve_vqshl_imm_predicated;
10361     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10362     break;
10363   case ARM::BI__builtin_arm_mve_vqshlq_m_n_s32:
10364     Param0 = 0;
10365     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10366     Param2 = Intrinsic::arm_mve_vqshl_imm_predicated;
10367     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10368     break;
10369   case ARM::BI__builtin_arm_mve_vqshlq_m_n_s8:
10370     Param0 = 0;
10371     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10372     Param2 = Intrinsic::arm_mve_vqshl_imm_predicated;
10373     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10374     break;
10375   case ARM::BI__builtin_arm_mve_vqshlq_m_n_u16:
10376     Param0 = 1;
10377     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10378     Param2 = Intrinsic::arm_mve_vqshl_imm_predicated;
10379     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10380     break;
10381   case ARM::BI__builtin_arm_mve_vqshlq_m_n_u32:
10382     Param0 = 1;
10383     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10384     Param2 = Intrinsic::arm_mve_vqshl_imm_predicated;
10385     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10386     break;
10387   case ARM::BI__builtin_arm_mve_vqshlq_m_n_u8:
10388     Param0 = 1;
10389     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10390     Param2 = Intrinsic::arm_mve_vqshl_imm_predicated;
10391     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10392     break;
10393   case ARM::BI__builtin_arm_mve_vqsubq_m_s16:
10394     Param0 = 0;
10395     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10396     Param2 = Intrinsic::arm_mve_qsub_predicated;
10397     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10398     break;
10399   case ARM::BI__builtin_arm_mve_vqsubq_m_s32:
10400     Param0 = 0;
10401     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10402     Param2 = Intrinsic::arm_mve_qsub_predicated;
10403     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10404     break;
10405   case ARM::BI__builtin_arm_mve_vqsubq_m_s8:
10406     Param0 = 0;
10407     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10408     Param2 = Intrinsic::arm_mve_qsub_predicated;
10409     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10410     break;
10411   case ARM::BI__builtin_arm_mve_vqsubq_m_u16:
10412     Param0 = 1;
10413     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10414     Param2 = Intrinsic::arm_mve_qsub_predicated;
10415     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10416     break;
10417   case ARM::BI__builtin_arm_mve_vqsubq_m_u32:
10418     Param0 = 1;
10419     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10420     Param2 = Intrinsic::arm_mve_qsub_predicated;
10421     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10422     break;
10423   case ARM::BI__builtin_arm_mve_vqsubq_m_u8:
10424     Param0 = 1;
10425     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10426     Param2 = Intrinsic::arm_mve_qsub_predicated;
10427     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10428     break;
10429   case ARM::BI__builtin_arm_mve_vrhaddq_m_s16:
10430     Param0 = 0;
10431     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10432     Param2 = Intrinsic::arm_mve_rhadd_predicated;
10433     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10434     break;
10435   case ARM::BI__builtin_arm_mve_vrhaddq_m_s32:
10436     Param0 = 0;
10437     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10438     Param2 = Intrinsic::arm_mve_rhadd_predicated;
10439     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10440     break;
10441   case ARM::BI__builtin_arm_mve_vrhaddq_m_s8:
10442     Param0 = 0;
10443     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10444     Param2 = Intrinsic::arm_mve_rhadd_predicated;
10445     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10446     break;
10447   case ARM::BI__builtin_arm_mve_vrhaddq_m_u16:
10448     Param0 = 1;
10449     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10450     Param2 = Intrinsic::arm_mve_rhadd_predicated;
10451     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10452     break;
10453   case ARM::BI__builtin_arm_mve_vrhaddq_m_u32:
10454     Param0 = 1;
10455     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10456     Param2 = Intrinsic::arm_mve_rhadd_predicated;
10457     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10458     break;
10459   case ARM::BI__builtin_arm_mve_vrhaddq_m_u8:
10460     Param0 = 1;
10461     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10462     Param2 = Intrinsic::arm_mve_rhadd_predicated;
10463     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10464     break;
10465   case ARM::BI__builtin_arm_mve_vrmulhq_m_s16:
10466     Param0 = 0;
10467     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10468     Param2 = Intrinsic::arm_mve_rmulh_predicated;
10469     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10470     break;
10471   case ARM::BI__builtin_arm_mve_vrmulhq_m_s32:
10472     Param0 = 0;
10473     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10474     Param2 = Intrinsic::arm_mve_rmulh_predicated;
10475     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10476     break;
10477   case ARM::BI__builtin_arm_mve_vrmulhq_m_s8:
10478     Param0 = 0;
10479     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10480     Param2 = Intrinsic::arm_mve_rmulh_predicated;
10481     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10482     break;
10483   case ARM::BI__builtin_arm_mve_vrmulhq_m_u16:
10484     Param0 = 1;
10485     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10486     Param2 = Intrinsic::arm_mve_rmulh_predicated;
10487     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10488     break;
10489   case ARM::BI__builtin_arm_mve_vrmulhq_m_u32:
10490     Param0 = 1;
10491     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10492     Param2 = Intrinsic::arm_mve_rmulh_predicated;
10493     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10494     break;
10495   case ARM::BI__builtin_arm_mve_vrmulhq_m_u8:
10496     Param0 = 1;
10497     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10498     Param2 = Intrinsic::arm_mve_rmulh_predicated;
10499     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10500     break;
10501   case ARM::BI__builtin_arm_mve_vrshrq_m_n_s16:
10502     Param0 = 0;
10503     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10504     Param2 = Intrinsic::arm_mve_vrshr_imm_predicated;
10505     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10506     break;
10507   case ARM::BI__builtin_arm_mve_vrshrq_m_n_s32:
10508     Param0 = 0;
10509     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10510     Param2 = Intrinsic::arm_mve_vrshr_imm_predicated;
10511     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10512     break;
10513   case ARM::BI__builtin_arm_mve_vrshrq_m_n_s8:
10514     Param0 = 0;
10515     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10516     Param2 = Intrinsic::arm_mve_vrshr_imm_predicated;
10517     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10518     break;
10519   case ARM::BI__builtin_arm_mve_vrshrq_m_n_u16:
10520     Param0 = 1;
10521     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10522     Param2 = Intrinsic::arm_mve_vrshr_imm_predicated;
10523     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10524     break;
10525   case ARM::BI__builtin_arm_mve_vrshrq_m_n_u32:
10526     Param0 = 1;
10527     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10528     Param2 = Intrinsic::arm_mve_vrshr_imm_predicated;
10529     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10530     break;
10531   case ARM::BI__builtin_arm_mve_vrshrq_m_n_u8:
10532     Param0 = 1;
10533     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10534     Param2 = Intrinsic::arm_mve_vrshr_imm_predicated;
10535     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10536     break;
10537   case ARM::BI__builtin_arm_mve_vshrq_m_n_s16:
10538     Param0 = 0;
10539     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10540     Param2 = Intrinsic::arm_mve_shr_imm_predicated;
10541     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10542     break;
10543   case ARM::BI__builtin_arm_mve_vshrq_m_n_s32:
10544     Param0 = 0;
10545     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10546     Param2 = Intrinsic::arm_mve_shr_imm_predicated;
10547     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10548     break;
10549   case ARM::BI__builtin_arm_mve_vshrq_m_n_s8:
10550     Param0 = 0;
10551     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10552     Param2 = Intrinsic::arm_mve_shr_imm_predicated;
10553     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10554     break;
10555   case ARM::BI__builtin_arm_mve_vshrq_m_n_u16:
10556     Param0 = 1;
10557     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10558     Param2 = Intrinsic::arm_mve_shr_imm_predicated;
10559     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10560     break;
10561   case ARM::BI__builtin_arm_mve_vshrq_m_n_u32:
10562     Param0 = 1;
10563     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10564     Param2 = Intrinsic::arm_mve_shr_imm_predicated;
10565     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10566     break;
10567   case ARM::BI__builtin_arm_mve_vshrq_m_n_u8:
10568     Param0 = 1;
10569     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10570     Param2 = Intrinsic::arm_mve_shr_imm_predicated;
10571     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10572     break;
10573   }
10574   Value *Val0 = EmitScalarExpr(E->getArg(1));
10575   Value *Val1 = EmitScalarExpr(E->getArg(2));
10576   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
10577   Value *Val3 = EmitScalarExpr(E->getArg(3));
10578   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
10579   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val4});
10580   Value *Val6 = EmitScalarExpr(E->getArg(0));
10581   return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param1}), {Val0, Val1, Val2, Val5, Val6});
10582 }
10583 case ARM::BI__builtin_arm_mve_vmullbq_poly_m_p16:
10584 case ARM::BI__builtin_arm_mve_vmullbq_poly_m_p8:
10585 case ARM::BI__builtin_arm_mve_vmulltq_poly_m_p16:
10586 case ARM::BI__builtin_arm_mve_vmulltq_poly_m_p8:
10587 case ARM::BI__builtin_arm_mve_vqdmullbq_m_s16:
10588 case ARM::BI__builtin_arm_mve_vqdmullbq_m_s32:
10589 case ARM::BI__builtin_arm_mve_vqdmulltq_m_s16:
10590 case ARM::BI__builtin_arm_mve_vqdmulltq_m_s32: {
10591   uint32_t  Param0;
10592   llvm::Type * Param1;
10593   Intrinsic::ID  Param2;
10594   llvm::Type * Param3;
10595   llvm::Type * Param4;
10596   switch (BuiltinID) {
10597   case ARM::BI__builtin_arm_mve_vmullbq_poly_m_p16:
10598     Param0 = 0;
10599     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10600     Param2 = Intrinsic::arm_mve_mull_poly_predicated;
10601     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10602     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10603     break;
10604   case ARM::BI__builtin_arm_mve_vmullbq_poly_m_p8:
10605     Param0 = 0;
10606     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10607     Param2 = Intrinsic::arm_mve_mull_poly_predicated;
10608     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10609     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
10610     break;
10611   case ARM::BI__builtin_arm_mve_vmulltq_poly_m_p16:
10612     Param0 = 1;
10613     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10614     Param2 = Intrinsic::arm_mve_mull_poly_predicated;
10615     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10616     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10617     break;
10618   case ARM::BI__builtin_arm_mve_vmulltq_poly_m_p8:
10619     Param0 = 1;
10620     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10621     Param2 = Intrinsic::arm_mve_mull_poly_predicated;
10622     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10623     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
10624     break;
10625   case ARM::BI__builtin_arm_mve_vqdmullbq_m_s16:
10626     Param0 = 0;
10627     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10628     Param2 = Intrinsic::arm_mve_vqdmull_predicated;
10629     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10630     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10631     break;
10632   case ARM::BI__builtin_arm_mve_vqdmullbq_m_s32:
10633     Param0 = 0;
10634     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
10635     Param2 = Intrinsic::arm_mve_vqdmull_predicated;
10636     Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
10637     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10638     break;
10639   case ARM::BI__builtin_arm_mve_vqdmulltq_m_s16:
10640     Param0 = 1;
10641     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10642     Param2 = Intrinsic::arm_mve_vqdmull_predicated;
10643     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10644     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10645     break;
10646   case ARM::BI__builtin_arm_mve_vqdmulltq_m_s32:
10647     Param0 = 1;
10648     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
10649     Param2 = Intrinsic::arm_mve_vqdmull_predicated;
10650     Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
10651     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10652     break;
10653   }
10654   Value *Val0 = EmitScalarExpr(E->getArg(1));
10655   Value *Val1 = EmitScalarExpr(E->getArg(2));
10656   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
10657   Value *Val3 = EmitScalarExpr(E->getArg(3));
10658   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
10659   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val4});
10660   Value *Val6 = EmitScalarExpr(E->getArg(0));
10661   return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param4, Param1}), {Val0, Val1, Val2, Val5, Val6});
10662 }
10663 case ARM::BI__builtin_arm_mve_vmullbq_int_m_s16:
10664 case ARM::BI__builtin_arm_mve_vmullbq_int_m_s32:
10665 case ARM::BI__builtin_arm_mve_vmullbq_int_m_s8:
10666 case ARM::BI__builtin_arm_mve_vmullbq_int_m_u16:
10667 case ARM::BI__builtin_arm_mve_vmullbq_int_m_u32:
10668 case ARM::BI__builtin_arm_mve_vmullbq_int_m_u8:
10669 case ARM::BI__builtin_arm_mve_vmulltq_int_m_s16:
10670 case ARM::BI__builtin_arm_mve_vmulltq_int_m_s32:
10671 case ARM::BI__builtin_arm_mve_vmulltq_int_m_s8:
10672 case ARM::BI__builtin_arm_mve_vmulltq_int_m_u16:
10673 case ARM::BI__builtin_arm_mve_vmulltq_int_m_u32:
10674 case ARM::BI__builtin_arm_mve_vmulltq_int_m_u8:
10675 case ARM::BI__builtin_arm_mve_vshllbq_m_n_s16:
10676 case ARM::BI__builtin_arm_mve_vshllbq_m_n_s8:
10677 case ARM::BI__builtin_arm_mve_vshllbq_m_n_u16:
10678 case ARM::BI__builtin_arm_mve_vshllbq_m_n_u8:
10679 case ARM::BI__builtin_arm_mve_vshlltq_m_n_s16:
10680 case ARM::BI__builtin_arm_mve_vshlltq_m_n_s8:
10681 case ARM::BI__builtin_arm_mve_vshlltq_m_n_u16:
10682 case ARM::BI__builtin_arm_mve_vshlltq_m_n_u8: {
10683   uint32_t  Param0;
10684   uint32_t  Param1;
10685   llvm::Type * Param2;
10686   Intrinsic::ID  Param3;
10687   llvm::Type * Param4;
10688   llvm::Type * Param5;
10689   switch (BuiltinID) {
10690   case ARM::BI__builtin_arm_mve_vmullbq_int_m_s16:
10691     Param0 = 0;
10692     Param1 = 0;
10693     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10694     Param3 = Intrinsic::arm_mve_mull_int_predicated;
10695     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10696     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
10697     break;
10698   case ARM::BI__builtin_arm_mve_vmullbq_int_m_s32:
10699     Param0 = 0;
10700     Param1 = 0;
10701     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
10702     Param3 = Intrinsic::arm_mve_mull_int_predicated;
10703     Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
10704     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
10705     break;
10706   case ARM::BI__builtin_arm_mve_vmullbq_int_m_s8:
10707     Param0 = 0;
10708     Param1 = 0;
10709     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10710     Param3 = Intrinsic::arm_mve_mull_int_predicated;
10711     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10712     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
10713     break;
10714   case ARM::BI__builtin_arm_mve_vmullbq_int_m_u16:
10715     Param0 = 1;
10716     Param1 = 0;
10717     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10718     Param3 = Intrinsic::arm_mve_mull_int_predicated;
10719     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10720     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
10721     break;
10722   case ARM::BI__builtin_arm_mve_vmullbq_int_m_u32:
10723     Param0 = 1;
10724     Param1 = 0;
10725     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
10726     Param3 = Intrinsic::arm_mve_mull_int_predicated;
10727     Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
10728     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
10729     break;
10730   case ARM::BI__builtin_arm_mve_vmullbq_int_m_u8:
10731     Param0 = 1;
10732     Param1 = 0;
10733     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10734     Param3 = Intrinsic::arm_mve_mull_int_predicated;
10735     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10736     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
10737     break;
10738   case ARM::BI__builtin_arm_mve_vmulltq_int_m_s16:
10739     Param0 = 0;
10740     Param1 = 1;
10741     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10742     Param3 = Intrinsic::arm_mve_mull_int_predicated;
10743     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10744     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
10745     break;
10746   case ARM::BI__builtin_arm_mve_vmulltq_int_m_s32:
10747     Param0 = 0;
10748     Param1 = 1;
10749     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
10750     Param3 = Intrinsic::arm_mve_mull_int_predicated;
10751     Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
10752     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
10753     break;
10754   case ARM::BI__builtin_arm_mve_vmulltq_int_m_s8:
10755     Param0 = 0;
10756     Param1 = 1;
10757     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10758     Param3 = Intrinsic::arm_mve_mull_int_predicated;
10759     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10760     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
10761     break;
10762   case ARM::BI__builtin_arm_mve_vmulltq_int_m_u16:
10763     Param0 = 1;
10764     Param1 = 1;
10765     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10766     Param3 = Intrinsic::arm_mve_mull_int_predicated;
10767     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10768     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
10769     break;
10770   case ARM::BI__builtin_arm_mve_vmulltq_int_m_u32:
10771     Param0 = 1;
10772     Param1 = 1;
10773     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
10774     Param3 = Intrinsic::arm_mve_mull_int_predicated;
10775     Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
10776     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
10777     break;
10778   case ARM::BI__builtin_arm_mve_vmulltq_int_m_u8:
10779     Param0 = 1;
10780     Param1 = 1;
10781     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10782     Param3 = Intrinsic::arm_mve_mull_int_predicated;
10783     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10784     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
10785     break;
10786   case ARM::BI__builtin_arm_mve_vshllbq_m_n_s16:
10787     Param0 = 0;
10788     Param1 = 0;
10789     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10790     Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
10791     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10792     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
10793     break;
10794   case ARM::BI__builtin_arm_mve_vshllbq_m_n_s8:
10795     Param0 = 0;
10796     Param1 = 0;
10797     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10798     Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
10799     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10800     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
10801     break;
10802   case ARM::BI__builtin_arm_mve_vshllbq_m_n_u16:
10803     Param0 = 1;
10804     Param1 = 0;
10805     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10806     Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
10807     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10808     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
10809     break;
10810   case ARM::BI__builtin_arm_mve_vshllbq_m_n_u8:
10811     Param0 = 1;
10812     Param1 = 0;
10813     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10814     Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
10815     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10816     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
10817     break;
10818   case ARM::BI__builtin_arm_mve_vshlltq_m_n_s16:
10819     Param0 = 0;
10820     Param1 = 1;
10821     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10822     Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
10823     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10824     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
10825     break;
10826   case ARM::BI__builtin_arm_mve_vshlltq_m_n_s8:
10827     Param0 = 0;
10828     Param1 = 1;
10829     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10830     Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
10831     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10832     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
10833     break;
10834   case ARM::BI__builtin_arm_mve_vshlltq_m_n_u16:
10835     Param0 = 1;
10836     Param1 = 1;
10837     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10838     Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
10839     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10840     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
10841     break;
10842   case ARM::BI__builtin_arm_mve_vshlltq_m_n_u8:
10843     Param0 = 1;
10844     Param1 = 1;
10845     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10846     Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
10847     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10848     Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
10849     break;
10850   }
10851   Value *Val0 = EmitScalarExpr(E->getArg(1));
10852   Value *Val1 = EmitScalarExpr(E->getArg(2));
10853   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
10854   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
10855   Value *Val4 = EmitScalarExpr(E->getArg(3));
10856   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
10857   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param2}), {Val5});
10858   Value *Val7 = EmitScalarExpr(E->getArg(0));
10859   return Builder.CreateCall(CGM.getIntrinsic(Param3, {Param4, Param5, Param2}), {Val0, Val1, Val2, Val3, Val6, Val7});
10860 }
10861 case ARM::BI__builtin_arm_mve_vqrshlq_m_s16:
10862 case ARM::BI__builtin_arm_mve_vqrshlq_m_s32:
10863 case ARM::BI__builtin_arm_mve_vqrshlq_m_s8:
10864 case ARM::BI__builtin_arm_mve_vqrshlq_m_u16:
10865 case ARM::BI__builtin_arm_mve_vqrshlq_m_u32:
10866 case ARM::BI__builtin_arm_mve_vqrshlq_m_u8:
10867 case ARM::BI__builtin_arm_mve_vqshlq_m_s16:
10868 case ARM::BI__builtin_arm_mve_vqshlq_m_s32:
10869 case ARM::BI__builtin_arm_mve_vqshlq_m_s8:
10870 case ARM::BI__builtin_arm_mve_vqshlq_m_u16:
10871 case ARM::BI__builtin_arm_mve_vqshlq_m_u32:
10872 case ARM::BI__builtin_arm_mve_vqshlq_m_u8:
10873 case ARM::BI__builtin_arm_mve_vrshlq_m_s16:
10874 case ARM::BI__builtin_arm_mve_vrshlq_m_s32:
10875 case ARM::BI__builtin_arm_mve_vrshlq_m_s8:
10876 case ARM::BI__builtin_arm_mve_vrshlq_m_u16:
10877 case ARM::BI__builtin_arm_mve_vrshlq_m_u32:
10878 case ARM::BI__builtin_arm_mve_vrshlq_m_u8:
10879 case ARM::BI__builtin_arm_mve_vshlq_m_s16:
10880 case ARM::BI__builtin_arm_mve_vshlq_m_s32:
10881 case ARM::BI__builtin_arm_mve_vshlq_m_s8:
10882 case ARM::BI__builtin_arm_mve_vshlq_m_u16:
10883 case ARM::BI__builtin_arm_mve_vshlq_m_u32:
10884 case ARM::BI__builtin_arm_mve_vshlq_m_u8: {
10885   uint32_t  Param0;
10886   uint32_t  Param1;
10887   uint32_t  Param2;
10888   llvm::Type * Param3;
10889   llvm::Type * Param4;
10890   switch (BuiltinID) {
10891   case ARM::BI__builtin_arm_mve_vqrshlq_m_s16:
10892     Param0 = 1;
10893     Param1 = 1;
10894     Param2 = 0;
10895     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10896     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10897     break;
10898   case ARM::BI__builtin_arm_mve_vqrshlq_m_s32:
10899     Param0 = 1;
10900     Param1 = 1;
10901     Param2 = 0;
10902     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10903     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10904     break;
10905   case ARM::BI__builtin_arm_mve_vqrshlq_m_s8:
10906     Param0 = 1;
10907     Param1 = 1;
10908     Param2 = 0;
10909     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10910     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
10911     break;
10912   case ARM::BI__builtin_arm_mve_vqrshlq_m_u16:
10913     Param0 = 1;
10914     Param1 = 1;
10915     Param2 = 1;
10916     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10917     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10918     break;
10919   case ARM::BI__builtin_arm_mve_vqrshlq_m_u32:
10920     Param0 = 1;
10921     Param1 = 1;
10922     Param2 = 1;
10923     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10924     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10925     break;
10926   case ARM::BI__builtin_arm_mve_vqrshlq_m_u8:
10927     Param0 = 1;
10928     Param1 = 1;
10929     Param2 = 1;
10930     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10931     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
10932     break;
10933   case ARM::BI__builtin_arm_mve_vqshlq_m_s16:
10934     Param0 = 1;
10935     Param1 = 0;
10936     Param2 = 0;
10937     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10938     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10939     break;
10940   case ARM::BI__builtin_arm_mve_vqshlq_m_s32:
10941     Param0 = 1;
10942     Param1 = 0;
10943     Param2 = 0;
10944     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10945     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10946     break;
10947   case ARM::BI__builtin_arm_mve_vqshlq_m_s8:
10948     Param0 = 1;
10949     Param1 = 0;
10950     Param2 = 0;
10951     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10952     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
10953     break;
10954   case ARM::BI__builtin_arm_mve_vqshlq_m_u16:
10955     Param0 = 1;
10956     Param1 = 0;
10957     Param2 = 1;
10958     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10959     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10960     break;
10961   case ARM::BI__builtin_arm_mve_vqshlq_m_u32:
10962     Param0 = 1;
10963     Param1 = 0;
10964     Param2 = 1;
10965     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10966     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10967     break;
10968   case ARM::BI__builtin_arm_mve_vqshlq_m_u8:
10969     Param0 = 1;
10970     Param1 = 0;
10971     Param2 = 1;
10972     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10973     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
10974     break;
10975   case ARM::BI__builtin_arm_mve_vrshlq_m_s16:
10976     Param0 = 0;
10977     Param1 = 1;
10978     Param2 = 0;
10979     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10980     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10981     break;
10982   case ARM::BI__builtin_arm_mve_vrshlq_m_s32:
10983     Param0 = 0;
10984     Param1 = 1;
10985     Param2 = 0;
10986     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10987     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10988     break;
10989   case ARM::BI__builtin_arm_mve_vrshlq_m_s8:
10990     Param0 = 0;
10991     Param1 = 1;
10992     Param2 = 0;
10993     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10994     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
10995     break;
10996   case ARM::BI__builtin_arm_mve_vrshlq_m_u16:
10997     Param0 = 0;
10998     Param1 = 1;
10999     Param2 = 1;
11000     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11001     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
11002     break;
11003   case ARM::BI__builtin_arm_mve_vrshlq_m_u32:
11004     Param0 = 0;
11005     Param1 = 1;
11006     Param2 = 1;
11007     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11008     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
11009     break;
11010   case ARM::BI__builtin_arm_mve_vrshlq_m_u8:
11011     Param0 = 0;
11012     Param1 = 1;
11013     Param2 = 1;
11014     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11015     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
11016     break;
11017   case ARM::BI__builtin_arm_mve_vshlq_m_s16:
11018     Param0 = 0;
11019     Param1 = 0;
11020     Param2 = 0;
11021     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11022     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
11023     break;
11024   case ARM::BI__builtin_arm_mve_vshlq_m_s32:
11025     Param0 = 0;
11026     Param1 = 0;
11027     Param2 = 0;
11028     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11029     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
11030     break;
11031   case ARM::BI__builtin_arm_mve_vshlq_m_s8:
11032     Param0 = 0;
11033     Param1 = 0;
11034     Param2 = 0;
11035     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11036     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
11037     break;
11038   case ARM::BI__builtin_arm_mve_vshlq_m_u16:
11039     Param0 = 0;
11040     Param1 = 0;
11041     Param2 = 1;
11042     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11043     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
11044     break;
11045   case ARM::BI__builtin_arm_mve_vshlq_m_u32:
11046     Param0 = 0;
11047     Param1 = 0;
11048     Param2 = 1;
11049     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11050     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
11051     break;
11052   case ARM::BI__builtin_arm_mve_vshlq_m_u8:
11053     Param0 = 0;
11054     Param1 = 0;
11055     Param2 = 1;
11056     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11057     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
11058     break;
11059   }
11060   Value *Val0 = EmitScalarExpr(E->getArg(1));
11061   Value *Val1 = EmitScalarExpr(E->getArg(2));
11062   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
11063   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
11064   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
11065   Value *Val5 = EmitScalarExpr(E->getArg(3));
11066   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
11067   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val6});
11068   Value *Val8 = EmitScalarExpr(E->getArg(0));
11069   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshl_vector_predicated, {Param4, Param4, Param3}), {Val0, Val1, Val2, Val3, Val4, Val7, Val8});
11070 }
11071 case ARM::BI__builtin_arm_mve_vaddlvaq_s32:
11072 case ARM::BI__builtin_arm_mve_vaddlvaq_u32:
11073 case ARM::BI__builtin_arm_mve_vaddvaq_s16:
11074 case ARM::BI__builtin_arm_mve_vaddvaq_s32:
11075 case ARM::BI__builtin_arm_mve_vaddvaq_s8:
11076 case ARM::BI__builtin_arm_mve_vaddvaq_u16:
11077 case ARM::BI__builtin_arm_mve_vaddvaq_u32:
11078 case ARM::BI__builtin_arm_mve_vaddvaq_u8: {
11079   uint32_t  Param0;
11080   Intrinsic::ID  Param1;
11081   llvm::Type * Param2;
11082   switch (BuiltinID) {
11083   case ARM::BI__builtin_arm_mve_vaddlvaq_s32:
11084     Param0 = 0;
11085     Param1 = Intrinsic::arm_mve_addlv;
11086     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
11087     break;
11088   case ARM::BI__builtin_arm_mve_vaddlvaq_u32:
11089     Param0 = 1;
11090     Param1 = Intrinsic::arm_mve_addlv;
11091     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
11092     break;
11093   case ARM::BI__builtin_arm_mve_vaddvaq_s16:
11094     Param0 = 0;
11095     Param1 = Intrinsic::arm_mve_addv;
11096     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
11097     break;
11098   case ARM::BI__builtin_arm_mve_vaddvaq_s32:
11099     Param0 = 0;
11100     Param1 = Intrinsic::arm_mve_addv;
11101     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
11102     break;
11103   case ARM::BI__builtin_arm_mve_vaddvaq_s8:
11104     Param0 = 0;
11105     Param1 = Intrinsic::arm_mve_addv;
11106     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
11107     break;
11108   case ARM::BI__builtin_arm_mve_vaddvaq_u16:
11109     Param0 = 1;
11110     Param1 = Intrinsic::arm_mve_addv;
11111     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
11112     break;
11113   case ARM::BI__builtin_arm_mve_vaddvaq_u32:
11114     Param0 = 1;
11115     Param1 = Intrinsic::arm_mve_addv;
11116     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
11117     break;
11118   case ARM::BI__builtin_arm_mve_vaddvaq_u8:
11119     Param0 = 1;
11120     Param1 = Intrinsic::arm_mve_addv;
11121     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
11122     break;
11123   }
11124   Value *Val0 = EmitScalarExpr(E->getArg(1));
11125   Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
11126   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2}), {Val0, Val1});
11127   Value *Val3 = EmitScalarExpr(E->getArg(0));
11128   return Builder.CreateAdd(Val2, Val3);
11129 }
11130 case ARM::BI__builtin_arm_mve_vaddlvaq_p_s32:
11131 case ARM::BI__builtin_arm_mve_vaddlvaq_p_u32:
11132 case ARM::BI__builtin_arm_mve_vaddvaq_p_s16:
11133 case ARM::BI__builtin_arm_mve_vaddvaq_p_s32:
11134 case ARM::BI__builtin_arm_mve_vaddvaq_p_s8:
11135 case ARM::BI__builtin_arm_mve_vaddvaq_p_u16:
11136 case ARM::BI__builtin_arm_mve_vaddvaq_p_u32:
11137 case ARM::BI__builtin_arm_mve_vaddvaq_p_u8: {
11138   uint32_t  Param0;
11139   llvm::Type * Param1;
11140   Intrinsic::ID  Param2;
11141   llvm::Type * Param3;
11142   switch (BuiltinID) {
11143   case ARM::BI__builtin_arm_mve_vaddlvaq_p_s32:
11144     Param0 = 0;
11145     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11146     Param2 = Intrinsic::arm_mve_addlv_predicated;
11147     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11148     break;
11149   case ARM::BI__builtin_arm_mve_vaddlvaq_p_u32:
11150     Param0 = 1;
11151     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11152     Param2 = Intrinsic::arm_mve_addlv_predicated;
11153     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11154     break;
11155   case ARM::BI__builtin_arm_mve_vaddvaq_p_s16:
11156     Param0 = 0;
11157     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11158     Param2 = Intrinsic::arm_mve_addv_predicated;
11159     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
11160     break;
11161   case ARM::BI__builtin_arm_mve_vaddvaq_p_s32:
11162     Param0 = 0;
11163     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11164     Param2 = Intrinsic::arm_mve_addv_predicated;
11165     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11166     break;
11167   case ARM::BI__builtin_arm_mve_vaddvaq_p_s8:
11168     Param0 = 0;
11169     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11170     Param2 = Intrinsic::arm_mve_addv_predicated;
11171     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
11172     break;
11173   case ARM::BI__builtin_arm_mve_vaddvaq_p_u16:
11174     Param0 = 1;
11175     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11176     Param2 = Intrinsic::arm_mve_addv_predicated;
11177     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
11178     break;
11179   case ARM::BI__builtin_arm_mve_vaddvaq_p_u32:
11180     Param0 = 1;
11181     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11182     Param2 = Intrinsic::arm_mve_addv_predicated;
11183     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11184     break;
11185   case ARM::BI__builtin_arm_mve_vaddvaq_p_u8:
11186     Param0 = 1;
11187     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11188     Param2 = Intrinsic::arm_mve_addv_predicated;
11189     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
11190     break;
11191   }
11192   Value *Val0 = EmitScalarExpr(E->getArg(1));
11193   Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
11194   Value *Val2 = EmitScalarExpr(E->getArg(2));
11195   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
11196   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val3});
11197   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param1}), {Val0, Val1, Val4});
11198   Value *Val6 = EmitScalarExpr(E->getArg(0));
11199   return Builder.CreateAdd(Val5, Val6);
11200 }
11201 case ARM::BI__builtin_arm_mve_vcvtq_m_f16_s16:
11202 case ARM::BI__builtin_arm_mve_vcvtq_m_f16_u16:
11203 case ARM::BI__builtin_arm_mve_vcvtq_m_f32_s32:
11204 case ARM::BI__builtin_arm_mve_vcvtq_m_f32_u32:
11205 case ARM::BI__builtin_arm_mve_vcvtq_m_s16_f16:
11206 case ARM::BI__builtin_arm_mve_vcvtq_m_s32_f32:
11207 case ARM::BI__builtin_arm_mve_vcvtq_m_u16_f16:
11208 case ARM::BI__builtin_arm_mve_vcvtq_m_u32_f32: {
11209   uint32_t  Param0;
11210   llvm::Type * Param1;
11211   llvm::Type * Param2;
11212   llvm::Type * Param3;
11213   switch (BuiltinID) {
11214   case ARM::BI__builtin_arm_mve_vcvtq_m_f16_s16:
11215     Param0 = 0;
11216     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11217     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
11218     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
11219     break;
11220   case ARM::BI__builtin_arm_mve_vcvtq_m_f16_u16:
11221     Param0 = 1;
11222     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11223     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
11224     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
11225     break;
11226   case ARM::BI__builtin_arm_mve_vcvtq_m_f32_s32:
11227     Param0 = 0;
11228     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11229     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
11230     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11231     break;
11232   case ARM::BI__builtin_arm_mve_vcvtq_m_f32_u32:
11233     Param0 = 1;
11234     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11235     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
11236     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11237     break;
11238   case ARM::BI__builtin_arm_mve_vcvtq_m_s16_f16:
11239     Param0 = 0;
11240     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11241     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
11242     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
11243     break;
11244   case ARM::BI__builtin_arm_mve_vcvtq_m_s32_f32:
11245     Param0 = 0;
11246     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11247     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
11248     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
11249     break;
11250   case ARM::BI__builtin_arm_mve_vcvtq_m_u16_f16:
11251     Param0 = 1;
11252     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11253     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
11254     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
11255     break;
11256   case ARM::BI__builtin_arm_mve_vcvtq_m_u32_f32:
11257     Param0 = 1;
11258     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11259     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
11260     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
11261     break;
11262   }
11263   Value *Val0 = EmitScalarExpr(E->getArg(1));
11264   Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
11265   Value *Val2 = EmitScalarExpr(E->getArg(2));
11266   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
11267   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val3});
11268   Value *Val5 = EmitScalarExpr(E->getArg(0));
11269   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fp_int_predicated, {Param2, Param3, Param1}), {Val0, Val1, Val4, Val5});
11270 }
11271 case ARM::BI__builtin_arm_mve_vrev16q_m_s8:
11272 case ARM::BI__builtin_arm_mve_vrev16q_m_u8:
11273 case ARM::BI__builtin_arm_mve_vrev32q_m_f16:
11274 case ARM::BI__builtin_arm_mve_vrev32q_m_s16:
11275 case ARM::BI__builtin_arm_mve_vrev32q_m_s8:
11276 case ARM::BI__builtin_arm_mve_vrev32q_m_u16:
11277 case ARM::BI__builtin_arm_mve_vrev32q_m_u8:
11278 case ARM::BI__builtin_arm_mve_vrev64q_m_f16:
11279 case ARM::BI__builtin_arm_mve_vrev64q_m_f32:
11280 case ARM::BI__builtin_arm_mve_vrev64q_m_s16:
11281 case ARM::BI__builtin_arm_mve_vrev64q_m_s32:
11282 case ARM::BI__builtin_arm_mve_vrev64q_m_s8:
11283 case ARM::BI__builtin_arm_mve_vrev64q_m_u16:
11284 case ARM::BI__builtin_arm_mve_vrev64q_m_u32:
11285 case ARM::BI__builtin_arm_mve_vrev64q_m_u8: {
11286   uint32_t  Param0;
11287   llvm::Type * Param1;
11288   llvm::Type * Param2;
11289   switch (BuiltinID) {
11290   case ARM::BI__builtin_arm_mve_vrev16q_m_s8:
11291     Param0 = 16;
11292     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11293     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
11294     break;
11295   case ARM::BI__builtin_arm_mve_vrev16q_m_u8:
11296     Param0 = 16;
11297     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11298     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
11299     break;
11300   case ARM::BI__builtin_arm_mve_vrev32q_m_f16:
11301     Param0 = 32;
11302     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11303     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
11304     break;
11305   case ARM::BI__builtin_arm_mve_vrev32q_m_s16:
11306     Param0 = 32;
11307     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11308     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
11309     break;
11310   case ARM::BI__builtin_arm_mve_vrev32q_m_s8:
11311     Param0 = 32;
11312     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11313     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
11314     break;
11315   case ARM::BI__builtin_arm_mve_vrev32q_m_u16:
11316     Param0 = 32;
11317     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11318     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
11319     break;
11320   case ARM::BI__builtin_arm_mve_vrev32q_m_u8:
11321     Param0 = 32;
11322     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11323     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
11324     break;
11325   case ARM::BI__builtin_arm_mve_vrev64q_m_f16:
11326     Param0 = 64;
11327     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11328     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
11329     break;
11330   case ARM::BI__builtin_arm_mve_vrev64q_m_f32:
11331     Param0 = 64;
11332     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11333     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
11334     break;
11335   case ARM::BI__builtin_arm_mve_vrev64q_m_s16:
11336     Param0 = 64;
11337     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11338     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
11339     break;
11340   case ARM::BI__builtin_arm_mve_vrev64q_m_s32:
11341     Param0 = 64;
11342     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11343     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
11344     break;
11345   case ARM::BI__builtin_arm_mve_vrev64q_m_s8:
11346     Param0 = 64;
11347     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11348     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
11349     break;
11350   case ARM::BI__builtin_arm_mve_vrev64q_m_u16:
11351     Param0 = 64;
11352     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11353     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
11354     break;
11355   case ARM::BI__builtin_arm_mve_vrev64q_m_u32:
11356     Param0 = 64;
11357     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11358     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
11359     break;
11360   case ARM::BI__builtin_arm_mve_vrev64q_m_u8:
11361     Param0 = 64;
11362     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11363     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
11364     break;
11365   }
11366   Value *Val0 = EmitScalarExpr(E->getArg(1));
11367   Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
11368   Value *Val2 = EmitScalarExpr(E->getArg(2));
11369   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
11370   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val3});
11371   Value *Val5 = EmitScalarExpr(E->getArg(0));
11372   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vrev_predicated, {Param2, Param1}), {Val0, Val1, Val4, Val5});
11373 }
11374 case ARM::BI__builtin_arm_mve_vmovlbq_m_s16:
11375 case ARM::BI__builtin_arm_mve_vmovlbq_m_s8:
11376 case ARM::BI__builtin_arm_mve_vmovlbq_m_u16:
11377 case ARM::BI__builtin_arm_mve_vmovlbq_m_u8:
11378 case ARM::BI__builtin_arm_mve_vmovltq_m_s16:
11379 case ARM::BI__builtin_arm_mve_vmovltq_m_s8:
11380 case ARM::BI__builtin_arm_mve_vmovltq_m_u16:
11381 case ARM::BI__builtin_arm_mve_vmovltq_m_u8: {
11382   uint32_t  Param0;
11383   uint32_t  Param1;
11384   llvm::Type * Param2;
11385   llvm::Type * Param3;
11386   llvm::Type * Param4;
11387   switch (BuiltinID) {
11388   case ARM::BI__builtin_arm_mve_vmovlbq_m_s16:
11389     Param0 = 0;
11390     Param1 = 0;
11391     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11392     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11393     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
11394     break;
11395   case ARM::BI__builtin_arm_mve_vmovlbq_m_s8:
11396     Param0 = 0;
11397     Param1 = 0;
11398     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11399     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
11400     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
11401     break;
11402   case ARM::BI__builtin_arm_mve_vmovlbq_m_u16:
11403     Param0 = 1;
11404     Param1 = 0;
11405     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11406     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11407     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
11408     break;
11409   case ARM::BI__builtin_arm_mve_vmovlbq_m_u8:
11410     Param0 = 1;
11411     Param1 = 0;
11412     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11413     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
11414     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
11415     break;
11416   case ARM::BI__builtin_arm_mve_vmovltq_m_s16:
11417     Param0 = 0;
11418     Param1 = 1;
11419     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11420     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11421     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
11422     break;
11423   case ARM::BI__builtin_arm_mve_vmovltq_m_s8:
11424     Param0 = 0;
11425     Param1 = 1;
11426     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11427     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
11428     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
11429     break;
11430   case ARM::BI__builtin_arm_mve_vmovltq_m_u16:
11431     Param0 = 1;
11432     Param1 = 1;
11433     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11434     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11435     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
11436     break;
11437   case ARM::BI__builtin_arm_mve_vmovltq_m_u8:
11438     Param0 = 1;
11439     Param1 = 1;
11440     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11441     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
11442     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
11443     break;
11444   }
11445   Value *Val0 = EmitScalarExpr(E->getArg(1));
11446   Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
11447   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param1);
11448   Value *Val3 = EmitScalarExpr(E->getArg(2));
11449   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
11450   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param2}), {Val4});
11451   Value *Val6 = EmitScalarExpr(E->getArg(0));
11452   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmovl_predicated, {Param3, Param4, Param2}), {Val0, Val1, Val2, Val5, Val6});
11453 }
11454 case ARM::BI__builtin_arm_mve_vstrhq_s32:
11455 case ARM::BI__builtin_arm_mve_vstrhq_u32: {
11456   Value *Val0 = EmitScalarExpr(E->getArg(1));
11457   llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 4);
11458   Value *Val2 = Builder.CreateTrunc(Val0, Val1);
11459   Address Val3 = EmitPointerWithAlignment(E->getArg(0));
11460   Value *Val4 = Builder.CreatePointerCast((Val3.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 4)));
11461   Address Val5 = Address(Val4, llvm::FixedVectorType::get(Int16Ty, 4), CharUnits::fromQuantity(2));
11462   return Builder.CreateStore(Val2, Val5);
11463 }
11464 case ARM::BI__builtin_arm_mve_vstrhq_p_s32:
11465 case ARM::BI__builtin_arm_mve_vstrhq_p_u32: {
11466   Value *Val0 = EmitScalarExpr(E->getArg(1));
11467   llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 4);
11468   Value *Val2 = Builder.CreateTrunc(Val0, Val1);
11469   Address Val3 = EmitPointerWithAlignment(E->getArg(0));
11470   Value *Val4 = Builder.CreatePointerCast((Val3.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 4)));
11471   Value *Val5 = llvm::ConstantInt::get(Int32Ty, 2);
11472   Value *Val6 = EmitScalarExpr(E->getArg(2));
11473   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
11474   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
11475   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_store, {llvm::FixedVectorType::get(Int16Ty, 4), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 4))}), {Val2, Val4, Val5, Val8});
11476 }
11477 case ARM::BI__builtin_arm_mve_vandq_m_f16:
11478 case ARM::BI__builtin_arm_mve_vbicq_m_f16:
11479 case ARM::BI__builtin_arm_mve_veorq_m_f16:
11480 case ARM::BI__builtin_arm_mve_vornq_m_f16:
11481 case ARM::BI__builtin_arm_mve_vorrq_m_f16: {
11482   Intrinsic::ID  Param0;
11483   switch (BuiltinID) {
11484   case ARM::BI__builtin_arm_mve_vandq_m_f16:
11485     Param0 = Intrinsic::arm_mve_and_predicated;
11486     break;
11487   case ARM::BI__builtin_arm_mve_vbicq_m_f16:
11488     Param0 = Intrinsic::arm_mve_bic_predicated;
11489     break;
11490   case ARM::BI__builtin_arm_mve_veorq_m_f16:
11491     Param0 = Intrinsic::arm_mve_eor_predicated;
11492     break;
11493   case ARM::BI__builtin_arm_mve_vornq_m_f16:
11494     Param0 = Intrinsic::arm_mve_orn_predicated;
11495     break;
11496   case ARM::BI__builtin_arm_mve_vorrq_m_f16:
11497     Param0 = Intrinsic::arm_mve_orr_predicated;
11498     break;
11499   }
11500   Value *Val0 = EmitScalarExpr(E->getArg(1));
11501   llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
11502   Value *Val2 = Builder.CreateBitCast(Val0, Val1);
11503   Value *Val3 = EmitScalarExpr(E->getArg(2));
11504   llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
11505   Value *Val5 = Builder.CreateBitCast(Val3, Val4);
11506   Value *Val6 = EmitScalarExpr(E->getArg(3));
11507   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
11508   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
11509   Value *Val9 = EmitScalarExpr(E->getArg(0));
11510   llvm::Type *Val10 = llvm::FixedVectorType::get(Int16Ty, 8);
11511   Value *Val11 = Builder.CreateBitCast(Val9, Val10);
11512   Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val5, Val8, Val11});
11513   llvm::Type *Val13 = llvm::FixedVectorType::get(HalfTy, 8);
11514   return Builder.CreateBitCast(Val12, Val13);
11515 }
11516 case ARM::BI__builtin_arm_mve_vandq_m_s16:
11517 case ARM::BI__builtin_arm_mve_vandq_m_u16:
11518 case ARM::BI__builtin_arm_mve_vbicq_m_s16:
11519 case ARM::BI__builtin_arm_mve_vbicq_m_u16:
11520 case ARM::BI__builtin_arm_mve_veorq_m_s16:
11521 case ARM::BI__builtin_arm_mve_veorq_m_u16:
11522 case ARM::BI__builtin_arm_mve_vornq_m_s16:
11523 case ARM::BI__builtin_arm_mve_vornq_m_u16:
11524 case ARM::BI__builtin_arm_mve_vorrq_m_s16:
11525 case ARM::BI__builtin_arm_mve_vorrq_m_u16: {
11526   Intrinsic::ID  Param0;
11527   switch (BuiltinID) {
11528   case ARM::BI__builtin_arm_mve_vandq_m_s16:
11529     Param0 = Intrinsic::arm_mve_and_predicated;
11530     break;
11531   case ARM::BI__builtin_arm_mve_vandq_m_u16:
11532     Param0 = Intrinsic::arm_mve_and_predicated;
11533     break;
11534   case ARM::BI__builtin_arm_mve_vbicq_m_s16:
11535     Param0 = Intrinsic::arm_mve_bic_predicated;
11536     break;
11537   case ARM::BI__builtin_arm_mve_vbicq_m_u16:
11538     Param0 = Intrinsic::arm_mve_bic_predicated;
11539     break;
11540   case ARM::BI__builtin_arm_mve_veorq_m_s16:
11541     Param0 = Intrinsic::arm_mve_eor_predicated;
11542     break;
11543   case ARM::BI__builtin_arm_mve_veorq_m_u16:
11544     Param0 = Intrinsic::arm_mve_eor_predicated;
11545     break;
11546   case ARM::BI__builtin_arm_mve_vornq_m_s16:
11547     Param0 = Intrinsic::arm_mve_orn_predicated;
11548     break;
11549   case ARM::BI__builtin_arm_mve_vornq_m_u16:
11550     Param0 = Intrinsic::arm_mve_orn_predicated;
11551     break;
11552   case ARM::BI__builtin_arm_mve_vorrq_m_s16:
11553     Param0 = Intrinsic::arm_mve_orr_predicated;
11554     break;
11555   case ARM::BI__builtin_arm_mve_vorrq_m_u16:
11556     Param0 = Intrinsic::arm_mve_orr_predicated;
11557     break;
11558   }
11559   Value *Val0 = EmitScalarExpr(E->getArg(1));
11560   llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
11561   Value *Val2 = Builder.CreateBitCast(Val0, Val1);
11562   Value *Val3 = EmitScalarExpr(E->getArg(2));
11563   llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
11564   Value *Val5 = Builder.CreateBitCast(Val3, Val4);
11565   Value *Val6 = EmitScalarExpr(E->getArg(3));
11566   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
11567   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
11568   Value *Val9 = EmitScalarExpr(E->getArg(0));
11569   llvm::Type *Val10 = llvm::FixedVectorType::get(Int16Ty, 8);
11570   Value *Val11 = Builder.CreateBitCast(Val9, Val10);
11571   Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val5, Val8, Val11});
11572   llvm::Type *Val13 = llvm::FixedVectorType::get(Int16Ty, 8);
11573   return Builder.CreateBitCast(Val12, Val13);
11574 }
11575 case ARM::BI__builtin_arm_mve_vmaxaq_s16: {
11576   Value *Val0 = EmitScalarExpr(E->getArg(1));
11577   llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
11578   Value *Val2 = llvm::Constant::getNullValue(Val1);
11579   Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
11580   llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
11581   Value *Val5 = llvm::Constant::getNullValue(Val4);
11582   Value *Val6 = Builder.CreateSub(Val5, Val0);
11583   Value *Val7 = Builder.CreateSelect(Val3, Val6, Val0);
11584   Value *Val8 = EmitScalarExpr(E->getArg(0));
11585   Value *Val9 = Builder.CreateICmpUGE(Val8, Val7);
11586   return Builder.CreateSelect(Val9, Val8, Val7);
11587 }
11588 case ARM::BI__builtin_arm_mve_vminaq_s16: {
11589   Value *Val0 = EmitScalarExpr(E->getArg(1));
11590   llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
11591   Value *Val2 = llvm::Constant::getNullValue(Val1);
11592   Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
11593   llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
11594   Value *Val5 = llvm::Constant::getNullValue(Val4);
11595   Value *Val6 = Builder.CreateSub(Val5, Val0);
11596   Value *Val7 = Builder.CreateSelect(Val3, Val6, Val0);
11597   Value *Val8 = EmitScalarExpr(E->getArg(0));
11598   Value *Val9 = Builder.CreateICmpULE(Val8, Val7);
11599   return Builder.CreateSelect(Val9, Val8, Val7);
11600 }
11601 case ARM::BI__builtin_arm_mve_vandq_m_f32:
11602 case ARM::BI__builtin_arm_mve_vbicq_m_f32:
11603 case ARM::BI__builtin_arm_mve_veorq_m_f32:
11604 case ARM::BI__builtin_arm_mve_vornq_m_f32:
11605 case ARM::BI__builtin_arm_mve_vorrq_m_f32: {
11606   Intrinsic::ID  Param0;
11607   switch (BuiltinID) {
11608   case ARM::BI__builtin_arm_mve_vandq_m_f32:
11609     Param0 = Intrinsic::arm_mve_and_predicated;
11610     break;
11611   case ARM::BI__builtin_arm_mve_vbicq_m_f32:
11612     Param0 = Intrinsic::arm_mve_bic_predicated;
11613     break;
11614   case ARM::BI__builtin_arm_mve_veorq_m_f32:
11615     Param0 = Intrinsic::arm_mve_eor_predicated;
11616     break;
11617   case ARM::BI__builtin_arm_mve_vornq_m_f32:
11618     Param0 = Intrinsic::arm_mve_orn_predicated;
11619     break;
11620   case ARM::BI__builtin_arm_mve_vorrq_m_f32:
11621     Param0 = Intrinsic::arm_mve_orr_predicated;
11622     break;
11623   }
11624   Value *Val0 = EmitScalarExpr(E->getArg(1));
11625   llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
11626   Value *Val2 = Builder.CreateBitCast(Val0, Val1);
11627   Value *Val3 = EmitScalarExpr(E->getArg(2));
11628   llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
11629   Value *Val5 = Builder.CreateBitCast(Val3, Val4);
11630   Value *Val6 = EmitScalarExpr(E->getArg(3));
11631   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
11632   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
11633   Value *Val9 = EmitScalarExpr(E->getArg(0));
11634   llvm::Type *Val10 = llvm::FixedVectorType::get(Int32Ty, 4);
11635   Value *Val11 = Builder.CreateBitCast(Val9, Val10);
11636   Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val5, Val8, Val11});
11637   llvm::Type *Val13 = llvm::FixedVectorType::get(FloatTy, 4);
11638   return Builder.CreateBitCast(Val12, Val13);
11639 }
11640 case ARM::BI__builtin_arm_mve_vandq_m_s32:
11641 case ARM::BI__builtin_arm_mve_vandq_m_u32:
11642 case ARM::BI__builtin_arm_mve_vbicq_m_s32:
11643 case ARM::BI__builtin_arm_mve_vbicq_m_u32:
11644 case ARM::BI__builtin_arm_mve_veorq_m_s32:
11645 case ARM::BI__builtin_arm_mve_veorq_m_u32:
11646 case ARM::BI__builtin_arm_mve_vornq_m_s32:
11647 case ARM::BI__builtin_arm_mve_vornq_m_u32:
11648 case ARM::BI__builtin_arm_mve_vorrq_m_s32:
11649 case ARM::BI__builtin_arm_mve_vorrq_m_u32: {
11650   Intrinsic::ID  Param0;
11651   switch (BuiltinID) {
11652   case ARM::BI__builtin_arm_mve_vandq_m_s32:
11653     Param0 = Intrinsic::arm_mve_and_predicated;
11654     break;
11655   case ARM::BI__builtin_arm_mve_vandq_m_u32:
11656     Param0 = Intrinsic::arm_mve_and_predicated;
11657     break;
11658   case ARM::BI__builtin_arm_mve_vbicq_m_s32:
11659     Param0 = Intrinsic::arm_mve_bic_predicated;
11660     break;
11661   case ARM::BI__builtin_arm_mve_vbicq_m_u32:
11662     Param0 = Intrinsic::arm_mve_bic_predicated;
11663     break;
11664   case ARM::BI__builtin_arm_mve_veorq_m_s32:
11665     Param0 = Intrinsic::arm_mve_eor_predicated;
11666     break;
11667   case ARM::BI__builtin_arm_mve_veorq_m_u32:
11668     Param0 = Intrinsic::arm_mve_eor_predicated;
11669     break;
11670   case ARM::BI__builtin_arm_mve_vornq_m_s32:
11671     Param0 = Intrinsic::arm_mve_orn_predicated;
11672     break;
11673   case ARM::BI__builtin_arm_mve_vornq_m_u32:
11674     Param0 = Intrinsic::arm_mve_orn_predicated;
11675     break;
11676   case ARM::BI__builtin_arm_mve_vorrq_m_s32:
11677     Param0 = Intrinsic::arm_mve_orr_predicated;
11678     break;
11679   case ARM::BI__builtin_arm_mve_vorrq_m_u32:
11680     Param0 = Intrinsic::arm_mve_orr_predicated;
11681     break;
11682   }
11683   Value *Val0 = EmitScalarExpr(E->getArg(1));
11684   llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
11685   Value *Val2 = Builder.CreateBitCast(Val0, Val1);
11686   Value *Val3 = EmitScalarExpr(E->getArg(2));
11687   llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
11688   Value *Val5 = Builder.CreateBitCast(Val3, Val4);
11689   Value *Val6 = EmitScalarExpr(E->getArg(3));
11690   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
11691   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
11692   Value *Val9 = EmitScalarExpr(E->getArg(0));
11693   llvm::Type *Val10 = llvm::FixedVectorType::get(Int32Ty, 4);
11694   Value *Val11 = Builder.CreateBitCast(Val9, Val10);
11695   Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val5, Val8, Val11});
11696   llvm::Type *Val13 = llvm::FixedVectorType::get(Int32Ty, 4);
11697   return Builder.CreateBitCast(Val12, Val13);
11698 }
11699 case ARM::BI__builtin_arm_mve_vmaxaq_s32: {
11700   Value *Val0 = EmitScalarExpr(E->getArg(1));
11701   llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
11702   Value *Val2 = llvm::Constant::getNullValue(Val1);
11703   Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
11704   llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
11705   Value *Val5 = llvm::Constant::getNullValue(Val4);
11706   Value *Val6 = Builder.CreateSub(Val5, Val0);
11707   Value *Val7 = Builder.CreateSelect(Val3, Val6, Val0);
11708   Value *Val8 = EmitScalarExpr(E->getArg(0));
11709   Value *Val9 = Builder.CreateICmpUGE(Val8, Val7);
11710   return Builder.CreateSelect(Val9, Val8, Val7);
11711 }
11712 case ARM::BI__builtin_arm_mve_vminaq_s32: {
11713   Value *Val0 = EmitScalarExpr(E->getArg(1));
11714   llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
11715   Value *Val2 = llvm::Constant::getNullValue(Val1);
11716   Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
11717   llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
11718   Value *Val5 = llvm::Constant::getNullValue(Val4);
11719   Value *Val6 = Builder.CreateSub(Val5, Val0);
11720   Value *Val7 = Builder.CreateSelect(Val3, Val6, Val0);
11721   Value *Val8 = EmitScalarExpr(E->getArg(0));
11722   Value *Val9 = Builder.CreateICmpULE(Val8, Val7);
11723   return Builder.CreateSelect(Val9, Val8, Val7);
11724 }
11725 case ARM::BI__builtin_arm_mve_vandq_m_s8:
11726 case ARM::BI__builtin_arm_mve_vandq_m_u8:
11727 case ARM::BI__builtin_arm_mve_vbicq_m_s8:
11728 case ARM::BI__builtin_arm_mve_vbicq_m_u8:
11729 case ARM::BI__builtin_arm_mve_veorq_m_s8:
11730 case ARM::BI__builtin_arm_mve_veorq_m_u8:
11731 case ARM::BI__builtin_arm_mve_vornq_m_s8:
11732 case ARM::BI__builtin_arm_mve_vornq_m_u8:
11733 case ARM::BI__builtin_arm_mve_vorrq_m_s8:
11734 case ARM::BI__builtin_arm_mve_vorrq_m_u8: {
11735   Intrinsic::ID  Param0;
11736   switch (BuiltinID) {
11737   case ARM::BI__builtin_arm_mve_vandq_m_s8:
11738     Param0 = Intrinsic::arm_mve_and_predicated;
11739     break;
11740   case ARM::BI__builtin_arm_mve_vandq_m_u8:
11741     Param0 = Intrinsic::arm_mve_and_predicated;
11742     break;
11743   case ARM::BI__builtin_arm_mve_vbicq_m_s8:
11744     Param0 = Intrinsic::arm_mve_bic_predicated;
11745     break;
11746   case ARM::BI__builtin_arm_mve_vbicq_m_u8:
11747     Param0 = Intrinsic::arm_mve_bic_predicated;
11748     break;
11749   case ARM::BI__builtin_arm_mve_veorq_m_s8:
11750     Param0 = Intrinsic::arm_mve_eor_predicated;
11751     break;
11752   case ARM::BI__builtin_arm_mve_veorq_m_u8:
11753     Param0 = Intrinsic::arm_mve_eor_predicated;
11754     break;
11755   case ARM::BI__builtin_arm_mve_vornq_m_s8:
11756     Param0 = Intrinsic::arm_mve_orn_predicated;
11757     break;
11758   case ARM::BI__builtin_arm_mve_vornq_m_u8:
11759     Param0 = Intrinsic::arm_mve_orn_predicated;
11760     break;
11761   case ARM::BI__builtin_arm_mve_vorrq_m_s8:
11762     Param0 = Intrinsic::arm_mve_orr_predicated;
11763     break;
11764   case ARM::BI__builtin_arm_mve_vorrq_m_u8:
11765     Param0 = Intrinsic::arm_mve_orr_predicated;
11766     break;
11767   }
11768   Value *Val0 = EmitScalarExpr(E->getArg(1));
11769   llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
11770   Value *Val2 = Builder.CreateBitCast(Val0, Val1);
11771   Value *Val3 = EmitScalarExpr(E->getArg(2));
11772   llvm::Type *Val4 = llvm::FixedVectorType::get(Int8Ty, 16);
11773   Value *Val5 = Builder.CreateBitCast(Val3, Val4);
11774   Value *Val6 = EmitScalarExpr(E->getArg(3));
11775   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
11776   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val7});
11777   Value *Val9 = EmitScalarExpr(E->getArg(0));
11778   llvm::Type *Val10 = llvm::FixedVectorType::get(Int8Ty, 16);
11779   Value *Val11 = Builder.CreateBitCast(Val9, Val10);
11780   Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val5, Val8, Val11});
11781   llvm::Type *Val13 = llvm::FixedVectorType::get(Int8Ty, 16);
11782   return Builder.CreateBitCast(Val12, Val13);
11783 }
11784 case ARM::BI__builtin_arm_mve_vmaxaq_s8: {
11785   Value *Val0 = EmitScalarExpr(E->getArg(1));
11786   llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
11787   Value *Val2 = llvm::Constant::getNullValue(Val1);
11788   Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
11789   llvm::Type *Val4 = llvm::FixedVectorType::get(Int8Ty, 16);
11790   Value *Val5 = llvm::Constant::getNullValue(Val4);
11791   Value *Val6 = Builder.CreateSub(Val5, Val0);
11792   Value *Val7 = Builder.CreateSelect(Val3, Val6, Val0);
11793   Value *Val8 = EmitScalarExpr(E->getArg(0));
11794   Value *Val9 = Builder.CreateICmpUGE(Val8, Val7);
11795   return Builder.CreateSelect(Val9, Val8, Val7);
11796 }
11797 case ARM::BI__builtin_arm_mve_vminaq_s8: {
11798   Value *Val0 = EmitScalarExpr(E->getArg(1));
11799   llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
11800   Value *Val2 = llvm::Constant::getNullValue(Val1);
11801   Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
11802   llvm::Type *Val4 = llvm::FixedVectorType::get(Int8Ty, 16);
11803   Value *Val5 = llvm::Constant::getNullValue(Val4);
11804   Value *Val6 = Builder.CreateSub(Val5, Val0);
11805   Value *Val7 = Builder.CreateSelect(Val3, Val6, Val0);
11806   Value *Val8 = EmitScalarExpr(E->getArg(0));
11807   Value *Val9 = Builder.CreateICmpULE(Val8, Val7);
11808   return Builder.CreateSelect(Val9, Val8, Val7);
11809 }
11810 case ARM::BI__builtin_arm_mve_vstrbq_s32:
11811 case ARM::BI__builtin_arm_mve_vstrbq_u32: {
11812   Value *Val0 = EmitScalarExpr(E->getArg(1));
11813   llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 4);
11814   Value *Val2 = Builder.CreateTrunc(Val0, Val1);
11815   Address Val3 = EmitPointerWithAlignment(E->getArg(0));
11816   Value *Val4 = Builder.CreatePointerCast((Val3.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 4)));
11817   Address Val5 = Address(Val4, llvm::FixedVectorType::get(Int8Ty, 4), CharUnits::fromQuantity(1));
11818   return Builder.CreateStore(Val2, Val5);
11819 }
11820 case ARM::BI__builtin_arm_mve_vstrbq_p_s32:
11821 case ARM::BI__builtin_arm_mve_vstrbq_p_u32: {
11822   Value *Val0 = EmitScalarExpr(E->getArg(1));
11823   llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 4);
11824   Value *Val2 = Builder.CreateTrunc(Val0, Val1);
11825   Address Val3 = EmitPointerWithAlignment(E->getArg(0));
11826   Value *Val4 = Builder.CreatePointerCast((Val3.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 4)));
11827   Value *Val5 = llvm::ConstantInt::get(Int32Ty, 1);
11828   Value *Val6 = EmitScalarExpr(E->getArg(2));
11829   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
11830   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
11831   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_store, {llvm::FixedVectorType::get(Int8Ty, 4), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 4))}), {Val2, Val4, Val5, Val8});
11832 }
11833 case ARM::BI__builtin_arm_mve_vstrbq_s16:
11834 case ARM::BI__builtin_arm_mve_vstrbq_u16: {
11835   Value *Val0 = EmitScalarExpr(E->getArg(1));
11836   llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 8);
11837   Value *Val2 = Builder.CreateTrunc(Val0, Val1);
11838   Address Val3 = EmitPointerWithAlignment(E->getArg(0));
11839   Value *Val4 = Builder.CreatePointerCast((Val3.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 8)));
11840   Address Val5 = Address(Val4, llvm::FixedVectorType::get(Int8Ty, 8), CharUnits::fromQuantity(1));
11841   return Builder.CreateStore(Val2, Val5);
11842 }
11843 case ARM::BI__builtin_arm_mve_vstrbq_p_s16:
11844 case ARM::BI__builtin_arm_mve_vstrbq_p_u16: {
11845   Value *Val0 = EmitScalarExpr(E->getArg(1));
11846   llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 8);
11847   Value *Val2 = Builder.CreateTrunc(Val0, Val1);
11848   Address Val3 = EmitPointerWithAlignment(E->getArg(0));
11849   Value *Val4 = Builder.CreatePointerCast((Val3.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 8)));
11850   Value *Val5 = llvm::ConstantInt::get(Int32Ty, 1);
11851   Value *Val6 = EmitScalarExpr(E->getArg(2));
11852   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
11853   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
11854   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_store, {llvm::FixedVectorType::get(Int8Ty, 8), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 8))}), {Val2, Val4, Val5, Val8});
11855 }
11856 case ARM::BI__builtin_arm_mve_vfmasq_n_f16:
11857 case ARM::BI__builtin_arm_mve_vfmasq_n_f32: {
11858   llvm::Type * Param0;
11859   switch (BuiltinID) {
11860   case ARM::BI__builtin_arm_mve_vfmasq_n_f16:
11861     Param0 = llvm::FixedVectorType::get(HalfTy, 8);
11862     break;
11863   case ARM::BI__builtin_arm_mve_vfmasq_n_f32:
11864     Param0 = llvm::FixedVectorType::get(FloatTy, 4);
11865     break;
11866   }
11867   Value *Val0 = EmitScalarExpr(E->getArg(2));
11868   Value *Val1 = ARMMVEVectorSplat(Builder, Val0);
11869   Value *Val2 = EmitScalarExpr(E->getArg(0));
11870   Value *Val3 = EmitScalarExpr(E->getArg(1));
11871   Value *Val4 = (Val3);
11872   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fma, {Param0}), {Val2, Val4, Val1});
11873 }
11874 case ARM::BI__builtin_arm_mve_vfmaq_m_n_f16:
11875 case ARM::BI__builtin_arm_mve_vfmaq_m_n_f32: {
11876   llvm::Type * Param0;
11877   llvm::Type * Param1;
11878   switch (BuiltinID) {
11879   case ARM::BI__builtin_arm_mve_vfmaq_m_n_f16:
11880     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11881     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
11882     break;
11883   case ARM::BI__builtin_arm_mve_vfmaq_m_n_f32:
11884     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11885     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
11886     break;
11887   }
11888   Value *Val0 = EmitScalarExpr(E->getArg(2));
11889   Value *Val1 = ARMMVEVectorSplat(Builder, Val0);
11890   Value *Val2 = EmitScalarExpr(E->getArg(1));
11891   Value *Val3 = (Val1);
11892   Value *Val4 = EmitScalarExpr(E->getArg(0));
11893   Value *Val5 = EmitScalarExpr(E->getArg(3));
11894   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
11895   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val6});
11896   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_fma_predicated, {Param1, Param0}), {Val2, Val3, Val4, Val7});
11897 }
11898 case ARM::BI__builtin_arm_mve_vfmaq_n_f16:
11899 case ARM::BI__builtin_arm_mve_vfmaq_n_f32: {
11900   llvm::Type * Param0;
11901   switch (BuiltinID) {
11902   case ARM::BI__builtin_arm_mve_vfmaq_n_f16:
11903     Param0 = llvm::FixedVectorType::get(HalfTy, 8);
11904     break;
11905   case ARM::BI__builtin_arm_mve_vfmaq_n_f32:
11906     Param0 = llvm::FixedVectorType::get(FloatTy, 4);
11907     break;
11908   }
11909   Value *Val0 = EmitScalarExpr(E->getArg(2));
11910   Value *Val1 = ARMMVEVectorSplat(Builder, Val0);
11911   Value *Val2 = EmitScalarExpr(E->getArg(1));
11912   Value *Val3 = (Val1);
11913   Value *Val4 = EmitScalarExpr(E->getArg(0));
11914   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fma, {Param0}), {Val2, Val3, Val4});
11915 }
11916 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_f16:
11917 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_f32: {
11918   llvm::Type * Param0;
11919   switch (BuiltinID) {
11920   case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_f16:
11921     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11922     break;
11923   case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_f32:
11924     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11925     break;
11926   }
11927   Value *Val0 = EmitScalarExpr(E->getArg(2));
11928   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
11929   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
11930   Value *Val3 = EmitScalarExpr(E->getArg(0));
11931   Value *Val4 = EmitScalarExpr(E->getArg(1));
11932   Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
11933   Value *Val6 = Builder.CreateFCmpOEQ(Val3, Val5);
11934   Value *Val7 = Builder.CreateAnd(Val2, Val6);
11935   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
11936   return Builder.CreateIntCast(Val8, Int16Ty, false);
11937 }
11938 case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_f16:
11939 case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_f32: {
11940   llvm::Type * Param0;
11941   switch (BuiltinID) {
11942   case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_f16:
11943     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11944     break;
11945   case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_f32:
11946     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11947     break;
11948   }
11949   Value *Val0 = EmitScalarExpr(E->getArg(2));
11950   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
11951   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
11952   Value *Val3 = EmitScalarExpr(E->getArg(0));
11953   Value *Val4 = EmitScalarExpr(E->getArg(1));
11954   Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
11955   Value *Val6 = Builder.CreateFCmpOGE(Val3, Val5);
11956   Value *Val7 = Builder.CreateAnd(Val2, Val6);
11957   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
11958   return Builder.CreateIntCast(Val8, Int16Ty, false);
11959 }
11960 case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_f16:
11961 case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_f32: {
11962   llvm::Type * Param0;
11963   switch (BuiltinID) {
11964   case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_f16:
11965     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11966     break;
11967   case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_f32:
11968     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11969     break;
11970   }
11971   Value *Val0 = EmitScalarExpr(E->getArg(2));
11972   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
11973   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
11974   Value *Val3 = EmitScalarExpr(E->getArg(0));
11975   Value *Val4 = EmitScalarExpr(E->getArg(1));
11976   Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
11977   Value *Val6 = Builder.CreateFCmpOGT(Val3, Val5);
11978   Value *Val7 = Builder.CreateAnd(Val2, Val6);
11979   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
11980   return Builder.CreateIntCast(Val8, Int16Ty, false);
11981 }
11982 case ARM::BI__builtin_arm_mve_vcmpleq_m_n_f16:
11983 case ARM::BI__builtin_arm_mve_vcmpleq_m_n_f32: {
11984   llvm::Type * Param0;
11985   switch (BuiltinID) {
11986   case ARM::BI__builtin_arm_mve_vcmpleq_m_n_f16:
11987     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11988     break;
11989   case ARM::BI__builtin_arm_mve_vcmpleq_m_n_f32:
11990     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11991     break;
11992   }
11993   Value *Val0 = EmitScalarExpr(E->getArg(2));
11994   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
11995   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
11996   Value *Val3 = EmitScalarExpr(E->getArg(0));
11997   Value *Val4 = EmitScalarExpr(E->getArg(1));
11998   Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
11999   Value *Val6 = Builder.CreateFCmpULE(Val3, Val5);
12000   Value *Val7 = Builder.CreateAnd(Val2, Val6);
12001   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12002   return Builder.CreateIntCast(Val8, Int16Ty, false);
12003 }
12004 case ARM::BI__builtin_arm_mve_vcmpltq_m_n_f16:
12005 case ARM::BI__builtin_arm_mve_vcmpltq_m_n_f32: {
12006   llvm::Type * Param0;
12007   switch (BuiltinID) {
12008   case ARM::BI__builtin_arm_mve_vcmpltq_m_n_f16:
12009     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12010     break;
12011   case ARM::BI__builtin_arm_mve_vcmpltq_m_n_f32:
12012     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12013     break;
12014   }
12015   Value *Val0 = EmitScalarExpr(E->getArg(2));
12016   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12017   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12018   Value *Val3 = EmitScalarExpr(E->getArg(0));
12019   Value *Val4 = EmitScalarExpr(E->getArg(1));
12020   Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12021   Value *Val6 = Builder.CreateFCmpULT(Val3, Val5);
12022   Value *Val7 = Builder.CreateAnd(Val2, Val6);
12023   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12024   return Builder.CreateIntCast(Val8, Int16Ty, false);
12025 }
12026 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_f16:
12027 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_f32: {
12028   llvm::Type * Param0;
12029   switch (BuiltinID) {
12030   case ARM::BI__builtin_arm_mve_vcmpneq_m_n_f16:
12031     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12032     break;
12033   case ARM::BI__builtin_arm_mve_vcmpneq_m_n_f32:
12034     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12035     break;
12036   }
12037   Value *Val0 = EmitScalarExpr(E->getArg(2));
12038   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12039   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12040   Value *Val3 = EmitScalarExpr(E->getArg(0));
12041   Value *Val4 = EmitScalarExpr(E->getArg(1));
12042   Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12043   Value *Val6 = Builder.CreateFCmpUNE(Val3, Val5);
12044   Value *Val7 = Builder.CreateAnd(Val2, Val6);
12045   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12046   return Builder.CreateIntCast(Val8, Int16Ty, false);
12047 }
12048 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_s16:
12049 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_s32:
12050 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_s8:
12051 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_u16:
12052 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_u32:
12053 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_u8: {
12054   llvm::Type * Param0;
12055   switch (BuiltinID) {
12056   case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_s16:
12057     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12058     break;
12059   case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_s32:
12060     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12061     break;
12062   case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_s8:
12063     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12064     break;
12065   case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_u16:
12066     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12067     break;
12068   case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_u32:
12069     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12070     break;
12071   case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_u8:
12072     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12073     break;
12074   }
12075   Value *Val0 = EmitScalarExpr(E->getArg(2));
12076   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12077   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12078   Value *Val3 = EmitScalarExpr(E->getArg(0));
12079   Value *Val4 = EmitScalarExpr(E->getArg(1));
12080   Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12081   Value *Val6 = Builder.CreateICmpEQ(Val3, Val5);
12082   Value *Val7 = Builder.CreateAnd(Val2, Val6);
12083   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12084   return Builder.CreateIntCast(Val8, Int16Ty, false);
12085 }
12086 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_s16:
12087 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_s32:
12088 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_s8:
12089 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_u16:
12090 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_u32:
12091 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_u8: {
12092   llvm::Type * Param0;
12093   switch (BuiltinID) {
12094   case ARM::BI__builtin_arm_mve_vcmpneq_m_n_s16:
12095     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12096     break;
12097   case ARM::BI__builtin_arm_mve_vcmpneq_m_n_s32:
12098     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12099     break;
12100   case ARM::BI__builtin_arm_mve_vcmpneq_m_n_s8:
12101     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12102     break;
12103   case ARM::BI__builtin_arm_mve_vcmpneq_m_n_u16:
12104     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12105     break;
12106   case ARM::BI__builtin_arm_mve_vcmpneq_m_n_u32:
12107     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12108     break;
12109   case ARM::BI__builtin_arm_mve_vcmpneq_m_n_u8:
12110     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12111     break;
12112   }
12113   Value *Val0 = EmitScalarExpr(E->getArg(2));
12114   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12115   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12116   Value *Val3 = EmitScalarExpr(E->getArg(0));
12117   Value *Val4 = EmitScalarExpr(E->getArg(1));
12118   Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12119   Value *Val6 = Builder.CreateICmpNE(Val3, Val5);
12120   Value *Val7 = Builder.CreateAnd(Val2, Val6);
12121   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12122   return Builder.CreateIntCast(Val8, Int16Ty, false);
12123 }
12124 case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_s16:
12125 case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_s32:
12126 case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_s8: {
12127   llvm::Type * Param0;
12128   switch (BuiltinID) {
12129   case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_s16:
12130     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12131     break;
12132   case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_s32:
12133     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12134     break;
12135   case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_s8:
12136     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12137     break;
12138   }
12139   Value *Val0 = EmitScalarExpr(E->getArg(2));
12140   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12141   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12142   Value *Val3 = EmitScalarExpr(E->getArg(0));
12143   Value *Val4 = EmitScalarExpr(E->getArg(1));
12144   Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12145   Value *Val6 = Builder.CreateICmpSGE(Val3, Val5);
12146   Value *Val7 = Builder.CreateAnd(Val2, Val6);
12147   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12148   return Builder.CreateIntCast(Val8, Int16Ty, false);
12149 }
12150 case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_s16:
12151 case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_s32:
12152 case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_s8: {
12153   llvm::Type * Param0;
12154   switch (BuiltinID) {
12155   case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_s16:
12156     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12157     break;
12158   case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_s32:
12159     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12160     break;
12161   case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_s8:
12162     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12163     break;
12164   }
12165   Value *Val0 = EmitScalarExpr(E->getArg(2));
12166   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12167   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12168   Value *Val3 = EmitScalarExpr(E->getArg(0));
12169   Value *Val4 = EmitScalarExpr(E->getArg(1));
12170   Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12171   Value *Val6 = Builder.CreateICmpSGT(Val3, Val5);
12172   Value *Val7 = Builder.CreateAnd(Val2, Val6);
12173   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12174   return Builder.CreateIntCast(Val8, Int16Ty, false);
12175 }
12176 case ARM::BI__builtin_arm_mve_vcmpleq_m_n_s16:
12177 case ARM::BI__builtin_arm_mve_vcmpleq_m_n_s32:
12178 case ARM::BI__builtin_arm_mve_vcmpleq_m_n_s8: {
12179   llvm::Type * Param0;
12180   switch (BuiltinID) {
12181   case ARM::BI__builtin_arm_mve_vcmpleq_m_n_s16:
12182     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12183     break;
12184   case ARM::BI__builtin_arm_mve_vcmpleq_m_n_s32:
12185     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12186     break;
12187   case ARM::BI__builtin_arm_mve_vcmpleq_m_n_s8:
12188     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12189     break;
12190   }
12191   Value *Val0 = EmitScalarExpr(E->getArg(2));
12192   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12193   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12194   Value *Val3 = EmitScalarExpr(E->getArg(0));
12195   Value *Val4 = EmitScalarExpr(E->getArg(1));
12196   Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12197   Value *Val6 = Builder.CreateICmpSLE(Val3, Val5);
12198   Value *Val7 = Builder.CreateAnd(Val2, Val6);
12199   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12200   return Builder.CreateIntCast(Val8, Int16Ty, false);
12201 }
12202 case ARM::BI__builtin_arm_mve_vcmpltq_m_n_s16:
12203 case ARM::BI__builtin_arm_mve_vcmpltq_m_n_s32:
12204 case ARM::BI__builtin_arm_mve_vcmpltq_m_n_s8: {
12205   llvm::Type * Param0;
12206   switch (BuiltinID) {
12207   case ARM::BI__builtin_arm_mve_vcmpltq_m_n_s16:
12208     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12209     break;
12210   case ARM::BI__builtin_arm_mve_vcmpltq_m_n_s32:
12211     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12212     break;
12213   case ARM::BI__builtin_arm_mve_vcmpltq_m_n_s8:
12214     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12215     break;
12216   }
12217   Value *Val0 = EmitScalarExpr(E->getArg(2));
12218   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12219   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12220   Value *Val3 = EmitScalarExpr(E->getArg(0));
12221   Value *Val4 = EmitScalarExpr(E->getArg(1));
12222   Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12223   Value *Val6 = Builder.CreateICmpSLT(Val3, Val5);
12224   Value *Val7 = Builder.CreateAnd(Val2, Val6);
12225   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12226   return Builder.CreateIntCast(Val8, Int16Ty, false);
12227 }
12228 case ARM::BI__builtin_arm_mve_vcmpcsq_m_n_u16:
12229 case ARM::BI__builtin_arm_mve_vcmpcsq_m_n_u32:
12230 case ARM::BI__builtin_arm_mve_vcmpcsq_m_n_u8: {
12231   llvm::Type * Param0;
12232   switch (BuiltinID) {
12233   case ARM::BI__builtin_arm_mve_vcmpcsq_m_n_u16:
12234     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12235     break;
12236   case ARM::BI__builtin_arm_mve_vcmpcsq_m_n_u32:
12237     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12238     break;
12239   case ARM::BI__builtin_arm_mve_vcmpcsq_m_n_u8:
12240     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12241     break;
12242   }
12243   Value *Val0 = EmitScalarExpr(E->getArg(2));
12244   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12245   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12246   Value *Val3 = EmitScalarExpr(E->getArg(0));
12247   Value *Val4 = EmitScalarExpr(E->getArg(1));
12248   Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12249   Value *Val6 = Builder.CreateICmpUGE(Val3, Val5);
12250   Value *Val7 = Builder.CreateAnd(Val2, Val6);
12251   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12252   return Builder.CreateIntCast(Val8, Int16Ty, false);
12253 }
12254 case ARM::BI__builtin_arm_mve_vcmphiq_m_n_u16:
12255 case ARM::BI__builtin_arm_mve_vcmphiq_m_n_u32:
12256 case ARM::BI__builtin_arm_mve_vcmphiq_m_n_u8: {
12257   llvm::Type * Param0;
12258   switch (BuiltinID) {
12259   case ARM::BI__builtin_arm_mve_vcmphiq_m_n_u16:
12260     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12261     break;
12262   case ARM::BI__builtin_arm_mve_vcmphiq_m_n_u32:
12263     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12264     break;
12265   case ARM::BI__builtin_arm_mve_vcmphiq_m_n_u8:
12266     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12267     break;
12268   }
12269   Value *Val0 = EmitScalarExpr(E->getArg(2));
12270   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12271   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12272   Value *Val3 = EmitScalarExpr(E->getArg(0));
12273   Value *Val4 = EmitScalarExpr(E->getArg(1));
12274   Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12275   Value *Val6 = Builder.CreateICmpUGT(Val3, Val5);
12276   Value *Val7 = Builder.CreateAnd(Val2, Val6);
12277   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12278   return Builder.CreateIntCast(Val8, Int16Ty, false);
12279 }
12280 case ARM::BI__builtin_arm_mve_vcmpeqq_m_f16:
12281 case ARM::BI__builtin_arm_mve_vcmpeqq_m_f32: {
12282   llvm::Type * Param0;
12283   switch (BuiltinID) {
12284   case ARM::BI__builtin_arm_mve_vcmpeqq_m_f16:
12285     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12286     break;
12287   case ARM::BI__builtin_arm_mve_vcmpeqq_m_f32:
12288     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12289     break;
12290   }
12291   Value *Val0 = EmitScalarExpr(E->getArg(2));
12292   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12293   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12294   Value *Val3 = EmitScalarExpr(E->getArg(0));
12295   Value *Val4 = EmitScalarExpr(E->getArg(1));
12296   Value *Val5 = Builder.CreateFCmpOEQ(Val3, Val4);
12297   Value *Val6 = Builder.CreateAnd(Val2, Val5);
12298   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12299   return Builder.CreateIntCast(Val7, Int16Ty, false);
12300 }
12301 case ARM::BI__builtin_arm_mve_vcmpgeq_m_f16:
12302 case ARM::BI__builtin_arm_mve_vcmpgeq_m_f32: {
12303   llvm::Type * Param0;
12304   switch (BuiltinID) {
12305   case ARM::BI__builtin_arm_mve_vcmpgeq_m_f16:
12306     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12307     break;
12308   case ARM::BI__builtin_arm_mve_vcmpgeq_m_f32:
12309     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12310     break;
12311   }
12312   Value *Val0 = EmitScalarExpr(E->getArg(2));
12313   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12314   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12315   Value *Val3 = EmitScalarExpr(E->getArg(0));
12316   Value *Val4 = EmitScalarExpr(E->getArg(1));
12317   Value *Val5 = Builder.CreateFCmpOGE(Val3, Val4);
12318   Value *Val6 = Builder.CreateAnd(Val2, Val5);
12319   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12320   return Builder.CreateIntCast(Val7, Int16Ty, false);
12321 }
12322 case ARM::BI__builtin_arm_mve_vcmpgtq_m_f16:
12323 case ARM::BI__builtin_arm_mve_vcmpgtq_m_f32: {
12324   llvm::Type * Param0;
12325   switch (BuiltinID) {
12326   case ARM::BI__builtin_arm_mve_vcmpgtq_m_f16:
12327     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12328     break;
12329   case ARM::BI__builtin_arm_mve_vcmpgtq_m_f32:
12330     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12331     break;
12332   }
12333   Value *Val0 = EmitScalarExpr(E->getArg(2));
12334   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12335   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12336   Value *Val3 = EmitScalarExpr(E->getArg(0));
12337   Value *Val4 = EmitScalarExpr(E->getArg(1));
12338   Value *Val5 = Builder.CreateFCmpOGT(Val3, Val4);
12339   Value *Val6 = Builder.CreateAnd(Val2, Val5);
12340   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12341   return Builder.CreateIntCast(Val7, Int16Ty, false);
12342 }
12343 case ARM::BI__builtin_arm_mve_vcmpleq_m_f16:
12344 case ARM::BI__builtin_arm_mve_vcmpleq_m_f32: {
12345   llvm::Type * Param0;
12346   switch (BuiltinID) {
12347   case ARM::BI__builtin_arm_mve_vcmpleq_m_f16:
12348     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12349     break;
12350   case ARM::BI__builtin_arm_mve_vcmpleq_m_f32:
12351     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12352     break;
12353   }
12354   Value *Val0 = EmitScalarExpr(E->getArg(2));
12355   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12356   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12357   Value *Val3 = EmitScalarExpr(E->getArg(0));
12358   Value *Val4 = EmitScalarExpr(E->getArg(1));
12359   Value *Val5 = Builder.CreateFCmpULE(Val3, Val4);
12360   Value *Val6 = Builder.CreateAnd(Val2, Val5);
12361   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12362   return Builder.CreateIntCast(Val7, Int16Ty, false);
12363 }
12364 case ARM::BI__builtin_arm_mve_vcmpltq_m_f16:
12365 case ARM::BI__builtin_arm_mve_vcmpltq_m_f32: {
12366   llvm::Type * Param0;
12367   switch (BuiltinID) {
12368   case ARM::BI__builtin_arm_mve_vcmpltq_m_f16:
12369     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12370     break;
12371   case ARM::BI__builtin_arm_mve_vcmpltq_m_f32:
12372     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12373     break;
12374   }
12375   Value *Val0 = EmitScalarExpr(E->getArg(2));
12376   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12377   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12378   Value *Val3 = EmitScalarExpr(E->getArg(0));
12379   Value *Val4 = EmitScalarExpr(E->getArg(1));
12380   Value *Val5 = Builder.CreateFCmpULT(Val3, Val4);
12381   Value *Val6 = Builder.CreateAnd(Val2, Val5);
12382   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12383   return Builder.CreateIntCast(Val7, Int16Ty, false);
12384 }
12385 case ARM::BI__builtin_arm_mve_vcmpneq_m_f16:
12386 case ARM::BI__builtin_arm_mve_vcmpneq_m_f32: {
12387   llvm::Type * Param0;
12388   switch (BuiltinID) {
12389   case ARM::BI__builtin_arm_mve_vcmpneq_m_f16:
12390     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12391     break;
12392   case ARM::BI__builtin_arm_mve_vcmpneq_m_f32:
12393     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12394     break;
12395   }
12396   Value *Val0 = EmitScalarExpr(E->getArg(2));
12397   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12398   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12399   Value *Val3 = EmitScalarExpr(E->getArg(0));
12400   Value *Val4 = EmitScalarExpr(E->getArg(1));
12401   Value *Val5 = Builder.CreateFCmpUNE(Val3, Val4);
12402   Value *Val6 = Builder.CreateAnd(Val2, Val5);
12403   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12404   return Builder.CreateIntCast(Val7, Int16Ty, false);
12405 }
12406 case ARM::BI__builtin_arm_mve_vcmpeqq_m_s16:
12407 case ARM::BI__builtin_arm_mve_vcmpeqq_m_s32:
12408 case ARM::BI__builtin_arm_mve_vcmpeqq_m_s8:
12409 case ARM::BI__builtin_arm_mve_vcmpeqq_m_u16:
12410 case ARM::BI__builtin_arm_mve_vcmpeqq_m_u32:
12411 case ARM::BI__builtin_arm_mve_vcmpeqq_m_u8: {
12412   llvm::Type * Param0;
12413   switch (BuiltinID) {
12414   case ARM::BI__builtin_arm_mve_vcmpeqq_m_s16:
12415     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12416     break;
12417   case ARM::BI__builtin_arm_mve_vcmpeqq_m_s32:
12418     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12419     break;
12420   case ARM::BI__builtin_arm_mve_vcmpeqq_m_s8:
12421     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12422     break;
12423   case ARM::BI__builtin_arm_mve_vcmpeqq_m_u16:
12424     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12425     break;
12426   case ARM::BI__builtin_arm_mve_vcmpeqq_m_u32:
12427     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12428     break;
12429   case ARM::BI__builtin_arm_mve_vcmpeqq_m_u8:
12430     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12431     break;
12432   }
12433   Value *Val0 = EmitScalarExpr(E->getArg(2));
12434   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12435   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12436   Value *Val3 = EmitScalarExpr(E->getArg(0));
12437   Value *Val4 = EmitScalarExpr(E->getArg(1));
12438   Value *Val5 = Builder.CreateICmpEQ(Val3, Val4);
12439   Value *Val6 = Builder.CreateAnd(Val2, Val5);
12440   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12441   return Builder.CreateIntCast(Val7, Int16Ty, false);
12442 }
12443 case ARM::BI__builtin_arm_mve_vcmpneq_m_s16:
12444 case ARM::BI__builtin_arm_mve_vcmpneq_m_s32:
12445 case ARM::BI__builtin_arm_mve_vcmpneq_m_s8:
12446 case ARM::BI__builtin_arm_mve_vcmpneq_m_u16:
12447 case ARM::BI__builtin_arm_mve_vcmpneq_m_u32:
12448 case ARM::BI__builtin_arm_mve_vcmpneq_m_u8: {
12449   llvm::Type * Param0;
12450   switch (BuiltinID) {
12451   case ARM::BI__builtin_arm_mve_vcmpneq_m_s16:
12452     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12453     break;
12454   case ARM::BI__builtin_arm_mve_vcmpneq_m_s32:
12455     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12456     break;
12457   case ARM::BI__builtin_arm_mve_vcmpneq_m_s8:
12458     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12459     break;
12460   case ARM::BI__builtin_arm_mve_vcmpneq_m_u16:
12461     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12462     break;
12463   case ARM::BI__builtin_arm_mve_vcmpneq_m_u32:
12464     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12465     break;
12466   case ARM::BI__builtin_arm_mve_vcmpneq_m_u8:
12467     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12468     break;
12469   }
12470   Value *Val0 = EmitScalarExpr(E->getArg(2));
12471   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12472   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12473   Value *Val3 = EmitScalarExpr(E->getArg(0));
12474   Value *Val4 = EmitScalarExpr(E->getArg(1));
12475   Value *Val5 = Builder.CreateICmpNE(Val3, Val4);
12476   Value *Val6 = Builder.CreateAnd(Val2, Val5);
12477   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12478   return Builder.CreateIntCast(Val7, Int16Ty, false);
12479 }
12480 case ARM::BI__builtin_arm_mve_vcmpgeq_m_s16:
12481 case ARM::BI__builtin_arm_mve_vcmpgeq_m_s32:
12482 case ARM::BI__builtin_arm_mve_vcmpgeq_m_s8: {
12483   llvm::Type * Param0;
12484   switch (BuiltinID) {
12485   case ARM::BI__builtin_arm_mve_vcmpgeq_m_s16:
12486     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12487     break;
12488   case ARM::BI__builtin_arm_mve_vcmpgeq_m_s32:
12489     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12490     break;
12491   case ARM::BI__builtin_arm_mve_vcmpgeq_m_s8:
12492     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12493     break;
12494   }
12495   Value *Val0 = EmitScalarExpr(E->getArg(2));
12496   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12497   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12498   Value *Val3 = EmitScalarExpr(E->getArg(0));
12499   Value *Val4 = EmitScalarExpr(E->getArg(1));
12500   Value *Val5 = Builder.CreateICmpSGE(Val3, Val4);
12501   Value *Val6 = Builder.CreateAnd(Val2, Val5);
12502   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12503   return Builder.CreateIntCast(Val7, Int16Ty, false);
12504 }
12505 case ARM::BI__builtin_arm_mve_vcmpgtq_m_s16:
12506 case ARM::BI__builtin_arm_mve_vcmpgtq_m_s32:
12507 case ARM::BI__builtin_arm_mve_vcmpgtq_m_s8: {
12508   llvm::Type * Param0;
12509   switch (BuiltinID) {
12510   case ARM::BI__builtin_arm_mve_vcmpgtq_m_s16:
12511     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12512     break;
12513   case ARM::BI__builtin_arm_mve_vcmpgtq_m_s32:
12514     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12515     break;
12516   case ARM::BI__builtin_arm_mve_vcmpgtq_m_s8:
12517     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12518     break;
12519   }
12520   Value *Val0 = EmitScalarExpr(E->getArg(2));
12521   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12522   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12523   Value *Val3 = EmitScalarExpr(E->getArg(0));
12524   Value *Val4 = EmitScalarExpr(E->getArg(1));
12525   Value *Val5 = Builder.CreateICmpSGT(Val3, Val4);
12526   Value *Val6 = Builder.CreateAnd(Val2, Val5);
12527   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12528   return Builder.CreateIntCast(Val7, Int16Ty, false);
12529 }
12530 case ARM::BI__builtin_arm_mve_vcmpleq_m_s16:
12531 case ARM::BI__builtin_arm_mve_vcmpleq_m_s32:
12532 case ARM::BI__builtin_arm_mve_vcmpleq_m_s8: {
12533   llvm::Type * Param0;
12534   switch (BuiltinID) {
12535   case ARM::BI__builtin_arm_mve_vcmpleq_m_s16:
12536     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12537     break;
12538   case ARM::BI__builtin_arm_mve_vcmpleq_m_s32:
12539     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12540     break;
12541   case ARM::BI__builtin_arm_mve_vcmpleq_m_s8:
12542     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12543     break;
12544   }
12545   Value *Val0 = EmitScalarExpr(E->getArg(2));
12546   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12547   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12548   Value *Val3 = EmitScalarExpr(E->getArg(0));
12549   Value *Val4 = EmitScalarExpr(E->getArg(1));
12550   Value *Val5 = Builder.CreateICmpSLE(Val3, Val4);
12551   Value *Val6 = Builder.CreateAnd(Val2, Val5);
12552   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12553   return Builder.CreateIntCast(Val7, Int16Ty, false);
12554 }
12555 case ARM::BI__builtin_arm_mve_vcmpltq_m_s16:
12556 case ARM::BI__builtin_arm_mve_vcmpltq_m_s32:
12557 case ARM::BI__builtin_arm_mve_vcmpltq_m_s8: {
12558   llvm::Type * Param0;
12559   switch (BuiltinID) {
12560   case ARM::BI__builtin_arm_mve_vcmpltq_m_s16:
12561     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12562     break;
12563   case ARM::BI__builtin_arm_mve_vcmpltq_m_s32:
12564     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12565     break;
12566   case ARM::BI__builtin_arm_mve_vcmpltq_m_s8:
12567     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12568     break;
12569   }
12570   Value *Val0 = EmitScalarExpr(E->getArg(2));
12571   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12572   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12573   Value *Val3 = EmitScalarExpr(E->getArg(0));
12574   Value *Val4 = EmitScalarExpr(E->getArg(1));
12575   Value *Val5 = Builder.CreateICmpSLT(Val3, Val4);
12576   Value *Val6 = Builder.CreateAnd(Val2, Val5);
12577   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12578   return Builder.CreateIntCast(Val7, Int16Ty, false);
12579 }
12580 case ARM::BI__builtin_arm_mve_vcmpcsq_m_u16:
12581 case ARM::BI__builtin_arm_mve_vcmpcsq_m_u32:
12582 case ARM::BI__builtin_arm_mve_vcmpcsq_m_u8: {
12583   llvm::Type * Param0;
12584   switch (BuiltinID) {
12585   case ARM::BI__builtin_arm_mve_vcmpcsq_m_u16:
12586     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12587     break;
12588   case ARM::BI__builtin_arm_mve_vcmpcsq_m_u32:
12589     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12590     break;
12591   case ARM::BI__builtin_arm_mve_vcmpcsq_m_u8:
12592     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12593     break;
12594   }
12595   Value *Val0 = EmitScalarExpr(E->getArg(2));
12596   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12597   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12598   Value *Val3 = EmitScalarExpr(E->getArg(0));
12599   Value *Val4 = EmitScalarExpr(E->getArg(1));
12600   Value *Val5 = Builder.CreateICmpUGE(Val3, Val4);
12601   Value *Val6 = Builder.CreateAnd(Val2, Val5);
12602   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12603   return Builder.CreateIntCast(Val7, Int16Ty, false);
12604 }
12605 case ARM::BI__builtin_arm_mve_vcmphiq_m_u16:
12606 case ARM::BI__builtin_arm_mve_vcmphiq_m_u32:
12607 case ARM::BI__builtin_arm_mve_vcmphiq_m_u8: {
12608   llvm::Type * Param0;
12609   switch (BuiltinID) {
12610   case ARM::BI__builtin_arm_mve_vcmphiq_m_u16:
12611     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12612     break;
12613   case ARM::BI__builtin_arm_mve_vcmphiq_m_u32:
12614     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12615     break;
12616   case ARM::BI__builtin_arm_mve_vcmphiq_m_u8:
12617     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12618     break;
12619   }
12620   Value *Val0 = EmitScalarExpr(E->getArg(2));
12621   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12622   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12623   Value *Val3 = EmitScalarExpr(E->getArg(0));
12624   Value *Val4 = EmitScalarExpr(E->getArg(1));
12625   Value *Val5 = Builder.CreateICmpUGT(Val3, Val4);
12626   Value *Val6 = Builder.CreateAnd(Val2, Val5);
12627   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12628   return Builder.CreateIntCast(Val7, Int16Ty, false);
12629 }
12630 case ARM::BI__builtin_arm_mve_vpselq_f16:
12631 case ARM::BI__builtin_arm_mve_vpselq_f32:
12632 case ARM::BI__builtin_arm_mve_vpselq_s16:
12633 case ARM::BI__builtin_arm_mve_vpselq_s32:
12634 case ARM::BI__builtin_arm_mve_vpselq_s8:
12635 case ARM::BI__builtin_arm_mve_vpselq_u16:
12636 case ARM::BI__builtin_arm_mve_vpselq_u32:
12637 case ARM::BI__builtin_arm_mve_vpselq_u8: {
12638   llvm::Type * Param0;
12639   switch (BuiltinID) {
12640   case ARM::BI__builtin_arm_mve_vpselq_f16:
12641     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12642     break;
12643   case ARM::BI__builtin_arm_mve_vpselq_f32:
12644     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12645     break;
12646   case ARM::BI__builtin_arm_mve_vpselq_s16:
12647     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12648     break;
12649   case ARM::BI__builtin_arm_mve_vpselq_s32:
12650     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12651     break;
12652   case ARM::BI__builtin_arm_mve_vpselq_s8:
12653     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12654     break;
12655   case ARM::BI__builtin_arm_mve_vpselq_u16:
12656     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12657     break;
12658   case ARM::BI__builtin_arm_mve_vpselq_u32:
12659     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12660     break;
12661   case ARM::BI__builtin_arm_mve_vpselq_u8:
12662     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12663     break;
12664   }
12665   Value *Val0 = EmitScalarExpr(E->getArg(2));
12666   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12667   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12668   Value *Val3 = EmitScalarExpr(E->getArg(0));
12669   Value *Val4 = EmitScalarExpr(E->getArg(1));
12670   return Builder.CreateSelect(Val2, Val3, Val4);
12671 }
12672 case ARM::BI__builtin_arm_mve_vdupq_m_n_f16:
12673 case ARM::BI__builtin_arm_mve_vdupq_m_n_f32:
12674 case ARM::BI__builtin_arm_mve_vdupq_m_n_s16:
12675 case ARM::BI__builtin_arm_mve_vdupq_m_n_s32:
12676 case ARM::BI__builtin_arm_mve_vdupq_m_n_s8:
12677 case ARM::BI__builtin_arm_mve_vdupq_m_n_u16:
12678 case ARM::BI__builtin_arm_mve_vdupq_m_n_u32:
12679 case ARM::BI__builtin_arm_mve_vdupq_m_n_u8: {
12680   llvm::Type * Param0;
12681   switch (BuiltinID) {
12682   case ARM::BI__builtin_arm_mve_vdupq_m_n_f16:
12683     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12684     break;
12685   case ARM::BI__builtin_arm_mve_vdupq_m_n_f32:
12686     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12687     break;
12688   case ARM::BI__builtin_arm_mve_vdupq_m_n_s16:
12689     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12690     break;
12691   case ARM::BI__builtin_arm_mve_vdupq_m_n_s32:
12692     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12693     break;
12694   case ARM::BI__builtin_arm_mve_vdupq_m_n_s8:
12695     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12696     break;
12697   case ARM::BI__builtin_arm_mve_vdupq_m_n_u16:
12698     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12699     break;
12700   case ARM::BI__builtin_arm_mve_vdupq_m_n_u32:
12701     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12702     break;
12703   case ARM::BI__builtin_arm_mve_vdupq_m_n_u8:
12704     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12705     break;
12706   }
12707   Value *Val0 = EmitScalarExpr(E->getArg(2));
12708   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12709   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12710   Value *Val3 = EmitScalarExpr(E->getArg(1));
12711   Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
12712   Value *Val5 = EmitScalarExpr(E->getArg(0));
12713   return Builder.CreateSelect(Val2, Val4, Val5);
12714 }
12715 case ARM::BI__builtin_arm_mve_vbicq_m_n_s32:
12716 case ARM::BI__builtin_arm_mve_vbicq_m_n_u32: {
12717   bool  Param0;
12718   switch (BuiltinID) {
12719   case ARM::BI__builtin_arm_mve_vbicq_m_n_s32:
12720     Param0 = true;
12721     break;
12722   case ARM::BI__builtin_arm_mve_vbicq_m_n_u32:
12723     Param0 = false;
12724     break;
12725   }
12726   Value *Val0 = EmitScalarExpr(E->getArg(2));
12727   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12728   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1});
12729   Value *Val3 = EmitScalarExpr(E->getArg(0));
12730   Value *Val4 = EmitScalarExpr(E->getArg(1));
12731   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, Param0);
12732   Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
12733   Value *Val7 = Builder.CreateNot(Val6);
12734   Value *Val8 = Builder.CreateAnd(Val3, Val7);
12735   return Builder.CreateSelect(Val2, Val8, Val3);
12736 }
12737 case ARM::BI__builtin_arm_mve_vorrq_m_n_s32:
12738 case ARM::BI__builtin_arm_mve_vorrq_m_n_u32: {
12739   bool  Param0;
12740   switch (BuiltinID) {
12741   case ARM::BI__builtin_arm_mve_vorrq_m_n_s32:
12742     Param0 = true;
12743     break;
12744   case ARM::BI__builtin_arm_mve_vorrq_m_n_u32:
12745     Param0 = false;
12746     break;
12747   }
12748   Value *Val0 = EmitScalarExpr(E->getArg(2));
12749   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12750   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1});
12751   Value *Val3 = EmitScalarExpr(E->getArg(0));
12752   Value *Val4 = EmitScalarExpr(E->getArg(1));
12753   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, Param0);
12754   Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
12755   Value *Val7 = Builder.CreateOr(Val3, Val6);
12756   return Builder.CreateSelect(Val2, Val7, Val3);
12757 }
12758 case ARM::BI__builtin_arm_mve_vpselq_s64:
12759 case ARM::BI__builtin_arm_mve_vpselq_u64: {
12760   Value *Val0 = EmitScalarExpr(E->getArg(2));
12761   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12762   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1});
12763   Value *Val3 = EmitScalarExpr(E->getArg(0));
12764   llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
12765   Value *Val5 = Builder.CreateBitCast(Val3, Val4);
12766   Value *Val6 = EmitScalarExpr(E->getArg(1));
12767   llvm::Type *Val7 = llvm::FixedVectorType::get(Int32Ty, 4);
12768   Value *Val8 = Builder.CreateBitCast(Val6, Val7);
12769   Value *Val9 = Builder.CreateSelect(Val2, Val5, Val8);
12770   llvm::Type *Val10 = llvm::FixedVectorType::get(Int64Ty, 2);
12771   return Builder.CreateBitCast(Val9, Val10);
12772 }
12773 case ARM::BI__builtin_arm_mve_vmvnq_m_n_s32:
12774 case ARM::BI__builtin_arm_mve_vmvnq_m_n_u32: {
12775   bool  Param0;
12776   switch (BuiltinID) {
12777   case ARM::BI__builtin_arm_mve_vmvnq_m_n_s32:
12778     Param0 = true;
12779     break;
12780   case ARM::BI__builtin_arm_mve_vmvnq_m_n_u32:
12781     Param0 = false;
12782     break;
12783   }
12784   Value *Val0 = EmitScalarExpr(E->getArg(2));
12785   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12786   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1});
12787   Value *Val3 = EmitScalarExpr(E->getArg(1));
12788   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, Param0);
12789   Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12790   Value *Val6 = Builder.CreateNot(Val5);
12791   Value *Val7 = EmitScalarExpr(E->getArg(0));
12792   return Builder.CreateSelect(Val2, Val6, Val7);
12793 }
12794 case ARM::BI__builtin_arm_mve_vbicq_m_n_s16:
12795 case ARM::BI__builtin_arm_mve_vbicq_m_n_u16: {
12796   bool  Param0;
12797   switch (BuiltinID) {
12798   case ARM::BI__builtin_arm_mve_vbicq_m_n_s16:
12799     Param0 = true;
12800     break;
12801   case ARM::BI__builtin_arm_mve_vbicq_m_n_u16:
12802     Param0 = false;
12803     break;
12804   }
12805   Value *Val0 = EmitScalarExpr(E->getArg(2));
12806   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12807   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1});
12808   Value *Val3 = EmitScalarExpr(E->getArg(0));
12809   Value *Val4 = EmitScalarExpr(E->getArg(1));
12810   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
12811   Value *Val6 = Builder.CreateIntCast(Val5, Int16Ty, Param0);
12812   Value *Val7 = ARMMVEVectorSplat(Builder, Val6);
12813   Value *Val8 = Builder.CreateNot(Val7);
12814   Value *Val9 = Builder.CreateAnd(Val3, Val8);
12815   return Builder.CreateSelect(Val2, Val9, Val3);
12816 }
12817 case ARM::BI__builtin_arm_mve_vorrq_m_n_s16:
12818 case ARM::BI__builtin_arm_mve_vorrq_m_n_u16: {
12819   bool  Param0;
12820   switch (BuiltinID) {
12821   case ARM::BI__builtin_arm_mve_vorrq_m_n_s16:
12822     Param0 = true;
12823     break;
12824   case ARM::BI__builtin_arm_mve_vorrq_m_n_u16:
12825     Param0 = false;
12826     break;
12827   }
12828   Value *Val0 = EmitScalarExpr(E->getArg(2));
12829   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12830   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1});
12831   Value *Val3 = EmitScalarExpr(E->getArg(0));
12832   Value *Val4 = EmitScalarExpr(E->getArg(1));
12833   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
12834   Value *Val6 = Builder.CreateIntCast(Val5, Int16Ty, Param0);
12835   Value *Val7 = ARMMVEVectorSplat(Builder, Val6);
12836   Value *Val8 = Builder.CreateOr(Val3, Val7);
12837   return Builder.CreateSelect(Val2, Val8, Val3);
12838 }
12839 case ARM::BI__builtin_arm_mve_vmvnq_m_n_s16:
12840 case ARM::BI__builtin_arm_mve_vmvnq_m_n_u16: {
12841   bool  Param0;
12842   switch (BuiltinID) {
12843   case ARM::BI__builtin_arm_mve_vmvnq_m_n_s16:
12844     Param0 = true;
12845     break;
12846   case ARM::BI__builtin_arm_mve_vmvnq_m_n_u16:
12847     Param0 = false;
12848     break;
12849   }
12850   Value *Val0 = EmitScalarExpr(E->getArg(2));
12851   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12852   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1});
12853   Value *Val3 = EmitScalarExpr(E->getArg(1));
12854   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
12855   Value *Val5 = Builder.CreateIntCast(Val4, Int16Ty, Param0);
12856   Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
12857   Value *Val7 = Builder.CreateNot(Val6);
12858   Value *Val8 = EmitScalarExpr(E->getArg(0));
12859   return Builder.CreateSelect(Val2, Val7, Val8);
12860 }
12861 case ARM::BI__builtin_arm_mve_vfmasq_m_n_f16:
12862 case ARM::BI__builtin_arm_mve_vfmasq_m_n_f32: {
12863   llvm::Type * Param0;
12864   llvm::Type * Param1;
12865   switch (BuiltinID) {
12866   case ARM::BI__builtin_arm_mve_vfmasq_m_n_f16:
12867     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12868     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
12869     break;
12870   case ARM::BI__builtin_arm_mve_vfmasq_m_n_f32:
12871     Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12872     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
12873     break;
12874   }
12875   Value *Val0 = EmitScalarExpr(E->getArg(3));
12876   Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12877   Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12878   Value *Val3 = EmitScalarExpr(E->getArg(2));
12879   Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
12880   Value *Val5 = EmitScalarExpr(E->getArg(0));
12881   Value *Val6 = EmitScalarExpr(E->getArg(1));
12882   Value *Val7 = (Val6);
12883   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fma, {Param1}), {Val5, Val7, Val4});
12884   return Builder.CreateSelect(Val2, Val8, Val5);
12885 }
12886 case ARM::BI__builtin_arm_mve_vcvtaq_m_s16_f16:
12887 case ARM::BI__builtin_arm_mve_vcvtaq_m_s32_f32:
12888 case ARM::BI__builtin_arm_mve_vcvtaq_m_u16_f16:
12889 case ARM::BI__builtin_arm_mve_vcvtaq_m_u32_f32:
12890 case ARM::BI__builtin_arm_mve_vcvtmq_m_s16_f16:
12891 case ARM::BI__builtin_arm_mve_vcvtmq_m_s32_f32:
12892 case ARM::BI__builtin_arm_mve_vcvtmq_m_u16_f16:
12893 case ARM::BI__builtin_arm_mve_vcvtmq_m_u32_f32:
12894 case ARM::BI__builtin_arm_mve_vcvtnq_m_s16_f16:
12895 case ARM::BI__builtin_arm_mve_vcvtnq_m_s32_f32:
12896 case ARM::BI__builtin_arm_mve_vcvtnq_m_u16_f16:
12897 case ARM::BI__builtin_arm_mve_vcvtnq_m_u32_f32:
12898 case ARM::BI__builtin_arm_mve_vcvtpq_m_s16_f16:
12899 case ARM::BI__builtin_arm_mve_vcvtpq_m_s32_f32:
12900 case ARM::BI__builtin_arm_mve_vcvtpq_m_u16_f16:
12901 case ARM::BI__builtin_arm_mve_vcvtpq_m_u32_f32: {
12902   uint32_t  Param0;
12903   llvm::Type * Param1;
12904   Intrinsic::ID  Param2;
12905   llvm::Type * Param3;
12906   llvm::Type * Param4;
12907   switch (BuiltinID) {
12908   case ARM::BI__builtin_arm_mve_vcvtaq_m_s16_f16:
12909     Param0 = 0;
12910     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12911     Param2 = Intrinsic::arm_mve_vcvta_predicated;
12912     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
12913     Param4 = llvm::FixedVectorType::get(HalfTy, 8);
12914     break;
12915   case ARM::BI__builtin_arm_mve_vcvtaq_m_s32_f32:
12916     Param0 = 0;
12917     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12918     Param2 = Intrinsic::arm_mve_vcvta_predicated;
12919     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
12920     Param4 = llvm::FixedVectorType::get(FloatTy, 4);
12921     break;
12922   case ARM::BI__builtin_arm_mve_vcvtaq_m_u16_f16:
12923     Param0 = 1;
12924     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12925     Param2 = Intrinsic::arm_mve_vcvta_predicated;
12926     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
12927     Param4 = llvm::FixedVectorType::get(HalfTy, 8);
12928     break;
12929   case ARM::BI__builtin_arm_mve_vcvtaq_m_u32_f32:
12930     Param0 = 1;
12931     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12932     Param2 = Intrinsic::arm_mve_vcvta_predicated;
12933     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
12934     Param4 = llvm::FixedVectorType::get(FloatTy, 4);
12935     break;
12936   case ARM::BI__builtin_arm_mve_vcvtmq_m_s16_f16:
12937     Param0 = 0;
12938     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12939     Param2 = Intrinsic::arm_mve_vcvtm_predicated;
12940     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
12941     Param4 = llvm::FixedVectorType::get(HalfTy, 8);
12942     break;
12943   case ARM::BI__builtin_arm_mve_vcvtmq_m_s32_f32:
12944     Param0 = 0;
12945     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12946     Param2 = Intrinsic::arm_mve_vcvtm_predicated;
12947     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
12948     Param4 = llvm::FixedVectorType::get(FloatTy, 4);
12949     break;
12950   case ARM::BI__builtin_arm_mve_vcvtmq_m_u16_f16:
12951     Param0 = 1;
12952     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12953     Param2 = Intrinsic::arm_mve_vcvtm_predicated;
12954     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
12955     Param4 = llvm::FixedVectorType::get(HalfTy, 8);
12956     break;
12957   case ARM::BI__builtin_arm_mve_vcvtmq_m_u32_f32:
12958     Param0 = 1;
12959     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12960     Param2 = Intrinsic::arm_mve_vcvtm_predicated;
12961     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
12962     Param4 = llvm::FixedVectorType::get(FloatTy, 4);
12963     break;
12964   case ARM::BI__builtin_arm_mve_vcvtnq_m_s16_f16:
12965     Param0 = 0;
12966     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12967     Param2 = Intrinsic::arm_mve_vcvtn_predicated;
12968     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
12969     Param4 = llvm::FixedVectorType::get(HalfTy, 8);
12970     break;
12971   case ARM::BI__builtin_arm_mve_vcvtnq_m_s32_f32:
12972     Param0 = 0;
12973     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12974     Param2 = Intrinsic::arm_mve_vcvtn_predicated;
12975     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
12976     Param4 = llvm::FixedVectorType::get(FloatTy, 4);
12977     break;
12978   case ARM::BI__builtin_arm_mve_vcvtnq_m_u16_f16:
12979     Param0 = 1;
12980     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12981     Param2 = Intrinsic::arm_mve_vcvtn_predicated;
12982     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
12983     Param4 = llvm::FixedVectorType::get(HalfTy, 8);
12984     break;
12985   case ARM::BI__builtin_arm_mve_vcvtnq_m_u32_f32:
12986     Param0 = 1;
12987     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12988     Param2 = Intrinsic::arm_mve_vcvtn_predicated;
12989     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
12990     Param4 = llvm::FixedVectorType::get(FloatTy, 4);
12991     break;
12992   case ARM::BI__builtin_arm_mve_vcvtpq_m_s16_f16:
12993     Param0 = 0;
12994     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12995     Param2 = Intrinsic::arm_mve_vcvtp_predicated;
12996     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
12997     Param4 = llvm::FixedVectorType::get(HalfTy, 8);
12998     break;
12999   case ARM::BI__builtin_arm_mve_vcvtpq_m_s32_f32:
13000     Param0 = 0;
13001     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13002     Param2 = Intrinsic::arm_mve_vcvtp_predicated;
13003     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13004     Param4 = llvm::FixedVectorType::get(FloatTy, 4);
13005     break;
13006   case ARM::BI__builtin_arm_mve_vcvtpq_m_u16_f16:
13007     Param0 = 1;
13008     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13009     Param2 = Intrinsic::arm_mve_vcvtp_predicated;
13010     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13011     Param4 = llvm::FixedVectorType::get(HalfTy, 8);
13012     break;
13013   case ARM::BI__builtin_arm_mve_vcvtpq_m_u32_f32:
13014     Param0 = 1;
13015     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13016     Param2 = Intrinsic::arm_mve_vcvtp_predicated;
13017     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13018     Param4 = llvm::FixedVectorType::get(FloatTy, 4);
13019     break;
13020   }
13021   Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
13022   Value *Val1 = EmitScalarExpr(E->getArg(0));
13023   Value *Val2 = EmitScalarExpr(E->getArg(1));
13024   Value *Val3 = EmitScalarExpr(E->getArg(2));
13025   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
13026   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val4});
13027   return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param4, Param1}), {Val0, Val1, Val2, Val5});
13028 }
13029 case ARM::BI__builtin_arm_mve_vcvtq_m_n_f16_s16:
13030 case ARM::BI__builtin_arm_mve_vcvtq_m_n_f16_u16:
13031 case ARM::BI__builtin_arm_mve_vcvtq_m_n_f32_s32:
13032 case ARM::BI__builtin_arm_mve_vcvtq_m_n_f32_u32:
13033 case ARM::BI__builtin_arm_mve_vcvtq_m_n_s16_f16:
13034 case ARM::BI__builtin_arm_mve_vcvtq_m_n_s32_f32:
13035 case ARM::BI__builtin_arm_mve_vcvtq_m_n_u16_f16:
13036 case ARM::BI__builtin_arm_mve_vcvtq_m_n_u32_f32: {
13037   uint32_t  Param0;
13038   llvm::Type * Param1;
13039   llvm::Type * Param2;
13040   llvm::Type * Param3;
13041   switch (BuiltinID) {
13042   case ARM::BI__builtin_arm_mve_vcvtq_m_n_f16_s16:
13043     Param0 = 0;
13044     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13045     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13046     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13047     break;
13048   case ARM::BI__builtin_arm_mve_vcvtq_m_n_f16_u16:
13049     Param0 = 1;
13050     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13051     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13052     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13053     break;
13054   case ARM::BI__builtin_arm_mve_vcvtq_m_n_f32_s32:
13055     Param0 = 0;
13056     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13057     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13058     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13059     break;
13060   case ARM::BI__builtin_arm_mve_vcvtq_m_n_f32_u32:
13061     Param0 = 1;
13062     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13063     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13064     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13065     break;
13066   case ARM::BI__builtin_arm_mve_vcvtq_m_n_s16_f16:
13067     Param0 = 0;
13068     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13069     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13070     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13071     break;
13072   case ARM::BI__builtin_arm_mve_vcvtq_m_n_s32_f32:
13073     Param0 = 0;
13074     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13075     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13076     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13077     break;
13078   case ARM::BI__builtin_arm_mve_vcvtq_m_n_u16_f16:
13079     Param0 = 1;
13080     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13081     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13082     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13083     break;
13084   case ARM::BI__builtin_arm_mve_vcvtq_m_n_u32_f32:
13085     Param0 = 1;
13086     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13087     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13088     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13089     break;
13090   }
13091   Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
13092   Value *Val1 = EmitScalarExpr(E->getArg(0));
13093   Value *Val2 = EmitScalarExpr(E->getArg(1));
13094   Value *Val3 = EmitScalarExpr(E->getArg(2));
13095   Value *Val4 = EmitScalarExpr(E->getArg(3));
13096   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
13097   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val5});
13098   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fix_predicated, {Param2, Param3, Param1}), {Val0, Val1, Val2, Val3, Val6});
13099 }
13100 case ARM::BI__builtin_arm_mve_vabavq_p_s16:
13101 case ARM::BI__builtin_arm_mve_vabavq_p_s32:
13102 case ARM::BI__builtin_arm_mve_vabavq_p_s8:
13103 case ARM::BI__builtin_arm_mve_vabavq_p_u16:
13104 case ARM::BI__builtin_arm_mve_vabavq_p_u32:
13105 case ARM::BI__builtin_arm_mve_vabavq_p_u8:
13106 case ARM::BI__builtin_arm_mve_vcmlaq_m_f16:
13107 case ARM::BI__builtin_arm_mve_vcmlaq_m_f32:
13108 case ARM::BI__builtin_arm_mve_vcmlaq_rot180_m_f16:
13109 case ARM::BI__builtin_arm_mve_vcmlaq_rot180_m_f32:
13110 case ARM::BI__builtin_arm_mve_vcmlaq_rot270_m_f16:
13111 case ARM::BI__builtin_arm_mve_vcmlaq_rot270_m_f32:
13112 case ARM::BI__builtin_arm_mve_vcmlaq_rot90_m_f16:
13113 case ARM::BI__builtin_arm_mve_vcmlaq_rot90_m_f32:
13114 case ARM::BI__builtin_arm_mve_vcmulq_m_f16:
13115 case ARM::BI__builtin_arm_mve_vcmulq_m_f32:
13116 case ARM::BI__builtin_arm_mve_vcmulq_rot180_m_f16:
13117 case ARM::BI__builtin_arm_mve_vcmulq_rot180_m_f32:
13118 case ARM::BI__builtin_arm_mve_vcmulq_rot270_m_f16:
13119 case ARM::BI__builtin_arm_mve_vcmulq_rot270_m_f32:
13120 case ARM::BI__builtin_arm_mve_vcmulq_rot90_m_f16:
13121 case ARM::BI__builtin_arm_mve_vcmulq_rot90_m_f32: {
13122   uint32_t  Param0;
13123   llvm::Type * Param1;
13124   Intrinsic::ID  Param2;
13125   llvm::Type * Param3;
13126   switch (BuiltinID) {
13127   case ARM::BI__builtin_arm_mve_vabavq_p_s16:
13128     Param0 = 0;
13129     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13130     Param2 = Intrinsic::arm_mve_vabav_predicated;
13131     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13132     break;
13133   case ARM::BI__builtin_arm_mve_vabavq_p_s32:
13134     Param0 = 0;
13135     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13136     Param2 = Intrinsic::arm_mve_vabav_predicated;
13137     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13138     break;
13139   case ARM::BI__builtin_arm_mve_vabavq_p_s8:
13140     Param0 = 0;
13141     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13142     Param2 = Intrinsic::arm_mve_vabav_predicated;
13143     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
13144     break;
13145   case ARM::BI__builtin_arm_mve_vabavq_p_u16:
13146     Param0 = 1;
13147     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13148     Param2 = Intrinsic::arm_mve_vabav_predicated;
13149     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13150     break;
13151   case ARM::BI__builtin_arm_mve_vabavq_p_u32:
13152     Param0 = 1;
13153     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13154     Param2 = Intrinsic::arm_mve_vabav_predicated;
13155     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13156     break;
13157   case ARM::BI__builtin_arm_mve_vabavq_p_u8:
13158     Param0 = 1;
13159     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13160     Param2 = Intrinsic::arm_mve_vabav_predicated;
13161     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
13162     break;
13163   case ARM::BI__builtin_arm_mve_vcmlaq_m_f16:
13164     Param0 = 0;
13165     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13166     Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
13167     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13168     break;
13169   case ARM::BI__builtin_arm_mve_vcmlaq_m_f32:
13170     Param0 = 0;
13171     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13172     Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
13173     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13174     break;
13175   case ARM::BI__builtin_arm_mve_vcmlaq_rot180_m_f16:
13176     Param0 = 2;
13177     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13178     Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
13179     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13180     break;
13181   case ARM::BI__builtin_arm_mve_vcmlaq_rot180_m_f32:
13182     Param0 = 2;
13183     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13184     Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
13185     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13186     break;
13187   case ARM::BI__builtin_arm_mve_vcmlaq_rot270_m_f16:
13188     Param0 = 3;
13189     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13190     Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
13191     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13192     break;
13193   case ARM::BI__builtin_arm_mve_vcmlaq_rot270_m_f32:
13194     Param0 = 3;
13195     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13196     Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
13197     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13198     break;
13199   case ARM::BI__builtin_arm_mve_vcmlaq_rot90_m_f16:
13200     Param0 = 1;
13201     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13202     Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
13203     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13204     break;
13205   case ARM::BI__builtin_arm_mve_vcmlaq_rot90_m_f32:
13206     Param0 = 1;
13207     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13208     Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
13209     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13210     break;
13211   case ARM::BI__builtin_arm_mve_vcmulq_m_f16:
13212     Param0 = 0;
13213     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13214     Param2 = Intrinsic::arm_mve_vcmulq_predicated;
13215     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13216     break;
13217   case ARM::BI__builtin_arm_mve_vcmulq_m_f32:
13218     Param0 = 0;
13219     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13220     Param2 = Intrinsic::arm_mve_vcmulq_predicated;
13221     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13222     break;
13223   case ARM::BI__builtin_arm_mve_vcmulq_rot180_m_f16:
13224     Param0 = 2;
13225     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13226     Param2 = Intrinsic::arm_mve_vcmulq_predicated;
13227     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13228     break;
13229   case ARM::BI__builtin_arm_mve_vcmulq_rot180_m_f32:
13230     Param0 = 2;
13231     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13232     Param2 = Intrinsic::arm_mve_vcmulq_predicated;
13233     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13234     break;
13235   case ARM::BI__builtin_arm_mve_vcmulq_rot270_m_f16:
13236     Param0 = 3;
13237     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13238     Param2 = Intrinsic::arm_mve_vcmulq_predicated;
13239     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13240     break;
13241   case ARM::BI__builtin_arm_mve_vcmulq_rot270_m_f32:
13242     Param0 = 3;
13243     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13244     Param2 = Intrinsic::arm_mve_vcmulq_predicated;
13245     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13246     break;
13247   case ARM::BI__builtin_arm_mve_vcmulq_rot90_m_f16:
13248     Param0 = 1;
13249     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13250     Param2 = Intrinsic::arm_mve_vcmulq_predicated;
13251     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13252     break;
13253   case ARM::BI__builtin_arm_mve_vcmulq_rot90_m_f32:
13254     Param0 = 1;
13255     Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13256     Param2 = Intrinsic::arm_mve_vcmulq_predicated;
13257     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13258     break;
13259   }
13260   Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
13261   Value *Val1 = EmitScalarExpr(E->getArg(0));
13262   Value *Val2 = EmitScalarExpr(E->getArg(1));
13263   Value *Val3 = EmitScalarExpr(E->getArg(2));
13264   Value *Val4 = EmitScalarExpr(E->getArg(3));
13265   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
13266   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val5});
13267   return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param1}), {Val0, Val1, Val2, Val3, Val6});
13268 }
13269 case ARM::BI__builtin_arm_mve_vabavq_s16:
13270 case ARM::BI__builtin_arm_mve_vabavq_s32:
13271 case ARM::BI__builtin_arm_mve_vabavq_s8:
13272 case ARM::BI__builtin_arm_mve_vabavq_u16:
13273 case ARM::BI__builtin_arm_mve_vabavq_u32:
13274 case ARM::BI__builtin_arm_mve_vabavq_u8:
13275 case ARM::BI__builtin_arm_mve_vcmlaq_f16:
13276 case ARM::BI__builtin_arm_mve_vcmlaq_f32:
13277 case ARM::BI__builtin_arm_mve_vcmlaq_rot180_f16:
13278 case ARM::BI__builtin_arm_mve_vcmlaq_rot180_f32:
13279 case ARM::BI__builtin_arm_mve_vcmlaq_rot270_f16:
13280 case ARM::BI__builtin_arm_mve_vcmlaq_rot270_f32:
13281 case ARM::BI__builtin_arm_mve_vcmlaq_rot90_f16:
13282 case ARM::BI__builtin_arm_mve_vcmlaq_rot90_f32: {
13283   uint32_t  Param0;
13284   Intrinsic::ID  Param1;
13285   llvm::Type * Param2;
13286   switch (BuiltinID) {
13287   case ARM::BI__builtin_arm_mve_vabavq_s16:
13288     Param0 = 0;
13289     Param1 = Intrinsic::arm_mve_vabav;
13290     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13291     break;
13292   case ARM::BI__builtin_arm_mve_vabavq_s32:
13293     Param0 = 0;
13294     Param1 = Intrinsic::arm_mve_vabav;
13295     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13296     break;
13297   case ARM::BI__builtin_arm_mve_vabavq_s8:
13298     Param0 = 0;
13299     Param1 = Intrinsic::arm_mve_vabav;
13300     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
13301     break;
13302   case ARM::BI__builtin_arm_mve_vabavq_u16:
13303     Param0 = 1;
13304     Param1 = Intrinsic::arm_mve_vabav;
13305     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13306     break;
13307   case ARM::BI__builtin_arm_mve_vabavq_u32:
13308     Param0 = 1;
13309     Param1 = Intrinsic::arm_mve_vabav;
13310     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13311     break;
13312   case ARM::BI__builtin_arm_mve_vabavq_u8:
13313     Param0 = 1;
13314     Param1 = Intrinsic::arm_mve_vabav;
13315     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
13316     break;
13317   case ARM::BI__builtin_arm_mve_vcmlaq_f16:
13318     Param0 = 0;
13319     Param1 = Intrinsic::arm_mve_vcmlaq;
13320     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13321     break;
13322   case ARM::BI__builtin_arm_mve_vcmlaq_f32:
13323     Param0 = 0;
13324     Param1 = Intrinsic::arm_mve_vcmlaq;
13325     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13326     break;
13327   case ARM::BI__builtin_arm_mve_vcmlaq_rot180_f16:
13328     Param0 = 2;
13329     Param1 = Intrinsic::arm_mve_vcmlaq;
13330     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13331     break;
13332   case ARM::BI__builtin_arm_mve_vcmlaq_rot180_f32:
13333     Param0 = 2;
13334     Param1 = Intrinsic::arm_mve_vcmlaq;
13335     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13336     break;
13337   case ARM::BI__builtin_arm_mve_vcmlaq_rot270_f16:
13338     Param0 = 3;
13339     Param1 = Intrinsic::arm_mve_vcmlaq;
13340     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13341     break;
13342   case ARM::BI__builtin_arm_mve_vcmlaq_rot270_f32:
13343     Param0 = 3;
13344     Param1 = Intrinsic::arm_mve_vcmlaq;
13345     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13346     break;
13347   case ARM::BI__builtin_arm_mve_vcmlaq_rot90_f16:
13348     Param0 = 1;
13349     Param1 = Intrinsic::arm_mve_vcmlaq;
13350     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13351     break;
13352   case ARM::BI__builtin_arm_mve_vcmlaq_rot90_f32:
13353     Param0 = 1;
13354     Param1 = Intrinsic::arm_mve_vcmlaq;
13355     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13356     break;
13357   }
13358   Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
13359   Value *Val1 = EmitScalarExpr(E->getArg(0));
13360   Value *Val2 = EmitScalarExpr(E->getArg(1));
13361   Value *Val3 = EmitScalarExpr(E->getArg(2));
13362   return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2}), {Val0, Val1, Val2, Val3});
13363 }
13364 case ARM::BI__builtin_arm_mve_vcmulq_f16:
13365 case ARM::BI__builtin_arm_mve_vcmulq_f32:
13366 case ARM::BI__builtin_arm_mve_vcmulq_rot180_f16:
13367 case ARM::BI__builtin_arm_mve_vcmulq_rot180_f32:
13368 case ARM::BI__builtin_arm_mve_vcmulq_rot270_f16:
13369 case ARM::BI__builtin_arm_mve_vcmulq_rot270_f32:
13370 case ARM::BI__builtin_arm_mve_vcmulq_rot90_f16:
13371 case ARM::BI__builtin_arm_mve_vcmulq_rot90_f32: {
13372   uint32_t  Param0;
13373   llvm::Type * Param1;
13374   switch (BuiltinID) {
13375   case ARM::BI__builtin_arm_mve_vcmulq_f16:
13376     Param0 = 0;
13377     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
13378     break;
13379   case ARM::BI__builtin_arm_mve_vcmulq_f32:
13380     Param0 = 0;
13381     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
13382     break;
13383   case ARM::BI__builtin_arm_mve_vcmulq_rot180_f16:
13384     Param0 = 2;
13385     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
13386     break;
13387   case ARM::BI__builtin_arm_mve_vcmulq_rot180_f32:
13388     Param0 = 2;
13389     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
13390     break;
13391   case ARM::BI__builtin_arm_mve_vcmulq_rot270_f16:
13392     Param0 = 3;
13393     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
13394     break;
13395   case ARM::BI__builtin_arm_mve_vcmulq_rot270_f32:
13396     Param0 = 3;
13397     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
13398     break;
13399   case ARM::BI__builtin_arm_mve_vcmulq_rot90_f16:
13400     Param0 = 1;
13401     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
13402     break;
13403   case ARM::BI__builtin_arm_mve_vcmulq_rot90_f32:
13404     Param0 = 1;
13405     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
13406     break;
13407   }
13408   Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
13409   Value *Val1 = EmitScalarExpr(E->getArg(0));
13410   Value *Val2 = EmitScalarExpr(E->getArg(1));
13411   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcmulq, {Param1}), {Val0, Val1, Val2});
13412 }
13413 case ARM::BI__builtin_arm_mve_vcvtq_n_f16_s16:
13414 case ARM::BI__builtin_arm_mve_vcvtq_n_f16_u16:
13415 case ARM::BI__builtin_arm_mve_vcvtq_n_f32_s32:
13416 case ARM::BI__builtin_arm_mve_vcvtq_n_f32_u32:
13417 case ARM::BI__builtin_arm_mve_vcvtq_n_s16_f16:
13418 case ARM::BI__builtin_arm_mve_vcvtq_n_s32_f32:
13419 case ARM::BI__builtin_arm_mve_vcvtq_n_u16_f16:
13420 case ARM::BI__builtin_arm_mve_vcvtq_n_u32_f32: {
13421   uint32_t  Param0;
13422   llvm::Type * Param1;
13423   llvm::Type * Param2;
13424   switch (BuiltinID) {
13425   case ARM::BI__builtin_arm_mve_vcvtq_n_f16_s16:
13426     Param0 = 0;
13427     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
13428     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13429     break;
13430   case ARM::BI__builtin_arm_mve_vcvtq_n_f16_u16:
13431     Param0 = 1;
13432     Param1 = llvm::FixedVectorType::get(HalfTy, 8);
13433     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13434     break;
13435   case ARM::BI__builtin_arm_mve_vcvtq_n_f32_s32:
13436     Param0 = 0;
13437     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
13438     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13439     break;
13440   case ARM::BI__builtin_arm_mve_vcvtq_n_f32_u32:
13441     Param0 = 1;
13442     Param1 = llvm::FixedVectorType::get(FloatTy, 4);
13443     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13444     break;
13445   case ARM::BI__builtin_arm_mve_vcvtq_n_s16_f16:
13446     Param0 = 0;
13447     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
13448     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13449     break;
13450   case ARM::BI__builtin_arm_mve_vcvtq_n_s32_f32:
13451     Param0 = 0;
13452     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
13453     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13454     break;
13455   case ARM::BI__builtin_arm_mve_vcvtq_n_u16_f16:
13456     Param0 = 1;
13457     Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
13458     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13459     break;
13460   case ARM::BI__builtin_arm_mve_vcvtq_n_u32_f32:
13461     Param0 = 1;
13462     Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
13463     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13464     break;
13465   }
13466   Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
13467   Value *Val1 = EmitScalarExpr(E->getArg(0));
13468   Value *Val2 = EmitScalarExpr(E->getArg(1));
13469   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fix, {Param1, Param2}), {Val0, Val1, Val2});
13470 }
13471 case ARM::BI__builtin_arm_mve_vcvtaq_s16_f16:
13472 case ARM::BI__builtin_arm_mve_vcvtaq_s32_f32:
13473 case ARM::BI__builtin_arm_mve_vcvtaq_u16_f16:
13474 case ARM::BI__builtin_arm_mve_vcvtaq_u32_f32:
13475 case ARM::BI__builtin_arm_mve_vcvtmq_s16_f16:
13476 case ARM::BI__builtin_arm_mve_vcvtmq_s32_f32:
13477 case ARM::BI__builtin_arm_mve_vcvtmq_u16_f16:
13478 case ARM::BI__builtin_arm_mve_vcvtmq_u32_f32:
13479 case ARM::BI__builtin_arm_mve_vcvtnq_s16_f16:
13480 case ARM::BI__builtin_arm_mve_vcvtnq_s32_f32:
13481 case ARM::BI__builtin_arm_mve_vcvtnq_u16_f16:
13482 case ARM::BI__builtin_arm_mve_vcvtnq_u32_f32:
13483 case ARM::BI__builtin_arm_mve_vcvtpq_s16_f16:
13484 case ARM::BI__builtin_arm_mve_vcvtpq_s32_f32:
13485 case ARM::BI__builtin_arm_mve_vcvtpq_u16_f16:
13486 case ARM::BI__builtin_arm_mve_vcvtpq_u32_f32: {
13487   uint32_t  Param0;
13488   Intrinsic::ID  Param1;
13489   llvm::Type * Param2;
13490   llvm::Type * Param3;
13491   switch (BuiltinID) {
13492   case ARM::BI__builtin_arm_mve_vcvtaq_s16_f16:
13493     Param0 = 0;
13494     Param1 = Intrinsic::arm_mve_vcvta;
13495     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13496     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13497     break;
13498   case ARM::BI__builtin_arm_mve_vcvtaq_s32_f32:
13499     Param0 = 0;
13500     Param1 = Intrinsic::arm_mve_vcvta;
13501     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13502     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13503     break;
13504   case ARM::BI__builtin_arm_mve_vcvtaq_u16_f16:
13505     Param0 = 1;
13506     Param1 = Intrinsic::arm_mve_vcvta;
13507     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13508     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13509     break;
13510   case ARM::BI__builtin_arm_mve_vcvtaq_u32_f32:
13511     Param0 = 1;
13512     Param1 = Intrinsic::arm_mve_vcvta;
13513     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13514     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13515     break;
13516   case ARM::BI__builtin_arm_mve_vcvtmq_s16_f16:
13517     Param0 = 0;
13518     Param1 = Intrinsic::arm_mve_vcvtm;
13519     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13520     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13521     break;
13522   case ARM::BI__builtin_arm_mve_vcvtmq_s32_f32:
13523     Param0 = 0;
13524     Param1 = Intrinsic::arm_mve_vcvtm;
13525     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13526     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13527     break;
13528   case ARM::BI__builtin_arm_mve_vcvtmq_u16_f16:
13529     Param0 = 1;
13530     Param1 = Intrinsic::arm_mve_vcvtm;
13531     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13532     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13533     break;
13534   case ARM::BI__builtin_arm_mve_vcvtmq_u32_f32:
13535     Param0 = 1;
13536     Param1 = Intrinsic::arm_mve_vcvtm;
13537     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13538     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13539     break;
13540   case ARM::BI__builtin_arm_mve_vcvtnq_s16_f16:
13541     Param0 = 0;
13542     Param1 = Intrinsic::arm_mve_vcvtn;
13543     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13544     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13545     break;
13546   case ARM::BI__builtin_arm_mve_vcvtnq_s32_f32:
13547     Param0 = 0;
13548     Param1 = Intrinsic::arm_mve_vcvtn;
13549     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13550     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13551     break;
13552   case ARM::BI__builtin_arm_mve_vcvtnq_u16_f16:
13553     Param0 = 1;
13554     Param1 = Intrinsic::arm_mve_vcvtn;
13555     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13556     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13557     break;
13558   case ARM::BI__builtin_arm_mve_vcvtnq_u32_f32:
13559     Param0 = 1;
13560     Param1 = Intrinsic::arm_mve_vcvtn;
13561     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13562     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13563     break;
13564   case ARM::BI__builtin_arm_mve_vcvtpq_s16_f16:
13565     Param0 = 0;
13566     Param1 = Intrinsic::arm_mve_vcvtp;
13567     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13568     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13569     break;
13570   case ARM::BI__builtin_arm_mve_vcvtpq_s32_f32:
13571     Param0 = 0;
13572     Param1 = Intrinsic::arm_mve_vcvtp;
13573     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13574     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13575     break;
13576   case ARM::BI__builtin_arm_mve_vcvtpq_u16_f16:
13577     Param0 = 1;
13578     Param1 = Intrinsic::arm_mve_vcvtp;
13579     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13580     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13581     break;
13582   case ARM::BI__builtin_arm_mve_vcvtpq_u32_f32:
13583     Param0 = 1;
13584     Param1 = Intrinsic::arm_mve_vcvtp;
13585     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13586     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13587     break;
13588   }
13589   Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
13590   Value *Val1 = EmitScalarExpr(E->getArg(0));
13591   return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param3}), {Val0, Val1});
13592 }
13593 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_f16:
13594 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_f32:
13595 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_s16:
13596 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_s32:
13597 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_s8:
13598 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_u16:
13599 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_u32:
13600 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_u8:
13601 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_f16:
13602 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_f32:
13603 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_s16:
13604 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_s32:
13605 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_s8:
13606 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_u16:
13607 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_u32:
13608 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_u8:
13609 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_m_s16:
13610 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_m_s32:
13611 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_m_s8:
13612 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_m_s16:
13613 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_m_s32:
13614 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_m_s8: {
13615   uint32_t  Param0;
13616   uint32_t  Param1;
13617   llvm::Type * Param2;
13618   llvm::Type * Param3;
13619   switch (BuiltinID) {
13620   case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_f16:
13621     Param0 = 1;
13622     Param1 = 1;
13623     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13624     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13625     break;
13626   case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_f32:
13627     Param0 = 1;
13628     Param1 = 1;
13629     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13630     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13631     break;
13632   case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_s16:
13633     Param0 = 1;
13634     Param1 = 1;
13635     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13636     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13637     break;
13638   case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_s32:
13639     Param0 = 1;
13640     Param1 = 1;
13641     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13642     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13643     break;
13644   case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_s8:
13645     Param0 = 1;
13646     Param1 = 1;
13647     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13648     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
13649     break;
13650   case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_u16:
13651     Param0 = 1;
13652     Param1 = 1;
13653     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13654     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13655     break;
13656   case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_u32:
13657     Param0 = 1;
13658     Param1 = 1;
13659     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13660     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13661     break;
13662   case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_u8:
13663     Param0 = 1;
13664     Param1 = 1;
13665     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13666     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
13667     break;
13668   case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_f16:
13669     Param0 = 1;
13670     Param1 = 0;
13671     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13672     Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13673     break;
13674   case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_f32:
13675     Param0 = 1;
13676     Param1 = 0;
13677     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13678     Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13679     break;
13680   case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_s16:
13681     Param0 = 1;
13682     Param1 = 0;
13683     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13684     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13685     break;
13686   case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_s32:
13687     Param0 = 1;
13688     Param1 = 0;
13689     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13690     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13691     break;
13692   case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_s8:
13693     Param0 = 1;
13694     Param1 = 0;
13695     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13696     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
13697     break;
13698   case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_u16:
13699     Param0 = 1;
13700     Param1 = 0;
13701     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13702     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13703     break;
13704   case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_u32:
13705     Param0 = 1;
13706     Param1 = 0;
13707     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13708     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13709     break;
13710   case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_u8:
13711     Param0 = 1;
13712     Param1 = 0;
13713     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13714     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
13715     break;
13716   case ARM::BI__builtin_arm_mve_vhcaddq_rot270_m_s16:
13717     Param0 = 0;
13718     Param1 = 1;
13719     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13720     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13721     break;
13722   case ARM::BI__builtin_arm_mve_vhcaddq_rot270_m_s32:
13723     Param0 = 0;
13724     Param1 = 1;
13725     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13726     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13727     break;
13728   case ARM::BI__builtin_arm_mve_vhcaddq_rot270_m_s8:
13729     Param0 = 0;
13730     Param1 = 1;
13731     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13732     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
13733     break;
13734   case ARM::BI__builtin_arm_mve_vhcaddq_rot90_m_s16:
13735     Param0 = 0;
13736     Param1 = 0;
13737     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13738     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13739     break;
13740   case ARM::BI__builtin_arm_mve_vhcaddq_rot90_m_s32:
13741     Param0 = 0;
13742     Param1 = 0;
13743     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13744     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13745     break;
13746   case ARM::BI__builtin_arm_mve_vhcaddq_rot90_m_s8:
13747     Param0 = 0;
13748     Param1 = 0;
13749     Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13750     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
13751     break;
13752   }
13753   Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
13754   Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param1);
13755   Value *Val2 = EmitScalarExpr(E->getArg(0));
13756   Value *Val3 = EmitScalarExpr(E->getArg(1));
13757   Value *Val4 = EmitScalarExpr(E->getArg(2));
13758   Value *Val5 = EmitScalarExpr(E->getArg(3));
13759   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
13760   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param2}), {Val6});
13761   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcaddq_predicated, {Param3, Param2}), {Val0, Val1, Val2, Val3, Val4, Val7});
13762 }
13763 case ARM::BI__builtin_arm_mve_vcaddq_rot270_f16:
13764 case ARM::BI__builtin_arm_mve_vcaddq_rot270_f32:
13765 case ARM::BI__builtin_arm_mve_vcaddq_rot270_s16:
13766 case ARM::BI__builtin_arm_mve_vcaddq_rot270_s32:
13767 case ARM::BI__builtin_arm_mve_vcaddq_rot270_s8:
13768 case ARM::BI__builtin_arm_mve_vcaddq_rot270_u16:
13769 case ARM::BI__builtin_arm_mve_vcaddq_rot270_u32:
13770 case ARM::BI__builtin_arm_mve_vcaddq_rot270_u8:
13771 case ARM::BI__builtin_arm_mve_vcaddq_rot90_f16:
13772 case ARM::BI__builtin_arm_mve_vcaddq_rot90_f32:
13773 case ARM::BI__builtin_arm_mve_vcaddq_rot90_s16:
13774 case ARM::BI__builtin_arm_mve_vcaddq_rot90_s32:
13775 case ARM::BI__builtin_arm_mve_vcaddq_rot90_s8:
13776 case ARM::BI__builtin_arm_mve_vcaddq_rot90_u16:
13777 case ARM::BI__builtin_arm_mve_vcaddq_rot90_u32:
13778 case ARM::BI__builtin_arm_mve_vcaddq_rot90_u8:
13779 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_s16:
13780 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_s32:
13781 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_s8:
13782 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_s16:
13783 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_s32:
13784 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_s8: {
13785   uint32_t  Param0;
13786   uint32_t  Param1;
13787   llvm::Type * Param2;
13788   switch (BuiltinID) {
13789   case ARM::BI__builtin_arm_mve_vcaddq_rot270_f16:
13790     Param0 = 1;
13791     Param1 = 1;
13792     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13793     break;
13794   case ARM::BI__builtin_arm_mve_vcaddq_rot270_f32:
13795     Param0 = 1;
13796     Param1 = 1;
13797     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13798     break;
13799   case ARM::BI__builtin_arm_mve_vcaddq_rot270_s16:
13800     Param0 = 1;
13801     Param1 = 1;
13802     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13803     break;
13804   case ARM::BI__builtin_arm_mve_vcaddq_rot270_s32:
13805     Param0 = 1;
13806     Param1 = 1;
13807     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13808     break;
13809   case ARM::BI__builtin_arm_mve_vcaddq_rot270_s8:
13810     Param0 = 1;
13811     Param1 = 1;
13812     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
13813     break;
13814   case ARM::BI__builtin_arm_mve_vcaddq_rot270_u16:
13815     Param0 = 1;
13816     Param1 = 1;
13817     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13818     break;
13819   case ARM::BI__builtin_arm_mve_vcaddq_rot270_u32:
13820     Param0 = 1;
13821     Param1 = 1;
13822     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13823     break;
13824   case ARM::BI__builtin_arm_mve_vcaddq_rot270_u8:
13825     Param0 = 1;
13826     Param1 = 1;
13827     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
13828     break;
13829   case ARM::BI__builtin_arm_mve_vcaddq_rot90_f16:
13830     Param0 = 1;
13831     Param1 = 0;
13832     Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13833     break;
13834   case ARM::BI__builtin_arm_mve_vcaddq_rot90_f32:
13835     Param0 = 1;
13836     Param1 = 0;
13837     Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13838     break;
13839   case ARM::BI__builtin_arm_mve_vcaddq_rot90_s16:
13840     Param0 = 1;
13841     Param1 = 0;
13842     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13843     break;
13844   case ARM::BI__builtin_arm_mve_vcaddq_rot90_s32:
13845     Param0 = 1;
13846     Param1 = 0;
13847     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13848     break;
13849   case ARM::BI__builtin_arm_mve_vcaddq_rot90_s8:
13850     Param0 = 1;
13851     Param1 = 0;
13852     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
13853     break;
13854   case ARM::BI__builtin_arm_mve_vcaddq_rot90_u16:
13855     Param0 = 1;
13856     Param1 = 0;
13857     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13858     break;
13859   case ARM::BI__builtin_arm_mve_vcaddq_rot90_u32:
13860     Param0 = 1;
13861     Param1 = 0;
13862     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13863     break;
13864   case ARM::BI__builtin_arm_mve_vcaddq_rot90_u8:
13865     Param0 = 1;
13866     Param1 = 0;
13867     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
13868     break;
13869   case ARM::BI__builtin_arm_mve_vhcaddq_rot270_s16:
13870     Param0 = 0;
13871     Param1 = 1;
13872     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13873     break;
13874   case ARM::BI__builtin_arm_mve_vhcaddq_rot270_s32:
13875     Param0 = 0;
13876     Param1 = 1;
13877     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13878     break;
13879   case ARM::BI__builtin_arm_mve_vhcaddq_rot270_s8:
13880     Param0 = 0;
13881     Param1 = 1;
13882     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
13883     break;
13884   case ARM::BI__builtin_arm_mve_vhcaddq_rot90_s16:
13885     Param0 = 0;
13886     Param1 = 0;
13887     Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13888     break;
13889   case ARM::BI__builtin_arm_mve_vhcaddq_rot90_s32:
13890     Param0 = 0;
13891     Param1 = 0;
13892     Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13893     break;
13894   case ARM::BI__builtin_arm_mve_vhcaddq_rot90_s8:
13895     Param0 = 0;
13896     Param1 = 0;
13897     Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
13898     break;
13899   }
13900   Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
13901   Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param1);
13902   Value *Val2 = EmitScalarExpr(E->getArg(0));
13903   Value *Val3 = EmitScalarExpr(E->getArg(1));
13904   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcaddq, {Param2}), {Val0, Val1, Val2, Val3});
13905 }
13906 case ARM::BI__builtin_arm_mve_vmladavaq_p_s16:
13907 case ARM::BI__builtin_arm_mve_vmladavaq_p_s32:
13908 case ARM::BI__builtin_arm_mve_vmladavaq_p_s8:
13909 case ARM::BI__builtin_arm_mve_vmladavaq_p_u16:
13910 case ARM::BI__builtin_arm_mve_vmladavaq_p_u32:
13911 case ARM::BI__builtin_arm_mve_vmladavaq_p_u8:
13912 case ARM::BI__builtin_arm_mve_vmladavaxq_p_s16:
13913 case ARM::BI__builtin_arm_mve_vmladavaxq_p_s32:
13914 case ARM::BI__builtin_arm_mve_vmladavaxq_p_s8:
13915 case ARM::BI__builtin_arm_mve_vmlsdavaq_p_s16:
13916 case ARM::BI__builtin_arm_mve_vmlsdavaq_p_s32:
13917 case ARM::BI__builtin_arm_mve_vmlsdavaq_p_s8:
13918 case ARM::BI__builtin_arm_mve_vmlsdavaxq_p_s16:
13919 case ARM::BI__builtin_arm_mve_vmlsdavaxq_p_s32:
13920 case ARM::BI__builtin_arm_mve_vmlsdavaxq_p_s8: {
13921   uint32_t  Param0;
13922   uint32_t  Param1;
13923   uint32_t  Param2;
13924   llvm::Type * Param3;
13925   llvm::Type * Param4;
13926   switch (BuiltinID) {
13927   case ARM::BI__builtin_arm_mve_vmladavaq_p_s16:
13928     Param0 = 0;
13929     Param1 = 0;
13930     Param2 = 0;
13931     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13932     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
13933     break;
13934   case ARM::BI__builtin_arm_mve_vmladavaq_p_s32:
13935     Param0 = 0;
13936     Param1 = 0;
13937     Param2 = 0;
13938     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13939     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
13940     break;
13941   case ARM::BI__builtin_arm_mve_vmladavaq_p_s8:
13942     Param0 = 0;
13943     Param1 = 0;
13944     Param2 = 0;
13945     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13946     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
13947     break;
13948   case ARM::BI__builtin_arm_mve_vmladavaq_p_u16:
13949     Param0 = 1;
13950     Param1 = 0;
13951     Param2 = 0;
13952     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13953     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
13954     break;
13955   case ARM::BI__builtin_arm_mve_vmladavaq_p_u32:
13956     Param0 = 1;
13957     Param1 = 0;
13958     Param2 = 0;
13959     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13960     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
13961     break;
13962   case ARM::BI__builtin_arm_mve_vmladavaq_p_u8:
13963     Param0 = 1;
13964     Param1 = 0;
13965     Param2 = 0;
13966     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13967     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
13968     break;
13969   case ARM::BI__builtin_arm_mve_vmladavaxq_p_s16:
13970     Param0 = 0;
13971     Param1 = 0;
13972     Param2 = 1;
13973     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13974     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
13975     break;
13976   case ARM::BI__builtin_arm_mve_vmladavaxq_p_s32:
13977     Param0 = 0;
13978     Param1 = 0;
13979     Param2 = 1;
13980     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13981     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
13982     break;
13983   case ARM::BI__builtin_arm_mve_vmladavaxq_p_s8:
13984     Param0 = 0;
13985     Param1 = 0;
13986     Param2 = 1;
13987     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13988     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
13989     break;
13990   case ARM::BI__builtin_arm_mve_vmlsdavaq_p_s16:
13991     Param0 = 0;
13992     Param1 = 1;
13993     Param2 = 0;
13994     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13995     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
13996     break;
13997   case ARM::BI__builtin_arm_mve_vmlsdavaq_p_s32:
13998     Param0 = 0;
13999     Param1 = 1;
14000     Param2 = 0;
14001     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14002     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14003     break;
14004   case ARM::BI__builtin_arm_mve_vmlsdavaq_p_s8:
14005     Param0 = 0;
14006     Param1 = 1;
14007     Param2 = 0;
14008     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
14009     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
14010     break;
14011   case ARM::BI__builtin_arm_mve_vmlsdavaxq_p_s16:
14012     Param0 = 0;
14013     Param1 = 1;
14014     Param2 = 1;
14015     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14016     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14017     break;
14018   case ARM::BI__builtin_arm_mve_vmlsdavaxq_p_s32:
14019     Param0 = 0;
14020     Param1 = 1;
14021     Param2 = 1;
14022     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14023     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14024     break;
14025   case ARM::BI__builtin_arm_mve_vmlsdavaxq_p_s8:
14026     Param0 = 0;
14027     Param1 = 1;
14028     Param2 = 1;
14029     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
14030     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
14031     break;
14032   }
14033   Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
14034   Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param1);
14035   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param2);
14036   Value *Val3 = EmitScalarExpr(E->getArg(0));
14037   Value *Val4 = EmitScalarExpr(E->getArg(1));
14038   Value *Val5 = EmitScalarExpr(E->getArg(2));
14039   Value *Val6 = EmitScalarExpr(E->getArg(3));
14040   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
14041   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val7});
14042   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmldava_predicated, {Param4, Param3}), {Val0, Val1, Val2, Val3, Val4, Val5, Val8});
14043 }
14044 case ARM::BI__builtin_arm_mve_vmladavaq_s16:
14045 case ARM::BI__builtin_arm_mve_vmladavaq_s32:
14046 case ARM::BI__builtin_arm_mve_vmladavaq_s8:
14047 case ARM::BI__builtin_arm_mve_vmladavaq_u16:
14048 case ARM::BI__builtin_arm_mve_vmladavaq_u32:
14049 case ARM::BI__builtin_arm_mve_vmladavaq_u8:
14050 case ARM::BI__builtin_arm_mve_vmladavaxq_s16:
14051 case ARM::BI__builtin_arm_mve_vmladavaxq_s32:
14052 case ARM::BI__builtin_arm_mve_vmladavaxq_s8:
14053 case ARM::BI__builtin_arm_mve_vmlsdavaq_s16:
14054 case ARM::BI__builtin_arm_mve_vmlsdavaq_s32:
14055 case ARM::BI__builtin_arm_mve_vmlsdavaq_s8:
14056 case ARM::BI__builtin_arm_mve_vmlsdavaxq_s16:
14057 case ARM::BI__builtin_arm_mve_vmlsdavaxq_s32:
14058 case ARM::BI__builtin_arm_mve_vmlsdavaxq_s8: {
14059   uint32_t  Param0;
14060   uint32_t  Param1;
14061   uint32_t  Param2;
14062   llvm::Type * Param3;
14063   switch (BuiltinID) {
14064   case ARM::BI__builtin_arm_mve_vmladavaq_s16:
14065     Param0 = 0;
14066     Param1 = 0;
14067     Param2 = 0;
14068     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14069     break;
14070   case ARM::BI__builtin_arm_mve_vmladavaq_s32:
14071     Param0 = 0;
14072     Param1 = 0;
14073     Param2 = 0;
14074     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14075     break;
14076   case ARM::BI__builtin_arm_mve_vmladavaq_s8:
14077     Param0 = 0;
14078     Param1 = 0;
14079     Param2 = 0;
14080     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14081     break;
14082   case ARM::BI__builtin_arm_mve_vmladavaq_u16:
14083     Param0 = 1;
14084     Param1 = 0;
14085     Param2 = 0;
14086     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14087     break;
14088   case ARM::BI__builtin_arm_mve_vmladavaq_u32:
14089     Param0 = 1;
14090     Param1 = 0;
14091     Param2 = 0;
14092     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14093     break;
14094   case ARM::BI__builtin_arm_mve_vmladavaq_u8:
14095     Param0 = 1;
14096     Param1 = 0;
14097     Param2 = 0;
14098     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14099     break;
14100   case ARM::BI__builtin_arm_mve_vmladavaxq_s16:
14101     Param0 = 0;
14102     Param1 = 0;
14103     Param2 = 1;
14104     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14105     break;
14106   case ARM::BI__builtin_arm_mve_vmladavaxq_s32:
14107     Param0 = 0;
14108     Param1 = 0;
14109     Param2 = 1;
14110     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14111     break;
14112   case ARM::BI__builtin_arm_mve_vmladavaxq_s8:
14113     Param0 = 0;
14114     Param1 = 0;
14115     Param2 = 1;
14116     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14117     break;
14118   case ARM::BI__builtin_arm_mve_vmlsdavaq_s16:
14119     Param0 = 0;
14120     Param1 = 1;
14121     Param2 = 0;
14122     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14123     break;
14124   case ARM::BI__builtin_arm_mve_vmlsdavaq_s32:
14125     Param0 = 0;
14126     Param1 = 1;
14127     Param2 = 0;
14128     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14129     break;
14130   case ARM::BI__builtin_arm_mve_vmlsdavaq_s8:
14131     Param0 = 0;
14132     Param1 = 1;
14133     Param2 = 0;
14134     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14135     break;
14136   case ARM::BI__builtin_arm_mve_vmlsdavaxq_s16:
14137     Param0 = 0;
14138     Param1 = 1;
14139     Param2 = 1;
14140     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14141     break;
14142   case ARM::BI__builtin_arm_mve_vmlsdavaxq_s32:
14143     Param0 = 0;
14144     Param1 = 1;
14145     Param2 = 1;
14146     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14147     break;
14148   case ARM::BI__builtin_arm_mve_vmlsdavaxq_s8:
14149     Param0 = 0;
14150     Param1 = 1;
14151     Param2 = 1;
14152     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14153     break;
14154   }
14155   Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
14156   Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param1);
14157   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param2);
14158   Value *Val3 = EmitScalarExpr(E->getArg(0));
14159   Value *Val4 = EmitScalarExpr(E->getArg(1));
14160   Value *Val5 = EmitScalarExpr(E->getArg(2));
14161   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmldava, {Param3}), {Val0, Val1, Val2, Val3, Val4, Val5});
14162 }
14163 case ARM::BI__builtin_arm_mve_vmladavq_p_s16:
14164 case ARM::BI__builtin_arm_mve_vmladavq_p_s32:
14165 case ARM::BI__builtin_arm_mve_vmladavq_p_s8:
14166 case ARM::BI__builtin_arm_mve_vmladavq_p_u16:
14167 case ARM::BI__builtin_arm_mve_vmladavq_p_u32:
14168 case ARM::BI__builtin_arm_mve_vmladavq_p_u8:
14169 case ARM::BI__builtin_arm_mve_vmladavxq_p_s16:
14170 case ARM::BI__builtin_arm_mve_vmladavxq_p_s32:
14171 case ARM::BI__builtin_arm_mve_vmladavxq_p_s8:
14172 case ARM::BI__builtin_arm_mve_vmlsdavq_p_s16:
14173 case ARM::BI__builtin_arm_mve_vmlsdavq_p_s32:
14174 case ARM::BI__builtin_arm_mve_vmlsdavq_p_s8:
14175 case ARM::BI__builtin_arm_mve_vmlsdavxq_p_s16:
14176 case ARM::BI__builtin_arm_mve_vmlsdavxq_p_s32:
14177 case ARM::BI__builtin_arm_mve_vmlsdavxq_p_s8: {
14178   uint32_t  Param0;
14179   uint32_t  Param1;
14180   uint32_t  Param2;
14181   llvm::Type * Param3;
14182   llvm::Type * Param4;
14183   switch (BuiltinID) {
14184   case ARM::BI__builtin_arm_mve_vmladavq_p_s16:
14185     Param0 = 0;
14186     Param1 = 0;
14187     Param2 = 0;
14188     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14189     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14190     break;
14191   case ARM::BI__builtin_arm_mve_vmladavq_p_s32:
14192     Param0 = 0;
14193     Param1 = 0;
14194     Param2 = 0;
14195     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14196     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14197     break;
14198   case ARM::BI__builtin_arm_mve_vmladavq_p_s8:
14199     Param0 = 0;
14200     Param1 = 0;
14201     Param2 = 0;
14202     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
14203     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
14204     break;
14205   case ARM::BI__builtin_arm_mve_vmladavq_p_u16:
14206     Param0 = 1;
14207     Param1 = 0;
14208     Param2 = 0;
14209     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14210     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14211     break;
14212   case ARM::BI__builtin_arm_mve_vmladavq_p_u32:
14213     Param0 = 1;
14214     Param1 = 0;
14215     Param2 = 0;
14216     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14217     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14218     break;
14219   case ARM::BI__builtin_arm_mve_vmladavq_p_u8:
14220     Param0 = 1;
14221     Param1 = 0;
14222     Param2 = 0;
14223     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
14224     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
14225     break;
14226   case ARM::BI__builtin_arm_mve_vmladavxq_p_s16:
14227     Param0 = 0;
14228     Param1 = 0;
14229     Param2 = 1;
14230     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14231     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14232     break;
14233   case ARM::BI__builtin_arm_mve_vmladavxq_p_s32:
14234     Param0 = 0;
14235     Param1 = 0;
14236     Param2 = 1;
14237     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14238     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14239     break;
14240   case ARM::BI__builtin_arm_mve_vmladavxq_p_s8:
14241     Param0 = 0;
14242     Param1 = 0;
14243     Param2 = 1;
14244     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
14245     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
14246     break;
14247   case ARM::BI__builtin_arm_mve_vmlsdavq_p_s16:
14248     Param0 = 0;
14249     Param1 = 1;
14250     Param2 = 0;
14251     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14252     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14253     break;
14254   case ARM::BI__builtin_arm_mve_vmlsdavq_p_s32:
14255     Param0 = 0;
14256     Param1 = 1;
14257     Param2 = 0;
14258     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14259     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14260     break;
14261   case ARM::BI__builtin_arm_mve_vmlsdavq_p_s8:
14262     Param0 = 0;
14263     Param1 = 1;
14264     Param2 = 0;
14265     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
14266     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
14267     break;
14268   case ARM::BI__builtin_arm_mve_vmlsdavxq_p_s16:
14269     Param0 = 0;
14270     Param1 = 1;
14271     Param2 = 1;
14272     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14273     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14274     break;
14275   case ARM::BI__builtin_arm_mve_vmlsdavxq_p_s32:
14276     Param0 = 0;
14277     Param1 = 1;
14278     Param2 = 1;
14279     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14280     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14281     break;
14282   case ARM::BI__builtin_arm_mve_vmlsdavxq_p_s8:
14283     Param0 = 0;
14284     Param1 = 1;
14285     Param2 = 1;
14286     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
14287     Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
14288     break;
14289   }
14290   Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
14291   Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param1);
14292   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param2);
14293   llvm::Type *Val3 = Int32Ty;
14294   Value *Val4 = llvm::Constant::getNullValue(Val3);
14295   Value *Val5 = EmitScalarExpr(E->getArg(0));
14296   Value *Val6 = EmitScalarExpr(E->getArg(1));
14297   Value *Val7 = EmitScalarExpr(E->getArg(2));
14298   Value *Val8 = Builder.CreateIntCast(Val7, Int32Ty, false);
14299   Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val8});
14300   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmldava_predicated, {Param4, Param3}), {Val0, Val1, Val2, Val4, Val5, Val6, Val9});
14301 }
14302 case ARM::BI__builtin_arm_mve_vmladavq_s16:
14303 case ARM::BI__builtin_arm_mve_vmladavq_s32:
14304 case ARM::BI__builtin_arm_mve_vmladavq_s8:
14305 case ARM::BI__builtin_arm_mve_vmladavq_u16:
14306 case ARM::BI__builtin_arm_mve_vmladavq_u32:
14307 case ARM::BI__builtin_arm_mve_vmladavq_u8:
14308 case ARM::BI__builtin_arm_mve_vmladavxq_s16:
14309 case ARM::BI__builtin_arm_mve_vmladavxq_s32:
14310 case ARM::BI__builtin_arm_mve_vmladavxq_s8:
14311 case ARM::BI__builtin_arm_mve_vmlsdavq_s16:
14312 case ARM::BI__builtin_arm_mve_vmlsdavq_s32:
14313 case ARM::BI__builtin_arm_mve_vmlsdavq_s8:
14314 case ARM::BI__builtin_arm_mve_vmlsdavxq_s16:
14315 case ARM::BI__builtin_arm_mve_vmlsdavxq_s32:
14316 case ARM::BI__builtin_arm_mve_vmlsdavxq_s8: {
14317   uint32_t  Param0;
14318   uint32_t  Param1;
14319   uint32_t  Param2;
14320   llvm::Type * Param3;
14321   switch (BuiltinID) {
14322   case ARM::BI__builtin_arm_mve_vmladavq_s16:
14323     Param0 = 0;
14324     Param1 = 0;
14325     Param2 = 0;
14326     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14327     break;
14328   case ARM::BI__builtin_arm_mve_vmladavq_s32:
14329     Param0 = 0;
14330     Param1 = 0;
14331     Param2 = 0;
14332     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14333     break;
14334   case ARM::BI__builtin_arm_mve_vmladavq_s8:
14335     Param0 = 0;
14336     Param1 = 0;
14337     Param2 = 0;
14338     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14339     break;
14340   case ARM::BI__builtin_arm_mve_vmladavq_u16:
14341     Param0 = 1;
14342     Param1 = 0;
14343     Param2 = 0;
14344     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14345     break;
14346   case ARM::BI__builtin_arm_mve_vmladavq_u32:
14347     Param0 = 1;
14348     Param1 = 0;
14349     Param2 = 0;
14350     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14351     break;
14352   case ARM::BI__builtin_arm_mve_vmladavq_u8:
14353     Param0 = 1;
14354     Param1 = 0;
14355     Param2 = 0;
14356     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14357     break;
14358   case ARM::BI__builtin_arm_mve_vmladavxq_s16:
14359     Param0 = 0;
14360     Param1 = 0;
14361     Param2 = 1;
14362     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14363     break;
14364   case ARM::BI__builtin_arm_mve_vmladavxq_s32:
14365     Param0 = 0;
14366     Param1 = 0;
14367     Param2 = 1;
14368     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14369     break;
14370   case ARM::BI__builtin_arm_mve_vmladavxq_s8:
14371     Param0 = 0;
14372     Param1 = 0;
14373     Param2 = 1;
14374     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14375     break;
14376   case ARM::BI__builtin_arm_mve_vmlsdavq_s16:
14377     Param0 = 0;
14378     Param1 = 1;
14379     Param2 = 0;
14380     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14381     break;
14382   case ARM::BI__builtin_arm_mve_vmlsdavq_s32:
14383     Param0 = 0;
14384     Param1 = 1;
14385     Param2 = 0;
14386     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14387     break;
14388   case ARM::BI__builtin_arm_mve_vmlsdavq_s8:
14389     Param0 = 0;
14390     Param1 = 1;
14391     Param2 = 0;
14392     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14393     break;
14394   case ARM::BI__builtin_arm_mve_vmlsdavxq_s16:
14395     Param0 = 0;
14396     Param1 = 1;
14397     Param2 = 1;
14398     Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14399     break;
14400   case ARM::BI__builtin_arm_mve_vmlsdavxq_s32:
14401     Param0 = 0;
14402     Param1 = 1;
14403     Param2 = 1;
14404     Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14405     break;
14406   case ARM::BI__builtin_arm_mve_vmlsdavxq_s8:
14407     Param0 = 0;
14408     Param1 = 1;
14409     Param2 = 1;
14410     Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14411     break;
14412   }
14413   Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
14414   Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param1);
14415   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param2);
14416   llvm::Type *Val3 = Int32Ty;
14417   Value *Val4 = llvm::Constant::getNullValue(Val3);
14418   Value *Val5 = EmitScalarExpr(E->getArg(0));
14419   Value *Val6 = EmitScalarExpr(E->getArg(1));
14420   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmldava, {Param3}), {Val0, Val1, Val2, Val4, Val5, Val6});
14421 }
14422 case ARM::BI__builtin_arm_mve_vmlaldavq_s16:
14423 case ARM::BI__builtin_arm_mve_vmlaldavq_s32:
14424 case ARM::BI__builtin_arm_mve_vmlaldavq_u16:
14425 case ARM::BI__builtin_arm_mve_vmlaldavq_u32:
14426 case ARM::BI__builtin_arm_mve_vmlaldavxq_s16:
14427 case ARM::BI__builtin_arm_mve_vmlaldavxq_s32:
14428 case ARM::BI__builtin_arm_mve_vmlsldavq_s16:
14429 case ARM::BI__builtin_arm_mve_vmlsldavq_s32:
14430 case ARM::BI__builtin_arm_mve_vmlsldavxq_s16:
14431 case ARM::BI__builtin_arm_mve_vmlsldavxq_s32:
14432 case ARM::BI__builtin_arm_mve_vrmlaldavhq_s32:
14433 case ARM::BI__builtin_arm_mve_vrmlaldavhq_u32:
14434 case ARM::BI__builtin_arm_mve_vrmlaldavhxq_s32:
14435 case ARM::BI__builtin_arm_mve_vrmlsldavhq_s32:
14436 case ARM::BI__builtin_arm_mve_vrmlsldavhxq_s32: {
14437   uint32_t  Param0;
14438   uint32_t  Param1;
14439   uint32_t  Param2;
14440   Intrinsic::ID  Param3;
14441   llvm::Type * Param4;
14442   switch (BuiltinID) {
14443   case ARM::BI__builtin_arm_mve_vmlaldavq_s16:
14444     Param0 = 0;
14445     Param1 = 0;
14446     Param2 = 0;
14447     Param3 = Intrinsic::arm_mve_vmlldava;
14448     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14449     break;
14450   case ARM::BI__builtin_arm_mve_vmlaldavq_s32:
14451     Param0 = 0;
14452     Param1 = 0;
14453     Param2 = 0;
14454     Param3 = Intrinsic::arm_mve_vmlldava;
14455     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14456     break;
14457   case ARM::BI__builtin_arm_mve_vmlaldavq_u16:
14458     Param0 = 1;
14459     Param1 = 0;
14460     Param2 = 0;
14461     Param3 = Intrinsic::arm_mve_vmlldava;
14462     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14463     break;
14464   case ARM::BI__builtin_arm_mve_vmlaldavq_u32:
14465     Param0 = 1;
14466     Param1 = 0;
14467     Param2 = 0;
14468     Param3 = Intrinsic::arm_mve_vmlldava;
14469     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14470     break;
14471   case ARM::BI__builtin_arm_mve_vmlaldavxq_s16:
14472     Param0 = 0;
14473     Param1 = 0;
14474     Param2 = 1;
14475     Param3 = Intrinsic::arm_mve_vmlldava;
14476     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14477     break;
14478   case ARM::BI__builtin_arm_mve_vmlaldavxq_s32:
14479     Param0 = 0;
14480     Param1 = 0;
14481     Param2 = 1;
14482     Param3 = Intrinsic::arm_mve_vmlldava;
14483     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14484     break;
14485   case ARM::BI__builtin_arm_mve_vmlsldavq_s16:
14486     Param0 = 0;
14487     Param1 = 1;
14488     Param2 = 0;
14489     Param3 = Intrinsic::arm_mve_vmlldava;
14490     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14491     break;
14492   case ARM::BI__builtin_arm_mve_vmlsldavq_s32:
14493     Param0 = 0;
14494     Param1 = 1;
14495     Param2 = 0;
14496     Param3 = Intrinsic::arm_mve_vmlldava;
14497     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14498     break;
14499   case ARM::BI__builtin_arm_mve_vmlsldavxq_s16:
14500     Param0 = 0;
14501     Param1 = 1;
14502     Param2 = 1;
14503     Param3 = Intrinsic::arm_mve_vmlldava;
14504     Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14505     break;
14506   case ARM::BI__builtin_arm_mve_vmlsldavxq_s32:
14507     Param0 = 0;
14508     Param1 = 1;
14509     Param2 = 1;
14510     Param3 = Intrinsic::arm_mve_vmlldava;
14511     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14512     break;
14513   case ARM::BI__builtin_arm_mve_vrmlaldavhq_s32:
14514     Param0 = 0;
14515     Param1 = 0;
14516     Param2 = 0;
14517     Param3 = Intrinsic::arm_mve_vrmlldavha;
14518     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14519     break;
14520   case ARM::BI__builtin_arm_mve_vrmlaldavhq_u32:
14521     Param0 = 1;
14522     Param1 = 0;
14523     Param2 = 0;
14524     Param3 = Intrinsic::arm_mve_vrmlldavha;
14525     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14526     break;
14527   case ARM::BI__builtin_arm_mve_vrmlaldavhxq_s32:
14528     Param0 = 0;
14529     Param1 = 0;
14530     Param2 = 1;
14531     Param3 = Intrinsic::arm_mve_vrmlldavha;
14532     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14533     break;
14534   case ARM::BI__builtin_arm_mve_vrmlsldavhq_s32:
14535     Param0 = 0;
14536     Param1 = 1;
14537     Param2 = 0;
14538     Param3 = Intrinsic::arm_mve_vrmlldavha;
14539     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14540     break;
14541   case ARM::BI__builtin_arm_mve_vrmlsldavhxq_s32:
14542     Param0 = 0;
14543     Param1 = 1;
14544     Param2 = 1;
14545     Param3 = Intrinsic::arm_mve_vrmlldavha;
14546     Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14547     break;
14548   }
14549   llvm::Type *Val0 = Int32Ty;
14550   Value *Val1 = llvm::Constant::getNullValue(Val0);
14551   llvm::Type *Val2 = Int32Ty;
14552   Value *Val3 = llvm::Constant::getNullValue(Val2);
14553   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
14554   Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param1);
14555   Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param2);
14556   Value *Val7 = EmitScalarExpr(E->getArg(0));
14557   Value *Val8 = EmitScalarExpr(E->getArg(1));
14558   Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Param3, {Param4}), {Val4, Val5, Val6, Val3, Val1, Val7, Val8});
14559   Value *Val10 = Builder.CreateExtractValue(Val9, static_cast<unsigned>(1));
14560   Value *Val11 = Builder.CreateIntCast(Val10, Int64Ty, false);
14561   Value *Val12 = llvm::ConstantInt::get(Int64Ty, 32);
14562   Value *Val13 = Builder.CreateShl(Val11, Val12);
14563   Value *Val14 = Builder.CreateExtractValue(Val9, static_cast<unsigned>(0));
14564   Value *Val15 = Builder.CreateIntCast(Val14, Int64Ty, false);
14565   return Builder.CreateOr(Val13, Val15);
14566 }
14567 case ARM::BI__builtin_arm_mve_vmlaldavq_p_s16:
14568 case ARM::BI__builtin_arm_mve_vmlaldavq_p_s32:
14569 case ARM::BI__builtin_arm_mve_vmlaldavq_p_u16:
14570 case ARM::BI__builtin_arm_mve_vmlaldavq_p_u32:
14571 case ARM::BI__builtin_arm_mve_vmlaldavxq_p_s16:
14572 case ARM::BI__builtin_arm_mve_vmlaldavxq_p_s32:
14573 case ARM::BI__builtin_arm_mve_vmlsldavq_p_s16:
14574 case ARM::BI__builtin_arm_mve_vmlsldavq_p_s32:
14575 case ARM::BI__builtin_arm_mve_vmlsldavxq_p_s16:
14576 case ARM::BI__builtin_arm_mve_vmlsldavxq_p_s32:
14577 case ARM::BI__builtin_arm_mve_vrmlaldavhq_p_s32:
14578 case ARM::BI__builtin_arm_mve_vrmlaldavhq_p_u32:
14579 case ARM::BI__builtin_arm_mve_vrmlaldavhxq_p_s32:
14580 case ARM::BI__builtin_arm_mve_vrmlsldavhq_p_s32:
14581 case ARM::BI__builtin_arm_mve_vrmlsldavhxq_p_s32: {
14582   uint32_t  Param0;
14583   uint32_t  Param1;
14584   uint32_t  Param2;
14585   llvm::Type * Param3;
14586   Intrinsic::ID  Param4;
14587   llvm::Type * Param5;
14588   switch (BuiltinID) {
14589   case ARM::BI__builtin_arm_mve_vmlaldavq_p_s16:
14590     Param0 = 0;
14591     Param1 = 0;
14592     Param2 = 0;
14593     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14594     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14595     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
14596     break;
14597   case ARM::BI__builtin_arm_mve_vmlaldavq_p_s32:
14598     Param0 = 0;
14599     Param1 = 0;
14600     Param2 = 0;
14601     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14602     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14603     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14604     break;
14605   case ARM::BI__builtin_arm_mve_vmlaldavq_p_u16:
14606     Param0 = 1;
14607     Param1 = 0;
14608     Param2 = 0;
14609     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14610     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14611     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
14612     break;
14613   case ARM::BI__builtin_arm_mve_vmlaldavq_p_u32:
14614     Param0 = 1;
14615     Param1 = 0;
14616     Param2 = 0;
14617     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14618     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14619     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14620     break;
14621   case ARM::BI__builtin_arm_mve_vmlaldavxq_p_s16:
14622     Param0 = 0;
14623     Param1 = 0;
14624     Param2 = 1;
14625     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14626     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14627     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
14628     break;
14629   case ARM::BI__builtin_arm_mve_vmlaldavxq_p_s32:
14630     Param0 = 0;
14631     Param1 = 0;
14632     Param2 = 1;
14633     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14634     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14635     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14636     break;
14637   case ARM::BI__builtin_arm_mve_vmlsldavq_p_s16:
14638     Param0 = 0;
14639     Param1 = 1;
14640     Param2 = 0;
14641     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14642     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14643     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
14644     break;
14645   case ARM::BI__builtin_arm_mve_vmlsldavq_p_s32:
14646     Param0 = 0;
14647     Param1 = 1;
14648     Param2 = 0;
14649     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14650     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14651     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14652     break;
14653   case ARM::BI__builtin_arm_mve_vmlsldavxq_p_s16:
14654     Param0 = 0;
14655     Param1 = 1;
14656     Param2 = 1;
14657     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14658     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14659     Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
14660     break;
14661   case ARM::BI__builtin_arm_mve_vmlsldavxq_p_s32:
14662     Param0 = 0;
14663     Param1 = 1;
14664     Param2 = 1;
14665     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14666     Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14667     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14668     break;
14669   case ARM::BI__builtin_arm_mve_vrmlaldavhq_p_s32:
14670     Param0 = 0;
14671     Param1 = 0;
14672     Param2 = 0;
14673     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14674     Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
14675     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14676     break;
14677   case ARM::BI__builtin_arm_mve_vrmlaldavhq_p_u32:
14678     Param0 = 1;
14679     Param1 = 0;
14680     Param2 = 0;
14681     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14682     Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
14683     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14684     break;
14685   case ARM::BI__builtin_arm_mve_vrmlaldavhxq_p_s32:
14686     Param0 = 0;
14687     Param1 = 0;
14688     Param2 = 1;
14689     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14690     Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
14691     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14692     break;
14693   case ARM::BI__builtin_arm_mve_vrmlsldavhq_p_s32:
14694     Param0 = 0;
14695     Param1 = 1;
14696     Param2 = 0;
14697     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14698     Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
14699     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14700     break;
14701   case ARM::BI__builtin_arm_mve_vrmlsldavhxq_p_s32:
14702     Param0 = 0;
14703     Param1 = 1;
14704     Param2 = 1;
14705     Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14706     Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
14707     Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14708     break;
14709   }
14710   llvm::Type *Val0 = Int32Ty;
14711   Value *Val1 = llvm::Constant::getNullValue(Val0);
14712   llvm::Type *Val2 = Int32Ty;
14713   Value *Val3 = llvm::Constant::getNullValue(Val2);
14714   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
14715   Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param1);
14716   Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param2);
14717   Value *Val7 = EmitScalarExpr(E->getArg(0));
14718   Value *Val8 = EmitScalarExpr(E->getArg(1));
14719   Value *Val9 = EmitScalarExpr(E->getArg(2));
14720   Value *Val10 = Builder.CreateIntCast(Val9, Int32Ty, false);
14721   Value *Val11 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val10});
14722   Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Param4, {Param5, Param3}), {Val4, Val5, Val6, Val3, Val1, Val7, Val8, Val11});
14723   Value *Val13 = Builder.CreateExtractValue(Val12, static_cast<unsigned>(1));
14724   Value *Val14 = Builder.CreateIntCast(Val13, Int64Ty, false);
14725   Value *Val15 = llvm::ConstantInt::get(Int64Ty, 32);
14726   Value *Val16 = Builder.CreateShl(Val14, Val15);
14727   Value *Val17 = Builder.CreateExtractValue(Val12, static_cast<unsigned>(0));
14728   Value *Val18 = Builder.CreateIntCast(Val17, Int64Ty, false);
14729   return Builder.CreateOr(Val16, Val18);
14730 }
14731 case ARM::BI__builtin_arm_mve_vaddq_x_n_f32:
14732 case ARM::BI__builtin_arm_mve_vmulq_x_n_f32:
14733 case ARM::BI__builtin_arm_mve_vsubq_x_n_f32: {
14734   Intrinsic::ID  Param0;
14735   switch (BuiltinID) {
14736   case ARM::BI__builtin_arm_mve_vaddq_x_n_f32:
14737     Param0 = Intrinsic::arm_mve_add_predicated;
14738     break;
14739   case ARM::BI__builtin_arm_mve_vmulq_x_n_f32:
14740     Param0 = Intrinsic::arm_mve_mul_predicated;
14741     break;
14742   case ARM::BI__builtin_arm_mve_vsubq_x_n_f32:
14743     Param0 = Intrinsic::arm_mve_sub_predicated;
14744     break;
14745   }
14746   llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14747   Value *Val1 = UndefValue::get(Val0);
14748   Value *Val2 = EmitScalarExpr(E->getArg(0));
14749   Value *Val3 = EmitScalarExpr(E->getArg(1));
14750   Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
14751   Value *Val5 = EmitScalarExpr(E->getArg(2));
14752   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
14753   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
14754   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val4, Val7, Val1});
14755 }
14756 case ARM::BI__builtin_arm_mve_vabsq_x_f32:
14757 case ARM::BI__builtin_arm_mve_vnegq_x_f32:
14758 case ARM::BI__builtin_arm_mve_vrndaq_x_f32:
14759 case ARM::BI__builtin_arm_mve_vrndmq_x_f32:
14760 case ARM::BI__builtin_arm_mve_vrndnq_x_f32:
14761 case ARM::BI__builtin_arm_mve_vrndpq_x_f32:
14762 case ARM::BI__builtin_arm_mve_vrndq_x_f32:
14763 case ARM::BI__builtin_arm_mve_vrndxq_x_f32: {
14764   Intrinsic::ID  Param0;
14765   switch (BuiltinID) {
14766   case ARM::BI__builtin_arm_mve_vabsq_x_f32:
14767     Param0 = Intrinsic::arm_mve_abs_predicated;
14768     break;
14769   case ARM::BI__builtin_arm_mve_vnegq_x_f32:
14770     Param0 = Intrinsic::arm_mve_neg_predicated;
14771     break;
14772   case ARM::BI__builtin_arm_mve_vrndaq_x_f32:
14773     Param0 = Intrinsic::arm_mve_vrinta_predicated;
14774     break;
14775   case ARM::BI__builtin_arm_mve_vrndmq_x_f32:
14776     Param0 = Intrinsic::arm_mve_vrintm_predicated;
14777     break;
14778   case ARM::BI__builtin_arm_mve_vrndnq_x_f32:
14779     Param0 = Intrinsic::arm_mve_vrintn_predicated;
14780     break;
14781   case ARM::BI__builtin_arm_mve_vrndpq_x_f32:
14782     Param0 = Intrinsic::arm_mve_vrintp_predicated;
14783     break;
14784   case ARM::BI__builtin_arm_mve_vrndq_x_f32:
14785     Param0 = Intrinsic::arm_mve_vrintz_predicated;
14786     break;
14787   case ARM::BI__builtin_arm_mve_vrndxq_x_f32:
14788     Param0 = Intrinsic::arm_mve_vrintx_predicated;
14789     break;
14790   }
14791   llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14792   Value *Val1 = UndefValue::get(Val0);
14793   Value *Val2 = EmitScalarExpr(E->getArg(0));
14794   Value *Val3 = EmitScalarExpr(E->getArg(1));
14795   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
14796   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
14797   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val5, Val1});
14798 }
14799 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_f32: {
14800   Intrinsic::ID  Param0;
14801   switch (BuiltinID) {
14802   case ARM::BI__builtin_arm_mve_vbrsrq_x_n_f32:
14803     Param0 = Intrinsic::arm_mve_vbrsr_predicated;
14804     break;
14805   }
14806   llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14807   Value *Val1 = UndefValue::get(Val0);
14808   Value *Val2 = EmitScalarExpr(E->getArg(0));
14809   Value *Val3 = EmitScalarExpr(E->getArg(1));
14810   Value *Val4 = EmitScalarExpr(E->getArg(2));
14811   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
14812   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
14813   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1, Val2, Val3, Val6});
14814 }
14815 case ARM::BI__builtin_arm_mve_vaddq_x_f32:
14816 case ARM::BI__builtin_arm_mve_vmulq_x_f32:
14817 case ARM::BI__builtin_arm_mve_vsubq_x_f32: {
14818   Intrinsic::ID  Param0;
14819   switch (BuiltinID) {
14820   case ARM::BI__builtin_arm_mve_vaddq_x_f32:
14821     Param0 = Intrinsic::arm_mve_add_predicated;
14822     break;
14823   case ARM::BI__builtin_arm_mve_vmulq_x_f32:
14824     Param0 = Intrinsic::arm_mve_mul_predicated;
14825     break;
14826   case ARM::BI__builtin_arm_mve_vsubq_x_f32:
14827     Param0 = Intrinsic::arm_mve_sub_predicated;
14828     break;
14829   }
14830   llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14831   Value *Val1 = UndefValue::get(Val0);
14832   Value *Val2 = EmitScalarExpr(E->getArg(0));
14833   Value *Val3 = EmitScalarExpr(E->getArg(1));
14834   Value *Val4 = EmitScalarExpr(E->getArg(2));
14835   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
14836   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
14837   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val6, Val1});
14838 }
14839 case ARM::BI__builtin_arm_mve_vabdq_x_f32:
14840 case ARM::BI__builtin_arm_mve_vmaxnmq_x_f32:
14841 case ARM::BI__builtin_arm_mve_vminnmq_x_f32: {
14842   Intrinsic::ID  Param0;
14843   switch (BuiltinID) {
14844   case ARM::BI__builtin_arm_mve_vabdq_x_f32:
14845     Param0 = Intrinsic::arm_mve_abd_predicated;
14846     break;
14847   case ARM::BI__builtin_arm_mve_vmaxnmq_x_f32:
14848     Param0 = Intrinsic::arm_mve_max_predicated;
14849     break;
14850   case ARM::BI__builtin_arm_mve_vminnmq_x_f32:
14851     Param0 = Intrinsic::arm_mve_min_predicated;
14852     break;
14853   }
14854   llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14855   Value *Val1 = UndefValue::get(Val0);
14856   Value *Val2 = EmitScalarExpr(E->getArg(0));
14857   Value *Val3 = EmitScalarExpr(E->getArg(1));
14858   Value *Val4 = llvm::ConstantInt::get(Int32Ty, 0);
14859   Value *Val5 = EmitScalarExpr(E->getArg(2));
14860   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
14861   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
14862   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val4, Val7, Val1});
14863 }
14864 case ARM::BI__builtin_arm_mve_vrev64q_x_f32: {
14865   llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14866   Value *Val1 = UndefValue::get(Val0);
14867   Value *Val2 = EmitScalarExpr(E->getArg(0));
14868   Value *Val3 = llvm::ConstantInt::get(Int32Ty, 64);
14869   Value *Val4 = EmitScalarExpr(E->getArg(1));
14870   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
14871   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
14872   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vrev_predicated, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val6, Val1});
14873 }
14874 case ARM::BI__builtin_arm_mve_vcvtq_x_f32_s32:
14875 case ARM::BI__builtin_arm_mve_vcvtq_x_f32_u32: {
14876   uint32_t  Param0;
14877   switch (BuiltinID) {
14878   case ARM::BI__builtin_arm_mve_vcvtq_x_f32_s32:
14879     Param0 = 0;
14880     break;
14881   case ARM::BI__builtin_arm_mve_vcvtq_x_f32_u32:
14882     Param0 = 1;
14883     break;
14884   }
14885   llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14886   Value *Val1 = UndefValue::get(Val0);
14887   Value *Val2 = EmitScalarExpr(E->getArg(0));
14888   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
14889   Value *Val4 = EmitScalarExpr(E->getArg(1));
14890   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
14891   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
14892   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fp_int_predicated, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val6, Val1});
14893 }
14894 case ARM::BI__builtin_arm_mve_vcvtbq_x_f32_f16:
14895 case ARM::BI__builtin_arm_mve_vcvttq_x_f32_f16: {
14896   uint32_t  Param0;
14897   switch (BuiltinID) {
14898   case ARM::BI__builtin_arm_mve_vcvtbq_x_f32_f16:
14899     Param0 = 0;
14900     break;
14901   case ARM::BI__builtin_arm_mve_vcvttq_x_f32_f16:
14902     Param0 = 1;
14903     break;
14904   }
14905   llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14906   Value *Val1 = UndefValue::get(Val0);
14907   Value *Val2 = EmitScalarExpr(E->getArg(0));
14908   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
14909   Value *Val4 = EmitScalarExpr(E->getArg(1));
14910   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
14911   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
14912   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_widen_predicated), {Val1, Val2, Val3, Val6});
14913 }
14914 case ARM::BI__builtin_arm_mve_vandq_x_f32:
14915 case ARM::BI__builtin_arm_mve_vbicq_x_f32:
14916 case ARM::BI__builtin_arm_mve_veorq_x_f32:
14917 case ARM::BI__builtin_arm_mve_vornq_x_f32:
14918 case ARM::BI__builtin_arm_mve_vorrq_x_f32: {
14919   Intrinsic::ID  Param0;
14920   switch (BuiltinID) {
14921   case ARM::BI__builtin_arm_mve_vandq_x_f32:
14922     Param0 = Intrinsic::arm_mve_and_predicated;
14923     break;
14924   case ARM::BI__builtin_arm_mve_vbicq_x_f32:
14925     Param0 = Intrinsic::arm_mve_bic_predicated;
14926     break;
14927   case ARM::BI__builtin_arm_mve_veorq_x_f32:
14928     Param0 = Intrinsic::arm_mve_eor_predicated;
14929     break;
14930   case ARM::BI__builtin_arm_mve_vornq_x_f32:
14931     Param0 = Intrinsic::arm_mve_orn_predicated;
14932     break;
14933   case ARM::BI__builtin_arm_mve_vorrq_x_f32:
14934     Param0 = Intrinsic::arm_mve_orr_predicated;
14935     break;
14936   }
14937   llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14938   Value *Val1 = UndefValue::get(Val0);
14939   Value *Val2 = EmitScalarExpr(E->getArg(0));
14940   llvm::Type *Val3 = llvm::FixedVectorType::get(Int32Ty, 4);
14941   Value *Val4 = Builder.CreateBitCast(Val2, Val3);
14942   Value *Val5 = EmitScalarExpr(E->getArg(1));
14943   llvm::Type *Val6 = llvm::FixedVectorType::get(Int32Ty, 4);
14944   Value *Val7 = Builder.CreateBitCast(Val5, Val6);
14945   Value *Val8 = EmitScalarExpr(E->getArg(2));
14946   Value *Val9 = Builder.CreateIntCast(Val8, Int32Ty, false);
14947   Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val9});
14948   llvm::Type *Val11 = llvm::FixedVectorType::get(Int32Ty, 4);
14949   Value *Val12 = Builder.CreateBitCast(Val1, Val11);
14950   Value *Val13 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4, Val7, Val10, Val12});
14951   llvm::Type *Val14 = llvm::FixedVectorType::get(FloatTy, 4);
14952   return Builder.CreateBitCast(Val13, Val14);
14953 }
14954 case ARM::BI__builtin_arm_mve_vdupq_x_n_f32: {
14955   llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14956   Value *Val1 = UndefValue::get(Val0);
14957   Value *Val2 = EmitScalarExpr(E->getArg(1));
14958   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
14959   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val3});
14960   Value *Val5 = EmitScalarExpr(E->getArg(0));
14961   Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
14962   return Builder.CreateSelect(Val4, Val6, Val1);
14963 }
14964 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_f32:
14965 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_f32: {
14966   uint32_t  Param0;
14967   switch (BuiltinID) {
14968   case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_f32:
14969     Param0 = 1;
14970     break;
14971   case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_f32:
14972     Param0 = 0;
14973     break;
14974   }
14975   llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14976   Value *Val1 = UndefValue::get(Val0);
14977   Value *Val2 = llvm::ConstantInt::get(Int32Ty, 1);
14978   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
14979   Value *Val4 = EmitScalarExpr(E->getArg(0));
14980   Value *Val5 = EmitScalarExpr(E->getArg(1));
14981   Value *Val6 = EmitScalarExpr(E->getArg(2));
14982   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
14983   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
14984   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcaddq_predicated, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val1, Val4, Val5, Val8});
14985 }
14986 case ARM::BI__builtin_arm_mve_vcmulq_rot180_x_f32:
14987 case ARM::BI__builtin_arm_mve_vcmulq_rot270_x_f32:
14988 case ARM::BI__builtin_arm_mve_vcmulq_rot90_x_f32:
14989 case ARM::BI__builtin_arm_mve_vcmulq_x_f32: {
14990   uint32_t  Param0;
14991   switch (BuiltinID) {
14992   case ARM::BI__builtin_arm_mve_vcmulq_rot180_x_f32:
14993     Param0 = 2;
14994     break;
14995   case ARM::BI__builtin_arm_mve_vcmulq_rot270_x_f32:
14996     Param0 = 3;
14997     break;
14998   case ARM::BI__builtin_arm_mve_vcmulq_rot90_x_f32:
14999     Param0 = 1;
15000     break;
15001   case ARM::BI__builtin_arm_mve_vcmulq_x_f32:
15002     Param0 = 0;
15003     break;
15004   }
15005   llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
15006   Value *Val1 = UndefValue::get(Val0);
15007   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
15008   Value *Val3 = EmitScalarExpr(E->getArg(0));
15009   Value *Val4 = EmitScalarExpr(E->getArg(1));
15010   Value *Val5 = EmitScalarExpr(E->getArg(2));
15011   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15012   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
15013   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcmulq_predicated, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val1, Val3, Val4, Val7});
15014 }
15015 case ARM::BI__builtin_arm_mve_vcvtq_x_n_f32_s32:
15016 case ARM::BI__builtin_arm_mve_vcvtq_x_n_f32_u32: {
15017   uint32_t  Param0;
15018   switch (BuiltinID) {
15019   case ARM::BI__builtin_arm_mve_vcvtq_x_n_f32_s32:
15020     Param0 = 0;
15021     break;
15022   case ARM::BI__builtin_arm_mve_vcvtq_x_n_f32_u32:
15023     Param0 = 1;
15024     break;
15025   }
15026   llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
15027   Value *Val1 = UndefValue::get(Val0);
15028   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
15029   Value *Val3 = EmitScalarExpr(E->getArg(0));
15030   Value *Val4 = EmitScalarExpr(E->getArg(1));
15031   Value *Val5 = EmitScalarExpr(E->getArg(2));
15032   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15033   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
15034   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fix_predicated, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val1, Val3, Val4, Val7});
15035 }
15036 case ARM::BI__builtin_arm_mve_vuninitializedq_f32:
15037 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_f32: {
15038   llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
15039   return UndefValue::get(Val0);
15040 }
15041 case ARM::BI__builtin_arm_mve_vaddq_x_n_f16:
15042 case ARM::BI__builtin_arm_mve_vmulq_x_n_f16:
15043 case ARM::BI__builtin_arm_mve_vsubq_x_n_f16: {
15044   Intrinsic::ID  Param0;
15045   switch (BuiltinID) {
15046   case ARM::BI__builtin_arm_mve_vaddq_x_n_f16:
15047     Param0 = Intrinsic::arm_mve_add_predicated;
15048     break;
15049   case ARM::BI__builtin_arm_mve_vmulq_x_n_f16:
15050     Param0 = Intrinsic::arm_mve_mul_predicated;
15051     break;
15052   case ARM::BI__builtin_arm_mve_vsubq_x_n_f16:
15053     Param0 = Intrinsic::arm_mve_sub_predicated;
15054     break;
15055   }
15056   llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15057   Value *Val1 = UndefValue::get(Val0);
15058   Value *Val2 = EmitScalarExpr(E->getArg(0));
15059   Value *Val3 = EmitScalarExpr(E->getArg(1));
15060   Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
15061   Value *Val5 = EmitScalarExpr(E->getArg(2));
15062   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15063   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15064   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val4, Val7, Val1});
15065 }
15066 case ARM::BI__builtin_arm_mve_vabsq_x_f16:
15067 case ARM::BI__builtin_arm_mve_vnegq_x_f16:
15068 case ARM::BI__builtin_arm_mve_vrndaq_x_f16:
15069 case ARM::BI__builtin_arm_mve_vrndmq_x_f16:
15070 case ARM::BI__builtin_arm_mve_vrndnq_x_f16:
15071 case ARM::BI__builtin_arm_mve_vrndpq_x_f16:
15072 case ARM::BI__builtin_arm_mve_vrndq_x_f16:
15073 case ARM::BI__builtin_arm_mve_vrndxq_x_f16: {
15074   Intrinsic::ID  Param0;
15075   switch (BuiltinID) {
15076   case ARM::BI__builtin_arm_mve_vabsq_x_f16:
15077     Param0 = Intrinsic::arm_mve_abs_predicated;
15078     break;
15079   case ARM::BI__builtin_arm_mve_vnegq_x_f16:
15080     Param0 = Intrinsic::arm_mve_neg_predicated;
15081     break;
15082   case ARM::BI__builtin_arm_mve_vrndaq_x_f16:
15083     Param0 = Intrinsic::arm_mve_vrinta_predicated;
15084     break;
15085   case ARM::BI__builtin_arm_mve_vrndmq_x_f16:
15086     Param0 = Intrinsic::arm_mve_vrintm_predicated;
15087     break;
15088   case ARM::BI__builtin_arm_mve_vrndnq_x_f16:
15089     Param0 = Intrinsic::arm_mve_vrintn_predicated;
15090     break;
15091   case ARM::BI__builtin_arm_mve_vrndpq_x_f16:
15092     Param0 = Intrinsic::arm_mve_vrintp_predicated;
15093     break;
15094   case ARM::BI__builtin_arm_mve_vrndq_x_f16:
15095     Param0 = Intrinsic::arm_mve_vrintz_predicated;
15096     break;
15097   case ARM::BI__builtin_arm_mve_vrndxq_x_f16:
15098     Param0 = Intrinsic::arm_mve_vrintx_predicated;
15099     break;
15100   }
15101   llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15102   Value *Val1 = UndefValue::get(Val0);
15103   Value *Val2 = EmitScalarExpr(E->getArg(0));
15104   Value *Val3 = EmitScalarExpr(E->getArg(1));
15105   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
15106   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4});
15107   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val5, Val1});
15108 }
15109 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_f16: {
15110   Intrinsic::ID  Param0;
15111   switch (BuiltinID) {
15112   case ARM::BI__builtin_arm_mve_vbrsrq_x_n_f16:
15113     Param0 = Intrinsic::arm_mve_vbrsr_predicated;
15114     break;
15115   }
15116   llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15117   Value *Val1 = UndefValue::get(Val0);
15118   Value *Val2 = EmitScalarExpr(E->getArg(0));
15119   Value *Val3 = EmitScalarExpr(E->getArg(1));
15120   Value *Val4 = EmitScalarExpr(E->getArg(2));
15121   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
15122   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
15123   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1, Val2, Val3, Val6});
15124 }
15125 case ARM::BI__builtin_arm_mve_vaddq_x_f16:
15126 case ARM::BI__builtin_arm_mve_vmulq_x_f16:
15127 case ARM::BI__builtin_arm_mve_vsubq_x_f16: {
15128   Intrinsic::ID  Param0;
15129   switch (BuiltinID) {
15130   case ARM::BI__builtin_arm_mve_vaddq_x_f16:
15131     Param0 = Intrinsic::arm_mve_add_predicated;
15132     break;
15133   case ARM::BI__builtin_arm_mve_vmulq_x_f16:
15134     Param0 = Intrinsic::arm_mve_mul_predicated;
15135     break;
15136   case ARM::BI__builtin_arm_mve_vsubq_x_f16:
15137     Param0 = Intrinsic::arm_mve_sub_predicated;
15138     break;
15139   }
15140   llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15141   Value *Val1 = UndefValue::get(Val0);
15142   Value *Val2 = EmitScalarExpr(E->getArg(0));
15143   Value *Val3 = EmitScalarExpr(E->getArg(1));
15144   Value *Val4 = EmitScalarExpr(E->getArg(2));
15145   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
15146   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
15147   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val6, Val1});
15148 }
15149 case ARM::BI__builtin_arm_mve_vabdq_x_f16:
15150 case ARM::BI__builtin_arm_mve_vmaxnmq_x_f16:
15151 case ARM::BI__builtin_arm_mve_vminnmq_x_f16: {
15152   Intrinsic::ID  Param0;
15153   switch (BuiltinID) {
15154   case ARM::BI__builtin_arm_mve_vabdq_x_f16:
15155     Param0 = Intrinsic::arm_mve_abd_predicated;
15156     break;
15157   case ARM::BI__builtin_arm_mve_vmaxnmq_x_f16:
15158     Param0 = Intrinsic::arm_mve_max_predicated;
15159     break;
15160   case ARM::BI__builtin_arm_mve_vminnmq_x_f16:
15161     Param0 = Intrinsic::arm_mve_min_predicated;
15162     break;
15163   }
15164   llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15165   Value *Val1 = UndefValue::get(Val0);
15166   Value *Val2 = EmitScalarExpr(E->getArg(0));
15167   Value *Val3 = EmitScalarExpr(E->getArg(1));
15168   Value *Val4 = llvm::ConstantInt::get(Int32Ty, 0);
15169   Value *Val5 = EmitScalarExpr(E->getArg(2));
15170   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15171   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15172   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val4, Val7, Val1});
15173 }
15174 case ARM::BI__builtin_arm_mve_vcvtq_x_f16_s16:
15175 case ARM::BI__builtin_arm_mve_vcvtq_x_f16_u16: {
15176   uint32_t  Param0;
15177   switch (BuiltinID) {
15178   case ARM::BI__builtin_arm_mve_vcvtq_x_f16_s16:
15179     Param0 = 0;
15180     break;
15181   case ARM::BI__builtin_arm_mve_vcvtq_x_f16_u16:
15182     Param0 = 1;
15183     break;
15184   }
15185   llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15186   Value *Val1 = UndefValue::get(Val0);
15187   Value *Val2 = EmitScalarExpr(E->getArg(0));
15188   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
15189   Value *Val4 = EmitScalarExpr(E->getArg(1));
15190   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
15191   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
15192   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fp_int_predicated, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val6, Val1});
15193 }
15194 case ARM::BI__builtin_arm_mve_vrev32q_x_f16:
15195 case ARM::BI__builtin_arm_mve_vrev64q_x_f16: {
15196   uint32_t  Param0;
15197   switch (BuiltinID) {
15198   case ARM::BI__builtin_arm_mve_vrev32q_x_f16:
15199     Param0 = 32;
15200     break;
15201   case ARM::BI__builtin_arm_mve_vrev64q_x_f16:
15202     Param0 = 64;
15203     break;
15204   }
15205   llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15206   Value *Val1 = UndefValue::get(Val0);
15207   Value *Val2 = EmitScalarExpr(E->getArg(0));
15208   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
15209   Value *Val4 = EmitScalarExpr(E->getArg(1));
15210   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
15211   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
15212   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vrev_predicated, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val6, Val1});
15213 }
15214 case ARM::BI__builtin_arm_mve_vandq_x_f16:
15215 case ARM::BI__builtin_arm_mve_vbicq_x_f16:
15216 case ARM::BI__builtin_arm_mve_veorq_x_f16:
15217 case ARM::BI__builtin_arm_mve_vornq_x_f16:
15218 case ARM::BI__builtin_arm_mve_vorrq_x_f16: {
15219   Intrinsic::ID  Param0;
15220   switch (BuiltinID) {
15221   case ARM::BI__builtin_arm_mve_vandq_x_f16:
15222     Param0 = Intrinsic::arm_mve_and_predicated;
15223     break;
15224   case ARM::BI__builtin_arm_mve_vbicq_x_f16:
15225     Param0 = Intrinsic::arm_mve_bic_predicated;
15226     break;
15227   case ARM::BI__builtin_arm_mve_veorq_x_f16:
15228     Param0 = Intrinsic::arm_mve_eor_predicated;
15229     break;
15230   case ARM::BI__builtin_arm_mve_vornq_x_f16:
15231     Param0 = Intrinsic::arm_mve_orn_predicated;
15232     break;
15233   case ARM::BI__builtin_arm_mve_vorrq_x_f16:
15234     Param0 = Intrinsic::arm_mve_orr_predicated;
15235     break;
15236   }
15237   llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15238   Value *Val1 = UndefValue::get(Val0);
15239   Value *Val2 = EmitScalarExpr(E->getArg(0));
15240   llvm::Type *Val3 = llvm::FixedVectorType::get(Int16Ty, 8);
15241   Value *Val4 = Builder.CreateBitCast(Val2, Val3);
15242   Value *Val5 = EmitScalarExpr(E->getArg(1));
15243   llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 8);
15244   Value *Val7 = Builder.CreateBitCast(Val5, Val6);
15245   Value *Val8 = EmitScalarExpr(E->getArg(2));
15246   Value *Val9 = Builder.CreateIntCast(Val8, Int32Ty, false);
15247   Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val9});
15248   llvm::Type *Val11 = llvm::FixedVectorType::get(Int16Ty, 8);
15249   Value *Val12 = Builder.CreateBitCast(Val1, Val11);
15250   Value *Val13 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4, Val7, Val10, Val12});
15251   llvm::Type *Val14 = llvm::FixedVectorType::get(HalfTy, 8);
15252   return Builder.CreateBitCast(Val13, Val14);
15253 }
15254 case ARM::BI__builtin_arm_mve_vdupq_x_n_f16: {
15255   llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15256   Value *Val1 = UndefValue::get(Val0);
15257   Value *Val2 = EmitScalarExpr(E->getArg(1));
15258   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
15259   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val3});
15260   Value *Val5 = EmitScalarExpr(E->getArg(0));
15261   Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
15262   return Builder.CreateSelect(Val4, Val6, Val1);
15263 }
15264 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_f16:
15265 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_f16: {
15266   uint32_t  Param0;
15267   switch (BuiltinID) {
15268   case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_f16:
15269     Param0 = 1;
15270     break;
15271   case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_f16:
15272     Param0 = 0;
15273     break;
15274   }
15275   llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15276   Value *Val1 = UndefValue::get(Val0);
15277   Value *Val2 = llvm::ConstantInt::get(Int32Ty, 1);
15278   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
15279   Value *Val4 = EmitScalarExpr(E->getArg(0));
15280   Value *Val5 = EmitScalarExpr(E->getArg(1));
15281   Value *Val6 = EmitScalarExpr(E->getArg(2));
15282   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
15283   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
15284   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcaddq_predicated, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val1, Val4, Val5, Val8});
15285 }
15286 case ARM::BI__builtin_arm_mve_vcmulq_rot180_x_f16:
15287 case ARM::BI__builtin_arm_mve_vcmulq_rot270_x_f16:
15288 case ARM::BI__builtin_arm_mve_vcmulq_rot90_x_f16:
15289 case ARM::BI__builtin_arm_mve_vcmulq_x_f16: {
15290   uint32_t  Param0;
15291   switch (BuiltinID) {
15292   case ARM::BI__builtin_arm_mve_vcmulq_rot180_x_f16:
15293     Param0 = 2;
15294     break;
15295   case ARM::BI__builtin_arm_mve_vcmulq_rot270_x_f16:
15296     Param0 = 3;
15297     break;
15298   case ARM::BI__builtin_arm_mve_vcmulq_rot90_x_f16:
15299     Param0 = 1;
15300     break;
15301   case ARM::BI__builtin_arm_mve_vcmulq_x_f16:
15302     Param0 = 0;
15303     break;
15304   }
15305   llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15306   Value *Val1 = UndefValue::get(Val0);
15307   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
15308   Value *Val3 = EmitScalarExpr(E->getArg(0));
15309   Value *Val4 = EmitScalarExpr(E->getArg(1));
15310   Value *Val5 = EmitScalarExpr(E->getArg(2));
15311   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15312   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15313   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcmulq_predicated, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val1, Val3, Val4, Val7});
15314 }
15315 case ARM::BI__builtin_arm_mve_vcvtq_x_n_f16_s16:
15316 case ARM::BI__builtin_arm_mve_vcvtq_x_n_f16_u16: {
15317   uint32_t  Param0;
15318   switch (BuiltinID) {
15319   case ARM::BI__builtin_arm_mve_vcvtq_x_n_f16_s16:
15320     Param0 = 0;
15321     break;
15322   case ARM::BI__builtin_arm_mve_vcvtq_x_n_f16_u16:
15323     Param0 = 1;
15324     break;
15325   }
15326   llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15327   Value *Val1 = UndefValue::get(Val0);
15328   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
15329   Value *Val3 = EmitScalarExpr(E->getArg(0));
15330   Value *Val4 = EmitScalarExpr(E->getArg(1));
15331   Value *Val5 = EmitScalarExpr(E->getArg(2));
15332   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15333   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15334   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fix_predicated, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val1, Val3, Val4, Val7});
15335 }
15336 case ARM::BI__builtin_arm_mve_vuninitializedq_f16:
15337 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_f16: {
15338   llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15339   return UndefValue::get(Val0);
15340 }
15341 case ARM::BI__builtin_arm_mve_vddupq_x_wb_u16:
15342 case ARM::BI__builtin_arm_mve_vidupq_x_wb_u16: {
15343   Intrinsic::ID  Param0;
15344   switch (BuiltinID) {
15345   case ARM::BI__builtin_arm_mve_vddupq_x_wb_u16:
15346     Param0 = Intrinsic::arm_mve_vddup_predicated;
15347     break;
15348   case ARM::BI__builtin_arm_mve_vidupq_x_wb_u16:
15349     Param0 = Intrinsic::arm_mve_vidup_predicated;
15350     break;
15351   }
15352   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15353   Value *Val1 = UndefValue::get(Val0);
15354   Address Val2 = EmitPointerWithAlignment(E->getArg(0));
15355   Value *Val3 = Builder.CreateLoad(Val2);
15356   Value *Val4 = EmitScalarExpr(E->getArg(1));
15357   Value *Val5 = EmitScalarExpr(E->getArg(2));
15358   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15359   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15360   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1, Val3, Val4, Val7});
15361   Value *Val9 = Builder.CreateExtractValue(Val8, static_cast<unsigned>(1));
15362   Builder.CreateStore(Val9, Val2);
15363   return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
15364 }
15365 case ARM::BI__builtin_arm_mve_vdwdupq_x_wb_u16:
15366 case ARM::BI__builtin_arm_mve_viwdupq_x_wb_u16: {
15367   Intrinsic::ID  Param0;
15368   switch (BuiltinID) {
15369   case ARM::BI__builtin_arm_mve_vdwdupq_x_wb_u16:
15370     Param0 = Intrinsic::arm_mve_vdwdup_predicated;
15371     break;
15372   case ARM::BI__builtin_arm_mve_viwdupq_x_wb_u16:
15373     Param0 = Intrinsic::arm_mve_viwdup_predicated;
15374     break;
15375   }
15376   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15377   Value *Val1 = UndefValue::get(Val0);
15378   Address Val2 = EmitPointerWithAlignment(E->getArg(0));
15379   Value *Val3 = Builder.CreateLoad(Val2);
15380   Value *Val4 = EmitScalarExpr(E->getArg(1));
15381   Value *Val5 = EmitScalarExpr(E->getArg(2));
15382   Value *Val6 = EmitScalarExpr(E->getArg(3));
15383   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
15384   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
15385   Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1, Val3, Val4, Val5, Val8});
15386   Value *Val10 = Builder.CreateExtractValue(Val9, static_cast<unsigned>(1));
15387   Builder.CreateStore(Val10, Val2);
15388   return Builder.CreateExtractValue(Val9, static_cast<unsigned>(0));
15389 }
15390 case ARM::BI__builtin_arm_mve_vaddq_x_n_s16:
15391 case ARM::BI__builtin_arm_mve_vaddq_x_n_u16:
15392 case ARM::BI__builtin_arm_mve_vmulq_x_n_s16:
15393 case ARM::BI__builtin_arm_mve_vmulq_x_n_u16:
15394 case ARM::BI__builtin_arm_mve_vsubq_x_n_s16:
15395 case ARM::BI__builtin_arm_mve_vsubq_x_n_u16: {
15396   Intrinsic::ID  Param0;
15397   switch (BuiltinID) {
15398   case ARM::BI__builtin_arm_mve_vaddq_x_n_s16:
15399     Param0 = Intrinsic::arm_mve_add_predicated;
15400     break;
15401   case ARM::BI__builtin_arm_mve_vaddq_x_n_u16:
15402     Param0 = Intrinsic::arm_mve_add_predicated;
15403     break;
15404   case ARM::BI__builtin_arm_mve_vmulq_x_n_s16:
15405     Param0 = Intrinsic::arm_mve_mul_predicated;
15406     break;
15407   case ARM::BI__builtin_arm_mve_vmulq_x_n_u16:
15408     Param0 = Intrinsic::arm_mve_mul_predicated;
15409     break;
15410   case ARM::BI__builtin_arm_mve_vsubq_x_n_s16:
15411     Param0 = Intrinsic::arm_mve_sub_predicated;
15412     break;
15413   case ARM::BI__builtin_arm_mve_vsubq_x_n_u16:
15414     Param0 = Intrinsic::arm_mve_sub_predicated;
15415     break;
15416   }
15417   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15418   Value *Val1 = UndefValue::get(Val0);
15419   Value *Val2 = EmitScalarExpr(E->getArg(0));
15420   Value *Val3 = EmitScalarExpr(E->getArg(1));
15421   Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
15422   Value *Val5 = EmitScalarExpr(E->getArg(2));
15423   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15424   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15425   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val4, Val7, Val1});
15426 }
15427 case ARM::BI__builtin_arm_mve_vhaddq_x_n_s16:
15428 case ARM::BI__builtin_arm_mve_vhaddq_x_n_u16:
15429 case ARM::BI__builtin_arm_mve_vhsubq_x_n_s16:
15430 case ARM::BI__builtin_arm_mve_vhsubq_x_n_u16: {
15431   uint32_t  Param0;
15432   Intrinsic::ID  Param1;
15433   switch (BuiltinID) {
15434   case ARM::BI__builtin_arm_mve_vhaddq_x_n_s16:
15435     Param0 = 0;
15436     Param1 = Intrinsic::arm_mve_hadd_predicated;
15437     break;
15438   case ARM::BI__builtin_arm_mve_vhaddq_x_n_u16:
15439     Param0 = 1;
15440     Param1 = Intrinsic::arm_mve_hadd_predicated;
15441     break;
15442   case ARM::BI__builtin_arm_mve_vhsubq_x_n_s16:
15443     Param0 = 0;
15444     Param1 = Intrinsic::arm_mve_hsub_predicated;
15445     break;
15446   case ARM::BI__builtin_arm_mve_vhsubq_x_n_u16:
15447     Param0 = 1;
15448     Param1 = Intrinsic::arm_mve_hsub_predicated;
15449     break;
15450   }
15451   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15452   Value *Val1 = UndefValue::get(Val0);
15453   Value *Val2 = EmitScalarExpr(E->getArg(0));
15454   Value *Val3 = EmitScalarExpr(E->getArg(1));
15455   Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
15456   Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
15457   Value *Val6 = EmitScalarExpr(E->getArg(2));
15458   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
15459   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
15460   return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val4, Val5, Val8, Val1});
15461 }
15462 case ARM::BI__builtin_arm_mve_vabsq_x_s16:
15463 case ARM::BI__builtin_arm_mve_vclsq_x_s16:
15464 case ARM::BI__builtin_arm_mve_vclzq_x_s16:
15465 case ARM::BI__builtin_arm_mve_vclzq_x_u16:
15466 case ARM::BI__builtin_arm_mve_vmvnq_x_s16:
15467 case ARM::BI__builtin_arm_mve_vmvnq_x_u16:
15468 case ARM::BI__builtin_arm_mve_vnegq_x_s16: {
15469   Intrinsic::ID  Param0;
15470   switch (BuiltinID) {
15471   case ARM::BI__builtin_arm_mve_vabsq_x_s16:
15472     Param0 = Intrinsic::arm_mve_abs_predicated;
15473     break;
15474   case ARM::BI__builtin_arm_mve_vclsq_x_s16:
15475     Param0 = Intrinsic::arm_mve_cls_predicated;
15476     break;
15477   case ARM::BI__builtin_arm_mve_vclzq_x_s16:
15478     Param0 = Intrinsic::arm_mve_clz_predicated;
15479     break;
15480   case ARM::BI__builtin_arm_mve_vclzq_x_u16:
15481     Param0 = Intrinsic::arm_mve_clz_predicated;
15482     break;
15483   case ARM::BI__builtin_arm_mve_vmvnq_x_s16:
15484     Param0 = Intrinsic::arm_mve_mvn_predicated;
15485     break;
15486   case ARM::BI__builtin_arm_mve_vmvnq_x_u16:
15487     Param0 = Intrinsic::arm_mve_mvn_predicated;
15488     break;
15489   case ARM::BI__builtin_arm_mve_vnegq_x_s16:
15490     Param0 = Intrinsic::arm_mve_neg_predicated;
15491     break;
15492   }
15493   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15494   Value *Val1 = UndefValue::get(Val0);
15495   Value *Val2 = EmitScalarExpr(E->getArg(0));
15496   Value *Val3 = EmitScalarExpr(E->getArg(1));
15497   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
15498   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4});
15499   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val5, Val1});
15500 }
15501 case ARM::BI__builtin_arm_mve_vddupq_x_n_u16:
15502 case ARM::BI__builtin_arm_mve_vidupq_x_n_u16: {
15503   Intrinsic::ID  Param0;
15504   switch (BuiltinID) {
15505   case ARM::BI__builtin_arm_mve_vddupq_x_n_u16:
15506     Param0 = Intrinsic::arm_mve_vddup_predicated;
15507     break;
15508   case ARM::BI__builtin_arm_mve_vidupq_x_n_u16:
15509     Param0 = Intrinsic::arm_mve_vidup_predicated;
15510     break;
15511   }
15512   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15513   Value *Val1 = UndefValue::get(Val0);
15514   Value *Val2 = EmitScalarExpr(E->getArg(0));
15515   Value *Val3 = EmitScalarExpr(E->getArg(1));
15516   Value *Val4 = EmitScalarExpr(E->getArg(2));
15517   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
15518   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
15519   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1, Val2, Val3, Val6});
15520   return Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
15521 }
15522 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_s16:
15523 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_u16: {
15524   Intrinsic::ID  Param0;
15525   switch (BuiltinID) {
15526   case ARM::BI__builtin_arm_mve_vbrsrq_x_n_s16:
15527     Param0 = Intrinsic::arm_mve_vbrsr_predicated;
15528     break;
15529   case ARM::BI__builtin_arm_mve_vbrsrq_x_n_u16:
15530     Param0 = Intrinsic::arm_mve_vbrsr_predicated;
15531     break;
15532   }
15533   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15534   Value *Val1 = UndefValue::get(Val0);
15535   Value *Val2 = EmitScalarExpr(E->getArg(0));
15536   Value *Val3 = EmitScalarExpr(E->getArg(1));
15537   Value *Val4 = EmitScalarExpr(E->getArg(2));
15538   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
15539   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
15540   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1, Val2, Val3, Val6});
15541 }
15542 case ARM::BI__builtin_arm_mve_vaddq_x_s16:
15543 case ARM::BI__builtin_arm_mve_vaddq_x_u16:
15544 case ARM::BI__builtin_arm_mve_vmulq_x_s16:
15545 case ARM::BI__builtin_arm_mve_vmulq_x_u16:
15546 case ARM::BI__builtin_arm_mve_vshlq_x_n_s16:
15547 case ARM::BI__builtin_arm_mve_vshlq_x_n_u16:
15548 case ARM::BI__builtin_arm_mve_vsubq_x_s16:
15549 case ARM::BI__builtin_arm_mve_vsubq_x_u16: {
15550   Intrinsic::ID  Param0;
15551   switch (BuiltinID) {
15552   case ARM::BI__builtin_arm_mve_vaddq_x_s16:
15553     Param0 = Intrinsic::arm_mve_add_predicated;
15554     break;
15555   case ARM::BI__builtin_arm_mve_vaddq_x_u16:
15556     Param0 = Intrinsic::arm_mve_add_predicated;
15557     break;
15558   case ARM::BI__builtin_arm_mve_vmulq_x_s16:
15559     Param0 = Intrinsic::arm_mve_mul_predicated;
15560     break;
15561   case ARM::BI__builtin_arm_mve_vmulq_x_u16:
15562     Param0 = Intrinsic::arm_mve_mul_predicated;
15563     break;
15564   case ARM::BI__builtin_arm_mve_vshlq_x_n_s16:
15565     Param0 = Intrinsic::arm_mve_shl_imm_predicated;
15566     break;
15567   case ARM::BI__builtin_arm_mve_vshlq_x_n_u16:
15568     Param0 = Intrinsic::arm_mve_shl_imm_predicated;
15569     break;
15570   case ARM::BI__builtin_arm_mve_vsubq_x_s16:
15571     Param0 = Intrinsic::arm_mve_sub_predicated;
15572     break;
15573   case ARM::BI__builtin_arm_mve_vsubq_x_u16:
15574     Param0 = Intrinsic::arm_mve_sub_predicated;
15575     break;
15576   }
15577   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15578   Value *Val1 = UndefValue::get(Val0);
15579   Value *Val2 = EmitScalarExpr(E->getArg(0));
15580   Value *Val3 = EmitScalarExpr(E->getArg(1));
15581   Value *Val4 = EmitScalarExpr(E->getArg(2));
15582   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
15583   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
15584   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val6, Val1});
15585 }
15586 case ARM::BI__builtin_arm_mve_vdwdupq_x_n_u16:
15587 case ARM::BI__builtin_arm_mve_viwdupq_x_n_u16: {
15588   Intrinsic::ID  Param0;
15589   switch (BuiltinID) {
15590   case ARM::BI__builtin_arm_mve_vdwdupq_x_n_u16:
15591     Param0 = Intrinsic::arm_mve_vdwdup_predicated;
15592     break;
15593   case ARM::BI__builtin_arm_mve_viwdupq_x_n_u16:
15594     Param0 = Intrinsic::arm_mve_viwdup_predicated;
15595     break;
15596   }
15597   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15598   Value *Val1 = UndefValue::get(Val0);
15599   Value *Val2 = EmitScalarExpr(E->getArg(0));
15600   Value *Val3 = EmitScalarExpr(E->getArg(1));
15601   Value *Val4 = EmitScalarExpr(E->getArg(2));
15602   Value *Val5 = EmitScalarExpr(E->getArg(3));
15603   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15604   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15605   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1, Val2, Val3, Val4, Val7});
15606   return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
15607 }
15608 case ARM::BI__builtin_arm_mve_vrshlq_x_s16:
15609 case ARM::BI__builtin_arm_mve_vrshlq_x_u16:
15610 case ARM::BI__builtin_arm_mve_vshlq_x_s16:
15611 case ARM::BI__builtin_arm_mve_vshlq_x_u16: {
15612   uint32_t  Param0;
15613   uint32_t  Param1;
15614   switch (BuiltinID) {
15615   case ARM::BI__builtin_arm_mve_vrshlq_x_s16:
15616     Param0 = 1;
15617     Param1 = 0;
15618     break;
15619   case ARM::BI__builtin_arm_mve_vrshlq_x_u16:
15620     Param0 = 1;
15621     Param1 = 1;
15622     break;
15623   case ARM::BI__builtin_arm_mve_vshlq_x_s16:
15624     Param0 = 0;
15625     Param1 = 0;
15626     break;
15627   case ARM::BI__builtin_arm_mve_vshlq_x_u16:
15628     Param0 = 0;
15629     Param1 = 1;
15630     break;
15631   }
15632   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15633   Value *Val1 = UndefValue::get(Val0);
15634   Value *Val2 = EmitScalarExpr(E->getArg(0));
15635   Value *Val3 = EmitScalarExpr(E->getArg(1));
15636   Value *Val4 = llvm::ConstantInt::get(Int32Ty, 0);
15637   Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
15638   Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param1);
15639   Value *Val7 = EmitScalarExpr(E->getArg(2));
15640   Value *Val8 = Builder.CreateIntCast(Val7, Int32Ty, false);
15641   Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val8});
15642   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshl_vector_predicated, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val4, Val5, Val6, Val9, Val1});
15643 }
15644 case ARM::BI__builtin_arm_mve_vmullbq_poly_x_p8:
15645 case ARM::BI__builtin_arm_mve_vmulltq_poly_x_p8: {
15646   uint32_t  Param0;
15647   switch (BuiltinID) {
15648   case ARM::BI__builtin_arm_mve_vmullbq_poly_x_p8:
15649     Param0 = 0;
15650     break;
15651   case ARM::BI__builtin_arm_mve_vmulltq_poly_x_p8:
15652     Param0 = 1;
15653     break;
15654   }
15655   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15656   Value *Val1 = UndefValue::get(Val0);
15657   Value *Val2 = EmitScalarExpr(E->getArg(0));
15658   Value *Val3 = EmitScalarExpr(E->getArg(1));
15659   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
15660   Value *Val5 = EmitScalarExpr(E->getArg(2));
15661   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15662   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15663   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_mull_poly_predicated, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val4, Val7, Val1});
15664 }
15665 case ARM::BI__builtin_arm_mve_vabdq_x_s16:
15666 case ARM::BI__builtin_arm_mve_vabdq_x_u16:
15667 case ARM::BI__builtin_arm_mve_vhaddq_x_s16:
15668 case ARM::BI__builtin_arm_mve_vhaddq_x_u16:
15669 case ARM::BI__builtin_arm_mve_vhsubq_x_s16:
15670 case ARM::BI__builtin_arm_mve_vhsubq_x_u16:
15671 case ARM::BI__builtin_arm_mve_vmaxq_x_s16:
15672 case ARM::BI__builtin_arm_mve_vmaxq_x_u16:
15673 case ARM::BI__builtin_arm_mve_vminq_x_s16:
15674 case ARM::BI__builtin_arm_mve_vminq_x_u16:
15675 case ARM::BI__builtin_arm_mve_vmulhq_x_s16:
15676 case ARM::BI__builtin_arm_mve_vmulhq_x_u16:
15677 case ARM::BI__builtin_arm_mve_vrhaddq_x_s16:
15678 case ARM::BI__builtin_arm_mve_vrhaddq_x_u16:
15679 case ARM::BI__builtin_arm_mve_vrmulhq_x_s16:
15680 case ARM::BI__builtin_arm_mve_vrmulhq_x_u16:
15681 case ARM::BI__builtin_arm_mve_vrshrq_x_n_s16:
15682 case ARM::BI__builtin_arm_mve_vrshrq_x_n_u16:
15683 case ARM::BI__builtin_arm_mve_vshrq_x_n_s16:
15684 case ARM::BI__builtin_arm_mve_vshrq_x_n_u16: {
15685   uint32_t  Param0;
15686   Intrinsic::ID  Param1;
15687   switch (BuiltinID) {
15688   case ARM::BI__builtin_arm_mve_vabdq_x_s16:
15689     Param0 = 0;
15690     Param1 = Intrinsic::arm_mve_abd_predicated;
15691     break;
15692   case ARM::BI__builtin_arm_mve_vabdq_x_u16:
15693     Param0 = 1;
15694     Param1 = Intrinsic::arm_mve_abd_predicated;
15695     break;
15696   case ARM::BI__builtin_arm_mve_vhaddq_x_s16:
15697     Param0 = 0;
15698     Param1 = Intrinsic::arm_mve_hadd_predicated;
15699     break;
15700   case ARM::BI__builtin_arm_mve_vhaddq_x_u16:
15701     Param0 = 1;
15702     Param1 = Intrinsic::arm_mve_hadd_predicated;
15703     break;
15704   case ARM::BI__builtin_arm_mve_vhsubq_x_s16:
15705     Param0 = 0;
15706     Param1 = Intrinsic::arm_mve_hsub_predicated;
15707     break;
15708   case ARM::BI__builtin_arm_mve_vhsubq_x_u16:
15709     Param0 = 1;
15710     Param1 = Intrinsic::arm_mve_hsub_predicated;
15711     break;
15712   case ARM::BI__builtin_arm_mve_vmaxq_x_s16:
15713     Param0 = 0;
15714     Param1 = Intrinsic::arm_mve_max_predicated;
15715     break;
15716   case ARM::BI__builtin_arm_mve_vmaxq_x_u16:
15717     Param0 = 1;
15718     Param1 = Intrinsic::arm_mve_max_predicated;
15719     break;
15720   case ARM::BI__builtin_arm_mve_vminq_x_s16:
15721     Param0 = 0;
15722     Param1 = Intrinsic::arm_mve_min_predicated;
15723     break;
15724   case ARM::BI__builtin_arm_mve_vminq_x_u16:
15725     Param0 = 1;
15726     Param1 = Intrinsic::arm_mve_min_predicated;
15727     break;
15728   case ARM::BI__builtin_arm_mve_vmulhq_x_s16:
15729     Param0 = 0;
15730     Param1 = Intrinsic::arm_mve_mulh_predicated;
15731     break;
15732   case ARM::BI__builtin_arm_mve_vmulhq_x_u16:
15733     Param0 = 1;
15734     Param1 = Intrinsic::arm_mve_mulh_predicated;
15735     break;
15736   case ARM::BI__builtin_arm_mve_vrhaddq_x_s16:
15737     Param0 = 0;
15738     Param1 = Intrinsic::arm_mve_rhadd_predicated;
15739     break;
15740   case ARM::BI__builtin_arm_mve_vrhaddq_x_u16:
15741     Param0 = 1;
15742     Param1 = Intrinsic::arm_mve_rhadd_predicated;
15743     break;
15744   case ARM::BI__builtin_arm_mve_vrmulhq_x_s16:
15745     Param0 = 0;
15746     Param1 = Intrinsic::arm_mve_rmulh_predicated;
15747     break;
15748   case ARM::BI__builtin_arm_mve_vrmulhq_x_u16:
15749     Param0 = 1;
15750     Param1 = Intrinsic::arm_mve_rmulh_predicated;
15751     break;
15752   case ARM::BI__builtin_arm_mve_vrshrq_x_n_s16:
15753     Param0 = 0;
15754     Param1 = Intrinsic::arm_mve_vrshr_imm_predicated;
15755     break;
15756   case ARM::BI__builtin_arm_mve_vrshrq_x_n_u16:
15757     Param0 = 1;
15758     Param1 = Intrinsic::arm_mve_vrshr_imm_predicated;
15759     break;
15760   case ARM::BI__builtin_arm_mve_vshrq_x_n_s16:
15761     Param0 = 0;
15762     Param1 = Intrinsic::arm_mve_shr_imm_predicated;
15763     break;
15764   case ARM::BI__builtin_arm_mve_vshrq_x_n_u16:
15765     Param0 = 1;
15766     Param1 = Intrinsic::arm_mve_shr_imm_predicated;
15767     break;
15768   }
15769   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15770   Value *Val1 = UndefValue::get(Val0);
15771   Value *Val2 = EmitScalarExpr(E->getArg(0));
15772   Value *Val3 = EmitScalarExpr(E->getArg(1));
15773   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
15774   Value *Val5 = EmitScalarExpr(E->getArg(2));
15775   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15776   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15777   return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val4, Val7, Val1});
15778 }
15779 case ARM::BI__builtin_arm_mve_vmullbq_int_x_s8:
15780 case ARM::BI__builtin_arm_mve_vmullbq_int_x_u8:
15781 case ARM::BI__builtin_arm_mve_vmulltq_int_x_s8:
15782 case ARM::BI__builtin_arm_mve_vmulltq_int_x_u8:
15783 case ARM::BI__builtin_arm_mve_vshllbq_x_n_s8:
15784 case ARM::BI__builtin_arm_mve_vshllbq_x_n_u8:
15785 case ARM::BI__builtin_arm_mve_vshlltq_x_n_s8:
15786 case ARM::BI__builtin_arm_mve_vshlltq_x_n_u8: {
15787   uint32_t  Param0;
15788   uint32_t  Param1;
15789   Intrinsic::ID  Param2;
15790   switch (BuiltinID) {
15791   case ARM::BI__builtin_arm_mve_vmullbq_int_x_s8:
15792     Param0 = 0;
15793     Param1 = 0;
15794     Param2 = Intrinsic::arm_mve_mull_int_predicated;
15795     break;
15796   case ARM::BI__builtin_arm_mve_vmullbq_int_x_u8:
15797     Param0 = 1;
15798     Param1 = 0;
15799     Param2 = Intrinsic::arm_mve_mull_int_predicated;
15800     break;
15801   case ARM::BI__builtin_arm_mve_vmulltq_int_x_s8:
15802     Param0 = 0;
15803     Param1 = 1;
15804     Param2 = Intrinsic::arm_mve_mull_int_predicated;
15805     break;
15806   case ARM::BI__builtin_arm_mve_vmulltq_int_x_u8:
15807     Param0 = 1;
15808     Param1 = 1;
15809     Param2 = Intrinsic::arm_mve_mull_int_predicated;
15810     break;
15811   case ARM::BI__builtin_arm_mve_vshllbq_x_n_s8:
15812     Param0 = 0;
15813     Param1 = 0;
15814     Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
15815     break;
15816   case ARM::BI__builtin_arm_mve_vshllbq_x_n_u8:
15817     Param0 = 1;
15818     Param1 = 0;
15819     Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
15820     break;
15821   case ARM::BI__builtin_arm_mve_vshlltq_x_n_s8:
15822     Param0 = 0;
15823     Param1 = 1;
15824     Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
15825     break;
15826   case ARM::BI__builtin_arm_mve_vshlltq_x_n_u8:
15827     Param0 = 1;
15828     Param1 = 1;
15829     Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
15830     break;
15831   }
15832   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15833   Value *Val1 = UndefValue::get(Val0);
15834   Value *Val2 = EmitScalarExpr(E->getArg(0));
15835   Value *Val3 = EmitScalarExpr(E->getArg(1));
15836   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
15837   Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param1);
15838   Value *Val6 = EmitScalarExpr(E->getArg(2));
15839   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
15840   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
15841   return Builder.CreateCall(CGM.getIntrinsic(Param2, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val4, Val5, Val8, Val1});
15842 }
15843 case ARM::BI__builtin_arm_mve_vcvtq_x_s16_f16:
15844 case ARM::BI__builtin_arm_mve_vcvtq_x_u16_f16: {
15845   uint32_t  Param0;
15846   switch (BuiltinID) {
15847   case ARM::BI__builtin_arm_mve_vcvtq_x_s16_f16:
15848     Param0 = 0;
15849     break;
15850   case ARM::BI__builtin_arm_mve_vcvtq_x_u16_f16:
15851     Param0 = 1;
15852     break;
15853   }
15854   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15855   Value *Val1 = UndefValue::get(Val0);
15856   Value *Val2 = EmitScalarExpr(E->getArg(0));
15857   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
15858   Value *Val4 = EmitScalarExpr(E->getArg(1));
15859   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
15860   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
15861   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fp_int_predicated, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val6, Val1});
15862 }
15863 case ARM::BI__builtin_arm_mve_vrev32q_x_s16:
15864 case ARM::BI__builtin_arm_mve_vrev32q_x_u16:
15865 case ARM::BI__builtin_arm_mve_vrev64q_x_s16:
15866 case ARM::BI__builtin_arm_mve_vrev64q_x_u16: {
15867   uint32_t  Param0;
15868   switch (BuiltinID) {
15869   case ARM::BI__builtin_arm_mve_vrev32q_x_s16:
15870     Param0 = 32;
15871     break;
15872   case ARM::BI__builtin_arm_mve_vrev32q_x_u16:
15873     Param0 = 32;
15874     break;
15875   case ARM::BI__builtin_arm_mve_vrev64q_x_s16:
15876     Param0 = 64;
15877     break;
15878   case ARM::BI__builtin_arm_mve_vrev64q_x_u16:
15879     Param0 = 64;
15880     break;
15881   }
15882   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15883   Value *Val1 = UndefValue::get(Val0);
15884   Value *Val2 = EmitScalarExpr(E->getArg(0));
15885   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
15886   Value *Val4 = EmitScalarExpr(E->getArg(1));
15887   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
15888   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
15889   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vrev_predicated, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val6, Val1});
15890 }
15891 case ARM::BI__builtin_arm_mve_vmovlbq_x_s8:
15892 case ARM::BI__builtin_arm_mve_vmovlbq_x_u8:
15893 case ARM::BI__builtin_arm_mve_vmovltq_x_s8:
15894 case ARM::BI__builtin_arm_mve_vmovltq_x_u8: {
15895   uint32_t  Param0;
15896   uint32_t  Param1;
15897   switch (BuiltinID) {
15898   case ARM::BI__builtin_arm_mve_vmovlbq_x_s8:
15899     Param0 = 0;
15900     Param1 = 0;
15901     break;
15902   case ARM::BI__builtin_arm_mve_vmovlbq_x_u8:
15903     Param0 = 1;
15904     Param1 = 0;
15905     break;
15906   case ARM::BI__builtin_arm_mve_vmovltq_x_s8:
15907     Param0 = 0;
15908     Param1 = 1;
15909     break;
15910   case ARM::BI__builtin_arm_mve_vmovltq_x_u8:
15911     Param0 = 1;
15912     Param1 = 1;
15913     break;
15914   }
15915   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15916   Value *Val1 = UndefValue::get(Val0);
15917   Value *Val2 = EmitScalarExpr(E->getArg(0));
15918   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
15919   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
15920   Value *Val5 = EmitScalarExpr(E->getArg(1));
15921   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15922   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15923   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmovl_predicated, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val4, Val7, Val1});
15924 }
15925 case ARM::BI__builtin_arm_mve_vandq_x_s16:
15926 case ARM::BI__builtin_arm_mve_vandq_x_u16:
15927 case ARM::BI__builtin_arm_mve_vbicq_x_s16:
15928 case ARM::BI__builtin_arm_mve_vbicq_x_u16:
15929 case ARM::BI__builtin_arm_mve_veorq_x_s16:
15930 case ARM::BI__builtin_arm_mve_veorq_x_u16:
15931 case ARM::BI__builtin_arm_mve_vornq_x_s16:
15932 case ARM::BI__builtin_arm_mve_vornq_x_u16:
15933 case ARM::BI__builtin_arm_mve_vorrq_x_s16:
15934 case ARM::BI__builtin_arm_mve_vorrq_x_u16: {
15935   Intrinsic::ID  Param0;
15936   switch (BuiltinID) {
15937   case ARM::BI__builtin_arm_mve_vandq_x_s16:
15938     Param0 = Intrinsic::arm_mve_and_predicated;
15939     break;
15940   case ARM::BI__builtin_arm_mve_vandq_x_u16:
15941     Param0 = Intrinsic::arm_mve_and_predicated;
15942     break;
15943   case ARM::BI__builtin_arm_mve_vbicq_x_s16:
15944     Param0 = Intrinsic::arm_mve_bic_predicated;
15945     break;
15946   case ARM::BI__builtin_arm_mve_vbicq_x_u16:
15947     Param0 = Intrinsic::arm_mve_bic_predicated;
15948     break;
15949   case ARM::BI__builtin_arm_mve_veorq_x_s16:
15950     Param0 = Intrinsic::arm_mve_eor_predicated;
15951     break;
15952   case ARM::BI__builtin_arm_mve_veorq_x_u16:
15953     Param0 = Intrinsic::arm_mve_eor_predicated;
15954     break;
15955   case ARM::BI__builtin_arm_mve_vornq_x_s16:
15956     Param0 = Intrinsic::arm_mve_orn_predicated;
15957     break;
15958   case ARM::BI__builtin_arm_mve_vornq_x_u16:
15959     Param0 = Intrinsic::arm_mve_orn_predicated;
15960     break;
15961   case ARM::BI__builtin_arm_mve_vorrq_x_s16:
15962     Param0 = Intrinsic::arm_mve_orr_predicated;
15963     break;
15964   case ARM::BI__builtin_arm_mve_vorrq_x_u16:
15965     Param0 = Intrinsic::arm_mve_orr_predicated;
15966     break;
15967   }
15968   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15969   Value *Val1 = UndefValue::get(Val0);
15970   Value *Val2 = EmitScalarExpr(E->getArg(0));
15971   llvm::Type *Val3 = llvm::FixedVectorType::get(Int16Ty, 8);
15972   Value *Val4 = Builder.CreateBitCast(Val2, Val3);
15973   Value *Val5 = EmitScalarExpr(E->getArg(1));
15974   llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 8);
15975   Value *Val7 = Builder.CreateBitCast(Val5, Val6);
15976   Value *Val8 = EmitScalarExpr(E->getArg(2));
15977   Value *Val9 = Builder.CreateIntCast(Val8, Int32Ty, false);
15978   Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val9});
15979   llvm::Type *Val11 = llvm::FixedVectorType::get(Int16Ty, 8);
15980   Value *Val12 = Builder.CreateBitCast(Val1, Val11);
15981   Value *Val13 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4, Val7, Val10, Val12});
15982   llvm::Type *Val14 = llvm::FixedVectorType::get(Int16Ty, 8);
15983   return Builder.CreateBitCast(Val13, Val14);
15984 }
15985 case ARM::BI__builtin_arm_mve_vdupq_x_n_s16:
15986 case ARM::BI__builtin_arm_mve_vdupq_x_n_u16: {
15987   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15988   Value *Val1 = UndefValue::get(Val0);
15989   Value *Val2 = EmitScalarExpr(E->getArg(1));
15990   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
15991   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val3});
15992   Value *Val5 = EmitScalarExpr(E->getArg(0));
15993   Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
15994   return Builder.CreateSelect(Val4, Val6, Val1);
15995 }
15996 case ARM::BI__builtin_arm_mve_vmvnq_x_n_s16:
15997 case ARM::BI__builtin_arm_mve_vmvnq_x_n_u16: {
15998   bool  Param0;
15999   switch (BuiltinID) {
16000   case ARM::BI__builtin_arm_mve_vmvnq_x_n_s16:
16001     Param0 = true;
16002     break;
16003   case ARM::BI__builtin_arm_mve_vmvnq_x_n_u16:
16004     Param0 = false;
16005     break;
16006   }
16007   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
16008   Value *Val1 = UndefValue::get(Val0);
16009   Value *Val2 = EmitScalarExpr(E->getArg(1));
16010   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
16011   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val3});
16012   Value *Val5 = EmitScalarExpr(E->getArg(0));
16013   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
16014   Value *Val7 = Builder.CreateIntCast(Val6, Int16Ty, Param0);
16015   Value *Val8 = ARMMVEVectorSplat(Builder, Val7);
16016   Value *Val9 = Builder.CreateNot(Val8);
16017   return Builder.CreateSelect(Val4, Val9, Val1);
16018 }
16019 case ARM::BI__builtin_arm_mve_vcvtaq_x_s16_f16:
16020 case ARM::BI__builtin_arm_mve_vcvtaq_x_u16_f16:
16021 case ARM::BI__builtin_arm_mve_vcvtmq_x_s16_f16:
16022 case ARM::BI__builtin_arm_mve_vcvtmq_x_u16_f16:
16023 case ARM::BI__builtin_arm_mve_vcvtnq_x_s16_f16:
16024 case ARM::BI__builtin_arm_mve_vcvtnq_x_u16_f16:
16025 case ARM::BI__builtin_arm_mve_vcvtpq_x_s16_f16:
16026 case ARM::BI__builtin_arm_mve_vcvtpq_x_u16_f16: {
16027   uint32_t  Param0;
16028   Intrinsic::ID  Param1;
16029   switch (BuiltinID) {
16030   case ARM::BI__builtin_arm_mve_vcvtaq_x_s16_f16:
16031     Param0 = 0;
16032     Param1 = Intrinsic::arm_mve_vcvta_predicated;
16033     break;
16034   case ARM::BI__builtin_arm_mve_vcvtaq_x_u16_f16:
16035     Param0 = 1;
16036     Param1 = Intrinsic::arm_mve_vcvta_predicated;
16037     break;
16038   case ARM::BI__builtin_arm_mve_vcvtmq_x_s16_f16:
16039     Param0 = 0;
16040     Param1 = Intrinsic::arm_mve_vcvtm_predicated;
16041     break;
16042   case ARM::BI__builtin_arm_mve_vcvtmq_x_u16_f16:
16043     Param0 = 1;
16044     Param1 = Intrinsic::arm_mve_vcvtm_predicated;
16045     break;
16046   case ARM::BI__builtin_arm_mve_vcvtnq_x_s16_f16:
16047     Param0 = 0;
16048     Param1 = Intrinsic::arm_mve_vcvtn_predicated;
16049     break;
16050   case ARM::BI__builtin_arm_mve_vcvtnq_x_u16_f16:
16051     Param0 = 1;
16052     Param1 = Intrinsic::arm_mve_vcvtn_predicated;
16053     break;
16054   case ARM::BI__builtin_arm_mve_vcvtpq_x_s16_f16:
16055     Param0 = 0;
16056     Param1 = Intrinsic::arm_mve_vcvtp_predicated;
16057     break;
16058   case ARM::BI__builtin_arm_mve_vcvtpq_x_u16_f16:
16059     Param0 = 1;
16060     Param1 = Intrinsic::arm_mve_vcvtp_predicated;
16061     break;
16062   }
16063   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
16064   Value *Val1 = UndefValue::get(Val0);
16065   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
16066   Value *Val3 = EmitScalarExpr(E->getArg(0));
16067   Value *Val4 = EmitScalarExpr(E->getArg(1));
16068   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
16069   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
16070   return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val1, Val3, Val6});
16071 }
16072 case ARM::BI__builtin_arm_mve_vcvtq_x_n_s16_f16:
16073 case ARM::BI__builtin_arm_mve_vcvtq_x_n_u16_f16: {
16074   uint32_t  Param0;
16075   switch (BuiltinID) {
16076   case ARM::BI__builtin_arm_mve_vcvtq_x_n_s16_f16:
16077     Param0 = 0;
16078     break;
16079   case ARM::BI__builtin_arm_mve_vcvtq_x_n_u16_f16:
16080     Param0 = 1;
16081     break;
16082   }
16083   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
16084   Value *Val1 = UndefValue::get(Val0);
16085   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
16086   Value *Val3 = EmitScalarExpr(E->getArg(0));
16087   Value *Val4 = EmitScalarExpr(E->getArg(1));
16088   Value *Val5 = EmitScalarExpr(E->getArg(2));
16089   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
16090   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
16091   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fix_predicated, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val1, Val3, Val4, Val7});
16092 }
16093 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_s16:
16094 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_u16:
16095 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_s16:
16096 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_u16:
16097 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_x_s16:
16098 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_x_s16: {
16099   uint32_t  Param0;
16100   uint32_t  Param1;
16101   switch (BuiltinID) {
16102   case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_s16:
16103     Param0 = 1;
16104     Param1 = 1;
16105     break;
16106   case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_u16:
16107     Param0 = 1;
16108     Param1 = 1;
16109     break;
16110   case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_s16:
16111     Param0 = 1;
16112     Param1 = 0;
16113     break;
16114   case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_u16:
16115     Param0 = 1;
16116     Param1 = 0;
16117     break;
16118   case ARM::BI__builtin_arm_mve_vhcaddq_rot270_x_s16:
16119     Param0 = 0;
16120     Param1 = 1;
16121     break;
16122   case ARM::BI__builtin_arm_mve_vhcaddq_rot90_x_s16:
16123     Param0 = 0;
16124     Param1 = 0;
16125     break;
16126   }
16127   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
16128   Value *Val1 = UndefValue::get(Val0);
16129   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
16130   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
16131   Value *Val4 = EmitScalarExpr(E->getArg(0));
16132   Value *Val5 = EmitScalarExpr(E->getArg(1));
16133   Value *Val6 = EmitScalarExpr(E->getArg(2));
16134   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
16135   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
16136   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcaddq_predicated, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val1, Val4, Val5, Val8});
16137 }
16138 case ARM::BI__builtin_arm_mve_vnegq_s16: {
16139   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
16140   Value *Val1 = llvm::Constant::getNullValue(Val0);
16141   Value *Val2 = EmitScalarExpr(E->getArg(0));
16142   return Builder.CreateSub(Val1, Val2);
16143 }
16144 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_s16:
16145 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_u16:
16146 case ARM::BI__builtin_arm_mve_vuninitializedq_s16:
16147 case ARM::BI__builtin_arm_mve_vuninitializedq_u16: {
16148   llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
16149   return UndefValue::get(Val0);
16150 }
16151 case ARM::BI__builtin_arm_mve_vddupq_x_wb_u32:
16152 case ARM::BI__builtin_arm_mve_vidupq_x_wb_u32: {
16153   Intrinsic::ID  Param0;
16154   switch (BuiltinID) {
16155   case ARM::BI__builtin_arm_mve_vddupq_x_wb_u32:
16156     Param0 = Intrinsic::arm_mve_vddup_predicated;
16157     break;
16158   case ARM::BI__builtin_arm_mve_vidupq_x_wb_u32:
16159     Param0 = Intrinsic::arm_mve_vidup_predicated;
16160     break;
16161   }
16162   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16163   Value *Val1 = UndefValue::get(Val0);
16164   Address Val2 = EmitPointerWithAlignment(E->getArg(0));
16165   Value *Val3 = Builder.CreateLoad(Val2);
16166   Value *Val4 = EmitScalarExpr(E->getArg(1));
16167   Value *Val5 = EmitScalarExpr(E->getArg(2));
16168   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
16169   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
16170   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1, Val3, Val4, Val7});
16171   Value *Val9 = Builder.CreateExtractValue(Val8, static_cast<unsigned>(1));
16172   Builder.CreateStore(Val9, Val2);
16173   return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
16174 }
16175 case ARM::BI__builtin_arm_mve_vdwdupq_x_wb_u32:
16176 case ARM::BI__builtin_arm_mve_viwdupq_x_wb_u32: {
16177   Intrinsic::ID  Param0;
16178   switch (BuiltinID) {
16179   case ARM::BI__builtin_arm_mve_vdwdupq_x_wb_u32:
16180     Param0 = Intrinsic::arm_mve_vdwdup_predicated;
16181     break;
16182   case ARM::BI__builtin_arm_mve_viwdupq_x_wb_u32:
16183     Param0 = Intrinsic::arm_mve_viwdup_predicated;
16184     break;
16185   }
16186   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16187   Value *Val1 = UndefValue::get(Val0);
16188   Address Val2 = EmitPointerWithAlignment(E->getArg(0));
16189   Value *Val3 = Builder.CreateLoad(Val2);
16190   Value *Val4 = EmitScalarExpr(E->getArg(1));
16191   Value *Val5 = EmitScalarExpr(E->getArg(2));
16192   Value *Val6 = EmitScalarExpr(E->getArg(3));
16193   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
16194   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
16195   Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1, Val3, Val4, Val5, Val8});
16196   Value *Val10 = Builder.CreateExtractValue(Val9, static_cast<unsigned>(1));
16197   Builder.CreateStore(Val10, Val2);
16198   return Builder.CreateExtractValue(Val9, static_cast<unsigned>(0));
16199 }
16200 case ARM::BI__builtin_arm_mve_vaddq_x_n_s32:
16201 case ARM::BI__builtin_arm_mve_vaddq_x_n_u32:
16202 case ARM::BI__builtin_arm_mve_vmulq_x_n_s32:
16203 case ARM::BI__builtin_arm_mve_vmulq_x_n_u32:
16204 case ARM::BI__builtin_arm_mve_vsubq_x_n_s32:
16205 case ARM::BI__builtin_arm_mve_vsubq_x_n_u32: {
16206   Intrinsic::ID  Param0;
16207   switch (BuiltinID) {
16208   case ARM::BI__builtin_arm_mve_vaddq_x_n_s32:
16209     Param0 = Intrinsic::arm_mve_add_predicated;
16210     break;
16211   case ARM::BI__builtin_arm_mve_vaddq_x_n_u32:
16212     Param0 = Intrinsic::arm_mve_add_predicated;
16213     break;
16214   case ARM::BI__builtin_arm_mve_vmulq_x_n_s32:
16215     Param0 = Intrinsic::arm_mve_mul_predicated;
16216     break;
16217   case ARM::BI__builtin_arm_mve_vmulq_x_n_u32:
16218     Param0 = Intrinsic::arm_mve_mul_predicated;
16219     break;
16220   case ARM::BI__builtin_arm_mve_vsubq_x_n_s32:
16221     Param0 = Intrinsic::arm_mve_sub_predicated;
16222     break;
16223   case ARM::BI__builtin_arm_mve_vsubq_x_n_u32:
16224     Param0 = Intrinsic::arm_mve_sub_predicated;
16225     break;
16226   }
16227   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16228   Value *Val1 = UndefValue::get(Val0);
16229   Value *Val2 = EmitScalarExpr(E->getArg(0));
16230   Value *Val3 = EmitScalarExpr(E->getArg(1));
16231   Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
16232   Value *Val5 = EmitScalarExpr(E->getArg(2));
16233   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
16234   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
16235   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val4, Val7, Val1});
16236 }
16237 case ARM::BI__builtin_arm_mve_vhaddq_x_n_s32:
16238 case ARM::BI__builtin_arm_mve_vhaddq_x_n_u32:
16239 case ARM::BI__builtin_arm_mve_vhsubq_x_n_s32:
16240 case ARM::BI__builtin_arm_mve_vhsubq_x_n_u32: {
16241   uint32_t  Param0;
16242   Intrinsic::ID  Param1;
16243   switch (BuiltinID) {
16244   case ARM::BI__builtin_arm_mve_vhaddq_x_n_s32:
16245     Param0 = 0;
16246     Param1 = Intrinsic::arm_mve_hadd_predicated;
16247     break;
16248   case ARM::BI__builtin_arm_mve_vhaddq_x_n_u32:
16249     Param0 = 1;
16250     Param1 = Intrinsic::arm_mve_hadd_predicated;
16251     break;
16252   case ARM::BI__builtin_arm_mve_vhsubq_x_n_s32:
16253     Param0 = 0;
16254     Param1 = Intrinsic::arm_mve_hsub_predicated;
16255     break;
16256   case ARM::BI__builtin_arm_mve_vhsubq_x_n_u32:
16257     Param0 = 1;
16258     Param1 = Intrinsic::arm_mve_hsub_predicated;
16259     break;
16260   }
16261   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16262   Value *Val1 = UndefValue::get(Val0);
16263   Value *Val2 = EmitScalarExpr(E->getArg(0));
16264   Value *Val3 = EmitScalarExpr(E->getArg(1));
16265   Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
16266   Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
16267   Value *Val6 = EmitScalarExpr(E->getArg(2));
16268   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
16269   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
16270   return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val4, Val5, Val8, Val1});
16271 }
16272 case ARM::BI__builtin_arm_mve_vabsq_x_s32:
16273 case ARM::BI__builtin_arm_mve_vclsq_x_s32:
16274 case ARM::BI__builtin_arm_mve_vclzq_x_s32:
16275 case ARM::BI__builtin_arm_mve_vclzq_x_u32:
16276 case ARM::BI__builtin_arm_mve_vmvnq_x_s32:
16277 case ARM::BI__builtin_arm_mve_vmvnq_x_u32:
16278 case ARM::BI__builtin_arm_mve_vnegq_x_s32: {
16279   Intrinsic::ID  Param0;
16280   switch (BuiltinID) {
16281   case ARM::BI__builtin_arm_mve_vabsq_x_s32:
16282     Param0 = Intrinsic::arm_mve_abs_predicated;
16283     break;
16284   case ARM::BI__builtin_arm_mve_vclsq_x_s32:
16285     Param0 = Intrinsic::arm_mve_cls_predicated;
16286     break;
16287   case ARM::BI__builtin_arm_mve_vclzq_x_s32:
16288     Param0 = Intrinsic::arm_mve_clz_predicated;
16289     break;
16290   case ARM::BI__builtin_arm_mve_vclzq_x_u32:
16291     Param0 = Intrinsic::arm_mve_clz_predicated;
16292     break;
16293   case ARM::BI__builtin_arm_mve_vmvnq_x_s32:
16294     Param0 = Intrinsic::arm_mve_mvn_predicated;
16295     break;
16296   case ARM::BI__builtin_arm_mve_vmvnq_x_u32:
16297     Param0 = Intrinsic::arm_mve_mvn_predicated;
16298     break;
16299   case ARM::BI__builtin_arm_mve_vnegq_x_s32:
16300     Param0 = Intrinsic::arm_mve_neg_predicated;
16301     break;
16302   }
16303   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16304   Value *Val1 = UndefValue::get(Val0);
16305   Value *Val2 = EmitScalarExpr(E->getArg(0));
16306   Value *Val3 = EmitScalarExpr(E->getArg(1));
16307   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
16308   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
16309   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val5, Val1});
16310 }
16311 case ARM::BI__builtin_arm_mve_vddupq_x_n_u32:
16312 case ARM::BI__builtin_arm_mve_vidupq_x_n_u32: {
16313   Intrinsic::ID  Param0;
16314   switch (BuiltinID) {
16315   case ARM::BI__builtin_arm_mve_vddupq_x_n_u32:
16316     Param0 = Intrinsic::arm_mve_vddup_predicated;
16317     break;
16318   case ARM::BI__builtin_arm_mve_vidupq_x_n_u32:
16319     Param0 = Intrinsic::arm_mve_vidup_predicated;
16320     break;
16321   }
16322   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16323   Value *Val1 = UndefValue::get(Val0);
16324   Value *Val2 = EmitScalarExpr(E->getArg(0));
16325   Value *Val3 = EmitScalarExpr(E->getArg(1));
16326   Value *Val4 = EmitScalarExpr(E->getArg(2));
16327   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
16328   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
16329   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1, Val2, Val3, Val6});
16330   return Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
16331 }
16332 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_s32:
16333 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_u32: {
16334   Intrinsic::ID  Param0;
16335   switch (BuiltinID) {
16336   case ARM::BI__builtin_arm_mve_vbrsrq_x_n_s32:
16337     Param0 = Intrinsic::arm_mve_vbrsr_predicated;
16338     break;
16339   case ARM::BI__builtin_arm_mve_vbrsrq_x_n_u32:
16340     Param0 = Intrinsic::arm_mve_vbrsr_predicated;
16341     break;
16342   }
16343   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16344   Value *Val1 = UndefValue::get(Val0);
16345   Value *Val2 = EmitScalarExpr(E->getArg(0));
16346   Value *Val3 = EmitScalarExpr(E->getArg(1));
16347   Value *Val4 = EmitScalarExpr(E->getArg(2));
16348   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
16349   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
16350   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1, Val2, Val3, Val6});
16351 }
16352 case ARM::BI__builtin_arm_mve_vaddq_x_s32:
16353 case ARM::BI__builtin_arm_mve_vaddq_x_u32:
16354 case ARM::BI__builtin_arm_mve_vmulq_x_s32:
16355 case ARM::BI__builtin_arm_mve_vmulq_x_u32:
16356 case ARM::BI__builtin_arm_mve_vshlq_x_n_s32:
16357 case ARM::BI__builtin_arm_mve_vshlq_x_n_u32:
16358 case ARM::BI__builtin_arm_mve_vsubq_x_s32:
16359 case ARM::BI__builtin_arm_mve_vsubq_x_u32: {
16360   Intrinsic::ID  Param0;
16361   switch (BuiltinID) {
16362   case ARM::BI__builtin_arm_mve_vaddq_x_s32:
16363     Param0 = Intrinsic::arm_mve_add_predicated;
16364     break;
16365   case ARM::BI__builtin_arm_mve_vaddq_x_u32:
16366     Param0 = Intrinsic::arm_mve_add_predicated;
16367     break;
16368   case ARM::BI__builtin_arm_mve_vmulq_x_s32:
16369     Param0 = Intrinsic::arm_mve_mul_predicated;
16370     break;
16371   case ARM::BI__builtin_arm_mve_vmulq_x_u32:
16372     Param0 = Intrinsic::arm_mve_mul_predicated;
16373     break;
16374   case ARM::BI__builtin_arm_mve_vshlq_x_n_s32:
16375     Param0 = Intrinsic::arm_mve_shl_imm_predicated;
16376     break;
16377   case ARM::BI__builtin_arm_mve_vshlq_x_n_u32:
16378     Param0 = Intrinsic::arm_mve_shl_imm_predicated;
16379     break;
16380   case ARM::BI__builtin_arm_mve_vsubq_x_s32:
16381     Param0 = Intrinsic::arm_mve_sub_predicated;
16382     break;
16383   case ARM::BI__builtin_arm_mve_vsubq_x_u32:
16384     Param0 = Intrinsic::arm_mve_sub_predicated;
16385     break;
16386   }
16387   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16388   Value *Val1 = UndefValue::get(Val0);
16389   Value *Val2 = EmitScalarExpr(E->getArg(0));
16390   Value *Val3 = EmitScalarExpr(E->getArg(1));
16391   Value *Val4 = EmitScalarExpr(E->getArg(2));
16392   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
16393   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
16394   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val6, Val1});
16395 }
16396 case ARM::BI__builtin_arm_mve_vdwdupq_x_n_u32:
16397 case ARM::BI__builtin_arm_mve_viwdupq_x_n_u32: {
16398   Intrinsic::ID  Param0;
16399   switch (BuiltinID) {
16400   case ARM::BI__builtin_arm_mve_vdwdupq_x_n_u32:
16401     Param0 = Intrinsic::arm_mve_vdwdup_predicated;
16402     break;
16403   case ARM::BI__builtin_arm_mve_viwdupq_x_n_u32:
16404     Param0 = Intrinsic::arm_mve_viwdup_predicated;
16405     break;
16406   }
16407   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16408   Value *Val1 = UndefValue::get(Val0);
16409   Value *Val2 = EmitScalarExpr(E->getArg(0));
16410   Value *Val3 = EmitScalarExpr(E->getArg(1));
16411   Value *Val4 = EmitScalarExpr(E->getArg(2));
16412   Value *Val5 = EmitScalarExpr(E->getArg(3));
16413   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
16414   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
16415   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1, Val2, Val3, Val4, Val7});
16416   return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
16417 }
16418 case ARM::BI__builtin_arm_mve_vrshlq_x_s32:
16419 case ARM::BI__builtin_arm_mve_vrshlq_x_u32:
16420 case ARM::BI__builtin_arm_mve_vshlq_x_s32:
16421 case ARM::BI__builtin_arm_mve_vshlq_x_u32: {
16422   uint32_t  Param0;
16423   uint32_t  Param1;
16424   switch (BuiltinID) {
16425   case ARM::BI__builtin_arm_mve_vrshlq_x_s32:
16426     Param0 = 1;
16427     Param1 = 0;
16428     break;
16429   case ARM::BI__builtin_arm_mve_vrshlq_x_u32:
16430     Param0 = 1;
16431     Param1 = 1;
16432     break;
16433   case ARM::BI__builtin_arm_mve_vshlq_x_s32:
16434     Param0 = 0;
16435     Param1 = 0;
16436     break;
16437   case ARM::BI__builtin_arm_mve_vshlq_x_u32:
16438     Param0 = 0;
16439     Param1 = 1;
16440     break;
16441   }
16442   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16443   Value *Val1 = UndefValue::get(Val0);
16444   Value *Val2 = EmitScalarExpr(E->getArg(0));
16445   Value *Val3 = EmitScalarExpr(E->getArg(1));
16446   Value *Val4 = llvm::ConstantInt::get(Int32Ty, 0);
16447   Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
16448   Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param1);
16449   Value *Val7 = EmitScalarExpr(E->getArg(2));
16450   Value *Val8 = Builder.CreateIntCast(Val7, Int32Ty, false);
16451   Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val8});
16452   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshl_vector_predicated, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val4, Val5, Val6, Val9, Val1});
16453 }
16454 case ARM::BI__builtin_arm_mve_vmullbq_poly_x_p16:
16455 case ARM::BI__builtin_arm_mve_vmulltq_poly_x_p16: {
16456   uint32_t  Param0;
16457   switch (BuiltinID) {
16458   case ARM::BI__builtin_arm_mve_vmullbq_poly_x_p16:
16459     Param0 = 0;
16460     break;
16461   case ARM::BI__builtin_arm_mve_vmulltq_poly_x_p16:
16462     Param0 = 1;
16463     break;
16464   }
16465   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16466   Value *Val1 = UndefValue::get(Val0);
16467   Value *Val2 = EmitScalarExpr(E->getArg(0));
16468   Value *Val3 = EmitScalarExpr(E->getArg(1));
16469   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
16470   Value *Val5 = EmitScalarExpr(E->getArg(2));
16471   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
16472   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
16473   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_mull_poly_predicated, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val4, Val7, Val1});
16474 }
16475 case ARM::BI__builtin_arm_mve_vabdq_x_s32:
16476 case ARM::BI__builtin_arm_mve_vabdq_x_u32:
16477 case ARM::BI__builtin_arm_mve_vhaddq_x_s32:
16478 case ARM::BI__builtin_arm_mve_vhaddq_x_u32:
16479 case ARM::BI__builtin_arm_mve_vhsubq_x_s32:
16480 case ARM::BI__builtin_arm_mve_vhsubq_x_u32:
16481 case ARM::BI__builtin_arm_mve_vmaxq_x_s32:
16482 case ARM::BI__builtin_arm_mve_vmaxq_x_u32:
16483 case ARM::BI__builtin_arm_mve_vminq_x_s32:
16484 case ARM::BI__builtin_arm_mve_vminq_x_u32:
16485 case ARM::BI__builtin_arm_mve_vmulhq_x_s32:
16486 case ARM::BI__builtin_arm_mve_vmulhq_x_u32:
16487 case ARM::BI__builtin_arm_mve_vrhaddq_x_s32:
16488 case ARM::BI__builtin_arm_mve_vrhaddq_x_u32:
16489 case ARM::BI__builtin_arm_mve_vrmulhq_x_s32:
16490 case ARM::BI__builtin_arm_mve_vrmulhq_x_u32:
16491 case ARM::BI__builtin_arm_mve_vrshrq_x_n_s32:
16492 case ARM::BI__builtin_arm_mve_vrshrq_x_n_u32:
16493 case ARM::BI__builtin_arm_mve_vshrq_x_n_s32:
16494 case ARM::BI__builtin_arm_mve_vshrq_x_n_u32: {
16495   uint32_t  Param0;
16496   Intrinsic::ID  Param1;
16497   switch (BuiltinID) {
16498   case ARM::BI__builtin_arm_mve_vabdq_x_s32:
16499     Param0 = 0;
16500     Param1 = Intrinsic::arm_mve_abd_predicated;
16501     break;
16502   case ARM::BI__builtin_arm_mve_vabdq_x_u32:
16503     Param0 = 1;
16504     Param1 = Intrinsic::arm_mve_abd_predicated;
16505     break;
16506   case ARM::BI__builtin_arm_mve_vhaddq_x_s32:
16507     Param0 = 0;
16508     Param1 = Intrinsic::arm_mve_hadd_predicated;
16509     break;
16510   case ARM::BI__builtin_arm_mve_vhaddq_x_u32:
16511     Param0 = 1;
16512     Param1 = Intrinsic::arm_mve_hadd_predicated;
16513     break;
16514   case ARM::BI__builtin_arm_mve_vhsubq_x_s32:
16515     Param0 = 0;
16516     Param1 = Intrinsic::arm_mve_hsub_predicated;
16517     break;
16518   case ARM::BI__builtin_arm_mve_vhsubq_x_u32:
16519     Param0 = 1;
16520     Param1 = Intrinsic::arm_mve_hsub_predicated;
16521     break;
16522   case ARM::BI__builtin_arm_mve_vmaxq_x_s32:
16523     Param0 = 0;
16524     Param1 = Intrinsic::arm_mve_max_predicated;
16525     break;
16526   case ARM::BI__builtin_arm_mve_vmaxq_x_u32:
16527     Param0 = 1;
16528     Param1 = Intrinsic::arm_mve_max_predicated;
16529     break;
16530   case ARM::BI__builtin_arm_mve_vminq_x_s32:
16531     Param0 = 0;
16532     Param1 = Intrinsic::arm_mve_min_predicated;
16533     break;
16534   case ARM::BI__builtin_arm_mve_vminq_x_u32:
16535     Param0 = 1;
16536     Param1 = Intrinsic::arm_mve_min_predicated;
16537     break;
16538   case ARM::BI__builtin_arm_mve_vmulhq_x_s32:
16539     Param0 = 0;
16540     Param1 = Intrinsic::arm_mve_mulh_predicated;
16541     break;
16542   case ARM::BI__builtin_arm_mve_vmulhq_x_u32:
16543     Param0 = 1;
16544     Param1 = Intrinsic::arm_mve_mulh_predicated;
16545     break;
16546   case ARM::BI__builtin_arm_mve_vrhaddq_x_s32:
16547     Param0 = 0;
16548     Param1 = Intrinsic::arm_mve_rhadd_predicated;
16549     break;
16550   case ARM::BI__builtin_arm_mve_vrhaddq_x_u32:
16551     Param0 = 1;
16552     Param1 = Intrinsic::arm_mve_rhadd_predicated;
16553     break;
16554   case ARM::BI__builtin_arm_mve_vrmulhq_x_s32:
16555     Param0 = 0;
16556     Param1 = Intrinsic::arm_mve_rmulh_predicated;
16557     break;
16558   case ARM::BI__builtin_arm_mve_vrmulhq_x_u32:
16559     Param0 = 1;
16560     Param1 = Intrinsic::arm_mve_rmulh_predicated;
16561     break;
16562   case ARM::BI__builtin_arm_mve_vrshrq_x_n_s32:
16563     Param0 = 0;
16564     Param1 = Intrinsic::arm_mve_vrshr_imm_predicated;
16565     break;
16566   case ARM::BI__builtin_arm_mve_vrshrq_x_n_u32:
16567     Param0 = 1;
16568     Param1 = Intrinsic::arm_mve_vrshr_imm_predicated;
16569     break;
16570   case ARM::BI__builtin_arm_mve_vshrq_x_n_s32:
16571     Param0 = 0;
16572     Param1 = Intrinsic::arm_mve_shr_imm_predicated;
16573     break;
16574   case ARM::BI__builtin_arm_mve_vshrq_x_n_u32:
16575     Param0 = 1;
16576     Param1 = Intrinsic::arm_mve_shr_imm_predicated;
16577     break;
16578   }
16579   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16580   Value *Val1 = UndefValue::get(Val0);
16581   Value *Val2 = EmitScalarExpr(E->getArg(0));
16582   Value *Val3 = EmitScalarExpr(E->getArg(1));
16583   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
16584   Value *Val5 = EmitScalarExpr(E->getArg(2));
16585   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
16586   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
16587   return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val4, Val7, Val1});
16588 }
16589 case ARM::BI__builtin_arm_mve_vmullbq_int_x_s16:
16590 case ARM::BI__builtin_arm_mve_vmullbq_int_x_u16:
16591 case ARM::BI__builtin_arm_mve_vmulltq_int_x_s16:
16592 case ARM::BI__builtin_arm_mve_vmulltq_int_x_u16:
16593 case ARM::BI__builtin_arm_mve_vshllbq_x_n_s16:
16594 case ARM::BI__builtin_arm_mve_vshllbq_x_n_u16:
16595 case ARM::BI__builtin_arm_mve_vshlltq_x_n_s16:
16596 case ARM::BI__builtin_arm_mve_vshlltq_x_n_u16: {
16597   uint32_t  Param0;
16598   uint32_t  Param1;
16599   Intrinsic::ID  Param2;
16600   switch (BuiltinID) {
16601   case ARM::BI__builtin_arm_mve_vmullbq_int_x_s16:
16602     Param0 = 0;
16603     Param1 = 0;
16604     Param2 = Intrinsic::arm_mve_mull_int_predicated;
16605     break;
16606   case ARM::BI__builtin_arm_mve_vmullbq_int_x_u16:
16607     Param0 = 1;
16608     Param1 = 0;
16609     Param2 = Intrinsic::arm_mve_mull_int_predicated;
16610     break;
16611   case ARM::BI__builtin_arm_mve_vmulltq_int_x_s16:
16612     Param0 = 0;
16613     Param1 = 1;
16614     Param2 = Intrinsic::arm_mve_mull_int_predicated;
16615     break;
16616   case ARM::BI__builtin_arm_mve_vmulltq_int_x_u16:
16617     Param0 = 1;
16618     Param1 = 1;
16619     Param2 = Intrinsic::arm_mve_mull_int_predicated;
16620     break;
16621   case ARM::BI__builtin_arm_mve_vshllbq_x_n_s16:
16622     Param0 = 0;
16623     Param1 = 0;
16624     Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
16625     break;
16626   case ARM::BI__builtin_arm_mve_vshllbq_x_n_u16:
16627     Param0 = 1;
16628     Param1 = 0;
16629     Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
16630     break;
16631   case ARM::BI__builtin_arm_mve_vshlltq_x_n_s16:
16632     Param0 = 0;
16633     Param1 = 1;
16634     Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
16635     break;
16636   case ARM::BI__builtin_arm_mve_vshlltq_x_n_u16:
16637     Param0 = 1;
16638     Param1 = 1;
16639     Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
16640     break;
16641   }
16642   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16643   Value *Val1 = UndefValue::get(Val0);
16644   Value *Val2 = EmitScalarExpr(E->getArg(0));
16645   Value *Val3 = EmitScalarExpr(E->getArg(1));
16646   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
16647   Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param1);
16648   Value *Val6 = EmitScalarExpr(E->getArg(2));
16649   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
16650   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
16651   return Builder.CreateCall(CGM.getIntrinsic(Param2, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val4, Val5, Val8, Val1});
16652 }
16653 case ARM::BI__builtin_arm_mve_vrev64q_x_s32:
16654 case ARM::BI__builtin_arm_mve_vrev64q_x_u32: {
16655   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16656   Value *Val1 = UndefValue::get(Val0);
16657   Value *Val2 = EmitScalarExpr(E->getArg(0));
16658   Value *Val3 = llvm::ConstantInt::get(Int32Ty, 64);
16659   Value *Val4 = EmitScalarExpr(E->getArg(1));
16660   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
16661   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
16662   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vrev_predicated, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val6, Val1});
16663 }
16664 case ARM::BI__builtin_arm_mve_vcvtq_x_s32_f32:
16665 case ARM::BI__builtin_arm_mve_vcvtq_x_u32_f32: {
16666   uint32_t  Param0;
16667   switch (BuiltinID) {
16668   case ARM::BI__builtin_arm_mve_vcvtq_x_s32_f32:
16669     Param0 = 0;
16670     break;
16671   case ARM::BI__builtin_arm_mve_vcvtq_x_u32_f32:
16672     Param0 = 1;
16673     break;
16674   }
16675   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16676   Value *Val1 = UndefValue::get(Val0);
16677   Value *Val2 = EmitScalarExpr(E->getArg(0));
16678   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
16679   Value *Val4 = EmitScalarExpr(E->getArg(1));
16680   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
16681   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
16682   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fp_int_predicated, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val6, Val1});
16683 }
16684 case ARM::BI__builtin_arm_mve_vmovlbq_x_s16:
16685 case ARM::BI__builtin_arm_mve_vmovlbq_x_u16:
16686 case ARM::BI__builtin_arm_mve_vmovltq_x_s16:
16687 case ARM::BI__builtin_arm_mve_vmovltq_x_u16: {
16688   uint32_t  Param0;
16689   uint32_t  Param1;
16690   switch (BuiltinID) {
16691   case ARM::BI__builtin_arm_mve_vmovlbq_x_s16:
16692     Param0 = 0;
16693     Param1 = 0;
16694     break;
16695   case ARM::BI__builtin_arm_mve_vmovlbq_x_u16:
16696     Param0 = 1;
16697     Param1 = 0;
16698     break;
16699   case ARM::BI__builtin_arm_mve_vmovltq_x_s16:
16700     Param0 = 0;
16701     Param1 = 1;
16702     break;
16703   case ARM::BI__builtin_arm_mve_vmovltq_x_u16:
16704     Param0 = 1;
16705     Param1 = 1;
16706     break;
16707   }
16708   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16709   Value *Val1 = UndefValue::get(Val0);
16710   Value *Val2 = EmitScalarExpr(E->getArg(0));
16711   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
16712   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
16713   Value *Val5 = EmitScalarExpr(E->getArg(1));
16714   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
16715   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
16716   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmovl_predicated, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val4, Val7, Val1});
16717 }
16718 case ARM::BI__builtin_arm_mve_vandq_x_s32:
16719 case ARM::BI__builtin_arm_mve_vandq_x_u32:
16720 case ARM::BI__builtin_arm_mve_vbicq_x_s32:
16721 case ARM::BI__builtin_arm_mve_vbicq_x_u32:
16722 case ARM::BI__builtin_arm_mve_veorq_x_s32:
16723 case ARM::BI__builtin_arm_mve_veorq_x_u32:
16724 case ARM::BI__builtin_arm_mve_vornq_x_s32:
16725 case ARM::BI__builtin_arm_mve_vornq_x_u32:
16726 case ARM::BI__builtin_arm_mve_vorrq_x_s32:
16727 case ARM::BI__builtin_arm_mve_vorrq_x_u32: {
16728   Intrinsic::ID  Param0;
16729   switch (BuiltinID) {
16730   case ARM::BI__builtin_arm_mve_vandq_x_s32:
16731     Param0 = Intrinsic::arm_mve_and_predicated;
16732     break;
16733   case ARM::BI__builtin_arm_mve_vandq_x_u32:
16734     Param0 = Intrinsic::arm_mve_and_predicated;
16735     break;
16736   case ARM::BI__builtin_arm_mve_vbicq_x_s32:
16737     Param0 = Intrinsic::arm_mve_bic_predicated;
16738     break;
16739   case ARM::BI__builtin_arm_mve_vbicq_x_u32:
16740     Param0 = Intrinsic::arm_mve_bic_predicated;
16741     break;
16742   case ARM::BI__builtin_arm_mve_veorq_x_s32:
16743     Param0 = Intrinsic::arm_mve_eor_predicated;
16744     break;
16745   case ARM::BI__builtin_arm_mve_veorq_x_u32:
16746     Param0 = Intrinsic::arm_mve_eor_predicated;
16747     break;
16748   case ARM::BI__builtin_arm_mve_vornq_x_s32:
16749     Param0 = Intrinsic::arm_mve_orn_predicated;
16750     break;
16751   case ARM::BI__builtin_arm_mve_vornq_x_u32:
16752     Param0 = Intrinsic::arm_mve_orn_predicated;
16753     break;
16754   case ARM::BI__builtin_arm_mve_vorrq_x_s32:
16755     Param0 = Intrinsic::arm_mve_orr_predicated;
16756     break;
16757   case ARM::BI__builtin_arm_mve_vorrq_x_u32:
16758     Param0 = Intrinsic::arm_mve_orr_predicated;
16759     break;
16760   }
16761   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16762   Value *Val1 = UndefValue::get(Val0);
16763   Value *Val2 = EmitScalarExpr(E->getArg(0));
16764   llvm::Type *Val3 = llvm::FixedVectorType::get(Int32Ty, 4);
16765   Value *Val4 = Builder.CreateBitCast(Val2, Val3);
16766   Value *Val5 = EmitScalarExpr(E->getArg(1));
16767   llvm::Type *Val6 = llvm::FixedVectorType::get(Int32Ty, 4);
16768   Value *Val7 = Builder.CreateBitCast(Val5, Val6);
16769   Value *Val8 = EmitScalarExpr(E->getArg(2));
16770   Value *Val9 = Builder.CreateIntCast(Val8, Int32Ty, false);
16771   Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val9});
16772   llvm::Type *Val11 = llvm::FixedVectorType::get(Int32Ty, 4);
16773   Value *Val12 = Builder.CreateBitCast(Val1, Val11);
16774   Value *Val13 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4, Val7, Val10, Val12});
16775   llvm::Type *Val14 = llvm::FixedVectorType::get(Int32Ty, 4);
16776   return Builder.CreateBitCast(Val13, Val14);
16777 }
16778 case ARM::BI__builtin_arm_mve_vdupq_x_n_s32:
16779 case ARM::BI__builtin_arm_mve_vdupq_x_n_u32: {
16780   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16781   Value *Val1 = UndefValue::get(Val0);
16782   Value *Val2 = EmitScalarExpr(E->getArg(1));
16783   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
16784   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val3});
16785   Value *Val5 = EmitScalarExpr(E->getArg(0));
16786   Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
16787   return Builder.CreateSelect(Val4, Val6, Val1);
16788 }
16789 case ARM::BI__builtin_arm_mve_vmvnq_x_n_s32:
16790 case ARM::BI__builtin_arm_mve_vmvnq_x_n_u32: {
16791   bool  Param0;
16792   switch (BuiltinID) {
16793   case ARM::BI__builtin_arm_mve_vmvnq_x_n_s32:
16794     Param0 = true;
16795     break;
16796   case ARM::BI__builtin_arm_mve_vmvnq_x_n_u32:
16797     Param0 = false;
16798     break;
16799   }
16800   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16801   Value *Val1 = UndefValue::get(Val0);
16802   Value *Val2 = EmitScalarExpr(E->getArg(1));
16803   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
16804   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val3});
16805   Value *Val5 = EmitScalarExpr(E->getArg(0));
16806   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, Param0);
16807   Value *Val7 = ARMMVEVectorSplat(Builder, Val6);
16808   Value *Val8 = Builder.CreateNot(Val7);
16809   return Builder.CreateSelect(Val4, Val8, Val1);
16810 }
16811 case ARM::BI__builtin_arm_mve_vcvtaq_x_s32_f32:
16812 case ARM::BI__builtin_arm_mve_vcvtaq_x_u32_f32:
16813 case ARM::BI__builtin_arm_mve_vcvtmq_x_s32_f32:
16814 case ARM::BI__builtin_arm_mve_vcvtmq_x_u32_f32:
16815 case ARM::BI__builtin_arm_mve_vcvtnq_x_s32_f32:
16816 case ARM::BI__builtin_arm_mve_vcvtnq_x_u32_f32:
16817 case ARM::BI__builtin_arm_mve_vcvtpq_x_s32_f32:
16818 case ARM::BI__builtin_arm_mve_vcvtpq_x_u32_f32: {
16819   uint32_t  Param0;
16820   Intrinsic::ID  Param1;
16821   switch (BuiltinID) {
16822   case ARM::BI__builtin_arm_mve_vcvtaq_x_s32_f32:
16823     Param0 = 0;
16824     Param1 = Intrinsic::arm_mve_vcvta_predicated;
16825     break;
16826   case ARM::BI__builtin_arm_mve_vcvtaq_x_u32_f32:
16827     Param0 = 1;
16828     Param1 = Intrinsic::arm_mve_vcvta_predicated;
16829     break;
16830   case ARM::BI__builtin_arm_mve_vcvtmq_x_s32_f32:
16831     Param0 = 0;
16832     Param1 = Intrinsic::arm_mve_vcvtm_predicated;
16833     break;
16834   case ARM::BI__builtin_arm_mve_vcvtmq_x_u32_f32:
16835     Param0 = 1;
16836     Param1 = Intrinsic::arm_mve_vcvtm_predicated;
16837     break;
16838   case ARM::BI__builtin_arm_mve_vcvtnq_x_s32_f32:
16839     Param0 = 0;
16840     Param1 = Intrinsic::arm_mve_vcvtn_predicated;
16841     break;
16842   case ARM::BI__builtin_arm_mve_vcvtnq_x_u32_f32:
16843     Param0 = 1;
16844     Param1 = Intrinsic::arm_mve_vcvtn_predicated;
16845     break;
16846   case ARM::BI__builtin_arm_mve_vcvtpq_x_s32_f32:
16847     Param0 = 0;
16848     Param1 = Intrinsic::arm_mve_vcvtp_predicated;
16849     break;
16850   case ARM::BI__builtin_arm_mve_vcvtpq_x_u32_f32:
16851     Param0 = 1;
16852     Param1 = Intrinsic::arm_mve_vcvtp_predicated;
16853     break;
16854   }
16855   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16856   Value *Val1 = UndefValue::get(Val0);
16857   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
16858   Value *Val3 = EmitScalarExpr(E->getArg(0));
16859   Value *Val4 = EmitScalarExpr(E->getArg(1));
16860   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
16861   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
16862   return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val1, Val3, Val6});
16863 }
16864 case ARM::BI__builtin_arm_mve_vcvtq_x_n_s32_f32:
16865 case ARM::BI__builtin_arm_mve_vcvtq_x_n_u32_f32: {
16866   uint32_t  Param0;
16867   switch (BuiltinID) {
16868   case ARM::BI__builtin_arm_mve_vcvtq_x_n_s32_f32:
16869     Param0 = 0;
16870     break;
16871   case ARM::BI__builtin_arm_mve_vcvtq_x_n_u32_f32:
16872     Param0 = 1;
16873     break;
16874   }
16875   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16876   Value *Val1 = UndefValue::get(Val0);
16877   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
16878   Value *Val3 = EmitScalarExpr(E->getArg(0));
16879   Value *Val4 = EmitScalarExpr(E->getArg(1));
16880   Value *Val5 = EmitScalarExpr(E->getArg(2));
16881   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
16882   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
16883   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fix_predicated, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val1, Val3, Val4, Val7});
16884 }
16885 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_s32:
16886 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_u32:
16887 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_s32:
16888 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_u32:
16889 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_x_s32:
16890 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_x_s32: {
16891   uint32_t  Param0;
16892   uint32_t  Param1;
16893   switch (BuiltinID) {
16894   case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_s32:
16895     Param0 = 1;
16896     Param1 = 1;
16897     break;
16898   case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_u32:
16899     Param0 = 1;
16900     Param1 = 1;
16901     break;
16902   case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_s32:
16903     Param0 = 1;
16904     Param1 = 0;
16905     break;
16906   case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_u32:
16907     Param0 = 1;
16908     Param1 = 0;
16909     break;
16910   case ARM::BI__builtin_arm_mve_vhcaddq_rot270_x_s32:
16911     Param0 = 0;
16912     Param1 = 1;
16913     break;
16914   case ARM::BI__builtin_arm_mve_vhcaddq_rot90_x_s32:
16915     Param0 = 0;
16916     Param1 = 0;
16917     break;
16918   }
16919   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16920   Value *Val1 = UndefValue::get(Val0);
16921   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
16922   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
16923   Value *Val4 = EmitScalarExpr(E->getArg(0));
16924   Value *Val5 = EmitScalarExpr(E->getArg(1));
16925   Value *Val6 = EmitScalarExpr(E->getArg(2));
16926   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
16927   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
16928   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcaddq_predicated, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val1, Val4, Val5, Val8});
16929 }
16930 case ARM::BI__builtin_arm_mve_vnegq_s32: {
16931   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16932   Value *Val1 = llvm::Constant::getNullValue(Val0);
16933   Value *Val2 = EmitScalarExpr(E->getArg(0));
16934   return Builder.CreateSub(Val1, Val2);
16935 }
16936 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_s32:
16937 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_u32:
16938 case ARM::BI__builtin_arm_mve_vuninitializedq_s32:
16939 case ARM::BI__builtin_arm_mve_vuninitializedq_u32: {
16940   llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16941   return UndefValue::get(Val0);
16942 }
16943 case ARM::BI__builtin_arm_mve_vcreateq_f32: {
16944   llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
16945   Value *Val1 = UndefValue::get(Val0);
16946   Value *Val2 = EmitScalarExpr(E->getArg(0));
16947   Value *Val3 = Builder.CreateInsertElement(Val1, Val2, static_cast<uint64_t>(0));
16948   Value *Val4 = EmitScalarExpr(E->getArg(1));
16949   Value *Val5 = Builder.CreateInsertElement(Val3, Val4, static_cast<uint64_t>(1));
16950   llvm::Type *Val6 = llvm::FixedVectorType::get(FloatTy, 4);
16951   return ARMMVEVectorReinterpret(Builder, this, Val5, Val6);
16952 }
16953 case ARM::BI__builtin_arm_mve_vcreateq_f16: {
16954   llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
16955   Value *Val1 = UndefValue::get(Val0);
16956   Value *Val2 = EmitScalarExpr(E->getArg(0));
16957   Value *Val3 = Builder.CreateInsertElement(Val1, Val2, static_cast<uint64_t>(0));
16958   Value *Val4 = EmitScalarExpr(E->getArg(1));
16959   Value *Val5 = Builder.CreateInsertElement(Val3, Val4, static_cast<uint64_t>(1));
16960   llvm::Type *Val6 = llvm::FixedVectorType::get(HalfTy, 8);
16961   return ARMMVEVectorReinterpret(Builder, this, Val5, Val6);
16962 }
16963 case ARM::BI__builtin_arm_mve_vcreateq_s16:
16964 case ARM::BI__builtin_arm_mve_vcreateq_u16: {
16965   llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
16966   Value *Val1 = UndefValue::get(Val0);
16967   Value *Val2 = EmitScalarExpr(E->getArg(0));
16968   Value *Val3 = Builder.CreateInsertElement(Val1, Val2, static_cast<uint64_t>(0));
16969   Value *Val4 = EmitScalarExpr(E->getArg(1));
16970   Value *Val5 = Builder.CreateInsertElement(Val3, Val4, static_cast<uint64_t>(1));
16971   llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 8);
16972   return ARMMVEVectorReinterpret(Builder, this, Val5, Val6);
16973 }
16974 case ARM::BI__builtin_arm_mve_vcreateq_s32:
16975 case ARM::BI__builtin_arm_mve_vcreateq_u32: {
16976   llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
16977   Value *Val1 = UndefValue::get(Val0);
16978   Value *Val2 = EmitScalarExpr(E->getArg(0));
16979   Value *Val3 = Builder.CreateInsertElement(Val1, Val2, static_cast<uint64_t>(0));
16980   Value *Val4 = EmitScalarExpr(E->getArg(1));
16981   Value *Val5 = Builder.CreateInsertElement(Val3, Val4, static_cast<uint64_t>(1));
16982   llvm::Type *Val6 = llvm::FixedVectorType::get(Int32Ty, 4);
16983   return ARMMVEVectorReinterpret(Builder, this, Val5, Val6);
16984 }
16985 case ARM::BI__builtin_arm_mve_vcreateq_s64:
16986 case ARM::BI__builtin_arm_mve_vcreateq_u64: {
16987   llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
16988   Value *Val1 = UndefValue::get(Val0);
16989   Value *Val2 = EmitScalarExpr(E->getArg(0));
16990   Value *Val3 = Builder.CreateInsertElement(Val1, Val2, static_cast<uint64_t>(0));
16991   Value *Val4 = EmitScalarExpr(E->getArg(1));
16992   Value *Val5 = Builder.CreateInsertElement(Val3, Val4, static_cast<uint64_t>(1));
16993   llvm::Type *Val6 = llvm::FixedVectorType::get(Int64Ty, 2);
16994   return ARMMVEVectorReinterpret(Builder, this, Val5, Val6);
16995 }
16996 case ARM::BI__builtin_arm_mve_vcreateq_s8:
16997 case ARM::BI__builtin_arm_mve_vcreateq_u8: {
16998   llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
16999   Value *Val1 = UndefValue::get(Val0);
17000   Value *Val2 = EmitScalarExpr(E->getArg(0));
17001   Value *Val3 = Builder.CreateInsertElement(Val1, Val2, static_cast<uint64_t>(0));
17002   Value *Val4 = EmitScalarExpr(E->getArg(1));
17003   Value *Val5 = Builder.CreateInsertElement(Val3, Val4, static_cast<uint64_t>(1));
17004   llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 16);
17005   return ARMMVEVectorReinterpret(Builder, this, Val5, Val6);
17006 }
17007 case ARM::BI__builtin_arm_mve_vmullbq_int_x_s32:
17008 case ARM::BI__builtin_arm_mve_vmullbq_int_x_u32:
17009 case ARM::BI__builtin_arm_mve_vmulltq_int_x_s32:
17010 case ARM::BI__builtin_arm_mve_vmulltq_int_x_u32: {
17011   uint32_t  Param0;
17012   uint32_t  Param1;
17013   switch (BuiltinID) {
17014   case ARM::BI__builtin_arm_mve_vmullbq_int_x_s32:
17015     Param0 = 0;
17016     Param1 = 0;
17017     break;
17018   case ARM::BI__builtin_arm_mve_vmullbq_int_x_u32:
17019     Param0 = 1;
17020     Param1 = 0;
17021     break;
17022   case ARM::BI__builtin_arm_mve_vmulltq_int_x_s32:
17023     Param0 = 0;
17024     Param1 = 1;
17025     break;
17026   case ARM::BI__builtin_arm_mve_vmulltq_int_x_u32:
17027     Param0 = 1;
17028     Param1 = 1;
17029     break;
17030   }
17031   llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
17032   Value *Val1 = UndefValue::get(Val0);
17033   Value *Val2 = EmitScalarExpr(E->getArg(0));
17034   Value *Val3 = EmitScalarExpr(E->getArg(1));
17035   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
17036   Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param1);
17037   Value *Val6 = EmitScalarExpr(E->getArg(2));
17038   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
17039   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 2)}), {Val7});
17040   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_mull_int_predicated, {llvm::FixedVectorType::get(Int64Ty, 2), llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 2)}), {Val2, Val3, Val4, Val5, Val8, Val1});
17041 }
17042 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_s64:
17043 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_u64:
17044 case ARM::BI__builtin_arm_mve_vuninitializedq_s64:
17045 case ARM::BI__builtin_arm_mve_vuninitializedq_u64: {
17046   llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
17047   return UndefValue::get(Val0);
17048 }
17049 case ARM::BI__builtin_arm_mve_vddupq_x_wb_u8:
17050 case ARM::BI__builtin_arm_mve_vidupq_x_wb_u8: {
17051   Intrinsic::ID  Param0;
17052   switch (BuiltinID) {
17053   case ARM::BI__builtin_arm_mve_vddupq_x_wb_u8:
17054     Param0 = Intrinsic::arm_mve_vddup_predicated;
17055     break;
17056   case ARM::BI__builtin_arm_mve_vidupq_x_wb_u8:
17057     Param0 = Intrinsic::arm_mve_vidup_predicated;
17058     break;
17059   }
17060   llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17061   Value *Val1 = UndefValue::get(Val0);
17062   Address Val2 = EmitPointerWithAlignment(E->getArg(0));
17063   Value *Val3 = Builder.CreateLoad(Val2);
17064   Value *Val4 = EmitScalarExpr(E->getArg(1));
17065   Value *Val5 = EmitScalarExpr(E->getArg(2));
17066   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
17067   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val6});
17068   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val1, Val3, Val4, Val7});
17069   Value *Val9 = Builder.CreateExtractValue(Val8, static_cast<unsigned>(1));
17070   Builder.CreateStore(Val9, Val2);
17071   return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
17072 }
17073 case ARM::BI__builtin_arm_mve_vdwdupq_x_wb_u8:
17074 case ARM::BI__builtin_arm_mve_viwdupq_x_wb_u8: {
17075   Intrinsic::ID  Param0;
17076   switch (BuiltinID) {
17077   case ARM::BI__builtin_arm_mve_vdwdupq_x_wb_u8:
17078     Param0 = Intrinsic::arm_mve_vdwdup_predicated;
17079     break;
17080   case ARM::BI__builtin_arm_mve_viwdupq_x_wb_u8:
17081     Param0 = Intrinsic::arm_mve_viwdup_predicated;
17082     break;
17083   }
17084   llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17085   Value *Val1 = UndefValue::get(Val0);
17086   Address Val2 = EmitPointerWithAlignment(E->getArg(0));
17087   Value *Val3 = Builder.CreateLoad(Val2);
17088   Value *Val4 = EmitScalarExpr(E->getArg(1));
17089   Value *Val5 = EmitScalarExpr(E->getArg(2));
17090   Value *Val6 = EmitScalarExpr(E->getArg(3));
17091   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
17092   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val7});
17093   Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val1, Val3, Val4, Val5, Val8});
17094   Value *Val10 = Builder.CreateExtractValue(Val9, static_cast<unsigned>(1));
17095   Builder.CreateStore(Val10, Val2);
17096   return Builder.CreateExtractValue(Val9, static_cast<unsigned>(0));
17097 }
17098 case ARM::BI__builtin_arm_mve_vaddq_x_n_s8:
17099 case ARM::BI__builtin_arm_mve_vaddq_x_n_u8:
17100 case ARM::BI__builtin_arm_mve_vmulq_x_n_s8:
17101 case ARM::BI__builtin_arm_mve_vmulq_x_n_u8:
17102 case ARM::BI__builtin_arm_mve_vsubq_x_n_s8:
17103 case ARM::BI__builtin_arm_mve_vsubq_x_n_u8: {
17104   Intrinsic::ID  Param0;
17105   switch (BuiltinID) {
17106   case ARM::BI__builtin_arm_mve_vaddq_x_n_s8:
17107     Param0 = Intrinsic::arm_mve_add_predicated;
17108     break;
17109   case ARM::BI__builtin_arm_mve_vaddq_x_n_u8:
17110     Param0 = Intrinsic::arm_mve_add_predicated;
17111     break;
17112   case ARM::BI__builtin_arm_mve_vmulq_x_n_s8:
17113     Param0 = Intrinsic::arm_mve_mul_predicated;
17114     break;
17115   case ARM::BI__builtin_arm_mve_vmulq_x_n_u8:
17116     Param0 = Intrinsic::arm_mve_mul_predicated;
17117     break;
17118   case ARM::BI__builtin_arm_mve_vsubq_x_n_s8:
17119     Param0 = Intrinsic::arm_mve_sub_predicated;
17120     break;
17121   case ARM::BI__builtin_arm_mve_vsubq_x_n_u8:
17122     Param0 = Intrinsic::arm_mve_sub_predicated;
17123     break;
17124   }
17125   llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17126   Value *Val1 = UndefValue::get(Val0);
17127   Value *Val2 = EmitScalarExpr(E->getArg(0));
17128   Value *Val3 = EmitScalarExpr(E->getArg(1));
17129   Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
17130   Value *Val5 = EmitScalarExpr(E->getArg(2));
17131   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
17132   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val6});
17133   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val4, Val7, Val1});
17134 }
17135 case ARM::BI__builtin_arm_mve_vhaddq_x_n_s8:
17136 case ARM::BI__builtin_arm_mve_vhaddq_x_n_u8:
17137 case ARM::BI__builtin_arm_mve_vhsubq_x_n_s8:
17138 case ARM::BI__builtin_arm_mve_vhsubq_x_n_u8: {
17139   uint32_t  Param0;
17140   Intrinsic::ID  Param1;
17141   switch (BuiltinID) {
17142   case ARM::BI__builtin_arm_mve_vhaddq_x_n_s8:
17143     Param0 = 0;
17144     Param1 = Intrinsic::arm_mve_hadd_predicated;
17145     break;
17146   case ARM::BI__builtin_arm_mve_vhaddq_x_n_u8:
17147     Param0 = 1;
17148     Param1 = Intrinsic::arm_mve_hadd_predicated;
17149     break;
17150   case ARM::BI__builtin_arm_mve_vhsubq_x_n_s8:
17151     Param0 = 0;
17152     Param1 = Intrinsic::arm_mve_hsub_predicated;
17153     break;
17154   case ARM::BI__builtin_arm_mve_vhsubq_x_n_u8:
17155     Param0 = 1;
17156     Param1 = Intrinsic::arm_mve_hsub_predicated;
17157     break;
17158   }
17159   llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17160   Value *Val1 = UndefValue::get(Val0);
17161   Value *Val2 = EmitScalarExpr(E->getArg(0));
17162   Value *Val3 = EmitScalarExpr(E->getArg(1));
17163   Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
17164   Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
17165   Value *Val6 = EmitScalarExpr(E->getArg(2));
17166   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
17167   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val7});
17168   return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val4, Val5, Val8, Val1});
17169 }
17170 case ARM::BI__builtin_arm_mve_vabsq_x_s8:
17171 case ARM::BI__builtin_arm_mve_vclsq_x_s8:
17172 case ARM::BI__builtin_arm_mve_vclzq_x_s8:
17173 case ARM::BI__builtin_arm_mve_vclzq_x_u8:
17174 case ARM::BI__builtin_arm_mve_vmvnq_x_s8:
17175 case ARM::BI__builtin_arm_mve_vmvnq_x_u8:
17176 case ARM::BI__builtin_arm_mve_vnegq_x_s8: {
17177   Intrinsic::ID  Param0;
17178   switch (BuiltinID) {
17179   case ARM::BI__builtin_arm_mve_vabsq_x_s8:
17180     Param0 = Intrinsic::arm_mve_abs_predicated;
17181     break;
17182   case ARM::BI__builtin_arm_mve_vclsq_x_s8:
17183     Param0 = Intrinsic::arm_mve_cls_predicated;
17184     break;
17185   case ARM::BI__builtin_arm_mve_vclzq_x_s8:
17186     Param0 = Intrinsic::arm_mve_clz_predicated;
17187     break;
17188   case ARM::BI__builtin_arm_mve_vclzq_x_u8:
17189     Param0 = Intrinsic::arm_mve_clz_predicated;
17190     break;
17191   case ARM::BI__builtin_arm_mve_vmvnq_x_s8:
17192     Param0 = Intrinsic::arm_mve_mvn_predicated;
17193     break;
17194   case ARM::BI__builtin_arm_mve_vmvnq_x_u8:
17195     Param0 = Intrinsic::arm_mve_mvn_predicated;
17196     break;
17197   case ARM::BI__builtin_arm_mve_vnegq_x_s8:
17198     Param0 = Intrinsic::arm_mve_neg_predicated;
17199     break;
17200   }
17201   llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17202   Value *Val1 = UndefValue::get(Val0);
17203   Value *Val2 = EmitScalarExpr(E->getArg(0));
17204   Value *Val3 = EmitScalarExpr(E->getArg(1));
17205   Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
17206   Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val4});
17207   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val5, Val1});
17208 }
17209 case ARM::BI__builtin_arm_mve_vddupq_x_n_u8:
17210 case ARM::BI__builtin_arm_mve_vidupq_x_n_u8: {
17211   Intrinsic::ID  Param0;
17212   switch (BuiltinID) {
17213   case ARM::BI__builtin_arm_mve_vddupq_x_n_u8:
17214     Param0 = Intrinsic::arm_mve_vddup_predicated;
17215     break;
17216   case ARM::BI__builtin_arm_mve_vidupq_x_n_u8:
17217     Param0 = Intrinsic::arm_mve_vidup_predicated;
17218     break;
17219   }
17220   llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17221   Value *Val1 = UndefValue::get(Val0);
17222   Value *Val2 = EmitScalarExpr(E->getArg(0));
17223   Value *Val3 = EmitScalarExpr(E->getArg(1));
17224   Value *Val4 = EmitScalarExpr(E->getArg(2));
17225   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
17226   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val5});
17227   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val1, Val2, Val3, Val6});
17228   return Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
17229 }
17230 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_s8:
17231 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_u8: {
17232   Intrinsic::ID  Param0;
17233   switch (BuiltinID) {
17234   case ARM::BI__builtin_arm_mve_vbrsrq_x_n_s8:
17235     Param0 = Intrinsic::arm_mve_vbrsr_predicated;
17236     break;
17237   case ARM::BI__builtin_arm_mve_vbrsrq_x_n_u8:
17238     Param0 = Intrinsic::arm_mve_vbrsr_predicated;
17239     break;
17240   }
17241   llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17242   Value *Val1 = UndefValue::get(Val0);
17243   Value *Val2 = EmitScalarExpr(E->getArg(0));
17244   Value *Val3 = EmitScalarExpr(E->getArg(1));
17245   Value *Val4 = EmitScalarExpr(E->getArg(2));
17246   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
17247   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val5});
17248   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val1, Val2, Val3, Val6});
17249 }
17250 case ARM::BI__builtin_arm_mve_vaddq_x_s8:
17251 case ARM::BI__builtin_arm_mve_vaddq_x_u8:
17252 case ARM::BI__builtin_arm_mve_vmulq_x_s8:
17253 case ARM::BI__builtin_arm_mve_vmulq_x_u8:
17254 case ARM::BI__builtin_arm_mve_vshlq_x_n_s8:
17255 case ARM::BI__builtin_arm_mve_vshlq_x_n_u8:
17256 case ARM::BI__builtin_arm_mve_vsubq_x_s8:
17257 case ARM::BI__builtin_arm_mve_vsubq_x_u8: {
17258   Intrinsic::ID  Param0;
17259   switch (BuiltinID) {
17260   case ARM::BI__builtin_arm_mve_vaddq_x_s8:
17261     Param0 = Intrinsic::arm_mve_add_predicated;
17262     break;
17263   case ARM::BI__builtin_arm_mve_vaddq_x_u8:
17264     Param0 = Intrinsic::arm_mve_add_predicated;
17265     break;
17266   case ARM::BI__builtin_arm_mve_vmulq_x_s8:
17267     Param0 = Intrinsic::arm_mve_mul_predicated;
17268     break;
17269   case ARM::BI__builtin_arm_mve_vmulq_x_u8:
17270     Param0 = Intrinsic::arm_mve_mul_predicated;
17271     break;
17272   case ARM::BI__builtin_arm_mve_vshlq_x_n_s8:
17273     Param0 = Intrinsic::arm_mve_shl_imm_predicated;
17274     break;
17275   case ARM::BI__builtin_arm_mve_vshlq_x_n_u8:
17276     Param0 = Intrinsic::arm_mve_shl_imm_predicated;
17277     break;
17278   case ARM::BI__builtin_arm_mve_vsubq_x_s8:
17279     Param0 = Intrinsic::arm_mve_sub_predicated;
17280     break;
17281   case ARM::BI__builtin_arm_mve_vsubq_x_u8:
17282     Param0 = Intrinsic::arm_mve_sub_predicated;
17283     break;
17284   }
17285   llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17286   Value *Val1 = UndefValue::get(Val0);
17287   Value *Val2 = EmitScalarExpr(E->getArg(0));
17288   Value *Val3 = EmitScalarExpr(E->getArg(1));
17289   Value *Val4 = EmitScalarExpr(E->getArg(2));
17290   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
17291   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val5});
17292   return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val3, Val6, Val1});
17293 }
17294 case ARM::BI__builtin_arm_mve_vdwdupq_x_n_u8:
17295 case ARM::BI__builtin_arm_mve_viwdupq_x_n_u8: {
17296   Intrinsic::ID  Param0;
17297   switch (BuiltinID) {
17298   case ARM::BI__builtin_arm_mve_vdwdupq_x_n_u8:
17299     Param0 = Intrinsic::arm_mve_vdwdup_predicated;
17300     break;
17301   case ARM::BI__builtin_arm_mve_viwdupq_x_n_u8:
17302     Param0 = Intrinsic::arm_mve_viwdup_predicated;
17303     break;
17304   }
17305   llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17306   Value *Val1 = UndefValue::get(Val0);
17307   Value *Val2 = EmitScalarExpr(E->getArg(0));
17308   Value *Val3 = EmitScalarExpr(E->getArg(1));
17309   Value *Val4 = EmitScalarExpr(E->getArg(2));
17310   Value *Val5 = EmitScalarExpr(E->getArg(3));
17311   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
17312   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val6});
17313   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val1, Val2, Val3, Val4, Val7});
17314   return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
17315 }
17316 case ARM::BI__builtin_arm_mve_vrshlq_x_s8:
17317 case ARM::BI__builtin_arm_mve_vrshlq_x_u8:
17318 case ARM::BI__builtin_arm_mve_vshlq_x_s8:
17319 case ARM::BI__builtin_arm_mve_vshlq_x_u8: {
17320   uint32_t  Param0;
17321   uint32_t  Param1;
17322   switch (BuiltinID) {
17323   case ARM::BI__builtin_arm_mve_vrshlq_x_s8:
17324     Param0 = 1;
17325     Param1 = 0;
17326     break;
17327   case ARM::BI__builtin_arm_mve_vrshlq_x_u8:
17328     Param0 = 1;
17329     Param1 = 1;
17330     break;
17331   case ARM::BI__builtin_arm_mve_vshlq_x_s8:
17332     Param0 = 0;
17333     Param1 = 0;
17334     break;
17335   case ARM::BI__builtin_arm_mve_vshlq_x_u8:
17336     Param0 = 0;
17337     Param1 = 1;
17338     break;
17339   }
17340   llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17341   Value *Val1 = UndefValue::get(Val0);
17342   Value *Val2 = EmitScalarExpr(E->getArg(0));
17343   Value *Val3 = EmitScalarExpr(E->getArg(1));
17344   Value *Val4 = llvm::ConstantInt::get(Int32Ty, 0);
17345   Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
17346   Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param1);
17347   Value *Val7 = EmitScalarExpr(E->getArg(2));
17348   Value *Val8 = Builder.CreateIntCast(Val7, Int32Ty, false);
17349   Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val8});
17350   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshl_vector_predicated, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val3, Val4, Val5, Val6, Val9, Val1});
17351 }
17352 case ARM::BI__builtin_arm_mve_vabdq_x_s8:
17353 case ARM::BI__builtin_arm_mve_vabdq_x_u8:
17354 case ARM::BI__builtin_arm_mve_vhaddq_x_s8:
17355 case ARM::BI__builtin_arm_mve_vhaddq_x_u8:
17356 case ARM::BI__builtin_arm_mve_vhsubq_x_s8:
17357 case ARM::BI__builtin_arm_mve_vhsubq_x_u8:
17358 case ARM::BI__builtin_arm_mve_vmaxq_x_s8:
17359 case ARM::BI__builtin_arm_mve_vmaxq_x_u8:
17360 case ARM::BI__builtin_arm_mve_vminq_x_s8:
17361 case ARM::BI__builtin_arm_mve_vminq_x_u8:
17362 case ARM::BI__builtin_arm_mve_vmulhq_x_s8:
17363 case ARM::BI__builtin_arm_mve_vmulhq_x_u8:
17364 case ARM::BI__builtin_arm_mve_vrhaddq_x_s8:
17365 case ARM::BI__builtin_arm_mve_vrhaddq_x_u8:
17366 case ARM::BI__builtin_arm_mve_vrmulhq_x_s8:
17367 case ARM::BI__builtin_arm_mve_vrmulhq_x_u8:
17368 case ARM::BI__builtin_arm_mve_vrshrq_x_n_s8:
17369 case ARM::BI__builtin_arm_mve_vrshrq_x_n_u8:
17370 case ARM::BI__builtin_arm_mve_vshrq_x_n_s8:
17371 case ARM::BI__builtin_arm_mve_vshrq_x_n_u8: {
17372   uint32_t  Param0;
17373   Intrinsic::ID  Param1;
17374   switch (BuiltinID) {
17375   case ARM::BI__builtin_arm_mve_vabdq_x_s8:
17376     Param0 = 0;
17377     Param1 = Intrinsic::arm_mve_abd_predicated;
17378     break;
17379   case ARM::BI__builtin_arm_mve_vabdq_x_u8:
17380     Param0 = 1;
17381     Param1 = Intrinsic::arm_mve_abd_predicated;
17382     break;
17383   case ARM::BI__builtin_arm_mve_vhaddq_x_s8:
17384     Param0 = 0;
17385     Param1 = Intrinsic::arm_mve_hadd_predicated;
17386     break;
17387   case ARM::BI__builtin_arm_mve_vhaddq_x_u8:
17388     Param0 = 1;
17389     Param1 = Intrinsic::arm_mve_hadd_predicated;
17390     break;
17391   case ARM::BI__builtin_arm_mve_vhsubq_x_s8:
17392     Param0 = 0;
17393     Param1 = Intrinsic::arm_mve_hsub_predicated;
17394     break;
17395   case ARM::BI__builtin_arm_mve_vhsubq_x_u8:
17396     Param0 = 1;
17397     Param1 = Intrinsic::arm_mve_hsub_predicated;
17398     break;
17399   case ARM::BI__builtin_arm_mve_vmaxq_x_s8:
17400     Param0 = 0;
17401     Param1 = Intrinsic::arm_mve_max_predicated;
17402     break;
17403   case ARM::BI__builtin_arm_mve_vmaxq_x_u8:
17404     Param0 = 1;
17405     Param1 = Intrinsic::arm_mve_max_predicated;
17406     break;
17407   case ARM::BI__builtin_arm_mve_vminq_x_s8:
17408     Param0 = 0;
17409     Param1 = Intrinsic::arm_mve_min_predicated;
17410     break;
17411   case ARM::BI__builtin_arm_mve_vminq_x_u8:
17412     Param0 = 1;
17413     Param1 = Intrinsic::arm_mve_min_predicated;
17414     break;
17415   case ARM::BI__builtin_arm_mve_vmulhq_x_s8:
17416     Param0 = 0;
17417     Param1 = Intrinsic::arm_mve_mulh_predicated;
17418     break;
17419   case ARM::BI__builtin_arm_mve_vmulhq_x_u8:
17420     Param0 = 1;
17421     Param1 = Intrinsic::arm_mve_mulh_predicated;
17422     break;
17423   case ARM::BI__builtin_arm_mve_vrhaddq_x_s8:
17424     Param0 = 0;
17425     Param1 = Intrinsic::arm_mve_rhadd_predicated;
17426     break;
17427   case ARM::BI__builtin_arm_mve_vrhaddq_x_u8:
17428     Param0 = 1;
17429     Param1 = Intrinsic::arm_mve_rhadd_predicated;
17430     break;
17431   case ARM::BI__builtin_arm_mve_vrmulhq_x_s8:
17432     Param0 = 0;
17433     Param1 = Intrinsic::arm_mve_rmulh_predicated;
17434     break;
17435   case ARM::BI__builtin_arm_mve_vrmulhq_x_u8:
17436     Param0 = 1;
17437     Param1 = Intrinsic::arm_mve_rmulh_predicated;
17438     break;
17439   case ARM::BI__builtin_arm_mve_vrshrq_x_n_s8:
17440     Param0 = 0;
17441     Param1 = Intrinsic::arm_mve_vrshr_imm_predicated;
17442     break;
17443   case ARM::BI__builtin_arm_mve_vrshrq_x_n_u8:
17444     Param0 = 1;
17445     Param1 = Intrinsic::arm_mve_vrshr_imm_predicated;
17446     break;
17447   case ARM::BI__builtin_arm_mve_vshrq_x_n_s8:
17448     Param0 = 0;
17449     Param1 = Intrinsic::arm_mve_shr_imm_predicated;
17450     break;
17451   case ARM::BI__builtin_arm_mve_vshrq_x_n_u8:
17452     Param0 = 1;
17453     Param1 = Intrinsic::arm_mve_shr_imm_predicated;
17454     break;
17455   }
17456   llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17457   Value *Val1 = UndefValue::get(Val0);
17458   Value *Val2 = EmitScalarExpr(E->getArg(0));
17459   Value *Val3 = EmitScalarExpr(E->getArg(1));
17460   Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
17461   Value *Val5 = EmitScalarExpr(E->getArg(2));
17462   Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
17463   Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val6});
17464   return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val3, Val4, Val7, Val1});
17465 }
17466 case ARM::BI__builtin_arm_mve_vrev16q_x_s8:
17467 case ARM::BI__builtin_arm_mve_vrev16q_x_u8:
17468 case ARM::BI__builtin_arm_mve_vrev32q_x_s8:
17469 case ARM::BI__builtin_arm_mve_vrev32q_x_u8:
17470 case ARM::BI__builtin_arm_mve_vrev64q_x_s8:
17471 case ARM::BI__builtin_arm_mve_vrev64q_x_u8: {
17472   uint32_t  Param0;
17473   switch (BuiltinID) {
17474   case ARM::BI__builtin_arm_mve_vrev16q_x_s8:
17475     Param0 = 16;
17476     break;
17477   case ARM::BI__builtin_arm_mve_vrev16q_x_u8:
17478     Param0 = 16;
17479     break;
17480   case ARM::BI__builtin_arm_mve_vrev32q_x_s8:
17481     Param0 = 32;
17482     break;
17483   case ARM::BI__builtin_arm_mve_vrev32q_x_u8:
17484     Param0 = 32;
17485     break;
17486   case ARM::BI__builtin_arm_mve_vrev64q_x_s8:
17487     Param0 = 64;
17488     break;
17489   case ARM::BI__builtin_arm_mve_vrev64q_x_u8:
17490     Param0 = 64;
17491     break;
17492   }
17493   llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17494   Value *Val1 = UndefValue::get(Val0);
17495   Value *Val2 = EmitScalarExpr(E->getArg(0));
17496   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
17497   Value *Val4 = EmitScalarExpr(E->getArg(1));
17498   Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
17499   Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val5});
17500   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vrev_predicated, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val3, Val6, Val1});
17501 }
17502 case ARM::BI__builtin_arm_mve_vandq_x_s8:
17503 case ARM::BI__builtin_arm_mve_vandq_x_u8:
17504 case ARM::BI__builtin_arm_mve_vbicq_x_s8:
17505 case ARM::BI__builtin_arm_mve_vbicq_x_u8:
17506 case ARM::BI__builtin_arm_mve_veorq_x_s8:
17507 case ARM::BI__builtin_arm_mve_veorq_x_u8:
17508 case ARM::BI__builtin_arm_mve_vornq_x_s8:
17509 case ARM::BI__builtin_arm_mve_vornq_x_u8:
17510 case ARM::BI__builtin_arm_mve_vorrq_x_s8:
17511 case ARM::BI__builtin_arm_mve_vorrq_x_u8: {
17512   Intrinsic::ID  Param0;
17513   switch (BuiltinID) {
17514   case ARM::BI__builtin_arm_mve_vandq_x_s8:
17515     Param0 = Intrinsic::arm_mve_and_predicated;
17516     break;
17517   case ARM::BI__builtin_arm_mve_vandq_x_u8:
17518     Param0 = Intrinsic::arm_mve_and_predicated;
17519     break;
17520   case ARM::BI__builtin_arm_mve_vbicq_x_s8:
17521     Param0 = Intrinsic::arm_mve_bic_predicated;
17522     break;
17523   case ARM::BI__builtin_arm_mve_vbicq_x_u8:
17524     Param0 = Intrinsic::arm_mve_bic_predicated;
17525     break;
17526   case ARM::BI__builtin_arm_mve_veorq_x_s8:
17527     Param0 = Intrinsic::arm_mve_eor_predicated;
17528     break;
17529   case ARM::BI__builtin_arm_mve_veorq_x_u8:
17530     Param0 = Intrinsic::arm_mve_eor_predicated;
17531     break;
17532   case ARM::BI__builtin_arm_mve_vornq_x_s8:
17533     Param0 = Intrinsic::arm_mve_orn_predicated;
17534     break;
17535   case ARM::BI__builtin_arm_mve_vornq_x_u8:
17536     Param0 = Intrinsic::arm_mve_orn_predicated;
17537     break;
17538   case ARM::BI__builtin_arm_mve_vorrq_x_s8:
17539     Param0 = Intrinsic::arm_mve_orr_predicated;
17540     break;
17541   case ARM::BI__builtin_arm_mve_vorrq_x_u8:
17542     Param0 = Intrinsic::arm_mve_orr_predicated;
17543     break;
17544   }
17545   llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17546   Value *Val1 = UndefValue::get(Val0);
17547   Value *Val2 = EmitScalarExpr(E->getArg(0));
17548   llvm::Type *Val3 = llvm::FixedVectorType::get(Int8Ty, 16);
17549   Value *Val4 = Builder.CreateBitCast(Val2, Val3);
17550   Value *Val5 = EmitScalarExpr(E->getArg(1));
17551   llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 16);
17552   Value *Val7 = Builder.CreateBitCast(Val5, Val6);
17553   Value *Val8 = EmitScalarExpr(E->getArg(2));
17554   Value *Val9 = Builder.CreateIntCast(Val8, Int32Ty, false);
17555   Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val9});
17556   llvm::Type *Val11 = llvm::FixedVectorType::get(Int8Ty, 16);
17557   Value *Val12 = Builder.CreateBitCast(Val1, Val11);
17558   Value *Val13 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val4, Val7, Val10, Val12});
17559   llvm::Type *Val14 = llvm::FixedVectorType::get(Int8Ty, 16);
17560   return Builder.CreateBitCast(Val13, Val14);
17561 }
17562 case ARM::BI__builtin_arm_mve_vdupq_x_n_s8:
17563 case ARM::BI__builtin_arm_mve_vdupq_x_n_u8: {
17564   llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17565   Value *Val1 = UndefValue::get(Val0);
17566   Value *Val2 = EmitScalarExpr(E->getArg(1));
17567   Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
17568   Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val3});
17569   Value *Val5 = EmitScalarExpr(E->getArg(0));
17570   Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
17571   return Builder.CreateSelect(Val4, Val6, Val1);
17572 }
17573 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_s8:
17574 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_u8:
17575 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_s8:
17576 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_u8:
17577 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_x_s8:
17578 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_x_s8: {
17579   uint32_t  Param0;
17580   uint32_t  Param1;
17581   switch (BuiltinID) {
17582   case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_s8:
17583     Param0 = 1;
17584     Param1 = 1;
17585     break;
17586   case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_u8:
17587     Param0 = 1;
17588     Param1 = 1;
17589     break;
17590   case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_s8:
17591     Param0 = 1;
17592     Param1 = 0;
17593     break;
17594   case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_u8:
17595     Param0 = 1;
17596     Param1 = 0;
17597     break;
17598   case ARM::BI__builtin_arm_mve_vhcaddq_rot270_x_s8:
17599     Param0 = 0;
17600     Param1 = 1;
17601     break;
17602   case ARM::BI__builtin_arm_mve_vhcaddq_rot90_x_s8:
17603     Param0 = 0;
17604     Param1 = 0;
17605     break;
17606   }
17607   llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17608   Value *Val1 = UndefValue::get(Val0);
17609   Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
17610   Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
17611   Value *Val4 = EmitScalarExpr(E->getArg(0));
17612   Value *Val5 = EmitScalarExpr(E->getArg(1));
17613   Value *Val6 = EmitScalarExpr(E->getArg(2));
17614   Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
17615   Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val7});
17616   return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcaddq_predicated, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val3, Val1, Val4, Val5, Val8});
17617 }
17618 case ARM::BI__builtin_arm_mve_vnegq_s8: {
17619   llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17620   Value *Val1 = llvm::Constant::getNullValue(Val0);
17621   Value *Val2 = EmitScalarExpr(E->getArg(0));
17622   return Builder.CreateSub(Val1, Val2);
17623 }
17624 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_s8:
17625 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_u8:
17626 case ARM::BI__builtin_arm_mve_vuninitializedq_s8:
17627 case ARM::BI__builtin_arm_mve_vuninitializedq_u8: {
17628   llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17629   return UndefValue::get(Val0);
17630 }