case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_s64:
case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_u64:
case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_f32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_s32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_u32: {
  llvm::Type * Param0;
  llvm::Type * Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_s64:
    Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_u64:
    Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_f32:
    Param0 = llvm::FixedVectorType::get(FloatTy, 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_s32:
    Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_u32:
    Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreateLoad(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vldr_gather_base_wb, {Param0, Param1}), {Val1, Val2});
  Value *Val4 = Builder.CreateExtractValue(Val3, static_cast<unsigned>(1));
  Builder.CreateStore(Val4, Val0);
  return Builder.CreateExtractValue(Val3, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vddupq_wb_u16:
case ARM::BI__builtin_arm_mve_vddupq_wb_u32:
case ARM::BI__builtin_arm_mve_vddupq_wb_u8:
case ARM::BI__builtin_arm_mve_vidupq_wb_u16:
case ARM::BI__builtin_arm_mve_vidupq_wb_u32:
case ARM::BI__builtin_arm_mve_vidupq_wb_u8: {
  Intrinsic::ID  Param0;
  llvm::Type * Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vddupq_wb_u16:
    Param0 = Intrinsic::arm_mve_vddup;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vddupq_wb_u32:
    Param0 = Intrinsic::arm_mve_vddup;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vddupq_wb_u8:
    Param0 = Intrinsic::arm_mve_vddup;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vidupq_wb_u16:
    Param0 = Intrinsic::arm_mve_vidup;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vidupq_wb_u32:
    Param0 = Intrinsic::arm_mve_vidup;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vidupq_wb_u8:
    Param0 = Intrinsic::arm_mve_vidup;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreateLoad(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val1, Val2});
  Value *Val4 = Builder.CreateExtractValue(Val3, static_cast<unsigned>(1));
  Builder.CreateStore(Val4, Val0);
  return Builder.CreateExtractValue(Val3, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_s64:
case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_u64:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_f32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_s32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_u32: {
  llvm::Type * Param0;
  llvm::Type * Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_s64:
    Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_u64:
    Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_f32:
    Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_s32:
    Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_u32:
    Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreateLoad(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vstr_scatter_base_wb, {Param0, Param1}), {Val1, Val2, Val3});
  return Builder.CreateStore(Val4, Val0);
}
case ARM::BI__builtin_arm_mve_vdwdupq_wb_u16:
case ARM::BI__builtin_arm_mve_vdwdupq_wb_u32:
case ARM::BI__builtin_arm_mve_vdwdupq_wb_u8:
case ARM::BI__builtin_arm_mve_viwdupq_wb_u16:
case ARM::BI__builtin_arm_mve_viwdupq_wb_u32:
case ARM::BI__builtin_arm_mve_viwdupq_wb_u8: {
  Intrinsic::ID  Param0;
  llvm::Type * Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vdwdupq_wb_u16:
    Param0 = Intrinsic::arm_mve_vdwdup;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vdwdupq_wb_u32:
    Param0 = Intrinsic::arm_mve_vdwdup;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vdwdupq_wb_u8:
    Param0 = Intrinsic::arm_mve_vdwdup;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_viwdupq_wb_u16:
    Param0 = Intrinsic::arm_mve_viwdup;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_viwdupq_wb_u32:
    Param0 = Intrinsic::arm_mve_viwdup;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_viwdupq_wb_u8:
    Param0 = Intrinsic::arm_mve_viwdup;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreateLoad(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val1, Val2, Val3});
  Value *Val5 = Builder.CreateExtractValue(Val4, static_cast<unsigned>(1));
  Builder.CreateStore(Val5, Val0);
  return Builder.CreateExtractValue(Val4, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_z_s64:
case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_z_u64:
case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_z_f32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_z_s32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_z_u32: {
  llvm::Type * Param0;
  llvm::Type * Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_z_s64:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_z_u64:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_z_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_z_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_z_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreateLoad(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val4});
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vldr_gather_base_wb_predicated, {Param1, Param2, Param0}), {Val1, Val2, Val5});
  Value *Val7 = Builder.CreateExtractValue(Val6, static_cast<unsigned>(1));
  Builder.CreateStore(Val7, Val0);
  return Builder.CreateExtractValue(Val6, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_p_s64:
case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_p_u64:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_p_f32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_p_s32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_p_u32: {
  llvm::Type * Param0;
  llvm::Type * Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_p_s64:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_p_u64:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_p_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_p_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_p_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreateLoad(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  Value *Val4 = EmitScalarExpr(E->getArg(3));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val5});
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vstr_scatter_base_wb_predicated, {Param1, Param2, Param0}), {Val1, Val2, Val3, Val6});
  return Builder.CreateStore(Val7, Val0);
}
case ARM::BI__builtin_arm_mve_vld1q_f32:
case ARM::BI__builtin_arm_mve_vldrwq_f32: {
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreatePointerCast((Val0.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(FloatTy, 4)));
  Address Val2 = Address(Val1, llvm::FixedVectorType::get(FloatTy, 4), CharUnits::fromQuantity(4));
  return Builder.CreateLoad(Val2);
}
case ARM::BI__builtin_arm_mve_vld1q_z_f32:
case ARM::BI__builtin_arm_mve_vldrwq_z_f32: {
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreatePointerCast((Val0.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(FloatTy, 4)));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, 4);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
  llvm::Type *Val6 = llvm::FixedVectorType::get(FloatTy, 4);
  Value *Val7 = llvm::Constant::getNullValue(Val6);
  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});
}
case ARM::BI__builtin_arm_mve_vld1q_f16:
case ARM::BI__builtin_arm_mve_vldrhq_f16: {
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreatePointerCast((Val0.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(HalfTy, 8)));
  Address Val2 = Address(Val1, llvm::FixedVectorType::get(HalfTy, 8), CharUnits::fromQuantity(2));
  return Builder.CreateLoad(Val2);
}
case ARM::BI__builtin_arm_mve_vld1q_z_f16:
case ARM::BI__builtin_arm_mve_vldrhq_z_f16: {
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreatePointerCast((Val0.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(HalfTy, 8)));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, 2);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4});
  llvm::Type *Val6 = llvm::FixedVectorType::get(HalfTy, 8);
  Value *Val7 = llvm::Constant::getNullValue(Val6);
  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});
}
case ARM::BI__builtin_arm_mve_vldrhq_s32:
case ARM::BI__builtin_arm_mve_vldrhq_u32: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vldrhq_s32:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_u32:
    Param0 = 1;
    break;
  }
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreatePointerCast((Val0.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 4)));
  Address Val2 = Address(Val1, llvm::FixedVectorType::get(Int16Ty, 4), CharUnits::fromQuantity(2));
  Value *Val3 = Builder.CreateLoad(Val2);
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
  return SignOrZeroExtend(Builder, Val3, Val4, static_cast<bool>(Param0));
}
case ARM::BI__builtin_arm_mve_vldrhq_z_s32:
case ARM::BI__builtin_arm_mve_vldrhq_z_u32: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vldrhq_z_s32:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_z_u32:
    Param0 = 1;
    break;
  }
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreatePointerCast((Val0.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 4)));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, 2);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 4);
  Value *Val7 = llvm::Constant::getNullValue(Val6);
  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});
  llvm::Type *Val9 = llvm::FixedVectorType::get(Int32Ty, 4);
  return SignOrZeroExtend(Builder, Val8, Val9, static_cast<bool>(Param0));
}
case ARM::BI__builtin_arm_mve_vld1q_s16:
case ARM::BI__builtin_arm_mve_vld1q_u16:
case ARM::BI__builtin_arm_mve_vldrhq_s16:
case ARM::BI__builtin_arm_mve_vldrhq_u16: {
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreatePointerCast((Val0.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8)));
  Address Val2 = Address(Val1, llvm::FixedVectorType::get(Int16Ty, 8), CharUnits::fromQuantity(2));
  return Builder.CreateLoad(Val2);
}
case ARM::BI__builtin_arm_mve_vld1q_z_s16:
case ARM::BI__builtin_arm_mve_vld1q_z_u16:
case ARM::BI__builtin_arm_mve_vldrhq_z_s16:
case ARM::BI__builtin_arm_mve_vldrhq_z_u16: {
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreatePointerCast((Val0.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8)));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, 2);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4});
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val7 = llvm::Constant::getNullValue(Val6);
  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});
}
case ARM::BI__builtin_arm_mve_vld1q_s32:
case ARM::BI__builtin_arm_mve_vld1q_u32:
case ARM::BI__builtin_arm_mve_vldrwq_s32:
case ARM::BI__builtin_arm_mve_vldrwq_u32: {
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreatePointerCast((Val0.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4)));
  Address Val2 = Address(Val1, llvm::FixedVectorType::get(Int32Ty, 4), CharUnits::fromQuantity(4));
  return Builder.CreateLoad(Val2);
}
case ARM::BI__builtin_arm_mve_vld1q_z_s32:
case ARM::BI__builtin_arm_mve_vld1q_z_u32:
case ARM::BI__builtin_arm_mve_vldrwq_z_s32:
case ARM::BI__builtin_arm_mve_vldrwq_z_u32: {
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreatePointerCast((Val0.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4)));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, 4);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val7 = llvm::Constant::getNullValue(Val6);
  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});
}
case ARM::BI__builtin_arm_mve_vld1q_s8:
case ARM::BI__builtin_arm_mve_vld1q_u8:
case ARM::BI__builtin_arm_mve_vldrbq_s8:
case ARM::BI__builtin_arm_mve_vldrbq_u8: {
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreatePointerCast((Val0.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16)));
  Address Val2 = Address(Val1, llvm::FixedVectorType::get(Int8Ty, 16), CharUnits::fromQuantity(1));
  return Builder.CreateLoad(Val2);
}
case ARM::BI__builtin_arm_mve_vld1q_z_s8:
case ARM::BI__builtin_arm_mve_vld1q_z_u8:
case ARM::BI__builtin_arm_mve_vldrbq_z_s8:
case ARM::BI__builtin_arm_mve_vldrbq_z_u8: {
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreatePointerCast((Val0.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16)));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, 1);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val4});
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val7 = llvm::Constant::getNullValue(Val6);
  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});
}
case ARM::BI__builtin_arm_mve_vldrbq_s32:
case ARM::BI__builtin_arm_mve_vldrbq_u32: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vldrbq_s32:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vldrbq_u32:
    Param0 = 1;
    break;
  }
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreatePointerCast((Val0.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 4)));
  Address Val2 = Address(Val1, llvm::FixedVectorType::get(Int8Ty, 4), CharUnits::fromQuantity(1));
  Value *Val3 = Builder.CreateLoad(Val2);
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
  return SignOrZeroExtend(Builder, Val3, Val4, static_cast<bool>(Param0));
}
case ARM::BI__builtin_arm_mve_vldrbq_z_s32:
case ARM::BI__builtin_arm_mve_vldrbq_z_u32: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vldrbq_z_s32:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vldrbq_z_u32:
    Param0 = 1;
    break;
  }
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreatePointerCast((Val0.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 4)));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, 1);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 4);
  Value *Val7 = llvm::Constant::getNullValue(Val6);
  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});
  llvm::Type *Val9 = llvm::FixedVectorType::get(Int32Ty, 4);
  return SignOrZeroExtend(Builder, Val8, Val9, static_cast<bool>(Param0));
}
case ARM::BI__builtin_arm_mve_vldrbq_s16:
case ARM::BI__builtin_arm_mve_vldrbq_u16: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vldrbq_s16:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vldrbq_u16:
    Param0 = 1;
    break;
  }
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreatePointerCast((Val0.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 8)));
  Address Val2 = Address(Val1, llvm::FixedVectorType::get(Int8Ty, 8), CharUnits::fromQuantity(1));
  Value *Val3 = Builder.CreateLoad(Val2);
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
  return SignOrZeroExtend(Builder, Val3, Val4, static_cast<bool>(Param0));
}
case ARM::BI__builtin_arm_mve_vldrbq_z_s16:
case ARM::BI__builtin_arm_mve_vldrbq_z_u16: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vldrbq_z_s16:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vldrbq_z_u16:
    Param0 = 1;
    break;
  }
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = Builder.CreatePointerCast((Val0.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 8)));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, 1);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4});
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 8);
  Value *Val7 = llvm::Constant::getNullValue(Val6);
  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});
  llvm::Type *Val9 = llvm::FixedVectorType::get(Int16Ty, 8);
  return SignOrZeroExtend(Builder, Val8, Val9, static_cast<bool>(Param0));
}
case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_s16:
case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_s32:
case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_s8:
case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_u16:
case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_u32:
case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_u8:
case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_p_s64:
case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_p_u64:
case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_p_s64:
case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_p_u64:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_f16:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_s16:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_s32:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_u16:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_u32:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_f16:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_s16:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_s32:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_u16:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_u32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_p_f32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_p_s32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_p_u32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_p_f32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_p_s32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_p_u32: {
  uint32_t  Param0;
  uint32_t  Param1;
  llvm::Type * Param2;
  llvm::Type * Param3;
  llvm::Type * Param4;
  llvm::Type * Param5;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_s16:
    Param0 = 8;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::PointerType::getUnqual(Int8Ty);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_s32:
    Param0 = 8;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::PointerType::getUnqual(Int8Ty);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_s8:
    Param0 = 8;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param3 = llvm::PointerType::getUnqual(Int8Ty);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_u16:
    Param0 = 8;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::PointerType::getUnqual(Int8Ty);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_u32:
    Param0 = 8;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::PointerType::getUnqual(Int8Ty);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_u8:
    Param0 = 8;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param3 = llvm::PointerType::getUnqual(Int8Ty);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_p_s64:
    Param0 = 64;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param3 = llvm::PointerType::getUnqual(Int64Ty);
    Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_p_u64:
    Param0 = 64;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param3 = llvm::PointerType::getUnqual(Int64Ty);
    Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_p_s64:
    Param0 = 64;
    Param1 = 3;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param3 = llvm::PointerType::getUnqual(Int64Ty);
    Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_p_u64:
    Param0 = 64;
    Param1 = 3;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param3 = llvm::PointerType::getUnqual(Int64Ty);
    Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_f16:
    Param0 = 16;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::PointerType::getUnqual(HalfTy);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_s16:
    Param0 = 16;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::PointerType::getUnqual(Int16Ty);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_s32:
    Param0 = 16;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::PointerType::getUnqual(Int16Ty);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_u16:
    Param0 = 16;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::PointerType::getUnqual(Int16Ty);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_u32:
    Param0 = 16;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::PointerType::getUnqual(Int16Ty);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_f16:
    Param0 = 16;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::PointerType::getUnqual(HalfTy);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_s16:
    Param0 = 16;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::PointerType::getUnqual(Int16Ty);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_s32:
    Param0 = 16;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::PointerType::getUnqual(Int16Ty);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_u16:
    Param0 = 16;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::PointerType::getUnqual(Int16Ty);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_u32:
    Param0 = 16;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::PointerType::getUnqual(Int16Ty);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_p_f32:
    Param0 = 32;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::PointerType::getUnqual(FloatTy);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_p_s32:
    Param0 = 32;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::PointerType::getUnqual(Int32Ty);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_p_u32:
    Param0 = 32;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::PointerType::getUnqual(Int32Ty);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_p_f32:
    Param0 = 32;
    Param1 = 2;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::PointerType::getUnqual(FloatTy);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_p_s32:
    Param0 = 32;
    Param1 = 2;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::PointerType::getUnqual(Int32Ty);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_p_u32:
    Param0 = 32;
    Param1 = 2;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::PointerType::getUnqual(Int32Ty);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val5 = EmitScalarExpr(E->getArg(3));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param2}), {Val6});
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vstr_scatter_offset_predicated, {Param3, Param4, Param5, Param2}), {(Val0.getPointer()), Val1, Val2, Val3, Val4, Val7});
}
case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_s16:
case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_s32:
case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_s8:
case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_u16:
case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_u32:
case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_u8:
case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_s64:
case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_u64:
case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_s64:
case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_u64:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_f16:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_s16:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_s32:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_u16:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_u32:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_f16:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_s16:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_s32:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_u16:
case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_u32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_f32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_s32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_u32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_f32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_s32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_u32: {
  uint32_t  Param0;
  uint32_t  Param1;
  llvm::Type * Param2;
  llvm::Type * Param3;
  llvm::Type * Param4;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_s16:
    Param0 = 8;
    Param1 = 0;
    Param2 = llvm::PointerType::getUnqual(Int8Ty);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_s32:
    Param0 = 8;
    Param1 = 0;
    Param2 = llvm::PointerType::getUnqual(Int8Ty);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_s8:
    Param0 = 8;
    Param1 = 0;
    Param2 = llvm::PointerType::getUnqual(Int8Ty);
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_u16:
    Param0 = 8;
    Param1 = 0;
    Param2 = llvm::PointerType::getUnqual(Int8Ty);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_u32:
    Param0 = 8;
    Param1 = 0;
    Param2 = llvm::PointerType::getUnqual(Int8Ty);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_u8:
    Param0 = 8;
    Param1 = 0;
    Param2 = llvm::PointerType::getUnqual(Int8Ty);
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_s64:
    Param0 = 64;
    Param1 = 0;
    Param2 = llvm::PointerType::getUnqual(Int64Ty);
    Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_u64:
    Param0 = 64;
    Param1 = 0;
    Param2 = llvm::PointerType::getUnqual(Int64Ty);
    Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_s64:
    Param0 = 64;
    Param1 = 3;
    Param2 = llvm::PointerType::getUnqual(Int64Ty);
    Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_u64:
    Param0 = 64;
    Param1 = 3;
    Param2 = llvm::PointerType::getUnqual(Int64Ty);
    Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_f16:
    Param0 = 16;
    Param1 = 0;
    Param2 = llvm::PointerType::getUnqual(HalfTy);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_s16:
    Param0 = 16;
    Param1 = 0;
    Param2 = llvm::PointerType::getUnqual(Int16Ty);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_s32:
    Param0 = 16;
    Param1 = 0;
    Param2 = llvm::PointerType::getUnqual(Int16Ty);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_u16:
    Param0 = 16;
    Param1 = 0;
    Param2 = llvm::PointerType::getUnqual(Int16Ty);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_u32:
    Param0 = 16;
    Param1 = 0;
    Param2 = llvm::PointerType::getUnqual(Int16Ty);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_f16:
    Param0 = 16;
    Param1 = 1;
    Param2 = llvm::PointerType::getUnqual(HalfTy);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_s16:
    Param0 = 16;
    Param1 = 1;
    Param2 = llvm::PointerType::getUnqual(Int16Ty);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_s32:
    Param0 = 16;
    Param1 = 1;
    Param2 = llvm::PointerType::getUnqual(Int16Ty);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_u16:
    Param0 = 16;
    Param1 = 1;
    Param2 = llvm::PointerType::getUnqual(Int16Ty);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_u32:
    Param0 = 16;
    Param1 = 1;
    Param2 = llvm::PointerType::getUnqual(Int16Ty);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_f32:
    Param0 = 32;
    Param1 = 0;
    Param2 = llvm::PointerType::getUnqual(FloatTy);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_s32:
    Param0 = 32;
    Param1 = 0;
    Param2 = llvm::PointerType::getUnqual(Int32Ty);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_u32:
    Param0 = 32;
    Param1 = 0;
    Param2 = llvm::PointerType::getUnqual(Int32Ty);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_f32:
    Param0 = 32;
    Param1 = 2;
    Param2 = llvm::PointerType::getUnqual(FloatTy);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_s32:
    Param0 = 32;
    Param1 = 2;
    Param2 = llvm::PointerType::getUnqual(Int32Ty);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_u32:
    Param0 = 32;
    Param1 = 2;
    Param2 = llvm::PointerType::getUnqual(Int32Ty);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vstr_scatter_offset, {Param2, Param3, Param4}), {(Val0.getPointer()), Val1, Val2, Val3, Val4});
}
case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_s16:
case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_s32:
case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_s8:
case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_u16:
case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_u32:
case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_u8:
case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_z_s64:
case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_z_u64:
case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_z_s64:
case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_z_u64:
case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_f16:
case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_s16:
case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_s32:
case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_u16:
case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_u32:
case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_f16:
case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_s16:
case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_s32:
case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_u16:
case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_u32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_z_f32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_z_s32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_z_u32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_z_f32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_z_s32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_z_u32: {
  uint32_t  Param0;
  uint32_t  Param1;
  uint32_t  Param2;
  llvm::Type * Param3;
  llvm::Type * Param4;
  llvm::Type * Param5;
  llvm::Type * Param6;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_s16:
    Param0 = 8;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::PointerType::getUnqual(Int8Ty);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_s32:
    Param0 = 8;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::PointerType::getUnqual(Int8Ty);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_s8:
    Param0 = 8;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::PointerType::getUnqual(Int8Ty);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_u16:
    Param0 = 8;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::PointerType::getUnqual(Int8Ty);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_u32:
    Param0 = 8;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::PointerType::getUnqual(Int8Ty);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_u8:
    Param0 = 8;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::PointerType::getUnqual(Int8Ty);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_z_s64:
    Param0 = 64;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param5 = llvm::PointerType::getUnqual(Int64Ty);
    Param6 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_z_u64:
    Param0 = 64;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param5 = llvm::PointerType::getUnqual(Int64Ty);
    Param6 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_z_s64:
    Param0 = 64;
    Param1 = 3;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param5 = llvm::PointerType::getUnqual(Int64Ty);
    Param6 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_z_u64:
    Param0 = 64;
    Param1 = 3;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param5 = llvm::PointerType::getUnqual(Int64Ty);
    Param6 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_f16:
    Param0 = 16;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(HalfTy, 8);
    Param5 = llvm::PointerType::getUnqual(HalfTy);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_s16:
    Param0 = 16;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::PointerType::getUnqual(Int16Ty);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_s32:
    Param0 = 16;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::PointerType::getUnqual(Int16Ty);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_u16:
    Param0 = 16;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::PointerType::getUnqual(Int16Ty);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_u32:
    Param0 = 16;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::PointerType::getUnqual(Int16Ty);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_f16:
    Param0 = 16;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(HalfTy, 8);
    Param5 = llvm::PointerType::getUnqual(HalfTy);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_s16:
    Param0 = 16;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::PointerType::getUnqual(Int16Ty);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_s32:
    Param0 = 16;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::PointerType::getUnqual(Int16Ty);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_u16:
    Param0 = 16;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::PointerType::getUnqual(Int16Ty);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_u32:
    Param0 = 16;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::PointerType::getUnqual(Int16Ty);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_z_f32:
    Param0 = 32;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(FloatTy, 4);
    Param5 = llvm::PointerType::getUnqual(FloatTy);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_z_s32:
    Param0 = 32;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::PointerType::getUnqual(Int32Ty);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_z_u32:
    Param0 = 32;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::PointerType::getUnqual(Int32Ty);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_z_f32:
    Param0 = 32;
    Param1 = 2;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(FloatTy, 4);
    Param5 = llvm::PointerType::getUnqual(FloatTy);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_z_s32:
    Param0 = 32;
    Param1 = 2;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::PointerType::getUnqual(Int32Ty);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_z_u32:
    Param0 = 32;
    Param1 = 2;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::PointerType::getUnqual(Int32Ty);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val6});
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vldr_gather_offset_predicated, {Param4, Param5, Param6, Param3}), {(Val0.getPointer()), Val1, Val2, Val3, Val4, Val7});
}
case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_s16:
case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_s32:
case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_s8:
case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_u16:
case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_u32:
case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_u8:
case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_s64:
case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_u64:
case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_s64:
case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_u64:
case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_f16:
case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_s16:
case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_s32:
case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_u16:
case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_u32:
case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_f16:
case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_s16:
case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_s32:
case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_u16:
case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_u32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_f32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_s32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_u32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_f32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_s32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_u32: {
  uint32_t  Param0;
  uint32_t  Param1;
  uint32_t  Param2;
  llvm::Type * Param3;
  llvm::Type * Param4;
  llvm::Type * Param5;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_s16:
    Param0 = 8;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::PointerType::getUnqual(Int8Ty);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_s32:
    Param0 = 8;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::PointerType::getUnqual(Int8Ty);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_s8:
    Param0 = 8;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param4 = llvm::PointerType::getUnqual(Int8Ty);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_u16:
    Param0 = 8;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::PointerType::getUnqual(Int8Ty);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_u32:
    Param0 = 8;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::PointerType::getUnqual(Int8Ty);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_u8:
    Param0 = 8;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param4 = llvm::PointerType::getUnqual(Int8Ty);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_s64:
    Param0 = 64;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param4 = llvm::PointerType::getUnqual(Int64Ty);
    Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_u64:
    Param0 = 64;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param4 = llvm::PointerType::getUnqual(Int64Ty);
    Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_s64:
    Param0 = 64;
    Param1 = 3;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param4 = llvm::PointerType::getUnqual(Int64Ty);
    Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_u64:
    Param0 = 64;
    Param1 = 3;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param4 = llvm::PointerType::getUnqual(Int64Ty);
    Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_f16:
    Param0 = 16;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    Param4 = llvm::PointerType::getUnqual(HalfTy);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_s16:
    Param0 = 16;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::PointerType::getUnqual(Int16Ty);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_s32:
    Param0 = 16;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::PointerType::getUnqual(Int16Ty);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_u16:
    Param0 = 16;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::PointerType::getUnqual(Int16Ty);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_u32:
    Param0 = 16;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::PointerType::getUnqual(Int16Ty);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_f16:
    Param0 = 16;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    Param4 = llvm::PointerType::getUnqual(HalfTy);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_s16:
    Param0 = 16;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::PointerType::getUnqual(Int16Ty);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_s32:
    Param0 = 16;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::PointerType::getUnqual(Int16Ty);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_u16:
    Param0 = 16;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::PointerType::getUnqual(Int16Ty);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_u32:
    Param0 = 16;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::PointerType::getUnqual(Int16Ty);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_f32:
    Param0 = 32;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    Param4 = llvm::PointerType::getUnqual(FloatTy);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_s32:
    Param0 = 32;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::PointerType::getUnqual(Int32Ty);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_u32:
    Param0 = 32;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::PointerType::getUnqual(Int32Ty);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_f32:
    Param0 = 32;
    Param1 = 2;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    Param4 = llvm::PointerType::getUnqual(FloatTy);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_s32:
    Param0 = 32;
    Param1 = 2;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::PointerType::getUnqual(Int32Ty);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_u32:
    Param0 = 32;
    Param1 = 2;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::PointerType::getUnqual(Int32Ty);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Address Val0 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vldr_gather_offset, {Param3, Param4, Param5}), {(Val0.getPointer()), Val1, Val2, Val3, Val4});
}
case ARM::BI__builtin_arm_mve_vshlcq_s16:
case ARM::BI__builtin_arm_mve_vshlcq_s32:
case ARM::BI__builtin_arm_mve_vshlcq_s8:
case ARM::BI__builtin_arm_mve_vshlcq_u16:
case ARM::BI__builtin_arm_mve_vshlcq_u32:
case ARM::BI__builtin_arm_mve_vshlcq_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vshlcq_s16:
    Param0 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshlcq_s32:
    Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshlcq_s8:
    Param0 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshlcq_u16:
    Param0 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshlcq_u32:
    Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshlcq_u8:
    Param0 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Address Val0 = EmitPointerWithAlignment(E->getArg(1));
  Value *Val1 = Builder.CreateLoad(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshlc, {Param0}), {Val2, Val1, Val3});
  Value *Val5 = Builder.CreateExtractValue(Val4, static_cast<unsigned>(0));
  Builder.CreateStore(Val5, Val0);
  return Builder.CreateExtractValue(Val4, static_cast<unsigned>(1));
}
case ARM::BI__builtin_arm_mve_vddupq_m_wb_u16:
case ARM::BI__builtin_arm_mve_vddupq_m_wb_u32:
case ARM::BI__builtin_arm_mve_vddupq_m_wb_u8:
case ARM::BI__builtin_arm_mve_vidupq_m_wb_u16:
case ARM::BI__builtin_arm_mve_vidupq_m_wb_u32:
case ARM::BI__builtin_arm_mve_vidupq_m_wb_u8:
case ARM::BI__builtin_arm_mve_vshlcq_m_s16:
case ARM::BI__builtin_arm_mve_vshlcq_m_s32:
case ARM::BI__builtin_arm_mve_vshlcq_m_s8:
case ARM::BI__builtin_arm_mve_vshlcq_m_u16:
case ARM::BI__builtin_arm_mve_vshlcq_m_u32:
case ARM::BI__builtin_arm_mve_vshlcq_m_u8: {
  llvm::Type * Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  unsigned  Param3;
  unsigned  Param4;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vddupq_m_wb_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vddup_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = 1;
    Param4 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vddupq_m_wb_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vddup_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = 1;
    Param4 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vddupq_m_wb_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vddup_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param3 = 1;
    Param4 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vidupq_m_wb_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vidup_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = 1;
    Param4 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vidupq_m_wb_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vidup_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = 1;
    Param4 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vidupq_m_wb_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vidup_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param3 = 1;
    Param4 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vshlcq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vshlc_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = 0;
    Param4 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vshlcq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vshlc_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = 0;
    Param4 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vshlcq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vshlc_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param3 = 0;
    Param4 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vshlcq_m_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vshlc_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = 0;
    Param4 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vshlcq_m_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vshlc_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = 0;
    Param4 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vshlcq_m_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vshlc_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param3 = 0;
    Param4 = 1;
    break;
  }
  Address Val0 = EmitPointerWithAlignment(E->getArg(1));
  Value *Val1 = Builder.CreateLoad(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  Value *Val4 = EmitScalarExpr(E->getArg(3));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val5});
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val2, Val1, Val3, Val6});
  Value *Val8 = Builder.CreateExtractValue(Val7, static_cast<unsigned>(Param3));
  Builder.CreateStore(Val8, Val0);
  return Builder.CreateExtractValue(Val7, static_cast<unsigned>(Param4));
}
case ARM::BI__builtin_arm_mve_vdwdupq_m_wb_u16:
case ARM::BI__builtin_arm_mve_vdwdupq_m_wb_u32:
case ARM::BI__builtin_arm_mve_vdwdupq_m_wb_u8:
case ARM::BI__builtin_arm_mve_viwdupq_m_wb_u16:
case ARM::BI__builtin_arm_mve_viwdupq_m_wb_u32:
case ARM::BI__builtin_arm_mve_viwdupq_m_wb_u8: {
  llvm::Type * Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vdwdupq_m_wb_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vdwdup_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vdwdupq_m_wb_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vdwdup_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vdwdupq_m_wb_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vdwdup_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_viwdupq_m_wb_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_viwdup_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_viwdupq_m_wb_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_viwdup_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_viwdupq_m_wb_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_viwdup_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Address Val0 = EmitPointerWithAlignment(E->getArg(1));
  Value *Val1 = Builder.CreateLoad(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  Value *Val4 = EmitScalarExpr(E->getArg(3));
  Value *Val5 = EmitScalarExpr(E->getArg(4));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val6});
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val2, Val1, Val3, Val4, Val7});
  Value *Val9 = Builder.CreateExtractValue(Val8, static_cast<unsigned>(1));
  Builder.CreateStore(Val9, Val0);
  return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vld2q_f16:
case ARM::BI__builtin_arm_mve_vld2q_f32:
case ARM::BI__builtin_arm_mve_vld2q_s16:
case ARM::BI__builtin_arm_mve_vld2q_s32:
case ARM::BI__builtin_arm_mve_vld2q_s8:
case ARM::BI__builtin_arm_mve_vld2q_u16:
case ARM::BI__builtin_arm_mve_vld2q_u32:
case ARM::BI__builtin_arm_mve_vld2q_u8: {
  CustomCodeGenType = CustomCodeGen::VLD24;
  IRIntr = Intrinsic::arm_mve_vld2q;
  NumVectors = 2;
  break; // custom code gen
}
case ARM::BI__builtin_arm_mve_vld4q_f16:
case ARM::BI__builtin_arm_mve_vld4q_f32:
case ARM::BI__builtin_arm_mve_vld4q_s16:
case ARM::BI__builtin_arm_mve_vld4q_s32:
case ARM::BI__builtin_arm_mve_vld4q_s8:
case ARM::BI__builtin_arm_mve_vld4q_u16:
case ARM::BI__builtin_arm_mve_vld4q_u32:
case ARM::BI__builtin_arm_mve_vld4q_u8: {
  CustomCodeGenType = CustomCodeGen::VLD24;
  IRIntr = Intrinsic::arm_mve_vld4q;
  NumVectors = 4;
  break; // custom code gen
}
case ARM::BI__builtin_arm_mve_vst2q_f16:
case ARM::BI__builtin_arm_mve_vst2q_f32:
case ARM::BI__builtin_arm_mve_vst2q_s16:
case ARM::BI__builtin_arm_mve_vst2q_s32:
case ARM::BI__builtin_arm_mve_vst2q_s8:
case ARM::BI__builtin_arm_mve_vst2q_u16:
case ARM::BI__builtin_arm_mve_vst2q_u32:
case ARM::BI__builtin_arm_mve_vst2q_u8: {
  CustomCodeGenType = CustomCodeGen::VST24;
  IRIntr = Intrinsic::arm_mve_vst2q;
  NumVectors = 2;
  break; // custom code gen
}
case ARM::BI__builtin_arm_mve_vst4q_f16:
case ARM::BI__builtin_arm_mve_vst4q_f32:
case ARM::BI__builtin_arm_mve_vst4q_s16:
case ARM::BI__builtin_arm_mve_vst4q_s32:
case ARM::BI__builtin_arm_mve_vst4q_s8:
case ARM::BI__builtin_arm_mve_vst4q_u16:
case ARM::BI__builtin_arm_mve_vst4q_u32:
case ARM::BI__builtin_arm_mve_vst4q_u8: {
  CustomCodeGenType = CustomCodeGen::VST24;
  IRIntr = Intrinsic::arm_mve_vst4q;
  NumVectors = 4;
  break; // custom code gen
}
case ARM::BI__builtin_arm_mve_vmaxnmaq_f16:
case ARM::BI__builtin_arm_mve_vmaxnmaq_f32:
case ARM::BI__builtin_arm_mve_vminnmaq_f16:
case ARM::BI__builtin_arm_mve_vminnmaq_f32: {
  llvm::Type * Param0;
  Intrinsic::ID  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmaxnmaq_f16:
    Param0 = llvm::FixedVectorType::get(HalfTy, 8);
    Param1 = Intrinsic::maxnum;
    break;
  case ARM::BI__builtin_arm_mve_vmaxnmaq_f32:
    Param0 = llvm::FixedVectorType::get(FloatTy, 4);
    Param1 = Intrinsic::maxnum;
    break;
  case ARM::BI__builtin_arm_mve_vminnmaq_f16:
    Param0 = llvm::FixedVectorType::get(HalfTy, 8);
    Param1 = Intrinsic::minnum;
    break;
  case ARM::BI__builtin_arm_mve_vminnmaq_f32:
    Param0 = llvm::FixedVectorType::get(FloatTy, 4);
    Param1 = Intrinsic::minnum;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fabs, {Param0}), {Val0});
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fabs, {Param0}), {Val2});
  return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param0}), {Val1, Val3});
}
case ARM::BI__builtin_arm_mve_vctp16q:
case ARM::BI__builtin_arm_mve_vctp32q:
case ARM::BI__builtin_arm_mve_vctp64q:
case ARM::BI__builtin_arm_mve_vctp8q: {
  Intrinsic::ID  Param0;
  llvm::Type * Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vctp16q:
    Param0 = Intrinsic::arm_mve_vctp16;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vctp32q:
    Param0 = Intrinsic::arm_mve_vctp32;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vctp64q:
    Param0 = Intrinsic::arm_mve_vctp64;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    break;
  case ARM::BI__builtin_arm_mve_vctp8q:
    Param0 = Intrinsic::arm_mve_vctp8;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = Builder.CreateCall(CGM.getIntrinsic(Param0), {Val0});
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param1}), {Val1});
  return Builder.CreateIntCast(Val2, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vmvnq_n_s32:
case ARM::BI__builtin_arm_mve_vmvnq_n_u32: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmvnq_n_s32:
    Param0 = true;
    break;
  case ARM::BI__builtin_arm_mve_vmvnq_n_u32:
    Param0 = false;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, Param0);
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  return Builder.CreateNot(Val2);
}
case ARM::BI__builtin_arm_mve_vmvnq_n_s16:
case ARM::BI__builtin_arm_mve_vmvnq_n_u16: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmvnq_n_s16:
    Param0 = true;
    break;
  case ARM::BI__builtin_arm_mve_vmvnq_n_u16:
    Param0 = false;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateIntCast(Val1, Int16Ty, Param0);
  Value *Val3 = ARMMVEVectorSplat(Builder, Val2);
  return Builder.CreateNot(Val3);
}
case ARM::BI__builtin_arm_mve_vmaxavq_s16:
case ARM::BI__builtin_arm_mve_vmaxavq_s8:
case ARM::BI__builtin_arm_mve_vminavq_s16:
case ARM::BI__builtin_arm_mve_vminavq_s8: {
  Intrinsic::ID  Param0;
  llvm::Type * Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmaxavq_s16:
    Param0 = Intrinsic::arm_mve_maxav;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param2 = Int16Ty;
    break;
  case ARM::BI__builtin_arm_mve_vmaxavq_s8:
    Param0 = Intrinsic::arm_mve_maxav;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param2 = Int8Ty;
    break;
  case ARM::BI__builtin_arm_mve_vminavq_s16:
    Param0 = Intrinsic::arm_mve_minav;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param2 = Int16Ty;
    break;
  case ARM::BI__builtin_arm_mve_vminavq_s8:
    Param0 = Intrinsic::arm_mve_minav;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param2 = Int8Ty;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val1, Val2});
  return Builder.CreateIntCast(Val3, Param2, false);
}
case ARM::BI__builtin_arm_mve_vmaxavq_p_s16:
case ARM::BI__builtin_arm_mve_vmaxavq_p_s8:
case ARM::BI__builtin_arm_mve_vminavq_p_s16:
case ARM::BI__builtin_arm_mve_vminavq_p_s8: {
  llvm::Type * Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  llvm::Type * Param3;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmaxavq_p_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_maxav_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = Int16Ty;
    break;
  case ARM::BI__builtin_arm_mve_vmaxavq_p_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_maxav_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param3 = Int8Ty;
    break;
  case ARM::BI__builtin_arm_mve_vminavq_p_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_minav_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = Int16Ty;
    break;
  case ARM::BI__builtin_arm_mve_vminavq_p_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_minav_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param3 = Int8Ty;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val4});
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val1, Val2, Val5});
  return Builder.CreateIntCast(Val6, Param3, false);
}
case ARM::BI__builtin_arm_mve_vmaxvq_s16:
case ARM::BI__builtin_arm_mve_vmaxvq_s8:
case ARM::BI__builtin_arm_mve_vmaxvq_u16:
case ARM::BI__builtin_arm_mve_vmaxvq_u8:
case ARM::BI__builtin_arm_mve_vminvq_s16:
case ARM::BI__builtin_arm_mve_vminvq_s8:
case ARM::BI__builtin_arm_mve_vminvq_u16:
case ARM::BI__builtin_arm_mve_vminvq_u8: {
  uint32_t  Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  llvm::Type * Param3;
  bool  Param4;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmaxvq_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_maxv;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = Int16Ty;
    Param4 = true;
    break;
  case ARM::BI__builtin_arm_mve_vmaxvq_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_maxv;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param3 = Int8Ty;
    Param4 = true;
    break;
  case ARM::BI__builtin_arm_mve_vmaxvq_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_maxv;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = Int16Ty;
    Param4 = false;
    break;
  case ARM::BI__builtin_arm_mve_vmaxvq_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_maxv;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param3 = Int8Ty;
    Param4 = false;
    break;
  case ARM::BI__builtin_arm_mve_vminvq_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_minv;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = Int16Ty;
    Param4 = true;
    break;
  case ARM::BI__builtin_arm_mve_vminvq_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_minv;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param3 = Int8Ty;
    Param4 = true;
    break;
  case ARM::BI__builtin_arm_mve_vminvq_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_minv;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = Int16Ty;
    Param4 = false;
    break;
  case ARM::BI__builtin_arm_mve_vminvq_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_minv;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param3 = Int8Ty;
    Param4 = false;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2}), {Val1, Val2, Val3});
  return Builder.CreateIntCast(Val4, Param3, Param4);
}
case ARM::BI__builtin_arm_mve_vmaxvq_p_s16:
case ARM::BI__builtin_arm_mve_vmaxvq_p_s8:
case ARM::BI__builtin_arm_mve_vmaxvq_p_u16:
case ARM::BI__builtin_arm_mve_vmaxvq_p_u8:
case ARM::BI__builtin_arm_mve_vminvq_p_s16:
case ARM::BI__builtin_arm_mve_vminvq_p_s8:
case ARM::BI__builtin_arm_mve_vminvq_p_u16:
case ARM::BI__builtin_arm_mve_vminvq_p_u8: {
  uint32_t  Param0;
  llvm::Type * Param1;
  Intrinsic::ID  Param2;
  llvm::Type * Param3;
  llvm::Type * Param4;
  bool  Param5;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmaxvq_p_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_maxv_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = Int16Ty;
    Param5 = true;
    break;
  case ARM::BI__builtin_arm_mve_vmaxvq_p_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_maxv_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param4 = Int8Ty;
    Param5 = true;
    break;
  case ARM::BI__builtin_arm_mve_vmaxvq_p_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_maxv_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = Int16Ty;
    Param5 = false;
    break;
  case ARM::BI__builtin_arm_mve_vmaxvq_p_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_maxv_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param4 = Int8Ty;
    Param5 = false;
    break;
  case ARM::BI__builtin_arm_mve_vminvq_p_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_minv_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = Int16Ty;
    Param5 = true;
    break;
  case ARM::BI__builtin_arm_mve_vminvq_p_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_minv_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param4 = Int8Ty;
    Param5 = true;
    break;
  case ARM::BI__builtin_arm_mve_vminvq_p_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_minv_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = Int16Ty;
    Param5 = false;
    break;
  case ARM::BI__builtin_arm_mve_vminvq_p_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_minv_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param4 = Int8Ty;
    Param5 = false;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = EmitScalarExpr(E->getArg(2));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val5});
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param1}), {Val1, Val2, Val3, Val6});
  return Builder.CreateIntCast(Val7, Param4, Param5);
}
case ARM::BI__builtin_arm_mve_vadcq_s32:
case ARM::BI__builtin_arm_mve_vadcq_u32:
case ARM::BI__builtin_arm_mve_vsbcq_s32:
case ARM::BI__builtin_arm_mve_vsbcq_u32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vadcq_s32:
    Param0 = Intrinsic::arm_mve_vadc;
    break;
  case ARM::BI__builtin_arm_mve_vadcq_u32:
    Param0 = Intrinsic::arm_mve_vadc;
    break;
  case ARM::BI__builtin_arm_mve_vsbcq_s32:
    Param0 = Intrinsic::arm_mve_vsbc;
    break;
  case ARM::BI__builtin_arm_mve_vsbcq_u32:
    Param0 = Intrinsic::arm_mve_vsbc;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Address Val2 = EmitPointerWithAlignment(E->getArg(2));
  Value *Val3 = Builder.CreateLoad(Val2);
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, 29);
  Value *Val5 = Builder.CreateShl(Val3, Val4);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4)}), {Val0, Val1, Val5});
  Value *Val7 = llvm::ConstantInt::get(Int32Ty, 1);
  Value *Val8 = Builder.CreateExtractValue(Val6, static_cast<unsigned>(1));
  Value *Val9 = llvm::ConstantInt::get(Int32Ty, 29);
  Value *Val10 = Builder.CreateLShr(Val8, Val9);
  Value *Val11 = Builder.CreateAnd(Val7, Val10);
  Builder.CreateStore(Val11, Val2);
  return Builder.CreateExtractValue(Val6, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vcmpeqq_n_f16:
case ARM::BI__builtin_arm_mve_vcmpeqq_n_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpeqq_n_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_n_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = Builder.CreateFCmpOEQ(Val0, Val2);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
  return Builder.CreateIntCast(Val4, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpgeq_n_f16:
case ARM::BI__builtin_arm_mve_vcmpgeq_n_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpgeq_n_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgeq_n_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = Builder.CreateFCmpOGE(Val0, Val2);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
  return Builder.CreateIntCast(Val4, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpgtq_n_f16:
case ARM::BI__builtin_arm_mve_vcmpgtq_n_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpgtq_n_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgtq_n_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = Builder.CreateFCmpOGT(Val0, Val2);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
  return Builder.CreateIntCast(Val4, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpleq_n_f16:
case ARM::BI__builtin_arm_mve_vcmpleq_n_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpleq_n_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpleq_n_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = Builder.CreateFCmpOLE(Val0, Val2);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
  return Builder.CreateIntCast(Val4, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpltq_n_f16:
case ARM::BI__builtin_arm_mve_vcmpltq_n_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpltq_n_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpltq_n_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = Builder.CreateFCmpOLT(Val0, Val2);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
  return Builder.CreateIntCast(Val4, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpneq_n_f16:
case ARM::BI__builtin_arm_mve_vcmpneq_n_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpneq_n_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_n_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = Builder.CreateFCmpUNE(Val0, Val2);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
  return Builder.CreateIntCast(Val4, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpeqq_n_s16:
case ARM::BI__builtin_arm_mve_vcmpeqq_n_s32:
case ARM::BI__builtin_arm_mve_vcmpeqq_n_s8:
case ARM::BI__builtin_arm_mve_vcmpeqq_n_u16:
case ARM::BI__builtin_arm_mve_vcmpeqq_n_u32:
case ARM::BI__builtin_arm_mve_vcmpeqq_n_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpeqq_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = Builder.CreateICmpEQ(Val0, Val2);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
  return Builder.CreateIntCast(Val4, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpneq_n_s16:
case ARM::BI__builtin_arm_mve_vcmpneq_n_s32:
case ARM::BI__builtin_arm_mve_vcmpneq_n_s8:
case ARM::BI__builtin_arm_mve_vcmpneq_n_u16:
case ARM::BI__builtin_arm_mve_vcmpneq_n_u32:
case ARM::BI__builtin_arm_mve_vcmpneq_n_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpneq_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = Builder.CreateICmpNE(Val0, Val2);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
  return Builder.CreateIntCast(Val4, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpgeq_n_s16:
case ARM::BI__builtin_arm_mve_vcmpgeq_n_s32:
case ARM::BI__builtin_arm_mve_vcmpgeq_n_s8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpgeq_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgeq_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgeq_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = Builder.CreateICmpSGE(Val0, Val2);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
  return Builder.CreateIntCast(Val4, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpgtq_n_s16:
case ARM::BI__builtin_arm_mve_vcmpgtq_n_s32:
case ARM::BI__builtin_arm_mve_vcmpgtq_n_s8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpgtq_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgtq_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgtq_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = Builder.CreateICmpSGT(Val0, Val2);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
  return Builder.CreateIntCast(Val4, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpleq_n_s16:
case ARM::BI__builtin_arm_mve_vcmpleq_n_s32:
case ARM::BI__builtin_arm_mve_vcmpleq_n_s8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpleq_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpleq_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpleq_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = Builder.CreateICmpSLE(Val0, Val2);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
  return Builder.CreateIntCast(Val4, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpltq_n_s16:
case ARM::BI__builtin_arm_mve_vcmpltq_n_s32:
case ARM::BI__builtin_arm_mve_vcmpltq_n_s8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpltq_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpltq_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpltq_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
  return Builder.CreateIntCast(Val4, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpcsq_n_u16:
case ARM::BI__builtin_arm_mve_vcmpcsq_n_u32:
case ARM::BI__builtin_arm_mve_vcmpcsq_n_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpcsq_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpcsq_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpcsq_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = Builder.CreateICmpUGE(Val0, Val2);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
  return Builder.CreateIntCast(Val4, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmphiq_n_u16:
case ARM::BI__builtin_arm_mve_vcmphiq_n_u32:
case ARM::BI__builtin_arm_mve_vcmphiq_n_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmphiq_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmphiq_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmphiq_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = Builder.CreateICmpUGT(Val0, Val2);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
  return Builder.CreateIntCast(Val4, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vqdmullbq_n_s16:
case ARM::BI__builtin_arm_mve_vqdmullbq_n_s32:
case ARM::BI__builtin_arm_mve_vqdmulltq_n_s16:
case ARM::BI__builtin_arm_mve_vqdmulltq_n_s32: {
  uint32_t  Param0;
  llvm::Type * Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vqdmullbq_n_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmullbq_n_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulltq_n_s16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulltq_n_s32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vqdmull, {Param1, Param2}), {Val0, Val2, Val3});
}
case ARM::BI__builtin_arm_mve_vhaddq_n_s16:
case ARM::BI__builtin_arm_mve_vhaddq_n_s32:
case ARM::BI__builtin_arm_mve_vhaddq_n_s8:
case ARM::BI__builtin_arm_mve_vhaddq_n_u16:
case ARM::BI__builtin_arm_mve_vhaddq_n_u32:
case ARM::BI__builtin_arm_mve_vhaddq_n_u8:
case ARM::BI__builtin_arm_mve_vhsubq_n_s16:
case ARM::BI__builtin_arm_mve_vhsubq_n_s32:
case ARM::BI__builtin_arm_mve_vhsubq_n_s8:
case ARM::BI__builtin_arm_mve_vhsubq_n_u16:
case ARM::BI__builtin_arm_mve_vhsubq_n_u32:
case ARM::BI__builtin_arm_mve_vhsubq_n_u8: {
  uint32_t  Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vhaddq_n_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vhadd;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_n_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vhadd;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_n_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vhadd;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_n_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vhadd;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_n_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vhadd;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_n_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vhadd;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_n_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vhsub;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_n_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vhsub;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_n_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vhsub;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_n_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vhsub;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_n_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vhsub;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_n_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vhsub;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2}), {Val0, Val2, Val3});
}
case ARM::BI__builtin_arm_mve_vaddq_n_s16:
case ARM::BI__builtin_arm_mve_vaddq_n_s32:
case ARM::BI__builtin_arm_mve_vaddq_n_s8:
case ARM::BI__builtin_arm_mve_vaddq_n_u16:
case ARM::BI__builtin_arm_mve_vaddq_n_u32:
case ARM::BI__builtin_arm_mve_vaddq_n_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  return Builder.CreateAdd(Val0, Val2);
}
case ARM::BI__builtin_arm_mve_vqaddq_n_s16:
case ARM::BI__builtin_arm_mve_vqaddq_n_s32:
case ARM::BI__builtin_arm_mve_vqaddq_n_s8:
case ARM::BI__builtin_arm_mve_vqaddq_n_u16:
case ARM::BI__builtin_arm_mve_vqaddq_n_u32:
case ARM::BI__builtin_arm_mve_vqaddq_n_u8:
case ARM::BI__builtin_arm_mve_vqdmulhq_n_s16:
case ARM::BI__builtin_arm_mve_vqdmulhq_n_s32:
case ARM::BI__builtin_arm_mve_vqdmulhq_n_s8:
case ARM::BI__builtin_arm_mve_vqrdmulhq_n_s16:
case ARM::BI__builtin_arm_mve_vqrdmulhq_n_s32:
case ARM::BI__builtin_arm_mve_vqrdmulhq_n_s8:
case ARM::BI__builtin_arm_mve_vqsubq_n_s16:
case ARM::BI__builtin_arm_mve_vqsubq_n_s32:
case ARM::BI__builtin_arm_mve_vqsubq_n_s8:
case ARM::BI__builtin_arm_mve_vqsubq_n_u16:
case ARM::BI__builtin_arm_mve_vqsubq_n_u32:
case ARM::BI__builtin_arm_mve_vqsubq_n_u8: {
  Intrinsic::ID  Param0;
  llvm::Type * Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vqaddq_n_s16:
    Param0 = Intrinsic::sadd_sat;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_n_s32:
    Param0 = Intrinsic::sadd_sat;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_n_s8:
    Param0 = Intrinsic::sadd_sat;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_n_u16:
    Param0 = Intrinsic::uadd_sat;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_n_u32:
    Param0 = Intrinsic::uadd_sat;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_n_u8:
    Param0 = Intrinsic::uadd_sat;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulhq_n_s16:
    Param0 = Intrinsic::arm_mve_vqdmulh;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulhq_n_s32:
    Param0 = Intrinsic::arm_mve_vqdmulh;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulhq_n_s8:
    Param0 = Intrinsic::arm_mve_vqdmulh;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmulhq_n_s16:
    Param0 = Intrinsic::arm_mve_vqrdmulh;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmulhq_n_s32:
    Param0 = Intrinsic::arm_mve_vqrdmulh;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmulhq_n_s8:
    Param0 = Intrinsic::arm_mve_vqrdmulh;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_n_s16:
    Param0 = Intrinsic::ssub_sat;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_n_s32:
    Param0 = Intrinsic::ssub_sat;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_n_s8:
    Param0 = Intrinsic::ssub_sat;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_n_u16:
    Param0 = Intrinsic::usub_sat;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_n_u32:
    Param0 = Intrinsic::usub_sat;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_n_u8:
    Param0 = Intrinsic::usub_sat;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0, Val2});
}
case ARM::BI__builtin_arm_mve_vaddq_n_f16:
case ARM::BI__builtin_arm_mve_vaddq_n_f32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  return Builder.CreateFAdd(Val0, Val2);
}
case ARM::BI__builtin_arm_mve_vmulq_n_f16:
case ARM::BI__builtin_arm_mve_vmulq_n_f32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  return Builder.CreateFMul(Val0, Val2);
}
case ARM::BI__builtin_arm_mve_vsubq_n_f16:
case ARM::BI__builtin_arm_mve_vsubq_n_f32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  return Builder.CreateFSub(Val0, Val2);
}
case ARM::BI__builtin_arm_mve_vmulq_n_s16:
case ARM::BI__builtin_arm_mve_vmulq_n_s32:
case ARM::BI__builtin_arm_mve_vmulq_n_s8:
case ARM::BI__builtin_arm_mve_vmulq_n_u16:
case ARM::BI__builtin_arm_mve_vmulq_n_u32:
case ARM::BI__builtin_arm_mve_vmulq_n_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  return Builder.CreateMul(Val0, Val2);
}
case ARM::BI__builtin_arm_mve_vsubq_n_s16:
case ARM::BI__builtin_arm_mve_vsubq_n_s32:
case ARM::BI__builtin_arm_mve_vsubq_n_s8:
case ARM::BI__builtin_arm_mve_vsubq_n_u16:
case ARM::BI__builtin_arm_mve_vsubq_n_u32:
case ARM::BI__builtin_arm_mve_vsubq_n_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  return Builder.CreateSub(Val0, Val2);
}
case ARM::BI__builtin_arm_mve_vmaxnmavq_f16:
case ARM::BI__builtin_arm_mve_vmaxnmavq_f32:
case ARM::BI__builtin_arm_mve_vmaxnmvq_f16:
case ARM::BI__builtin_arm_mve_vmaxnmvq_f32:
case ARM::BI__builtin_arm_mve_vminnmavq_f16:
case ARM::BI__builtin_arm_mve_vminnmavq_f32:
case ARM::BI__builtin_arm_mve_vminnmvq_f16:
case ARM::BI__builtin_arm_mve_vminnmvq_f32: {
  Intrinsic::ID  Param0;
  llvm::Type * Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmaxnmavq_f16:
    Param0 = Intrinsic::arm_mve_maxnmav;
    Param1 = HalfTy;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmaxnmavq_f32:
    Param0 = Intrinsic::arm_mve_maxnmav;
    Param1 = FloatTy;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmaxnmvq_f16:
    Param0 = Intrinsic::arm_mve_maxnmv;
    Param1 = HalfTy;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmaxnmvq_f32:
    Param0 = Intrinsic::arm_mve_maxnmv;
    Param1 = FloatTy;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vminnmavq_f16:
    Param0 = Intrinsic::arm_mve_minnmav;
    Param1 = HalfTy;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vminnmavq_f32:
    Param0 = Intrinsic::arm_mve_minnmav;
    Param1 = FloatTy;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vminnmvq_f16:
    Param0 = Intrinsic::arm_mve_minnmv;
    Param1 = HalfTy;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vminnmvq_f32:
    Param0 = Intrinsic::arm_mve_minnmv;
    Param1 = FloatTy;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1, Param2}), {Val0, Val1});
  return (Val2);
}
case ARM::BI__builtin_arm_mve_vddupq_n_u16:
case ARM::BI__builtin_arm_mve_vddupq_n_u32:
case ARM::BI__builtin_arm_mve_vddupq_n_u8:
case ARM::BI__builtin_arm_mve_vidupq_n_u16:
case ARM::BI__builtin_arm_mve_vidupq_n_u32:
case ARM::BI__builtin_arm_mve_vidupq_n_u8: {
  Intrinsic::ID  Param0;
  llvm::Type * Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vddupq_n_u16:
    Param0 = Intrinsic::arm_mve_vddup;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vddupq_n_u32:
    Param0 = Intrinsic::arm_mve_vddup;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vddupq_n_u8:
    Param0 = Intrinsic::arm_mve_vddup;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vidupq_n_u16:
    Param0 = Intrinsic::arm_mve_vidup;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vidupq_n_u32:
    Param0 = Intrinsic::arm_mve_vidup;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vidupq_n_u8:
    Param0 = Intrinsic::arm_mve_vidup;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0, Val1});
  return Builder.CreateExtractValue(Val2, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vmaxavq_s32:
case ARM::BI__builtin_arm_mve_vminavq_s32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmaxavq_s32:
    Param0 = Intrinsic::arm_mve_maxav;
    break;
  case ARM::BI__builtin_arm_mve_vminavq_s32:
    Param0 = Intrinsic::arm_mve_minav;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4)}), {Val0, Val1});
  return Builder.CreateIntCast(Val2, Int32Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpeqq_f16:
case ARM::BI__builtin_arm_mve_vcmpeqq_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpeqq_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateFCmpOEQ(Val0, Val1);
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
  return Builder.CreateIntCast(Val3, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpgeq_f16:
case ARM::BI__builtin_arm_mve_vcmpgeq_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpgeq_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgeq_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateFCmpOGE(Val0, Val1);
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
  return Builder.CreateIntCast(Val3, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpgtq_f16:
case ARM::BI__builtin_arm_mve_vcmpgtq_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpgtq_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgtq_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateFCmpOGT(Val0, Val1);
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
  return Builder.CreateIntCast(Val3, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpleq_f16:
case ARM::BI__builtin_arm_mve_vcmpleq_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpleq_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpleq_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateFCmpOLE(Val0, Val1);
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
  return Builder.CreateIntCast(Val3, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpltq_f16:
case ARM::BI__builtin_arm_mve_vcmpltq_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpltq_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpltq_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateFCmpOLT(Val0, Val1);
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
  return Builder.CreateIntCast(Val3, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpneq_f16:
case ARM::BI__builtin_arm_mve_vcmpneq_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpneq_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateFCmpUNE(Val0, Val1);
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
  return Builder.CreateIntCast(Val3, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpeqq_s16:
case ARM::BI__builtin_arm_mve_vcmpeqq_s32:
case ARM::BI__builtin_arm_mve_vcmpeqq_s8:
case ARM::BI__builtin_arm_mve_vcmpeqq_u16:
case ARM::BI__builtin_arm_mve_vcmpeqq_u32:
case ARM::BI__builtin_arm_mve_vcmpeqq_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpeqq_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateICmpEQ(Val0, Val1);
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
  return Builder.CreateIntCast(Val3, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpneq_s16:
case ARM::BI__builtin_arm_mve_vcmpneq_s32:
case ARM::BI__builtin_arm_mve_vcmpneq_s8:
case ARM::BI__builtin_arm_mve_vcmpneq_u16:
case ARM::BI__builtin_arm_mve_vcmpneq_u32:
case ARM::BI__builtin_arm_mve_vcmpneq_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpneq_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateICmpNE(Val0, Val1);
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
  return Builder.CreateIntCast(Val3, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpgeq_s16:
case ARM::BI__builtin_arm_mve_vcmpgeq_s32:
case ARM::BI__builtin_arm_mve_vcmpgeq_s8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpgeq_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgeq_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgeq_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateICmpSGE(Val0, Val1);
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
  return Builder.CreateIntCast(Val3, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vmaxq_s16:
case ARM::BI__builtin_arm_mve_vmaxq_s32:
case ARM::BI__builtin_arm_mve_vmaxq_s8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateICmpSGE(Val0, Val1);
  return Builder.CreateSelect(Val2, Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vcmpgtq_s16:
case ARM::BI__builtin_arm_mve_vcmpgtq_s32:
case ARM::BI__builtin_arm_mve_vcmpgtq_s8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpgtq_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgtq_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgtq_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateICmpSGT(Val0, Val1);
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
  return Builder.CreateIntCast(Val3, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpleq_s16:
case ARM::BI__builtin_arm_mve_vcmpleq_s32:
case ARM::BI__builtin_arm_mve_vcmpleq_s8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpleq_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpleq_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpleq_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateICmpSLE(Val0, Val1);
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
  return Builder.CreateIntCast(Val3, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vminq_s16:
case ARM::BI__builtin_arm_mve_vminq_s32:
case ARM::BI__builtin_arm_mve_vminq_s8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateICmpSLE(Val0, Val1);
  return Builder.CreateSelect(Val2, Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vcmpltq_s16:
case ARM::BI__builtin_arm_mve_vcmpltq_s32:
case ARM::BI__builtin_arm_mve_vcmpltq_s8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpltq_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpltq_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpltq_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateICmpSLT(Val0, Val1);
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
  return Builder.CreateIntCast(Val3, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpcsq_u16:
case ARM::BI__builtin_arm_mve_vcmpcsq_u32:
case ARM::BI__builtin_arm_mve_vcmpcsq_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpcsq_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpcsq_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpcsq_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateICmpUGE(Val0, Val1);
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
  return Builder.CreateIntCast(Val3, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vmaxq_u16:
case ARM::BI__builtin_arm_mve_vmaxq_u32:
case ARM::BI__builtin_arm_mve_vmaxq_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateICmpUGE(Val0, Val1);
  return Builder.CreateSelect(Val2, Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vcmphiq_u16:
case ARM::BI__builtin_arm_mve_vcmphiq_u32:
case ARM::BI__builtin_arm_mve_vcmphiq_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmphiq_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmphiq_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmphiq_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateICmpUGT(Val0, Val1);
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
  return Builder.CreateIntCast(Val3, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vminq_u16:
case ARM::BI__builtin_arm_mve_vminq_u32:
case ARM::BI__builtin_arm_mve_vminq_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateICmpULE(Val0, Val1);
  return Builder.CreateSelect(Val2, Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vbicq_n_s32:
case ARM::BI__builtin_arm_mve_vbicq_n_u32: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vbicq_n_s32:
    Param0 = true;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_n_u32:
    Param0 = false;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateIntCast(Val1, Int32Ty, Param0);
  Value *Val3 = ARMMVEVectorSplat(Builder, Val2);
  Value *Val4 = Builder.CreateNot(Val3);
  return Builder.CreateAnd(Val0, Val4);
}
case ARM::BI__builtin_arm_mve_vorrq_n_s32:
case ARM::BI__builtin_arm_mve_vorrq_n_u32: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vorrq_n_s32:
    Param0 = true;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_n_u32:
    Param0 = false;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateIntCast(Val1, Int32Ty, Param0);
  Value *Val3 = ARMMVEVectorSplat(Builder, Val2);
  return Builder.CreateOr(Val0, Val3);
}
case ARM::BI__builtin_arm_mve_vbicq_n_s16:
case ARM::BI__builtin_arm_mve_vbicq_n_u16: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vbicq_n_s16:
    Param0 = true;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_n_u16:
    Param0 = false;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateIntCast(Val1, Int32Ty, false);
  Value *Val3 = Builder.CreateIntCast(Val2, Int16Ty, Param0);
  Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
  Value *Val5 = Builder.CreateNot(Val4);
  return Builder.CreateAnd(Val0, Val5);
}
case ARM::BI__builtin_arm_mve_vorrq_n_s16:
case ARM::BI__builtin_arm_mve_vorrq_n_u16: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vorrq_n_s16:
    Param0 = true;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_n_u16:
    Param0 = false;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateIntCast(Val1, Int32Ty, false);
  Value *Val3 = Builder.CreateIntCast(Val2, Int16Ty, Param0);
  Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
  return Builder.CreateOr(Val0, Val4);
}
case ARM::BI__builtin_arm_mve_vshlq_n_s16:
case ARM::BI__builtin_arm_mve_vshlq_n_s32:
case ARM::BI__builtin_arm_mve_vshlq_n_s8:
case ARM::BI__builtin_arm_mve_vshlq_n_u16:
case ARM::BI__builtin_arm_mve_vshlq_n_u32:
case ARM::BI__builtin_arm_mve_vshlq_n_u8: {
  llvm::Type * Param0;
  bool  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vshlq_n_s16:
    Param0 = Int16Ty;
    Param1 = true;
    break;
  case ARM::BI__builtin_arm_mve_vshlq_n_s32:
    Param0 = Int32Ty;
    Param1 = true;
    break;
  case ARM::BI__builtin_arm_mve_vshlq_n_s8:
    Param0 = Int8Ty;
    Param1 = true;
    break;
  case ARM::BI__builtin_arm_mve_vshlq_n_u16:
    Param0 = Int16Ty;
    Param1 = false;
    break;
  case ARM::BI__builtin_arm_mve_vshlq_n_u32:
    Param0 = Int32Ty;
    Param1 = false;
    break;
  case ARM::BI__builtin_arm_mve_vshlq_n_u8:
    Param0 = Int8Ty;
    Param1 = false;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateIntCast(Val1, Param0, Param1);
  Value *Val3 = ARMMVEVectorSplat(Builder, Val2);
  return Builder.CreateShl(Val0, Val3);
}
case ARM::BI__builtin_arm_mve_vmlasq_n_s16:
case ARM::BI__builtin_arm_mve_vmlasq_n_s32:
case ARM::BI__builtin_arm_mve_vmlasq_n_s8:
case ARM::BI__builtin_arm_mve_vmlasq_n_u16:
case ARM::BI__builtin_arm_mve_vmlasq_n_u32:
case ARM::BI__builtin_arm_mve_vmlasq_n_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateMul(Val0, Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
  return Builder.CreateAdd(Val2, Val4);
}
case ARM::BI__builtin_arm_mve_vbicq_s16:
case ARM::BI__builtin_arm_mve_vbicq_s32:
case ARM::BI__builtin_arm_mve_vbicq_s8:
case ARM::BI__builtin_arm_mve_vbicq_u16:
case ARM::BI__builtin_arm_mve_vbicq_u32:
case ARM::BI__builtin_arm_mve_vbicq_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateNot(Val1);
  return Builder.CreateAnd(Val0, Val2);
}
case ARM::BI__builtin_arm_mve_vornq_s16:
case ARM::BI__builtin_arm_mve_vornq_s32:
case ARM::BI__builtin_arm_mve_vornq_s8:
case ARM::BI__builtin_arm_mve_vornq_u16:
case ARM::BI__builtin_arm_mve_vornq_u32:
case ARM::BI__builtin_arm_mve_vornq_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = Builder.CreateNot(Val1);
  return Builder.CreateOr(Val0, Val2);
}
case ARM::BI__builtin_arm_mve_vadcq_m_s32:
case ARM::BI__builtin_arm_mve_vadcq_m_u32:
case ARM::BI__builtin_arm_mve_vsbcq_m_s32:
case ARM::BI__builtin_arm_mve_vsbcq_m_u32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vadcq_m_s32:
    Param0 = Intrinsic::arm_mve_vadc_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vadcq_m_u32:
    Param0 = Intrinsic::arm_mve_vadc_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsbcq_m_s32:
    Param0 = Intrinsic::arm_mve_vsbc_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsbcq_m_u32:
    Param0 = Intrinsic::arm_mve_vsbc_predicated;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Address Val3 = EmitPointerWithAlignment(E->getArg(3));
  Value *Val4 = Builder.CreateLoad(Val3);
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, 29);
  Value *Val6 = Builder.CreateShl(Val4, Val5);
  Value *Val7 = EmitScalarExpr(E->getArg(4));
  Value *Val8 = Builder.CreateIntCast(Val7, Int32Ty, false);
  Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val8});
  Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val0, Val1, Val2, Val6, Val9});
  Value *Val11 = llvm::ConstantInt::get(Int32Ty, 1);
  Value *Val12 = Builder.CreateExtractValue(Val10, static_cast<unsigned>(1));
  Value *Val13 = llvm::ConstantInt::get(Int32Ty, 29);
  Value *Val14 = Builder.CreateLShr(Val12, Val13);
  Value *Val15 = Builder.CreateAnd(Val11, Val14);
  Builder.CreateStore(Val15, Val3);
  return Builder.CreateExtractValue(Val10, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vdwdupq_n_u16:
case ARM::BI__builtin_arm_mve_vdwdupq_n_u32:
case ARM::BI__builtin_arm_mve_vdwdupq_n_u8:
case ARM::BI__builtin_arm_mve_viwdupq_n_u16:
case ARM::BI__builtin_arm_mve_viwdupq_n_u32:
case ARM::BI__builtin_arm_mve_viwdupq_n_u8: {
  Intrinsic::ID  Param0;
  llvm::Type * Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vdwdupq_n_u16:
    Param0 = Intrinsic::arm_mve_vdwdup;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vdwdupq_n_u32:
    Param0 = Intrinsic::arm_mve_vdwdup;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vdwdupq_n_u8:
    Param0 = Intrinsic::arm_mve_vdwdup;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_viwdupq_n_u16:
    Param0 = Intrinsic::arm_mve_viwdup;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_viwdupq_n_u32:
    Param0 = Intrinsic::arm_mve_viwdup;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_viwdupq_n_u8:
    Param0 = Intrinsic::arm_mve_viwdup;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0, Val1, Val2});
  return Builder.CreateExtractValue(Val3, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vmaxnmavq_p_f16:
case ARM::BI__builtin_arm_mve_vmaxnmavq_p_f32:
case ARM::BI__builtin_arm_mve_vmaxnmvq_p_f16:
case ARM::BI__builtin_arm_mve_vmaxnmvq_p_f32:
case ARM::BI__builtin_arm_mve_vminnmavq_p_f16:
case ARM::BI__builtin_arm_mve_vminnmavq_p_f32:
case ARM::BI__builtin_arm_mve_vminnmvq_p_f16:
case ARM::BI__builtin_arm_mve_vminnmvq_p_f32: {
  llvm::Type * Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  llvm::Type * Param3;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmaxnmavq_p_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_maxnmav_predicated;
    Param2 = HalfTy;
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmaxnmavq_p_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_maxnmav_predicated;
    Param2 = FloatTy;
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmaxnmvq_p_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_maxnmv_predicated;
    Param2 = HalfTy;
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmaxnmvq_p_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_maxnmv_predicated;
    Param2 = FloatTy;
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vminnmavq_p_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_minnmav_predicated;
    Param2 = HalfTy;
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vminnmavq_p_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_minnmav_predicated;
    Param2 = FloatTy;
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vminnmvq_p_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_minnmv_predicated;
    Param2 = HalfTy;
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vminnmvq_p_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_minnmv_predicated;
    Param2 = FloatTy;
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val3});
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param3, Param0}), {Val0, Val1, Val4});
  return (Val5);
}
case ARM::BI__builtin_arm_mve_vldrdq_gather_base_z_s64:
case ARM::BI__builtin_arm_mve_vldrdq_gather_base_z_u64:
case ARM::BI__builtin_arm_mve_vldrwq_gather_base_z_f32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_base_z_s32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_base_z_u32: {
  llvm::Type * Param0;
  llvm::Type * Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vldrdq_gather_base_z_s64:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vldrdq_gather_base_z_u64:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_base_z_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_base_z_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_base_z_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val3});
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vldr_gather_base_predicated, {Param1, Param2, Param0}), {Val0, Val1, Val4});
}
case ARM::BI__builtin_arm_mve_vmaxaq_m_s16:
case ARM::BI__builtin_arm_mve_vmaxaq_m_s32:
case ARM::BI__builtin_arm_mve_vmaxaq_m_s8:
case ARM::BI__builtin_arm_mve_vmaxnmaq_m_f16:
case ARM::BI__builtin_arm_mve_vmaxnmaq_m_f32:
case ARM::BI__builtin_arm_mve_vminaq_m_s16:
case ARM::BI__builtin_arm_mve_vminaq_m_s32:
case ARM::BI__builtin_arm_mve_vminaq_m_s8:
case ARM::BI__builtin_arm_mve_vminnmaq_m_f16:
case ARM::BI__builtin_arm_mve_vminnmaq_m_f32: {
  llvm::Type * Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmaxaq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vmaxa_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmaxaq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vmaxa_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmaxaq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vmaxa_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmaxnmaq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vmaxnma_predicated;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmaxnmaq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vmaxnma_predicated;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vminaq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vmina_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vminaq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vmina_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vminaq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vmina_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vminnmaq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vminnma_predicated;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vminnmaq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vminnma_predicated;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val3});
  return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val1, Val4});
}
case ARM::BI__builtin_arm_mve_vmaxavq_p_s32:
case ARM::BI__builtin_arm_mve_vminavq_p_s32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmaxavq_p_s32:
    Param0 = Intrinsic::arm_mve_maxav_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vminavq_p_s32:
    Param0 = Intrinsic::arm_mve_minav_predicated;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val3});
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val0, Val1, Val4});
  return Builder.CreateIntCast(Val5, Int32Ty, false);
}
case ARM::BI__builtin_arm_mve_vmlaq_m_n_s16:
case ARM::BI__builtin_arm_mve_vmlaq_m_n_s8:
case ARM::BI__builtin_arm_mve_vmlaq_m_n_u16:
case ARM::BI__builtin_arm_mve_vmlaq_m_n_u8:
case ARM::BI__builtin_arm_mve_vmlasq_m_n_s16:
case ARM::BI__builtin_arm_mve_vmlasq_m_n_s8:
case ARM::BI__builtin_arm_mve_vmlasq_m_n_u16:
case ARM::BI__builtin_arm_mve_vmlasq_m_n_u8:
case ARM::BI__builtin_arm_mve_vqdmlahq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqdmlahq_m_n_s8:
case ARM::BI__builtin_arm_mve_vqdmlashq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqdmlashq_m_n_s8:
case ARM::BI__builtin_arm_mve_vqrdmlahq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqrdmlahq_m_n_s8:
case ARM::BI__builtin_arm_mve_vqrdmlashq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqrdmlashq_m_n_s8: {
  llvm::Type * Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmlaq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vmla_n_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlaq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vmla_n_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmlaq_m_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vmla_n_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlaq_m_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vmla_n_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmlasq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vmlas_n_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlasq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vmlas_n_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmlasq_m_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vmlas_n_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlasq_m_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vmlas_n_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlahq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vqdmlah_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlahq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vqdmlah_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlashq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vqdmlash_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlashq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vqdmlash_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlahq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vqrdmlah_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlahq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vqrdmlah_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlashq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vqrdmlash_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlashq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vqrdmlash_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = EmitScalarExpr(E->getArg(3));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val5});
  return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val1, Val3, Val6});
}
case ARM::BI__builtin_arm_mve_vqdmlahq_n_s16:
case ARM::BI__builtin_arm_mve_vqdmlahq_n_s8:
case ARM::BI__builtin_arm_mve_vqdmlashq_n_s16:
case ARM::BI__builtin_arm_mve_vqdmlashq_n_s8:
case ARM::BI__builtin_arm_mve_vqrdmlahq_n_s16:
case ARM::BI__builtin_arm_mve_vqrdmlahq_n_s8:
case ARM::BI__builtin_arm_mve_vqrdmlashq_n_s16:
case ARM::BI__builtin_arm_mve_vqrdmlashq_n_s8: {
  Intrinsic::ID  Param0;
  llvm::Type * Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vqdmlahq_n_s16:
    Param0 = Intrinsic::arm_mve_vqdmlah;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlahq_n_s8:
    Param0 = Intrinsic::arm_mve_vqdmlah;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlashq_n_s16:
    Param0 = Intrinsic::arm_mve_vqdmlash;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlashq_n_s8:
    Param0 = Intrinsic::arm_mve_vqdmlash;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlahq_n_s16:
    Param0 = Intrinsic::arm_mve_vqrdmlah;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlahq_n_s8:
    Param0 = Intrinsic::arm_mve_vqrdmlah;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlashq_n_s16:
    Param0 = Intrinsic::arm_mve_vqrdmlash;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlashq_n_s8:
    Param0 = Intrinsic::arm_mve_vqrdmlash;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0, Val1, Val3});
}
case ARM::BI__builtin_arm_mve_vddupq_m_n_u16:
case ARM::BI__builtin_arm_mve_vddupq_m_n_u32:
case ARM::BI__builtin_arm_mve_vddupq_m_n_u8:
case ARM::BI__builtin_arm_mve_vidupq_m_n_u16:
case ARM::BI__builtin_arm_mve_vidupq_m_n_u32:
case ARM::BI__builtin_arm_mve_vidupq_m_n_u8: {
  llvm::Type * Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vddupq_m_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vddup_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vddupq_m_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vddup_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vddupq_m_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vddup_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vidupq_m_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vidup_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vidupq_m_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vidup_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vidupq_m_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vidup_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = EmitScalarExpr(E->getArg(3));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val4});
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val1, Val2, Val5});
  return Builder.CreateExtractValue(Val6, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_p_s64:
case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_p_u64:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_p_f32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_p_s32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_p_u32: {
  llvm::Type * Param0;
  llvm::Type * Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_p_s64:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_p_u64:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_p_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_p_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_p_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = EmitScalarExpr(E->getArg(3));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val4});
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vstr_scatter_base_predicated, {Param1, Param2, Param0}), {Val0, Val1, Val2, Val5});
}
case ARM::BI__builtin_arm_mve_vbrsrq_m_n_f16:
case ARM::BI__builtin_arm_mve_vbrsrq_m_n_f32:
case ARM::BI__builtin_arm_mve_vbrsrq_m_n_s16:
case ARM::BI__builtin_arm_mve_vbrsrq_m_n_s32:
case ARM::BI__builtin_arm_mve_vbrsrq_m_n_s8:
case ARM::BI__builtin_arm_mve_vbrsrq_m_n_u16:
case ARM::BI__builtin_arm_mve_vbrsrq_m_n_u32:
case ARM::BI__builtin_arm_mve_vbrsrq_m_n_u8:
case ARM::BI__builtin_arm_mve_vmlaq_m_n_s32:
case ARM::BI__builtin_arm_mve_vmlaq_m_n_u32:
case ARM::BI__builtin_arm_mve_vmlasq_m_n_s32:
case ARM::BI__builtin_arm_mve_vmlasq_m_n_u32:
case ARM::BI__builtin_arm_mve_vqdmlahq_m_n_s32:
case ARM::BI__builtin_arm_mve_vqdmlashq_m_n_s32:
case ARM::BI__builtin_arm_mve_vqrdmlahq_m_n_s32:
case ARM::BI__builtin_arm_mve_vqrdmlashq_m_n_s32:
case ARM::BI__builtin_arm_mve_vsliq_m_n_s16:
case ARM::BI__builtin_arm_mve_vsliq_m_n_s32:
case ARM::BI__builtin_arm_mve_vsliq_m_n_s8:
case ARM::BI__builtin_arm_mve_vsliq_m_n_u16:
case ARM::BI__builtin_arm_mve_vsliq_m_n_u32:
case ARM::BI__builtin_arm_mve_vsliq_m_n_u8:
case ARM::BI__builtin_arm_mve_vsriq_m_n_s16:
case ARM::BI__builtin_arm_mve_vsriq_m_n_s32:
case ARM::BI__builtin_arm_mve_vsriq_m_n_s8:
case ARM::BI__builtin_arm_mve_vsriq_m_n_u16:
case ARM::BI__builtin_arm_mve_vsriq_m_n_u32:
case ARM::BI__builtin_arm_mve_vsriq_m_n_u8: {
  llvm::Type * Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vbrsrq_m_n_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vbrsr_predicated;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vbrsrq_m_n_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vbrsr_predicated;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vbrsrq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vbrsr_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vbrsrq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vbrsr_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vbrsrq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vbrsr_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vbrsrq_m_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vbrsr_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vbrsrq_m_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vbrsr_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vbrsrq_m_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vbrsr_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmlaq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vmla_n_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlaq_m_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vmla_n_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlasq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vmlas_n_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlasq_m_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vmlas_n_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlahq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vqdmlah_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlashq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vqdmlash_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlahq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vqrdmlah_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlashq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vqrdmlash_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vsliq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vsli_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vsliq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vsli_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vsliq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vsli_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vsliq_m_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vsli_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vsliq_m_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vsli_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vsliq_m_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vsli_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vsriq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vsri_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vsriq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vsri_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vsriq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vsri_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vsriq_m_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vsri_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vsriq_m_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vsri_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vsriq_m_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vsri_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = EmitScalarExpr(E->getArg(3));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val4});
  return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val1, Val2, Val5});
}
case ARM::BI__builtin_arm_mve_vdwdupq_m_n_u16:
case ARM::BI__builtin_arm_mve_vdwdupq_m_n_u32:
case ARM::BI__builtin_arm_mve_vdwdupq_m_n_u8:
case ARM::BI__builtin_arm_mve_viwdupq_m_n_u16:
case ARM::BI__builtin_arm_mve_viwdupq_m_n_u32:
case ARM::BI__builtin_arm_mve_viwdupq_m_n_u8: {
  llvm::Type * Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vdwdupq_m_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vdwdup_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vdwdupq_m_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vdwdup_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vdwdupq_m_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vdwdup_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_viwdupq_m_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_viwdup_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_viwdupq_m_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_viwdup_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_viwdupq_m_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_viwdup_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = EmitScalarExpr(E->getArg(3));
  Value *Val4 = EmitScalarExpr(E->getArg(4));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val5});
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val1, Val2, Val3, Val6});
  return Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vadciq_m_s32:
case ARM::BI__builtin_arm_mve_vadciq_m_u32:
case ARM::BI__builtin_arm_mve_vsbciq_m_s32:
case ARM::BI__builtin_arm_mve_vsbciq_m_u32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vadciq_m_s32:
    Param0 = Intrinsic::arm_mve_vadc_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vadciq_m_u32:
    Param0 = Intrinsic::arm_mve_vadc_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsbciq_m_s32:
    Param0 = Intrinsic::arm_mve_vsbc_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsbciq_m_u32:
    Param0 = Intrinsic::arm_mve_vsbc_predicated;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, 0);
  Value *Val4 = EmitScalarExpr(E->getArg(4));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val0, Val1, Val2, Val3, Val6});
  Value *Val8 = llvm::ConstantInt::get(Int32Ty, 1);
  Value *Val9 = Builder.CreateExtractValue(Val7, static_cast<unsigned>(1));
  Value *Val10 = llvm::ConstantInt::get(Int32Ty, 29);
  Value *Val11 = Builder.CreateLShr(Val9, Val10);
  Value *Val12 = Builder.CreateAnd(Val8, Val11);
  Address Val13 = EmitPointerWithAlignment(E->getArg(3));
  Builder.CreateStore(Val12, Val13);
  return Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vqdmladhq_m_s16:
case ARM::BI__builtin_arm_mve_vqdmladhq_m_s32:
case ARM::BI__builtin_arm_mve_vqdmladhq_m_s8:
case ARM::BI__builtin_arm_mve_vqdmladhxq_m_s16:
case ARM::BI__builtin_arm_mve_vqdmladhxq_m_s32:
case ARM::BI__builtin_arm_mve_vqdmladhxq_m_s8:
case ARM::BI__builtin_arm_mve_vqdmlsdhq_m_s16:
case ARM::BI__builtin_arm_mve_vqdmlsdhq_m_s32:
case ARM::BI__builtin_arm_mve_vqdmlsdhq_m_s8:
case ARM::BI__builtin_arm_mve_vqdmlsdhxq_m_s16:
case ARM::BI__builtin_arm_mve_vqdmlsdhxq_m_s32:
case ARM::BI__builtin_arm_mve_vqdmlsdhxq_m_s8:
case ARM::BI__builtin_arm_mve_vqrdmladhq_m_s16:
case ARM::BI__builtin_arm_mve_vqrdmladhq_m_s32:
case ARM::BI__builtin_arm_mve_vqrdmladhq_m_s8:
case ARM::BI__builtin_arm_mve_vqrdmladhxq_m_s16:
case ARM::BI__builtin_arm_mve_vqrdmladhxq_m_s32:
case ARM::BI__builtin_arm_mve_vqrdmladhxq_m_s8:
case ARM::BI__builtin_arm_mve_vqrdmlsdhq_m_s16:
case ARM::BI__builtin_arm_mve_vqrdmlsdhq_m_s32:
case ARM::BI__builtin_arm_mve_vqrdmlsdhq_m_s8:
case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_m_s16:
case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_m_s32:
case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_m_s8: {
  uint32_t  Param0;
  uint32_t  Param1;
  uint32_t  Param2;
  llvm::Type * Param3;
  llvm::Type * Param4;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vqdmladhq_m_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmladhq_m_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqdmladhq_m_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqdmladhxq_m_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmladhxq_m_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqdmladhxq_m_s8:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlsdhq_m_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlsdhq_m_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlsdhq_m_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlsdhxq_m_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlsdhxq_m_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlsdhxq_m_s8:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmladhq_m_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmladhq_m_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmladhq_m_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmladhxq_m_s16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmladhxq_m_s32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmladhxq_m_s8:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlsdhq_m_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlsdhq_m_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlsdhq_m_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_m_s16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_m_s32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_m_s8:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param2);
  Value *Val6 = EmitScalarExpr(E->getArg(3));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val7});
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vqdmlad_predicated, {Param4, Param3}), {Val0, Val1, Val2, Val3, Val4, Val5, Val8});
}
case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_s32:
case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_u16:
case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_u32:
case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_s32:
case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_u16:
case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_u32:
case ARM::BI__builtin_arm_mve_vqrshrunbq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqrshrunbq_m_n_s32:
case ARM::BI__builtin_arm_mve_vqrshruntq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqrshruntq_m_n_s32:
case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_s32:
case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_u16:
case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_u32:
case ARM::BI__builtin_arm_mve_vqshrntq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqshrntq_m_n_s32:
case ARM::BI__builtin_arm_mve_vqshrntq_m_n_u16:
case ARM::BI__builtin_arm_mve_vqshrntq_m_n_u32:
case ARM::BI__builtin_arm_mve_vqshrunbq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqshrunbq_m_n_s32:
case ARM::BI__builtin_arm_mve_vqshruntq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqshruntq_m_n_s32:
case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_s16:
case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_s32:
case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_u16:
case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_u32:
case ARM::BI__builtin_arm_mve_vrshrntq_m_n_s16:
case ARM::BI__builtin_arm_mve_vrshrntq_m_n_s32:
case ARM::BI__builtin_arm_mve_vrshrntq_m_n_u16:
case ARM::BI__builtin_arm_mve_vrshrntq_m_n_u32:
case ARM::BI__builtin_arm_mve_vshrnbq_m_n_s16:
case ARM::BI__builtin_arm_mve_vshrnbq_m_n_s32:
case ARM::BI__builtin_arm_mve_vshrnbq_m_n_u16:
case ARM::BI__builtin_arm_mve_vshrnbq_m_n_u32:
case ARM::BI__builtin_arm_mve_vshrntq_m_n_s16:
case ARM::BI__builtin_arm_mve_vshrntq_m_n_s32:
case ARM::BI__builtin_arm_mve_vshrntq_m_n_u16:
case ARM::BI__builtin_arm_mve_vshrntq_m_n_u32: {
  uint32_t  Param0;
  uint32_t  Param1;
  uint32_t  Param2;
  uint32_t  Param3;
  uint32_t  Param4;
  llvm::Type * Param5;
  llvm::Type * Param6;
  llvm::Type * Param7;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_s16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_s32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = 1;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_u32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = 1;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_s16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_s32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = 1;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_u32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = 1;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrshrunbq_m_n_s16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshrunbq_m_n_s32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrshruntq_m_n_s16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshruntq_m_n_s32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = 1;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = 1;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshrntq_m_n_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshrntq_m_n_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshrntq_m_n_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = 1;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshrntq_m_n_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = 1;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshrunbq_m_n_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshrunbq_m_n_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshruntq_m_n_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshruntq_m_n_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_u16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = 1;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_u32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = 1;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshrntq_m_n_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshrntq_m_n_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshrntq_m_n_u16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = 1;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshrntq_m_n_u32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = 1;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshrnbq_m_n_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshrnbq_m_n_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshrnbq_m_n_u16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = 1;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshrnbq_m_n_u32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = 1;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshrntq_m_n_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshrntq_m_n_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshrntq_m_n_u16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = 1;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshrntq_m_n_u32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = 1;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param2);
  Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param3);
  Value *Val7 = llvm::ConstantInt::get(Int32Ty, Param4);
  Value *Val8 = EmitScalarExpr(E->getArg(3));
  Value *Val9 = Builder.CreateIntCast(Val8, Int32Ty, false);
  Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param5}), {Val9});
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshrn_predicated, {Param6, Param7, Param5}), {Val0, Val1, Val2, Val3, Val4, Val5, Val6, Val7, Val10});
}
case ARM::BI__builtin_arm_mve_vqrshrnbq_n_s16:
case ARM::BI__builtin_arm_mve_vqrshrnbq_n_s32:
case ARM::BI__builtin_arm_mve_vqrshrnbq_n_u16:
case ARM::BI__builtin_arm_mve_vqrshrnbq_n_u32:
case ARM::BI__builtin_arm_mve_vqrshrntq_n_s16:
case ARM::BI__builtin_arm_mve_vqrshrntq_n_s32:
case ARM::BI__builtin_arm_mve_vqrshrntq_n_u16:
case ARM::BI__builtin_arm_mve_vqrshrntq_n_u32:
case ARM::BI__builtin_arm_mve_vqrshrunbq_n_s16:
case ARM::BI__builtin_arm_mve_vqrshrunbq_n_s32:
case ARM::BI__builtin_arm_mve_vqrshruntq_n_s16:
case ARM::BI__builtin_arm_mve_vqrshruntq_n_s32:
case ARM::BI__builtin_arm_mve_vqshrnbq_n_s16:
case ARM::BI__builtin_arm_mve_vqshrnbq_n_s32:
case ARM::BI__builtin_arm_mve_vqshrnbq_n_u16:
case ARM::BI__builtin_arm_mve_vqshrnbq_n_u32:
case ARM::BI__builtin_arm_mve_vqshrntq_n_s16:
case ARM::BI__builtin_arm_mve_vqshrntq_n_s32:
case ARM::BI__builtin_arm_mve_vqshrntq_n_u16:
case ARM::BI__builtin_arm_mve_vqshrntq_n_u32:
case ARM::BI__builtin_arm_mve_vqshrunbq_n_s16:
case ARM::BI__builtin_arm_mve_vqshrunbq_n_s32:
case ARM::BI__builtin_arm_mve_vqshruntq_n_s16:
case ARM::BI__builtin_arm_mve_vqshruntq_n_s32:
case ARM::BI__builtin_arm_mve_vrshrnbq_n_s16:
case ARM::BI__builtin_arm_mve_vrshrnbq_n_s32:
case ARM::BI__builtin_arm_mve_vrshrnbq_n_u16:
case ARM::BI__builtin_arm_mve_vrshrnbq_n_u32:
case ARM::BI__builtin_arm_mve_vrshrntq_n_s16:
case ARM::BI__builtin_arm_mve_vrshrntq_n_s32:
case ARM::BI__builtin_arm_mve_vrshrntq_n_u16:
case ARM::BI__builtin_arm_mve_vrshrntq_n_u32:
case ARM::BI__builtin_arm_mve_vshrnbq_n_s16:
case ARM::BI__builtin_arm_mve_vshrnbq_n_s32:
case ARM::BI__builtin_arm_mve_vshrnbq_n_u16:
case ARM::BI__builtin_arm_mve_vshrnbq_n_u32:
case ARM::BI__builtin_arm_mve_vshrntq_n_s16:
case ARM::BI__builtin_arm_mve_vshrntq_n_s32:
case ARM::BI__builtin_arm_mve_vshrntq_n_u16:
case ARM::BI__builtin_arm_mve_vshrntq_n_u32: {
  uint32_t  Param0;
  uint32_t  Param1;
  uint32_t  Param2;
  uint32_t  Param3;
  uint32_t  Param4;
  llvm::Type * Param5;
  llvm::Type * Param6;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vqrshrnbq_n_s16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshrnbq_n_s32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrshrnbq_n_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = 1;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshrnbq_n_u32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = 1;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrshrntq_n_s16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshrntq_n_s32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrshrntq_n_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = 1;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshrntq_n_u32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = 1;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrshrunbq_n_s16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshrunbq_n_s32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrshruntq_n_s16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshruntq_n_s32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshrnbq_n_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshrnbq_n_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshrnbq_n_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = 1;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshrnbq_n_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = 1;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshrntq_n_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshrntq_n_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshrntq_n_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = 1;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshrntq_n_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = 1;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshrunbq_n_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshrunbq_n_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshruntq_n_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshruntq_n_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshrnbq_n_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshrnbq_n_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshrnbq_n_u16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = 1;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshrnbq_n_u32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = 1;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshrntq_n_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshrntq_n_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshrntq_n_u16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = 1;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshrntq_n_u32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = 1;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshrnbq_n_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshrnbq_n_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = 0;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshrnbq_n_u16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = 1;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshrnbq_n_u32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = 1;
    Param4 = 0;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshrntq_n_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshrntq_n_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = 0;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshrntq_n_u16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = 1;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshrntq_n_u32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = 1;
    Param4 = 1;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param2);
  Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param3);
  Value *Val7 = llvm::ConstantInt::get(Int32Ty, Param4);
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshrn, {Param5, Param6}), {Val0, Val1, Val2, Val3, Val4, Val5, Val6, Val7});
}
case ARM::BI__builtin_arm_mve_vqdmladhq_s16:
case ARM::BI__builtin_arm_mve_vqdmladhq_s32:
case ARM::BI__builtin_arm_mve_vqdmladhq_s8:
case ARM::BI__builtin_arm_mve_vqdmladhxq_s16:
case ARM::BI__builtin_arm_mve_vqdmladhxq_s32:
case ARM::BI__builtin_arm_mve_vqdmladhxq_s8:
case ARM::BI__builtin_arm_mve_vqdmlsdhq_s16:
case ARM::BI__builtin_arm_mve_vqdmlsdhq_s32:
case ARM::BI__builtin_arm_mve_vqdmlsdhq_s8:
case ARM::BI__builtin_arm_mve_vqdmlsdhxq_s16:
case ARM::BI__builtin_arm_mve_vqdmlsdhxq_s32:
case ARM::BI__builtin_arm_mve_vqdmlsdhxq_s8:
case ARM::BI__builtin_arm_mve_vqrdmladhq_s16:
case ARM::BI__builtin_arm_mve_vqrdmladhq_s32:
case ARM::BI__builtin_arm_mve_vqrdmladhq_s8:
case ARM::BI__builtin_arm_mve_vqrdmladhxq_s16:
case ARM::BI__builtin_arm_mve_vqrdmladhxq_s32:
case ARM::BI__builtin_arm_mve_vqrdmladhxq_s8:
case ARM::BI__builtin_arm_mve_vqrdmlsdhq_s16:
case ARM::BI__builtin_arm_mve_vqrdmlsdhq_s32:
case ARM::BI__builtin_arm_mve_vqrdmlsdhq_s8:
case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_s16:
case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_s32:
case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_s8: {
  uint32_t  Param0;
  uint32_t  Param1;
  uint32_t  Param2;
  llvm::Type * Param3;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vqdmladhq_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmladhq_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqdmladhq_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqdmladhxq_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmladhxq_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqdmladhxq_s8:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlsdhq_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlsdhq_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlsdhq_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlsdhxq_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlsdhxq_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlsdhxq_s8:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmladhq_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmladhq_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmladhq_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmladhxq_s16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmladhxq_s32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmladhxq_s8:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlsdhq_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlsdhq_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlsdhq_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_s16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_s32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_s8:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param2);
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vqdmlad, {Param3}), {Val0, Val1, Val2, Val3, Val4, Val5});
}
case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_s64:
case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_u64:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_f32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_s32:
case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_u32: {
  llvm::Type * Param0;
  llvm::Type * Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_s64:
    Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_u64:
    Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_f32:
    Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_s32:
    Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_u32:
    Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vstr_scatter_base, {Param0, Param1}), {Val0, Val1, Val2});
}
case ARM::BI__builtin_arm_mve_vqdmlahq_n_s32:
case ARM::BI__builtin_arm_mve_vqdmlashq_n_s32:
case ARM::BI__builtin_arm_mve_vqrdmlahq_n_s32:
case ARM::BI__builtin_arm_mve_vqrdmlashq_n_s32:
case ARM::BI__builtin_arm_mve_vsliq_n_s16:
case ARM::BI__builtin_arm_mve_vsliq_n_s32:
case ARM::BI__builtin_arm_mve_vsliq_n_s8:
case ARM::BI__builtin_arm_mve_vsliq_n_u16:
case ARM::BI__builtin_arm_mve_vsliq_n_u32:
case ARM::BI__builtin_arm_mve_vsliq_n_u8:
case ARM::BI__builtin_arm_mve_vsriq_n_s16:
case ARM::BI__builtin_arm_mve_vsriq_n_s32:
case ARM::BI__builtin_arm_mve_vsriq_n_s8:
case ARM::BI__builtin_arm_mve_vsriq_n_u16:
case ARM::BI__builtin_arm_mve_vsriq_n_u32:
case ARM::BI__builtin_arm_mve_vsriq_n_u8: {
  Intrinsic::ID  Param0;
  llvm::Type * Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vqdmlahq_n_s32:
    Param0 = Intrinsic::arm_mve_vqdmlah;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqdmlashq_n_s32:
    Param0 = Intrinsic::arm_mve_vqdmlash;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlahq_n_s32:
    Param0 = Intrinsic::arm_mve_vqrdmlah;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmlashq_n_s32:
    Param0 = Intrinsic::arm_mve_vqrdmlash;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vsliq_n_s16:
    Param0 = Intrinsic::arm_mve_vsli;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vsliq_n_s32:
    Param0 = Intrinsic::arm_mve_vsli;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vsliq_n_s8:
    Param0 = Intrinsic::arm_mve_vsli;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vsliq_n_u16:
    Param0 = Intrinsic::arm_mve_vsli;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vsliq_n_u32:
    Param0 = Intrinsic::arm_mve_vsli;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vsliq_n_u8:
    Param0 = Intrinsic::arm_mve_vsli;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vsriq_n_s16:
    Param0 = Intrinsic::arm_mve_vsri;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vsriq_n_s32:
    Param0 = Intrinsic::arm_mve_vsri;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vsriq_n_s8:
    Param0 = Intrinsic::arm_mve_vsri;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vsriq_n_u16:
    Param0 = Intrinsic::arm_mve_vsri;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vsriq_n_u32:
    Param0 = Intrinsic::arm_mve_vsri;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vsriq_n_u8:
    Param0 = Intrinsic::arm_mve_vsri;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0, Val1, Val2});
}
case ARM::BI__builtin_arm_mve_vadciq_s32:
case ARM::BI__builtin_arm_mve_vadciq_u32:
case ARM::BI__builtin_arm_mve_vsbciq_s32:
case ARM::BI__builtin_arm_mve_vsbciq_u32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vadciq_s32:
    Param0 = Intrinsic::arm_mve_vadc;
    break;
  case ARM::BI__builtin_arm_mve_vadciq_u32:
    Param0 = Intrinsic::arm_mve_vadc;
    break;
  case ARM::BI__builtin_arm_mve_vsbciq_s32:
    Param0 = Intrinsic::arm_mve_vsbc;
    break;
  case ARM::BI__builtin_arm_mve_vsbciq_u32:
    Param0 = Intrinsic::arm_mve_vsbc;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, 0);
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4)}), {Val0, Val1, Val2});
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, 1);
  Value *Val5 = Builder.CreateExtractValue(Val3, static_cast<unsigned>(1));
  Value *Val6 = llvm::ConstantInt::get(Int32Ty, 29);
  Value *Val7 = Builder.CreateLShr(Val5, Val6);
  Value *Val8 = Builder.CreateAnd(Val4, Val7);
  Address Val9 = EmitPointerWithAlignment(E->getArg(2));
  Builder.CreateStore(Val8, Val9);
  return Builder.CreateExtractValue(Val3, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vmaxvq_s32:
case ARM::BI__builtin_arm_mve_vmaxvq_u32:
case ARM::BI__builtin_arm_mve_vminvq_s32:
case ARM::BI__builtin_arm_mve_vminvq_u32: {
  uint32_t  Param0;
  Intrinsic::ID  Param1;
  bool  Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmaxvq_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_maxv;
    Param2 = true;
    break;
  case ARM::BI__builtin_arm_mve_vmaxvq_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_maxv;
    Param2 = false;
    break;
  case ARM::BI__builtin_arm_mve_vminvq_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_minv;
    Param2 = true;
    break;
  case ARM::BI__builtin_arm_mve_vminvq_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_minv;
    Param2 = false;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int32Ty, 4)}), {Val0, Val1, Val2});
  return Builder.CreateIntCast(Val3, Int32Ty, Param2);
}
case ARM::BI__builtin_arm_mve_vmovnbq_m_s16:
case ARM::BI__builtin_arm_mve_vmovnbq_m_s32:
case ARM::BI__builtin_arm_mve_vmovnbq_m_u16:
case ARM::BI__builtin_arm_mve_vmovnbq_m_u32:
case ARM::BI__builtin_arm_mve_vmovntq_m_s16:
case ARM::BI__builtin_arm_mve_vmovntq_m_s32:
case ARM::BI__builtin_arm_mve_vmovntq_m_u16:
case ARM::BI__builtin_arm_mve_vmovntq_m_u32: {
  uint32_t  Param0;
  llvm::Type * Param1;
  llvm::Type * Param2;
  llvm::Type * Param3;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmovnbq_m_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmovnbq_m_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmovnbq_m_u16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmovnbq_m_u32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmovntq_m_s16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmovntq_m_s32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmovntq_m_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmovntq_m_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val4});
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmovn_predicated, {Param2, Param3, Param1}), {Val0, Val1, Val2, Val5});
}
case ARM::BI__builtin_arm_mve_vmaxvq_p_s32:
case ARM::BI__builtin_arm_mve_vmaxvq_p_u32:
case ARM::BI__builtin_arm_mve_vminvq_p_s32:
case ARM::BI__builtin_arm_mve_vminvq_p_u32: {
  uint32_t  Param0;
  Intrinsic::ID  Param1;
  bool  Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmaxvq_p_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_maxv_predicated;
    Param2 = true;
    break;
  case ARM::BI__builtin_arm_mve_vmaxvq_p_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_maxv_predicated;
    Param2 = false;
    break;
  case ARM::BI__builtin_arm_mve_vminvq_p_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_minv_predicated;
    Param2 = true;
    break;
  case ARM::BI__builtin_arm_mve_vminvq_p_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_minv_predicated;
    Param2 = false;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val0, Val1, Val2, Val5});
  return Builder.CreateIntCast(Val6, Int32Ty, Param2);
}
case ARM::BI__builtin_arm_mve_vcvtbq_m_f16_f32:
case ARM::BI__builtin_arm_mve_vcvtbq_m_f32_f16:
case ARM::BI__builtin_arm_mve_vcvttq_m_f16_f32:
case ARM::BI__builtin_arm_mve_vcvttq_m_f32_f16: {
  uint32_t  Param0;
  Intrinsic::ID  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcvtbq_m_f16_f32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcvt_narrow_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vcvtbq_m_f32_f16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcvt_widen_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vcvttq_m_f16_f32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcvt_narrow_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vcvttq_m_f32_f16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcvt_widen_predicated;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
  return Builder.CreateCall(CGM.getIntrinsic(Param1), {Val0, Val1, Val2, Val5});
}
case ARM::BI__builtin_arm_mve_vqmovnbq_m_s16:
case ARM::BI__builtin_arm_mve_vqmovnbq_m_s32:
case ARM::BI__builtin_arm_mve_vqmovnbq_m_u16:
case ARM::BI__builtin_arm_mve_vqmovnbq_m_u32:
case ARM::BI__builtin_arm_mve_vqmovntq_m_s16:
case ARM::BI__builtin_arm_mve_vqmovntq_m_s32:
case ARM::BI__builtin_arm_mve_vqmovntq_m_u16:
case ARM::BI__builtin_arm_mve_vqmovntq_m_u32:
case ARM::BI__builtin_arm_mve_vqmovunbq_m_s16:
case ARM::BI__builtin_arm_mve_vqmovunbq_m_s32:
case ARM::BI__builtin_arm_mve_vqmovuntq_m_s16:
case ARM::BI__builtin_arm_mve_vqmovuntq_m_s32: {
  uint32_t  Param0;
  uint32_t  Param1;
  uint32_t  Param2;
  llvm::Type * Param3;
  llvm::Type * Param4;
  llvm::Type * Param5;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vqmovnbq_m_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqmovnbq_m_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqmovnbq_m_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqmovnbq_m_u32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqmovntq_m_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqmovntq_m_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqmovntq_m_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqmovntq_m_u32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqmovunbq_m_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqmovunbq_m_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqmovuntq_m_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqmovuntq_m_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val6});
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vqmovn_predicated, {Param4, Param5, Param3}), {Val0, Val1, Val2, Val3, Val4, Val7});
}
case ARM::BI__builtin_arm_mve_vqrshlq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqrshlq_m_n_s32:
case ARM::BI__builtin_arm_mve_vqrshlq_m_n_s8:
case ARM::BI__builtin_arm_mve_vqrshlq_m_n_u16:
case ARM::BI__builtin_arm_mve_vqrshlq_m_n_u32:
case ARM::BI__builtin_arm_mve_vqrshlq_m_n_u8:
case ARM::BI__builtin_arm_mve_vqshlq_m_r_s16:
case ARM::BI__builtin_arm_mve_vqshlq_m_r_s32:
case ARM::BI__builtin_arm_mve_vqshlq_m_r_s8:
case ARM::BI__builtin_arm_mve_vqshlq_m_r_u16:
case ARM::BI__builtin_arm_mve_vqshlq_m_r_u32:
case ARM::BI__builtin_arm_mve_vqshlq_m_r_u8:
case ARM::BI__builtin_arm_mve_vrshlq_m_n_s16:
case ARM::BI__builtin_arm_mve_vrshlq_m_n_s32:
case ARM::BI__builtin_arm_mve_vrshlq_m_n_s8:
case ARM::BI__builtin_arm_mve_vrshlq_m_n_u16:
case ARM::BI__builtin_arm_mve_vrshlq_m_n_u32:
case ARM::BI__builtin_arm_mve_vrshlq_m_n_u8:
case ARM::BI__builtin_arm_mve_vshlq_m_r_s16:
case ARM::BI__builtin_arm_mve_vshlq_m_r_s32:
case ARM::BI__builtin_arm_mve_vshlq_m_r_s8:
case ARM::BI__builtin_arm_mve_vshlq_m_r_u16:
case ARM::BI__builtin_arm_mve_vshlq_m_r_u32:
case ARM::BI__builtin_arm_mve_vshlq_m_r_u8: {
  uint32_t  Param0;
  uint32_t  Param1;
  uint32_t  Param2;
  llvm::Type * Param3;
  llvm::Type * Param4;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vqrshlq_m_n_s16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_m_n_s32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_m_n_s8:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_m_n_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_m_n_u32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_m_n_u8:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_m_r_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_m_r_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_m_r_s8:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_m_r_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_m_r_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_m_r_u8:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_m_n_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_m_n_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_m_n_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_m_n_u16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_m_n_u32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_m_n_u8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_m_r_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_m_r_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_m_r_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_m_r_u16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_m_r_u32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_m_r_u8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val6});
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshl_scalar_predicated, {Param4, Param3}), {Val0, Val1, Val2, Val3, Val4, Val7});
}
case ARM::BI__builtin_arm_mve_vqrshlq_n_s16:
case ARM::BI__builtin_arm_mve_vqrshlq_n_s32:
case ARM::BI__builtin_arm_mve_vqrshlq_n_s8:
case ARM::BI__builtin_arm_mve_vqrshlq_n_u16:
case ARM::BI__builtin_arm_mve_vqrshlq_n_u32:
case ARM::BI__builtin_arm_mve_vqrshlq_n_u8:
case ARM::BI__builtin_arm_mve_vqshlq_r_s16:
case ARM::BI__builtin_arm_mve_vqshlq_r_s32:
case ARM::BI__builtin_arm_mve_vqshlq_r_s8:
case ARM::BI__builtin_arm_mve_vqshlq_r_u16:
case ARM::BI__builtin_arm_mve_vqshlq_r_u32:
case ARM::BI__builtin_arm_mve_vqshlq_r_u8:
case ARM::BI__builtin_arm_mve_vrshlq_n_s16:
case ARM::BI__builtin_arm_mve_vrshlq_n_s32:
case ARM::BI__builtin_arm_mve_vrshlq_n_s8:
case ARM::BI__builtin_arm_mve_vrshlq_n_u16:
case ARM::BI__builtin_arm_mve_vrshlq_n_u32:
case ARM::BI__builtin_arm_mve_vrshlq_n_u8:
case ARM::BI__builtin_arm_mve_vshlq_r_s16:
case ARM::BI__builtin_arm_mve_vshlq_r_s32:
case ARM::BI__builtin_arm_mve_vshlq_r_s8:
case ARM::BI__builtin_arm_mve_vshlq_r_u16:
case ARM::BI__builtin_arm_mve_vshlq_r_u32:
case ARM::BI__builtin_arm_mve_vshlq_r_u8: {
  uint32_t  Param0;
  uint32_t  Param1;
  uint32_t  Param2;
  llvm::Type * Param3;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vqrshlq_n_s16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_n_s32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_n_s8:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_n_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_n_u32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_n_u8:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_r_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_r_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_r_s8:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_r_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_r_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_r_u8:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_n_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_n_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_n_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_n_u16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_n_u32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_n_u8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_r_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_r_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_r_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_r_u16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_r_u32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_r_u8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshl_scalar, {Param3}), {Val0, Val1, Val2, Val3, Val4});
}
case ARM::BI__builtin_arm_mve_vqmovnbq_s16:
case ARM::BI__builtin_arm_mve_vqmovnbq_s32:
case ARM::BI__builtin_arm_mve_vqmovnbq_u16:
case ARM::BI__builtin_arm_mve_vqmovnbq_u32:
case ARM::BI__builtin_arm_mve_vqmovntq_s16:
case ARM::BI__builtin_arm_mve_vqmovntq_s32:
case ARM::BI__builtin_arm_mve_vqmovntq_u16:
case ARM::BI__builtin_arm_mve_vqmovntq_u32:
case ARM::BI__builtin_arm_mve_vqmovunbq_s16:
case ARM::BI__builtin_arm_mve_vqmovunbq_s32:
case ARM::BI__builtin_arm_mve_vqmovuntq_s16:
case ARM::BI__builtin_arm_mve_vqmovuntq_s32:
case ARM::BI__builtin_arm_mve_vqrshlq_s16:
case ARM::BI__builtin_arm_mve_vqrshlq_s32:
case ARM::BI__builtin_arm_mve_vqrshlq_s8:
case ARM::BI__builtin_arm_mve_vqrshlq_u16:
case ARM::BI__builtin_arm_mve_vqrshlq_u32:
case ARM::BI__builtin_arm_mve_vqrshlq_u8:
case ARM::BI__builtin_arm_mve_vqshlq_s16:
case ARM::BI__builtin_arm_mve_vqshlq_s32:
case ARM::BI__builtin_arm_mve_vqshlq_s8:
case ARM::BI__builtin_arm_mve_vqshlq_u16:
case ARM::BI__builtin_arm_mve_vqshlq_u32:
case ARM::BI__builtin_arm_mve_vqshlq_u8:
case ARM::BI__builtin_arm_mve_vrshlq_s16:
case ARM::BI__builtin_arm_mve_vrshlq_s32:
case ARM::BI__builtin_arm_mve_vrshlq_s8:
case ARM::BI__builtin_arm_mve_vrshlq_u16:
case ARM::BI__builtin_arm_mve_vrshlq_u32:
case ARM::BI__builtin_arm_mve_vrshlq_u8:
case ARM::BI__builtin_arm_mve_vshlq_s16:
case ARM::BI__builtin_arm_mve_vshlq_s32:
case ARM::BI__builtin_arm_mve_vshlq_s8:
case ARM::BI__builtin_arm_mve_vshlq_u16:
case ARM::BI__builtin_arm_mve_vshlq_u32:
case ARM::BI__builtin_arm_mve_vshlq_u8: {
  uint32_t  Param0;
  uint32_t  Param1;
  uint32_t  Param2;
  Intrinsic::ID  Param3;
  llvm::Type * Param4;
  llvm::Type * Param5;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vqmovnbq_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vqmovn;
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqmovnbq_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vqmovn;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqmovnbq_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vqmovn;
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqmovnbq_u32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vqmovn;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqmovntq_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vqmovn;
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqmovntq_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vqmovn;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqmovntq_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vqmovn;
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqmovntq_u32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vqmovn;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqmovunbq_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vqmovn;
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqmovunbq_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vqmovn;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqmovuntq_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vqmovn;
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqmovuntq_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vqmovn;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_s16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_s32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_s8:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_u32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_u8:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_s8:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_u8:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_u16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_u32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_u8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_u16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_u32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_u8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vshl_vector;
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
  return Builder.CreateCall(CGM.getIntrinsic(Param3, {Param4, Param5}), {Val0, Val1, Val2, Val3, Val4});
}
case ARM::BI__builtin_arm_mve_vmullbq_int_s16:
case ARM::BI__builtin_arm_mve_vmullbq_int_s32:
case ARM::BI__builtin_arm_mve_vmullbq_int_s8:
case ARM::BI__builtin_arm_mve_vmullbq_int_u16:
case ARM::BI__builtin_arm_mve_vmullbq_int_u32:
case ARM::BI__builtin_arm_mve_vmullbq_int_u8:
case ARM::BI__builtin_arm_mve_vmulltq_int_s16:
case ARM::BI__builtin_arm_mve_vmulltq_int_s32:
case ARM::BI__builtin_arm_mve_vmulltq_int_s8:
case ARM::BI__builtin_arm_mve_vmulltq_int_u16:
case ARM::BI__builtin_arm_mve_vmulltq_int_u32:
case ARM::BI__builtin_arm_mve_vmulltq_int_u8:
case ARM::BI__builtin_arm_mve_vshllbq_n_s16:
case ARM::BI__builtin_arm_mve_vshllbq_n_s8:
case ARM::BI__builtin_arm_mve_vshllbq_n_u16:
case ARM::BI__builtin_arm_mve_vshllbq_n_u8:
case ARM::BI__builtin_arm_mve_vshlltq_n_s16:
case ARM::BI__builtin_arm_mve_vshlltq_n_s8:
case ARM::BI__builtin_arm_mve_vshlltq_n_u16:
case ARM::BI__builtin_arm_mve_vshlltq_n_u8: {
  uint32_t  Param0;
  uint32_t  Param1;
  Intrinsic::ID  Param2;
  llvm::Type * Param3;
  llvm::Type * Param4;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmullbq_int_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = Intrinsic::arm_mve_vmull;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmullbq_int_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = Intrinsic::arm_mve_vmull;
    Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmullbq_int_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = Intrinsic::arm_mve_vmull;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmullbq_int_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = Intrinsic::arm_mve_vmull;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmullbq_int_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = Intrinsic::arm_mve_vmull;
    Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmullbq_int_u8:
    Param0 = 1;
    Param1 = 0;
    Param2 = Intrinsic::arm_mve_vmull;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_int_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = Intrinsic::arm_mve_vmull;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_int_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = Intrinsic::arm_mve_vmull;
    Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_int_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = Intrinsic::arm_mve_vmull;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_int_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = Intrinsic::arm_mve_vmull;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_int_u32:
    Param0 = 1;
    Param1 = 1;
    Param2 = Intrinsic::arm_mve_vmull;
    Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_int_u8:
    Param0 = 1;
    Param1 = 1;
    Param2 = Intrinsic::arm_mve_vmull;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshllbq_n_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = Intrinsic::arm_mve_vshll_imm;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshllbq_n_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = Intrinsic::arm_mve_vshll_imm;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshllbq_n_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = Intrinsic::arm_mve_vshll_imm;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshllbq_n_u8:
    Param0 = 1;
    Param1 = 0;
    Param2 = Intrinsic::arm_mve_vshll_imm;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshlltq_n_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = Intrinsic::arm_mve_vshll_imm;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshlltq_n_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = Intrinsic::arm_mve_vshll_imm;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshlltq_n_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = Intrinsic::arm_mve_vshll_imm;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshlltq_n_u8:
    Param0 = 1;
    Param1 = 1;
    Param2 = Intrinsic::arm_mve_vshll_imm;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
  return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param4}), {Val0, Val1, Val2, Val3});
}
case ARM::BI__builtin_arm_mve_vcvtbq_f16_f32:
case ARM::BI__builtin_arm_mve_vcvttq_f16_f32: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcvtbq_f16_f32:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vcvttq_f16_f32:
    Param0 = 1;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_narrow), {Val0, Val1, Val2});
}
case ARM::BI__builtin_arm_mve_vmullbq_poly_p16:
case ARM::BI__builtin_arm_mve_vmullbq_poly_p8:
case ARM::BI__builtin_arm_mve_vmulltq_poly_p16:
case ARM::BI__builtin_arm_mve_vmulltq_poly_p8:
case ARM::BI__builtin_arm_mve_vqdmullbq_s16:
case ARM::BI__builtin_arm_mve_vqdmullbq_s32:
case ARM::BI__builtin_arm_mve_vqdmulltq_s16:
case ARM::BI__builtin_arm_mve_vqdmulltq_s32: {
  uint32_t  Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  llvm::Type * Param3;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmullbq_poly_p16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vmull_poly;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmullbq_poly_p8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vmull_poly;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_poly_p16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vmull_poly;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_poly_p8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vmull_poly;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqdmullbq_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vqdmull;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmullbq_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vqdmull;
    Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulltq_s16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vqdmull;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulltq_s32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vqdmull;
    Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param3}), {Val0, Val1, Val2});
}
case ARM::BI__builtin_arm_mve_vabdq_f16:
case ARM::BI__builtin_arm_mve_vabdq_f32:
case ARM::BI__builtin_arm_mve_vabdq_s16:
case ARM::BI__builtin_arm_mve_vabdq_s32:
case ARM::BI__builtin_arm_mve_vabdq_s8:
case ARM::BI__builtin_arm_mve_vabdq_u16:
case ARM::BI__builtin_arm_mve_vabdq_u32:
case ARM::BI__builtin_arm_mve_vabdq_u8:
case ARM::BI__builtin_arm_mve_vhaddq_s16:
case ARM::BI__builtin_arm_mve_vhaddq_s32:
case ARM::BI__builtin_arm_mve_vhaddq_s8:
case ARM::BI__builtin_arm_mve_vhaddq_u16:
case ARM::BI__builtin_arm_mve_vhaddq_u32:
case ARM::BI__builtin_arm_mve_vhaddq_u8:
case ARM::BI__builtin_arm_mve_vhsubq_s16:
case ARM::BI__builtin_arm_mve_vhsubq_s32:
case ARM::BI__builtin_arm_mve_vhsubq_s8:
case ARM::BI__builtin_arm_mve_vhsubq_u16:
case ARM::BI__builtin_arm_mve_vhsubq_u32:
case ARM::BI__builtin_arm_mve_vhsubq_u8:
case ARM::BI__builtin_arm_mve_vmulhq_s16:
case ARM::BI__builtin_arm_mve_vmulhq_s32:
case ARM::BI__builtin_arm_mve_vmulhq_s8:
case ARM::BI__builtin_arm_mve_vmulhq_u16:
case ARM::BI__builtin_arm_mve_vmulhq_u32:
case ARM::BI__builtin_arm_mve_vmulhq_u8:
case ARM::BI__builtin_arm_mve_vqshlq_n_s16:
case ARM::BI__builtin_arm_mve_vqshlq_n_s32:
case ARM::BI__builtin_arm_mve_vqshlq_n_s8:
case ARM::BI__builtin_arm_mve_vqshlq_n_u16:
case ARM::BI__builtin_arm_mve_vqshlq_n_u32:
case ARM::BI__builtin_arm_mve_vqshlq_n_u8:
case ARM::BI__builtin_arm_mve_vrhaddq_s16:
case ARM::BI__builtin_arm_mve_vrhaddq_s32:
case ARM::BI__builtin_arm_mve_vrhaddq_s8:
case ARM::BI__builtin_arm_mve_vrhaddq_u16:
case ARM::BI__builtin_arm_mve_vrhaddq_u32:
case ARM::BI__builtin_arm_mve_vrhaddq_u8:
case ARM::BI__builtin_arm_mve_vrmulhq_s16:
case ARM::BI__builtin_arm_mve_vrmulhq_s32:
case ARM::BI__builtin_arm_mve_vrmulhq_s8:
case ARM::BI__builtin_arm_mve_vrmulhq_u16:
case ARM::BI__builtin_arm_mve_vrmulhq_u32:
case ARM::BI__builtin_arm_mve_vrmulhq_u8:
case ARM::BI__builtin_arm_mve_vrshrq_n_s16:
case ARM::BI__builtin_arm_mve_vrshrq_n_s32:
case ARM::BI__builtin_arm_mve_vrshrq_n_s8:
case ARM::BI__builtin_arm_mve_vrshrq_n_u16:
case ARM::BI__builtin_arm_mve_vrshrq_n_u32:
case ARM::BI__builtin_arm_mve_vrshrq_n_u8: {
  uint32_t  Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vabdq_f16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vabd;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vabdq_f32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vabd;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vabdq_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vabd;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vabdq_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vabd;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vabdq_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vabd;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vabdq_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vabd;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vabdq_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vabd;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vabdq_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vabd;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vhadd;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vhadd;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vhadd;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vhadd;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vhadd;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vhadd;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vhsub;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vhsub;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vhsub;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vhsub;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vhsub;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vhsub;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmulhq_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vmulh;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmulhq_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vmulh;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmulhq_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vmulh;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmulhq_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vmulh;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmulhq_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vmulh;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmulhq_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vmulh;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_n_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vqshl_imm;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_n_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vqshl_imm;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_n_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vqshl_imm;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_n_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vqshl_imm;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_n_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vqshl_imm;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_n_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vqshl_imm;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrhaddq_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vrhadd;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrhaddq_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vrhadd;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrhaddq_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vrhadd;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrhaddq_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vrhadd;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrhaddq_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vrhadd;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrhaddq_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vrhadd;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrmulhq_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vrmulh;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrmulhq_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vrmulh;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmulhq_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vrmulh;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrmulhq_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vrmulh;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrmulhq_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vrmulh;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmulhq_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vrmulh;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrshrq_n_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vrshr_imm;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshrq_n_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vrshr_imm;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshrq_n_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vrshr_imm;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrshrq_n_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vrshr_imm;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshrq_n_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vrshr_imm;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshrq_n_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vrshr_imm;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2}), {Val0, Val1, Val2});
}
case ARM::BI__builtin_arm_mve_vaddq_s16:
case ARM::BI__builtin_arm_mve_vaddq_s32:
case ARM::BI__builtin_arm_mve_vaddq_s8:
case ARM::BI__builtin_arm_mve_vaddq_u16:
case ARM::BI__builtin_arm_mve_vaddq_u32:
case ARM::BI__builtin_arm_mve_vaddq_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  return Builder.CreateAdd(Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vandq_s16:
case ARM::BI__builtin_arm_mve_vandq_s32:
case ARM::BI__builtin_arm_mve_vandq_s8:
case ARM::BI__builtin_arm_mve_vandq_u16:
case ARM::BI__builtin_arm_mve_vandq_u32:
case ARM::BI__builtin_arm_mve_vandq_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  return Builder.CreateAnd(Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vldrdq_gather_base_s64:
case ARM::BI__builtin_arm_mve_vldrdq_gather_base_u64:
case ARM::BI__builtin_arm_mve_vldrwq_gather_base_f32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_base_s32:
case ARM::BI__builtin_arm_mve_vldrwq_gather_base_u32: {
  llvm::Type * Param0;
  llvm::Type * Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vldrdq_gather_base_s64:
    Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vldrdq_gather_base_u64:
    Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_base_f32:
    Param0 = llvm::FixedVectorType::get(FloatTy, 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_base_s32:
    Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vldrwq_gather_base_u32:
    Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vldr_gather_base, {Param0, Param1}), {Val0, Val1});
}
case ARM::BI__builtin_arm_mve_sqrshr:
case ARM::BI__builtin_arm_mve_sqshl:
case ARM::BI__builtin_arm_mve_srshr:
case ARM::BI__builtin_arm_mve_uqrshl:
case ARM::BI__builtin_arm_mve_uqshl:
case ARM::BI__builtin_arm_mve_urshr: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_sqrshr:
    Param0 = Intrinsic::arm_mve_sqrshr;
    break;
  case ARM::BI__builtin_arm_mve_sqshl:
    Param0 = Intrinsic::arm_mve_sqshl;
    break;
  case ARM::BI__builtin_arm_mve_srshr:
    Param0 = Intrinsic::arm_mve_srshr;
    break;
  case ARM::BI__builtin_arm_mve_uqrshl:
    Param0 = Intrinsic::arm_mve_uqrshl;
    break;
  case ARM::BI__builtin_arm_mve_uqshl:
    Param0 = Intrinsic::arm_mve_uqshl;
    break;
  case ARM::BI__builtin_arm_mve_urshr:
    Param0 = Intrinsic::arm_mve_urshr;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  return Builder.CreateCall(CGM.getIntrinsic(Param0), {Val0, Val1});
}
case ARM::BI__builtin_arm_mve_vbrsrq_n_f16:
case ARM::BI__builtin_arm_mve_vbrsrq_n_f32:
case ARM::BI__builtin_arm_mve_vbrsrq_n_s16:
case ARM::BI__builtin_arm_mve_vbrsrq_n_s32:
case ARM::BI__builtin_arm_mve_vbrsrq_n_s8:
case ARM::BI__builtin_arm_mve_vbrsrq_n_u16:
case ARM::BI__builtin_arm_mve_vbrsrq_n_u32:
case ARM::BI__builtin_arm_mve_vbrsrq_n_u8:
case ARM::BI__builtin_arm_mve_vmaxnmq_f16:
case ARM::BI__builtin_arm_mve_vmaxnmq_f32:
case ARM::BI__builtin_arm_mve_vminnmq_f16:
case ARM::BI__builtin_arm_mve_vminnmq_f32:
case ARM::BI__builtin_arm_mve_vqaddq_s16:
case ARM::BI__builtin_arm_mve_vqaddq_s32:
case ARM::BI__builtin_arm_mve_vqaddq_s8:
case ARM::BI__builtin_arm_mve_vqaddq_u16:
case ARM::BI__builtin_arm_mve_vqaddq_u32:
case ARM::BI__builtin_arm_mve_vqaddq_u8:
case ARM::BI__builtin_arm_mve_vqdmulhq_s16:
case ARM::BI__builtin_arm_mve_vqdmulhq_s32:
case ARM::BI__builtin_arm_mve_vqdmulhq_s8:
case ARM::BI__builtin_arm_mve_vqrdmulhq_s16:
case ARM::BI__builtin_arm_mve_vqrdmulhq_s32:
case ARM::BI__builtin_arm_mve_vqrdmulhq_s8:
case ARM::BI__builtin_arm_mve_vqshluq_n_s16:
case ARM::BI__builtin_arm_mve_vqshluq_n_s32:
case ARM::BI__builtin_arm_mve_vqshluq_n_s8:
case ARM::BI__builtin_arm_mve_vqsubq_s16:
case ARM::BI__builtin_arm_mve_vqsubq_s32:
case ARM::BI__builtin_arm_mve_vqsubq_s8:
case ARM::BI__builtin_arm_mve_vqsubq_u16:
case ARM::BI__builtin_arm_mve_vqsubq_u32:
case ARM::BI__builtin_arm_mve_vqsubq_u8: {
  Intrinsic::ID  Param0;
  llvm::Type * Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vbrsrq_n_f16:
    Param0 = Intrinsic::arm_mve_vbrsr;
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vbrsrq_n_f32:
    Param0 = Intrinsic::arm_mve_vbrsr;
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vbrsrq_n_s16:
    Param0 = Intrinsic::arm_mve_vbrsr;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vbrsrq_n_s32:
    Param0 = Intrinsic::arm_mve_vbrsr;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vbrsrq_n_s8:
    Param0 = Intrinsic::arm_mve_vbrsr;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vbrsrq_n_u16:
    Param0 = Intrinsic::arm_mve_vbrsr;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vbrsrq_n_u32:
    Param0 = Intrinsic::arm_mve_vbrsr;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vbrsrq_n_u8:
    Param0 = Intrinsic::arm_mve_vbrsr;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmaxnmq_f16:
    Param0 = Intrinsic::maxnum;
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmaxnmq_f32:
    Param0 = Intrinsic::maxnum;
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vminnmq_f16:
    Param0 = Intrinsic::minnum;
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vminnmq_f32:
    Param0 = Intrinsic::minnum;
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_s16:
    Param0 = Intrinsic::sadd_sat;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_s32:
    Param0 = Intrinsic::sadd_sat;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_s8:
    Param0 = Intrinsic::sadd_sat;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_u16:
    Param0 = Intrinsic::uadd_sat;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_u32:
    Param0 = Intrinsic::uadd_sat;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_u8:
    Param0 = Intrinsic::uadd_sat;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulhq_s16:
    Param0 = Intrinsic::arm_mve_vqdmulh;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulhq_s32:
    Param0 = Intrinsic::arm_mve_vqdmulh;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulhq_s8:
    Param0 = Intrinsic::arm_mve_vqdmulh;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmulhq_s16:
    Param0 = Intrinsic::arm_mve_vqrdmulh;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmulhq_s32:
    Param0 = Intrinsic::arm_mve_vqrdmulh;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmulhq_s8:
    Param0 = Intrinsic::arm_mve_vqrdmulh;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqshluq_n_s16:
    Param0 = Intrinsic::arm_mve_vqshlu_imm;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshluq_n_s32:
    Param0 = Intrinsic::arm_mve_vqshlu_imm;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshluq_n_s8:
    Param0 = Intrinsic::arm_mve_vqshlu_imm;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_s16:
    Param0 = Intrinsic::ssub_sat;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_s32:
    Param0 = Intrinsic::ssub_sat;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_s8:
    Param0 = Intrinsic::ssub_sat;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_u16:
    Param0 = Intrinsic::usub_sat;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_u32:
    Param0 = Intrinsic::usub_sat;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_u8:
    Param0 = Intrinsic::usub_sat;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0, Val1});
}
case ARM::BI__builtin_arm_mve_vgetq_lane_f16:
case ARM::BI__builtin_arm_mve_vgetq_lane_f32:
case ARM::BI__builtin_arm_mve_vgetq_lane_s16:
case ARM::BI__builtin_arm_mve_vgetq_lane_s32:
case ARM::BI__builtin_arm_mve_vgetq_lane_s64:
case ARM::BI__builtin_arm_mve_vgetq_lane_s8:
case ARM::BI__builtin_arm_mve_vgetq_lane_u16:
case ARM::BI__builtin_arm_mve_vgetq_lane_u32:
case ARM::BI__builtin_arm_mve_vgetq_lane_u64:
case ARM::BI__builtin_arm_mve_vgetq_lane_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  return Builder.CreateExtractElement(Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vaddq_f16:
case ARM::BI__builtin_arm_mve_vaddq_f32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  return Builder.CreateFAdd(Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vmulq_f16:
case ARM::BI__builtin_arm_mve_vmulq_f32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  return Builder.CreateFMul(Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vsubq_f16:
case ARM::BI__builtin_arm_mve_vsubq_f32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  return Builder.CreateFSub(Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vmulq_s16:
case ARM::BI__builtin_arm_mve_vmulq_s32:
case ARM::BI__builtin_arm_mve_vmulq_s8:
case ARM::BI__builtin_arm_mve_vmulq_u16:
case ARM::BI__builtin_arm_mve_vmulq_u32:
case ARM::BI__builtin_arm_mve_vmulq_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  return Builder.CreateMul(Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vorrq_s16:
case ARM::BI__builtin_arm_mve_vorrq_s32:
case ARM::BI__builtin_arm_mve_vorrq_s8:
case ARM::BI__builtin_arm_mve_vorrq_u16:
case ARM::BI__builtin_arm_mve_vorrq_u32:
case ARM::BI__builtin_arm_mve_vorrq_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  return Builder.CreateOr(Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vsubq_s16:
case ARM::BI__builtin_arm_mve_vsubq_s32:
case ARM::BI__builtin_arm_mve_vsubq_s8:
case ARM::BI__builtin_arm_mve_vsubq_u16:
case ARM::BI__builtin_arm_mve_vsubq_u32:
case ARM::BI__builtin_arm_mve_vsubq_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  return Builder.CreateSub(Val0, Val1);
}
case ARM::BI__builtin_arm_mve_veorq_s16:
case ARM::BI__builtin_arm_mve_veorq_s32:
case ARM::BI__builtin_arm_mve_veorq_s8:
case ARM::BI__builtin_arm_mve_veorq_u16:
case ARM::BI__builtin_arm_mve_veorq_u32:
case ARM::BI__builtin_arm_mve_veorq_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = EmitScalarExpr(E->getArg(1));
  return Builder.CreateXor(Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vmovlbq_s8:
case ARM::BI__builtin_arm_mve_vmovlbq_u8:
case ARM::BI__builtin_arm_mve_vmovltq_s8:
case ARM::BI__builtin_arm_mve_vmovltq_u8: {
  bool  Param0;
  bool  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmovlbq_s8:
    Param0 = 0;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vmovlbq_u8:
    Param0 = 0;
    Param1 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vmovltq_s8:
    Param0 = 1;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vmovltq_u8:
    Param0 = 1;
    Param1 = 1;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = VectorUnzip(Builder, Val0, static_cast<bool>(Param0));
  llvm::Type *Val2 = llvm::FixedVectorType::get(Int16Ty, 8);
  return SignOrZeroExtend(Builder, Val1, Val2, static_cast<bool>(Param1));
}
case ARM::BI__builtin_arm_mve_vmovlbq_s16:
case ARM::BI__builtin_arm_mve_vmovlbq_u16:
case ARM::BI__builtin_arm_mve_vmovltq_s16:
case ARM::BI__builtin_arm_mve_vmovltq_u16: {
  bool  Param0;
  bool  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmovlbq_s16:
    Param0 = 0;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vmovlbq_u16:
    Param0 = 0;
    Param1 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vmovltq_s16:
    Param0 = 1;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vmovltq_u16:
    Param0 = 1;
    Param1 = 1;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = VectorUnzip(Builder, Val0, static_cast<bool>(Param0));
  llvm::Type *Val2 = llvm::FixedVectorType::get(Int32Ty, 4);
  return SignOrZeroExtend(Builder, Val1, Val2, static_cast<bool>(Param1));
}
case ARM::BI__builtin_arm_mve_vclzq_s16:
case ARM::BI__builtin_arm_mve_vclzq_s32:
case ARM::BI__builtin_arm_mve_vclzq_s8:
case ARM::BI__builtin_arm_mve_vclzq_u16:
case ARM::BI__builtin_arm_mve_vclzq_u32:
case ARM::BI__builtin_arm_mve_vclzq_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vclzq_s16:
    Param0 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vclzq_s32:
    Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vclzq_s8:
    Param0 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vclzq_u16:
    Param0 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vclzq_u32:
    Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vclzq_u8:
    Param0 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = llvm::ConstantInt::get(Builder.getInt1Ty(), static_cast<bool>(0));
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::ctlz, {Param0}), {Val0, Val1});
}
case ARM::BI__builtin_arm_mve_vpnot: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = llvm::ConstantInt::get(Int16Ty, 65535);
  return Builder.CreateXor(Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vaddlvq_p_s32:
case ARM::BI__builtin_arm_mve_vaddlvq_p_u32:
case ARM::BI__builtin_arm_mve_vaddvq_p_s16:
case ARM::BI__builtin_arm_mve_vaddvq_p_s32:
case ARM::BI__builtin_arm_mve_vaddvq_p_s8:
case ARM::BI__builtin_arm_mve_vaddvq_p_u16:
case ARM::BI__builtin_arm_mve_vaddvq_p_u32:
case ARM::BI__builtin_arm_mve_vaddvq_p_u8: {
  uint32_t  Param0;
  llvm::Type * Param1;
  Intrinsic::ID  Param2;
  llvm::Type * Param3;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vaddlvq_p_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_addlv_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddlvq_p_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_addlv_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddvq_p_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_addv_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vaddvq_p_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_addv_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddvq_p_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_addv_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vaddvq_p_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_addv_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vaddvq_p_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_addv_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddvq_p_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_addv_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val3});
  return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param1}), {Val0, Val1, Val4});
}
case ARM::BI__builtin_arm_mve_vcvtbq_f32_f16:
case ARM::BI__builtin_arm_mve_vcvttq_f32_f16: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcvtbq_f32_f16:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vcvttq_f32_f16:
    Param0 = 1;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_widen), {Val0, Val1});
}
case ARM::BI__builtin_arm_mve_vaddlvq_s32:
case ARM::BI__builtin_arm_mve_vaddlvq_u32:
case ARM::BI__builtin_arm_mve_vaddvq_s16:
case ARM::BI__builtin_arm_mve_vaddvq_s32:
case ARM::BI__builtin_arm_mve_vaddvq_s8:
case ARM::BI__builtin_arm_mve_vaddvq_u16:
case ARM::BI__builtin_arm_mve_vaddvq_u32:
case ARM::BI__builtin_arm_mve_vaddvq_u8: {
  uint32_t  Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vaddlvq_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_addlv;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddlvq_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_addlv;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddvq_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_addv;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vaddvq_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_addv;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddvq_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_addv;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vaddvq_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_addv;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vaddvq_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_addv;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddvq_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_addv;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
  return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2}), {Val0, Val1});
}
case ARM::BI__builtin_arm_mve_asrl:
case ARM::BI__builtin_arm_mve_lsll:
case ARM::BI__builtin_arm_mve_sqshll:
case ARM::BI__builtin_arm_mve_srshrl:
case ARM::BI__builtin_arm_mve_uqshll:
case ARM::BI__builtin_arm_mve_urshrl: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_asrl:
    Param0 = Intrinsic::arm_mve_asrl;
    break;
  case ARM::BI__builtin_arm_mve_lsll:
    Param0 = Intrinsic::arm_mve_lsll;
    break;
  case ARM::BI__builtin_arm_mve_sqshll:
    Param0 = Intrinsic::arm_mve_sqshll;
    break;
  case ARM::BI__builtin_arm_mve_srshrl:
    Param0 = Intrinsic::arm_mve_srshrl;
    break;
  case ARM::BI__builtin_arm_mve_uqshll:
    Param0 = Intrinsic::arm_mve_uqshll;
    break;
  case ARM::BI__builtin_arm_mve_urshrl:
    Param0 = Intrinsic::arm_mve_urshrl;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = llvm::ConstantInt::get(Int64Ty, 32);
  Value *Val2 = Builder.CreateLShr(Val0, Val1);
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val5 = EmitScalarExpr(E->getArg(1));
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Param0), {Val4, Val3, Val5});
  Value *Val7 = Builder.CreateExtractValue(Val6, static_cast<unsigned>(1));
  Value *Val8 = Builder.CreateIntCast(Val7, Int64Ty, false);
  Value *Val9 = llvm::ConstantInt::get(Int64Ty, 32);
  Value *Val10 = Builder.CreateShl(Val8, Val9);
  Value *Val11 = Builder.CreateExtractValue(Val6, static_cast<unsigned>(0));
  Value *Val12 = Builder.CreateIntCast(Val11, Int64Ty, false);
  return Builder.CreateOr(Val10, Val12);
}
case ARM::BI__builtin_arm_mve_sqrshrl:
case ARM::BI__builtin_arm_mve_sqrshrl_sat48: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_sqrshrl:
    Param0 = 64;
    break;
  case ARM::BI__builtin_arm_mve_sqrshrl_sat48:
    Param0 = 48;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = llvm::ConstantInt::get(Int64Ty, 32);
  Value *Val2 = Builder.CreateLShr(Val0, Val1);
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val5 = EmitScalarExpr(E->getArg(1));
  Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_sqrshrl), {Val4, Val3, Val5, Val6});
  Value *Val8 = Builder.CreateExtractValue(Val7, static_cast<unsigned>(1));
  Value *Val9 = Builder.CreateIntCast(Val8, Int64Ty, false);
  Value *Val10 = llvm::ConstantInt::get(Int64Ty, 32);
  Value *Val11 = Builder.CreateShl(Val9, Val10);
  Value *Val12 = Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
  Value *Val13 = Builder.CreateIntCast(Val12, Int64Ty, false);
  return Builder.CreateOr(Val11, Val13);
}
case ARM::BI__builtin_arm_mve_uqrshll:
case ARM::BI__builtin_arm_mve_uqrshll_sat48: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_uqrshll:
    Param0 = 64;
    break;
  case ARM::BI__builtin_arm_mve_uqrshll_sat48:
    Param0 = 48;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = llvm::ConstantInt::get(Int64Ty, 32);
  Value *Val2 = Builder.CreateLShr(Val0, Val1);
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val5 = EmitScalarExpr(E->getArg(1));
  Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_uqrshll), {Val4, Val3, Val5, Val6});
  Value *Val8 = Builder.CreateExtractValue(Val7, static_cast<unsigned>(1));
  Value *Val9 = Builder.CreateIntCast(Val8, Int64Ty, false);
  Value *Val10 = llvm::ConstantInt::get(Int64Ty, 32);
  Value *Val11 = Builder.CreateShl(Val9, Val10);
  Value *Val12 = Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
  Value *Val13 = Builder.CreateIntCast(Val12, Int64Ty, false);
  return Builder.CreateOr(Val11, Val13);
}
case ARM::BI__builtin_arm_mve_vmlaldavaq_s16:
case ARM::BI__builtin_arm_mve_vmlaldavaq_s32:
case ARM::BI__builtin_arm_mve_vmlaldavaq_u16:
case ARM::BI__builtin_arm_mve_vmlaldavaq_u32:
case ARM::BI__builtin_arm_mve_vmlaldavaxq_s16:
case ARM::BI__builtin_arm_mve_vmlaldavaxq_s32:
case ARM::BI__builtin_arm_mve_vmlsldavaq_s16:
case ARM::BI__builtin_arm_mve_vmlsldavaq_s32:
case ARM::BI__builtin_arm_mve_vmlsldavaxq_s16:
case ARM::BI__builtin_arm_mve_vmlsldavaxq_s32:
case ARM::BI__builtin_arm_mve_vrmlaldavhaq_s32:
case ARM::BI__builtin_arm_mve_vrmlaldavhaq_u32:
case ARM::BI__builtin_arm_mve_vrmlaldavhaxq_s32:
case ARM::BI__builtin_arm_mve_vrmlsldavhaq_s32:
case ARM::BI__builtin_arm_mve_vrmlsldavhaxq_s32: {
  uint32_t  Param0;
  uint32_t  Param1;
  uint32_t  Param2;
  Intrinsic::ID  Param3;
  llvm::Type * Param4;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmlaldavaq_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavaq_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavaq_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavaq_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavaxq_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavaxq_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlsldavaq_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlsldavaq_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlsldavaxq_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlsldavaxq_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlaldavhaq_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vrmlldavha;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlaldavhaq_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vrmlldavha;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlaldavhaxq_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vrmlldavha;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlsldavhaq_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vrmlldavha;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlsldavhaxq_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vrmlldavha;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = llvm::ConstantInt::get(Int64Ty, 32);
  Value *Val2 = Builder.CreateLShr(Val0, Val1);
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val7 = llvm::ConstantInt::get(Int32Ty, Param2);
  Value *Val8 = EmitScalarExpr(E->getArg(1));
  Value *Val9 = EmitScalarExpr(E->getArg(2));
  Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Param3, {Param4}), {Val5, Val6, Val7, Val4, Val3, Val8, Val9});
  Value *Val11 = Builder.CreateExtractValue(Val10, static_cast<unsigned>(1));
  Value *Val12 = Builder.CreateIntCast(Val11, Int64Ty, false);
  Value *Val13 = llvm::ConstantInt::get(Int64Ty, 32);
  Value *Val14 = Builder.CreateShl(Val12, Val13);
  Value *Val15 = Builder.CreateExtractValue(Val10, static_cast<unsigned>(0));
  Value *Val16 = Builder.CreateIntCast(Val15, Int64Ty, false);
  return Builder.CreateOr(Val14, Val16);
}
case ARM::BI__builtin_arm_mve_vmlaldavaq_p_s16:
case ARM::BI__builtin_arm_mve_vmlaldavaq_p_s32:
case ARM::BI__builtin_arm_mve_vmlaldavaq_p_u16:
case ARM::BI__builtin_arm_mve_vmlaldavaq_p_u32:
case ARM::BI__builtin_arm_mve_vmlaldavaxq_p_s16:
case ARM::BI__builtin_arm_mve_vmlaldavaxq_p_s32:
case ARM::BI__builtin_arm_mve_vmlsldavaq_p_s16:
case ARM::BI__builtin_arm_mve_vmlsldavaq_p_s32:
case ARM::BI__builtin_arm_mve_vmlsldavaxq_p_s16:
case ARM::BI__builtin_arm_mve_vmlsldavaxq_p_s32:
case ARM::BI__builtin_arm_mve_vrmlaldavhaq_p_s32:
case ARM::BI__builtin_arm_mve_vrmlaldavhaq_p_u32:
case ARM::BI__builtin_arm_mve_vrmlaldavhaxq_p_s32:
case ARM::BI__builtin_arm_mve_vrmlsldavhaq_p_s32:
case ARM::BI__builtin_arm_mve_vrmlsldavhaxq_p_s32: {
  uint32_t  Param0;
  uint32_t  Param1;
  uint32_t  Param2;
  llvm::Type * Param3;
  Intrinsic::ID  Param4;
  llvm::Type * Param5;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmlaldavaq_p_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavaq_p_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavaq_p_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavaq_p_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavaxq_p_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavaxq_p_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlsldavaq_p_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlsldavaq_p_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlsldavaxq_p_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlsldavaxq_p_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlaldavhaq_p_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlaldavhaq_p_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlaldavhaxq_p_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlsldavhaq_p_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlsldavhaxq_p_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  Value *Val1 = llvm::ConstantInt::get(Int64Ty, 32);
  Value *Val2 = Builder.CreateLShr(Val0, Val1);
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val7 = llvm::ConstantInt::get(Int32Ty, Param2);
  Value *Val8 = EmitScalarExpr(E->getArg(1));
  Value *Val9 = EmitScalarExpr(E->getArg(2));
  Value *Val10 = EmitScalarExpr(E->getArg(3));
  Value *Val11 = Builder.CreateIntCast(Val10, Int32Ty, false);
  Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val11});
  Value *Val13 = Builder.CreateCall(CGM.getIntrinsic(Param4, {Param5, Param3}), {Val5, Val6, Val7, Val4, Val3, Val8, Val9, Val12});
  Value *Val14 = Builder.CreateExtractValue(Val13, static_cast<unsigned>(1));
  Value *Val15 = Builder.CreateIntCast(Val14, Int64Ty, false);
  Value *Val16 = llvm::ConstantInt::get(Int64Ty, 32);
  Value *Val17 = Builder.CreateShl(Val15, Val16);
  Value *Val18 = Builder.CreateExtractValue(Val13, static_cast<unsigned>(0));
  Value *Val19 = Builder.CreateIntCast(Val18, Int64Ty, false);
  return Builder.CreateOr(Val17, Val19);
}
case ARM::BI__builtin_arm_mve_vreinterpretq_f32_f16:
case ARM::BI__builtin_arm_mve_vreinterpretq_f32_s16:
case ARM::BI__builtin_arm_mve_vreinterpretq_f32_s32:
case ARM::BI__builtin_arm_mve_vreinterpretq_f32_s64:
case ARM::BI__builtin_arm_mve_vreinterpretq_f32_s8:
case ARM::BI__builtin_arm_mve_vreinterpretq_f32_u16:
case ARM::BI__builtin_arm_mve_vreinterpretq_f32_u32:
case ARM::BI__builtin_arm_mve_vreinterpretq_f32_u64:
case ARM::BI__builtin_arm_mve_vreinterpretq_f32_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(FloatTy, 4);
  return ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vcvtq_f32_s32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(FloatTy, 4);
  return Builder.CreateSIToFP(Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vcvtq_f32_u32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(FloatTy, 4);
  return Builder.CreateUIToFP(Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vreinterpretq_f16_f32:
case ARM::BI__builtin_arm_mve_vreinterpretq_f16_s16:
case ARM::BI__builtin_arm_mve_vreinterpretq_f16_s32:
case ARM::BI__builtin_arm_mve_vreinterpretq_f16_s64:
case ARM::BI__builtin_arm_mve_vreinterpretq_f16_s8:
case ARM::BI__builtin_arm_mve_vreinterpretq_f16_u16:
case ARM::BI__builtin_arm_mve_vreinterpretq_f16_u32:
case ARM::BI__builtin_arm_mve_vreinterpretq_f16_u64:
case ARM::BI__builtin_arm_mve_vreinterpretq_f16_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(HalfTy, 8);
  return ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vcvtq_f16_s16: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(HalfTy, 8);
  return Builder.CreateSIToFP(Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vcvtq_f16_u16: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(HalfTy, 8);
  return Builder.CreateUIToFP(Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vqnegq_s16: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val2 = ARMMVEConstantSplat<1,0>(Builder, Val1);
  Value *Val3 = Builder.CreateICmpEQ(Val0, Val2);
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val5 = ARMMVEConstantSplat<0,1>(Builder, Val4);
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val7 = llvm::Constant::getNullValue(Val6);
  Value *Val8 = Builder.CreateSub(Val7, Val0);
  return Builder.CreateSelect(Val3, Val5, Val8);
}
case ARM::BI__builtin_arm_mve_vmvnq_s16:
case ARM::BI__builtin_arm_mve_vmvnq_u16: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val2 = ARMMVEConstantSplat<1,1>(Builder, Val1);
  return Builder.CreateXor(Val0, Val2);
}
case ARM::BI__builtin_arm_mve_vmovntq_s16:
case ARM::BI__builtin_arm_mve_vmovntq_u16: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val2 = ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = VectorZip(Builder, Val2, Val3);
  llvm::Type *Val5 = llvm::FixedVectorType::get(Int8Ty, 16);
  return Builder.CreateTrunc(Val4, Val5);
}
case ARM::BI__builtin_arm_mve_vandq_f16: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val2 = Builder.CreateBitCast(Val0, Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val5 = Builder.CreateBitCast(Val3, Val4);
  Value *Val6 = Builder.CreateAnd(Val2, Val5);
  llvm::Type *Val7 = llvm::FixedVectorType::get(HalfTy, 8);
  return Builder.CreateBitCast(Val6, Val7);
}
case ARM::BI__builtin_arm_mve_vbicq_f16: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val2 = Builder.CreateBitCast(Val0, Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val5 = Builder.CreateBitCast(Val3, Val4);
  Value *Val6 = Builder.CreateNot(Val5);
  Value *Val7 = Builder.CreateAnd(Val2, Val6);
  llvm::Type *Val8 = llvm::FixedVectorType::get(HalfTy, 8);
  return Builder.CreateBitCast(Val7, Val8);
}
case ARM::BI__builtin_arm_mve_vornq_f16: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val2 = Builder.CreateBitCast(Val0, Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val5 = Builder.CreateBitCast(Val3, Val4);
  Value *Val6 = Builder.CreateNot(Val5);
  Value *Val7 = Builder.CreateOr(Val2, Val6);
  llvm::Type *Val8 = llvm::FixedVectorType::get(HalfTy, 8);
  return Builder.CreateBitCast(Val7, Val8);
}
case ARM::BI__builtin_arm_mve_vorrq_f16: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val2 = Builder.CreateBitCast(Val0, Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val5 = Builder.CreateBitCast(Val3, Val4);
  Value *Val6 = Builder.CreateOr(Val2, Val5);
  llvm::Type *Val7 = llvm::FixedVectorType::get(HalfTy, 8);
  return Builder.CreateBitCast(Val6, Val7);
}
case ARM::BI__builtin_arm_mve_veorq_f16: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val2 = Builder.CreateBitCast(Val0, Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val5 = Builder.CreateBitCast(Val3, Val4);
  Value *Val6 = Builder.CreateXor(Val2, Val5);
  llvm::Type *Val7 = llvm::FixedVectorType::get(HalfTy, 8);
  return Builder.CreateBitCast(Val6, Val7);
}
case ARM::BI__builtin_arm_mve_vqabsq_s16: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val2 = llvm::Constant::getNullValue(Val1);
  Value *Val3 = Builder.CreateICmpSGT(Val0, Val2);
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val5 = ARMMVEConstantSplat<1,0>(Builder, Val4);
  Value *Val6 = Builder.CreateICmpEQ(Val0, Val5);
  llvm::Type *Val7 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val8 = ARMMVEConstantSplat<0,1>(Builder, Val7);
  llvm::Type *Val9 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val10 = llvm::Constant::getNullValue(Val9);
  Value *Val11 = Builder.CreateSub(Val10, Val0);
  Value *Val12 = Builder.CreateSelect(Val6, Val8, Val11);
  return Builder.CreateSelect(Val3, Val0, Val12);
}
case ARM::BI__builtin_arm_mve_vabsq_s16: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val2 = llvm::Constant::getNullValue(Val1);
  Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val5 = llvm::Constant::getNullValue(Val4);
  Value *Val6 = Builder.CreateSub(Val5, Val0);
  return Builder.CreateSelect(Val3, Val6, Val0);
}
case ARM::BI__builtin_arm_mve_vreinterpretq_s16_f16:
case ARM::BI__builtin_arm_mve_vreinterpretq_s16_f32:
case ARM::BI__builtin_arm_mve_vreinterpretq_s16_s32:
case ARM::BI__builtin_arm_mve_vreinterpretq_s16_s64:
case ARM::BI__builtin_arm_mve_vreinterpretq_s16_s8:
case ARM::BI__builtin_arm_mve_vreinterpretq_s16_u16:
case ARM::BI__builtin_arm_mve_vreinterpretq_s16_u32:
case ARM::BI__builtin_arm_mve_vreinterpretq_s16_u64:
case ARM::BI__builtin_arm_mve_vreinterpretq_s16_u8:
case ARM::BI__builtin_arm_mve_vreinterpretq_u16_f16:
case ARM::BI__builtin_arm_mve_vreinterpretq_u16_f32:
case ARM::BI__builtin_arm_mve_vreinterpretq_u16_s16:
case ARM::BI__builtin_arm_mve_vreinterpretq_u16_s32:
case ARM::BI__builtin_arm_mve_vreinterpretq_u16_s64:
case ARM::BI__builtin_arm_mve_vreinterpretq_u16_s8:
case ARM::BI__builtin_arm_mve_vreinterpretq_u16_u32:
case ARM::BI__builtin_arm_mve_vreinterpretq_u16_u64:
case ARM::BI__builtin_arm_mve_vreinterpretq_u16_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
  return ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vcvtq_s16_f16: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
  return Builder.CreateFPToSI(Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vcvtq_u16_f16: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
  return Builder.CreateFPToUI(Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vqnegq_s32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val2 = ARMMVEConstantSplat<1,0>(Builder, Val1);
  Value *Val3 = Builder.CreateICmpEQ(Val0, Val2);
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val5 = ARMMVEConstantSplat<0,1>(Builder, Val4);
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val7 = llvm::Constant::getNullValue(Val6);
  Value *Val8 = Builder.CreateSub(Val7, Val0);
  return Builder.CreateSelect(Val3, Val5, Val8);
}
case ARM::BI__builtin_arm_mve_vmvnq_s32:
case ARM::BI__builtin_arm_mve_vmvnq_u32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val2 = ARMMVEConstantSplat<1,1>(Builder, Val1);
  return Builder.CreateXor(Val0, Val2);
}
case ARM::BI__builtin_arm_mve_vmovntq_s32:
case ARM::BI__builtin_arm_mve_vmovntq_u32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val2 = ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = VectorZip(Builder, Val2, Val3);
  llvm::Type *Val5 = llvm::FixedVectorType::get(Int16Ty, 8);
  return Builder.CreateTrunc(Val4, Val5);
}
case ARM::BI__builtin_arm_mve_vandq_f32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val2 = Builder.CreateBitCast(Val0, Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val5 = Builder.CreateBitCast(Val3, Val4);
  Value *Val6 = Builder.CreateAnd(Val2, Val5);
  llvm::Type *Val7 = llvm::FixedVectorType::get(FloatTy, 4);
  return Builder.CreateBitCast(Val6, Val7);
}
case ARM::BI__builtin_arm_mve_vbicq_f32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val2 = Builder.CreateBitCast(Val0, Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val5 = Builder.CreateBitCast(Val3, Val4);
  Value *Val6 = Builder.CreateNot(Val5);
  Value *Val7 = Builder.CreateAnd(Val2, Val6);
  llvm::Type *Val8 = llvm::FixedVectorType::get(FloatTy, 4);
  return Builder.CreateBitCast(Val7, Val8);
}
case ARM::BI__builtin_arm_mve_vornq_f32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val2 = Builder.CreateBitCast(Val0, Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val5 = Builder.CreateBitCast(Val3, Val4);
  Value *Val6 = Builder.CreateNot(Val5);
  Value *Val7 = Builder.CreateOr(Val2, Val6);
  llvm::Type *Val8 = llvm::FixedVectorType::get(FloatTy, 4);
  return Builder.CreateBitCast(Val7, Val8);
}
case ARM::BI__builtin_arm_mve_vorrq_f32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val2 = Builder.CreateBitCast(Val0, Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val5 = Builder.CreateBitCast(Val3, Val4);
  Value *Val6 = Builder.CreateOr(Val2, Val5);
  llvm::Type *Val7 = llvm::FixedVectorType::get(FloatTy, 4);
  return Builder.CreateBitCast(Val6, Val7);
}
case ARM::BI__builtin_arm_mve_veorq_f32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val2 = Builder.CreateBitCast(Val0, Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val5 = Builder.CreateBitCast(Val3, Val4);
  Value *Val6 = Builder.CreateXor(Val2, Val5);
  llvm::Type *Val7 = llvm::FixedVectorType::get(FloatTy, 4);
  return Builder.CreateBitCast(Val6, Val7);
}
case ARM::BI__builtin_arm_mve_vqabsq_s32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val2 = llvm::Constant::getNullValue(Val1);
  Value *Val3 = Builder.CreateICmpSGT(Val0, Val2);
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val5 = ARMMVEConstantSplat<1,0>(Builder, Val4);
  Value *Val6 = Builder.CreateICmpEQ(Val0, Val5);
  llvm::Type *Val7 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val8 = ARMMVEConstantSplat<0,1>(Builder, Val7);
  llvm::Type *Val9 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val10 = llvm::Constant::getNullValue(Val9);
  Value *Val11 = Builder.CreateSub(Val10, Val0);
  Value *Val12 = Builder.CreateSelect(Val6, Val8, Val11);
  return Builder.CreateSelect(Val3, Val0, Val12);
}
case ARM::BI__builtin_arm_mve_vabsq_s32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val2 = llvm::Constant::getNullValue(Val1);
  Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val5 = llvm::Constant::getNullValue(Val4);
  Value *Val6 = Builder.CreateSub(Val5, Val0);
  return Builder.CreateSelect(Val3, Val6, Val0);
}
case ARM::BI__builtin_arm_mve_vreinterpretq_s32_f16:
case ARM::BI__builtin_arm_mve_vreinterpretq_s32_f32:
case ARM::BI__builtin_arm_mve_vreinterpretq_s32_s16:
case ARM::BI__builtin_arm_mve_vreinterpretq_s32_s64:
case ARM::BI__builtin_arm_mve_vreinterpretq_s32_s8:
case ARM::BI__builtin_arm_mve_vreinterpretq_s32_u16:
case ARM::BI__builtin_arm_mve_vreinterpretq_s32_u32:
case ARM::BI__builtin_arm_mve_vreinterpretq_s32_u64:
case ARM::BI__builtin_arm_mve_vreinterpretq_s32_u8:
case ARM::BI__builtin_arm_mve_vreinterpretq_u32_f16:
case ARM::BI__builtin_arm_mve_vreinterpretq_u32_f32:
case ARM::BI__builtin_arm_mve_vreinterpretq_u32_s16:
case ARM::BI__builtin_arm_mve_vreinterpretq_u32_s32:
case ARM::BI__builtin_arm_mve_vreinterpretq_u32_s64:
case ARM::BI__builtin_arm_mve_vreinterpretq_u32_s8:
case ARM::BI__builtin_arm_mve_vreinterpretq_u32_u16:
case ARM::BI__builtin_arm_mve_vreinterpretq_u32_u64:
case ARM::BI__builtin_arm_mve_vreinterpretq_u32_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
  return ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vcvtq_s32_f32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
  return Builder.CreateFPToSI(Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vcvtq_u32_f32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
  return Builder.CreateFPToUI(Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vreinterpretq_s64_f16:
case ARM::BI__builtin_arm_mve_vreinterpretq_s64_f32:
case ARM::BI__builtin_arm_mve_vreinterpretq_s64_s16:
case ARM::BI__builtin_arm_mve_vreinterpretq_s64_s32:
case ARM::BI__builtin_arm_mve_vreinterpretq_s64_s8:
case ARM::BI__builtin_arm_mve_vreinterpretq_s64_u16:
case ARM::BI__builtin_arm_mve_vreinterpretq_s64_u32:
case ARM::BI__builtin_arm_mve_vreinterpretq_s64_u64:
case ARM::BI__builtin_arm_mve_vreinterpretq_s64_u8:
case ARM::BI__builtin_arm_mve_vreinterpretq_u64_f16:
case ARM::BI__builtin_arm_mve_vreinterpretq_u64_f32:
case ARM::BI__builtin_arm_mve_vreinterpretq_u64_s16:
case ARM::BI__builtin_arm_mve_vreinterpretq_u64_s32:
case ARM::BI__builtin_arm_mve_vreinterpretq_u64_s64:
case ARM::BI__builtin_arm_mve_vreinterpretq_u64_s8:
case ARM::BI__builtin_arm_mve_vreinterpretq_u64_u16:
case ARM::BI__builtin_arm_mve_vreinterpretq_u64_u32:
case ARM::BI__builtin_arm_mve_vreinterpretq_u64_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int64Ty, 2);
  return ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vqnegq_s8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val2 = ARMMVEConstantSplat<1,0>(Builder, Val1);
  Value *Val3 = Builder.CreateICmpEQ(Val0, Val2);
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val5 = ARMMVEConstantSplat<0,1>(Builder, Val4);
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val7 = llvm::Constant::getNullValue(Val6);
  Value *Val8 = Builder.CreateSub(Val7, Val0);
  return Builder.CreateSelect(Val3, Val5, Val8);
}
case ARM::BI__builtin_arm_mve_vmvnq_s8:
case ARM::BI__builtin_arm_mve_vmvnq_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val2 = ARMMVEConstantSplat<1,1>(Builder, Val1);
  return Builder.CreateXor(Val0, Val2);
}
case ARM::BI__builtin_arm_mve_vqabsq_s8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val2 = llvm::Constant::getNullValue(Val1);
  Value *Val3 = Builder.CreateICmpSGT(Val0, Val2);
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val5 = ARMMVEConstantSplat<1,0>(Builder, Val4);
  Value *Val6 = Builder.CreateICmpEQ(Val0, Val5);
  llvm::Type *Val7 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val8 = ARMMVEConstantSplat<0,1>(Builder, Val7);
  llvm::Type *Val9 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val10 = llvm::Constant::getNullValue(Val9);
  Value *Val11 = Builder.CreateSub(Val10, Val0);
  Value *Val12 = Builder.CreateSelect(Val6, Val8, Val11);
  return Builder.CreateSelect(Val3, Val0, Val12);
}
case ARM::BI__builtin_arm_mve_vabsq_s8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val2 = llvm::Constant::getNullValue(Val1);
  Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val5 = llvm::Constant::getNullValue(Val4);
  Value *Val6 = Builder.CreateSub(Val5, Val0);
  return Builder.CreateSelect(Val3, Val6, Val0);
}
case ARM::BI__builtin_arm_mve_vreinterpretq_s8_f16:
case ARM::BI__builtin_arm_mve_vreinterpretq_s8_f32:
case ARM::BI__builtin_arm_mve_vreinterpretq_s8_s16:
case ARM::BI__builtin_arm_mve_vreinterpretq_s8_s32:
case ARM::BI__builtin_arm_mve_vreinterpretq_s8_s64:
case ARM::BI__builtin_arm_mve_vreinterpretq_s8_u16:
case ARM::BI__builtin_arm_mve_vreinterpretq_s8_u32:
case ARM::BI__builtin_arm_mve_vreinterpretq_s8_u64:
case ARM::BI__builtin_arm_mve_vreinterpretq_s8_u8:
case ARM::BI__builtin_arm_mve_vreinterpretq_u8_f16:
case ARM::BI__builtin_arm_mve_vreinterpretq_u8_f32:
case ARM::BI__builtin_arm_mve_vreinterpretq_u8_s16:
case ARM::BI__builtin_arm_mve_vreinterpretq_u8_s32:
case ARM::BI__builtin_arm_mve_vreinterpretq_u8_s64:
case ARM::BI__builtin_arm_mve_vreinterpretq_u8_s8:
case ARM::BI__builtin_arm_mve_vreinterpretq_u8_u16:
case ARM::BI__builtin_arm_mve_vreinterpretq_u8_u32:
case ARM::BI__builtin_arm_mve_vreinterpretq_u8_u64: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
  return ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
}
case ARM::BI__builtin_arm_mve_vrev16q_s8:
case ARM::BI__builtin_arm_mve_vrev16q_u8:
case ARM::BI__builtin_arm_mve_vrev32q_f16:
case ARM::BI__builtin_arm_mve_vrev32q_s16:
case ARM::BI__builtin_arm_mve_vrev32q_s8:
case ARM::BI__builtin_arm_mve_vrev32q_u16:
case ARM::BI__builtin_arm_mve_vrev32q_u8:
case ARM::BI__builtin_arm_mve_vrev64q_f16:
case ARM::BI__builtin_arm_mve_vrev64q_f32:
case ARM::BI__builtin_arm_mve_vrev64q_s16:
case ARM::BI__builtin_arm_mve_vrev64q_s32:
case ARM::BI__builtin_arm_mve_vrev64q_s8:
case ARM::BI__builtin_arm_mve_vrev64q_u16:
case ARM::BI__builtin_arm_mve_vrev64q_u32:
case ARM::BI__builtin_arm_mve_vrev64q_u8: {
  unsigned  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vrev16q_s8:
    Param0 = 16;
    break;
  case ARM::BI__builtin_arm_mve_vrev16q_u8:
    Param0 = 16;
    break;
  case ARM::BI__builtin_arm_mve_vrev32q_f16:
    Param0 = 32;
    break;
  case ARM::BI__builtin_arm_mve_vrev32q_s16:
    Param0 = 32;
    break;
  case ARM::BI__builtin_arm_mve_vrev32q_s8:
    Param0 = 32;
    break;
  case ARM::BI__builtin_arm_mve_vrev32q_u16:
    Param0 = 32;
    break;
  case ARM::BI__builtin_arm_mve_vrev32q_u8:
    Param0 = 32;
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_f16:
    Param0 = 64;
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_f32:
    Param0 = 64;
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_s16:
    Param0 = 64;
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_s32:
    Param0 = 64;
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_s8:
    Param0 = 64;
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_u16:
    Param0 = 64;
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_u32:
    Param0 = 64;
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_u8:
    Param0 = 64;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  return ARMMVEVectorElementReverse(Builder, Val0, static_cast<unsigned>(Param0));
}
case ARM::BI__builtin_arm_mve_vdupq_n_f16:
case ARM::BI__builtin_arm_mve_vdupq_n_f32:
case ARM::BI__builtin_arm_mve_vdupq_n_s16:
case ARM::BI__builtin_arm_mve_vdupq_n_s32:
case ARM::BI__builtin_arm_mve_vdupq_n_s8:
case ARM::BI__builtin_arm_mve_vdupq_n_u16:
case ARM::BI__builtin_arm_mve_vdupq_n_u32:
case ARM::BI__builtin_arm_mve_vdupq_n_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  return ARMMVEVectorSplat(Builder, Val0);
}
case ARM::BI__builtin_arm_mve_vabsq_f16:
case ARM::BI__builtin_arm_mve_vabsq_f32:
case ARM::BI__builtin_arm_mve_vclsq_s16:
case ARM::BI__builtin_arm_mve_vclsq_s32:
case ARM::BI__builtin_arm_mve_vclsq_s8:
case ARM::BI__builtin_arm_mve_vrndaq_f16:
case ARM::BI__builtin_arm_mve_vrndaq_f32:
case ARM::BI__builtin_arm_mve_vrndmq_f16:
case ARM::BI__builtin_arm_mve_vrndmq_f32:
case ARM::BI__builtin_arm_mve_vrndnq_f16:
case ARM::BI__builtin_arm_mve_vrndnq_f32:
case ARM::BI__builtin_arm_mve_vrndpq_f16:
case ARM::BI__builtin_arm_mve_vrndpq_f32:
case ARM::BI__builtin_arm_mve_vrndq_f16:
case ARM::BI__builtin_arm_mve_vrndq_f32:
case ARM::BI__builtin_arm_mve_vrndxq_f16:
case ARM::BI__builtin_arm_mve_vrndxq_f32: {
  Intrinsic::ID  Param0;
  llvm::Type * Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vabsq_f16:
    Param0 = Intrinsic::fabs;
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vabsq_f32:
    Param0 = Intrinsic::fabs;
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vclsq_s16:
    Param0 = Intrinsic::arm_mve_vcls;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vclsq_s32:
    Param0 = Intrinsic::arm_mve_vcls;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vclsq_s8:
    Param0 = Intrinsic::arm_mve_vcls;
    Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrndaq_f16:
    Param0 = Intrinsic::round;
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrndaq_f32:
    Param0 = Intrinsic::round;
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrndmq_f16:
    Param0 = Intrinsic::floor;
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrndmq_f32:
    Param0 = Intrinsic::floor;
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrndnq_f16:
    Param0 = Intrinsic::arm_mve_vrintn;
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrndnq_f32:
    Param0 = Intrinsic::arm_mve_vrintn;
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrndpq_f16:
    Param0 = Intrinsic::ceil;
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrndpq_f32:
    Param0 = Intrinsic::ceil;
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrndq_f16:
    Param0 = Intrinsic::trunc;
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrndq_f32:
    Param0 = Intrinsic::trunc;
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrndxq_f16:
    Param0 = Intrinsic::rint;
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrndxq_f32:
    Param0 = Intrinsic::rint;
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0});
}
case ARM::BI__builtin_arm_mve_vnegq_f16:
case ARM::BI__builtin_arm_mve_vnegq_f32: {
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateFNeg(Val0);
}
case ARM::BI__builtin_arm_mve_vshrq_n_s16:
case ARM::BI__builtin_arm_mve_vshrq_n_s32:
case ARM::BI__builtin_arm_mve_vshrq_n_s8:
case ARM::BI__builtin_arm_mve_vshrq_n_u16:
case ARM::BI__builtin_arm_mve_vshrq_n_u32:
case ARM::BI__builtin_arm_mve_vshrq_n_u8: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vshrq_n_s16:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vshrq_n_s32:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vshrq_n_s8:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vshrq_n_u16:
    Param0 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vshrq_n_u32:
    Param0 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vshrq_n_u8:
    Param0 = 1;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(0));
  return MVEImmediateShr(Builder, Val0, GetIntegerConstantValue<unsigned>(E->getArg(1), getContext()), static_cast<bool>(Param0));
}
case ARM::BI__builtin_arm_mve_vst1q_p_f16:
case ARM::BI__builtin_arm_mve_vst1q_p_f32:
case ARM::BI__builtin_arm_mve_vst1q_p_s16:
case ARM::BI__builtin_arm_mve_vst1q_p_s32:
case ARM::BI__builtin_arm_mve_vst1q_p_s8:
case ARM::BI__builtin_arm_mve_vst1q_p_u16:
case ARM::BI__builtin_arm_mve_vst1q_p_u32:
case ARM::BI__builtin_arm_mve_vst1q_p_u8:
case ARM::BI__builtin_arm_mve_vstrbq_p_s8:
case ARM::BI__builtin_arm_mve_vstrbq_p_u8:
case ARM::BI__builtin_arm_mve_vstrhq_p_f16:
case ARM::BI__builtin_arm_mve_vstrhq_p_s16:
case ARM::BI__builtin_arm_mve_vstrhq_p_u16:
case ARM::BI__builtin_arm_mve_vstrwq_p_f32:
case ARM::BI__builtin_arm_mve_vstrwq_p_s32:
case ARM::BI__builtin_arm_mve_vstrwq_p_u32: {
  llvm::Type * Param0;
  uint32_t  Param1;
  llvm::Type * Param2;
  llvm::Type * Param3;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vst1q_p_f16:
    Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(HalfTy, 8));
    Param1 = 2;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vst1q_p_f32:
    Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(FloatTy, 4));
    Param1 = 4;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vst1q_p_s16:
    Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8));
    Param1 = 2;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vst1q_p_s32:
    Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4));
    Param1 = 4;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vst1q_p_s8:
    Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16));
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vst1q_p_u16:
    Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8));
    Param1 = 2;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vst1q_p_u32:
    Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4));
    Param1 = 4;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vst1q_p_u8:
    Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16));
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vstrbq_p_s8:
    Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16));
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vstrbq_p_u8:
    Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16));
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_p_f16:
    Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(HalfTy, 8));
    Param1 = 2;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_p_s16:
    Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8));
    Param1 = 2;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vstrhq_p_u16:
    Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8));
    Param1 = 2;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_p_f32:
    Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(FloatTy, 4));
    Param1 = 4;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_p_s32:
    Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4));
    Param1 = 4;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vstrwq_p_u32:
    Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4));
    Param1 = 4;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Address Val1 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val2 = Builder.CreatePointerCast((Val1.getPointer()), Param0);
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val4 = EmitScalarExpr(E->getArg(2));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param2}), {Val5});
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_store, {Param3, Param0}), {Val0, Val2, Val3, Val6});
}
case ARM::BI__builtin_arm_mve_vst1q_f32:
case ARM::BI__builtin_arm_mve_vstrwq_f32: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Address Val1 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val2 = Builder.CreatePointerCast((Val1.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(FloatTy, 4)));
  Address Val3 = Address(Val2, llvm::FixedVectorType::get(FloatTy, 4), CharUnits::fromQuantity(4));
  return Builder.CreateStore(Val0, Val3);
}
case ARM::BI__builtin_arm_mve_vst1q_f16:
case ARM::BI__builtin_arm_mve_vstrhq_f16: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Address Val1 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val2 = Builder.CreatePointerCast((Val1.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(HalfTy, 8)));
  Address Val3 = Address(Val2, llvm::FixedVectorType::get(HalfTy, 8), CharUnits::fromQuantity(2));
  return Builder.CreateStore(Val0, Val3);
}
case ARM::BI__builtin_arm_mve_vst1q_s16:
case ARM::BI__builtin_arm_mve_vst1q_u16:
case ARM::BI__builtin_arm_mve_vstrhq_s16:
case ARM::BI__builtin_arm_mve_vstrhq_u16: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Address Val1 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val2 = Builder.CreatePointerCast((Val1.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8)));
  Address Val3 = Address(Val2, llvm::FixedVectorType::get(Int16Ty, 8), CharUnits::fromQuantity(2));
  return Builder.CreateStore(Val0, Val3);
}
case ARM::BI__builtin_arm_mve_vst1q_s32:
case ARM::BI__builtin_arm_mve_vst1q_u32:
case ARM::BI__builtin_arm_mve_vstrwq_s32:
case ARM::BI__builtin_arm_mve_vstrwq_u32: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Address Val1 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val2 = Builder.CreatePointerCast((Val1.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4)));
  Address Val3 = Address(Val2, llvm::FixedVectorType::get(Int32Ty, 4), CharUnits::fromQuantity(4));
  return Builder.CreateStore(Val0, Val3);
}
case ARM::BI__builtin_arm_mve_vst1q_s8:
case ARM::BI__builtin_arm_mve_vst1q_u8:
case ARM::BI__builtin_arm_mve_vstrbq_s8:
case ARM::BI__builtin_arm_mve_vstrbq_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Address Val1 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val2 = Builder.CreatePointerCast((Val1.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16)));
  Address Val3 = Address(Val2, llvm::FixedVectorType::get(Int8Ty, 16), CharUnits::fromQuantity(1));
  return Builder.CreateStore(Val0, Val3);
}
case ARM::BI__builtin_arm_mve_vctp16q_m:
case ARM::BI__builtin_arm_mve_vctp32q_m:
case ARM::BI__builtin_arm_mve_vctp64q_m:
case ARM::BI__builtin_arm_mve_vctp8q_m: {
  llvm::Type * Param0;
  Intrinsic::ID  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vctp16q_m:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vctp16;
    break;
  case ARM::BI__builtin_arm_mve_vctp32q_m:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vctp32;
    break;
  case ARM::BI__builtin_arm_mve_vctp64q_m:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param1 = Intrinsic::arm_mve_vctp64;
    break;
  case ARM::BI__builtin_arm_mve_vctp8q_m:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vctp8;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Param1), {Val3});
  Value *Val5 = Builder.CreateAnd(Val2, Val4);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val5});
  return Builder.CreateIntCast(Val6, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vmovnbq_s16:
case ARM::BI__builtin_arm_mve_vmovnbq_u16: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = EmitScalarExpr(E->getArg(0));
  Value *Val2 = ARMMVEVectorElementReverse(Builder, Val1, static_cast<unsigned>(16));
  llvm::Type *Val3 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val4 = ARMMVEVectorReinterpret(Builder, this, Val2, Val3);
  Value *Val5 = VectorZip(Builder, Val0, Val4);
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 16);
  return Builder.CreateTrunc(Val5, Val6);
}
case ARM::BI__builtin_arm_mve_vmovnbq_s32:
case ARM::BI__builtin_arm_mve_vmovnbq_u32: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = EmitScalarExpr(E->getArg(0));
  Value *Val2 = ARMMVEVectorElementReverse(Builder, Val1, static_cast<unsigned>(32));
  llvm::Type *Val3 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val4 = ARMMVEVectorReinterpret(Builder, this, Val2, Val3);
  Value *Val5 = VectorZip(Builder, Val0, Val4);
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 8);
  return Builder.CreateTrunc(Val5, Val6);
}
case ARM::BI__builtin_arm_mve_vsetq_lane_f16:
case ARM::BI__builtin_arm_mve_vsetq_lane_f32:
case ARM::BI__builtin_arm_mve_vsetq_lane_s16:
case ARM::BI__builtin_arm_mve_vsetq_lane_s32:
case ARM::BI__builtin_arm_mve_vsetq_lane_s64:
case ARM::BI__builtin_arm_mve_vsetq_lane_s8:
case ARM::BI__builtin_arm_mve_vsetq_lane_u16:
case ARM::BI__builtin_arm_mve_vsetq_lane_u32:
case ARM::BI__builtin_arm_mve_vsetq_lane_u64:
case ARM::BI__builtin_arm_mve_vsetq_lane_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = EmitScalarExpr(E->getArg(0));
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  return Builder.CreateInsertElement(Val0, Val1, Val2);
}
case ARM::BI__builtin_arm_mve_vfmaq_m_f16:
case ARM::BI__builtin_arm_mve_vfmaq_m_f32: {
  llvm::Type * Param0;
  llvm::Type * Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vfmaq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vfmaq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = EmitScalarExpr(E->getArg(2));
  Value *Val2 = (Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(3));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val5});
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_fma_predicated, {Param1, Param0}), {Val0, Val2, Val3, Val6});
}
case ARM::BI__builtin_arm_mve_vfmaq_f16:
case ARM::BI__builtin_arm_mve_vfmaq_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vfmaq_f16:
    Param0 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vfmaq_f32:
    Param0 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = EmitScalarExpr(E->getArg(2));
  Value *Val2 = (Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fma, {Param0}), {Val0, Val2, Val3});
}
case ARM::BI__builtin_arm_mve_vmlaq_n_s16:
case ARM::BI__builtin_arm_mve_vmlaq_n_s32:
case ARM::BI__builtin_arm_mve_vmlaq_n_s8:
case ARM::BI__builtin_arm_mve_vmlaq_n_u16:
case ARM::BI__builtin_arm_mve_vmlaq_n_u32:
case ARM::BI__builtin_arm_mve_vmlaq_n_u8: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = EmitScalarExpr(E->getArg(2));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = Builder.CreateMul(Val0, Val2);
  Value *Val4 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateAdd(Val3, Val4);
}
case ARM::BI__builtin_arm_mve_vaddq_m_n_f16:
case ARM::BI__builtin_arm_mve_vaddq_m_n_f32:
case ARM::BI__builtin_arm_mve_vaddq_m_n_s16:
case ARM::BI__builtin_arm_mve_vaddq_m_n_s32:
case ARM::BI__builtin_arm_mve_vaddq_m_n_s8:
case ARM::BI__builtin_arm_mve_vaddq_m_n_u16:
case ARM::BI__builtin_arm_mve_vaddq_m_n_u32:
case ARM::BI__builtin_arm_mve_vaddq_m_n_u8:
case ARM::BI__builtin_arm_mve_vmulq_m_n_f16:
case ARM::BI__builtin_arm_mve_vmulq_m_n_f32:
case ARM::BI__builtin_arm_mve_vmulq_m_n_s16:
case ARM::BI__builtin_arm_mve_vmulq_m_n_s32:
case ARM::BI__builtin_arm_mve_vmulq_m_n_s8:
case ARM::BI__builtin_arm_mve_vmulq_m_n_u16:
case ARM::BI__builtin_arm_mve_vmulq_m_n_u32:
case ARM::BI__builtin_arm_mve_vmulq_m_n_u8:
case ARM::BI__builtin_arm_mve_vqdmulhq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqdmulhq_m_n_s32:
case ARM::BI__builtin_arm_mve_vqdmulhq_m_n_s8:
case ARM::BI__builtin_arm_mve_vqrdmulhq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqrdmulhq_m_n_s32:
case ARM::BI__builtin_arm_mve_vqrdmulhq_m_n_s8:
case ARM::BI__builtin_arm_mve_vsubq_m_n_f16:
case ARM::BI__builtin_arm_mve_vsubq_m_n_f32:
case ARM::BI__builtin_arm_mve_vsubq_m_n_s16:
case ARM::BI__builtin_arm_mve_vsubq_m_n_s32:
case ARM::BI__builtin_arm_mve_vsubq_m_n_s8:
case ARM::BI__builtin_arm_mve_vsubq_m_n_u16:
case ARM::BI__builtin_arm_mve_vsubq_m_n_u32:
case ARM::BI__builtin_arm_mve_vsubq_m_n_u8: {
  llvm::Type * Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vaddq_m_n_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_add_predicated;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vaddq_m_n_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_add_predicated;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_add_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vaddq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_add_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_add_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vaddq_m_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_add_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vaddq_m_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_add_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddq_m_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_add_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmulq_m_n_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_mul_predicated;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmulq_m_n_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_mul_predicated;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmulq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_mul_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmulq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_mul_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmulq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_mul_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmulq_m_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_mul_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmulq_m_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_mul_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmulq_m_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_mul_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulhq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_qdmulh_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulhq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_qdmulh_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulhq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_qdmulh_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmulhq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_qrdmulh_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmulhq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_qrdmulh_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmulhq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_qrdmulh_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vsubq_m_n_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_sub_predicated;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vsubq_m_n_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_sub_predicated;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vsubq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_sub_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vsubq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_sub_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vsubq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_sub_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vsubq_m_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_sub_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vsubq_m_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_sub_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vsubq_m_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_sub_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = EmitScalarExpr(E->getArg(2));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(3));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val4});
  Value *Val6 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val2, Val5, Val6});
}
case ARM::BI__builtin_arm_mve_vqdmullbq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqdmullbq_m_n_s32:
case ARM::BI__builtin_arm_mve_vqdmulltq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqdmulltq_m_n_s32: {
  uint32_t  Param0;
  llvm::Type * Param1;
  llvm::Type * Param2;
  llvm::Type * Param3;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vqdmullbq_m_n_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmullbq_m_n_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulltq_m_n_s16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulltq_m_n_s32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = EmitScalarExpr(E->getArg(2));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = EmitScalarExpr(E->getArg(3));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val5});
  Value *Val7 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vqdmull_predicated, {Param2, Param3, Param1}), {Val0, Val2, Val3, Val6, Val7});
}
case ARM::BI__builtin_arm_mve_vhaddq_m_n_s16:
case ARM::BI__builtin_arm_mve_vhaddq_m_n_s32:
case ARM::BI__builtin_arm_mve_vhaddq_m_n_s8:
case ARM::BI__builtin_arm_mve_vhaddq_m_n_u16:
case ARM::BI__builtin_arm_mve_vhaddq_m_n_u32:
case ARM::BI__builtin_arm_mve_vhaddq_m_n_u8:
case ARM::BI__builtin_arm_mve_vhsubq_m_n_s16:
case ARM::BI__builtin_arm_mve_vhsubq_m_n_s32:
case ARM::BI__builtin_arm_mve_vhsubq_m_n_s8:
case ARM::BI__builtin_arm_mve_vhsubq_m_n_u16:
case ARM::BI__builtin_arm_mve_vhsubq_m_n_u32:
case ARM::BI__builtin_arm_mve_vhsubq_m_n_u8:
case ARM::BI__builtin_arm_mve_vqaddq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqaddq_m_n_s32:
case ARM::BI__builtin_arm_mve_vqaddq_m_n_s8:
case ARM::BI__builtin_arm_mve_vqaddq_m_n_u16:
case ARM::BI__builtin_arm_mve_vqaddq_m_n_u32:
case ARM::BI__builtin_arm_mve_vqaddq_m_n_u8:
case ARM::BI__builtin_arm_mve_vqsubq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqsubq_m_n_s32:
case ARM::BI__builtin_arm_mve_vqsubq_m_n_s8:
case ARM::BI__builtin_arm_mve_vqsubq_m_n_u16:
case ARM::BI__builtin_arm_mve_vqsubq_m_n_u32:
case ARM::BI__builtin_arm_mve_vqsubq_m_n_u8: {
  uint32_t  Param0;
  llvm::Type * Param1;
  Intrinsic::ID  Param2;
  llvm::Type * Param3;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vhaddq_m_n_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_hadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_m_n_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_hadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_m_n_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_hadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_m_n_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_hadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_m_n_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_hadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_m_n_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_hadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_m_n_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_hsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_m_n_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_hsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_m_n_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_hsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_m_n_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_hsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_m_n_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_hsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_m_n_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_hsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_m_n_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_qadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_m_n_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_qadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_m_n_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_qadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_m_n_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_qadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_m_n_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_qadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_m_n_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_qadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_m_n_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_qsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_m_n_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_qsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_m_n_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_qsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_m_n_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_qsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_m_n_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_qsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_m_n_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_qsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = EmitScalarExpr(E->getArg(2));
  Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = EmitScalarExpr(E->getArg(3));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val5});
  Value *Val7 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param1}), {Val0, Val2, Val3, Val6, Val7});
}
case ARM::BI__builtin_arm_mve_vfmsq_m_f16:
case ARM::BI__builtin_arm_mve_vfmsq_m_f32: {
  llvm::Type * Param0;
  llvm::Type * Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vfmsq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vfmsq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = EmitScalarExpr(E->getArg(2));
  Value *Val2 = Builder.CreateFNeg(Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(3));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val5});
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_fma_predicated, {Param1, Param0}), {Val0, Val2, Val3, Val6});
}
case ARM::BI__builtin_arm_mve_vfmsq_f16:
case ARM::BI__builtin_arm_mve_vfmsq_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vfmsq_f16:
    Param0 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vfmsq_f32:
    Param0 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = EmitScalarExpr(E->getArg(2));
  Value *Val2 = Builder.CreateFNeg(Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fma, {Param0}), {Val0, Val2, Val3});
}
case ARM::BI__builtin_arm_mve_vabsq_m_f16:
case ARM::BI__builtin_arm_mve_vabsq_m_f32:
case ARM::BI__builtin_arm_mve_vabsq_m_s16:
case ARM::BI__builtin_arm_mve_vabsq_m_s32:
case ARM::BI__builtin_arm_mve_vabsq_m_s8:
case ARM::BI__builtin_arm_mve_vclsq_m_s16:
case ARM::BI__builtin_arm_mve_vclsq_m_s32:
case ARM::BI__builtin_arm_mve_vclsq_m_s8:
case ARM::BI__builtin_arm_mve_vclzq_m_s16:
case ARM::BI__builtin_arm_mve_vclzq_m_s32:
case ARM::BI__builtin_arm_mve_vclzq_m_s8:
case ARM::BI__builtin_arm_mve_vclzq_m_u16:
case ARM::BI__builtin_arm_mve_vclzq_m_u32:
case ARM::BI__builtin_arm_mve_vclzq_m_u8:
case ARM::BI__builtin_arm_mve_vmvnq_m_s16:
case ARM::BI__builtin_arm_mve_vmvnq_m_s32:
case ARM::BI__builtin_arm_mve_vmvnq_m_s8:
case ARM::BI__builtin_arm_mve_vmvnq_m_u16:
case ARM::BI__builtin_arm_mve_vmvnq_m_u32:
case ARM::BI__builtin_arm_mve_vmvnq_m_u8:
case ARM::BI__builtin_arm_mve_vnegq_m_f16:
case ARM::BI__builtin_arm_mve_vnegq_m_f32:
case ARM::BI__builtin_arm_mve_vnegq_m_s16:
case ARM::BI__builtin_arm_mve_vnegq_m_s32:
case ARM::BI__builtin_arm_mve_vnegq_m_s8:
case ARM::BI__builtin_arm_mve_vqabsq_m_s16:
case ARM::BI__builtin_arm_mve_vqabsq_m_s32:
case ARM::BI__builtin_arm_mve_vqabsq_m_s8:
case ARM::BI__builtin_arm_mve_vqnegq_m_s16:
case ARM::BI__builtin_arm_mve_vqnegq_m_s32:
case ARM::BI__builtin_arm_mve_vqnegq_m_s8:
case ARM::BI__builtin_arm_mve_vrndaq_m_f16:
case ARM::BI__builtin_arm_mve_vrndaq_m_f32:
case ARM::BI__builtin_arm_mve_vrndmq_m_f16:
case ARM::BI__builtin_arm_mve_vrndmq_m_f32:
case ARM::BI__builtin_arm_mve_vrndnq_m_f16:
case ARM::BI__builtin_arm_mve_vrndnq_m_f32:
case ARM::BI__builtin_arm_mve_vrndpq_m_f16:
case ARM::BI__builtin_arm_mve_vrndpq_m_f32:
case ARM::BI__builtin_arm_mve_vrndq_m_f16:
case ARM::BI__builtin_arm_mve_vrndq_m_f32:
case ARM::BI__builtin_arm_mve_vrndxq_m_f16:
case ARM::BI__builtin_arm_mve_vrndxq_m_f32: {
  llvm::Type * Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vabsq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_abs_predicated;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vabsq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_abs_predicated;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vabsq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_abs_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vabsq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_abs_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vabsq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_abs_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vclsq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_cls_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vclsq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_cls_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vclsq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_cls_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vclzq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_clz_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vclzq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_clz_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vclzq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_clz_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vclzq_m_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_clz_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vclzq_m_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_clz_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vclzq_m_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_clz_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmvnq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_mvn_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmvnq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_mvn_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmvnq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_mvn_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmvnq_m_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_mvn_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmvnq_m_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_mvn_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmvnq_m_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_mvn_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vnegq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_neg_predicated;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vnegq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_neg_predicated;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vnegq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_neg_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vnegq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_neg_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vnegq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_neg_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqabsq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_qabs_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqabsq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_qabs_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqabsq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_qabs_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqnegq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_qneg_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqnegq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_qneg_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqnegq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_qneg_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrndaq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vrinta_predicated;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrndaq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vrinta_predicated;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrndmq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vrintm_predicated;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrndmq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vrintm_predicated;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrndnq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vrintn_predicated;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrndnq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vrintn_predicated;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrndpq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vrintp_predicated;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrndpq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vrintp_predicated;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrndq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vrintz_predicated;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrndq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vrintz_predicated;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrndxq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vrintx_predicated;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrndxq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vrintx_predicated;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = EmitScalarExpr(E->getArg(2));
  Value *Val2 = Builder.CreateIntCast(Val1, Int32Ty, false);
  Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val2});
  Value *Val4 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val3, Val4});
}
case ARM::BI__builtin_arm_mve_vaddq_m_f16:
case ARM::BI__builtin_arm_mve_vaddq_m_f32:
case ARM::BI__builtin_arm_mve_vaddq_m_s16:
case ARM::BI__builtin_arm_mve_vaddq_m_s32:
case ARM::BI__builtin_arm_mve_vaddq_m_s8:
case ARM::BI__builtin_arm_mve_vaddq_m_u16:
case ARM::BI__builtin_arm_mve_vaddq_m_u32:
case ARM::BI__builtin_arm_mve_vaddq_m_u8:
case ARM::BI__builtin_arm_mve_vmulq_m_f16:
case ARM::BI__builtin_arm_mve_vmulq_m_f32:
case ARM::BI__builtin_arm_mve_vmulq_m_s16:
case ARM::BI__builtin_arm_mve_vmulq_m_s32:
case ARM::BI__builtin_arm_mve_vmulq_m_s8:
case ARM::BI__builtin_arm_mve_vmulq_m_u16:
case ARM::BI__builtin_arm_mve_vmulq_m_u32:
case ARM::BI__builtin_arm_mve_vmulq_m_u8:
case ARM::BI__builtin_arm_mve_vqdmulhq_m_s16:
case ARM::BI__builtin_arm_mve_vqdmulhq_m_s32:
case ARM::BI__builtin_arm_mve_vqdmulhq_m_s8:
case ARM::BI__builtin_arm_mve_vqrdmulhq_m_s16:
case ARM::BI__builtin_arm_mve_vqrdmulhq_m_s32:
case ARM::BI__builtin_arm_mve_vqrdmulhq_m_s8:
case ARM::BI__builtin_arm_mve_vqshluq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqshluq_m_n_s32:
case ARM::BI__builtin_arm_mve_vqshluq_m_n_s8:
case ARM::BI__builtin_arm_mve_vshlq_m_n_s16:
case ARM::BI__builtin_arm_mve_vshlq_m_n_s32:
case ARM::BI__builtin_arm_mve_vshlq_m_n_s8:
case ARM::BI__builtin_arm_mve_vshlq_m_n_u16:
case ARM::BI__builtin_arm_mve_vshlq_m_n_u32:
case ARM::BI__builtin_arm_mve_vshlq_m_n_u8:
case ARM::BI__builtin_arm_mve_vsubq_m_f16:
case ARM::BI__builtin_arm_mve_vsubq_m_f32:
case ARM::BI__builtin_arm_mve_vsubq_m_s16:
case ARM::BI__builtin_arm_mve_vsubq_m_s32:
case ARM::BI__builtin_arm_mve_vsubq_m_s8:
case ARM::BI__builtin_arm_mve_vsubq_m_u16:
case ARM::BI__builtin_arm_mve_vsubq_m_u32:
case ARM::BI__builtin_arm_mve_vsubq_m_u8: {
  llvm::Type * Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vaddq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_add_predicated;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vaddq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_add_predicated;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_add_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vaddq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_add_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_add_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vaddq_m_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_add_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vaddq_m_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_add_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddq_m_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_add_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmulq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_mul_predicated;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmulq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_mul_predicated;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmulq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_mul_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmulq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_mul_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmulq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_mul_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmulq_m_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_mul_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmulq_m_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_mul_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmulq_m_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_mul_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulhq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_qdmulh_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulhq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_qdmulh_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulhq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_qdmulh_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmulhq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_qrdmulh_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmulhq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_qrdmulh_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrdmulhq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_qrdmulh_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqshluq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_vqshlu_imm_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshluq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_vqshlu_imm_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshluq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_vqshlu_imm_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_shl_imm_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_shl_imm_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_shl_imm_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_m_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_shl_imm_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_m_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_shl_imm_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_m_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_shl_imm_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vsubq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_sub_predicated;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vsubq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_sub_predicated;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vsubq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_sub_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vsubq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_sub_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vsubq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_sub_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vsubq_m_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = Intrinsic::arm_mve_sub_predicated;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vsubq_m_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = Intrinsic::arm_mve_sub_predicated;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vsubq_m_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param1 = Intrinsic::arm_mve_sub_predicated;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = EmitScalarExpr(E->getArg(2));
  Value *Val2 = EmitScalarExpr(E->getArg(3));
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val3});
  Value *Val5 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val1, Val4, Val5});
}
case ARM::BI__builtin_arm_mve_vabdq_m_f16:
case ARM::BI__builtin_arm_mve_vabdq_m_f32:
case ARM::BI__builtin_arm_mve_vabdq_m_s16:
case ARM::BI__builtin_arm_mve_vabdq_m_s32:
case ARM::BI__builtin_arm_mve_vabdq_m_s8:
case ARM::BI__builtin_arm_mve_vabdq_m_u16:
case ARM::BI__builtin_arm_mve_vabdq_m_u32:
case ARM::BI__builtin_arm_mve_vabdq_m_u8:
case ARM::BI__builtin_arm_mve_vhaddq_m_s16:
case ARM::BI__builtin_arm_mve_vhaddq_m_s32:
case ARM::BI__builtin_arm_mve_vhaddq_m_s8:
case ARM::BI__builtin_arm_mve_vhaddq_m_u16:
case ARM::BI__builtin_arm_mve_vhaddq_m_u32:
case ARM::BI__builtin_arm_mve_vhaddq_m_u8:
case ARM::BI__builtin_arm_mve_vhsubq_m_s16:
case ARM::BI__builtin_arm_mve_vhsubq_m_s32:
case ARM::BI__builtin_arm_mve_vhsubq_m_s8:
case ARM::BI__builtin_arm_mve_vhsubq_m_u16:
case ARM::BI__builtin_arm_mve_vhsubq_m_u32:
case ARM::BI__builtin_arm_mve_vhsubq_m_u8:
case ARM::BI__builtin_arm_mve_vmaxnmq_m_f16:
case ARM::BI__builtin_arm_mve_vmaxnmq_m_f32:
case ARM::BI__builtin_arm_mve_vmaxq_m_s16:
case ARM::BI__builtin_arm_mve_vmaxq_m_s32:
case ARM::BI__builtin_arm_mve_vmaxq_m_s8:
case ARM::BI__builtin_arm_mve_vmaxq_m_u16:
case ARM::BI__builtin_arm_mve_vmaxq_m_u32:
case ARM::BI__builtin_arm_mve_vmaxq_m_u8:
case ARM::BI__builtin_arm_mve_vminnmq_m_f16:
case ARM::BI__builtin_arm_mve_vminnmq_m_f32:
case ARM::BI__builtin_arm_mve_vminq_m_s16:
case ARM::BI__builtin_arm_mve_vminq_m_s32:
case ARM::BI__builtin_arm_mve_vminq_m_s8:
case ARM::BI__builtin_arm_mve_vminq_m_u16:
case ARM::BI__builtin_arm_mve_vminq_m_u32:
case ARM::BI__builtin_arm_mve_vminq_m_u8:
case ARM::BI__builtin_arm_mve_vmulhq_m_s16:
case ARM::BI__builtin_arm_mve_vmulhq_m_s32:
case ARM::BI__builtin_arm_mve_vmulhq_m_s8:
case ARM::BI__builtin_arm_mve_vmulhq_m_u16:
case ARM::BI__builtin_arm_mve_vmulhq_m_u32:
case ARM::BI__builtin_arm_mve_vmulhq_m_u8:
case ARM::BI__builtin_arm_mve_vqaddq_m_s16:
case ARM::BI__builtin_arm_mve_vqaddq_m_s32:
case ARM::BI__builtin_arm_mve_vqaddq_m_s8:
case ARM::BI__builtin_arm_mve_vqaddq_m_u16:
case ARM::BI__builtin_arm_mve_vqaddq_m_u32:
case ARM::BI__builtin_arm_mve_vqaddq_m_u8:
case ARM::BI__builtin_arm_mve_vqshlq_m_n_s16:
case ARM::BI__builtin_arm_mve_vqshlq_m_n_s32:
case ARM::BI__builtin_arm_mve_vqshlq_m_n_s8:
case ARM::BI__builtin_arm_mve_vqshlq_m_n_u16:
case ARM::BI__builtin_arm_mve_vqshlq_m_n_u32:
case ARM::BI__builtin_arm_mve_vqshlq_m_n_u8:
case ARM::BI__builtin_arm_mve_vqsubq_m_s16:
case ARM::BI__builtin_arm_mve_vqsubq_m_s32:
case ARM::BI__builtin_arm_mve_vqsubq_m_s8:
case ARM::BI__builtin_arm_mve_vqsubq_m_u16:
case ARM::BI__builtin_arm_mve_vqsubq_m_u32:
case ARM::BI__builtin_arm_mve_vqsubq_m_u8:
case ARM::BI__builtin_arm_mve_vrhaddq_m_s16:
case ARM::BI__builtin_arm_mve_vrhaddq_m_s32:
case ARM::BI__builtin_arm_mve_vrhaddq_m_s8:
case ARM::BI__builtin_arm_mve_vrhaddq_m_u16:
case ARM::BI__builtin_arm_mve_vrhaddq_m_u32:
case ARM::BI__builtin_arm_mve_vrhaddq_m_u8:
case ARM::BI__builtin_arm_mve_vrmulhq_m_s16:
case ARM::BI__builtin_arm_mve_vrmulhq_m_s32:
case ARM::BI__builtin_arm_mve_vrmulhq_m_s8:
case ARM::BI__builtin_arm_mve_vrmulhq_m_u16:
case ARM::BI__builtin_arm_mve_vrmulhq_m_u32:
case ARM::BI__builtin_arm_mve_vrmulhq_m_u8:
case ARM::BI__builtin_arm_mve_vrshrq_m_n_s16:
case ARM::BI__builtin_arm_mve_vrshrq_m_n_s32:
case ARM::BI__builtin_arm_mve_vrshrq_m_n_s8:
case ARM::BI__builtin_arm_mve_vrshrq_m_n_u16:
case ARM::BI__builtin_arm_mve_vrshrq_m_n_u32:
case ARM::BI__builtin_arm_mve_vrshrq_m_n_u8:
case ARM::BI__builtin_arm_mve_vshrq_m_n_s16:
case ARM::BI__builtin_arm_mve_vshrq_m_n_s32:
case ARM::BI__builtin_arm_mve_vshrq_m_n_s8:
case ARM::BI__builtin_arm_mve_vshrq_m_n_u16:
case ARM::BI__builtin_arm_mve_vshrq_m_n_u32:
case ARM::BI__builtin_arm_mve_vshrq_m_n_u8: {
  uint32_t  Param0;
  llvm::Type * Param1;
  Intrinsic::ID  Param2;
  llvm::Type * Param3;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vabdq_m_f16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_abd_predicated;
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vabdq_m_f32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_abd_predicated;
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vabdq_m_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_abd_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vabdq_m_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_abd_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vabdq_m_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_abd_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vabdq_m_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_abd_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vabdq_m_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_abd_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vabdq_m_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_abd_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_m_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_hadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_m_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_hadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_m_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_hadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_m_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_hadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_m_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_hadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_m_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_hadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_m_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_hsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_m_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_hsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_m_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_hsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_m_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_hsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_m_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_hsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_m_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_hsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmaxnmq_m_f16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_max_predicated;
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmaxnmq_m_f32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_max_predicated;
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmaxq_m_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_max_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmaxq_m_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_max_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmaxq_m_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_max_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmaxq_m_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_max_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmaxq_m_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_max_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmaxq_m_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_max_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vminnmq_m_f16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_min_predicated;
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vminnmq_m_f32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_min_predicated;
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vminq_m_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_min_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vminq_m_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_min_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vminq_m_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_min_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vminq_m_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_min_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vminq_m_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_min_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vminq_m_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_min_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmulhq_m_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_mulh_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmulhq_m_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_mulh_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmulhq_m_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_mulh_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmulhq_m_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_mulh_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmulhq_m_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_mulh_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmulhq_m_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_mulh_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_m_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_qadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_m_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_qadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_m_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_qadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_m_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_qadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_m_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_qadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqaddq_m_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_qadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_m_n_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vqshl_imm_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_m_n_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vqshl_imm_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_m_n_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_vqshl_imm_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_m_n_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vqshl_imm_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_m_n_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vqshl_imm_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_m_n_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_vqshl_imm_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_m_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_qsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_m_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_qsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_m_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_qsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_m_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_qsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_m_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_qsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqsubq_m_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_qsub_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrhaddq_m_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_rhadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrhaddq_m_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_rhadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrhaddq_m_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_rhadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrhaddq_m_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_rhadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrhaddq_m_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_rhadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrhaddq_m_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_rhadd_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrmulhq_m_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_rmulh_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrmulhq_m_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_rmulh_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmulhq_m_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_rmulh_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrmulhq_m_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_rmulh_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrmulhq_m_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_rmulh_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmulhq_m_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_rmulh_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrshrq_m_n_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vrshr_imm_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshrq_m_n_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vrshr_imm_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshrq_m_n_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_vrshr_imm_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrshrq_m_n_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vrshr_imm_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshrq_m_n_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vrshr_imm_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshrq_m_n_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_vrshr_imm_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshrq_m_n_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_shr_imm_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshrq_m_n_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_shr_imm_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshrq_m_n_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_shr_imm_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshrq_m_n_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_shr_imm_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshrq_m_n_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_shr_imm_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshrq_m_n_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_shr_imm_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = EmitScalarExpr(E->getArg(2));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = EmitScalarExpr(E->getArg(3));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val4});
  Value *Val6 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param1}), {Val0, Val1, Val2, Val5, Val6});
}
case ARM::BI__builtin_arm_mve_vmullbq_poly_m_p16:
case ARM::BI__builtin_arm_mve_vmullbq_poly_m_p8:
case ARM::BI__builtin_arm_mve_vmulltq_poly_m_p16:
case ARM::BI__builtin_arm_mve_vmulltq_poly_m_p8:
case ARM::BI__builtin_arm_mve_vqdmullbq_m_s16:
case ARM::BI__builtin_arm_mve_vqdmullbq_m_s32:
case ARM::BI__builtin_arm_mve_vqdmulltq_m_s16:
case ARM::BI__builtin_arm_mve_vqdmulltq_m_s32: {
  uint32_t  Param0;
  llvm::Type * Param1;
  Intrinsic::ID  Param2;
  llvm::Type * Param3;
  llvm::Type * Param4;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmullbq_poly_m_p16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_mull_poly_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmullbq_poly_m_p8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_mull_poly_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_poly_m_p16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_mull_poly_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_poly_m_p8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_mull_poly_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqdmullbq_m_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vqdmull_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmullbq_m_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param2 = Intrinsic::arm_mve_vqdmull_predicated;
    Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulltq_m_s16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vqdmull_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqdmulltq_m_s32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param2 = Intrinsic::arm_mve_vqdmull_predicated;
    Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = EmitScalarExpr(E->getArg(2));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = EmitScalarExpr(E->getArg(3));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val4});
  Value *Val6 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param4, Param1}), {Val0, Val1, Val2, Val5, Val6});
}
case ARM::BI__builtin_arm_mve_vmullbq_int_m_s16:
case ARM::BI__builtin_arm_mve_vmullbq_int_m_s32:
case ARM::BI__builtin_arm_mve_vmullbq_int_m_s8:
case ARM::BI__builtin_arm_mve_vmullbq_int_m_u16:
case ARM::BI__builtin_arm_mve_vmullbq_int_m_u32:
case ARM::BI__builtin_arm_mve_vmullbq_int_m_u8:
case ARM::BI__builtin_arm_mve_vmulltq_int_m_s16:
case ARM::BI__builtin_arm_mve_vmulltq_int_m_s32:
case ARM::BI__builtin_arm_mve_vmulltq_int_m_s8:
case ARM::BI__builtin_arm_mve_vmulltq_int_m_u16:
case ARM::BI__builtin_arm_mve_vmulltq_int_m_u32:
case ARM::BI__builtin_arm_mve_vmulltq_int_m_u8:
case ARM::BI__builtin_arm_mve_vshllbq_m_n_s16:
case ARM::BI__builtin_arm_mve_vshllbq_m_n_s8:
case ARM::BI__builtin_arm_mve_vshllbq_m_n_u16:
case ARM::BI__builtin_arm_mve_vshllbq_m_n_u8:
case ARM::BI__builtin_arm_mve_vshlltq_m_n_s16:
case ARM::BI__builtin_arm_mve_vshlltq_m_n_s8:
case ARM::BI__builtin_arm_mve_vshlltq_m_n_u16:
case ARM::BI__builtin_arm_mve_vshlltq_m_n_u8: {
  uint32_t  Param0;
  uint32_t  Param1;
  llvm::Type * Param2;
  Intrinsic::ID  Param3;
  llvm::Type * Param4;
  llvm::Type * Param5;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmullbq_int_m_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = Intrinsic::arm_mve_mull_int_predicated;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmullbq_int_m_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param3 = Intrinsic::arm_mve_mull_int_predicated;
    Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmullbq_int_m_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = Intrinsic::arm_mve_mull_int_predicated;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmullbq_int_m_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = Intrinsic::arm_mve_mull_int_predicated;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmullbq_int_m_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param3 = Intrinsic::arm_mve_mull_int_predicated;
    Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmullbq_int_m_u8:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = Intrinsic::arm_mve_mull_int_predicated;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_int_m_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = Intrinsic::arm_mve_mull_int_predicated;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_int_m_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param3 = Intrinsic::arm_mve_mull_int_predicated;
    Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_int_m_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = Intrinsic::arm_mve_mull_int_predicated;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_int_m_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = Intrinsic::arm_mve_mull_int_predicated;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_int_m_u32:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
    Param3 = Intrinsic::arm_mve_mull_int_predicated;
    Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_int_m_u8:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = Intrinsic::arm_mve_mull_int_predicated;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshllbq_m_n_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshllbq_m_n_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshllbq_m_n_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshllbq_m_n_u8:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshlltq_m_n_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshlltq_m_n_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshlltq_m_n_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshlltq_m_n_u8:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = EmitScalarExpr(E->getArg(2));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val4 = EmitScalarExpr(E->getArg(3));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param2}), {Val5});
  Value *Val7 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateCall(CGM.getIntrinsic(Param3, {Param4, Param5, Param2}), {Val0, Val1, Val2, Val3, Val6, Val7});
}
case ARM::BI__builtin_arm_mve_vqrshlq_m_s16:
case ARM::BI__builtin_arm_mve_vqrshlq_m_s32:
case ARM::BI__builtin_arm_mve_vqrshlq_m_s8:
case ARM::BI__builtin_arm_mve_vqrshlq_m_u16:
case ARM::BI__builtin_arm_mve_vqrshlq_m_u32:
case ARM::BI__builtin_arm_mve_vqrshlq_m_u8:
case ARM::BI__builtin_arm_mve_vqshlq_m_s16:
case ARM::BI__builtin_arm_mve_vqshlq_m_s32:
case ARM::BI__builtin_arm_mve_vqshlq_m_s8:
case ARM::BI__builtin_arm_mve_vqshlq_m_u16:
case ARM::BI__builtin_arm_mve_vqshlq_m_u32:
case ARM::BI__builtin_arm_mve_vqshlq_m_u8:
case ARM::BI__builtin_arm_mve_vrshlq_m_s16:
case ARM::BI__builtin_arm_mve_vrshlq_m_s32:
case ARM::BI__builtin_arm_mve_vrshlq_m_s8:
case ARM::BI__builtin_arm_mve_vrshlq_m_u16:
case ARM::BI__builtin_arm_mve_vrshlq_m_u32:
case ARM::BI__builtin_arm_mve_vrshlq_m_u8:
case ARM::BI__builtin_arm_mve_vshlq_m_s16:
case ARM::BI__builtin_arm_mve_vshlq_m_s32:
case ARM::BI__builtin_arm_mve_vshlq_m_s8:
case ARM::BI__builtin_arm_mve_vshlq_m_u16:
case ARM::BI__builtin_arm_mve_vshlq_m_u32:
case ARM::BI__builtin_arm_mve_vshlq_m_u8: {
  uint32_t  Param0;
  uint32_t  Param1;
  uint32_t  Param2;
  llvm::Type * Param3;
  llvm::Type * Param4;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vqrshlq_m_s16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_m_s32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_m_s8:
    Param0 = 1;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_m_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_m_u32:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqrshlq_m_u8:
    Param0 = 1;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_m_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_m_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_m_s8:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_m_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_m_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vqshlq_m_u8:
    Param0 = 1;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_m_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_m_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_m_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_m_u16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_m_u32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_m_u8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_m_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_m_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_m_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_m_u16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_m_u32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vshlq_m_u8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = EmitScalarExpr(E->getArg(2));
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
  Value *Val5 = EmitScalarExpr(E->getArg(3));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val6});
  Value *Val8 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshl_vector_predicated, {Param4, Param4, Param3}), {Val0, Val1, Val2, Val3, Val4, Val7, Val8});
}
case ARM::BI__builtin_arm_mve_vaddlvaq_s32:
case ARM::BI__builtin_arm_mve_vaddlvaq_u32:
case ARM::BI__builtin_arm_mve_vaddvaq_s16:
case ARM::BI__builtin_arm_mve_vaddvaq_s32:
case ARM::BI__builtin_arm_mve_vaddvaq_s8:
case ARM::BI__builtin_arm_mve_vaddvaq_u16:
case ARM::BI__builtin_arm_mve_vaddvaq_u32:
case ARM::BI__builtin_arm_mve_vaddvaq_u8: {
  uint32_t  Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vaddlvaq_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_addlv;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddlvaq_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_addlv;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddvaq_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_addv;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vaddvaq_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_addv;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddvaq_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_addv;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vaddvaq_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_addv;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vaddvaq_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_addv;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddvaq_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_addv;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2}), {Val0, Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateAdd(Val2, Val3);
}
case ARM::BI__builtin_arm_mve_vaddlvaq_p_s32:
case ARM::BI__builtin_arm_mve_vaddlvaq_p_u32:
case ARM::BI__builtin_arm_mve_vaddvaq_p_s16:
case ARM::BI__builtin_arm_mve_vaddvaq_p_s32:
case ARM::BI__builtin_arm_mve_vaddvaq_p_s8:
case ARM::BI__builtin_arm_mve_vaddvaq_p_u16:
case ARM::BI__builtin_arm_mve_vaddvaq_p_u32:
case ARM::BI__builtin_arm_mve_vaddvaq_p_u8: {
  uint32_t  Param0;
  llvm::Type * Param1;
  Intrinsic::ID  Param2;
  llvm::Type * Param3;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vaddlvaq_p_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_addlv_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddlvaq_p_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_addlv_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddvaq_p_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_addv_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vaddvaq_p_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_addv_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddvaq_p_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_addv_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vaddvaq_p_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_addv_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vaddvaq_p_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_addv_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vaddvaq_p_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_addv_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val3});
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param1}), {Val0, Val1, Val4});
  Value *Val6 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateAdd(Val5, Val6);
}
case ARM::BI__builtin_arm_mve_vcvtq_m_f16_s16:
case ARM::BI__builtin_arm_mve_vcvtq_m_f16_u16:
case ARM::BI__builtin_arm_mve_vcvtq_m_f32_s32:
case ARM::BI__builtin_arm_mve_vcvtq_m_f32_u32:
case ARM::BI__builtin_arm_mve_vcvtq_m_s16_f16:
case ARM::BI__builtin_arm_mve_vcvtq_m_s32_f32:
case ARM::BI__builtin_arm_mve_vcvtq_m_u16_f16:
case ARM::BI__builtin_arm_mve_vcvtq_m_u32_f32: {
  uint32_t  Param0;
  llvm::Type * Param1;
  llvm::Type * Param2;
  llvm::Type * Param3;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcvtq_m_f16_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_m_f16_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_m_f32_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_m_f32_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_m_s16_f16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_m_s32_f32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_m_u16_f16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_m_u32_f32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val3});
  Value *Val5 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fp_int_predicated, {Param2, Param3, Param1}), {Val0, Val1, Val4, Val5});
}
case ARM::BI__builtin_arm_mve_vrev16q_m_s8:
case ARM::BI__builtin_arm_mve_vrev16q_m_u8:
case ARM::BI__builtin_arm_mve_vrev32q_m_f16:
case ARM::BI__builtin_arm_mve_vrev32q_m_s16:
case ARM::BI__builtin_arm_mve_vrev32q_m_s8:
case ARM::BI__builtin_arm_mve_vrev32q_m_u16:
case ARM::BI__builtin_arm_mve_vrev32q_m_u8:
case ARM::BI__builtin_arm_mve_vrev64q_m_f16:
case ARM::BI__builtin_arm_mve_vrev64q_m_f32:
case ARM::BI__builtin_arm_mve_vrev64q_m_s16:
case ARM::BI__builtin_arm_mve_vrev64q_m_s32:
case ARM::BI__builtin_arm_mve_vrev64q_m_s8:
case ARM::BI__builtin_arm_mve_vrev64q_m_u16:
case ARM::BI__builtin_arm_mve_vrev64q_m_u32:
case ARM::BI__builtin_arm_mve_vrev64q_m_u8: {
  uint32_t  Param0;
  llvm::Type * Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vrev16q_m_s8:
    Param0 = 16;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrev16q_m_u8:
    Param0 = 16;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrev32q_m_f16:
    Param0 = 32;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrev32q_m_s16:
    Param0 = 32;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrev32q_m_s8:
    Param0 = 32;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrev32q_m_u16:
    Param0 = 32;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrev32q_m_u8:
    Param0 = 32;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_m_f16:
    Param0 = 64;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_m_f32:
    Param0 = 64;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_m_s16:
    Param0 = 64;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_m_s32:
    Param0 = 64;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_m_s8:
    Param0 = 64;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_m_u16:
    Param0 = 64;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_m_u32:
    Param0 = 64;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_m_u8:
    Param0 = 64;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val2 = EmitScalarExpr(E->getArg(2));
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val3});
  Value *Val5 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vrev_predicated, {Param2, Param1}), {Val0, Val1, Val4, Val5});
}
case ARM::BI__builtin_arm_mve_vmovlbq_m_s16:
case ARM::BI__builtin_arm_mve_vmovlbq_m_s8:
case ARM::BI__builtin_arm_mve_vmovlbq_m_u16:
case ARM::BI__builtin_arm_mve_vmovlbq_m_u8:
case ARM::BI__builtin_arm_mve_vmovltq_m_s16:
case ARM::BI__builtin_arm_mve_vmovltq_m_s8:
case ARM::BI__builtin_arm_mve_vmovltq_m_u16:
case ARM::BI__builtin_arm_mve_vmovltq_m_u8: {
  uint32_t  Param0;
  uint32_t  Param1;
  llvm::Type * Param2;
  llvm::Type * Param3;
  llvm::Type * Param4;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmovlbq_m_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmovlbq_m_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmovlbq_m_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmovlbq_m_u8:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmovltq_m_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmovltq_m_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmovltq_m_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmovltq_m_u8:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param2}), {Val4});
  Value *Val6 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmovl_predicated, {Param3, Param4, Param2}), {Val0, Val1, Val2, Val5, Val6});
}
case ARM::BI__builtin_arm_mve_vstrhq_s32:
case ARM::BI__builtin_arm_mve_vstrhq_u32: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 4);
  Value *Val2 = Builder.CreateTrunc(Val0, Val1);
  Address Val3 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val4 = Builder.CreatePointerCast((Val3.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 4)));
  Address Val5 = Address(Val4, llvm::FixedVectorType::get(Int16Ty, 4), CharUnits::fromQuantity(2));
  return Builder.CreateStore(Val2, Val5);
}
case ARM::BI__builtin_arm_mve_vstrhq_p_s32:
case ARM::BI__builtin_arm_mve_vstrhq_p_u32: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 4);
  Value *Val2 = Builder.CreateTrunc(Val0, Val1);
  Address Val3 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val4 = Builder.CreatePointerCast((Val3.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 4)));
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, 2);
  Value *Val6 = EmitScalarExpr(E->getArg(2));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
  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});
}
case ARM::BI__builtin_arm_mve_vandq_m_f16:
case ARM::BI__builtin_arm_mve_vbicq_m_f16:
case ARM::BI__builtin_arm_mve_veorq_m_f16:
case ARM::BI__builtin_arm_mve_vornq_m_f16:
case ARM::BI__builtin_arm_mve_vorrq_m_f16: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vandq_m_f16:
    Param0 = Intrinsic::arm_mve_and_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_m_f16:
    Param0 = Intrinsic::arm_mve_bic_predicated;
    break;
  case ARM::BI__builtin_arm_mve_veorq_m_f16:
    Param0 = Intrinsic::arm_mve_eor_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vornq_m_f16:
    Param0 = Intrinsic::arm_mve_orn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_m_f16:
    Param0 = Intrinsic::arm_mve_orr_predicated;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val2 = Builder.CreateBitCast(Val0, Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val5 = Builder.CreateBitCast(Val3, Val4);
  Value *Val6 = EmitScalarExpr(E->getArg(3));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
  Value *Val9 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val10 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val11 = Builder.CreateBitCast(Val9, Val10);
  Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val5, Val8, Val11});
  llvm::Type *Val13 = llvm::FixedVectorType::get(HalfTy, 8);
  return Builder.CreateBitCast(Val12, Val13);
}
case ARM::BI__builtin_arm_mve_vandq_m_s16:
case ARM::BI__builtin_arm_mve_vandq_m_u16:
case ARM::BI__builtin_arm_mve_vbicq_m_s16:
case ARM::BI__builtin_arm_mve_vbicq_m_u16:
case ARM::BI__builtin_arm_mve_veorq_m_s16:
case ARM::BI__builtin_arm_mve_veorq_m_u16:
case ARM::BI__builtin_arm_mve_vornq_m_s16:
case ARM::BI__builtin_arm_mve_vornq_m_u16:
case ARM::BI__builtin_arm_mve_vorrq_m_s16:
case ARM::BI__builtin_arm_mve_vorrq_m_u16: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vandq_m_s16:
    Param0 = Intrinsic::arm_mve_and_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vandq_m_u16:
    Param0 = Intrinsic::arm_mve_and_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_m_s16:
    Param0 = Intrinsic::arm_mve_bic_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_m_u16:
    Param0 = Intrinsic::arm_mve_bic_predicated;
    break;
  case ARM::BI__builtin_arm_mve_veorq_m_s16:
    Param0 = Intrinsic::arm_mve_eor_predicated;
    break;
  case ARM::BI__builtin_arm_mve_veorq_m_u16:
    Param0 = Intrinsic::arm_mve_eor_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vornq_m_s16:
    Param0 = Intrinsic::arm_mve_orn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vornq_m_u16:
    Param0 = Intrinsic::arm_mve_orn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_m_s16:
    Param0 = Intrinsic::arm_mve_orr_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_m_u16:
    Param0 = Intrinsic::arm_mve_orr_predicated;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val2 = Builder.CreateBitCast(Val0, Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val5 = Builder.CreateBitCast(Val3, Val4);
  Value *Val6 = EmitScalarExpr(E->getArg(3));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
  Value *Val9 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val10 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val11 = Builder.CreateBitCast(Val9, Val10);
  Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val5, Val8, Val11});
  llvm::Type *Val13 = llvm::FixedVectorType::get(Int16Ty, 8);
  return Builder.CreateBitCast(Val12, Val13);
}
case ARM::BI__builtin_arm_mve_vmaxaq_s16: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val2 = llvm::Constant::getNullValue(Val1);
  Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val5 = llvm::Constant::getNullValue(Val4);
  Value *Val6 = Builder.CreateSub(Val5, Val0);
  Value *Val7 = Builder.CreateSelect(Val3, Val6, Val0);
  Value *Val8 = EmitScalarExpr(E->getArg(0));
  Value *Val9 = Builder.CreateICmpUGE(Val8, Val7);
  return Builder.CreateSelect(Val9, Val8, Val7);
}
case ARM::BI__builtin_arm_mve_vminaq_s16: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val2 = llvm::Constant::getNullValue(Val1);
  Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val5 = llvm::Constant::getNullValue(Val4);
  Value *Val6 = Builder.CreateSub(Val5, Val0);
  Value *Val7 = Builder.CreateSelect(Val3, Val6, Val0);
  Value *Val8 = EmitScalarExpr(E->getArg(0));
  Value *Val9 = Builder.CreateICmpULE(Val8, Val7);
  return Builder.CreateSelect(Val9, Val8, Val7);
}
case ARM::BI__builtin_arm_mve_vandq_m_f32:
case ARM::BI__builtin_arm_mve_vbicq_m_f32:
case ARM::BI__builtin_arm_mve_veorq_m_f32:
case ARM::BI__builtin_arm_mve_vornq_m_f32:
case ARM::BI__builtin_arm_mve_vorrq_m_f32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vandq_m_f32:
    Param0 = Intrinsic::arm_mve_and_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_m_f32:
    Param0 = Intrinsic::arm_mve_bic_predicated;
    break;
  case ARM::BI__builtin_arm_mve_veorq_m_f32:
    Param0 = Intrinsic::arm_mve_eor_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vornq_m_f32:
    Param0 = Intrinsic::arm_mve_orn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_m_f32:
    Param0 = Intrinsic::arm_mve_orr_predicated;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val2 = Builder.CreateBitCast(Val0, Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val5 = Builder.CreateBitCast(Val3, Val4);
  Value *Val6 = EmitScalarExpr(E->getArg(3));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
  Value *Val9 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val10 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val11 = Builder.CreateBitCast(Val9, Val10);
  Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val5, Val8, Val11});
  llvm::Type *Val13 = llvm::FixedVectorType::get(FloatTy, 4);
  return Builder.CreateBitCast(Val12, Val13);
}
case ARM::BI__builtin_arm_mve_vandq_m_s32:
case ARM::BI__builtin_arm_mve_vandq_m_u32:
case ARM::BI__builtin_arm_mve_vbicq_m_s32:
case ARM::BI__builtin_arm_mve_vbicq_m_u32:
case ARM::BI__builtin_arm_mve_veorq_m_s32:
case ARM::BI__builtin_arm_mve_veorq_m_u32:
case ARM::BI__builtin_arm_mve_vornq_m_s32:
case ARM::BI__builtin_arm_mve_vornq_m_u32:
case ARM::BI__builtin_arm_mve_vorrq_m_s32:
case ARM::BI__builtin_arm_mve_vorrq_m_u32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vandq_m_s32:
    Param0 = Intrinsic::arm_mve_and_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vandq_m_u32:
    Param0 = Intrinsic::arm_mve_and_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_m_s32:
    Param0 = Intrinsic::arm_mve_bic_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_m_u32:
    Param0 = Intrinsic::arm_mve_bic_predicated;
    break;
  case ARM::BI__builtin_arm_mve_veorq_m_s32:
    Param0 = Intrinsic::arm_mve_eor_predicated;
    break;
  case ARM::BI__builtin_arm_mve_veorq_m_u32:
    Param0 = Intrinsic::arm_mve_eor_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vornq_m_s32:
    Param0 = Intrinsic::arm_mve_orn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vornq_m_u32:
    Param0 = Intrinsic::arm_mve_orn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_m_s32:
    Param0 = Intrinsic::arm_mve_orr_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_m_u32:
    Param0 = Intrinsic::arm_mve_orr_predicated;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val2 = Builder.CreateBitCast(Val0, Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val5 = Builder.CreateBitCast(Val3, Val4);
  Value *Val6 = EmitScalarExpr(E->getArg(3));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
  Value *Val9 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val10 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val11 = Builder.CreateBitCast(Val9, Val10);
  Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val5, Val8, Val11});
  llvm::Type *Val13 = llvm::FixedVectorType::get(Int32Ty, 4);
  return Builder.CreateBitCast(Val12, Val13);
}
case ARM::BI__builtin_arm_mve_vmaxaq_s32: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val2 = llvm::Constant::getNullValue(Val1);
  Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val5 = llvm::Constant::getNullValue(Val4);
  Value *Val6 = Builder.CreateSub(Val5, Val0);
  Value *Val7 = Builder.CreateSelect(Val3, Val6, Val0);
  Value *Val8 = EmitScalarExpr(E->getArg(0));
  Value *Val9 = Builder.CreateICmpUGE(Val8, Val7);
  return Builder.CreateSelect(Val9, Val8, Val7);
}
case ARM::BI__builtin_arm_mve_vminaq_s32: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val2 = llvm::Constant::getNullValue(Val1);
  Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val5 = llvm::Constant::getNullValue(Val4);
  Value *Val6 = Builder.CreateSub(Val5, Val0);
  Value *Val7 = Builder.CreateSelect(Val3, Val6, Val0);
  Value *Val8 = EmitScalarExpr(E->getArg(0));
  Value *Val9 = Builder.CreateICmpULE(Val8, Val7);
  return Builder.CreateSelect(Val9, Val8, Val7);
}
case ARM::BI__builtin_arm_mve_vandq_m_s8:
case ARM::BI__builtin_arm_mve_vandq_m_u8:
case ARM::BI__builtin_arm_mve_vbicq_m_s8:
case ARM::BI__builtin_arm_mve_vbicq_m_u8:
case ARM::BI__builtin_arm_mve_veorq_m_s8:
case ARM::BI__builtin_arm_mve_veorq_m_u8:
case ARM::BI__builtin_arm_mve_vornq_m_s8:
case ARM::BI__builtin_arm_mve_vornq_m_u8:
case ARM::BI__builtin_arm_mve_vorrq_m_s8:
case ARM::BI__builtin_arm_mve_vorrq_m_u8: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vandq_m_s8:
    Param0 = Intrinsic::arm_mve_and_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vandq_m_u8:
    Param0 = Intrinsic::arm_mve_and_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_m_s8:
    Param0 = Intrinsic::arm_mve_bic_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_m_u8:
    Param0 = Intrinsic::arm_mve_bic_predicated;
    break;
  case ARM::BI__builtin_arm_mve_veorq_m_s8:
    Param0 = Intrinsic::arm_mve_eor_predicated;
    break;
  case ARM::BI__builtin_arm_mve_veorq_m_u8:
    Param0 = Intrinsic::arm_mve_eor_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vornq_m_s8:
    Param0 = Intrinsic::arm_mve_orn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vornq_m_u8:
    Param0 = Intrinsic::arm_mve_orn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_m_s8:
    Param0 = Intrinsic::arm_mve_orr_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_m_u8:
    Param0 = Intrinsic::arm_mve_orr_predicated;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val2 = Builder.CreateBitCast(Val0, Val1);
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val5 = Builder.CreateBitCast(Val3, Val4);
  Value *Val6 = EmitScalarExpr(E->getArg(3));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val7});
  Value *Val9 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val10 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val11 = Builder.CreateBitCast(Val9, Val10);
  Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val5, Val8, Val11});
  llvm::Type *Val13 = llvm::FixedVectorType::get(Int8Ty, 16);
  return Builder.CreateBitCast(Val12, Val13);
}
case ARM::BI__builtin_arm_mve_vmaxaq_s8: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val2 = llvm::Constant::getNullValue(Val1);
  Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val5 = llvm::Constant::getNullValue(Val4);
  Value *Val6 = Builder.CreateSub(Val5, Val0);
  Value *Val7 = Builder.CreateSelect(Val3, Val6, Val0);
  Value *Val8 = EmitScalarExpr(E->getArg(0));
  Value *Val9 = Builder.CreateICmpUGE(Val8, Val7);
  return Builder.CreateSelect(Val9, Val8, Val7);
}
case ARM::BI__builtin_arm_mve_vminaq_s8: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val2 = llvm::Constant::getNullValue(Val1);
  Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val5 = llvm::Constant::getNullValue(Val4);
  Value *Val6 = Builder.CreateSub(Val5, Val0);
  Value *Val7 = Builder.CreateSelect(Val3, Val6, Val0);
  Value *Val8 = EmitScalarExpr(E->getArg(0));
  Value *Val9 = Builder.CreateICmpULE(Val8, Val7);
  return Builder.CreateSelect(Val9, Val8, Val7);
}
case ARM::BI__builtin_arm_mve_vstrbq_s32:
case ARM::BI__builtin_arm_mve_vstrbq_u32: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 4);
  Value *Val2 = Builder.CreateTrunc(Val0, Val1);
  Address Val3 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val4 = Builder.CreatePointerCast((Val3.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 4)));
  Address Val5 = Address(Val4, llvm::FixedVectorType::get(Int8Ty, 4), CharUnits::fromQuantity(1));
  return Builder.CreateStore(Val2, Val5);
}
case ARM::BI__builtin_arm_mve_vstrbq_p_s32:
case ARM::BI__builtin_arm_mve_vstrbq_p_u32: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 4);
  Value *Val2 = Builder.CreateTrunc(Val0, Val1);
  Address Val3 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val4 = Builder.CreatePointerCast((Val3.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 4)));
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, 1);
  Value *Val6 = EmitScalarExpr(E->getArg(2));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
  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});
}
case ARM::BI__builtin_arm_mve_vstrbq_s16:
case ARM::BI__builtin_arm_mve_vstrbq_u16: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 8);
  Value *Val2 = Builder.CreateTrunc(Val0, Val1);
  Address Val3 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val4 = Builder.CreatePointerCast((Val3.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 8)));
  Address Val5 = Address(Val4, llvm::FixedVectorType::get(Int8Ty, 8), CharUnits::fromQuantity(1));
  return Builder.CreateStore(Val2, Val5);
}
case ARM::BI__builtin_arm_mve_vstrbq_p_s16:
case ARM::BI__builtin_arm_mve_vstrbq_p_u16: {
  Value *Val0 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 8);
  Value *Val2 = Builder.CreateTrunc(Val0, Val1);
  Address Val3 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val4 = Builder.CreatePointerCast((Val3.getPointer()), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 8)));
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, 1);
  Value *Val6 = EmitScalarExpr(E->getArg(2));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
  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});
}
case ARM::BI__builtin_arm_mve_vfmasq_m_n_f16:
case ARM::BI__builtin_arm_mve_vfmasq_m_n_f32: {
  llvm::Type * Param0;
  llvm::Type * Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vfmasq_m_n_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vfmasq_m_n_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = ARMMVEVectorSplat(Builder, Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = (Val3);
  Value *Val5 = EmitScalarExpr(E->getArg(3));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val6});
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_fma_predicated, {Param1, Param0}), {Val2, Val4, Val1, Val7});
}
case ARM::BI__builtin_arm_mve_vfmasq_n_f16:
case ARM::BI__builtin_arm_mve_vfmasq_n_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vfmasq_n_f16:
    Param0 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vfmasq_n_f32:
    Param0 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = ARMMVEVectorSplat(Builder, Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = (Val3);
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fma, {Param0}), {Val2, Val4, Val1});
}
case ARM::BI__builtin_arm_mve_vfmaq_m_n_f16:
case ARM::BI__builtin_arm_mve_vfmaq_m_n_f32: {
  llvm::Type * Param0;
  llvm::Type * Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vfmaq_m_n_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vfmaq_m_n_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = ARMMVEVectorSplat(Builder, Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = (Val1);
  Value *Val4 = EmitScalarExpr(E->getArg(0));
  Value *Val5 = EmitScalarExpr(E->getArg(3));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val6});
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_fma_predicated, {Param1, Param0}), {Val2, Val3, Val4, Val7});
}
case ARM::BI__builtin_arm_mve_vfmaq_n_f16:
case ARM::BI__builtin_arm_mve_vfmaq_n_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vfmaq_n_f16:
    Param0 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vfmaq_n_f32:
    Param0 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = ARMMVEVectorSplat(Builder, Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = (Val1);
  Value *Val4 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fma, {Param0}), {Val2, Val3, Val4});
}
case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_f16:
case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
  Value *Val6 = Builder.CreateFCmpOEQ(Val3, Val5);
  Value *Val7 = Builder.CreateAnd(Val2, Val6);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
  return Builder.CreateIntCast(Val8, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_f16:
case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
  Value *Val6 = Builder.CreateFCmpOGE(Val3, Val5);
  Value *Val7 = Builder.CreateAnd(Val2, Val6);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
  return Builder.CreateIntCast(Val8, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_f16:
case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
  Value *Val6 = Builder.CreateFCmpOGT(Val3, Val5);
  Value *Val7 = Builder.CreateAnd(Val2, Val6);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
  return Builder.CreateIntCast(Val8, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpleq_m_n_f16:
case ARM::BI__builtin_arm_mve_vcmpleq_m_n_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpleq_m_n_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpleq_m_n_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
  Value *Val6 = Builder.CreateFCmpOLE(Val3, Val5);
  Value *Val7 = Builder.CreateAnd(Val2, Val6);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
  return Builder.CreateIntCast(Val8, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpltq_m_n_f16:
case ARM::BI__builtin_arm_mve_vcmpltq_m_n_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpltq_m_n_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpltq_m_n_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
  Value *Val6 = Builder.CreateFCmpOLT(Val3, Val5);
  Value *Val7 = Builder.CreateAnd(Val2, Val6);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
  return Builder.CreateIntCast(Val8, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpneq_m_n_f16:
case ARM::BI__builtin_arm_mve_vcmpneq_m_n_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpneq_m_n_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_m_n_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
  Value *Val6 = Builder.CreateFCmpUNE(Val3, Val5);
  Value *Val7 = Builder.CreateAnd(Val2, Val6);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
  return Builder.CreateIntCast(Val8, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_s16:
case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_s32:
case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_s8:
case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_u16:
case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_u32:
case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
  Value *Val6 = Builder.CreateICmpEQ(Val3, Val5);
  Value *Val7 = Builder.CreateAnd(Val2, Val6);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
  return Builder.CreateIntCast(Val8, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpneq_m_n_s16:
case ARM::BI__builtin_arm_mve_vcmpneq_m_n_s32:
case ARM::BI__builtin_arm_mve_vcmpneq_m_n_s8:
case ARM::BI__builtin_arm_mve_vcmpneq_m_n_u16:
case ARM::BI__builtin_arm_mve_vcmpneq_m_n_u32:
case ARM::BI__builtin_arm_mve_vcmpneq_m_n_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpneq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_m_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_m_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_m_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
  Value *Val6 = Builder.CreateICmpNE(Val3, Val5);
  Value *Val7 = Builder.CreateAnd(Val2, Val6);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
  return Builder.CreateIntCast(Val8, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_s16:
case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_s32:
case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_s8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
  Value *Val6 = Builder.CreateICmpSGE(Val3, Val5);
  Value *Val7 = Builder.CreateAnd(Val2, Val6);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
  return Builder.CreateIntCast(Val8, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_s16:
case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_s32:
case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_s8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
  Value *Val6 = Builder.CreateICmpSGT(Val3, Val5);
  Value *Val7 = Builder.CreateAnd(Val2, Val6);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
  return Builder.CreateIntCast(Val8, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpleq_m_n_s16:
case ARM::BI__builtin_arm_mve_vcmpleq_m_n_s32:
case ARM::BI__builtin_arm_mve_vcmpleq_m_n_s8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpleq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpleq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpleq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
  Value *Val6 = Builder.CreateICmpSLE(Val3, Val5);
  Value *Val7 = Builder.CreateAnd(Val2, Val6);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
  return Builder.CreateIntCast(Val8, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpltq_m_n_s16:
case ARM::BI__builtin_arm_mve_vcmpltq_m_n_s32:
case ARM::BI__builtin_arm_mve_vcmpltq_m_n_s8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpltq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpltq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpltq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
  Value *Val6 = Builder.CreateICmpSLT(Val3, Val5);
  Value *Val7 = Builder.CreateAnd(Val2, Val6);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
  return Builder.CreateIntCast(Val8, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpcsq_m_n_u16:
case ARM::BI__builtin_arm_mve_vcmpcsq_m_n_u32:
case ARM::BI__builtin_arm_mve_vcmpcsq_m_n_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpcsq_m_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpcsq_m_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpcsq_m_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
  Value *Val6 = Builder.CreateICmpUGE(Val3, Val5);
  Value *Val7 = Builder.CreateAnd(Val2, Val6);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
  return Builder.CreateIntCast(Val8, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmphiq_m_n_u16:
case ARM::BI__builtin_arm_mve_vcmphiq_m_n_u32:
case ARM::BI__builtin_arm_mve_vcmphiq_m_n_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmphiq_m_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmphiq_m_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmphiq_m_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
  Value *Val6 = Builder.CreateICmpUGT(Val3, Val5);
  Value *Val7 = Builder.CreateAnd(Val2, Val6);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
  return Builder.CreateIntCast(Val8, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpeqq_m_f16:
case ARM::BI__builtin_arm_mve_vcmpeqq_m_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpeqq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateFCmpOEQ(Val3, Val4);
  Value *Val6 = Builder.CreateAnd(Val2, Val5);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
  return Builder.CreateIntCast(Val7, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpgeq_m_f16:
case ARM::BI__builtin_arm_mve_vcmpgeq_m_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpgeq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgeq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateFCmpOGE(Val3, Val4);
  Value *Val6 = Builder.CreateAnd(Val2, Val5);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
  return Builder.CreateIntCast(Val7, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpgtq_m_f16:
case ARM::BI__builtin_arm_mve_vcmpgtq_m_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpgtq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgtq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateFCmpOGT(Val3, Val4);
  Value *Val6 = Builder.CreateAnd(Val2, Val5);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
  return Builder.CreateIntCast(Val7, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpleq_m_f16:
case ARM::BI__builtin_arm_mve_vcmpleq_m_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpleq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpleq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateFCmpOLE(Val3, Val4);
  Value *Val6 = Builder.CreateAnd(Val2, Val5);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
  return Builder.CreateIntCast(Val7, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpltq_m_f16:
case ARM::BI__builtin_arm_mve_vcmpltq_m_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpltq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpltq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateFCmpOLT(Val3, Val4);
  Value *Val6 = Builder.CreateAnd(Val2, Val5);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
  return Builder.CreateIntCast(Val7, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpneq_m_f16:
case ARM::BI__builtin_arm_mve_vcmpneq_m_f32: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpneq_m_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_m_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateFCmpUNE(Val3, Val4);
  Value *Val6 = Builder.CreateAnd(Val2, Val5);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
  return Builder.CreateIntCast(Val7, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpeqq_m_s16:
case ARM::BI__builtin_arm_mve_vcmpeqq_m_s32:
case ARM::BI__builtin_arm_mve_vcmpeqq_m_s8:
case ARM::BI__builtin_arm_mve_vcmpeqq_m_u16:
case ARM::BI__builtin_arm_mve_vcmpeqq_m_u32:
case ARM::BI__builtin_arm_mve_vcmpeqq_m_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpeqq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_m_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_m_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpeqq_m_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateICmpEQ(Val3, Val4);
  Value *Val6 = Builder.CreateAnd(Val2, Val5);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
  return Builder.CreateIntCast(Val7, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpneq_m_s16:
case ARM::BI__builtin_arm_mve_vcmpneq_m_s32:
case ARM::BI__builtin_arm_mve_vcmpneq_m_s8:
case ARM::BI__builtin_arm_mve_vcmpneq_m_u16:
case ARM::BI__builtin_arm_mve_vcmpneq_m_u32:
case ARM::BI__builtin_arm_mve_vcmpneq_m_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpneq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_m_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_m_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpneq_m_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateICmpNE(Val3, Val4);
  Value *Val6 = Builder.CreateAnd(Val2, Val5);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
  return Builder.CreateIntCast(Val7, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpgeq_m_s16:
case ARM::BI__builtin_arm_mve_vcmpgeq_m_s32:
case ARM::BI__builtin_arm_mve_vcmpgeq_m_s8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpgeq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgeq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgeq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateICmpSGE(Val3, Val4);
  Value *Val6 = Builder.CreateAnd(Val2, Val5);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
  return Builder.CreateIntCast(Val7, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpgtq_m_s16:
case ARM::BI__builtin_arm_mve_vcmpgtq_m_s32:
case ARM::BI__builtin_arm_mve_vcmpgtq_m_s8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpgtq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgtq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpgtq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateICmpSGT(Val3, Val4);
  Value *Val6 = Builder.CreateAnd(Val2, Val5);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
  return Builder.CreateIntCast(Val7, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpleq_m_s16:
case ARM::BI__builtin_arm_mve_vcmpleq_m_s32:
case ARM::BI__builtin_arm_mve_vcmpleq_m_s8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpleq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpleq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpleq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateICmpSLE(Val3, Val4);
  Value *Val6 = Builder.CreateAnd(Val2, Val5);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
  return Builder.CreateIntCast(Val7, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpltq_m_s16:
case ARM::BI__builtin_arm_mve_vcmpltq_m_s32:
case ARM::BI__builtin_arm_mve_vcmpltq_m_s8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpltq_m_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpltq_m_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpltq_m_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateICmpSLT(Val3, Val4);
  Value *Val6 = Builder.CreateAnd(Val2, Val5);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
  return Builder.CreateIntCast(Val7, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmpcsq_m_u16:
case ARM::BI__builtin_arm_mve_vcmpcsq_m_u32:
case ARM::BI__builtin_arm_mve_vcmpcsq_m_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmpcsq_m_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmpcsq_m_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmpcsq_m_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateICmpUGE(Val3, Val4);
  Value *Val6 = Builder.CreateAnd(Val2, Val5);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
  return Builder.CreateIntCast(Val7, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vcmphiq_m_u16:
case ARM::BI__builtin_arm_mve_vcmphiq_m_u32:
case ARM::BI__builtin_arm_mve_vcmphiq_m_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmphiq_m_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmphiq_m_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmphiq_m_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateICmpUGT(Val3, Val4);
  Value *Val6 = Builder.CreateAnd(Val2, Val5);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
  return Builder.CreateIntCast(Val7, Int16Ty, false);
}
case ARM::BI__builtin_arm_mve_vpselq_f16:
case ARM::BI__builtin_arm_mve_vpselq_f32:
case ARM::BI__builtin_arm_mve_vpselq_s16:
case ARM::BI__builtin_arm_mve_vpselq_s32:
case ARM::BI__builtin_arm_mve_vpselq_s8:
case ARM::BI__builtin_arm_mve_vpselq_u16:
case ARM::BI__builtin_arm_mve_vpselq_u32:
case ARM::BI__builtin_arm_mve_vpselq_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vpselq_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vpselq_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vpselq_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vpselq_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vpselq_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  case ARM::BI__builtin_arm_mve_vpselq_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vpselq_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vpselq_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  return Builder.CreateSelect(Val2, Val3, Val4);
}
case ARM::BI__builtin_arm_mve_vdupq_m_n_f16:
case ARM::BI__builtin_arm_mve_vdupq_m_n_f32:
case ARM::BI__builtin_arm_mve_vdupq_m_n_s16:
case ARM::BI__builtin_arm_mve_vdupq_m_n_s32:
case ARM::BI__builtin_arm_mve_vdupq_m_n_s8:
case ARM::BI__builtin_arm_mve_vdupq_m_n_u16:
case ARM::BI__builtin_arm_mve_vdupq_m_n_u32:
case ARM::BI__builtin_arm_mve_vdupq_m_n_u8: {
  llvm::Type * Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vdupq_m_n_f16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vdupq_m_n_f32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vdupq_m_n_s16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vdupq_m_n_s32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vdupq_m_n_s8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  case ARM::BI__builtin_arm_mve_vdupq_m_n_u16:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    break;
  case ARM::BI__builtin_arm_mve_vdupq_m_n_u32:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    break;
  case ARM::BI__builtin_arm_mve_vdupq_m_n_u8:
    Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
  Value *Val5 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateSelect(Val2, Val4, Val5);
}
case ARM::BI__builtin_arm_mve_vbicq_m_n_s32:
case ARM::BI__builtin_arm_mve_vbicq_m_n_u32: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vbicq_m_n_s32:
    Param0 = true;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_m_n_u32:
    Param0 = false;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, Param0);
  Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
  Value *Val7 = Builder.CreateNot(Val6);
  Value *Val8 = Builder.CreateAnd(Val3, Val7);
  return Builder.CreateSelect(Val2, Val8, Val3);
}
case ARM::BI__builtin_arm_mve_vorrq_m_n_s32:
case ARM::BI__builtin_arm_mve_vorrq_m_n_u32: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vorrq_m_n_s32:
    Param0 = true;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_m_n_u32:
    Param0 = false;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, Param0);
  Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
  Value *Val7 = Builder.CreateOr(Val3, Val6);
  return Builder.CreateSelect(Val2, Val7, Val3);
}
case ARM::BI__builtin_arm_mve_vpselq_s64:
case ARM::BI__builtin_arm_mve_vpselq_u64: {
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val5 = Builder.CreateBitCast(Val3, Val4);
  Value *Val6 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val7 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val8 = Builder.CreateBitCast(Val6, Val7);
  Value *Val9 = Builder.CreateSelect(Val2, Val5, Val8);
  llvm::Type *Val10 = llvm::FixedVectorType::get(Int64Ty, 2);
  return Builder.CreateBitCast(Val9, Val10);
}
case ARM::BI__builtin_arm_mve_vmvnq_m_n_s32:
case ARM::BI__builtin_arm_mve_vmvnq_m_n_u32: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmvnq_m_n_s32:
    Param0 = true;
    break;
  case ARM::BI__builtin_arm_mve_vmvnq_m_n_u32:
    Param0 = false;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, Param0);
  Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
  Value *Val6 = Builder.CreateNot(Val5);
  Value *Val7 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateSelect(Val2, Val6, Val7);
}
case ARM::BI__builtin_arm_mve_vbicq_m_n_s16:
case ARM::BI__builtin_arm_mve_vbicq_m_n_u16: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vbicq_m_n_s16:
    Param0 = true;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_m_n_u16:
    Param0 = false;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateIntCast(Val5, Int16Ty, Param0);
  Value *Val7 = ARMMVEVectorSplat(Builder, Val6);
  Value *Val8 = Builder.CreateNot(Val7);
  Value *Val9 = Builder.CreateAnd(Val3, Val8);
  return Builder.CreateSelect(Val2, Val9, Val3);
}
case ARM::BI__builtin_arm_mve_vorrq_m_n_s16:
case ARM::BI__builtin_arm_mve_vorrq_m_n_u16: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vorrq_m_n_s16:
    Param0 = true;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_m_n_u16:
    Param0 = false;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateIntCast(Val5, Int16Ty, Param0);
  Value *Val7 = ARMMVEVectorSplat(Builder, Val6);
  Value *Val8 = Builder.CreateOr(Val3, Val7);
  return Builder.CreateSelect(Val2, Val8, Val3);
}
case ARM::BI__builtin_arm_mve_vmvnq_m_n_s16:
case ARM::BI__builtin_arm_mve_vmvnq_m_n_u16: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmvnq_m_n_s16:
    Param0 = true;
    break;
  case ARM::BI__builtin_arm_mve_vmvnq_m_n_u16:
    Param0 = false;
    break;
  }
  Value *Val0 = EmitScalarExpr(E->getArg(2));
  Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
  Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1});
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateIntCast(Val4, Int16Ty, Param0);
  Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
  Value *Val7 = Builder.CreateNot(Val6);
  Value *Val8 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateSelect(Val2, Val7, Val8);
}
case ARM::BI__builtin_arm_mve_vcvtaq_m_s16_f16:
case ARM::BI__builtin_arm_mve_vcvtaq_m_s32_f32:
case ARM::BI__builtin_arm_mve_vcvtaq_m_u16_f16:
case ARM::BI__builtin_arm_mve_vcvtaq_m_u32_f32:
case ARM::BI__builtin_arm_mve_vcvtmq_m_s16_f16:
case ARM::BI__builtin_arm_mve_vcvtmq_m_s32_f32:
case ARM::BI__builtin_arm_mve_vcvtmq_m_u16_f16:
case ARM::BI__builtin_arm_mve_vcvtmq_m_u32_f32:
case ARM::BI__builtin_arm_mve_vcvtnq_m_s16_f16:
case ARM::BI__builtin_arm_mve_vcvtnq_m_s32_f32:
case ARM::BI__builtin_arm_mve_vcvtnq_m_u16_f16:
case ARM::BI__builtin_arm_mve_vcvtnq_m_u32_f32:
case ARM::BI__builtin_arm_mve_vcvtpq_m_s16_f16:
case ARM::BI__builtin_arm_mve_vcvtpq_m_s32_f32:
case ARM::BI__builtin_arm_mve_vcvtpq_m_u16_f16:
case ARM::BI__builtin_arm_mve_vcvtpq_m_u32_f32: {
  uint32_t  Param0;
  llvm::Type * Param1;
  Intrinsic::ID  Param2;
  llvm::Type * Param3;
  llvm::Type * Param4;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcvtaq_m_s16_f16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vcvta_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtaq_m_s32_f32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vcvta_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtaq_m_u16_f16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vcvta_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtaq_m_u32_f32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vcvta_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtmq_m_s16_f16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vcvtm_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtmq_m_s32_f32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vcvtm_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtmq_m_u16_f16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vcvtm_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtmq_m_u32_f32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vcvtm_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtnq_m_s16_f16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vcvtn_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtnq_m_s32_f32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vcvtn_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtnq_m_u16_f16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vcvtn_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtnq_m_u32_f32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vcvtn_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtpq_m_s16_f16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vcvtp_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtpq_m_s32_f32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vcvtp_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtpq_m_u16_f16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vcvtp_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param4 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtpq_m_u32_f32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vcvtp_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param4 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val1 = EmitScalarExpr(E->getArg(0));
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val4});
  return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param4, Param1}), {Val0, Val1, Val2, Val5});
}
case ARM::BI__builtin_arm_mve_vcvtq_m_n_f16_s16:
case ARM::BI__builtin_arm_mve_vcvtq_m_n_f16_u16:
case ARM::BI__builtin_arm_mve_vcvtq_m_n_f32_s32:
case ARM::BI__builtin_arm_mve_vcvtq_m_n_f32_u32:
case ARM::BI__builtin_arm_mve_vcvtq_m_n_s16_f16:
case ARM::BI__builtin_arm_mve_vcvtq_m_n_s32_f32:
case ARM::BI__builtin_arm_mve_vcvtq_m_n_u16_f16:
case ARM::BI__builtin_arm_mve_vcvtq_m_n_u32_f32: {
  uint32_t  Param0;
  llvm::Type * Param1;
  llvm::Type * Param2;
  llvm::Type * Param3;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcvtq_m_n_f16_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_m_n_f16_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_m_n_f32_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_m_n_f32_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_m_n_s16_f16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_m_n_s32_f32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_m_n_u16_f16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_m_n_u32_f32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val1 = EmitScalarExpr(E->getArg(0));
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  Value *Val4 = EmitScalarExpr(E->getArg(3));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val5});
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fix_predicated, {Param2, Param3, Param1}), {Val0, Val1, Val2, Val3, Val6});
}
case ARM::BI__builtin_arm_mve_vabavq_p_s16:
case ARM::BI__builtin_arm_mve_vabavq_p_s32:
case ARM::BI__builtin_arm_mve_vabavq_p_s8:
case ARM::BI__builtin_arm_mve_vabavq_p_u16:
case ARM::BI__builtin_arm_mve_vabavq_p_u32:
case ARM::BI__builtin_arm_mve_vabavq_p_u8:
case ARM::BI__builtin_arm_mve_vcmlaq_m_f16:
case ARM::BI__builtin_arm_mve_vcmlaq_m_f32:
case ARM::BI__builtin_arm_mve_vcmlaq_rot180_m_f16:
case ARM::BI__builtin_arm_mve_vcmlaq_rot180_m_f32:
case ARM::BI__builtin_arm_mve_vcmlaq_rot270_m_f16:
case ARM::BI__builtin_arm_mve_vcmlaq_rot270_m_f32:
case ARM::BI__builtin_arm_mve_vcmlaq_rot90_m_f16:
case ARM::BI__builtin_arm_mve_vcmlaq_rot90_m_f32:
case ARM::BI__builtin_arm_mve_vcmulq_m_f16:
case ARM::BI__builtin_arm_mve_vcmulq_m_f32:
case ARM::BI__builtin_arm_mve_vcmulq_rot180_m_f16:
case ARM::BI__builtin_arm_mve_vcmulq_rot180_m_f32:
case ARM::BI__builtin_arm_mve_vcmulq_rot270_m_f16:
case ARM::BI__builtin_arm_mve_vcmulq_rot270_m_f32:
case ARM::BI__builtin_arm_mve_vcmulq_rot90_m_f16:
case ARM::BI__builtin_arm_mve_vcmulq_rot90_m_f32: {
  uint32_t  Param0;
  llvm::Type * Param1;
  Intrinsic::ID  Param2;
  llvm::Type * Param3;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vabavq_p_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vabav_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vabavq_p_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vabav_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vabavq_p_s8:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_vabav_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vabavq_p_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vabav_predicated;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vabavq_p_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vabav_predicated;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vabavq_p_u8:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param2 = Intrinsic::arm_mve_vabav_predicated;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vcmlaq_m_f16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmlaq_m_f32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmlaq_rot180_m_f16:
    Param0 = 2;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmlaq_rot180_m_f32:
    Param0 = 2;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmlaq_rot270_m_f16:
    Param0 = 3;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmlaq_rot270_m_f32:
    Param0 = 3;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmlaq_rot90_m_f16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmlaq_rot90_m_f32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_m_f16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vcmulq_predicated;
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_m_f32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vcmulq_predicated;
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_rot180_m_f16:
    Param0 = 2;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vcmulq_predicated;
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_rot180_m_f32:
    Param0 = 2;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vcmulq_predicated;
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_rot270_m_f16:
    Param0 = 3;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vcmulq_predicated;
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_rot270_m_f32:
    Param0 = 3;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vcmulq_predicated;
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_rot90_m_f16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param2 = Intrinsic::arm_mve_vcmulq_predicated;
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_rot90_m_f32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param2 = Intrinsic::arm_mve_vcmulq_predicated;
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val1 = EmitScalarExpr(E->getArg(0));
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  Value *Val4 = EmitScalarExpr(E->getArg(3));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val5});
  return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param1}), {Val0, Val1, Val2, Val3, Val6});
}
case ARM::BI__builtin_arm_mve_vabavq_s16:
case ARM::BI__builtin_arm_mve_vabavq_s32:
case ARM::BI__builtin_arm_mve_vabavq_s8:
case ARM::BI__builtin_arm_mve_vabavq_u16:
case ARM::BI__builtin_arm_mve_vabavq_u32:
case ARM::BI__builtin_arm_mve_vabavq_u8:
case ARM::BI__builtin_arm_mve_vcmlaq_f16:
case ARM::BI__builtin_arm_mve_vcmlaq_f32:
case ARM::BI__builtin_arm_mve_vcmlaq_rot180_f16:
case ARM::BI__builtin_arm_mve_vcmlaq_rot180_f32:
case ARM::BI__builtin_arm_mve_vcmlaq_rot270_f16:
case ARM::BI__builtin_arm_mve_vcmlaq_rot270_f32:
case ARM::BI__builtin_arm_mve_vcmlaq_rot90_f16:
case ARM::BI__builtin_arm_mve_vcmlaq_rot90_f32: {
  uint32_t  Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vabavq_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vabav;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vabavq_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vabav;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vabavq_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vabav;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vabavq_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vabav;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vabavq_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vabav;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vabavq_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vabav;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vcmlaq_f16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcmlaq;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmlaq_f32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcmlaq;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmlaq_rot180_f16:
    Param0 = 2;
    Param1 = Intrinsic::arm_mve_vcmlaq;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmlaq_rot180_f32:
    Param0 = 2;
    Param1 = Intrinsic::arm_mve_vcmlaq;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmlaq_rot270_f16:
    Param0 = 3;
    Param1 = Intrinsic::arm_mve_vcmlaq;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmlaq_rot270_f32:
    Param0 = 3;
    Param1 = Intrinsic::arm_mve_vcmlaq;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmlaq_rot90_f16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcmlaq;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmlaq_rot90_f32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcmlaq;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val1 = EmitScalarExpr(E->getArg(0));
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = EmitScalarExpr(E->getArg(2));
  return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2}), {Val0, Val1, Val2, Val3});
}
case ARM::BI__builtin_arm_mve_vcmulq_f16:
case ARM::BI__builtin_arm_mve_vcmulq_f32:
case ARM::BI__builtin_arm_mve_vcmulq_rot180_f16:
case ARM::BI__builtin_arm_mve_vcmulq_rot180_f32:
case ARM::BI__builtin_arm_mve_vcmulq_rot270_f16:
case ARM::BI__builtin_arm_mve_vcmulq_rot270_f32:
case ARM::BI__builtin_arm_mve_vcmulq_rot90_f16:
case ARM::BI__builtin_arm_mve_vcmulq_rot90_f32: {
  uint32_t  Param0;
  llvm::Type * Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmulq_f16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_f32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_rot180_f16:
    Param0 = 2;
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_rot180_f32:
    Param0 = 2;
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_rot270_f16:
    Param0 = 3;
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_rot270_f32:
    Param0 = 3;
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_rot90_f16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_rot90_f32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val1 = EmitScalarExpr(E->getArg(0));
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcmulq, {Param1}), {Val0, Val1, Val2});
}
case ARM::BI__builtin_arm_mve_vcvtq_n_f16_s16:
case ARM::BI__builtin_arm_mve_vcvtq_n_f16_u16:
case ARM::BI__builtin_arm_mve_vcvtq_n_f32_s32:
case ARM::BI__builtin_arm_mve_vcvtq_n_f32_u32:
case ARM::BI__builtin_arm_mve_vcvtq_n_s16_f16:
case ARM::BI__builtin_arm_mve_vcvtq_n_s32_f32:
case ARM::BI__builtin_arm_mve_vcvtq_n_u16_f16:
case ARM::BI__builtin_arm_mve_vcvtq_n_u32_f32: {
  uint32_t  Param0;
  llvm::Type * Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcvtq_n_f16_s16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_n_f16_u16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(HalfTy, 8);
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_n_f32_s32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_n_f32_u32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(FloatTy, 4);
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_n_s16_f16:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_n_s32_f32:
    Param0 = 0;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_n_u16_f16:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_n_u32_f32:
    Param0 = 1;
    Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val1 = EmitScalarExpr(E->getArg(0));
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fix, {Param1, Param2}), {Val0, Val1, Val2});
}
case ARM::BI__builtin_arm_mve_vcvtaq_s16_f16:
case ARM::BI__builtin_arm_mve_vcvtaq_s32_f32:
case ARM::BI__builtin_arm_mve_vcvtaq_u16_f16:
case ARM::BI__builtin_arm_mve_vcvtaq_u32_f32:
case ARM::BI__builtin_arm_mve_vcvtmq_s16_f16:
case ARM::BI__builtin_arm_mve_vcvtmq_s32_f32:
case ARM::BI__builtin_arm_mve_vcvtmq_u16_f16:
case ARM::BI__builtin_arm_mve_vcvtmq_u32_f32:
case ARM::BI__builtin_arm_mve_vcvtnq_s16_f16:
case ARM::BI__builtin_arm_mve_vcvtnq_s32_f32:
case ARM::BI__builtin_arm_mve_vcvtnq_u16_f16:
case ARM::BI__builtin_arm_mve_vcvtnq_u32_f32:
case ARM::BI__builtin_arm_mve_vcvtpq_s16_f16:
case ARM::BI__builtin_arm_mve_vcvtpq_s32_f32:
case ARM::BI__builtin_arm_mve_vcvtpq_u16_f16:
case ARM::BI__builtin_arm_mve_vcvtpq_u32_f32: {
  uint32_t  Param0;
  Intrinsic::ID  Param1;
  llvm::Type * Param2;
  llvm::Type * Param3;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcvtaq_s16_f16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcvta;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtaq_s32_f32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcvta;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtaq_u16_f16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcvta;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtaq_u32_f32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcvta;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtmq_s16_f16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcvtm;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtmq_s32_f32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcvtm;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtmq_u16_f16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcvtm;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtmq_u32_f32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcvtm;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtnq_s16_f16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcvtn;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtnq_s32_f32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcvtn;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtnq_u16_f16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcvtn;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtnq_u32_f32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcvtn;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtpq_s16_f16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcvtp;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtpq_s32_f32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcvtp;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcvtpq_u16_f16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcvtp;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcvtpq_u32_f32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcvtp;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  }
  Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val1 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param3}), {Val0, Val1});
}
case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_f16:
case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_f32:
case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_s16:
case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_s32:
case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_s8:
case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_u16:
case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_u32:
case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_u8:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_f16:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_f32:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_s16:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_s32:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_s8:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_u16:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_u32:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_u8:
case ARM::BI__builtin_arm_mve_vhcaddq_rot270_m_s16:
case ARM::BI__builtin_arm_mve_vhcaddq_rot270_m_s32:
case ARM::BI__builtin_arm_mve_vhcaddq_rot270_m_s8:
case ARM::BI__builtin_arm_mve_vhcaddq_rot90_m_s16:
case ARM::BI__builtin_arm_mve_vhcaddq_rot90_m_s32:
case ARM::BI__builtin_arm_mve_vhcaddq_rot90_m_s8: {
  uint32_t  Param0;
  uint32_t  Param1;
  llvm::Type * Param2;
  llvm::Type * Param3;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_f16:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_f32:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_s16:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_s32:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_s8:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_u32:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_u8:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_f16:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_f32:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_s8:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_u8:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vhcaddq_rot270_m_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhcaddq_rot270_m_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhcaddq_rot270_m_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vhcaddq_rot90_m_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhcaddq_rot90_m_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhcaddq_rot90_m_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = EmitScalarExpr(E->getArg(2));
  Value *Val5 = EmitScalarExpr(E->getArg(3));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param2}), {Val6});
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcaddq_predicated, {Param3, Param2}), {Val0, Val1, Val2, Val3, Val4, Val7});
}
case ARM::BI__builtin_arm_mve_vcaddq_rot270_f16:
case ARM::BI__builtin_arm_mve_vcaddq_rot270_f32:
case ARM::BI__builtin_arm_mve_vcaddq_rot270_s16:
case ARM::BI__builtin_arm_mve_vcaddq_rot270_s32:
case ARM::BI__builtin_arm_mve_vcaddq_rot270_s8:
case ARM::BI__builtin_arm_mve_vcaddq_rot270_u16:
case ARM::BI__builtin_arm_mve_vcaddq_rot270_u32:
case ARM::BI__builtin_arm_mve_vcaddq_rot270_u8:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_f16:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_f32:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_s16:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_s32:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_s8:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_u16:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_u32:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_u8:
case ARM::BI__builtin_arm_mve_vhcaddq_rot270_s16:
case ARM::BI__builtin_arm_mve_vhcaddq_rot270_s32:
case ARM::BI__builtin_arm_mve_vhcaddq_rot270_s8:
case ARM::BI__builtin_arm_mve_vhcaddq_rot90_s16:
case ARM::BI__builtin_arm_mve_vhcaddq_rot90_s32:
case ARM::BI__builtin_arm_mve_vhcaddq_rot90_s8: {
  uint32_t  Param0;
  uint32_t  Param1;
  llvm::Type * Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_f16:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_f32:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_s16:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_s32:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_s8:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_u32:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_u8:
    Param0 = 1;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_f16:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(HalfTy, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_f32:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(FloatTy, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_s16:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_s32:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_s8:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_u8:
    Param0 = 1;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vhcaddq_rot270_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhcaddq_rot270_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhcaddq_rot270_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vhcaddq_rot90_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vhcaddq_rot90_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vhcaddq_rot90_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcaddq, {Param2}), {Val0, Val1, Val2, Val3});
}
case ARM::BI__builtin_arm_mve_vmladavaq_p_s16:
case ARM::BI__builtin_arm_mve_vmladavaq_p_s32:
case ARM::BI__builtin_arm_mve_vmladavaq_p_s8:
case ARM::BI__builtin_arm_mve_vmladavaq_p_u16:
case ARM::BI__builtin_arm_mve_vmladavaq_p_u32:
case ARM::BI__builtin_arm_mve_vmladavaq_p_u8:
case ARM::BI__builtin_arm_mve_vmladavaxq_p_s16:
case ARM::BI__builtin_arm_mve_vmladavaxq_p_s32:
case ARM::BI__builtin_arm_mve_vmladavaxq_p_s8:
case ARM::BI__builtin_arm_mve_vmlsdavaq_p_s16:
case ARM::BI__builtin_arm_mve_vmlsdavaq_p_s32:
case ARM::BI__builtin_arm_mve_vmlsdavaq_p_s8:
case ARM::BI__builtin_arm_mve_vmlsdavaxq_p_s16:
case ARM::BI__builtin_arm_mve_vmlsdavaxq_p_s32:
case ARM::BI__builtin_arm_mve_vmlsdavaxq_p_s8: {
  uint32_t  Param0;
  uint32_t  Param1;
  uint32_t  Param2;
  llvm::Type * Param3;
  llvm::Type * Param4;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmladavaq_p_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmladavaq_p_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmladavaq_p_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmladavaq_p_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmladavaq_p_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmladavaq_p_u8:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmladavaxq_p_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmladavaxq_p_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmladavaxq_p_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavaq_p_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavaq_p_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavaq_p_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavaxq_p_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavaxq_p_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavaxq_p_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param2);
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = EmitScalarExpr(E->getArg(3));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val7});
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmldava_predicated, {Param4, Param3}), {Val0, Val1, Val2, Val3, Val4, Val5, Val8});
}
case ARM::BI__builtin_arm_mve_vmladavaq_s16:
case ARM::BI__builtin_arm_mve_vmladavaq_s32:
case ARM::BI__builtin_arm_mve_vmladavaq_s8:
case ARM::BI__builtin_arm_mve_vmladavaq_u16:
case ARM::BI__builtin_arm_mve_vmladavaq_u32:
case ARM::BI__builtin_arm_mve_vmladavaq_u8:
case ARM::BI__builtin_arm_mve_vmladavaxq_s16:
case ARM::BI__builtin_arm_mve_vmladavaxq_s32:
case ARM::BI__builtin_arm_mve_vmladavaxq_s8:
case ARM::BI__builtin_arm_mve_vmlsdavaq_s16:
case ARM::BI__builtin_arm_mve_vmlsdavaq_s32:
case ARM::BI__builtin_arm_mve_vmlsdavaq_s8:
case ARM::BI__builtin_arm_mve_vmlsdavaxq_s16:
case ARM::BI__builtin_arm_mve_vmlsdavaxq_s32:
case ARM::BI__builtin_arm_mve_vmlsdavaxq_s8: {
  uint32_t  Param0;
  uint32_t  Param1;
  uint32_t  Param2;
  llvm::Type * Param3;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmladavaq_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmladavaq_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmladavaq_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmladavaq_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmladavaq_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmladavaq_u8:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmladavaxq_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmladavaxq_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmladavaxq_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavaq_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavaq_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavaq_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavaxq_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavaxq_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavaxq_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param2);
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmldava, {Param3}), {Val0, Val1, Val2, Val3, Val4, Val5});
}
case ARM::BI__builtin_arm_mve_vmladavq_p_s16:
case ARM::BI__builtin_arm_mve_vmladavq_p_s32:
case ARM::BI__builtin_arm_mve_vmladavq_p_s8:
case ARM::BI__builtin_arm_mve_vmladavq_p_u16:
case ARM::BI__builtin_arm_mve_vmladavq_p_u32:
case ARM::BI__builtin_arm_mve_vmladavq_p_u8:
case ARM::BI__builtin_arm_mve_vmladavxq_p_s16:
case ARM::BI__builtin_arm_mve_vmladavxq_p_s32:
case ARM::BI__builtin_arm_mve_vmladavxq_p_s8:
case ARM::BI__builtin_arm_mve_vmlsdavq_p_s16:
case ARM::BI__builtin_arm_mve_vmlsdavq_p_s32:
case ARM::BI__builtin_arm_mve_vmlsdavq_p_s8:
case ARM::BI__builtin_arm_mve_vmlsdavxq_p_s16:
case ARM::BI__builtin_arm_mve_vmlsdavxq_p_s32:
case ARM::BI__builtin_arm_mve_vmlsdavxq_p_s8: {
  uint32_t  Param0;
  uint32_t  Param1;
  uint32_t  Param2;
  llvm::Type * Param3;
  llvm::Type * Param4;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmladavq_p_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmladavq_p_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmladavq_p_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmladavq_p_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmladavq_p_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmladavq_p_u8:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmladavxq_p_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmladavxq_p_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmladavxq_p_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavq_p_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavq_p_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavq_p_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavxq_p_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavxq_p_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavxq_p_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
    Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param2);
  llvm::Type *Val3 = Int32Ty;
  Value *Val4 = llvm::Constant::getNullValue(Val3);
  Value *Val5 = EmitScalarExpr(E->getArg(0));
  Value *Val6 = EmitScalarExpr(E->getArg(1));
  Value *Val7 = EmitScalarExpr(E->getArg(2));
  Value *Val8 = Builder.CreateIntCast(Val7, Int32Ty, false);
  Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val8});
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmldava_predicated, {Param4, Param3}), {Val0, Val1, Val2, Val4, Val5, Val6, Val9});
}
case ARM::BI__builtin_arm_mve_vmladavq_s16:
case ARM::BI__builtin_arm_mve_vmladavq_s32:
case ARM::BI__builtin_arm_mve_vmladavq_s8:
case ARM::BI__builtin_arm_mve_vmladavq_u16:
case ARM::BI__builtin_arm_mve_vmladavq_u32:
case ARM::BI__builtin_arm_mve_vmladavq_u8:
case ARM::BI__builtin_arm_mve_vmladavxq_s16:
case ARM::BI__builtin_arm_mve_vmladavxq_s32:
case ARM::BI__builtin_arm_mve_vmladavxq_s8:
case ARM::BI__builtin_arm_mve_vmlsdavq_s16:
case ARM::BI__builtin_arm_mve_vmlsdavq_s32:
case ARM::BI__builtin_arm_mve_vmlsdavq_s8:
case ARM::BI__builtin_arm_mve_vmlsdavxq_s16:
case ARM::BI__builtin_arm_mve_vmlsdavxq_s32:
case ARM::BI__builtin_arm_mve_vmlsdavxq_s8: {
  uint32_t  Param0;
  uint32_t  Param1;
  uint32_t  Param2;
  llvm::Type * Param3;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmladavq_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmladavq_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmladavq_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmladavq_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmladavq_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmladavq_u8:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmladavxq_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmladavxq_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmladavxq_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavq_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavq_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavq_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavxq_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavxq_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlsdavxq_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
    break;
  }
  Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param2);
  llvm::Type *Val3 = Int32Ty;
  Value *Val4 = llvm::Constant::getNullValue(Val3);
  Value *Val5 = EmitScalarExpr(E->getArg(0));
  Value *Val6 = EmitScalarExpr(E->getArg(1));
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmldava, {Param3}), {Val0, Val1, Val2, Val4, Val5, Val6});
}
case ARM::BI__builtin_arm_mve_vmlaldavq_s16:
case ARM::BI__builtin_arm_mve_vmlaldavq_s32:
case ARM::BI__builtin_arm_mve_vmlaldavq_u16:
case ARM::BI__builtin_arm_mve_vmlaldavq_u32:
case ARM::BI__builtin_arm_mve_vmlaldavxq_s16:
case ARM::BI__builtin_arm_mve_vmlaldavxq_s32:
case ARM::BI__builtin_arm_mve_vmlsldavq_s16:
case ARM::BI__builtin_arm_mve_vmlsldavq_s32:
case ARM::BI__builtin_arm_mve_vmlsldavxq_s16:
case ARM::BI__builtin_arm_mve_vmlsldavxq_s32:
case ARM::BI__builtin_arm_mve_vrmlaldavhq_s32:
case ARM::BI__builtin_arm_mve_vrmlaldavhq_u32:
case ARM::BI__builtin_arm_mve_vrmlaldavhxq_s32:
case ARM::BI__builtin_arm_mve_vrmlsldavhq_s32:
case ARM::BI__builtin_arm_mve_vrmlsldavhxq_s32: {
  uint32_t  Param0;
  uint32_t  Param1;
  uint32_t  Param2;
  Intrinsic::ID  Param3;
  llvm::Type * Param4;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmlaldavq_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavq_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavq_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavq_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavxq_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavxq_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlsldavq_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlsldavq_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlsldavxq_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlsldavxq_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vmlldava;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlaldavhq_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vrmlldavha;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlaldavhq_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vrmlldavha;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlaldavhxq_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vrmlldavha;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlsldavhq_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = Intrinsic::arm_mve_vrmlldavha;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlsldavhxq_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = Intrinsic::arm_mve_vrmlldavha;
    Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  llvm::Type *Val0 = Int32Ty;
  Value *Val1 = llvm::Constant::getNullValue(Val0);
  llvm::Type *Val2 = Int32Ty;
  Value *Val3 = llvm::Constant::getNullValue(Val2);
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param2);
  Value *Val7 = EmitScalarExpr(E->getArg(0));
  Value *Val8 = EmitScalarExpr(E->getArg(1));
  Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Param3, {Param4}), {Val4, Val5, Val6, Val3, Val1, Val7, Val8});
  Value *Val10 = Builder.CreateExtractValue(Val9, static_cast<unsigned>(1));
  Value *Val11 = Builder.CreateIntCast(Val10, Int64Ty, false);
  Value *Val12 = llvm::ConstantInt::get(Int64Ty, 32);
  Value *Val13 = Builder.CreateShl(Val11, Val12);
  Value *Val14 = Builder.CreateExtractValue(Val9, static_cast<unsigned>(0));
  Value *Val15 = Builder.CreateIntCast(Val14, Int64Ty, false);
  return Builder.CreateOr(Val13, Val15);
}
case ARM::BI__builtin_arm_mve_vmlaldavq_p_s16:
case ARM::BI__builtin_arm_mve_vmlaldavq_p_s32:
case ARM::BI__builtin_arm_mve_vmlaldavq_p_u16:
case ARM::BI__builtin_arm_mve_vmlaldavq_p_u32:
case ARM::BI__builtin_arm_mve_vmlaldavxq_p_s16:
case ARM::BI__builtin_arm_mve_vmlaldavxq_p_s32:
case ARM::BI__builtin_arm_mve_vmlsldavq_p_s16:
case ARM::BI__builtin_arm_mve_vmlsldavq_p_s32:
case ARM::BI__builtin_arm_mve_vmlsldavxq_p_s16:
case ARM::BI__builtin_arm_mve_vmlsldavxq_p_s32:
case ARM::BI__builtin_arm_mve_vrmlaldavhq_p_s32:
case ARM::BI__builtin_arm_mve_vrmlaldavhq_p_u32:
case ARM::BI__builtin_arm_mve_vrmlaldavhxq_p_s32:
case ARM::BI__builtin_arm_mve_vrmlsldavhq_p_s32:
case ARM::BI__builtin_arm_mve_vrmlsldavhxq_p_s32: {
  uint32_t  Param0;
  uint32_t  Param1;
  uint32_t  Param2;
  llvm::Type * Param3;
  Intrinsic::ID  Param4;
  llvm::Type * Param5;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmlaldavq_p_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavq_p_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavq_p_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavq_p_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavxq_p_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlaldavxq_p_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlsldavq_p_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlsldavq_p_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vmlsldavxq_p_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
    break;
  case ARM::BI__builtin_arm_mve_vmlsldavxq_p_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vmlldava_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlaldavhq_p_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlaldavhq_p_u32:
    Param0 = 1;
    Param1 = 0;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlaldavhxq_p_s32:
    Param0 = 0;
    Param1 = 0;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlsldavhq_p_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 0;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  case ARM::BI__builtin_arm_mve_vrmlsldavhxq_p_s32:
    Param0 = 0;
    Param1 = 1;
    Param2 = 1;
    Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
    Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
    Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
    break;
  }
  llvm::Type *Val0 = Int32Ty;
  Value *Val1 = llvm::Constant::getNullValue(Val0);
  llvm::Type *Val2 = Int32Ty;
  Value *Val3 = llvm::Constant::getNullValue(Val2);
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param2);
  Value *Val7 = EmitScalarExpr(E->getArg(0));
  Value *Val8 = EmitScalarExpr(E->getArg(1));
  Value *Val9 = EmitScalarExpr(E->getArg(2));
  Value *Val10 = Builder.CreateIntCast(Val9, Int32Ty, false);
  Value *Val11 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val10});
  Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Param4, {Param5, Param3}), {Val4, Val5, Val6, Val3, Val1, Val7, Val8, Val11});
  Value *Val13 = Builder.CreateExtractValue(Val12, static_cast<unsigned>(1));
  Value *Val14 = Builder.CreateIntCast(Val13, Int64Ty, false);
  Value *Val15 = llvm::ConstantInt::get(Int64Ty, 32);
  Value *Val16 = Builder.CreateShl(Val14, Val15);
  Value *Val17 = Builder.CreateExtractValue(Val12, static_cast<unsigned>(0));
  Value *Val18 = Builder.CreateIntCast(Val17, Int64Ty, false);
  return Builder.CreateOr(Val16, Val18);
}
case ARM::BI__builtin_arm_mve_vaddq_x_n_f32:
case ARM::BI__builtin_arm_mve_vmulq_x_n_f32:
case ARM::BI__builtin_arm_mve_vsubq_x_n_f32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vaddq_x_n_f32:
    Param0 = Intrinsic::arm_mve_add_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulq_x_n_f32:
    Param0 = Intrinsic::arm_mve_mul_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsubq_x_n_f32:
    Param0 = Intrinsic::arm_mve_sub_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val4, Val7, Val1});
}
case ARM::BI__builtin_arm_mve_vabsq_x_f32:
case ARM::BI__builtin_arm_mve_vnegq_x_f32:
case ARM::BI__builtin_arm_mve_vrndaq_x_f32:
case ARM::BI__builtin_arm_mve_vrndmq_x_f32:
case ARM::BI__builtin_arm_mve_vrndnq_x_f32:
case ARM::BI__builtin_arm_mve_vrndpq_x_f32:
case ARM::BI__builtin_arm_mve_vrndq_x_f32:
case ARM::BI__builtin_arm_mve_vrndxq_x_f32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vabsq_x_f32:
    Param0 = Intrinsic::arm_mve_abs_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vnegq_x_f32:
    Param0 = Intrinsic::arm_mve_neg_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrndaq_x_f32:
    Param0 = Intrinsic::arm_mve_vrinta_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrndmq_x_f32:
    Param0 = Intrinsic::arm_mve_vrintm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrndnq_x_f32:
    Param0 = Intrinsic::arm_mve_vrintn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrndpq_x_f32:
    Param0 = Intrinsic::arm_mve_vrintp_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrndq_x_f32:
    Param0 = Intrinsic::arm_mve_vrintz_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrndxq_x_f32:
    Param0 = Intrinsic::arm_mve_vrintx_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val5, Val1});
}
case ARM::BI__builtin_arm_mve_vbrsrq_x_n_f32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vbrsrq_x_n_f32:
    Param0 = Intrinsic::arm_mve_vbrsr_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = EmitScalarExpr(E->getArg(2));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1, Val2, Val3, Val6});
}
case ARM::BI__builtin_arm_mve_vaddq_x_f32:
case ARM::BI__builtin_arm_mve_vmulq_x_f32:
case ARM::BI__builtin_arm_mve_vsubq_x_f32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vaddq_x_f32:
    Param0 = Intrinsic::arm_mve_add_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulq_x_f32:
    Param0 = Intrinsic::arm_mve_mul_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsubq_x_f32:
    Param0 = Intrinsic::arm_mve_sub_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = EmitScalarExpr(E->getArg(2));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val6, Val1});
}
case ARM::BI__builtin_arm_mve_vabdq_x_f32:
case ARM::BI__builtin_arm_mve_vmaxnmq_x_f32:
case ARM::BI__builtin_arm_mve_vminnmq_x_f32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vabdq_x_f32:
    Param0 = Intrinsic::arm_mve_abd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmaxnmq_x_f32:
    Param0 = Intrinsic::arm_mve_max_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vminnmq_x_f32:
    Param0 = Intrinsic::arm_mve_min_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, 0);
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val4, Val7, Val1});
}
case ARM::BI__builtin_arm_mve_vrev64q_x_f32: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, 64);
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
  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});
}
case ARM::BI__builtin_arm_mve_vcvtq_x_f32_s32:
case ARM::BI__builtin_arm_mve_vcvtq_x_f32_u32: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcvtq_x_f32_s32:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_x_f32_u32:
    Param0 = 1;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
  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});
}
case ARM::BI__builtin_arm_mve_vcvtbq_x_f32_f16:
case ARM::BI__builtin_arm_mve_vcvttq_x_f32_f16: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcvtbq_x_f32_f16:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vcvttq_x_f32_f16:
    Param0 = 1;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_widen_predicated), {Val1, Val2, Val3, Val6});
}
case ARM::BI__builtin_arm_mve_vandq_x_f32:
case ARM::BI__builtin_arm_mve_vbicq_x_f32:
case ARM::BI__builtin_arm_mve_veorq_x_f32:
case ARM::BI__builtin_arm_mve_vornq_x_f32:
case ARM::BI__builtin_arm_mve_vorrq_x_f32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vandq_x_f32:
    Param0 = Intrinsic::arm_mve_and_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_x_f32:
    Param0 = Intrinsic::arm_mve_bic_predicated;
    break;
  case ARM::BI__builtin_arm_mve_veorq_x_f32:
    Param0 = Intrinsic::arm_mve_eor_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vornq_x_f32:
    Param0 = Intrinsic::arm_mve_orn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_x_f32:
    Param0 = Intrinsic::arm_mve_orr_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val3 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val4 = Builder.CreateBitCast(Val2, Val3);
  Value *Val5 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val7 = Builder.CreateBitCast(Val5, Val6);
  Value *Val8 = EmitScalarExpr(E->getArg(2));
  Value *Val9 = Builder.CreateIntCast(Val8, Int32Ty, false);
  Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val9});
  llvm::Type *Val11 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val12 = Builder.CreateBitCast(Val1, Val11);
  Value *Val13 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4, Val7, Val10, Val12});
  llvm::Type *Val14 = llvm::FixedVectorType::get(FloatTy, 4);
  return Builder.CreateBitCast(Val13, Val14);
}
case ARM::BI__builtin_arm_mve_vdupq_x_n_f32: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val3});
  Value *Val5 = EmitScalarExpr(E->getArg(0));
  Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
  return Builder.CreateSelect(Val4, Val6, Val1);
}
case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_f32:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_f32: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_f32:
    Param0 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_f32:
    Param0 = 0;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, 1);
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = EmitScalarExpr(E->getArg(0));
  Value *Val5 = EmitScalarExpr(E->getArg(1));
  Value *Val6 = EmitScalarExpr(E->getArg(2));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
  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});
}
case ARM::BI__builtin_arm_mve_vcmulq_rot180_x_f32:
case ARM::BI__builtin_arm_mve_vcmulq_rot270_x_f32:
case ARM::BI__builtin_arm_mve_vcmulq_rot90_x_f32:
case ARM::BI__builtin_arm_mve_vcmulq_x_f32: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmulq_rot180_x_f32:
    Param0 = 2;
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_rot270_x_f32:
    Param0 = 3;
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_rot90_x_f32:
    Param0 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_x_f32:
    Param0 = 0;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
  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});
}
case ARM::BI__builtin_arm_mve_vcvtq_x_n_f32_s32:
case ARM::BI__builtin_arm_mve_vcvtq_x_n_f32_u32: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcvtq_x_n_f32_s32:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_x_n_f32_u32:
    Param0 = 1;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
  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});
}
case ARM::BI__builtin_arm_mve_vuninitializedq_f32:
case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_f32: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
  return UndefValue::get(Val0);
}
case ARM::BI__builtin_arm_mve_vaddq_x_n_f16:
case ARM::BI__builtin_arm_mve_vmulq_x_n_f16:
case ARM::BI__builtin_arm_mve_vsubq_x_n_f16: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vaddq_x_n_f16:
    Param0 = Intrinsic::arm_mve_add_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulq_x_n_f16:
    Param0 = Intrinsic::arm_mve_mul_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsubq_x_n_f16:
    Param0 = Intrinsic::arm_mve_sub_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val4, Val7, Val1});
}
case ARM::BI__builtin_arm_mve_vabsq_x_f16:
case ARM::BI__builtin_arm_mve_vnegq_x_f16:
case ARM::BI__builtin_arm_mve_vrndaq_x_f16:
case ARM::BI__builtin_arm_mve_vrndmq_x_f16:
case ARM::BI__builtin_arm_mve_vrndnq_x_f16:
case ARM::BI__builtin_arm_mve_vrndpq_x_f16:
case ARM::BI__builtin_arm_mve_vrndq_x_f16:
case ARM::BI__builtin_arm_mve_vrndxq_x_f16: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vabsq_x_f16:
    Param0 = Intrinsic::arm_mve_abs_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vnegq_x_f16:
    Param0 = Intrinsic::arm_mve_neg_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrndaq_x_f16:
    Param0 = Intrinsic::arm_mve_vrinta_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrndmq_x_f16:
    Param0 = Intrinsic::arm_mve_vrintm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrndnq_x_f16:
    Param0 = Intrinsic::arm_mve_vrintn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrndpq_x_f16:
    Param0 = Intrinsic::arm_mve_vrintp_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrndq_x_f16:
    Param0 = Intrinsic::arm_mve_vrintz_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrndxq_x_f16:
    Param0 = Intrinsic::arm_mve_vrintx_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val5, Val1});
}
case ARM::BI__builtin_arm_mve_vbrsrq_x_n_f16: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vbrsrq_x_n_f16:
    Param0 = Intrinsic::arm_mve_vbrsr_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = EmitScalarExpr(E->getArg(2));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1, Val2, Val3, Val6});
}
case ARM::BI__builtin_arm_mve_vaddq_x_f16:
case ARM::BI__builtin_arm_mve_vmulq_x_f16:
case ARM::BI__builtin_arm_mve_vsubq_x_f16: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vaddq_x_f16:
    Param0 = Intrinsic::arm_mve_add_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulq_x_f16:
    Param0 = Intrinsic::arm_mve_mul_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsubq_x_f16:
    Param0 = Intrinsic::arm_mve_sub_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = EmitScalarExpr(E->getArg(2));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val6, Val1});
}
case ARM::BI__builtin_arm_mve_vabdq_x_f16:
case ARM::BI__builtin_arm_mve_vmaxnmq_x_f16:
case ARM::BI__builtin_arm_mve_vminnmq_x_f16: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vabdq_x_f16:
    Param0 = Intrinsic::arm_mve_abd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmaxnmq_x_f16:
    Param0 = Intrinsic::arm_mve_max_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vminnmq_x_f16:
    Param0 = Intrinsic::arm_mve_min_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, 0);
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val4, Val7, Val1});
}
case ARM::BI__builtin_arm_mve_vcvtq_x_f16_s16:
case ARM::BI__builtin_arm_mve_vcvtq_x_f16_u16: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcvtq_x_f16_s16:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_x_f16_u16:
    Param0 = 1;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
  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});
}
case ARM::BI__builtin_arm_mve_vrev32q_x_f16:
case ARM::BI__builtin_arm_mve_vrev64q_x_f16: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vrev32q_x_f16:
    Param0 = 32;
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_x_f16:
    Param0 = 64;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
  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});
}
case ARM::BI__builtin_arm_mve_vandq_x_f16:
case ARM::BI__builtin_arm_mve_vbicq_x_f16:
case ARM::BI__builtin_arm_mve_veorq_x_f16:
case ARM::BI__builtin_arm_mve_vornq_x_f16:
case ARM::BI__builtin_arm_mve_vorrq_x_f16: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vandq_x_f16:
    Param0 = Intrinsic::arm_mve_and_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_x_f16:
    Param0 = Intrinsic::arm_mve_bic_predicated;
    break;
  case ARM::BI__builtin_arm_mve_veorq_x_f16:
    Param0 = Intrinsic::arm_mve_eor_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vornq_x_f16:
    Param0 = Intrinsic::arm_mve_orn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_x_f16:
    Param0 = Intrinsic::arm_mve_orr_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val3 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val4 = Builder.CreateBitCast(Val2, Val3);
  Value *Val5 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val7 = Builder.CreateBitCast(Val5, Val6);
  Value *Val8 = EmitScalarExpr(E->getArg(2));
  Value *Val9 = Builder.CreateIntCast(Val8, Int32Ty, false);
  Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val9});
  llvm::Type *Val11 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val12 = Builder.CreateBitCast(Val1, Val11);
  Value *Val13 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4, Val7, Val10, Val12});
  llvm::Type *Val14 = llvm::FixedVectorType::get(HalfTy, 8);
  return Builder.CreateBitCast(Val13, Val14);
}
case ARM::BI__builtin_arm_mve_vdupq_x_n_f16: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val3});
  Value *Val5 = EmitScalarExpr(E->getArg(0));
  Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
  return Builder.CreateSelect(Val4, Val6, Val1);
}
case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_f16:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_f16: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_f16:
    Param0 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_f16:
    Param0 = 0;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, 1);
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = EmitScalarExpr(E->getArg(0));
  Value *Val5 = EmitScalarExpr(E->getArg(1));
  Value *Val6 = EmitScalarExpr(E->getArg(2));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
  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});
}
case ARM::BI__builtin_arm_mve_vcmulq_rot180_x_f16:
case ARM::BI__builtin_arm_mve_vcmulq_rot270_x_f16:
case ARM::BI__builtin_arm_mve_vcmulq_rot90_x_f16:
case ARM::BI__builtin_arm_mve_vcmulq_x_f16: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcmulq_rot180_x_f16:
    Param0 = 2;
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_rot270_x_f16:
    Param0 = 3;
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_rot90_x_f16:
    Param0 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vcmulq_x_f16:
    Param0 = 0;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
  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});
}
case ARM::BI__builtin_arm_mve_vcvtq_x_n_f16_s16:
case ARM::BI__builtin_arm_mve_vcvtq_x_n_f16_u16: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcvtq_x_n_f16_s16:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_x_n_f16_u16:
    Param0 = 1;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
  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});
}
case ARM::BI__builtin_arm_mve_vuninitializedq_f16:
case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_f16: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
  return UndefValue::get(Val0);
}
case ARM::BI__builtin_arm_mve_vddupq_x_wb_u16:
case ARM::BI__builtin_arm_mve_vidupq_x_wb_u16: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vddupq_x_wb_u16:
    Param0 = Intrinsic::arm_mve_vddup_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vidupq_x_wb_u16:
    Param0 = Intrinsic::arm_mve_vidup_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Address Val2 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val3 = Builder.CreateLoad(Val2);
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1, Val3, Val4, Val7});
  Value *Val9 = Builder.CreateExtractValue(Val8, static_cast<unsigned>(1));
  Builder.CreateStore(Val9, Val2);
  return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vdwdupq_x_wb_u16:
case ARM::BI__builtin_arm_mve_viwdupq_x_wb_u16: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vdwdupq_x_wb_u16:
    Param0 = Intrinsic::arm_mve_vdwdup_predicated;
    break;
  case ARM::BI__builtin_arm_mve_viwdupq_x_wb_u16:
    Param0 = Intrinsic::arm_mve_viwdup_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Address Val2 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val3 = Builder.CreateLoad(Val2);
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = EmitScalarExpr(E->getArg(3));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
  Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1, Val3, Val4, Val5, Val8});
  Value *Val10 = Builder.CreateExtractValue(Val9, static_cast<unsigned>(1));
  Builder.CreateStore(Val10, Val2);
  return Builder.CreateExtractValue(Val9, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vaddq_x_n_s16:
case ARM::BI__builtin_arm_mve_vaddq_x_n_u16:
case ARM::BI__builtin_arm_mve_vmulq_x_n_s16:
case ARM::BI__builtin_arm_mve_vmulq_x_n_u16:
case ARM::BI__builtin_arm_mve_vsubq_x_n_s16:
case ARM::BI__builtin_arm_mve_vsubq_x_n_u16: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vaddq_x_n_s16:
    Param0 = Intrinsic::arm_mve_add_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vaddq_x_n_u16:
    Param0 = Intrinsic::arm_mve_add_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulq_x_n_s16:
    Param0 = Intrinsic::arm_mve_mul_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulq_x_n_u16:
    Param0 = Intrinsic::arm_mve_mul_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsubq_x_n_s16:
    Param0 = Intrinsic::arm_mve_sub_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsubq_x_n_u16:
    Param0 = Intrinsic::arm_mve_sub_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val4, Val7, Val1});
}
case ARM::BI__builtin_arm_mve_vhaddq_x_n_s16:
case ARM::BI__builtin_arm_mve_vhaddq_x_n_u16:
case ARM::BI__builtin_arm_mve_vhsubq_x_n_s16:
case ARM::BI__builtin_arm_mve_vhsubq_x_n_u16: {
  uint32_t  Param0;
  Intrinsic::ID  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vhaddq_x_n_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_hadd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_x_n_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_hadd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_x_n_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_hsub_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_x_n_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_hsub_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val6 = EmitScalarExpr(E->getArg(2));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
  return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val4, Val5, Val8, Val1});
}
case ARM::BI__builtin_arm_mve_vabsq_x_s16:
case ARM::BI__builtin_arm_mve_vclsq_x_s16:
case ARM::BI__builtin_arm_mve_vclzq_x_s16:
case ARM::BI__builtin_arm_mve_vclzq_x_u16:
case ARM::BI__builtin_arm_mve_vmvnq_x_s16:
case ARM::BI__builtin_arm_mve_vmvnq_x_u16:
case ARM::BI__builtin_arm_mve_vnegq_x_s16: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vabsq_x_s16:
    Param0 = Intrinsic::arm_mve_abs_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vclsq_x_s16:
    Param0 = Intrinsic::arm_mve_cls_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vclzq_x_s16:
    Param0 = Intrinsic::arm_mve_clz_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vclzq_x_u16:
    Param0 = Intrinsic::arm_mve_clz_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmvnq_x_s16:
    Param0 = Intrinsic::arm_mve_mvn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmvnq_x_u16:
    Param0 = Intrinsic::arm_mve_mvn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vnegq_x_s16:
    Param0 = Intrinsic::arm_mve_neg_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val5, Val1});
}
case ARM::BI__builtin_arm_mve_vddupq_x_n_u16:
case ARM::BI__builtin_arm_mve_vidupq_x_n_u16: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vddupq_x_n_u16:
    Param0 = Intrinsic::arm_mve_vddup_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vidupq_x_n_u16:
    Param0 = Intrinsic::arm_mve_vidup_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = EmitScalarExpr(E->getArg(2));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1, Val2, Val3, Val6});
  return Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vbrsrq_x_n_s16:
case ARM::BI__builtin_arm_mve_vbrsrq_x_n_u16: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vbrsrq_x_n_s16:
    Param0 = Intrinsic::arm_mve_vbrsr_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vbrsrq_x_n_u16:
    Param0 = Intrinsic::arm_mve_vbrsr_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = EmitScalarExpr(E->getArg(2));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1, Val2, Val3, Val6});
}
case ARM::BI__builtin_arm_mve_vaddq_x_s16:
case ARM::BI__builtin_arm_mve_vaddq_x_u16:
case ARM::BI__builtin_arm_mve_vmulq_x_s16:
case ARM::BI__builtin_arm_mve_vmulq_x_u16:
case ARM::BI__builtin_arm_mve_vshlq_x_n_s16:
case ARM::BI__builtin_arm_mve_vshlq_x_n_u16:
case ARM::BI__builtin_arm_mve_vsubq_x_s16:
case ARM::BI__builtin_arm_mve_vsubq_x_u16: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vaddq_x_s16:
    Param0 = Intrinsic::arm_mve_add_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vaddq_x_u16:
    Param0 = Intrinsic::arm_mve_add_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulq_x_s16:
    Param0 = Intrinsic::arm_mve_mul_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulq_x_u16:
    Param0 = Intrinsic::arm_mve_mul_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshlq_x_n_s16:
    Param0 = Intrinsic::arm_mve_shl_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshlq_x_n_u16:
    Param0 = Intrinsic::arm_mve_shl_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsubq_x_s16:
    Param0 = Intrinsic::arm_mve_sub_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsubq_x_u16:
    Param0 = Intrinsic::arm_mve_sub_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = EmitScalarExpr(E->getArg(2));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val6, Val1});
}
case ARM::BI__builtin_arm_mve_vdwdupq_x_n_u16:
case ARM::BI__builtin_arm_mve_viwdupq_x_n_u16: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vdwdupq_x_n_u16:
    Param0 = Intrinsic::arm_mve_vdwdup_predicated;
    break;
  case ARM::BI__builtin_arm_mve_viwdupq_x_n_u16:
    Param0 = Intrinsic::arm_mve_viwdup_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = EmitScalarExpr(E->getArg(2));
  Value *Val5 = EmitScalarExpr(E->getArg(3));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1, Val2, Val3, Val4, Val7});
  return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vrshlq_x_s16:
case ARM::BI__builtin_arm_mve_vrshlq_x_u16:
case ARM::BI__builtin_arm_mve_vshlq_x_s16:
case ARM::BI__builtin_arm_mve_vshlq_x_u16: {
  uint32_t  Param0;
  uint32_t  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vrshlq_x_s16:
    Param0 = 1;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_x_u16:
    Param0 = 1;
    Param1 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vshlq_x_s16:
    Param0 = 0;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vshlq_x_u16:
    Param0 = 0;
    Param1 = 1;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, 0);
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val7 = EmitScalarExpr(E->getArg(2));
  Value *Val8 = Builder.CreateIntCast(Val7, Int32Ty, false);
  Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val8});
  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});
}
case ARM::BI__builtin_arm_mve_vmullbq_poly_x_p8:
case ARM::BI__builtin_arm_mve_vmulltq_poly_x_p8: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmullbq_poly_x_p8:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_poly_x_p8:
    Param0 = 1;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
  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});
}
case ARM::BI__builtin_arm_mve_vabdq_x_s16:
case ARM::BI__builtin_arm_mve_vabdq_x_u16:
case ARM::BI__builtin_arm_mve_vhaddq_x_s16:
case ARM::BI__builtin_arm_mve_vhaddq_x_u16:
case ARM::BI__builtin_arm_mve_vhsubq_x_s16:
case ARM::BI__builtin_arm_mve_vhsubq_x_u16:
case ARM::BI__builtin_arm_mve_vmaxq_x_s16:
case ARM::BI__builtin_arm_mve_vmaxq_x_u16:
case ARM::BI__builtin_arm_mve_vminq_x_s16:
case ARM::BI__builtin_arm_mve_vminq_x_u16:
case ARM::BI__builtin_arm_mve_vmulhq_x_s16:
case ARM::BI__builtin_arm_mve_vmulhq_x_u16:
case ARM::BI__builtin_arm_mve_vrhaddq_x_s16:
case ARM::BI__builtin_arm_mve_vrhaddq_x_u16:
case ARM::BI__builtin_arm_mve_vrmulhq_x_s16:
case ARM::BI__builtin_arm_mve_vrmulhq_x_u16:
case ARM::BI__builtin_arm_mve_vrshrq_x_n_s16:
case ARM::BI__builtin_arm_mve_vrshrq_x_n_u16:
case ARM::BI__builtin_arm_mve_vshrq_x_n_s16:
case ARM::BI__builtin_arm_mve_vshrq_x_n_u16: {
  uint32_t  Param0;
  Intrinsic::ID  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vabdq_x_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_abd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vabdq_x_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_abd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_x_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_hadd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_x_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_hadd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_x_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_hsub_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_x_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_hsub_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmaxq_x_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_max_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmaxq_x_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_max_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vminq_x_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_min_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vminq_x_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_min_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulhq_x_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_mulh_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulhq_x_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_mulh_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrhaddq_x_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_rhadd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrhaddq_x_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_rhadd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrmulhq_x_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_rmulh_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrmulhq_x_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_rmulh_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrshrq_x_n_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vrshr_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrshrq_x_n_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vrshr_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshrq_x_n_s16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_shr_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshrq_x_n_u16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_shr_imm_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
  return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val4, Val7, Val1});
}
case ARM::BI__builtin_arm_mve_vmullbq_int_x_s8:
case ARM::BI__builtin_arm_mve_vmullbq_int_x_u8:
case ARM::BI__builtin_arm_mve_vmulltq_int_x_s8:
case ARM::BI__builtin_arm_mve_vmulltq_int_x_u8:
case ARM::BI__builtin_arm_mve_vshllbq_x_n_s8:
case ARM::BI__builtin_arm_mve_vshllbq_x_n_u8:
case ARM::BI__builtin_arm_mve_vshlltq_x_n_s8:
case ARM::BI__builtin_arm_mve_vshlltq_x_n_u8: {
  uint32_t  Param0;
  uint32_t  Param1;
  Intrinsic::ID  Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmullbq_int_x_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = Intrinsic::arm_mve_mull_int_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmullbq_int_x_u8:
    Param0 = 1;
    Param1 = 0;
    Param2 = Intrinsic::arm_mve_mull_int_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_int_x_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = Intrinsic::arm_mve_mull_int_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_int_x_u8:
    Param0 = 1;
    Param1 = 1;
    Param2 = Intrinsic::arm_mve_mull_int_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshllbq_x_n_s8:
    Param0 = 0;
    Param1 = 0;
    Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshllbq_x_n_u8:
    Param0 = 1;
    Param1 = 0;
    Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshlltq_x_n_s8:
    Param0 = 0;
    Param1 = 1;
    Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshlltq_x_n_u8:
    Param0 = 1;
    Param1 = 1;
    Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val6 = EmitScalarExpr(E->getArg(2));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
  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});
}
case ARM::BI__builtin_arm_mve_vcvtq_x_s16_f16:
case ARM::BI__builtin_arm_mve_vcvtq_x_u16_f16: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcvtq_x_s16_f16:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_x_u16_f16:
    Param0 = 1;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
  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});
}
case ARM::BI__builtin_arm_mve_vrev32q_x_s16:
case ARM::BI__builtin_arm_mve_vrev32q_x_u16:
case ARM::BI__builtin_arm_mve_vrev64q_x_s16:
case ARM::BI__builtin_arm_mve_vrev64q_x_u16: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vrev32q_x_s16:
    Param0 = 32;
    break;
  case ARM::BI__builtin_arm_mve_vrev32q_x_u16:
    Param0 = 32;
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_x_s16:
    Param0 = 64;
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_x_u16:
    Param0 = 64;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
  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});
}
case ARM::BI__builtin_arm_mve_vmovlbq_x_s8:
case ARM::BI__builtin_arm_mve_vmovlbq_x_u8:
case ARM::BI__builtin_arm_mve_vmovltq_x_s8:
case ARM::BI__builtin_arm_mve_vmovltq_x_u8: {
  uint32_t  Param0;
  uint32_t  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmovlbq_x_s8:
    Param0 = 0;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vmovlbq_x_u8:
    Param0 = 1;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vmovltq_x_s8:
    Param0 = 0;
    Param1 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vmovltq_x_u8:
    Param0 = 1;
    Param1 = 1;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val5 = EmitScalarExpr(E->getArg(1));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
  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});
}
case ARM::BI__builtin_arm_mve_vandq_x_s16:
case ARM::BI__builtin_arm_mve_vandq_x_u16:
case ARM::BI__builtin_arm_mve_vbicq_x_s16:
case ARM::BI__builtin_arm_mve_vbicq_x_u16:
case ARM::BI__builtin_arm_mve_veorq_x_s16:
case ARM::BI__builtin_arm_mve_veorq_x_u16:
case ARM::BI__builtin_arm_mve_vornq_x_s16:
case ARM::BI__builtin_arm_mve_vornq_x_u16:
case ARM::BI__builtin_arm_mve_vorrq_x_s16:
case ARM::BI__builtin_arm_mve_vorrq_x_u16: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vandq_x_s16:
    Param0 = Intrinsic::arm_mve_and_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vandq_x_u16:
    Param0 = Intrinsic::arm_mve_and_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_x_s16:
    Param0 = Intrinsic::arm_mve_bic_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_x_u16:
    Param0 = Intrinsic::arm_mve_bic_predicated;
    break;
  case ARM::BI__builtin_arm_mve_veorq_x_s16:
    Param0 = Intrinsic::arm_mve_eor_predicated;
    break;
  case ARM::BI__builtin_arm_mve_veorq_x_u16:
    Param0 = Intrinsic::arm_mve_eor_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vornq_x_s16:
    Param0 = Intrinsic::arm_mve_orn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vornq_x_u16:
    Param0 = Intrinsic::arm_mve_orn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_x_s16:
    Param0 = Intrinsic::arm_mve_orr_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_x_u16:
    Param0 = Intrinsic::arm_mve_orr_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val3 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val4 = Builder.CreateBitCast(Val2, Val3);
  Value *Val5 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val7 = Builder.CreateBitCast(Val5, Val6);
  Value *Val8 = EmitScalarExpr(E->getArg(2));
  Value *Val9 = Builder.CreateIntCast(Val8, Int32Ty, false);
  Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val9});
  llvm::Type *Val11 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val12 = Builder.CreateBitCast(Val1, Val11);
  Value *Val13 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4, Val7, Val10, Val12});
  llvm::Type *Val14 = llvm::FixedVectorType::get(Int16Ty, 8);
  return Builder.CreateBitCast(Val13, Val14);
}
case ARM::BI__builtin_arm_mve_vdupq_x_n_s16:
case ARM::BI__builtin_arm_mve_vdupq_x_n_u16: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val3});
  Value *Val5 = EmitScalarExpr(E->getArg(0));
  Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
  return Builder.CreateSelect(Val4, Val6, Val1);
}
case ARM::BI__builtin_arm_mve_vmvnq_x_n_s16:
case ARM::BI__builtin_arm_mve_vmvnq_x_n_u16: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmvnq_x_n_s16:
    Param0 = true;
    break;
  case ARM::BI__builtin_arm_mve_vmvnq_x_n_u16:
    Param0 = false;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val3});
  Value *Val5 = EmitScalarExpr(E->getArg(0));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateIntCast(Val6, Int16Ty, Param0);
  Value *Val8 = ARMMVEVectorSplat(Builder, Val7);
  Value *Val9 = Builder.CreateNot(Val8);
  return Builder.CreateSelect(Val4, Val9, Val1);
}
case ARM::BI__builtin_arm_mve_vcvtaq_x_s16_f16:
case ARM::BI__builtin_arm_mve_vcvtaq_x_u16_f16:
case ARM::BI__builtin_arm_mve_vcvtmq_x_s16_f16:
case ARM::BI__builtin_arm_mve_vcvtmq_x_u16_f16:
case ARM::BI__builtin_arm_mve_vcvtnq_x_s16_f16:
case ARM::BI__builtin_arm_mve_vcvtnq_x_u16_f16:
case ARM::BI__builtin_arm_mve_vcvtpq_x_s16_f16:
case ARM::BI__builtin_arm_mve_vcvtpq_x_u16_f16: {
  uint32_t  Param0;
  Intrinsic::ID  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcvtaq_x_s16_f16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcvta_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vcvtaq_x_u16_f16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcvta_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vcvtmq_x_s16_f16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcvtm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vcvtmq_x_u16_f16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcvtm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vcvtnq_x_s16_f16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcvtn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vcvtnq_x_u16_f16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcvtn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vcvtpq_x_s16_f16:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcvtp_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vcvtpq_x_u16_f16:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcvtp_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
  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});
}
case ARM::BI__builtin_arm_mve_vcvtq_x_n_s16_f16:
case ARM::BI__builtin_arm_mve_vcvtq_x_n_u16_f16: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcvtq_x_n_s16_f16:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_x_n_u16_f16:
    Param0 = 1;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
  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});
}
case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_s16:
case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_u16:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_s16:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_u16:
case ARM::BI__builtin_arm_mve_vhcaddq_rot270_x_s16:
case ARM::BI__builtin_arm_mve_vhcaddq_rot90_x_s16: {
  uint32_t  Param0;
  uint32_t  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_s16:
    Param0 = 1;
    Param1 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_u16:
    Param0 = 1;
    Param1 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_s16:
    Param0 = 1;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_u16:
    Param0 = 1;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vhcaddq_rot270_x_s16:
    Param0 = 0;
    Param1 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vhcaddq_rot90_x_s16:
    Param0 = 0;
    Param1 = 0;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val4 = EmitScalarExpr(E->getArg(0));
  Value *Val5 = EmitScalarExpr(E->getArg(1));
  Value *Val6 = EmitScalarExpr(E->getArg(2));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
  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});
}
case ARM::BI__builtin_arm_mve_vnegq_s16: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  Value *Val1 = llvm::Constant::getNullValue(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateSub(Val1, Val2);
}
case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_s16:
case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_u16:
case ARM::BI__builtin_arm_mve_vuninitializedq_s16:
case ARM::BI__builtin_arm_mve_vuninitializedq_u16: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
  return UndefValue::get(Val0);
}
case ARM::BI__builtin_arm_mve_vddupq_x_wb_u32:
case ARM::BI__builtin_arm_mve_vidupq_x_wb_u32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vddupq_x_wb_u32:
    Param0 = Intrinsic::arm_mve_vddup_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vidupq_x_wb_u32:
    Param0 = Intrinsic::arm_mve_vidup_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Address Val2 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val3 = Builder.CreateLoad(Val2);
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1, Val3, Val4, Val7});
  Value *Val9 = Builder.CreateExtractValue(Val8, static_cast<unsigned>(1));
  Builder.CreateStore(Val9, Val2);
  return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vdwdupq_x_wb_u32:
case ARM::BI__builtin_arm_mve_viwdupq_x_wb_u32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vdwdupq_x_wb_u32:
    Param0 = Intrinsic::arm_mve_vdwdup_predicated;
    break;
  case ARM::BI__builtin_arm_mve_viwdupq_x_wb_u32:
    Param0 = Intrinsic::arm_mve_viwdup_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Address Val2 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val3 = Builder.CreateLoad(Val2);
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = EmitScalarExpr(E->getArg(3));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
  Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1, Val3, Val4, Val5, Val8});
  Value *Val10 = Builder.CreateExtractValue(Val9, static_cast<unsigned>(1));
  Builder.CreateStore(Val10, Val2);
  return Builder.CreateExtractValue(Val9, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vaddq_x_n_s32:
case ARM::BI__builtin_arm_mve_vaddq_x_n_u32:
case ARM::BI__builtin_arm_mve_vmulq_x_n_s32:
case ARM::BI__builtin_arm_mve_vmulq_x_n_u32:
case ARM::BI__builtin_arm_mve_vsubq_x_n_s32:
case ARM::BI__builtin_arm_mve_vsubq_x_n_u32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vaddq_x_n_s32:
    Param0 = Intrinsic::arm_mve_add_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vaddq_x_n_u32:
    Param0 = Intrinsic::arm_mve_add_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulq_x_n_s32:
    Param0 = Intrinsic::arm_mve_mul_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulq_x_n_u32:
    Param0 = Intrinsic::arm_mve_mul_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsubq_x_n_s32:
    Param0 = Intrinsic::arm_mve_sub_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsubq_x_n_u32:
    Param0 = Intrinsic::arm_mve_sub_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val4, Val7, Val1});
}
case ARM::BI__builtin_arm_mve_vhaddq_x_n_s32:
case ARM::BI__builtin_arm_mve_vhaddq_x_n_u32:
case ARM::BI__builtin_arm_mve_vhsubq_x_n_s32:
case ARM::BI__builtin_arm_mve_vhsubq_x_n_u32: {
  uint32_t  Param0;
  Intrinsic::ID  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vhaddq_x_n_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_hadd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_x_n_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_hadd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_x_n_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_hsub_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_x_n_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_hsub_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val6 = EmitScalarExpr(E->getArg(2));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
  return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val4, Val5, Val8, Val1});
}
case ARM::BI__builtin_arm_mve_vabsq_x_s32:
case ARM::BI__builtin_arm_mve_vclsq_x_s32:
case ARM::BI__builtin_arm_mve_vclzq_x_s32:
case ARM::BI__builtin_arm_mve_vclzq_x_u32:
case ARM::BI__builtin_arm_mve_vmvnq_x_s32:
case ARM::BI__builtin_arm_mve_vmvnq_x_u32:
case ARM::BI__builtin_arm_mve_vnegq_x_s32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vabsq_x_s32:
    Param0 = Intrinsic::arm_mve_abs_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vclsq_x_s32:
    Param0 = Intrinsic::arm_mve_cls_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vclzq_x_s32:
    Param0 = Intrinsic::arm_mve_clz_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vclzq_x_u32:
    Param0 = Intrinsic::arm_mve_clz_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmvnq_x_s32:
    Param0 = Intrinsic::arm_mve_mvn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmvnq_x_u32:
    Param0 = Intrinsic::arm_mve_mvn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vnegq_x_s32:
    Param0 = Intrinsic::arm_mve_neg_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val5, Val1});
}
case ARM::BI__builtin_arm_mve_vddupq_x_n_u32:
case ARM::BI__builtin_arm_mve_vidupq_x_n_u32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vddupq_x_n_u32:
    Param0 = Intrinsic::arm_mve_vddup_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vidupq_x_n_u32:
    Param0 = Intrinsic::arm_mve_vidup_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = EmitScalarExpr(E->getArg(2));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1, Val2, Val3, Val6});
  return Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vbrsrq_x_n_s32:
case ARM::BI__builtin_arm_mve_vbrsrq_x_n_u32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vbrsrq_x_n_s32:
    Param0 = Intrinsic::arm_mve_vbrsr_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vbrsrq_x_n_u32:
    Param0 = Intrinsic::arm_mve_vbrsr_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = EmitScalarExpr(E->getArg(2));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1, Val2, Val3, Val6});
}
case ARM::BI__builtin_arm_mve_vaddq_x_s32:
case ARM::BI__builtin_arm_mve_vaddq_x_u32:
case ARM::BI__builtin_arm_mve_vmulq_x_s32:
case ARM::BI__builtin_arm_mve_vmulq_x_u32:
case ARM::BI__builtin_arm_mve_vshlq_x_n_s32:
case ARM::BI__builtin_arm_mve_vshlq_x_n_u32:
case ARM::BI__builtin_arm_mve_vsubq_x_s32:
case ARM::BI__builtin_arm_mve_vsubq_x_u32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vaddq_x_s32:
    Param0 = Intrinsic::arm_mve_add_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vaddq_x_u32:
    Param0 = Intrinsic::arm_mve_add_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulq_x_s32:
    Param0 = Intrinsic::arm_mve_mul_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulq_x_u32:
    Param0 = Intrinsic::arm_mve_mul_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshlq_x_n_s32:
    Param0 = Intrinsic::arm_mve_shl_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshlq_x_n_u32:
    Param0 = Intrinsic::arm_mve_shl_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsubq_x_s32:
    Param0 = Intrinsic::arm_mve_sub_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsubq_x_u32:
    Param0 = Intrinsic::arm_mve_sub_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = EmitScalarExpr(E->getArg(2));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val6, Val1});
}
case ARM::BI__builtin_arm_mve_vdwdupq_x_n_u32:
case ARM::BI__builtin_arm_mve_viwdupq_x_n_u32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vdwdupq_x_n_u32:
    Param0 = Intrinsic::arm_mve_vdwdup_predicated;
    break;
  case ARM::BI__builtin_arm_mve_viwdupq_x_n_u32:
    Param0 = Intrinsic::arm_mve_viwdup_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = EmitScalarExpr(E->getArg(2));
  Value *Val5 = EmitScalarExpr(E->getArg(3));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1, Val2, Val3, Val4, Val7});
  return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vrshlq_x_s32:
case ARM::BI__builtin_arm_mve_vrshlq_x_u32:
case ARM::BI__builtin_arm_mve_vshlq_x_s32:
case ARM::BI__builtin_arm_mve_vshlq_x_u32: {
  uint32_t  Param0;
  uint32_t  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vrshlq_x_s32:
    Param0 = 1;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_x_u32:
    Param0 = 1;
    Param1 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vshlq_x_s32:
    Param0 = 0;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vshlq_x_u32:
    Param0 = 0;
    Param1 = 1;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, 0);
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val7 = EmitScalarExpr(E->getArg(2));
  Value *Val8 = Builder.CreateIntCast(Val7, Int32Ty, false);
  Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val8});
  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});
}
case ARM::BI__builtin_arm_mve_vmullbq_poly_x_p16:
case ARM::BI__builtin_arm_mve_vmulltq_poly_x_p16: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmullbq_poly_x_p16:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_poly_x_p16:
    Param0 = 1;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
  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});
}
case ARM::BI__builtin_arm_mve_vabdq_x_s32:
case ARM::BI__builtin_arm_mve_vabdq_x_u32:
case ARM::BI__builtin_arm_mve_vhaddq_x_s32:
case ARM::BI__builtin_arm_mve_vhaddq_x_u32:
case ARM::BI__builtin_arm_mve_vhsubq_x_s32:
case ARM::BI__builtin_arm_mve_vhsubq_x_u32:
case ARM::BI__builtin_arm_mve_vmaxq_x_s32:
case ARM::BI__builtin_arm_mve_vmaxq_x_u32:
case ARM::BI__builtin_arm_mve_vminq_x_s32:
case ARM::BI__builtin_arm_mve_vminq_x_u32:
case ARM::BI__builtin_arm_mve_vmulhq_x_s32:
case ARM::BI__builtin_arm_mve_vmulhq_x_u32:
case ARM::BI__builtin_arm_mve_vrhaddq_x_s32:
case ARM::BI__builtin_arm_mve_vrhaddq_x_u32:
case ARM::BI__builtin_arm_mve_vrmulhq_x_s32:
case ARM::BI__builtin_arm_mve_vrmulhq_x_u32:
case ARM::BI__builtin_arm_mve_vrshrq_x_n_s32:
case ARM::BI__builtin_arm_mve_vrshrq_x_n_u32:
case ARM::BI__builtin_arm_mve_vshrq_x_n_s32:
case ARM::BI__builtin_arm_mve_vshrq_x_n_u32: {
  uint32_t  Param0;
  Intrinsic::ID  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vabdq_x_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_abd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vabdq_x_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_abd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_x_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_hadd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_x_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_hadd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_x_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_hsub_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_x_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_hsub_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmaxq_x_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_max_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmaxq_x_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_max_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vminq_x_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_min_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vminq_x_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_min_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulhq_x_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_mulh_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulhq_x_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_mulh_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrhaddq_x_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_rhadd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrhaddq_x_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_rhadd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrmulhq_x_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_rmulh_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrmulhq_x_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_rmulh_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrshrq_x_n_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vrshr_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrshrq_x_n_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vrshr_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshrq_x_n_s32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_shr_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshrq_x_n_u32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_shr_imm_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
  return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val4, Val7, Val1});
}
case ARM::BI__builtin_arm_mve_vmullbq_int_x_s16:
case ARM::BI__builtin_arm_mve_vmullbq_int_x_u16:
case ARM::BI__builtin_arm_mve_vmulltq_int_x_s16:
case ARM::BI__builtin_arm_mve_vmulltq_int_x_u16:
case ARM::BI__builtin_arm_mve_vshllbq_x_n_s16:
case ARM::BI__builtin_arm_mve_vshllbq_x_n_u16:
case ARM::BI__builtin_arm_mve_vshlltq_x_n_s16:
case ARM::BI__builtin_arm_mve_vshlltq_x_n_u16: {
  uint32_t  Param0;
  uint32_t  Param1;
  Intrinsic::ID  Param2;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmullbq_int_x_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = Intrinsic::arm_mve_mull_int_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmullbq_int_x_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = Intrinsic::arm_mve_mull_int_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_int_x_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = Intrinsic::arm_mve_mull_int_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_int_x_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = Intrinsic::arm_mve_mull_int_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshllbq_x_n_s16:
    Param0 = 0;
    Param1 = 0;
    Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshllbq_x_n_u16:
    Param0 = 1;
    Param1 = 0;
    Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshlltq_x_n_s16:
    Param0 = 0;
    Param1 = 1;
    Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshlltq_x_n_u16:
    Param0 = 1;
    Param1 = 1;
    Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val6 = EmitScalarExpr(E->getArg(2));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
  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});
}
case ARM::BI__builtin_arm_mve_vrev64q_x_s32:
case ARM::BI__builtin_arm_mve_vrev64q_x_u32: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, 64);
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
  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});
}
case ARM::BI__builtin_arm_mve_vcvtq_x_s32_f32:
case ARM::BI__builtin_arm_mve_vcvtq_x_u32_f32: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcvtq_x_s32_f32:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_x_u32_f32:
    Param0 = 1;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
  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});
}
case ARM::BI__builtin_arm_mve_vmovlbq_x_s16:
case ARM::BI__builtin_arm_mve_vmovlbq_x_u16:
case ARM::BI__builtin_arm_mve_vmovltq_x_s16:
case ARM::BI__builtin_arm_mve_vmovltq_x_u16: {
  uint32_t  Param0;
  uint32_t  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmovlbq_x_s16:
    Param0 = 0;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vmovlbq_x_u16:
    Param0 = 1;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vmovltq_x_s16:
    Param0 = 0;
    Param1 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vmovltq_x_u16:
    Param0 = 1;
    Param1 = 1;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val5 = EmitScalarExpr(E->getArg(1));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
  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});
}
case ARM::BI__builtin_arm_mve_vandq_x_s32:
case ARM::BI__builtin_arm_mve_vandq_x_u32:
case ARM::BI__builtin_arm_mve_vbicq_x_s32:
case ARM::BI__builtin_arm_mve_vbicq_x_u32:
case ARM::BI__builtin_arm_mve_veorq_x_s32:
case ARM::BI__builtin_arm_mve_veorq_x_u32:
case ARM::BI__builtin_arm_mve_vornq_x_s32:
case ARM::BI__builtin_arm_mve_vornq_x_u32:
case ARM::BI__builtin_arm_mve_vorrq_x_s32:
case ARM::BI__builtin_arm_mve_vorrq_x_u32: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vandq_x_s32:
    Param0 = Intrinsic::arm_mve_and_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vandq_x_u32:
    Param0 = Intrinsic::arm_mve_and_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_x_s32:
    Param0 = Intrinsic::arm_mve_bic_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_x_u32:
    Param0 = Intrinsic::arm_mve_bic_predicated;
    break;
  case ARM::BI__builtin_arm_mve_veorq_x_s32:
    Param0 = Intrinsic::arm_mve_eor_predicated;
    break;
  case ARM::BI__builtin_arm_mve_veorq_x_u32:
    Param0 = Intrinsic::arm_mve_eor_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vornq_x_s32:
    Param0 = Intrinsic::arm_mve_orn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vornq_x_u32:
    Param0 = Intrinsic::arm_mve_orn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_x_s32:
    Param0 = Intrinsic::arm_mve_orr_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_x_u32:
    Param0 = Intrinsic::arm_mve_orr_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val3 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val4 = Builder.CreateBitCast(Val2, Val3);
  Value *Val5 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val7 = Builder.CreateBitCast(Val5, Val6);
  Value *Val8 = EmitScalarExpr(E->getArg(2));
  Value *Val9 = Builder.CreateIntCast(Val8, Int32Ty, false);
  Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val9});
  llvm::Type *Val11 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val12 = Builder.CreateBitCast(Val1, Val11);
  Value *Val13 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4, Val7, Val10, Val12});
  llvm::Type *Val14 = llvm::FixedVectorType::get(Int32Ty, 4);
  return Builder.CreateBitCast(Val13, Val14);
}
case ARM::BI__builtin_arm_mve_vdupq_x_n_s32:
case ARM::BI__builtin_arm_mve_vdupq_x_n_u32: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val3});
  Value *Val5 = EmitScalarExpr(E->getArg(0));
  Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
  return Builder.CreateSelect(Val4, Val6, Val1);
}
case ARM::BI__builtin_arm_mve_vmvnq_x_n_s32:
case ARM::BI__builtin_arm_mve_vmvnq_x_n_u32: {
  bool  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmvnq_x_n_s32:
    Param0 = true;
    break;
  case ARM::BI__builtin_arm_mve_vmvnq_x_n_u32:
    Param0 = false;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val3});
  Value *Val5 = EmitScalarExpr(E->getArg(0));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, Param0);
  Value *Val7 = ARMMVEVectorSplat(Builder, Val6);
  Value *Val8 = Builder.CreateNot(Val7);
  return Builder.CreateSelect(Val4, Val8, Val1);
}
case ARM::BI__builtin_arm_mve_vcvtaq_x_s32_f32:
case ARM::BI__builtin_arm_mve_vcvtaq_x_u32_f32:
case ARM::BI__builtin_arm_mve_vcvtmq_x_s32_f32:
case ARM::BI__builtin_arm_mve_vcvtmq_x_u32_f32:
case ARM::BI__builtin_arm_mve_vcvtnq_x_s32_f32:
case ARM::BI__builtin_arm_mve_vcvtnq_x_u32_f32:
case ARM::BI__builtin_arm_mve_vcvtpq_x_s32_f32:
case ARM::BI__builtin_arm_mve_vcvtpq_x_u32_f32: {
  uint32_t  Param0;
  Intrinsic::ID  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcvtaq_x_s32_f32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcvta_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vcvtaq_x_u32_f32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcvta_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vcvtmq_x_s32_f32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcvtm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vcvtmq_x_u32_f32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcvtm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vcvtnq_x_s32_f32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcvtn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vcvtnq_x_u32_f32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcvtn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vcvtpq_x_s32_f32:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vcvtp_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vcvtpq_x_u32_f32:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vcvtp_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
  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});
}
case ARM::BI__builtin_arm_mve_vcvtq_x_n_s32_f32:
case ARM::BI__builtin_arm_mve_vcvtq_x_n_u32_f32: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcvtq_x_n_s32_f32:
    Param0 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vcvtq_x_n_u32_f32:
    Param0 = 1;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = EmitScalarExpr(E->getArg(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
  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});
}
case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_s32:
case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_u32:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_s32:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_u32:
case ARM::BI__builtin_arm_mve_vhcaddq_rot270_x_s32:
case ARM::BI__builtin_arm_mve_vhcaddq_rot90_x_s32: {
  uint32_t  Param0;
  uint32_t  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_s32:
    Param0 = 1;
    Param1 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_u32:
    Param0 = 1;
    Param1 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_s32:
    Param0 = 1;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_u32:
    Param0 = 1;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vhcaddq_rot270_x_s32:
    Param0 = 0;
    Param1 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vhcaddq_rot90_x_s32:
    Param0 = 0;
    Param1 = 0;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val4 = EmitScalarExpr(E->getArg(0));
  Value *Val5 = EmitScalarExpr(E->getArg(1));
  Value *Val6 = EmitScalarExpr(E->getArg(2));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
  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});
}
case ARM::BI__builtin_arm_mve_vnegq_s32: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  Value *Val1 = llvm::Constant::getNullValue(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateSub(Val1, Val2);
}
case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_s32:
case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_u32:
case ARM::BI__builtin_arm_mve_vuninitializedq_s32:
case ARM::BI__builtin_arm_mve_vuninitializedq_u32: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
  return UndefValue::get(Val0);
}
case ARM::BI__builtin_arm_mve_vcreateq_f32: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = Builder.CreateInsertElement(Val1, Val2, static_cast<uint64_t>(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateInsertElement(Val3, Val4, static_cast<uint64_t>(1));
  llvm::Type *Val6 = llvm::FixedVectorType::get(FloatTy, 4);
  return ARMMVEVectorReinterpret(Builder, this, Val5, Val6);
}
case ARM::BI__builtin_arm_mve_vcreateq_f16: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = Builder.CreateInsertElement(Val1, Val2, static_cast<uint64_t>(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateInsertElement(Val3, Val4, static_cast<uint64_t>(1));
  llvm::Type *Val6 = llvm::FixedVectorType::get(HalfTy, 8);
  return ARMMVEVectorReinterpret(Builder, this, Val5, Val6);
}
case ARM::BI__builtin_arm_mve_vcreateq_s16:
case ARM::BI__builtin_arm_mve_vcreateq_u16: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = Builder.CreateInsertElement(Val1, Val2, static_cast<uint64_t>(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateInsertElement(Val3, Val4, static_cast<uint64_t>(1));
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 8);
  return ARMMVEVectorReinterpret(Builder, this, Val5, Val6);
}
case ARM::BI__builtin_arm_mve_vcreateq_s32:
case ARM::BI__builtin_arm_mve_vcreateq_u32: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = Builder.CreateInsertElement(Val1, Val2, static_cast<uint64_t>(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateInsertElement(Val3, Val4, static_cast<uint64_t>(1));
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int32Ty, 4);
  return ARMMVEVectorReinterpret(Builder, this, Val5, Val6);
}
case ARM::BI__builtin_arm_mve_vcreateq_s64:
case ARM::BI__builtin_arm_mve_vcreateq_u64: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = Builder.CreateInsertElement(Val1, Val2, static_cast<uint64_t>(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateInsertElement(Val3, Val4, static_cast<uint64_t>(1));
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int64Ty, 2);
  return ARMMVEVectorReinterpret(Builder, this, Val5, Val6);
}
case ARM::BI__builtin_arm_mve_vcreateq_s8:
case ARM::BI__builtin_arm_mve_vcreateq_u8: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = Builder.CreateInsertElement(Val1, Val2, static_cast<uint64_t>(0));
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateInsertElement(Val3, Val4, static_cast<uint64_t>(1));
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 16);
  return ARMMVEVectorReinterpret(Builder, this, Val5, Val6);
}
case ARM::BI__builtin_arm_mve_vmullbq_int_x_s32:
case ARM::BI__builtin_arm_mve_vmullbq_int_x_u32:
case ARM::BI__builtin_arm_mve_vmulltq_int_x_s32:
case ARM::BI__builtin_arm_mve_vmulltq_int_x_u32: {
  uint32_t  Param0;
  uint32_t  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vmullbq_int_x_s32:
    Param0 = 0;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vmullbq_int_x_u32:
    Param0 = 1;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_int_x_s32:
    Param0 = 0;
    Param1 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vmulltq_int_x_u32:
    Param0 = 1;
    Param1 = 1;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val6 = EmitScalarExpr(E->getArg(2));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 2)}), {Val7});
  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});
}
case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_s64:
case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_u64:
case ARM::BI__builtin_arm_mve_vuninitializedq_s64:
case ARM::BI__builtin_arm_mve_vuninitializedq_u64: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
  return UndefValue::get(Val0);
}
case ARM::BI__builtin_arm_mve_vddupq_x_wb_u8:
case ARM::BI__builtin_arm_mve_vidupq_x_wb_u8: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vddupq_x_wb_u8:
    Param0 = Intrinsic::arm_mve_vddup_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vidupq_x_wb_u8:
    Param0 = Intrinsic::arm_mve_vidup_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val1 = UndefValue::get(Val0);
  Address Val2 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val3 = Builder.CreateLoad(Val2);
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val6});
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val1, Val3, Val4, Val7});
  Value *Val9 = Builder.CreateExtractValue(Val8, static_cast<unsigned>(1));
  Builder.CreateStore(Val9, Val2);
  return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vdwdupq_x_wb_u8:
case ARM::BI__builtin_arm_mve_viwdupq_x_wb_u8: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vdwdupq_x_wb_u8:
    Param0 = Intrinsic::arm_mve_vdwdup_predicated;
    break;
  case ARM::BI__builtin_arm_mve_viwdupq_x_wb_u8:
    Param0 = Intrinsic::arm_mve_viwdup_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val1 = UndefValue::get(Val0);
  Address Val2 = EmitPointerWithAlignment(E->getArg(0));
  Value *Val3 = Builder.CreateLoad(Val2);
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = EmitScalarExpr(E->getArg(3));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val7});
  Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val1, Val3, Val4, Val5, Val8});
  Value *Val10 = Builder.CreateExtractValue(Val9, static_cast<unsigned>(1));
  Builder.CreateStore(Val10, Val2);
  return Builder.CreateExtractValue(Val9, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vaddq_x_n_s8:
case ARM::BI__builtin_arm_mve_vaddq_x_n_u8:
case ARM::BI__builtin_arm_mve_vmulq_x_n_s8:
case ARM::BI__builtin_arm_mve_vmulq_x_n_u8:
case ARM::BI__builtin_arm_mve_vsubq_x_n_s8:
case ARM::BI__builtin_arm_mve_vsubq_x_n_u8: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vaddq_x_n_s8:
    Param0 = Intrinsic::arm_mve_add_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vaddq_x_n_u8:
    Param0 = Intrinsic::arm_mve_add_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulq_x_n_s8:
    Param0 = Intrinsic::arm_mve_mul_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulq_x_n_u8:
    Param0 = Intrinsic::arm_mve_mul_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsubq_x_n_s8:
    Param0 = Intrinsic::arm_mve_sub_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsubq_x_n_u8:
    Param0 = Intrinsic::arm_mve_sub_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val6});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val4, Val7, Val1});
}
case ARM::BI__builtin_arm_mve_vhaddq_x_n_s8:
case ARM::BI__builtin_arm_mve_vhaddq_x_n_u8:
case ARM::BI__builtin_arm_mve_vhsubq_x_n_s8:
case ARM::BI__builtin_arm_mve_vhsubq_x_n_u8: {
  uint32_t  Param0;
  Intrinsic::ID  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vhaddq_x_n_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_hadd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_x_n_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_hadd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_x_n_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_hsub_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_x_n_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_hsub_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val6 = EmitScalarExpr(E->getArg(2));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val7});
  return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val4, Val5, Val8, Val1});
}
case ARM::BI__builtin_arm_mve_vabsq_x_s8:
case ARM::BI__builtin_arm_mve_vclsq_x_s8:
case ARM::BI__builtin_arm_mve_vclzq_x_s8:
case ARM::BI__builtin_arm_mve_vclzq_x_u8:
case ARM::BI__builtin_arm_mve_vmvnq_x_s8:
case ARM::BI__builtin_arm_mve_vmvnq_x_u8:
case ARM::BI__builtin_arm_mve_vnegq_x_s8: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vabsq_x_s8:
    Param0 = Intrinsic::arm_mve_abs_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vclsq_x_s8:
    Param0 = Intrinsic::arm_mve_cls_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vclzq_x_s8:
    Param0 = Intrinsic::arm_mve_clz_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vclzq_x_u8:
    Param0 = Intrinsic::arm_mve_clz_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmvnq_x_s8:
    Param0 = Intrinsic::arm_mve_mvn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmvnq_x_u8:
    Param0 = Intrinsic::arm_mve_mvn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vnegq_x_s8:
    Param0 = Intrinsic::arm_mve_neg_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
  Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val4});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val5, Val1});
}
case ARM::BI__builtin_arm_mve_vddupq_x_n_u8:
case ARM::BI__builtin_arm_mve_vidupq_x_n_u8: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vddupq_x_n_u8:
    Param0 = Intrinsic::arm_mve_vddup_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vidupq_x_n_u8:
    Param0 = Intrinsic::arm_mve_vidup_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = EmitScalarExpr(E->getArg(2));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val5});
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val1, Val2, Val3, Val6});
  return Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vbrsrq_x_n_s8:
case ARM::BI__builtin_arm_mve_vbrsrq_x_n_u8: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vbrsrq_x_n_s8:
    Param0 = Intrinsic::arm_mve_vbrsr_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vbrsrq_x_n_u8:
    Param0 = Intrinsic::arm_mve_vbrsr_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = EmitScalarExpr(E->getArg(2));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val5});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val1, Val2, Val3, Val6});
}
case ARM::BI__builtin_arm_mve_vaddq_x_s8:
case ARM::BI__builtin_arm_mve_vaddq_x_u8:
case ARM::BI__builtin_arm_mve_vmulq_x_s8:
case ARM::BI__builtin_arm_mve_vmulq_x_u8:
case ARM::BI__builtin_arm_mve_vshlq_x_n_s8:
case ARM::BI__builtin_arm_mve_vshlq_x_n_u8:
case ARM::BI__builtin_arm_mve_vsubq_x_s8:
case ARM::BI__builtin_arm_mve_vsubq_x_u8: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vaddq_x_s8:
    Param0 = Intrinsic::arm_mve_add_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vaddq_x_u8:
    Param0 = Intrinsic::arm_mve_add_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulq_x_s8:
    Param0 = Intrinsic::arm_mve_mul_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulq_x_u8:
    Param0 = Intrinsic::arm_mve_mul_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshlq_x_n_s8:
    Param0 = Intrinsic::arm_mve_shl_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshlq_x_n_u8:
    Param0 = Intrinsic::arm_mve_shl_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsubq_x_s8:
    Param0 = Intrinsic::arm_mve_sub_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vsubq_x_u8:
    Param0 = Intrinsic::arm_mve_sub_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = EmitScalarExpr(E->getArg(2));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val5});
  return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val3, Val6, Val1});
}
case ARM::BI__builtin_arm_mve_vdwdupq_x_n_u8:
case ARM::BI__builtin_arm_mve_viwdupq_x_n_u8: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vdwdupq_x_n_u8:
    Param0 = Intrinsic::arm_mve_vdwdup_predicated;
    break;
  case ARM::BI__builtin_arm_mve_viwdupq_x_n_u8:
    Param0 = Intrinsic::arm_mve_viwdup_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = EmitScalarExpr(E->getArg(2));
  Value *Val5 = EmitScalarExpr(E->getArg(3));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val6});
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val1, Val2, Val3, Val4, Val7});
  return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
}
case ARM::BI__builtin_arm_mve_vrshlq_x_s8:
case ARM::BI__builtin_arm_mve_vrshlq_x_u8:
case ARM::BI__builtin_arm_mve_vshlq_x_s8:
case ARM::BI__builtin_arm_mve_vshlq_x_u8: {
  uint32_t  Param0;
  uint32_t  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vrshlq_x_s8:
    Param0 = 1;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vrshlq_x_u8:
    Param0 = 1;
    Param1 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vshlq_x_s8:
    Param0 = 0;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vshlq_x_u8:
    Param0 = 0;
    Param1 = 1;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, 0);
  Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val7 = EmitScalarExpr(E->getArg(2));
  Value *Val8 = Builder.CreateIntCast(Val7, Int32Ty, false);
  Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val8});
  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});
}
case ARM::BI__builtin_arm_mve_vabdq_x_s8:
case ARM::BI__builtin_arm_mve_vabdq_x_u8:
case ARM::BI__builtin_arm_mve_vhaddq_x_s8:
case ARM::BI__builtin_arm_mve_vhaddq_x_u8:
case ARM::BI__builtin_arm_mve_vhsubq_x_s8:
case ARM::BI__builtin_arm_mve_vhsubq_x_u8:
case ARM::BI__builtin_arm_mve_vmaxq_x_s8:
case ARM::BI__builtin_arm_mve_vmaxq_x_u8:
case ARM::BI__builtin_arm_mve_vminq_x_s8:
case ARM::BI__builtin_arm_mve_vminq_x_u8:
case ARM::BI__builtin_arm_mve_vmulhq_x_s8:
case ARM::BI__builtin_arm_mve_vmulhq_x_u8:
case ARM::BI__builtin_arm_mve_vrhaddq_x_s8:
case ARM::BI__builtin_arm_mve_vrhaddq_x_u8:
case ARM::BI__builtin_arm_mve_vrmulhq_x_s8:
case ARM::BI__builtin_arm_mve_vrmulhq_x_u8:
case ARM::BI__builtin_arm_mve_vrshrq_x_n_s8:
case ARM::BI__builtin_arm_mve_vrshrq_x_n_u8:
case ARM::BI__builtin_arm_mve_vshrq_x_n_s8:
case ARM::BI__builtin_arm_mve_vshrq_x_n_u8: {
  uint32_t  Param0;
  Intrinsic::ID  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vabdq_x_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_abd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vabdq_x_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_abd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_x_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_hadd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhaddq_x_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_hadd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_x_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_hsub_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vhsubq_x_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_hsub_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmaxq_x_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_max_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmaxq_x_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_max_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vminq_x_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_min_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vminq_x_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_min_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulhq_x_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_mulh_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vmulhq_x_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_mulh_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrhaddq_x_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_rhadd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrhaddq_x_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_rhadd_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrmulhq_x_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_rmulh_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrmulhq_x_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_rmulh_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrshrq_x_n_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_vrshr_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vrshrq_x_n_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_vrshr_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshrq_x_n_s8:
    Param0 = 0;
    Param1 = Intrinsic::arm_mve_shr_imm_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vshrq_x_n_u8:
    Param0 = 1;
    Param1 = Intrinsic::arm_mve_shr_imm_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = EmitScalarExpr(E->getArg(1));
  Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val5 = EmitScalarExpr(E->getArg(2));
  Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
  Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val6});
  return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val3, Val4, Val7, Val1});
}
case ARM::BI__builtin_arm_mve_vrev16q_x_s8:
case ARM::BI__builtin_arm_mve_vrev16q_x_u8:
case ARM::BI__builtin_arm_mve_vrev32q_x_s8:
case ARM::BI__builtin_arm_mve_vrev32q_x_u8:
case ARM::BI__builtin_arm_mve_vrev64q_x_s8:
case ARM::BI__builtin_arm_mve_vrev64q_x_u8: {
  uint32_t  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vrev16q_x_s8:
    Param0 = 16;
    break;
  case ARM::BI__builtin_arm_mve_vrev16q_x_u8:
    Param0 = 16;
    break;
  case ARM::BI__builtin_arm_mve_vrev32q_x_s8:
    Param0 = 32;
    break;
  case ARM::BI__builtin_arm_mve_vrev32q_x_u8:
    Param0 = 32;
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_x_s8:
    Param0 = 64;
    break;
  case ARM::BI__builtin_arm_mve_vrev64q_x_u8:
    Param0 = 64;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val4 = EmitScalarExpr(E->getArg(1));
  Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
  Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val5});
  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});
}
case ARM::BI__builtin_arm_mve_vandq_x_s8:
case ARM::BI__builtin_arm_mve_vandq_x_u8:
case ARM::BI__builtin_arm_mve_vbicq_x_s8:
case ARM::BI__builtin_arm_mve_vbicq_x_u8:
case ARM::BI__builtin_arm_mve_veorq_x_s8:
case ARM::BI__builtin_arm_mve_veorq_x_u8:
case ARM::BI__builtin_arm_mve_vornq_x_s8:
case ARM::BI__builtin_arm_mve_vornq_x_u8:
case ARM::BI__builtin_arm_mve_vorrq_x_s8:
case ARM::BI__builtin_arm_mve_vorrq_x_u8: {
  Intrinsic::ID  Param0;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vandq_x_s8:
    Param0 = Intrinsic::arm_mve_and_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vandq_x_u8:
    Param0 = Intrinsic::arm_mve_and_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_x_s8:
    Param0 = Intrinsic::arm_mve_bic_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vbicq_x_u8:
    Param0 = Intrinsic::arm_mve_bic_predicated;
    break;
  case ARM::BI__builtin_arm_mve_veorq_x_s8:
    Param0 = Intrinsic::arm_mve_eor_predicated;
    break;
  case ARM::BI__builtin_arm_mve_veorq_x_u8:
    Param0 = Intrinsic::arm_mve_eor_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vornq_x_s8:
    Param0 = Intrinsic::arm_mve_orn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vornq_x_u8:
    Param0 = Intrinsic::arm_mve_orn_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_x_s8:
    Param0 = Intrinsic::arm_mve_orr_predicated;
    break;
  case ARM::BI__builtin_arm_mve_vorrq_x_u8:
    Param0 = Intrinsic::arm_mve_orr_predicated;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  llvm::Type *Val3 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val4 = Builder.CreateBitCast(Val2, Val3);
  Value *Val5 = EmitScalarExpr(E->getArg(1));
  llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val7 = Builder.CreateBitCast(Val5, Val6);
  Value *Val8 = EmitScalarExpr(E->getArg(2));
  Value *Val9 = Builder.CreateIntCast(Val8, Int32Ty, false);
  Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val9});
  llvm::Type *Val11 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val12 = Builder.CreateBitCast(Val1, Val11);
  Value *Val13 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val4, Val7, Val10, Val12});
  llvm::Type *Val14 = llvm::FixedVectorType::get(Int8Ty, 16);
  return Builder.CreateBitCast(Val13, Val14);
}
case ARM::BI__builtin_arm_mve_vdupq_x_n_s8:
case ARM::BI__builtin_arm_mve_vdupq_x_n_u8: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(1));
  Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
  Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val3});
  Value *Val5 = EmitScalarExpr(E->getArg(0));
  Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
  return Builder.CreateSelect(Val4, Val6, Val1);
}
case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_s8:
case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_u8:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_s8:
case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_u8:
case ARM::BI__builtin_arm_mve_vhcaddq_rot270_x_s8:
case ARM::BI__builtin_arm_mve_vhcaddq_rot90_x_s8: {
  uint32_t  Param0;
  uint32_t  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_s8:
    Param0 = 1;
    Param1 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_u8:
    Param0 = 1;
    Param1 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_s8:
    Param0 = 1;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_u8:
    Param0 = 1;
    Param1 = 0;
    break;
  case ARM::BI__builtin_arm_mve_vhcaddq_rot270_x_s8:
    Param0 = 0;
    Param1 = 1;
    break;
  case ARM::BI__builtin_arm_mve_vhcaddq_rot90_x_s8:
    Param0 = 0;
    Param1 = 0;
    break;
  }
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val1 = UndefValue::get(Val0);
  Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
  Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
  Value *Val4 = EmitScalarExpr(E->getArg(0));
  Value *Val5 = EmitScalarExpr(E->getArg(1));
  Value *Val6 = EmitScalarExpr(E->getArg(2));
  Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
  Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val7});
  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});
}
case ARM::BI__builtin_arm_mve_vnegq_s8: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
  Value *Val1 = llvm::Constant::getNullValue(Val0);
  Value *Val2 = EmitScalarExpr(E->getArg(0));
  return Builder.CreateSub(Val1, Val2);
}
case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_s8:
case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_u8:
case ARM::BI__builtin_arm_mve_vuninitializedq_s8:
case ARM::BI__builtin_arm_mve_vuninitializedq_u8: {
  llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
  return UndefValue::get(Val0);
}
